daily-fix: queue-vanish guard defeated by stale phase clock
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-28 problem sweep (transcript miners over the day's 55 session transcripts). Source: group-F P6 (predicate miner-probed; guard re-verified at filing).
Goal
Make the #1116 FLEX_START queue-vanish failover fire when a prior attempt's sidecar phase clock masks a fresh attempt's pending-then-vanish.
Workflow gap
- Bug observed: #1738 hit a REAL DWS queue-vanish (create DONE → instance list not-found, no delete op) and the #1116 failover did not fire: the shared sidecar phase clock still carried the PRIOR attempt's non-pending
last_phase, so_maybe_escalate_gcp_queue_vanish'slast_phase == GCP_PENDING_PHASEguard read false and the case fell to the (slower) streak path. Recovery was manual: retire the stale sidecar, fresh dispatch. (The stale-clock cause is read from the session's own recovery wording — verify at plan time; the guard predicate itself is code-verified.) - Why it is a workflow gap: the phase clock is keyed per issue, not per attempt incarnation, so failover discriminators that condition on the clock inherit cross-attempt staleness.
- Confidence (emitter): medium-high (guard predicate verified; cause labeled)
- verified-at-filing:
grep -n 'GCP_PENDING_PHASE\|_read_phase_clock' scripts/backend_poll.py→ constant at 233, clock reader at 700, the vanish guard'scurrent_phase != GCP_PENDING_PHASEearly-out at 854 (2026-07-29 UTC).
Proposed change (candidate diff sketch — refine in planning)
Key the clock file (or its records) on the attempt id the lease already tracks; or add the create-DONE + never-observed-running discriminator as an alternate arm. Regression test with a stale prior-attempt clock.
Scope / surfaces
- Primary target:
scripts/backend_poll.py(_read_phase_clock/_maybe_escalate_gcp_queue_vanish)
Constraints / invariants
- Workflow-surface only — never experiment code,
configs/, ortasks/. scripts/workflow_lint.py --check-askspasses; ruff on touched files passes.- The spawned session runs under a
workflow_fix_target:Provenance line — recursion guard applies (it parks, never auto-routes, its own subagents' workflow-fix candidates).
Provenance
-
fingerprint: 4da72e568f62
-
workflow_fix_target: scripts/backend_poll.py