Finding (verified 2026-07-19, refactor turn R14; full audit in REFACTOR_14_REPORT.md on branch refactor-14, PR #278)
The accepted-trace ensemble validates arithmetic provider rows through the shared ArithMul.componentWithArithTable component, whose circuit (mainWithArithTable) mirrors only a subset of the physical Arith AIR's generated constraints — the carry chains, table/range lookups, and (as of the refactor stack) the selector booleans. The Div-block generated constraints (zero-divisor/overflow boundary constraint_9–24, inverse-sum detector constraint_25, scope/disjointness constraint_26–30, W-mode lanes constraint_47–48) are not validated by the live ensemble:
ArithMulRow does not model the Arith AIR's inv_sum_all_bs witness column (stage-1 col 38), and the row-view converter vOfDivuRow fabricates it as 0 — under which the generated inverse-sum equation is false on ordinary nonzero DIV/REM rows.
- The complete constraint mirrors exist in Lean (
AirsClean/ArithCompleteConstraints.lean, every assertZero cited to its constraint_N_every_row extraction fact + arith.pil line) but as dormant circuits the ensemble never runs.
- Consequently the Div-family wrappers carry 16 caller-supplied row-constraint premises that cannot currently be derived. An attempted derivation (refactor turn T13/R14) was correctly refused as unconstructible — discharging them against the incomplete live supply would have been obligation laundering.
Why this matters beyond Arith
This is a class, not a one-off: "the Clean circuit the ensemble actually validates" can silently cover fewer generated constraints than the Lean mirrors or the legacy Valid_<AIR> models suggest. Wherever that happens, facts get carried as caller premises instead of derived, and the modeled acceptance predicate is weaker than the real AIR. The per-family Q2 audits compare constraint lists; they do not check which circuit the ensemble validates — that dimension needs its own audit (in progress: a live-provider coverage matrix across Main/Mem/MemAlign/RegisterBoundary and the static-table families).
Remediation
In flight as refactor turn R15 (branch refactor-15): materialize inv_sum_all_bs and the full audited generated local-constraint set in the shared provider row/circuit, swap the live ensemble onto the completed component with real witness values (constructibility prechecked per concrete row), then derive the 16 premises. Constraint list frozen to the cited generated mirrors; Compliance/Defects.lean (DIV/REM defect boundary) byte-unchanged throughout.
Not a ZisK bug
The physical AIR has all of these constraints and real prover witnesses satisfy them (the real inv_sum_all_bs column is always populated). Nothing currently proven is wrong — the gap is model coverage: premises demanded where derivation should be possible.
Finding (verified 2026-07-19, refactor turn R14; full audit in
REFACTOR_14_REPORT.mdon branchrefactor-14, PR #278)The accepted-trace ensemble validates arithmetic provider rows through the shared
ArithMul.componentWithArithTablecomponent, whose circuit (mainWithArithTable) mirrors only a subset of the physical Arith AIR's generated constraints — the carry chains, table/range lookups, and (as of the refactor stack) the selector booleans. The Div-block generated constraints (zero-divisor/overflow boundaryconstraint_9–24, inverse-sum detectorconstraint_25, scope/disjointnessconstraint_26–30, W-mode lanesconstraint_47–48) are not validated by the live ensemble:ArithMulRowdoes not model the Arith AIR'sinv_sum_all_bswitness column (stage-1 col 38), and the row-view convertervOfDivuRowfabricates it as0— under which the generated inverse-sum equation is false on ordinary nonzero DIV/REM rows.AirsClean/ArithCompleteConstraints.lean, everyassertZerocited to itsconstraint_N_every_rowextraction fact +arith.pilline) but as dormant circuits the ensemble never runs.Why this matters beyond Arith
This is a class, not a one-off: "the Clean circuit the ensemble actually validates" can silently cover fewer generated constraints than the Lean mirrors or the legacy
Valid_<AIR>models suggest. Wherever that happens, facts get carried as caller premises instead of derived, and the modeled acceptance predicate is weaker than the real AIR. The per-family Q2 audits compare constraint lists; they do not check which circuit the ensemble validates — that dimension needs its own audit (in progress: a live-provider coverage matrix across Main/Mem/MemAlign/RegisterBoundary and the static-table families).Remediation
In flight as refactor turn R15 (branch
refactor-15): materializeinv_sum_all_bsand the full audited generated local-constraint set in the shared provider row/circuit, swap the live ensemble onto the completed component with real witness values (constructibility prechecked per concrete row), then derive the 16 premises. Constraint list frozen to the cited generated mirrors;Compliance/Defects.lean(DIV/REM defect boundary) byte-unchanged throughout.Not a ZisK bug
The physical AIR has all of these constraints and real prover witnesses satisfy them (the real
inv_sum_all_bscolumn is always populated). Nothing currently proven is wrong — the gap is model coverage: premises demanded where derivation should be possible.