workflow-fix: verify_plan heuristic — GPU basis vs routed machine
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 workflow-fix candidate raised on task #1073 (emitting agent: critic, Methodology lens — prose follow-up).
Goal
Add a verify_plan.py heuristic check that flags any §9 compute-table basis cell naming a GPU (e.g. H100) different from the machine the Spec line / intent routes under auto (GCP INTENT_TO_MACHINE), when the row contains no explicit scaling token (×, "scaled").
Workflow gap
- Bug observed: plan §9 wall-time bases were H100-measured while the auto lane routes A100-80 with no stated cross-GPU scaling; third recurrence of the class (#599, #833, #1073).
- Why it is a workflow gap:
.claude/rules/plan-compute-sizing.md§ "Cost wall-time against the machine the router will ACTUALLY provision" is unconditional prose, butverify_plan.pyhas no mechanical check for it — the class keeps sailing through the mechanical pre-pass and is caught only by the (fallible) LM critics. - Confidence (emitter): low
Proposed change (candidate diff sketch — refine in planning)
- In scripts/verify_plan.py, add check c26_gpu_basis_vs_routed_machine:
-
- detect the routed machine: --intent token in the plan (map via backends/gcp.py INTENT_TO_MACHINE import or a static mirror) when backend is auto/absent
-
- for each §9 table row, if the basis cell names a GPU model string (H100/A100/L4/H200) differing from the routed machine's GPU
-
AND the row lacks a scaling token (`×`, 'scaled', 'per-step rate'), emit FAIL (or WARN initially) -
- N/A escape: 'N/A — basis measured on the routed machine' or an explicit backend pin matching the named GPU
Scope / surfaces
- Primary target:
scripts/verify_plan.py - Grep the workflow surface for the pattern before editing (
grep -rln 'INTENT_TO_MACHINE\|routed machine' .claude/ scripts/) and update every hit; list them in the plan.
Constraints / invariants
- Workflow-surface only — never experiment code,
configs/, ortasks/. scripts/workflow_lint.py --check-askspasses; ruff on touched files passes; keep consistent with.claude/rules/plan-compute-sizing.md.- This session runs under
EPM_WORKFLOW_FIX_SESSION=1and carries aworkflow_fix_target:Provenance line — it MUST NOT auto-route any of its own subagents' workflow-fix candidates (recursion guard).
Provenance
- workflow_fix_target: scripts/verify_plan.py
- fingerprint: 2559c56f77b7
Surfaced prose (verbatim, from the Methodology critic's report on #1073):
"scripts/verify_plan.py: a heuristic check flagging any §9 compute-table basis cell that names a GPU (e.g. H100) differing from the machine the Spec line / intent routes under auto (GCP INTENT_TO_MACHINE), when the row contains no explicit scaling token (×, "scaled"). This is the third recurrence of the class (#599, #833, this plan); the check is grep-shaped once the intent→machine map is imported."