From 02d0d324c0feec43c6cfd8a0c27d3a7d58e6166a Mon Sep 17 00:00:00 2001 From: Claude Date: Sat, 20 Jun 2026 13:04:17 +0000 Subject: [PATCH 1/4] fix(build): de-duplicate capnp 0.26.0 in Cargo.lock The capnpc 0.25->0.26 bump (#267) left two byte-identical `[[package]] name = "capnp" version = "0.26.0"` stanzas, which cargo rejects ("package `capnp` is specified twice in the lockfile", exit 101) -- reding every build job (MVP Smoke, Boot Gate, the whole T1/* live-prover matrix). Collapsed the duplicate; capnp 0.25.6 (required by capnpc) and the single 0.26.0 remain. Closes #272 https://claude.ai/code/session_01UAqDQaMwpUqWHUSZekGZWv --- Cargo.lock | 9 --------- 1 file changed, 9 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 3ae8ae0..83d4e41 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -508,15 +508,6 @@ dependencies = [ "embedded-io", ] -[[package]] -name = "capnp" -version = "0.26.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "71338171543626713e427635f7de390328d9e85828a816a0c88d959032b34a2f" -dependencies = [ - "embedded-io", -] - [[package]] name = "capnpc" version = "0.26.0" From 5d5f0b1d5d516fb62d7fe468d63a553153e6f633 Mon Sep 17 00:00:00 2001 From: Claude Date: Sat, 20 Jun 2026 13:04:18 +0000 Subject: [PATCH 2/4] chore(guix): refresh package version 1.5.0 -> 2.3.0 to match Cargo.toml guix.scm declared (version "1.5.0") while the workspace is at 2.3.0 (Cargo.toml / STATE.a2ml). No Nix to remove: echidna has no flake.nix/flake.lock (the 2026-05-18 estate ruling was already applied); remaining nix mentions are intentional deprecation history. https://claude.ai/code/session_01UAqDQaMwpUqWHUSZekGZWv --- guix.scm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/guix.scm b/guix.scm index e7e561a..b07a93d 100644 --- a/guix.scm +++ b/guix.scm @@ -20,7 +20,7 @@ (define-public echidna (package (name "echidna") - (version "1.5.0") + (version "2.3.0") (source (local-file "." "echidna-checkout" #:recursive? #t #:select? (git-predicate "."))) From fa1a1ef91d82ed96bd13067aff1dbc500e691fd8 Mon Sep 17 00:00:00 2001 From: Claude Date: Sat, 20 Jun 2026 13:12:29 +0000 Subject: [PATCH 3/4] fix(server): migrate axum routes to 0.8 {param} syntax axum 0.8.9 (bumped on main) panics at router-build time on the old `:param` path syntax ("Path segments must not start with `:`. For capture groups, use `{capture}`"). This was masked by the Cargo.lock build break (#272); fixing that surfaced the panic, reding Boot Gate + MVP Smoke (server panics on startup -> /api/health fails). Migrated every `:param` -> {param} route string: - src/rust/server.rs: /api/session/{id}/{state,apply,tree} (+ startup help text) - src/interfaces/rest/main.rs: /api/v1/provers/{kind}; /api/v1/proofs/{id} (+ /tactics, /tactics/suggest, /export) Routes compiled already; runtime string syntax only, so no handler changes. Verified no `:param` route strings remain in src/. Refs: #272 https://claude.ai/code/session_01UAqDQaMwpUqWHUSZekGZWv --- src/interfaces/rest/main.rs | 12 ++++++------ src/rust/server.rs | 10 +++++----- 2 files changed, 11 insertions(+), 11 deletions(-) diff --git a/src/interfaces/rest/main.rs b/src/interfaces/rest/main.rs index f7ea3ce..f4cd532 100644 --- a/src/interfaces/rest/main.rs +++ b/src/interfaces/rest/main.rs @@ -98,21 +98,21 @@ async fn main() { .route("/health", get(health_check)) // Prover endpoints .route("/api/v1/provers", get(handlers::list_provers)) - .route("/api/v1/provers/:kind", get(handlers::get_prover)) + .route("/api/v1/provers/{kind}", get(handlers::get_prover)) // Proof endpoints .route("/api/v1/proofs", post(handlers::submit_proof)) .route("/api/v1/proofs", get(handlers::list_proofs)) - .route("/api/v1/proofs/:id", get(handlers::get_proof)) - .route("/api/v1/proofs/:id", delete(handlers::cancel_proof)) + .route("/api/v1/proofs/{id}", get(handlers::get_proof)) + .route("/api/v1/proofs/{id}", delete(handlers::cancel_proof)) // Tactic endpoints - .route("/api/v1/proofs/:id/tactics", post(handlers::apply_tactic)) + .route("/api/v1/proofs/{id}/tactics", post(handlers::apply_tactic)) .route( - "/api/v1/proofs/:id/tactics/suggest", + "/api/v1/proofs/{id}/tactics/suggest", get(handlers::suggest_tactics), ) // Cross-prover exchange endpoints (OpenTheory / Dedukti). // Export is session-scoped; import is stateless. - .route("/api/v1/proofs/:id/export", get(handlers::export_proof)) + .route("/api/v1/proofs/{id}/export", get(handlers::export_proof)) .route("/api/v1/exchange/import", post(handlers::import_proof)) // Consultant-mode Q&A — free-form question + optional context → // LLM-shaped markdown answer via BoJ's cartridge router. diff --git a/src/rust/server.rs b/src/rust/server.rs index a2def8c..d603e68 100644 --- a/src/rust/server.rs +++ b/src/rust/server.rs @@ -180,9 +180,9 @@ pub async fn start_server(port: u16, host: String, enable_cors: bool) -> Result< .route("/api/suggest", post(suggest_handler)) .route("/api/search", get(search_handler)) .route("/api/session/create", post(create_session)) - .route("/api/session/:id/state", get(get_session_state)) - .route("/api/session/:id/apply", post(apply_tactic_handler)) - .route("/api/session/:id/tree", get(get_proof_tree)) + .route("/api/session/{id}/state", get(get_session_state)) + .route("/api/session/{id}/apply", post(apply_tactic_handler)) + .route("/api/session/{id}/tree", get(get_proof_tree)) // Additional UI-specific endpoints .route("/api/agent/plan", post(agent_plan_handler)) .route("/api/aspect-tags", get(get_aspect_tags)) @@ -229,8 +229,8 @@ pub async fn start_server(port: u16, host: String, enable_cors: bool) -> Result< println!(" POST /api/suggest - Get tactic suggestions"); println!(" GET /api/search?q= - Search theorems"); println!(" POST /api/session/create - Create proof session"); - println!(" GET /api/session/:id/state - Get session state"); - println!(" POST /api/session/:id/apply - Apply tactic to session"); + println!(" GET /api/session/{id}/state - Get session state"); + println!(" POST /api/session/{id}/apply - Apply tactic to session"); println!(" WS /ws/interactive - WebSocket live proof session"); println!(); println!("Press Ctrl+C to stop the server"); From c51f884ec3070f060978475cf77809c9faedbb11 Mon Sep 17 00:00:00 2001 From: Claude Date: Sat, 20 Jun 2026 13:17:55 +0000 Subject: [PATCH 4/4] fix(server): escape braces in startup help-text println ({{id}}) The previous commit's `:id`->{id} route migration also rewrote the println! help text, where `{id}` is read as a captured format arg -> build break (E0425: cannot find value `id`). Escaped to `{{id}}` so it prints a literal `{id}` matching the new route syntax. The `.route(...)` string literals are unaffected (they are not format strings). https://claude.ai/code/session_01UAqDQaMwpUqWHUSZekGZWv --- src/rust/server.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/rust/server.rs b/src/rust/server.rs index d603e68..b982084 100644 --- a/src/rust/server.rs +++ b/src/rust/server.rs @@ -229,8 +229,8 @@ pub async fn start_server(port: u16, host: String, enable_cors: bool) -> Result< println!(" POST /api/suggest - Get tactic suggestions"); println!(" GET /api/search?q= - Search theorems"); println!(" POST /api/session/create - Create proof session"); - println!(" GET /api/session/{id}/state - Get session state"); - println!(" POST /api/session/{id}/apply - Apply tactic to session"); + println!(" GET /api/session/{{id}}/state - Get session state"); + println!(" POST /api/session/{{id}}/apply - Apply tactic to session"); println!(" WS /ws/interactive - WebSocket live proof session"); println!(); println!("Press Ctrl+C to stop the server");