workflow-fix: Step 10d Guard 2 asserts the pre-#1723 status ordering (says code paths are at completed; #1723 keeps them at running)
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.
The defect
.claude/skills/issue/SKILL.md Step 10d, Guard 2 (currently ~line 11506) reads:
- Status already off
running. By both trigger points the status is well pastrunning(awaiting_promotionfor experiments;completedfor code paths, flipped in Step 10 step 6 BEFORE this step). A crash mid-merge therefore cannot strand a terminated-pod task atrunning. On a later/issue <N>resume: if the PR is already merged AND status is stillrunningfor any reason, auto-advance rather than re-dispatching.
The parenthetical describes the ordering #1723 removed. Step 10 step 6 now says the opposite for exactly this population:
If
epm:mergedis NOT yet present (code-change path arriving via Step 9c PASS —kind: infra | batch | analysis | survey): do NOT tear down the cron here and do NOT apply the terminal status /epm:donehere. Advance directly to Step 10d — its success path postsepm:mergedand THEN, in its#### Terminal teardown (code-change path only)sub-section, fires CRON-TEARDOWN +set-status completed+epm:donein that order.
with the rationale stated in the same step:
the previous ordering (teardown →
set-status completed→epm:done→ Step 10d) left the entire Step 10d merge window (up to ~33 min under fleet churn) with NO/issue-tickre-drive coverage AND with the durable record readingcompleted+epm:doneon an unmerged branch — thecompleted_unmerged_pass(#1540, #1653) flag class.
So a kind: infra | batch | analysis | survey task is at running for the whole
of Step 10d, deliberately. Guard 2 asserts it is at completed, and attributes that
to a Step-10-step-6 action that step explicitly no longer performs.
Why it matters (the misread this invites)
Guard 2 is a numbered GUARD in a block an orchestrator executes in order. An orchestrator that reads it as a PRECONDITION rather than stale narration has two bad moves available, and both re-open the gap #1723 closed:
- Flip the status to
completedbefore merging "because Guard 2 says it should already be there" — reproducing thecompleted+epm:done-on-an-unmerged-branch record and dropping/issue-tickcoverage over the ~30-40 min merge window. - Treat
status: runningat Step 10d entry as a guard FAILURE and bounce / block, stalling a task whose state is correct.
Observed on #2281 (this task's filer): the Step 10d run read status: running,
kind: infra at Guard 2 and had to reconcile the guard against #1723 inline before
proceeding. Nothing was blocked — the drift cost a reconciliation, not a round — but
the next reader may resolve it the other way.
Secondary, smaller inaccuracy in the same bullet: "cannot strand a terminated-pod
task at running" is experiment-path framing. A code-change path never provisions a
pod, so pod-stranding was never its risk; its actual crash-safety story under #1723 is
the armed /issue-tick <N> cron + Step 10d's own idempotent re-entry
(epm:merged-keyed) + the completed_unmerged_pass watcher flag.
Suggested fix
Re-derive the bullet rather than swapping one word. Sketch:
- Experiments: unchanged —
awaiting_promotionat the Step 9b trigger point. - Code paths (
infra/batch/analysis/survey): state that the status STAYS atrunningthrough Step 10d BY DESIGN (#1723), that the terminal flip fires from this step's#### Terminal teardown (code-change path only)sub-section AFTERepm:merged, and that this is what preserves/issue-tickre-drive coverage over the merge window. - Re-base the crash-safety sentence per path: pod-stranding for the experiment path;
armed cron + idempotent
epm:merged-keyed re-entry +completed_unmerged_passfor the code path. - Keep the final resume sentence as-is (still correct).
Worth a scan for the same stale parenthetical elsewhere in Step 10d / Step 9b prose
while in there, and worth considering whether the --check-references-style lint has
any purchase on this class (a guard bullet asserting a superseded ordering is not
currently mechanically detectable, so the honest answer may be "no — prose only").
Provenance
Surfaced by the #2281 Step 10d run (kind: infra, worktree
.claude/worktrees/issue-2281) while executing the Guard 0-5 block: Guard 2's
asserted precondition was false against the live task state, and the contradiction
resolves in #1723's favour. No existing task covers it — the dedup scan over
tasks/*/*/body.md found 20 Step-10d-titled tasks (nearest neighbours: #2246 on the
mid-gate worktree reap, plus the Guard-1 three-dot and lint-vintage fixes) and none
touching the Guard-2 status assertion.
workflow_fix_target: .claude/skills/issue/SKILL.md