Skip to content

Agents stop receiving DM injections after a few hours alive; sends still report recipientMatched #1593

Description

@khaliqgant

Corrected 2026-08-21. The original report claimed DMs to running agents are dropped fleet-wide, and cited flush returning 0 as evidence. Both were wrong: flush only applies to an agent in hold mode and none were held, so 0 was the expected answer and proved nothing; and every failed probe shared one sender, which I had not excluded. Re-tested with controls. The underlying bug is real but the mechanism is different and narrower.

Summary

An agent stops receiving DM injections after it has been alive for somewhere between 1h15m and 5h. Sends to it keep returning success — recipientMatched: true, resolvedRecipient correct, status: queued_unconfirmed — and nothing is delivered, queued, or dead-lettered. Reproduced on three nodes.

Evidence

Unique marker sent to each recipient, then its screen read via node agent attach --mode view and grepped for that marker. Process age from ps -o etime.

recipient node process age state marker arrived
dm-control-probe-0821 chief-broker 6m52s working YES
factory-314-rebase-0821 chief-broker 37m57s working YES
rfc155-repoint-0821 chief-broker 1h09m working YES
modal-15-threads-0821 sf-mini 1h15m working YES
relaycast-factory-identity-0821 chief-broker 5h09m idle NO
rfc169-conflict-0821 sf-mini 5h47m idle NO
sandbox14-conflict-0821 finn-mini 5h51m idle NO
factory-relay-egress-0821 chief-broker 6h19m idle NO
cloud-daytona-transitions-0821 chief-broker 9h57m idle NO
dogfood-metrics-v0-0820 chief-broker 17h idle NO
marketing-lead chief-broker 23h12m idle NO
factory-lead chief-broker 1d17h working NO

The boundary sits between 1h15m (delivers) and 5h09m (does not). I did not bisect it further.

Two confounds, both excluded by control

Not the sender. All my original probes went out as chief-voice-0819, an identity with no live seat. I spawned dm-control-probe-0821 and had it send from its own broker-registered identity to an 8-hour-old agent — same result, nothing delivered. Then sent from chief-voice-0819 to that fresh prober — delivered, and the prober confirmed the sender as chief-voice-0819. The sender identity is not the variable.

Not idleness. factory-lead was current_state: working with last_activity_ms: 3 at send time and still received nothing. Meanwhile fresh agents that were also working did receive. Age separates the groups; activity does not.

What the receipts look like

Identical for a delivering and a non-delivering recipient:

{"status": "queued_unconfirmed", "mode": "steer",
 "requestedRecipient": "dogfood-metrics-v0-0820",
 "resolvedRecipient": "dogfood-metrics-v0-0820",
 "recipientMatched": true, "readConfirmed": false}

pending_messages is 0 on the affected recipients, so the message is not sitting queued at the node — it is lost before that. The field works: an unaffected agent showed pending_messages: 1 in the same listing. node deadletters shows nothing from today; newest entry is 5 days old.

Impact

A dispatcher cannot instruct any agent more than a few hours old. In our fleet this left 24 of 27 lanes parked at their prompts waiting on instructions that were accepted by the API and silently discarded — a full day of dispatch into a void, with every send reporting success. Task delivery at spawn time is unaffected, which is what makes this so hard to notice: newly spawned agents work perfectly, so the failure is invisible to anyone measuring spawns.

Asks

  1. Find what expires on the agent's delivery route between 1h and 5h — a session/route/connection generation is the obvious suspect — and either refresh it or fail the send.
  2. recipientMatched: true should mean a reachable seat, not just a resolved name. Today those are different claims with one field.
  3. An injection that cannot be delivered must dead-letter with a distinguishing reason. Silent discard is the expensive part.
  4. Ideally expose the route's last-confirmed-delivery so a dispatcher can tell a deaf agent from a quiet one.

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