daily-fix: implementer pin-sweep + lint parity
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 /daily 2026-07-25 problem sweep. The implementer's self-declared
verification scope and the gate's actual scope disagree in three separate ways, and
the reviewer or the gate paid for it in 5 of the day's sessions.
Goal
Emit the pin-sweep hit list mechanically (selector-computed, with sweep_scope
declared by the tool rather than by the implementer), always include the repo-wide
invariant tests in the implementer's pre-commit local union when the diff touches any
scripts/*.py or src/** file, and run the repo ruff-policy pin rather than a
default ruff check in the implementer's lint leg.
Workflow gap
- Pin-sweep hit lists under-enumerated in 4 of 6 sessions. Every code-reviewer re-ran its own repo-wide/tree-wide pin sweep and found files the implementer's declared hit list had omitted: 8 files (#1667 @ 08:12Z), 2 (#1669 @ 10:24Z), 8 (#1670 @ 09:57Z), 5 (#1671 @ 09:54Z). All were run green by the reviewer, so nothing shipped broken — but each cost the reviewer an extra sweep + test run and produced a recurring non-blocking Minor. #1667 verbatim: "gate-scope sweep omitted 8 generic-token hit files — I ran all 8 green"; #1670: "pin-sweep hit-list under-enumeration of 8 basename-fragment test files — all 271 run by me and green". The implementer's declared list and the reviewer's independent sweep are two different computations of the same thing; only one is mechanical.
- The local union misses repo-wide invariants. #1681 (
832cccf2) round 1 introducedPROJECT_ROOT / "tasks"atscripts/autonomous_session_watch.py:8220— a direct violation of the always-on canonical-resolver invariant pinned bytests/test_no_direct_task_path_construction.py. The implementer reported a "4,208-test local union green" and the code-reviewer PASSed with 0 Critical / 0 Major; neither ran that invariant test. The Step 9c gate found it after a 27-min run:E 1 file(s) violate the canonical-resolver rule. … Matches: - scripts/autonomous_session_watch.py:8220. Cost a round-2 implementer spawn plus a second 29-min gate run (~40 min). The local union is derived from touched-file mapping, which does not pull in repo-wide invariant tests that ANYscripts/*.pyedit can break. - Local ruff leg is narrower than the gate's ruff pin. #1672 (
188282d2) @ 11:33:39Z — the implementer reportedruff check + format cleanon its main commit, but the gate-scope union'stests/test_ruff_policy.pyfull-ruleset pin caught a UP033 violation, forcing a second commit (cfb4a2a297) purely to swap a decorator tofunctools.cache. The "ruff clean" acceptance criterion is therefore not the criterion the gate enforces.
- Confidence (emitter): high on all three (4/6, 1, and 1 same-day occurrences, each quoted from the sessions' own reviewer findings or gate output).
- verified-at-filing: the three always-on invariant tests exist and are named in
CLAUDE.md § Common Commands as the workflow-invariant family —
ls tests/test_no_direct_task_path_construction.py tests/test_no_pod_side_task_py_shellout.py tests/test_no_dollar_budget_caps.py tests/test_ruff_policy.py→ all four present. The #1681 violation text, the four under-enumeration counts, and the UP033 fix-up commit are quoted from the sessions' own tool output / reviewer findings, not from recall;git rev-parse --verify --quiet 'cfb4a2a297^{commit}'resolves. Landed-fix history checkgit log --oneline --since='7 days ago' -- .claude/agents/implementer.md .claude/agents/experiment-implementer.md scripts/select_step9c_tests.py→ the wave touched all three (#1682841304c2d0, #1688ab45d65777, #167337f6f6b1b4, #1651, #1649, #1646, #1645); none makes the sweep mechanical, adds the invariant family to the local union, or changes the lint leg's ruleset. (2026-07-25)
Proposed change (refine in planning)
+ (1) selector emits the pin-sweep hit list: the implementer RUNS the tool and pastes
+ its output (with the tool-declared sweep_scope) instead of hand-enumerating, so
+ the implementer's list and the reviewer's independent sweep are one computation.
+ (2) local union: when the diff touches any scripts/*.py or src/** file, always
+ include tests/test_no_direct_task_path_construction.py,
+ tests/test_no_pod_side_task_py_shellout.py, tests/test_no_dollar_budget_caps.py.
+ (3) lint leg: run tests/test_ruff_policy.py (or ruff with the pin's full ruleset)
+ rather than a bare `ruff check`, so "lint clean" means what the gate means.
(2) is cheap — those three tests are fast static scans, not suite runs. (1) is the structural one: if the selector already computes the hit list for the reviewer, the implementer should call the same entrypoint.
Scope / surfaces
.claude/agents/implementer.mdand.claude/agents/experiment-implementer.md(verification/smoke-run legs — both, or the shared text they point at).scripts/select_step9c_tests.pyif (1) needs a new output mode rather than reusing an existing one — check first; the reviewer already runs a sweep, so the computation likely exists and only needs an implementer-facing entrypoint.- Both agent specs are large: the agent-spec size ratchet
(
workflow_lint --check-agent-spec-size, WARN >28KB / FAIL >40KB) applies — prefer editing shared pointer text over duplicating three bullets in two files.
Constraints / invariants
- (2) must not balloon the local union into a full-suite run — name the three static invariant tests explicitly, do not widen to "all workflow-invariant tests".
- (1) must keep the implementer's declaration auditable: the reviewer's independent sweep stays as the check; this makes the two agree, it does not remove the check.
scripts/workflow_lint.py --check-references/--check-askspass; ruff passes (includingtests/test_ruff_policy.py, which is the point of item 3).- This session runs under
EPM_WORKFLOW_FIX_SESSION=1and carries aworkflow_fix_target:Provenance line — recursion guard applies.
Provenance
- workflow_fix_target: .claude/agents/implementer.md
- fingerprint: 5095937ee216
- Source:
/daily2026-07-25 transcript sweep, sessions203baf55(#1667),7457e1a3(#1669),ad35514c(#1670),25e73c77(#1671),832cccf2(#1681),188282d2(#1672).