Skip to main content

Message flow control and delivery

Read this if: you need the operational rules for dedupe, debounce, queueing, streaming, and outbound delivery after a message enters a conversation.

Skip this if: you only need the high-level message/conversation model; start with Messages and Conversations.

Go deeper: Conversations and Turns, Markdown Formatting, Channels.

This is a mechanics page for conversational flow after a message has entered a conversation: dedupe, debounce, queueing, steering, outbound delivery, typing, and formatting.

Delivery pipeline

Inbound controls

Channels can redeliver the same inbound message after reconnects and retries. Tyrum prevents duplicate turns by deduping inbound deliveries before they enqueue conversation work.

Dedupe is typically keyed by stable identifiers such as:

  • (channel, account_id, container_id, message_id)

Entries are durable and time-bounded so dedupe remains correct under clustered gateway edges.

Debounce and burst handling

Rapid consecutive messages from the same conversation are batched into one turn using a per-conversation debounce window:

  • text-only bursts can be coalesced
  • attachments flush immediately
  • explicit control commands bypass debouncing

Queueing while a turn is active

When a turn is already active for a conversation, Tyrum uses explicit queue modes:

  • collect
  • followup
  • steer
  • steer_backlog
  • interrupt

Queueing is durable, conversation-aware, and bounded by caps and overflow policy.

Loop control

Tyrum uses multiple layers of loop control:

  • per-turn step budgets
  • within-turn loop detection on repeated tool signatures
  • cross-turn repetition warnings
  • bounded transcript retention that is separate from prompt limits

Outbound delivery

Outbound messages to channels are side effects:

  • each send carries an idempotency key
  • risky sends remain approval-gated
  • provider receipts and failures are captured as audit events and, when useful, as artifacts

Operator clients receive the same state through typed event streams rather than connector-style message delivery.

Typing, streaming, and formatting

Tyrum supports responsiveness features without weakening determinism:

  • block streaming for long replies
  • typing indicators with explicit start modes and bounded cadence
  • small pacing delays when a connector needs less bursty delivery

Markdown is chunked before connector-specific rendering so formatting does not break across delivery boundaries. See Markdown Formatting.

Constraints and edge cases

  • queueing behavior must survive retries and restarts
  • steer and interrupt only apply at safe turn boundaries
  • non-interactive conversations should not emit typing by default
  • channel formatting caps must not silently truncate semantically important content without an observable fallback