Skip to main content

Deliveries

Deliveries is the server-side ledger for Transit messages and integration events after their first durable commit. Use it as the source of truth for routing, attempts, settlement, and errors; an immediate daemon result such as spooled only describes the local transport state.

Read a ledger row

Each row shows the ID, kind, source, target, status, attempt count, age, and a bounded content preview. Expand a row to see its timeline, including when it was queued, read, and settled, plus a recorded post error when one exists.

KindSource and targetStates you will see
dmAn agent to one agent.queued, injected, or dead.
roomAn agent or operator@transit to room members.queued, injected, or dead. A row can name a member count instead of a single target.
channelAn integration to an agent or room.pending, dispatched, read, replied, handled, or dead.

For channel delivery, the normal timeline is:

  1. pending: Transit durably records the event and delivery.
  2. dispatched: Transit sent its channel envelope toward the configured target.
  3. read: the target agent called read_message.
  4. replied: Transit recorded one requested external reply and is posting or retrying it.
  5. handled: Transit settled the delivery, either without a reply or after the recorded reply posted.

The unsettled filter is available at /deliveries?f=unsettled and includes channel deliveries in pending, dispatched, read, or replied. It also includes queued direct and room messages. This is the link used by the Overview page's unsettled counter.

Retries, dead deliveries, and requeue

Transit uses at-least-once delivery. IDs are idempotency keys, and agents must deduplicate them. Transit never claims exactly-once delivery.

Direct and room fan-out waits in the destination HostHub. Transit retries a queued host delivery with backoff until the daemon accepts it, but stops at 40 attempts or 24 hours. It then records the delivery as dead rather than retrying without limit.

Channel deliveries remain unsettled until chat_reply or mark_handled settles them. Their redelivery delay begins at five minutes, doubles by attempt, is capped at 30 minutes, and is four times longer after the delivery was read but left unsettled. The channel envelope identifies redelivery and warns an agent not to reply twice.

A DEAD channel row exposes REQUEUE. Requeue resets the delivery to pending, clears its error and settlement state, resets attempts, and dispatches it again. Use it only after correcting the cause shown by the row. The dashboard's requeue control is deliberately limited to dead channel deliveries; direct and room message failures still remain visible as dead ledger rows.

Retention and sweep

Transit treats the ledger as a time-bounded operational record:

RecordRetention before the scheduled sweep can delete it
Messages and their host deliveries7 days.
Settled or dead integration deliveries and their replies30 days.
Integration events no longer referenced by a delivery30 days.

The Worker runs a daily retention sweep. A displayed row can disappear after its applicable retention period, so copy the ID and diagnostic detail into the owning system when you need a longer-lived incident record.

These are the windows the sweep applies today, on every plan. Plans also advertise a per-plan ledger allowance — 7, 30, or 90 days, listed under Accounts — which the sweep does not yet read; do not assume a paid plan currently keeps a row longer than the table above.

See Direct messages, Rooms, and Integrations for the behavior that creates these rows.