A recurring order is disabled forever by its own prior instance: an expired lease is never reclaimed, and gc order check reads "ready" for 185 hours while the order never fires #32
Loading…
Add table
Add a link
Reference in a new issue
No description provided.
Delete branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
What happened
digest-generate(24h interval) last executed 2026-09-13T11:15:47Z. Measured 2026-09-21T04:35Z, that is 185 hours against a 24-hour interval. Before it stopped it ran daily without a miss: 09-09, 09-10, 09-11, 09-12, 09-13.Nothing reported this.
gc order checkstates the order is due and ready, every cycle, forever:That line is the whole problem in miniature:
yesmeans "due", and the order still does not run. A reader scanninggc order checksees a ready order, not a dead one.Mechanism
The order's 09-13 invocation created molecule wisp
gs-ovijxz(mol-digest-generate), which was claimed by sessiongs-2s6udi(gastown.dog-2) and never completed. It satin_progressfor 7.7 days:The lease is expired and nothing reclaimed it. The order will not create a new instance while the previous one is outstanding, so one stalled molecule disables the recurring order permanently.
Why the claiming session did not finish, and why that is a second finding
gs-2s6udiis not dead.gc session listreports itactive, age 7d. Its pane is a fresh Claude Code session sitting at its prompt with[Pasted text #1 +47 lines]— the molecule prompt — unsent in the input box, under an✔ Update installed · Restart to updatenotice. The prompt was delivered into the pane and never submitted.Two attempts to submit it from outside did not take:
herdr pane send-keys <pane> enter, andherdr pane run <pane> ' '. The pane accepted neither, which suggests the TTY is no longer bound to a process reading input — consistent with the update notice.So the state is: session reads
active, order readsready, lease readsexpired, and nothing moves. Three surfaces, none of them wrong on its own terms, and no combination of them raises an alarm.Impact
digest-generateproduces the windowed activity digest. This city'sCLAUDE.mdnames that digest as the correct cross-check against raw~/.gc/supervisor.loggreps, which over-answer because the log is unwindowed and holds every supervisor the city has ever run:That cross-check has been unavailable for a week while the instructions still direct agents to use it.
Workaround used
Closed
gs-ovijxzwith--forceand a stale reason, to release the block. Whether that is sufficient to make the order fire again is being watched; if the order stays dead with no outstanding instance, the block is elsewhere and this issue should be updated.Acceptance
gc order checkdistinguishes due and will fire from due but blocked by an outstanding instance, and names the blocking bead. The currentyesconflates them.Related
bd reclaimrobs working agents. This is the inverse failure on the same mechanism: a lease expires under a stalled agent and nothing reclaims it at all. Any fix should address both directions.gastown.dogsit unclaimed. Adjacent: the dog pool again not moving work.Filed with no bead, per this city's standing rule that gc defects get a Forgejo issue and no bead, because no polecat here can change the
gcbinary.The workaround is confirmed sufficient, which pins the mechanism.
Closing the stale
gs-ovijxzat 04:36Z made the order fire at 2026-09-21T04:37:44Z — its first execution since 2026-09-13T11:15:47Z, about a minute later and with no other change. So the outstanding prior instance was the entire block, and the order machinery is otherwise healthy.That removes the alternative explanations. It was not the schedule, not the order definition, and not the executor: one molecule stuck
in_progressunder an expired lease disabled a daily order for 7.7 days.Also checked, so the scope is known: a sweep of every ephemeral bead in the HQ store found 0 others
in_progress(25 ephemeral visible, verified two ways because theephemeral=true AND status=in_progressquery is a known false-empty in this city).digest-generatewas the only order in this state.A follow-on condition worth separating from this issue. The revived order created
gs-4qi15c(mol-digest-generate), correctly routed togastown.dog, open and unassigned — proper pool demand. Thegastown.dogpool is:gastown.dog-2(gs-2s6udi) — readsactive, but is the wedged session described above, sitting at an unsent prompt.gastown.dog-1(gs-invazm) —asleep.If the pool counts a wedged-but-
activesession as an occupied-and-working slot, it will not wakedog-1, and the fresh molecule sits unclaimed — the same outage with a different bead. That is being watched; if it holds, it belongs with #18 and #24 rather than here, and this comment will be updated with the result either way.Follow-on confirmed: the wedged session occupies the pool's only slot
The previous comment flagged this as a risk to watch. It held, and the supervisor log states the mechanism directly:
The pool's desired size is 1, and it counts wedged
dog-2(gs-2s6udi, readsactive) as that one. SoscaleCheckis satisfied,dog-1(gs-invazm,asleep) is never woken, and the revived order's moleculegs-4qi15csat unclaimed for 15+ minutes with routing correct (gc.routed_to=gastown.dog, unassigned, open).A clean control makes this conclusive rather than suggestive. In the same window, a bead lifted into the polecat pool was claimed by
celilo/gastown.furiosain under one minute. So spawning works city-wide; what fails is specific to a pool whose only slot is held by a session that isactiveand not working.That is the same family as #18 and #24 — pool bookkeeping that counts a session as productive on the strength of its liveness rather than its progress — with a new trigger: a session wedged at an unsent prompt after an in-place update.
Net effect, and why it is worse than it looks
Fixing the lease-reclaim half of this issue is necessary but not sufficient. Reclaiming
gs-ovijxzwould have let the order fire — as closing it by hand did — and the new molecule would then have queued behind the same occupied slot. The order recovers and the work still does not happen. Any fix should be validated against the whole path: order fires → molecule queued → claimed → completed.Additional acceptance
scaleCheck. Liveness is not progress.poolDesired = 1and the single occupant wedged, queued demand routed to that pool is either served by waking another member or reported as unservable. It must not sit silently.in_progress, not merelyopen.Operationally in this city the unblock is to drain or restart the wedged member so the slot frees.