Everything upstream is fixed and verified. Dispatch is still down. The remaining fault is in readiness/eligibility detection — a subsystem this incident has not touched.
The observation
A full sweep on the live container ran 33.4 minutes to completion — state: healthy, consecutiveFailures: 0, no abandonment — and dispatched nothing, with a free dispatch slot and seven eligible issues in routed repos.
Verified from /evidence directly:
readinessReconcile.state healthy
readinessReconcile.consecutiveFailures 0
readinessReconcile.lastDurationMs 2001694 (33.36 min; healthy baseline is 1424 ms)
fleetControlPlane.state closed
eventListener.state subscribed
What this rules out
Capacity is not the gate. waiting: 0 is decisive: if the sweep had found ready work and been blocked by a slot, those issues would be queued and waiting would be non-zero. The long-lived in-flight row costs one slot of two but is not what stops dispatch. That reframes a line of investigation several of us spent the evening on.
Everything upstream is verified working today:
|
|
| fleet agent registration (#343) |
fixed, shipped in 0.1.70, deployed |
| orphan reclaim (#347) |
merged |
| control-plane breaker |
closed |
| fleet agent presence |
online |
| event listener |
subscribed |
| sweep completion |
completing (slowly — see #351) |
So the sweep runs, finishes healthy, and declines to dispatch seven issues that match the deployed gate.
The one measurement that splits this in half
The sweep's own completion log carries candidates / dispatched / skipped. Those three integers distinguish two completely different bugs:
That alternative is real and I am not claiming which. candidates separates them in one read.
That line goes to container stdout, which does not reach wrangler tail — proven this evening. So it is currently unobservable.
Deliverable
Project candidates, dispatched and skipped onto readinessReconcile in the health/evidence payload.
Same shape that has worked twice today: factory-cloud#66 and #71 each ended a multi-day argument in a single read. This is the third time in one evening that the answer existed only on a surface nobody can reach, and each time the cost was hours.
Requirements:
- Numbers only — no issue keys, no paths, no titles. The unauthenticated surface must stay free of workspace content.
- Include them even when zero; an absent field and a zero field must be distinguishable, or we will not be able to tell "never ran" from "ran and found nothing".
- If
skipped can carry a reason without leaking content, a bounded enum of skip reasons is worth far more than the count alone.
Canary in place
Issue #350 was filed at 20:38Z matching the deployed gate exactly (requireLabel: factory, requireTitlePrefix: [factory], repo routed, verified against the container's own config template rather than Chief's local copy). It has zero comments and no label change since. It is a clean, known-good test case for whichever branch of the split turns out to be true.
Everything upstream is fixed and verified. Dispatch is still down. The remaining fault is in readiness/eligibility detection — a subsystem this incident has not touched.
The observation
A full sweep on the live container ran 33.4 minutes to completion —
state: healthy,consecutiveFailures: 0, no abandonment — and dispatched nothing, with a free dispatch slot and seven eligible issues in routed repos.Verified from
/evidencedirectly:What this rules out
Capacity is not the gate.
waiting: 0is decisive: if the sweep had found ready work and been blocked by a slot, those issues would be queued andwaitingwould be non-zero. The long-lived in-flight row costs one slot of two but is not what stops dispatch. That reframes a line of investigation several of us spent the evening on.Everything upstream is verified working today:
closedsubscribedSo the sweep runs, finishes healthy, and declines to dispatch seven issues that match the deployed gate.
The one measurement that splits this in half
The sweep's own completion log carries
candidates/dispatched/skipped. Those three integers distinguish two completely different bugs:candidates > 0→ the sweep saw those issues and rejected them ⇒ the bug is in eligibility evaluation (label/prefix/state matching, or a writeback marker suppressing them).candidates == 0→ the sweep never pulled them ⇒ the bug is upstream in discovery/ingestion — plausibly the same slow relayfile mount reads as readinessReconcile wedges ~5min after live start: lastCompletedAtMs frozen while heartbeat ticks, dispatch never resumes #351, where a 33-minute sweep across 21 repos may simply not reach every repo's issues before completing.That alternative is real and I am not claiming which.
candidatesseparates them in one read.That line goes to container stdout, which does not reach
wrangler tail— proven this evening. So it is currently unobservable.Deliverable
Project
candidates,dispatchedandskippedontoreadinessReconcilein the health/evidence payload.Same shape that has worked twice today: factory-cloud#66 and #71 each ended a multi-day argument in a single read. This is the third time in one evening that the answer existed only on a surface nobody can reach, and each time the cost was hours.
Requirements:
skippedcan carry a reason without leaking content, a bounded enum of skip reasons is worth far more than the count alone.Canary in place
Issue #350 was filed at
20:38Zmatching the deployed gate exactly (requireLabel: factory,requireTitlePrefix: [factory], repo routed, verified against the container's own config template rather than Chief's local copy). It has zero comments and no label change since. It is a clean, known-good test case for whichever branch of the split turns out to be true.