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
proof(SafeUrl,SafeSQL,SafeEmail): repair 5 never-compiled proofs found by proof-check gate
The new proof-check gate (#147), run on a clean idris2-0.8.0 + contrib
toolchain over the 29 *.Proofs modules in proven.ipkg, surfaced 5
"DISCHARGED" theorems that never actually type-checked — merged on
SonarCloud-green while the Idris build stayed queued/cancelled (the exact
#127/#145 pattern). All 29 now compile (FAILCOUNT=0).
SafeUrl/Proofs.idr — both genuinely discharged:
* appendAssociative: referenced Data.List.Equalities.appendAssociative,
which does not exist in 0.8.0. The lemma is Data.List.appendAssociative
(Prelude), stated in the opposite direction, so: sym (Data.List.append-
Associative ...), qualified to disambiguate from this same-named local fn.
* addParamIncreasesCount: lengthSnoc is element-first; fixed
`lengthSnoc qb.params (key,val)` → `lengthSnoc (key,val) qb.params`
(same bug class as #144's appendLengthInc).
SafeSQL/Proofs.idr — reverted 4 DISCHARGED → OWED (honest):
builderQueriesSafe, cannotEscapeStringLiteral, combinePreservesSafety,
addParamPreservesSafety each consumed an erased (0-multiplicity) OWED
witness (parameterizedQueriesSafe / escapeStringQuotesSafe) as a relevant
proof term — illegal ("not accessible in this context"). They cannot be
discharged until their premises are; marked OWED per ADR-001 convention.
SafeEmail/Proofs.idr — reverted 1 DISCHARGED → OWED (honest):
validResultIsValid : validResult.isValid = True does not close by Refl —
Idris2 0.8.0 won't reduce a top-level constant's record projection across
modules (verified with a minimal cross-module repro). Same blocker as
SafePassword.chainedBuildersCompose / SafeCSV.defaultDelimiterIsComma.
Also makes proof-check genuinely ipkg-scoped (parse proven.ipkg, not glob
all 93 on-disk Proofs.idr — 64 are intentionally unbuilt/env-blocked) and
run from src/ with module-relative paths (repo-root paths raise a spurious
"module name does not match file name").
STATE.a2ml: discharged-decls 36 → 31 (honest); session-history + ADR-004.
Refs #145, #147, #144, #127, #128 (SafeUrl), #142 (SafeEmail), #66 (SafeSQL).
https://claude.ai/code/session_01MN5vzRR4MK2dkDNaHqqRDy
"2026-05-31b" = "CI proof-gate (#147 → #148): added a fast `proof-check` job type-checking every *.Proofs module listed in proven.ipkg (29) from src/ with module-relative paths; fixed two self-inflicted gate bugs (repo-root path → spurious 'module name does not match file name'; over-broad glob over all 93 on-disk vs the 29 ipkg-built). The gate found 5 ipkg proof modules that never compiled (DISCHARGED-but-unbuilt, same disease as #127): SafeUrl appendAssociative (referenced nonexistent Data.List.Equalities.appendAssociative; fixed to sym (Data.List.appendAssociative)) + addParamIncreasesCount (lengthSnoc arg order) now genuinely hold; SafeSQL ×4 and SafeEmail ×1 reverted DISCHARGED→OWED (depended on erased OWED premises / top-level-constant opacity). All 29 now green on a clean idris2-0.8.0+contrib build. ADR-004."
69
77
"2026-05-31" = "SafeJson Phase 3: #144 DISCHARGES anyMatchesTAny (6-arm split) + singleKeyPath (with-pattern), completing #138. Root-caused a pre-existing breakage: appendLengthInc (from #127) used `lengthSnoc arr v` but contrib Data.List.Equalities.lengthSnoc is element-first — it failed to type-check and blocked the ENTIRE SafeJson.Proofs module (so main did not compile). Fixed to `lengthSnoc v arr`. Verified on a clean idris2-0.8.0+contrib install (full SafeJson cone, 0 errors). Filed #145: the Idris build is not a required status check, so #127's broken merge went green (created→merged in ~2.5min with build jobs still queued); recommends branch-protection gating + faster cone-check job."
0 commit comments