daily-fix: sweep emits unmatched_record_fps advisory
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 Step C parked-workflow-fix-candidate routing pass
(.claude/rules/workflow-fix-on-bug.md § Recursion guard escape valve). The candidate was
parked on task #1680 at 2026-07-25T16:21:39Z because that session ran under the
workflow_fix_target recursion guard.
Goal
Emit a top-level advisory field (e.g. unmatched_record_fps) from
scripts/sweep_parked_wf_candidates.py listing same-stream filed-record fingerprints that
match no enumerated candidate fingerprint, for /daily Step C to flag. Advisory-only — no
change to suppression semantics.
Workflow gap
- Bug observed: driver fingerprint-recomputation drift (the #1630 class) is now
TOLERATED by the #1680
origin_candidate_tssuppression fallback, but nothing mechanically DETECTS it when it recurs. A routed-record carrying a real 12-hex fingerprint that matches NO enumerated candidate fingerprint is silent evidence the driver recomputed the fingerprint from abridged/synthesized text. - Why it is a workflow gap: the #1680 Edit-C verbatim-fingerprint mandate is PROSE (LLM-followed). A sweep-side detector would surface the drift the moment it recurs instead of relying on the ts fallback indefinitely.
- Confidence (emitter): medium
- verified-at-filing:
grep -c 'unmatched_record_fps' scripts/sweep_parked_wf_candidates.py→ 0 hits (absence confirmed in the named target); a broadergrep -n 'unmatched' scripts/sweep_parked_wf_candidates.pyalso returns nothing. Landed-fix history checkgit log --oneline --since='7 days ago' -- scripts/sweep_parked_wf_candidates.py→ 2 commits:51d2e343a0(#1680, "Step C suppression honors routed-record origin_candidate_ts + structured skips") and45cbe304a9(#1599, "sweep subsumption by fix merge/close time") — #1680 landed the ts FALLBACK this candidate is the DETECTOR for, not the detector itself. Live probe: tonight's Step C run emittedcandidates: 6 / skipped: 1with nounmatched_record_fpskey in the JSON envelope. (2026-07-25)
Proposed change (candidate diff sketch — refine in planning)
+ collect real-fp values from filed records per stream; subtract the
+ stream's candidate fps; emit leftovers as unmatched_record_fps with
+ {source, ref, fp}; document in module docstring + one Step C sentence.
Scope / surfaces
- Primary target:
scripts/sweep_parked_wf_candidates.py - One Step C sentence in
.claude/skills/daily/SKILL.mdtelling the orchestrator to flag a non-emptyunmatched_record_fps(mirror the existingskipped/relevant_kindguidance sentence, which is the closest precedent). - Advisory-only is load-bearing: the field must not gate, suppress, or re-enumerate anything. A false positive here must cost an eyeball, never a lost suppression.
Constraints / invariants
- Workflow-surface only.
- Suppression semantics UNCHANGED — verify against
tests/test_sweep_parked_wf_candidates.pythat the existing suppression paths (verbatim-fp primary, #1680origin_candidate_tsfallback) are byte-behaviour-identical. - Fail soft: a malformed filed record contributes to the advisory or is skipped, never raises.
scripts/workflow_lint.py --check-references/--check-askspass; ruff passes.- This session runs under
EPM_WORKFLOW_FIX_SESSION=1and carries aworkflow_fix_target:Provenance line — recursion guard applies.
Provenance
- workflow_fix_target: scripts/sweep_parked_wf_candidates.py
- fingerprint: d541ad0333fd
Parked candidate (verbatim), from task #1680 events.jsonl @ 2026-07-25T16:21:39Z:
target_file: scripts/sweep_parked_wf_candidates.py bug_observed: driver fp-recomputation drift (the #1630 class) is now tolerated by the ts-claim suppression fallback (#1680) but nothing mechanically DETECTS it when it recurs — a routed-record carrying a real 12-hex fp that matches NO enumerated candidate fp is silent evidence the driver recomputed from abridged text. why_workflow_gap: the #1680 Edit C verbatim-fp mandate is prose (LLM-followed); a sweep-side detector would surface drift the moment it recurs instead of relying on the ts fallback forever. proposed_change: emit a top-level advisory field (e.g. unmatched_record_fps) listing same-stream filed-record fps that match no enumerated candidate fp, for /daily to flag; advisory-only, no suppression semantics change. diff_sketch: |
- collect real-fp values from filed records per stream; subtract the
- stream's candidate fps; emit leftovers as unmatched_record_fps with
- {source, ref, fp}; document in module docstring + one Step C sentence. confidence: medium related_task: #1680