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
The gate's floors are conditions_proved >= 155 and decisions_full_mcdc >= 3, against actuals of 343 and 9. The slack is ~2× and 3×, so the gate cannot detect a regression — it passed a 30% drop in the strongest metric without comment.
This is the anti-pattern the feature-loop skill names explicitly: "Trust the truth table, not the percentage." A floor that far below the actual is a green light that carries almost no information.
Two separate problems
1. The regression itself. FEAT-070/FEAT-064 (PR #115) converted several single-condition decisions into conjunctions — e.g. .filter(|a| a.func_index == f.abs_index && !is_module_scoped(&a.code)), and the guard peephole's shape match went from 2 arms to 3. A 1-condition decision reaches full MC/DC with 2 vectors; a 2-condition conjunction needs 3. Plausible that previously-full decisions became partial. Needs the truth-table gap rows read, not inferred — the scry-mcdc-viz artifact from the #115 run has them.
2. The gate design. The floors are constants set once and never raised, so every improvement silently widens the slack. They should be a ratchet: assert against the last known-good value (or last-good minus a small tolerance), so a drop fails and an improvement raises the bar. conditions_proved is the easy one — 343 is a genuine improvement and should be locked in. decisions_full_mcdc should be restored to ≥13 before being ratcheted, not pinned at the regressed 9.
Add the missing vectors (or justify each loss in the truth table).
Convert crates/scry-mcdc/mcdc-gate.sh from fixed floors to a ratchet with a checked-in baseline file, so the numbers cannot silently drift apart from the gate — the same discipline claims.yaml applies to the README.
Found while running the feature loop on #115; reported rather than merged past.
The finding
PR #115's MC/DC job reported pass. Comparing it to
main's last successful run tells a different story:decisions_totalconditions_proveddecisions_full_mcdcThe gate's floors are
conditions_proved >= 155anddecisions_full_mcdc >= 3, against actuals of 343 and 9. The slack is ~2× and 3×, so the gate cannot detect a regression — it passed a 30% drop in the strongest metric without comment.This is the anti-pattern the feature-loop skill names explicitly: "Trust the truth table, not the percentage." A floor that far below the actual is a green light that carries almost no information.
Two separate problems
1. The regression itself. FEAT-070/FEAT-064 (PR #115) converted several single-condition decisions into conjunctions — e.g.
.filter(|a| a.func_index == f.abs_index && !is_module_scoped(&a.code)), and the guard peephole's shape match went from 2 arms to 3. A 1-condition decision reaches full MC/DC with 2 vectors; a 2-condition conjunction needs 3. Plausible that previously-full decisions became partial. Needs the truth-table gap rows read, not inferred — thescry-mcdc-vizartifact from the #115 run has them.2. The gate design. The floors are constants set once and never raised, so every improvement silently widens the slack. They should be a ratchet: assert against the last known-good value (or last-good minus a small tolerance), so a drop fails and an improvement raises the bar.
conditions_provedis the easy one — 343 is a genuine improvement and should be locked in.decisions_full_mcdcshould be restored to ≥13 before being ratcheted, not pinned at the regressed 9.Suggested work
scry-mcdc-vizartifact; identify which 4 decisions lost full MC/DC.crates/scry-mcdc/mcdc-gate.shfrom fixed floors to a ratchet with a checked-in baseline file, so the numbers cannot silently drift apart from the gate — the same disciplineclaims.yamlapplies to the README.Found while running the feature loop on #115; reported rather than merged past.