Steering Queue: How Active-Run Steering Works at Runtime Boundaries
This page explains how OpenClaw's steering queue injects standard prompts into an active runtime session. Developers and integrators using queue-mode steering need this to understand message delivery at model boundaries.
Read this when
- Explaining how steer behaves while an agent is using tools
- Changing active-run queue behavior or runtime steering integration
- Comparing steering with followup, collect, and interrupt queue modes
When a standard prompt is submitted while a session run is already streaming and the queue mode is set to steer (the default, requiring no configuration), OpenClaw attempts to inject that prompt into the currently active runtime. The delivery mechanism differs between OpenClaw and the native Codex app-server harness.
This document explains queue-mode steering for standard inbound messages operating in steer mode. In followup or collect mode, standard messages bypass this process and remain queued until the active run completes. For details on the explicit /steer <message> command, refer to Steer.
Runtime boundary
Steering does not interrupt a tool call that is in progress. OpenClaw checks for queued steering messages at model boundaries:
- The assistant requests tool calls.
- OpenClaw processes the tool-call batch from the current assistant message.
- OpenClaw signals the end of the turn.
- OpenClaw processes any queued steering messages.
- OpenClaw adds those messages as user messages before the next LLM invocation.
This approach ensures tool results stay paired with the assistant message that triggered them, then allows the subsequent model call to see the most recent user input.
The native Codex app-server harness provides turn/steer instead of the internal steering queue used by the OpenClaw runtime. OpenClaw collects queued prompts during the configured quiet window, then dispatches a single turn/steer request containing all gathered user input in the order it arrived.
Codex review and manual compaction reject same-turn steering. When a runtime cannot accept steering in steer mode, OpenClaw waits for the active run to finish before processing the prompt.
Modes
| Mode | Active-run behavior | Later behavior |
|---|---|---|
steer | Injects the prompt into the active runtime when possible. | Holds until the active run finishes if steering is not available. |
followup | Does not steer. | Processes queued messages later after the active run ends. |
collect | Does not steer. | Merges compatible queued messages into one later turn after the debounce window. |
interrupt | Cancels the active run instead of steering it. | Starts the most recent message after cancellation. |
Burst example
If four users send messages while the agent is executing a tool call:
- Under default behavior, the active runtime receives all four messages in arrival order before its next model decision. OpenClaw processes them at the next model boundary; Codex receives them as one batched
turn/steer. - With
/queue collect, OpenClaw does not steer. It waits for the active run to finish, then creates a followup turn with compatible queued messages after the debounce window. - With
/queue interrupt, OpenClaw cancels the active run and starts the most recent message instead of steering.
Scope
Steering always targets the currently active session run. It does not create a new session, alter the active run's tool policy, or separate messages by sender. In multi-user channels, incoming prompts already include sender and route context, so the next model call can identify who sent each message.
Use followup or collect when you want messages to queue by default instead of steering the active run. Use interrupt when the most recent prompt should replace the active run.
Debounce
The built-in queue debounce applies to queued followup and collect delivery. In steer mode with the native Codex harness, it also sets the quiet window before sending batched turn/steer. For OpenClaw, active steering itself does not use the debounce timer because OpenClaw naturally batches messages until the next model boundary.