Status: canonical human-readable overview. Lives alongside the
machine-readable
.machine_readable/descriptiles/META.a2ml
(architecture decisions) and
STATE.a2ml
(current state). Last revised: 2026-11-04.
ECHIDNA — Extensible Cognitive Hybrid Intelligence for Deductive Neural Assistance — is the reasoning substrate of the hyperpolymath ecosystem. Two non-negotiable invariants govern every design choice:
-
ML suggests; provers verify. Neural components rank, route, and propose; formal provers carry the trust. A wrong suggestion is a wasted CPU cycle, not a wrong proof.
-
Trust depends on the checker and execution path. The in-tree Alethe checker validates step structure, not logical correctness. The DRAT/LRAT helper invokes
drat-trimwhen called; that is a separate capability, not a guarantee that every proof path uses it. Theechidna proveCLI calls the selected backend directly and does not independently check a certificate. This overview therefore makes no blanket claim of independent Alethe or TSTP proof reproduction. Solver identity is not checked today: the integrity step exists, nothing in the tree attaches a checker, so binaries are currently assumed rather than verified. See the Integrity caveat below andDEBTD9. Do not read this list as a guarantee that the binary you invoked is the binary you pinned.
┌─────────────────────────────────────────────────────────────────────────┐
│ UI Layer │
│ TEA sources: src/ui/tea/; static shell: src/ui/public/ │
└──────────────────────────────┬──────────────────────────────────────────┘
│ HTTP / WebSocket (Cap'n Proto, planned L1)
┌──────────────────────────────▼──────────────────────────────────────────┐
│ Rust Core (src/rust/, crates/) │
│ │
│ ┌──────────┐ ┌──────────────┐ ┌────────────────┐ ┌──────────────┐ │
│ │ CLI/REPL │ │ REST │ │ gRPC │ │ FFI (Zig) │ │
│ │ (main.rs)│ │ (axum :8000) │ │ (tonic :50051)│ │ (16 exports) │ │
│ └────┬─────┘ └──────┬────────┘ └──────┬────────┘ └──────┬───────┘ │
│ └────────────────┴──────────────────┴────────────────┘ │
│ │ │
│ ▼ │
│ ┌──────────────────────────────────────┐ │
│ │ ProverDispatcher (dispatch.rs) │ │
│ │ — selects backend, owns trust loop │ │
│ └──┬───────────────────────────────┬───┘ │
│ │ │ │
│ ┌─────────────▼────────────┐ ┌─────────────▼───────────────────┐ │
│ │ Trust pipeline │ │ 141 ProverKind variants │ │
│ │ (verification/) │ │ 105 backend impl files │ │
│ │ - integrity │ │ (provers/) │ │
│ │ - portfolio │ │ see docs/PROVER_COUNT.adoc │ │
│ │ - certificates │ │ │ │
│ │ - axiom tracker │ │ │ │
│ │ - confidence │ │ Tier 1: 12 core (REST default) │ │
│ │ - mutation │ │ Tier 2–10: by capability │ │
│ │ - pareto │ └──────────────────────────────────┘ │
│ │ - statistics │ │
│ └───────────────────────────┘ │
│ │
│ ┌────────────────────────┐ ┌────────────────────────┐ │
│ │ Agentic search │ │ GNN client │ │
│ │ (agent/, actor model) │───►│ (gnn/client.rs) │ │
│ └────────────────────────┘ └─────────┬──────────────┘ │
└─────────────────────────────────────────────┼────────────────────────────┘
│ POST /gnn/rank
│ POST /training/update
│ POST /gnn/health
┌───────────────────────────▼───────────────────────────┐
│ Julia ML sidecar (src/julia/) — port 8090 │
│ api/server.jl (canonical entry) │
│ - load_gnn_model → models/neural/gnn_ranker │
│ - PROVER_DOMAIN_WEIGHTS (online from /training/update)│
│ - cosine fallback (model_loaded == false) │
└───────────────────────┬───────────────────────────────┘
│
▼
VeriSimDB
(cross-repo; verisim REST :8080)
historical proof_attempts table,
mv_prover_success_by_class
ECHIDNA carries 141 ProverKind variants across 105 backend
implementation files. The exposed surface depends on tier:
-
Tier 1 (12 core) — the default REST
/api/verifysurface, and exactly the set returned byProverKind::all_core(): Coq, Lean 4, Agda, Isabelle/HOL, Z3, CVC5, Metamath, HOL Light, Mizar, PVS, ACL2, HOL4. -
Tier 2–10 — the remaining variants: ATPs, SMT, model checkers, constraint solvers, niche provers, ecosystem type-checkers. Available via explicit
ProverKindselection in CLI / REPL / GraphQL but not auto-routed.
See PROVER_COUNT.adoc for the canonical tier
table and per-prover capabilities.
Each verify_proof call passes through (under --features verisim,
eventually in default builds; see
handover/TODO.adoc for current state):
-
Integrity (
integrity/) — solver binary SHAKE3-512 + BLAKE3 againstconfig/solver-manifest.toml. Caveat, 2026-11-01: this step runs only when a checker is attached, and nothing in the tree callswith_integrity_checker; unconfigured, the pipeline treats integrity as passing (dispatch.rs:632). The manifest also still holdsPLACEHOLDER_COMPUTE_ON_FIRST_RUNfor every solver. Treat this step as not executed until it is wired; seedocs/reports/2026-11-01-routing-and-rule-engine-recon.adoc§6 RD5. -
Dispatch (
dispatch.rs) —ProverDispatcher::select_proverpicks the backend; underwith_verisim,VeriSimAdvisorqueriesmv_prover_success_by_classfor historical success-rate hints. -
Sandbox (
executor/) — Podman or bubblewrap process containment. -
Portfolio cross-check (
verification/portfolio.rs) — for SMT, run two independent solvers; ✓ if both agree. -
Certificate verification (
verification/certificates.rs) — replay Alethe / DRAT-LRAT / TSTP independently of the originating solver. -
Axiom tracking (
verification/axiom_tracker.rs) — 4 danger levels (Safe, Noted, Warning, Reject). -
Confidence (
verification/confidence.rs) — 5-tier Bayesian trust score. -
Mutation testing (
verification/mutation.rs) — for specifications. -
Pareto (
verification/pareto.rs) — multi-objective frontier across speed / trust / certificate availability. -
Statistics (
verification/statistics.rs) — per-(prover, domain) success rates; exported to/training/updatefor online ML weight updates. -
Outcome emission (
dispatch.rs::spawn_record_attempt, gated onwith_verisim_writer) — fire-and-forget write to VeriSimDBproof_attempts, closes the learning loop.
There are four independent listeners, not one service on four ports. Each is a separate binary with its own route table and its own path to the provers:
| Listener | Default bind | Route root |
|---|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
echidna-graphql moved from 8081 to 8082 on 2026-11-04 so it can run
alongside the core server. ECHIDNA_GRAPHQL_ADDR remains an override;
deployments deliberately retaining the old GraphQL address must set it
explicitly and avoid binding the core server there.
VeriSimDB is a persistence and learning adapter, not a communication path.
It sits behind the non-default verisim Cargo feature, is written to
fire-and-forget after a dispatch, and is never consulted to reach a prover.
Clients do not route through it, and must not need to: the estate’s
3-practice/PROOF-POLICY.adoc §2.2 states that ECHIDNA is “the
longer-term automation destination, not a prerequisite for current independent
checks”. A mandatory VCL hop would violate that. Two consequences worth
knowing before you deploy:
-
Enabling
verisimalso movesPOST /api/proveontoProverDispatcher(server.rs:423); without it,/api/provegoes to the backend factory directly. A storage feature should not decide the verification route. -
/api/verifynever enters the dispatcher at all, and/api/verify_rawexecutes the solver binary directly by design.
So "which pipeline ran" depends on the surface and the feature set. If a client
needs a machine-readable answer it can trust, use echidna prove <file>
--output json — the documented
echidna.prove.result/1 contract — rather
than inferring it from an HTTP response body.
src/ holds one subdirectory per language. The split is intentional —
see RSR_COMPLIANCE.adoc
§“Out-of-template adaptations”.
| Path | Language | Role |
|---|---|---|
|
Rust |
Core: backends, dispatch, trust pipeline, CLI, REPL, server |
|
Rust |
Extracted workspace members ( |
|
Julia |
ML sidecar (GNN, logistic regression, training, eval) |
|
Idris 2 |
Formal ABI proofs (16 modules, zero
|
|
Idris 2 |
UI validator |
|
Chapel |
Parallel proof search (L2.1 live; L2.2+ gated) |
|
Zig |
Chapel-bridge FFI shim |
|
Zig |
Overlay / tentacles / boj sources |
|
Ada + SPARK |
Formal companion library |
|
AffineScript-TEA |
UI sources (compile pipeline unavailable) |
|
HTML/static assets |
Browser shell; open prove.html directly |
|
Rust |
GraphQL, gRPC, REST workspace crates |
Today: HTTP + JSON between Rust core and Julia sidecar on port 8090.
Endpoints — POST /gnn/rank, POST /gnn/embed,
POST /training/update, POST /gnn/health, plus POST /reload
(planned port from the orphaned api_server.jl).
Planned (Stage 5a / L1): Cap’n Proto over Unix domain socket; HTTP+JSON
retained only as debug fallback. See
docs/handover/L1-CAPNPROTO-PROMPT.adoc.
-
docs/ROADMAP.adoc— canonical stage map and sprint targets. -
docs/handover/STATE.adoc— running session log. -
docs/handover/HANDOVER-INDEX.adoc— guide to the handover/ prompt suite. -
docs/ENV-VARS.adoc— every environment variable the system reads, with defaults. -
docs/PROVER_COUNT.adoc— canonical tier table. -
.machine_readable/descriptiles/STATE.a2ml— machine-readable state, regenerated each sprint.