Skip to content

message_tool_only: one-shot delivery reminder loses to recency over long tool chains, turns end in withheld finals #100367

Description

@gorkem2020

Summary

On lanes configured with message_tool_only, the "deliver via the message tool" contract is injected once, at the start of the turn, and is not re-affirmed as the turn grows. On long multi-tool turns the reminder loses to recency: the model delivers its early rounds correctly, then goes many tool calls deep, and finishes with a plain assistant final. OpenClaw then (correctly, per the contract) withholds that final, so the user simply never receives the answer the model produced.

Observed behavior (production multi-agent install, Slack channel lane, 2026-07-04)

  • Turn starts, the delivery reminder is present in the injected context.
  • The agent delivers rounds 1 and 2 of a multi-part task via message(action=send) correctly.
  • The agent then performs a long tool chain (file generation, several writes and reads).
  • The agent ends the turn with a 1,345-character plain-text final instead of a message-tool send. The runtime withholds it. From the user's perspective the work silently stops.
  • Verified from the provider payloads: the reminder appears only once, buried far above the recent tool results by the time the final is produced.

A second, smaller observation from the same payloads: the reminder text is not stable in size. Across successive occurrences we measured it growing 2378, then 2667, then 2928 characters, which compounds the context cost of what should be a fixed contract statement.

Why this matters

  • Model-agnostic: this reproduces with different models on the same lane; it is a recency problem, not a model quirk.
  • The failure is silent for the user (the final is withheld by design), so operators only notice through complaints or by reading traces.

Suggested fix directions

  1. Re-affirm the delivery contract during the turn, not only at the start. For example, append a one-line reminder to tool results past round N, or every M tool rounds, on message_tool_only lanes.
  2. Add a post-withhold recovery nudge: when a final is withheld on a message_tool_only lane, queue a system event for the same turn ("your final text was withheld, deliver it via the message tool") so the model can immediately correct itself instead of the content being lost.
  3. Stabilize the reminder text so it does not grow per occurrence.

Options 1 and 2 are complementary; option 2 alone would already convert silent loss into self-recovery.

Related

Metadata

Metadata

Assignees

No one assigned

    Labels

    P1High-priority user-facing bug, regression, or broken workflow.clawsweeper:needs-live-reproClawSweeper needs live local, crabbox, or manual validation to confirm this issue.clawsweeper:needs-maintainer-reviewClawSweeper marked this issue as needing maintainer review before automation.clawsweeper:needs-product-decisionClawSweeper marked this issue as needing a product or behavior decision.clawsweeper:no-new-fix-prClawSweeper does not recommend queueing a new automated fix PR for this issue.impact:message-lossChannel message delivery can be lost, duplicated, or misrouted.issue-rating: 🐚 platinum hermitGood issue quality with a plausible reproduction path needing some confirmation.maturity:stableIssue affects a taxonomy feature currently scored M4/M5.

    Type

    No type

    Fields

    Priority

    None yet

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions