Skip to content

Codex message-tool-only turns can stop after progress/status message sends #100153

Description

@ooiuuii

Summary

Codex message_tool_only source-channel turns can stop after sending a progress/status line through message(action=send), before the model performs the tool work it just promised to do.

Real environment observed

  • Windows OpenClaw gateway/source-channel deployment
  • Telegram source conversation
  • Codex app-server runtime
  • Source reply mode: message_tool_only
  • Date observed: 2026-07-05

User-visible symptom

In a source-channel turn, the assistant replied with a short status message equivalent to "I'll check the PR titles/labels first", but then performed no GitHub/web/tool lookup and never sent the requested answer. From the user's perspective this looks like the agent only says it will do the work, then stops.

Source-level repro on current main

The current message_tool_only developer instruction says:

Use `message(action=send)` for user-visible source-channel output.

That does not tell Codex that a current-channel message(action=send) is terminal/final-delivery in this mode.

The observed turn then called:

{"action":"send","message":"I'll check the PR titles/labels first..."}

The message tool returned a successful receipt:

{"ok":true,"messageId":"<redacted>"}

Immediately after that, the app-server log recorded:

codex app-server turn released after terminal dynamic tool result
tool=message

The persisted session contained the user message, the assistant progress text, the message tool call/result, and then no web_search, web_fetch, bash, GitHub, or other tool calls afterward.

Expected behavior

In message_tool_only source-channel turns, Codex should complete any required tool work first and only use message(action=send) when it is ready to finish the turn with the final user-visible source-channel reply.

Actual behavior

Codex can interpret message(action=send) as an acceptable progress/status update. Because the delivered message is terminal in this delivery mode, OpenClaw releases the turn immediately and the promised follow-up work never runs.

Scope / non-goals

  • This is not asking to make delivered message_tool_only replies non-terminal. That behavior is important for real final replies.
  • This is not a channel-specific Telegram workaround.
  • This is not a change to message delivery receipts, route matching, or tool execution.

Proposed fix

Tighten the Codex app-server developer instruction for message_tool_only runs so it states that required tool work must happen before a visible source reply, and that message(action=send) should only be used for final user-visible output, not progress/status updates that need more work afterward.

Metadata

Metadata

Assignees

No one assigned

    Labels

    P1High-priority user-facing bug, regression, or broken workflow.clawsweeper:linked-pr-openClawSweeper found an open linked pull request for this issue.clawsweeper:no-new-fix-prClawSweeper does not recommend queueing a new automated fix PR for this issue.clawsweeper:source-reproClawSweeper found a high-confidence source-level issue reproduction.impact:message-lossChannel message delivery can be lost, duplicated, or misrouted.issue-rating: 🦞 diamond lobsterVery strong issue quality with high-confidence source-level or clear reproduction.

    Type

    No type

    Fields

    Priority

    None yet

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions