workflow-fix: verify_task_body check-31 per-unit pattern set gains pair
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 mechanizable: yes prose
follow-up in the clean-result-critic's verdict on task #1415
(epm:clean-result-critique v5, Lens 11 finding; emitting agent:
clean-result-critic; router: orchestrator).
Goal
Add perpair (and per-pair) to verify_task_body.py check 31's per-unit figure filename pattern set so an embedded per-pair panel is recognized.
Workflow gap
- Bug observed: check 31's per-unit filename pattern set misses the perpair naming used by the issue1415 per-pair small-multiples figures, so the mechanical check cannot see an embedded per-unit view under that name.
- Why it is a workflow gap:
_PER_UNIT_FIG_RE = re.compile(r"(?<![a-z0-9])per[-_]?(context|unit|cell)")(scripts/verify_task_body.py:2445) omitspairfrom the alternation; per-PAIR is this project's most common per-unit grain (the pair is the inference unit on the #1415 line), so both arms of check 31 (orphaned-committed-per-unit WARN and the critic's Lens-11 keying) are blind toposition_profile_perpair_*.png-style figures. The clean-result-critic caught #1415's Lens-11 break manually; the mechanical check should have. - Confidence (emitter): high
- verified-at-filing:
grep -n "perpair\|per_pair\|percell" scripts/verify_task_body.py→ 0 hits for pair-form patterns;sed -n '2445p'shows the alternation(context|unit|cell)(2026-07-23). Presence claim on the named target confirmed (the regex exists at the cited line;pairabsent).
Proposed change (candidate diff sketch — refine in planning)
- PER_UNIT_FIG_RE = re.compile(r"(?<![a-z0-9])per[-]?(context|unit|cell)", re.IGNORECASE)
- PER_UNIT_FIG_RE = re.compile(r"(?<![a-z0-9])per[-]?(context|unit|cell|pair)", re.IGNORECASE)
(+ pin test: a
*_perpair_*.pngcommitted-but-unembedded fixture WARNs; an embedded one PASSes; verify theindivexclusion note stays intact)
Scope / surfaces
- Primary target:
scripts/verify_task_body.py - Check
tests/test_verify_task_body.pycheck-31 fixtures; update the SPEC.md check-31 prose if it enumerates the patterns.
Constraints / invariants
- Workflow-surface only. Existing check-31 semantics (WARN never FAIL; the #1510 exemption idioms; the
indivexclusion) unchanged. - This session runs under
EPM_WORKFLOW_FIX_SESSION=1and carries aworkflow_fix_target:Provenance line — recursion guard applies.
Provenance
- workflow_fix_target: scripts/verify_task_body.py
- fingerprint: 1402fa9ef2e1
target_file: scripts/verify_task_body.py
bug_observed: check 31's per-unit filename pattern set misses the perpair naming used by the issue1415 per-pair small-multiples figures, so the mechanical check cannot see an embedded per-unit view under that name
why_workflow_gap: _PER_UNIT_FIG_RE omits pair from its alternation while per-pair is the project's most common per-unit grain; the critic had to catch a Lens-11 break the mechanical check should have keyed on
proposed_change: add perpair (and per-pair) to verify_task_body.py check 31's per-unit figure filename pattern set so an embedded per-pair panel is recognized
diff_sketch: |
- per[-_]?(context|unit|cell)
- per[-_]?(context|unit|cell|pair)
- check-31 fixture for perpair.png confidence: high related_task: #1415