Commit 90260f4
fix(ci): actually run the verdict round-trip against the reference checker (#34)
Phase 0 of `dev-notes/trope-family-completeness-plan-2026-07-28.md`, and
the
highest-leverage item in it.
## The gate was green while its central assertion never ran
`tests/check-examples.sh` skipped the verdict round-trip whenever the
sibling
`tropecheck` binary was absent — and `trope-check.yml` checked out only
haec and
built no checker, so that binary **could not exist in CI**. The skip was
therefore
unconditional. The schema drift guard was skipping for the same reason.
The round-trip is *the* seam joining the three repos: Haec emits Trope
IR, the
checker returns a verdict. Unexercised, the repository's core claim was
asserted
but never measured.
## A finding I have to correct
My own gap analysis reported that the Idris2 reference checker "cannot
build". **That
was wrong**, and the correction matters.
It builds fine under the right compiler. `verification/proofs/idris2`
requires
Idris 2 **0.8.0** — under 0.7.0, `Trope/Fidelity.idr:72` fails to parse
at the
lambda-impossible clause `No (\Refl impossible)`. **Nothing in either
repo declares
that requirement**, so reading local state (0.7.0 installed) suggests
the reference is
unbuildable and invites swapping in the Rust fast-core as the new
reference.
That would have been the wrong trade. ADR 0002/0003 chose Idris2
precisely so that
*"the thing that runs is the thing that is proved"* — the executable
reuses the proved
verified core. Ratifying the conformance-validated-only Rust checker
would have traded
away the family's central epistemic claim **to fix a toolchain pin.**
## Measured under the digest-pinned `idris2-pack` image (Idris 2 0.8.0)
```
verified core ......... typechecks 8/8 modules, exit 0
tropecheck ............ builds, exit 0
conformance suite ..... all pass (13 verdict cases + 9 schema-invalid rejections)
haec round-trip ....... 3/3 correct, witness e_collapse/fate.quality exact
```
The Rust fast-core agrees with the Idris2 reference on all of the above
— the
cross-validation the calculus §9.3 asks for, now actually performed.
## Changes
- **`trope-check.yml`** runs in the pinned 0.8.0 container; checks out
`trope-checker`
as a **sibling** of `haec/` so `$ROOT/../trope-checker` resolves (which
also
re-activates the schema drift guard); installs `jq` (the image ships
none); builds
the reference checker; runs the gate with `TROPECHECK_REQUIRED=1`.
- **`check-examples.sh`** honours `TROPECHECK_BIN` — the same variable
trope-checker's
own conformance runner already uses — and treats a missing binary as
**fatal** under
`TROPECHECK_REQUIRED=1` rather than skipping.
- **The round-trip now asserts the WITNESS.** `EXAMPLES.json` has always
declared
`["e_collapse","fate.quality"]`; nothing ever checked it.
- The checker exits non-zero on `p-insufficient` — a *verdict*, not an
error — so the
loop no longer aborts on it.
## Canary-tested — a gate that cannot fail is not a gate
| Falsifier | Result |
|---|---|
| `TROPECHECK_BIN=/nonexistent` + `REQUIRED=1` | **fails**, naming the
missing path |
| expected witness corrupted to `e_WRONG` | **fails**, printing got vs
expected |
## Follow-ups (not in this PR)
- `trope-checker` should declare Idris 2 0.8.0 in
`.tool-versions`/README so the next
reader does not repeat my mistake, and run its own conformance suite in
CI.
- `trope-checker/build/guix.scm` still reads `(name "squisher-corpus")`.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-authored-by: Claude Opus 5 <noreply@anthropic.com>1 parent e765e0f commit 90260f4
2 files changed
Lines changed: 85 additions & 10 deletions
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
1 | 1 | | |
2 | 2 | | |
3 | 3 | | |
4 | | - | |
| 4 | + | |
| 5 | + | |
| 6 | + | |
| 7 | + | |
| 8 | + | |
| 9 | + | |
5 | 10 | | |
6 | 11 | | |
7 | 12 | | |
| |||
16 | 21 | | |
17 | 22 | | |
18 | 23 | | |
| 24 | + | |
| 25 | + | |
| 26 | + | |
| 27 | + | |
| 28 | + | |
| 29 | + | |
19 | 30 | | |
20 | | - | |
21 | | - | |
| 31 | + | |
| 32 | + | |
| 33 | + | |
| 34 | + | |
| 35 | + | |
| 36 | + | |
| 37 | + | |
| 38 | + | |
| 39 | + | |
| 40 | + | |
| 41 | + | |
| 42 | + | |
| 43 | + | |
| 44 | + | |
| 45 | + | |
| 46 | + | |
| 47 | + | |
| 48 | + | |
| 49 | + | |
| 50 | + | |
| 51 | + | |
| 52 | + | |
| 53 | + | |
| 54 | + | |
| 55 | + | |
| 56 | + | |
| 57 | + | |
| 58 | + | |
| 59 | + | |
| 60 | + | |
| 61 | + | |
| 62 | + | |
| 63 | + | |
| 64 | + | |
| 65 | + | |
| 66 | + | |
| 67 | + | |
| 68 | + | |
| 69 | + | |
| 70 | + | |
| 71 | + | |
| 72 | + | |
| 73 | + | |
| 74 | + | |
| 75 | + | |
22 | 76 | | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
40 | 40 | | |
41 | 41 | | |
42 | 42 | | |
43 | | - | |
44 | | - | |
45 | | - | |
| 43 | + | |
| 44 | + | |
| 45 | + | |
| 46 | + | |
| 47 | + | |
| 48 | + | |
| 49 | + | |
| 50 | + | |
| 51 | + | |
| 52 | + | |
| 53 | + | |
| 54 | + | |
| 55 | + | |
46 | 56 | | |
47 | 57 | | |
48 | | - | |
49 | | - | |
50 | | - | |
| 58 | + | |
| 59 | + | |
| 60 | + | |
| 61 | + | |
| 62 | + | |
| 63 | + | |
| 64 | + | |
| 65 | + | |
| 66 | + | |
| 67 | + | |
| 68 | + | |
| 69 | + | |
| 70 | + | |
| 71 | + | |
51 | 72 | | |
52 | 73 | | |
53 | | - | |
| 74 | + | |
54 | 75 | | |
55 | 76 | | |
56 | 77 | | |
| |||
0 commit comments