Skip to content

Live ensemble validates an incomplete Arith provider circuit — model-coverage gap class #279

Description

@codygunton

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.

Metadata

Metadata

Assignees

No one assigned

    Labels

    soundnessCircuit faithfully implements the Sail spec (equivalence, trust, defects, extraction fidelity)

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions