Skip to content

[Feature]: Narrated agent status updates + activity receipt on the final answer #103461

Description

@steipete

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):

  1. 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.
  2. 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.
  3. 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.

Metadata

Metadata

Assignees

No one assigned

    Labels

    enhancementNew feature or requestmaintainerMaintainer-authored PR

    Type

    No type

    Fields

    Priority

    None yet

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions