workflow-fix: gotchas bullet — single-arm smokes blind to per-arm seams
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 by the workflow-fix-on-bug protocol from a gotcha_candidate: yes failure-lesson raised on task #1090 fu5 (emitting agent: experiment-implementer).
Goal
add a gotchas bullet: per-arm-class smoke coverage — a driver extended to a new source-context class crashes the #527/#538 panel-disjointness assert at ModelOrganism sites a single-arm smoke never reaches; thread the source-filtered panel and smoke one run per arm class
Workflow gap
- Bug observed: #1090 fu5: all 3 imp-bare arms trained to completion then died rc=2 at the ladder entry on the panel-disjointness AssertionError; the fu5 smoke default covered only the formatting arm
- Why it is a workflow gap: the tiny-real smoke standard (gotchas "Mock-seam smokes" entry + Step 6d.0-bis) does not state that smoke coverage must span ARM CLASSES — a per-arm seam (context / negative-panel / organism assembly) is invisible to a single-arm smoke, and this cost a full 4xA100 GCE cycle. The library refusal itself is correct and load-bearing (contrastive-negatives disjointness invariant).
- Confidence (emitter): high
- verified-at-filing:
grep -n "one run per arm class\|arm class\|panel_name_for" .claude/rules/gotchas.md→ 0 hits for the proposed guidance in the named target (absence-of-guard claim — the 0-hit result IS the evidence); the invariant itself lives in .claude/rules/contrastive-negatives.md § Disjointness invariant (present) (2026-07-15)
Proposed change (candidate diff sketch — refine in planning)
- gotchas.md, near the "Mock-seam smokes surface production shape bugs" entry:
-
- Single-arm smokes are blind to per-arm seams. A driver extended to a NEW
- source-context class (e.g. bare/"default") can pass every existing smoke and
- still crash at ModelOrganism construction: the #527/#538 panel-disjointness
- assert refuses a source content-identical to a default-panel member. Thread
- the source-filtered panel (fu3w.panel_name_for-style) at every organism site
- the new class reaches, and make the smoke default cover ONE RUN PER ARM
- CLASS, not one run total (#1090 fu5, a full GCE cycle lost).
Scope / surfaces
- Primary target:
.claude/rules/gotchas.md - Consider a one-line cross-ref from Step 6d.0-bis (tiny-real standard) in .claude/skills/issue/SKILL.md if the planner judges it in-scope.
Constraints / invariants
- Workflow-surface only; workflow_lint passes (incl. --check-lessons-index if a rules file is added — this edits an existing rule, no index change expected).
- This session runs under
EPM_WORKFLOW_FIX_SESSION=1and carries aworkflow_fix_target:Provenance line — recursion guard applies.
Provenance
- workflow_fix_target: .claude/rules/gotchas.md
- fingerprint: ac8fb68b9f65
failure_class: code phase: issue1090_fu4.py --phase run (Tier-1 ladder entry, fu5 bare-context arms) lesson: A driver re-parametrized for a NEW source-context class (bare/"default") can pass every existing smoke yet crash at ModelOrganism construction, because the #527/#538 panel-disjointness invariant refuses a source that is content-identical to a default-panel member — thread the source-filtered panel (fu3w.panel_name_for) at EVERY ModelOrganism site a new context class reaches, and make the smoke default cover one run per ARM CLASS, not one run total: a per-arm seam (context/panel/organism assembly) is invisible to a single-arm smoke. generalizes: yes owning_agent: experiment-implementer gotcha_candidate: yes root_cause_confirmed: yes