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
Closes the boj-server arm of the estate proof-debt epic.
**Finding (P0 #125):** the 5 `believe_me` in
`src/abi/Boj/SafetyLemmas.idr` (lines 53/60/211/219/226) are all class
**(J)** genuinely-unavoidable axioms — soundness/symmetry of
`prim__eqChar` and length semantics of
`prim__strToCharList`/`prim__strAppend`/`prim__strSubstr`. These are
irreducible within Idris2 0.8.0 (no in-language soundness principle for
foreign primitives; stdlib `DecEq Char` does the same). They are
`%unsafe`, individually documented, and isolated in one module. **No
removable proof debt** — the defect was the doc.
**Change:** `PROOF-NEEDS.md` reconciled — origin/main wrongly stated "4
believe_me"; ground-truth is 5 axiom sites (raw grep returns 9 = 5 real
+ 4 comment mentions). Adds a per-site Axiom Audit table.
Refs hyperpolymath/standards#124
Refs hyperpolymath/standards#125
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
| 1 |`SafetyLemmas.idr:53`|`charEqSound`|`(c1,c2:Char) -> c1 == c2 = True -> c1 = c2`|**J**|`Char` is an opaque primitive; `==` is `prim__eqChar` (foreign `Bool`). Idris2 0.8.0 has no in-language soundness principle for primitive equality. Standard, well-understood axiom. |
29
+
| 2 |`SafetyLemmas.idr:60`|`charEqSym`|`(x,y:Char) -> (x == y) = (y == x)`|**J**| Symmetry of `prim__eqChar`. Same reason as #1 — opaque primitive, no decision procedure to recurse on. |
30
+
| 3 |`SafetyLemmas.idr:211`|`unpackLength`|`length (unpack s) = length s`|**J**|`unpack` = `prim__strToCharList` (foreign). `String` is opaque with no induction principle; the relation between primitive `String` length and `List Char` length is not reducible in-language. |
31
+
| 4 |`SafetyLemmas.idr:219`|`appendLengthSum`|`length (s ++ t) = length s + length t`|**J**|`++` on `String` = `prim__strAppend` (foreign). Length additivity is a backend-semantics guarantee, not type-level reducible. |
32
+
| 5 |`SafetyLemmas.idr:226`|`substrLengthBound`|`LTE (length (substr start len s)) len`|**J**|`substr` = `prim__strSubstr` (foreign). The "result no longer than `len`" bound is a primitive-semantics guarantee with no in-language proof. |
33
+
34
+
**Verdict: 5/5 are class (J).** All five reduce to the same root cause:
35
+
Idris2 treats `Char` and `String` as opaque primitive types whose
36
+
operations are foreign functions with no constructors and no induction
37
+
principle. There is no constructive in-language proof for any of them; a
38
+
`believe_me` (or an equivalent `%foreign` postulate) is the only option
39
+
short of changing the trusted computing base. They are correctly marked
40
+
`%unsafe`, individually documented, and isolated in one module.
41
+
42
+
No **(R)** or **(S)** sites were found. The audit's "9" was a raw text
43
+
count conflating 5 real axioms with 4 comment mentions.
44
+
11
45
## Completed Proofs
12
46
13
47
| File | Covers | REQUIREMENTS-MASTER.md |
@@ -32,22 +66,35 @@ All P1/P2 proof obligations are now closed.
32
66
| BJ2 | Auth/credential handling — full isolation model | ✅ DONE (`CredentialIsolation.idr`) |
0 commit comments