Skip to content

MC/DC gate is a loose floor, not a ratchet — it passed a 13→9 full-MC/DC regression #117

Description

@avrabe

The finding

PR #115's MC/DC job reported pass. Comparing it to main's last successful run tells a different story:

metric main (run 29480398404) #115 Δ
decisions_total 1331 1367 +36
conditions_proved 292 343 +51
decisions_full_mcdc 13 9 −4

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.

Suggested work

  1. Read the gap rows in the v3.3 plan + FEAT-070/FEAT-064: agent-verifiable groundwork #115 scry-mcdc-viz artifact; identify which 4 decisions lost full MC/DC.
  2. Add the missing vectors (or justify each loss in the truth table).
  3. 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.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions