EPS
← All tasks·#1599Completed

daily-fix: sweep subsumption by fix merge time not creation

kind: infra#wf-fix#wf-fix-fp:d273d3de43f1#daily-auto-filed
track:

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 /daily 2026-07-21 from the #1577/#1579 sibling-blindness incident (transcripts 13f0b90c / 2e1f1383) — and validated by THIS run's own Step C sweep, which enumerated the stale #1577 candidate and required a manual dedup.

Goal

Extend the parked-candidate sweep's subsumption rule so a parked candidate whose target_file matches a fix task MERGED/closed AFTER the candidate was parked is suppressed (compare against merge/close time, not only task-creation time).

Workflow gap

  • Bug observed: #1577's session parked a candidate at 10:59:07Z naming scripts/select_step9c_tests.py ("stem/literal/--map-files arms are .py-only"); #1579's session merged the general fix for that exact bug (PR #1356, f0770307ce) at 11:00:11Z — 64 seconds later. Tonight's Step C sweep enumerated the candidate anyway (it postdates #1579's CREATION), and only a manual verified-at-filing grep against the current tree prevented a duplicate pipeline session (the #1479/#1476 class, ~2.3h burned last occurrence).
  • Why it is a workflow gap: scripts/sweep_parked_wf_candidates.py's suppression rule for TERMINAL fix-task hits keys on the fix task's creation time ("a candidate that predates the closed fix was subsumed by it; one raised after it closed is a genuine re-raise") — a candidate parked after the fix task's creation but before its MERGE reads as a genuine re-raise, when the merged fix already covers it. Additionally the recursion-guard park path runs no sibling-overlap advisory at park time.
  • Confidence: high (reproduced live tonight).
  • verified-at-filing: grep -n 'creation\|suppress' scripts/sweep_parked_wf_candidates.py → the creation-time predicate is present at ~:47-50 ("suppresses only when the task's creation ... predates") with no merge-time comparison (presence + absence probes bind, 2026-07-22); git log --oneline --since='7 days ago' -- scripts/sweep_parked_wf_candidates.py → no merge-time extension landed.

Proposed change (candidate diff sketch — refine in planning)

In sweep_parked_wf_candidates.py: for a TERMINAL (completed/archived) same-file fix-task hit, suppress when the candidate's park ts predates the fix task's MERGE/close time (read epm:merged / the terminal epm:status-changed ts from the fix task's events), not only its creation time; keep fp-exact suppression unchanged; optionally emit the suppressed row with suppressed_by.kind: "merged-after-park" for auditability. Secondary (planner's call): have the recursion-guard park path print the open_workflow_fix_siblings advisory at park time.

Scope / surfaces

  • Primary target: scripts/sweep_parked_wf_candidates.py
  • Siblings: .claude/rules/workflow-fix-on-bug.md § Recursion guard (doc), its tests.

Constraints / invariants

  • Fail-open toward enumeration on unreadable events (a wrongly-suppressed candidate is a dropped bug; a wrongly-enumerated one costs a manual dedup — keep the asymmetry).
  • This session runs under a workflow_fix_target: Provenance line — recursion guard applies.

Provenance

  • fingerprint: d273d3de43f1

  • workflow_fix_target: scripts/sweep_parked_wf_candidates.py

Origin evidence: transcript 13f0b90c (park marker 2026-07-21T10:59:02-07Z) vs PR #1356 merge f0770307ce at 11:00:11Z; tonight's /daily Step C output enumerated the candidate with suppressed: false, open_wf_fix_on_file: 865 (a different-bug advisory hit).

Activity