|
| 1 | +// SPDX-License-Identifier: PMPL-1.0-or-later |
| 2 | +// Copyright (c) 2026 Jonathan D.A. Jewell (hyperpolymath) <j.d.a.jewell@open.ac.uk> |
| 3 | + |
| 4 | += Echidnabot Changelog |
| 5 | +:toc: left |
| 6 | +:toclevels: 2 |
| 7 | + |
| 8 | +All notable changes to echidnabot are documented here. |
| 9 | + |
| 10 | +== [Unreleased] |
| 11 | + |
| 12 | +=== Changed |
| 13 | + |
| 14 | +==== VQL → VCL + verisimdb → verisim Rename (2026-04-05) |
| 15 | + |
| 16 | +Matches the ecosystem-wide rename. Internal identifiers updated, |
| 17 | +`github.com/hyperpolymath/verisimdb` URLs preserved. |
| 18 | + |
| 19 | +=== Added |
| 20 | + |
| 21 | +==== Inline-Claim Mode (A5, 2026-04-05) |
| 22 | + |
| 23 | +`ProofObligationInput` gains an optional `inline: Bool` flag. When |
| 24 | +`true`, the obligation's `claim` text IS the proof content: `process_job` |
| 25 | +short-circuits before `clone_repo`, fetches the obligation from the |
| 26 | +store, and calls `echidna.verify_proof` directly with the claim text. |
| 27 | +No git clone, no file walk. |
| 28 | + |
| 29 | +Sentinel `inline:<obligation_id>` distinguishes inline jobs from the |
| 30 | +legacy `obligation:<id>` clone path in `ProofJob.file_paths`. |
| 31 | + |
| 32 | +Tested end-to-end against live echidna server: |
| 33 | + provable Z3 claim → success=1, 1ms, "Inline proof verified" |
| 34 | + unsat Z3 claim → success=0, 20ms, "Inline proof verification failed" |
| 35 | + |
| 36 | +Unblocks batch drivers and test harnesses that hold proofs in-memory |
| 37 | +and don't want echidnabot to git-clone a repo just to verify one file. |
| 38 | +Used by the Phase E playground at nesy-solver.dev. |
| 39 | + |
| 40 | +==== `batch_driver.sh` — Direct-Binary Prover Invocation |
| 41 | + |
| 42 | +A standalone bash script that walks local proof trees, invokes prover |
| 43 | +binaries directly (bypassing echidna's `/api/verify`, which has a |
| 44 | +parse+export round-trip bug that produces false positives), and POSTs |
| 45 | +outcomes to verisim-api's `/api/v1/proof_attempts`. |
| 46 | + |
| 47 | +Active runners as of 2026-04-05 (**16 provers**): z3, cvc5, alt-ergo, |
| 48 | +coq, lean, agda, idris2, vampire, eprover, metamath, cadical, kissat, |
| 49 | +dafny, why3, fstar, acl2 (runner present, podman wrapper deferred). |
| 50 | + |
| 51 | +Per-prover logic: |
| 52 | + |
| 53 | +* SMT solvers (`z3`, `cvc5`, `alt-ergo`): parse `sat`/`unsat`/`unknown` |
| 54 | + from output. |
| 55 | +* Interactive provers (`coq`, `lean`, `agda`, `idris2`, `fstar`): cd to |
| 56 | + file's source root, invoke binary, interpret exit code. |
| 57 | +* Idris2: walks up to find nearest `.ipkg` and uses that as |
| 58 | + `--source-dir` so project-relative imports resolve. |
| 59 | +* ATPs (`vampire`, `eprover`): parse `% SZS status Theorem| |
| 60 | + Unsatisfiable|CounterSatisfiable|Timeout`. |
| 61 | +* SAT solvers (`cadical`, `kissat`): exit codes 10=SAT, 20=UNSAT. |
| 62 | +* `metamath`: pipes `read "file"; verify proof *; exit` via stdin, |
| 63 | + parses `?Error` / "were not proved". |
| 64 | +* `dafny`: parses "finished with N verified, M errors". |
| 65 | +* `why3`: invoked with `-P z3`, parses "Prover result is: Valid". |
| 66 | + |
| 67 | +Environment configuration: `VERISIM_URL`, `VERISIM_TOKEN`, `NOTIFY` |
| 68 | +(notify-send per result), `DRY_RUN`, `MAX_FILES`, `RATE_MS`, |
| 69 | +`TIMEOUT_SEC`, `STRATEGY_TAG`. |
| 70 | + |
| 71 | +Desktop notifications fire on every result (notify-send): urgency |
| 72 | +`critical` on failures, `normal` on success, `low` on unknown. |
| 73 | + |
| 74 | +=== Certificate Landscape (2026-04-05) |
| 75 | + |
| 76 | +After ~1,200 proof_attempts rows across 16 active provers: |
| 77 | + |
| 78 | +* *8 PROVEN* pairs: `safety/{z3,cvc5,vampire,eprover}`, |
| 79 | + `correctness/{z3,cvc5}`, `linearity/idris2`, `model-check/cadical`. |
| 80 | +* *2 SANCTIFIED* classes: `safety` (4 provers, 282 attempts), |
| 81 | + `correctness` (2 provers, 198 attempts). |
0 commit comments