workflow-fix: verify_plan.py check — registered verdict lattices must be mutually exclusive + exhaustive
Highlight text on any card (body, plan, or an event) to anchor a comment, or leave a whole-task comment here. Mention @claude to summon a reply.
No comments yet.
Overview / Motivation
Auto-filed from a Codex critic verdict note on #923's pooled-span-features amendment plan (2026-07-04). The plan's registered verdict lattice (H-robust / H-slot / intermediate) was not mutually exclusive: a bare positive point estimate with both CIs straddling 0 satisfied both H-slot and intermediate — a false-positive H-slot would have rescoped the parent headline without uncertainty support. Fixed by hand in plan v6; the check should be mechanical.
Goal
Add a verify_plan.py check that a plan's registered verdict lattice (success/kill/intermediate labels defined by interval predicates) is mutually exclusive and exhaustive.
Workflow gap
- Bug observed: #923 amendment plan v4/v5 §3 defined H-slot as "Δ_pool ≥ 0 OR (CI incl. 0 AND paired-diff CI positive)" and intermediate as "both CIs straddle 0" — a positive point estimate with straddling CIs co-fires both labels.
- Why it is a workflow gap: verify_plan.py checks plan structure but not decision-gate coherence; the Statistics critic lens catches this only when a reviewer notices — it is mechanizable (encode the interval predicates, assert exactly one label per sign/CI cell).
- Confidence (emitter): medium
Proposed change (candidate diff sketch — refine in planning)
- In scripts/verify_plan.py: parse a
verdict latticeblock (labels + predicates over (point, ci_lo, ci_hi, paired_ci_lo, paired_ci_hi)); - enumerate the sign/CI cells (point <0/=0/>0 x CI below/straddle/above x paired-CI below/straddle/above);
- FAIL when any cell fires 0 or >=2 labels; SKIP when the plan registers no lattice.
- tests/test_verify_plan.py: co-firing fixture (the #923 v4 shape) FAILs; the v6 disjoint shape PASSes.
Scope / surfaces
- Primary target:
scripts/verify_plan.py,tests/test_verify_plan.py
Constraints / invariants
- Workflow-surface only;
scripts/workflow_lint.py --check-askspasses; ruff passes. - This session runs under a normal /issue session (not a workflow-fix session).
Provenance
- workflow_fix_target: scripts/verify_plan.py
- fingerprint: vlattice923a01