openclaw - ✅(Solved) Fix Docs site command queue page conflicts with current active-run steering behavior [2 pull requests, 3 comments, 2 participants]

Official PRs (…)
ON THIS PAGE

Recommended Tools

×6

Utilities matched from this issue’s tags and category — try them while you read without losing context.

GitHub issue graph ai analysis

Paste a GitHub issue URL. We fetch that issue, discover linked issues from bodies/comments/timeline, collect linked pull requests, and produce a structured English report.

The report is written in English Markdown for sharing and archival.

Helpful · Quick feedback

Loading…
GitHub stats
openclaw/openclaw#83869Fetched 2026-05-20 03:47:56
View on GitHub
Comments
3
Participants
2
Timeline
8
Reactions
1
Author
Timeline (top)
commented ×3cross-referenced ×2closed ×1labeled ×1

The public command queue docs appear stale or internally inconsistent with current OpenClaw behavior.

The current source and current steering docs say OpenClaw defaults busy inbound messages to active-run steering, with fallback to a later prompt if steering is unavailable. The hosted docs.openclaw.ai/concepts/queue page still describes older queue semantics, including collect as the default and retired queue mode names.

This creates a real user-facing confusion: people comparing OpenClaw with other agents conclude that OpenClaw "only queues messages" and does not support real active-run steering, even though current source and recent PRs show that it does.

Root Cause

The current public docs make OpenClaw look like it only has a deferred queue, or that collect is still the default. That is the opposite of the current steering story.

This matters for:

  • users deciding whether OpenClaw supports "steer the current run" behavior
  • comparisons with Hermes Agent, Codex app, and other busy-run steering UIs
  • operators choosing between /queue steer, /queue followup, /queue collect, and /queue interrupt
  • expectations around whether a running tool call is interrupted, skipped, or allowed to finish before the next LLM call

PR fix notes

PR #76934: feat: add current-session steer command

Description (problem / solution / changelog)

Summary

  • Add top-level /steer <message> and /tell <message> handling for the current session active run.
  • Keep child-run steering under /subagents steer <id|#> <message>.
  • Update the slash command registry, docs, changelog, and focused command tests.

Verification

  • pnpm test src/auto-reply/reply/commands-steer.test.ts src/auto-reply/reply/commands-subagents-routing.test.ts src/auto-reply/reply/commands-subagents-steer.test.ts src/auto-reply/commands-registry.test.ts
  • pnpm exec oxfmt --check --threads=1 src/auto-reply/reply/commands-steer.ts src/auto-reply/reply/commands-steer.runtime.ts src/auto-reply/reply/commands-steer.test.ts src/auto-reply/reply/commands-handlers.runtime.ts src/auto-reply/reply/commands-subagents/shared.ts src/auto-reply/reply/commands-subagents-dispatch.ts src/auto-reply/reply/commands-subagents-routing.test.ts src/auto-reply/reply/commands-subagents-steer.test.ts src/auto-reply/commands-registry.shared.ts
  • git diff --check
  • pnpm check:docs
  • Testbox tbx_01kqqw2v7dnhcycta1f2yhwexe: pnpm check:changed passed (syncDelegated=true, exit 0, 1m41s total)

Changed files

  • CHANGELOG.md (modified, +1/-0)
  • docs/tools/slash-commands.md (modified, +2/-1)
  • docs/tools/subagents.md (modified, +2/-0)
  • src/auto-reply/commands-registry.shared.ts (modified, +1/-6)
  • src/auto-reply/reply/commands-handlers.runtime.ts (modified, +2/-0)
  • src/auto-reply/reply/commands-steer.runtime.ts (added, +5/-0)
  • src/auto-reply/reply/commands-steer.test.ts (added, +129/-0)
  • src/auto-reply/reply/commands-steer.ts (added, +113/-0)
  • src/auto-reply/reply/commands-subagents-dispatch.ts (modified, +0/-1)
  • src/auto-reply/reply/commands-subagents-routing.test.ts (modified, +4/-4)
  • src/auto-reply/reply/commands-subagents-steer.test.ts (modified, +1/-1)
  • src/auto-reply/reply/commands-subagents/shared.ts (modified, +8/-16)

PR #77023: feat: steer mid-turn prompts by default

Description (problem / solution / changelog)

Summary

  • Make steer the clear default active-run queue mode: normal inbound messages try to enter the active run instead of always waiting for a later turn.
  • Preserve the explicit queue-by-default modes people can choose: followup queues each message for later, collect coalesces compatible queued messages for one later turn, and interrupt aborts the active run for the newest message.
  • Harden explicit /steer <message> so user text is never swallowed: if same-turn steering is unavailable, rejected, compacting, idle, or throws, OpenClaw strips /steer and continues with <message> as a normal prompt.
  • Remove overlapping legacy queue mode names from the public config surface while migrating them safely: queue -> steer, steer-backlog / steer+backlog -> followup.
  • Update schema/help/generated config docs, queue docs, slash-command docs, changelog, and targeted queue/steer regression coverage.

Before

  • Active-run queue behavior had overlapping modes: steer, legacy queue, followup, collect, steer-backlog, and interrupt.
  • queue meant serialized steering, while steer meant batched steering; the distinction was implementation-shaped and hard to explain.
  • steer-backlog both steered and preserved the same message for a later followup, which could look like duplicate handling on streaming surfaces.
  • /steer <message> depended on same-turn steering succeeding; some fallback paths could leave the command body in an unsafe/unclear state instead of reliably treating <message> as a normal prompt.
  • The docs and PR text over-framed followup/collect as fallback behavior, which made it unclear whether users could still queue by default.

After

  • Supported queue modes are intentionally small and user-facing:
    • steer: default. Try to inject normal inbound messages into the active run; if the runtime cannot accept steering, wait for the active run to finish and run the prompt later.
    • followup: do not steer; queue each message for a later turn after the active run ends.
    • collect: do not steer; queue compatible messages and run one coalesced later turn after the quiet window.
    • interrupt: abort the active run and start the newest message.
  • /queue steer controls future normal inbound messages. /steer <message> is an explicit one-off command and works independently of the stored /queue mode.
  • /steer <message> never drops the message text: when steering cannot happen, <message> continues as a normal prompt.
  • Existing configs using retired names keep working through doctor/config migration.

Verification

  • pnpm test src/auto-reply/reply/queue/settings.test.ts src/auto-reply/reply.directive.parse.test.ts src/auto-reply/reply/directive-handling.queue-validation.test.ts src/auto-reply/reply/get-reply-run.media-only.test.ts src/auto-reply/reply/agent-runner.media-paths.test.ts src/commands/doctor/shared/legacy-config-migrate.test.ts src/config/config-misc.test.ts src/config/schema.help.quality.test.ts src/config/config.legacy-config-detection.accepts-imessage-dmpolicy.test.ts src/auto-reply/reply/commands-steer.test.ts src/auto-reply/reply/get-reply-inline-actions.skip-when-config-empty.test.ts src/auto-reply/reply/get-reply.before-agent-reply.test.ts
  • pnpm config:schema:check
  • pnpm config:docs:check
  • pnpm format:docs:check
  • git diff --check
  • Testbox pnpm check:changed: run 25785282586 / tbx_01krg496nw9zq7axbjvywtcfsh, passed.

Changed files

  • CHANGELOG.md (modified, +1/-0)
  • docs/.generated/config-baseline.sha256 (modified, +2/-2)
  • docs/concepts/agent-loop.md (modified, +1/-1)
  • docs/concepts/agent.md (modified, +9/-11)
  • docs/concepts/messages.md (modified, +6/-6)
  • docs/concepts/queue-steering.md (modified, +37/-41)
  • docs/concepts/queue.md (modified, +14/-18)
  • docs/gateway/config-agents.md (modified, +3/-3)
  • docs/gateway/configuration-examples.md (modified, +8/-8)
  • docs/help/faq.md (modified, +5/-7)
  • docs/plugins/codex-harness-runtime.md (modified, +6/-5)
  • docs/tools/slash-commands.md (modified, +2/-2)
  • docs/tools/steer.md (modified, +18/-12)
  • extensions/codex/src/app-server/run-attempt.test.ts (modified, +68/-16)
  • extensions/codex/src/app-server/run-attempt.ts (modified, +45/-24)
  • src/agents/announce-idempotency.ts (modified, +0/-13)
  • src/agents/pi-embedded-runner/run-state.ts (modified, +1/-1)
  • src/agents/pi-embedded-runner/runs.test.ts (modified, +25/-2)
  • src/agents/pi-embedded-runner/runs.ts (modified, +92/-19)
  • src/agents/subagent-announce-delivery.runtime.ts (modified, +2/-6)
  • src/agents/subagent-announce-delivery.test.ts (modified, +100/-48)
  • src/agents/subagent-announce-delivery.ts (modified, +33/-131)
  • src/agents/subagent-announce-dispatch.test.ts (modified, +41/-48)
  • src/agents/subagent-announce-dispatch.ts (modified, +18/-24)
  • src/agents/subagent-announce-queue.test.ts (removed, +0/-381)
  • src/agents/subagent-announce-queue.ts (removed, +0/-306)
  • src/agents/subagent-announce.format.e2e.test.ts (modified, +18/-34)
  • src/agents/subagent-announce.test-support.ts (modified, +2/-5)
  • src/agents/subagent-announce.test.ts (modified, +2/-2)
  • src/agents/subagent-registry-lifecycle.test.ts (modified, +2/-2)
  • src/agents/subagent-registry.announce-loop-guard.test.ts (modified, +0/-6)
  • src/agents/subagent-registry.test-helpers.ts (modified, +0/-2)
  • src/agents/subagent-registry.test.ts (modified, +0/-5)
  • src/agents/subagent-registry.ts (modified, +0/-2)
  • src/auto-reply/commands-registry.shared.ts (modified, +1/-1)
  • src/auto-reply/reply.directive.parse.test.ts (modified, +6/-7)
  • src/auto-reply/reply/agent-runner.media-paths.test.ts (modified, +48/-18)
  • src/auto-reply/reply/agent-runner.runreplyagent.e2e.test.ts (modified, +32/-2)
  • src/auto-reply/reply/agent-runner.ts (modified, +14/-15)
  • src/auto-reply/reply/commands-steer.runtime.ts (modified, +2/-1)
  • src/auto-reply/reply/commands-steer.test.ts (modified, +44/-21)
  • src/auto-reply/reply/commands-steer.ts (modified, +60/-23)
  • src/auto-reply/reply/directive-handling.queue-validation.test.ts (modified, +10/-1)
  • src/auto-reply/reply/directive-handling.queue-validation.ts (modified, +2/-2)
  • src/auto-reply/reply/followup-runner.test.ts (modified, +1/-1)
  • src/auto-reply/reply/get-reply-inline-actions.skip-when-config-empty.test.ts (modified, +2/-0)
  • src/auto-reply/reply/get-reply-inline-actions.ts (modified, +13/-0)
  • src/auto-reply/reply/get-reply-run.media-only.test.ts (modified, +95/-3)
  • src/auto-reply/reply/get-reply-run.ts (modified, +6/-6)
  • src/auto-reply/reply/get-reply.before-agent-reply.test.ts (modified, +1/-0)
  • src/auto-reply/reply/get-reply.ts (modified, +1/-0)
  • src/auto-reply/reply/queue-policy.test.ts (modified, +2/-15)
  • src/auto-reply/reply/queue-policy.ts (modified, +1/-1)
  • src/auto-reply/reply/queue.ts (modified, +0/-5)
  • src/auto-reply/reply/queue/directive.ts (modified, +4/-0)
  • src/auto-reply/reply/queue/normalize.ts (modified, +13/-4)
  • src/auto-reply/reply/queue/settings.test.ts (modified, +57/-11)
  • src/auto-reply/reply/queue/settings.ts (modified, +6/-2)
  • src/auto-reply/reply/queue/state.test.ts (modified, +2/-2)
  • src/auto-reply/reply/queue/steering.ts (removed, +0/-11)
  • src/auto-reply/reply/queue/types.ts (modified, +1/-1)
  • src/commands/doctor/shared/deprecation-compat.test.ts (modified, +1/-0)
  • src/commands/doctor/shared/deprecation-compat.ts (modified, +10/-0)
  • src/commands/doctor/shared/legacy-config-migrate.test.ts (modified, +32/-0)
  • src/commands/doctor/shared/legacy-config-migrations.queue.ts (added, +84/-0)
  • src/commands/doctor/shared/legacy-config-migrations.ts (modified, +2/-0)
  • src/config/config-misc.test.ts (modified, +20/-0)
  • src/config/config.legacy-config-detection.accepts-imessage-dmpolicy.test.ts (modified, +17/-0)
  • src/config/schema.help.quality.test.ts (modified, +2/-10)
  • src/config/schema.help.ts (modified, +4/-4)
  • src/config/schema.labels.ts (modified, +2/-2)
  • src/config/sessions/types.ts (modified, +1/-8)
  • src/config/types.queue.ts (modified, +1/-8)
  • src/config/zod-schema.core.ts (modified, +0/-3)
  • src/plugin-sdk/agent-harness-runtime.ts (modified, +4/-2)
RAW_BUFFERClick to expand / collapse

Summary

The public command queue docs appear stale or internally inconsistent with current OpenClaw behavior.

The current source and current steering docs say OpenClaw defaults busy inbound messages to active-run steering, with fallback to a later prompt if steering is unavailable. The hosted docs.openclaw.ai/concepts/queue page still describes older queue semantics, including collect as the default and retired queue mode names.

This creates a real user-facing confusion: people comparing OpenClaw with other agents conclude that OpenClaw "only queues messages" and does not support real active-run steering, even though current source and recent PRs show that it does.

Evidence

Hosted docs page that looks stale:

  • https://docs.openclaw.ai/concepts/queue
  • It says "Command Queue (2026-01-16)".
  • It says queue modes include steer, followup, collect, steer-backlog, interrupt, and legacy queue.
  • It says queue is a legacy alias for steer.
  • It says defaults are "All surfaces -> collect".
  • It says steer cancels pending tool calls after the next tool boundary.

Current repo docs and source say something different:

  • docs/concepts/queue-steering.md says normal prompts arriving during a streaming run default to steer and no config entry is required.
  • docs/concepts/queue-steering.md says Pi drains steering messages at model boundaries after the current assistant tool-call batch, and the native Codex app-server harness sends one batched turn/steer.
  • src/auto-reply/reply/queue/settings.ts returns "steer" from defaultQueueModeForChannel().
  • src/commands/doctor/shared/legacy-config-migrations.queue.ts treats queue, steer-backlog, and steer+backlog as retired modes.
  • PR #76934 added current-session /steer <message> / /tell <message> and was merged May 3, 2026:
  • PR #77023 made mid-turn prompts steer by default and was merged May 13, 2026:

I checked against current local source at:

  • 71ed6526b1296edc68a41ddc7e48855dfee798e9
  • 2026-05-18 ci: reduce aggregate runner jobs

The latest release page I checked was:

Why this matters

The current public docs make OpenClaw look like it only has a deferred queue, or that collect is still the default. That is the opposite of the current steering story.

This matters for:

  • users deciding whether OpenClaw supports "steer the current run" behavior
  • comparisons with Hermes Agent, Codex app, and other busy-run steering UIs
  • operators choosing between /queue steer, /queue followup, /queue collect, and /queue interrupt
  • expectations around whether a running tool call is interrupted, skipped, or allowed to finish before the next LLM call

Suggested fix

Update or redeploy the hosted queue docs so they match current source and current behavior.

At minimum, the public queue page should say:

  • Default mode is steer, unless overridden by session/channel/global config.
  • Supported user-facing queue modes are steer, followup, collect, and interrupt.
  • queue, steer-backlog, and steer+backlog are retired/legacy migration names, not normal current configuration guidance.
  • steer means "inject into the active runtime at the next supported boundary"; it does not interrupt an already-running tool call.
  • Pi and native Codex have different delivery details:
    • Pi drains queued steering messages before the next LLM call.
    • Codex app-server receives one batched turn/steer.
  • If the runtime cannot accept steering, OpenClaw waits for the active run to finish and then starts the prompt.

It would also help to add a version/last-updated note to the hosted docs page, because this area has changed quickly.

Acceptance criteria

  • docs.openclaw.ai/concepts/queue no longer says the default for all surfaces is collect.
  • docs.openclaw.ai/concepts/queue no longer recommends current use of retired modes like queue or steer-backlog.
  • docs.openclaw.ai/concepts/queue, docs.openclaw.ai/concepts/queue-steering, docs.openclaw.ai/tools/steer, and docs.openclaw.ai/plugins/codex-harness-runtime describe the same steering/fallback semantics.
  • The docs clearly distinguish active-run steering from deferred follow-up queueing.
  • The docs clearly state that steering is boundary-based and does not interrupt an in-flight tool call.

Labels

Suggested labels:

  • docs
  • gateway
  • agents
  • extensions: codex

Vote matrix · Quick signals

Works
Did the solution work? Tap to confirm.
Easy Fix
Was it a quick fix?
Time Saver
Did it save you time?
Blocking
Was it severely blocking?
Common Issue
Are others likely hitting this too?
Flaky / Intermittent
Is it intermittent?
Verified / Reproducible
Can you reproduce it reliably?
Loading…

Still need to ship something?

×6

Another batch ranked right after the header list — different links, same matching logic.

Back to top recommendations

TRENDING

openclaw - ✅(Solved) Fix Docs site command queue page conflicts with current active-run steering behavior [2 pull requests, 3 comments, 2 participants]