Commit ed4e223
authored
## Why
`formal/` contains **20 machine-checked Coq/Rocq proofs**, and
`formal/justfile`
already implements a real, fail-closed check over them. **No workflow
ever
invoked it** — `grep` for coq/rocq across `.github/workflows/` returned
nothing,
so the entire corpus was unchecked in CI.
This is the inverse of the usual fake-gate problem: the assurance
already
existed and was simply being thrown away.
## Verified before wiring
Ran the existing `formal/justfile check` locally with `coqc` 8.20.1:
- all 20 files check clean
- every `Print Assumptions` reports **`Closed under the global
context`** — the
strongest result, meaning no dependency on anything outside the kernel
- the justfile's own assertion fires: *"OK: K-1/K1Let/F-1 +
P-2/P-3/F-3/F-4
mechanised; no axioms."*
- only deprecation warnings (`app_length`, from the 8.18→8.20 skew), no
errors
Note `formal/README.adoc` documents Coq/Rocq **8.18**; the container
here is
**8.20**, on which the corpus was confirmed to pass.
## Design
**Fail-closed by construction.** The gate does *not* probe for the
prover and
skip when absent. The pinned container guarantees `coqc`, so a missing
prover is
an infrastructure failure, not a silent pass.
**No duplicated proof list.** `formal/justfile` stays the single source
of truth
for the list and its dependency order; the workflow parses it rather
than
re-stating it. A completeness guard fails the run if any `formal/*.v` on
disk is
not named there — so adding a proof without wiring it cannot silently go
unchecked.
## Falsifier-tested
Both guards were proven to actually fire, not merely to pass:
| Falsifier | Result |
|---|---|
| Add an unwired `formal/ZZ_Falsifier.v` | guard fires, run fails |
| Add a theorem proved via `Axiom cheat` | `Print Assumptions` emits
`Axioms:`, grep catches it, run fails |
## Notes
- Container pinned by digest (`coqorg/coq@sha256:e50d77c4…`)
- `actions/checkout` SHA-pinned to match repo convention
- SPDX header on line 1 and `permissions:` at column 0, per
`workflow-linter.yml`
- A cold full run takes over 2 minutes locally, hence `timeout-minutes:
30`
Draft — this is the first time these proofs will run in CI.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
1 file changed
Lines changed: 96 additions & 0 deletions
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
| 1 | + | |
| 2 | + | |
| 3 | + | |
| 4 | + | |
| 5 | + | |
| 6 | + | |
| 7 | + | |
| 8 | + | |
| 9 | + | |
| 10 | + | |
| 11 | + | |
| 12 | + | |
| 13 | + | |
| 14 | + | |
| 15 | + | |
| 16 | + | |
| 17 | + | |
| 18 | + | |
| 19 | + | |
| 20 | + | |
| 21 | + | |
| 22 | + | |
| 23 | + | |
| 24 | + | |
| 25 | + | |
| 26 | + | |
| 27 | + | |
| 28 | + | |
| 29 | + | |
| 30 | + | |
| 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 | + | |
| 76 | + | |
| 77 | + | |
| 78 | + | |
| 79 | + | |
| 80 | + | |
| 81 | + | |
| 82 | + | |
| 83 | + | |
| 84 | + | |
| 85 | + | |
| 86 | + | |
| 87 | + | |
| 88 | + | |
| 89 | + | |
| 90 | + | |
| 91 | + | |
| 92 | + | |
| 93 | + | |
| 94 | + | |
| 95 | + | |
| 96 | + | |
0 commit comments