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:
collectfollowupsteersteer_backloginterrupt
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
steerandinterruptonly 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