Summary
Replace raw tool-line progress drafts with short utility-model narration of what the agent is doing, and on Discord append the activity receipt to the final answer while deleting the working draft after delivery.
Problem to solve
While an agent works, progress-mode channels show an accumulating tool log:
🛠️ exec command
🧩 Wait
🛠️ command run node script ~/.openclaw/workspace/skills/...
🧩 Wait
🔌 Gateway: failed
Evidence from the OpenClaw maintainer Discord archive (~1,470 archived agent status messages):
- Low signal. Repeated
🧩 Wait rows, mid-word ellipsis truncation, and aggregates like run -d → run export do not tell the reader what the agent is actually doing. Users want the task described, not the tool calls.
- Permanent sediment, disconnected from the answer. The draft collapses to a
-# 🛠️ 5 tool calls · ⏱️ 12s line that stays in the channel forever. Zero of the archived status messages were ever deleted; in active channels humans reply within seconds, burying the status block far above the eventual answer.
- Edit churn. Every tool event forces another throttled edit of the draft ("(edited)" flicker).
Proposed solution
Narrated status card (core, channel-generic seam). When the agent has an explicit utilityModel configured, replace the rolling tool lines with 1–2 plain present-tense sentences describing the work, generated by that cheaper model and refreshed on a bounded trigger policy (first work event, then every 4 events or 12s, failures immediately). The playful label ("Clawing…") stays on top. Tool lines keep accumulating underneath and return if narration stops. The draft is edited only when the narration text changes, which also removes most edit churn. Narration input is bounded and redacted: request text plus the same compact redacted tool summaries the draft renders — never raw output.
Receipt on the answer, delete the draft (Discord). The final answer must already be a fresh message (Discord only advances unread state on MESSAGE_CREATE). Append the activity receipt to it — -# 🧠 2 thoughts · 🛠️ 5 tool calls · ⏱️ 12s (task facts only, no model name) — and delete the working draft once the answer lands. Quiet channels lose nothing; busy channels keep no orphaned tool log. Error finals keep the draft as the record of the failed turn.
New config: channels.<ch>.streaming.progress.narration (boolean, default true); only activates with an explicit utilityModel (agent or agents.defaults), never falls back to the primary model.
Alternatives considered
- Commentary lane (
progress.commentary) already interleaves the model's own preambles for free, but it is model-authored mid-run text, verbose, and off by default; it does not summarize accumulated work or failures.
- Editing the status draft into the final answer: not viable on Discord because finals need MESSAGE_CREATE for notifications/unread.
- Telegram keeps its edit-in-place collapse bar: deleting the window message scroll-jumps Telegram clients (documented invariant in
extensions/telegram), so delete-on-done stays Discord-scoped; the narration seam is core (GetReplyOptions.onNarrationUpdate + progress-draft compositor) so Telegram/Mattermost can adopt it with a few lines of wiring as follow-up.
Impact
All progress-mode channels benefit from the core narration seam (Discord wired first; it defaults to progress mode). Busy maintainer channels stop accumulating orphaned tool logs, and answers carry their own provenance receipt.
Evidence/examples
July 4–5 sessions in the maintainer guild: humans replied within 77ms–seconds of a status draft appearing, burying it; final answers landed minutes later with no visible link. Sessions with five consecutive 🧩 Wait lines carried zero information. 1,461 of 1,469 archived status messages were never edited into anything useful and none were deleted.
Additional information
Implementation in progress on branch claude/agent-status-redesign-e8bcd1.
Summary
Replace raw tool-line progress drafts with short utility-model narration of what the agent is doing, and on Discord append the activity receipt to the final answer while deleting the working draft after delivery.
Problem to solve
While an agent works, progress-mode channels show an accumulating tool log:
Evidence from the OpenClaw maintainer Discord archive (~1,470 archived agent status messages):
🧩 Waitrows, mid-word ellipsis truncation, and aggregates likerun -d → run exportdo not tell the reader what the agent is actually doing. Users want the task described, not the tool calls.-# 🛠️ 5 tool calls · ⏱️ 12sline that stays in the channel forever. Zero of the archived status messages were ever deleted; in active channels humans reply within seconds, burying the status block far above the eventual answer.Proposed solution
Narrated status card (core, channel-generic seam). When the agent has an explicit
utilityModelconfigured, replace the rolling tool lines with 1–2 plain present-tense sentences describing the work, generated by that cheaper model and refreshed on a bounded trigger policy (first work event, then every 4 events or 12s, failures immediately). The playful label ("Clawing…") stays on top. Tool lines keep accumulating underneath and return if narration stops. The draft is edited only when the narration text changes, which also removes most edit churn. Narration input is bounded and redacted: request text plus the same compact redacted tool summaries the draft renders — never raw output.Receipt on the answer, delete the draft (Discord). The final answer must already be a fresh message (Discord only advances unread state on MESSAGE_CREATE). Append the activity receipt to it —
-# 🧠 2 thoughts · 🛠️ 5 tool calls · ⏱️ 12s(task facts only, no model name) — and delete the working draft once the answer lands. Quiet channels lose nothing; busy channels keep no orphaned tool log. Error finals keep the draft as the record of the failed turn.New config:
channels.<ch>.streaming.progress.narration(boolean, defaulttrue); only activates with an explicitutilityModel(agent oragents.defaults), never falls back to the primary model.Alternatives considered
progress.commentary) already interleaves the model's own preambles for free, but it is model-authored mid-run text, verbose, and off by default; it does not summarize accumulated work or failures.extensions/telegram), so delete-on-done stays Discord-scoped; the narration seam is core (GetReplyOptions.onNarrationUpdate+ progress-draft compositor) so Telegram/Mattermost can adopt it with a few lines of wiring as follow-up.Impact
All progress-mode channels benefit from the core narration seam (Discord wired first; it defaults to progress mode). Busy maintainer channels stop accumulating orphaned tool logs, and answers carry their own provenance receipt.
Evidence/examples
July 4–5 sessions in the maintainer guild: humans replied within 77ms–seconds of a status draft appearing, burying it; final answers landed minutes later with no visible link. Sessions with five consecutive
🧩 Waitlines carried zero information. 1,461 of 1,469 archived status messages were never edited into anything useful and none were deleted.Additional information
Implementation in progress on branch
claude/agent-status-redesign-e8bcd1.