You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
proofs(idris2): Q1-C primitive-eq axiom pilot + equivRefl closure
Pilot for Q1 closure-path-C (believe_me axioms with CI allow-list).
Lands the smallest possible footprint to demonstrate the unlock and
gates further use behind a registry + CI check.
New module: proofs/idris2/src/Filesystem/Axioms.idr
* `axStringEqRefl : (s : String) -> (s == s) = True`
`believe_me`-backed primitive-eq reflexivity. Operational reason:
every Idris2 backend evaluates `prim__strEq s s` to True for any
`s`; the type-checker cannot see through the primitive on opaque
values. Same epistemic status as Agda funext or Coq Axiom
is_empty_dir_dec (both already accepted).
* `axBits8EqRefl : (b : Bits8) -> (b == b) = True`
Same shape for the byte-level primitive.
* `fileContentEqRefl : (xs : List Bits8) -> (xs == xs) = True`
Derived (not an axiom) — structural induction over the list using
axBits8EqRefl at the leaf.
Model.idr — equivRefl closed (was ?equivReflProof)
* `pathEqRefl` (structural induction over Path using axStringEqRefl)
* `fsEntryEqRefl` (case-split on Dir / File with fileContentEqRefl)
* `entryEqRefl` (tuple combinator)
* Idris2 0.8.0's `elem` is `Foldable.any (==)` which desugars to a
foldl form, not the textbook (x==y) || elem x ys recursion. The
proof threads through foldlOrTrueIdempotent — once the accumulator
hits True, the foldl stays True regardless of the tail.
* `equivRefl` then derives via `allElemSelf` (every entry is in
its own list under the propositional `Elem` witness).
Hole inventory: 16 -> 15.
CI guard: .github/scripts/check-idris2-believe-me.sh
* Reject any believe_me in proofs/idris2/**/*.idr that is NOT in
proofs/idris2/src/Filesystem/Axioms.idr.
* Sanity-check: registered-axiom count matches the believe_me count
in the allowed file.
* Wired into idris-verification.yml as a pre-build gate.
Registry: .machine_readable/IDRIS2_AXIOMS.a2ml
* Single source of truth for the believe_me allow-list.
* Each entry carries: type signature, operational justification,
morally-equivalent existing axioms, downstream consumers.
Tested locally:
* `idris2 --build valence-shell.ipkg` exit 0
* Guard: 2 occurrences in Axioms.idr / 2 axioms in registry — pass
* Guard rejection test (added believe_me in Model.idr): correctly
flagged + script exits 1
PROOF-NEEDS.md reconciled:
* Assumption Registry now lists the 2 Idris2 axioms.
* Idris2 hole tally: 16 -> 15.
* Model.idr row: equivReflProof moved from open to closed.
Q4 policy implication: this commit takes Q4 option B (soft policy with
named + gated axioms). If owner subsequently prefers option A (hard
"never believe_me"), revert this commit + accept the Q1-B (Nat-interned
Path) migration as the only path.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Copy file name to clipboardExpand all lines: PROOF-NEEDS.md
+4-2Lines changed: 4 additions & 2 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -29,15 +29,17 @@
29
29
| Coq | (closed) `mkdir_two_dirs_reversible`|`filesystem_composition.v`| Closed via LIFO restate — only standard funext (#56 closed) |
30
30
| Coq | (closed) `overwrite_pass_equalizes_storage`|`rmo_operations.v`| Closed via `Hgeom` strengthened with `block_overwritten` (#57 closed — zero axioms) |
31
31
| Coq | (closed) `obliterate_not_injective`|`rmo_operations.v`| Closed via threaded strengthened `Hgeom` through `multi_pass_same_start_same_result` (#58 closed — only standard funext) |
32
-
| Idris2 | 16 `?holes` across 4 files (zero `partial` annotations) |`proofs/idris2/src/Filesystem/*.idr`| Type-stated, body un-discharged; classification per issue #119|
32
+
| Idris2 |`axStringEqRefl` (primitive-eq axiom) |`proofs/idris2/src/Filesystem/Axioms.idr:42`|`believe_me`-backed; registered in `.machine_readable/IDRIS2_AXIOMS.a2ml`; CI-gated via `.github/scripts/check-idris2-believe-me.sh` (Q1-C pilot 2026-06-02 PM) |
| Idris2 | 15 `?holes` across 4 files (zero `partial` annotations) |`proofs/idris2/src/Filesystem/*.idr`| Type-stated, body un-discharged; classification per issue #119; `equivReflProof` closed via Q1-C pilot |
33
35
34
36
**Idris2 holes by file (verified by grep against `proofs/idris2/src/Filesystem/*.idr`, 2026-06-02 PM):**
|`Model.idr`|2 (`equivReflProof`, `equivTransProof`; `equivSymProof`is closed via `andCommutative`) | 0 |
42
+
|`Model.idr`|1 (`equivTransProof`; `equivSymProof` closed via `andCommutative`; `equivReflProof` closed via Q1-C pilot using `Filesystem.Axioms`) | 0 |
41
43
|`RMO.idr`| 3 (`overwriteIrreversibleProof`, `hardwareEraseIrreversibleProof`, `auditTrailCompletenessProof`; `appendOnlyAuditLogProof` is closed via `Refl`) | 0 |
42
44
43
45
Drift from previous PROOF-NEEDS.md tally (22 holes) to current (16 holes) is mechanical: `equivSymProof` and `appendOnlyAuditLogProof` closed silently during the 2026-06-02 morning sweep (visible by grep but the inventory text was not updated). No body changes — this paragraph reconciles the count.
0 commit comments