⛔ RETRACTED BY ITS FILER — there is no stall, and nothing below is a finding. Maintainer ruling #208 (on #19491, executed by #19497) retired this workflow's schedule in commit d76facf22, hours before this card was filed. The 07:37Z slot produced no run because no such slot exists. The heartbeat sentence quoted below had already been rewritten on main to say the ⛔ opposite. Grounds, root cause and the recommended disposition (close not planned): comment 5758370961 on this card.
⚠️ The original text is kept verbatim below it as the record of what was filed — ⛔ read it as a retracted claim, never as a reading.
⏱️ Measured by the domain:spec execution seat 2 (session session_01UDXER3sdqfeVYpEWZs5mZx) at 2026-09-21T08:22Z. ⛔ Filed unassigned, ⛔ no priority:*, ⛔ no domain:*, ⛔ no type — routing and grading are triage's.
The reading
The anchor issue #9857 still carries:
_Swept 2026-09-21T02:02:57.927Z · expected every 6h (cron `37 1,7,13,19 * * *` UTC)
· next by 2026-09-21T07:37Z · run 35552505373
The workflow's own run list, read through the Actions API at 08:22Z:
2026-09-21T05:04:13Z completed success pull_request
2026-09-21T01:56:25Z completed success schedule ← the newest SCHEDULED run
2026-09-20T23:16:55Z completed success pull_request
⇒ The 07:37Z scheduled slot produced no run, and none has appeared in the 45 minutes since. The pull_request runs in between are a different trigger and do not rewrite the anchor — its body is unchanged since 02:02:58Z.
Why that is a finding and not a shrug
The workflow's own header makes this decidable rather than a judgement call, verbatim:
The Swept timestamp in that body is the patrol's heartbeat and is deliberately refreshed even when the findings are unchanged: a timestamp that stops advancing is how a reader learns the standing caller died. That is the whole defect class this workflow exists to close, so the run must not "optimize away" the no-op edit that proves it is alive.
The patrol carries thirteen predicates over the dispatch protocol's label / assignee / PR invariants, and the dispatch protocol makes its anchor the first criterion of every execution seat's round (「每轮巡检第一判据:先读半状态巡查锚」, and ⛔ no new dispatch while an anchor row is unhandled). So every seat reading that anchor right now is reading rows computed six hours ago and treating them as current — which is the same silence the workflow was created to end, arriving through the caller instead of through the script.
What this card does NOT claim
⛔ It does not claim the workflow is broken. One missed cron slot is not proof of death: GitHub delays or drops scheduled runs under load, and the honest bound is 「the 07:37Z slot produced no run as of 08:22Z」. What makes it worth a card anyway is that the anchor's own contract says a reader should treat this as stalled, and there is no second signal that distinguishes 「delayed」 from 「died」 — which is itself the gap.
⚠️ One lead, unproven and stated as a lead. .github/workflows/half-state-patrol.yml was modified on origin/main within the last few hours — it arrives in the merge range of at least one open PR taken this morning. ⛔ This seat did not read that diff and does ⛔ not assert a causal link; whoever takes this card should read it first, because a recent edit to the caller is the cheapest hypothesis.
Suggested first act for whoever takes it
Re-run the workflow on demand (the header says the on-demand path exists beside the schedule) and see whether the anchor's Swept line advances. If it does, the script is fine and the question is the schedule; if it does not, the question is the script.
Dedup words
half-state patrol · Swept heartbeat · anchor 9857 stale · scheduled run missing · standing caller
Generated by Claude Code
⛔ RETRACTED BY ITS FILER — there is no stall, and nothing below is a finding. Maintainer ruling #208 (on #19491, executed by #19497) retired this workflow's schedule in commit
d76facf22, hours before this card was filed. The 07:37Z slot produced no run because no such slot exists. The heartbeat sentence quoted below had already been rewritten onmainto say the ⛔ opposite. Grounds, root cause and the recommended disposition (closenot planned): comment 5758370961 on this card.⏱️ Measured by the
domain:specexecution seat 2 (sessionsession_01UDXER3sdqfeVYpEWZs5mZx) at 2026-09-21T08:22Z. ⛔ Filed unassigned, ⛔ nopriority:*, ⛔ nodomain:*, ⛔ no type — routing and grading are triage's.The reading
The anchor issue #9857 still carries:
The workflow's own run list, read through the Actions API at 08:22Z:
⇒ The 07:37Z scheduled slot produced no run, and none has appeared in the 45 minutes since. The
pull_requestruns in between are a different trigger and do not rewrite the anchor — its body is unchanged since 02:02:58Z.Why that is a finding and not a shrug
The workflow's own header makes this decidable rather than a judgement call, verbatim:
The patrol carries thirteen predicates over the dispatch protocol's label / assignee / PR invariants, and the dispatch protocol makes its anchor the first criterion of every execution seat's round (「每轮巡检第一判据:先读半状态巡查锚」, and ⛔ no new dispatch while an anchor row is unhandled). So every seat reading that anchor right now is reading rows computed six hours ago and treating them as current — which is the same silence the workflow was created to end, arriving through the caller instead of through the script.
What this card does NOT claim
⛔ It does not claim the workflow is broken. One missed cron slot is not proof of death: GitHub delays or drops scheduled runs under load, and the honest bound is 「the 07:37Z slot produced no run as of 08:22Z」. What makes it worth a card anyway is that the anchor's own contract says a reader should treat this as stalled, and there is no second signal that distinguishes 「delayed」 from 「died」 — which is itself the gap.
.github/workflows/half-state-patrol.ymlwas modified onorigin/mainwithin the last few hours — it arrives in the merge range of at least one open PR taken this morning. ⛔ This seat did not read that diff and does ⛔ not assert a causal link; whoever takes this card should read it first, because a recent edit to the caller is the cheapest hypothesis.Suggested first act for whoever takes it
Re-run the workflow on demand (the header says the on-demand path exists beside the schedule) and see whether the anchor's
Sweptline advances. If it does, the script is fine and the question is the schedule; if it does not, the question is the script.Dedup words
half-state patrol·Swept heartbeat·anchor 9857 stale·scheduled run missing·standing callerGenerated by Claude Code