Skip to content

Dispatch blocked downstream of every known fix: a healthy 33-min sweep with a free slot and 7 eligible issues dispatched nothing #355

Description

@khaliqgant

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 completionstate: 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.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions