Skip to content

fix(discord): stop typing keepalive on message_tool_only delivery (#84276)#84300

Open
Rohang2005 wants to merge 4 commits into
openclaw:mainfrom
Rohang2005:fix/discord-typing-84276
Open

fix(discord): stop typing keepalive on message_tool_only delivery (#84276)#84300
Rohang2005 wants to merge 4 commits into
openclaw:mainfrom
Rohang2005:fix/discord-typing-84276

Conversation

@Rohang2005

@Rohang2005 Rohang2005 commented May 19, 2026

Copy link
Copy Markdown
Contributor

Summary

  • Problem: in message_tool_only source-reply mode the Discord typing bubble keeps showing for ~10s after the reply has already landed in the channel.
  • Solution: add an explicit "source reply delivered" signal so the typing keepalive is sealed the moment the message tool's send resolves, instead of waiting for the dispatcher's idle grace window. The signal only fires for sends that actually target the source conversation.
  • What changed: new TypingController.markSourceReplyDelivered(); message(action=send) fires an optional onSourceReplyDelivered callback when sourceReplyDeliveryMode === "message_tool_only", the send is a real (non-dry-run) success, and the resolved channel + target match the source conversation (or it's the webchat internal-source sink). The callback is threaded through both runtime paths: the default Pi runtime (createOpenClawToolspi-toolsrunEmbeddedPiAgent) and the Codex app-server dynamic message tool (extensions/codex/src/app-server/run-attempt.ts → buildDynamicTools). Wired in agent-runner.ts / followup-runner.ts to call typing.markSourceReplyDelivered().
  • What did NOT change: the heartbeat typing pipeline is untouched, DISPATCH_IDLE_GRACE_MS is left at 10s (shortening it makes the bug worse — see the linked issue), and the automatic source-reply path is unaffected. A message.send to a different channel/recipient inside the same turn is left alone — only the source-conversation send seals the source typing.

Motivation

Users perceive the bot as "still typing" for ~10s after a reply has already arrived in DM. It's small but it makes the agent feel laggy or stuck. Issue #84276 traces it to the keepalive loop racing with the dispatcher's finally block; this PR addresses it on the path the issue calls out (Option 2 / Option 3 in the write-up).

Change Type (select all)

  • Bug fix
  • Feature
  • Refactor required for the fix
  • Docs
  • Security hardening
  • Chore/infra

Scope (select all touched areas)

  • Gateway / orchestration
  • Skills / tool execution
  • Auth / tokens
  • Memory / storage
  • Integrations
  • API / contracts
  • UI / DX
  • CI/CD / infra

Linked Issue/PR

Real behavior proof (required for external PRs)

  • Behavior or issue addressed: Discord typing indicator no longer lingers after a message_tool_only reply lands, and only the source conversation's typing is sealed when the message tool delivers.
  • Real environment tested: I don't have a live Discord workspace from this machine. To exercise the fix end to end without a live channel, I ran the runtime semantics + the new source-conversation guard directly under node. Terminal capture below shows the actual stdout from node verify-typing-fix.mjs after the patch.
  • Exact steps or command run after this patch:
    node verify-typing-fix.mjs
    
    (The script inlines the post-patch TypingController lifecycle and the new sendTargetIsSourceConversation guard from src/agents/tools/message-tool.ts, then drives 8 scenarios against them.)
  • Evidence after fix (terminal capture, real stdout):
Verifying TypingController.markSourceReplyDelivered + source-conversation guard (issue #84276)

[1/8] keepalive stops on markSourceReplyDelivered  (replyStart=2, cleanup=1)
[2/8] idempotent across repeat calls           (cleanup=1)
[3/8] late markRunComplete/markDispatchIdle/cleanup are no-ops once sealed
[4/8] dispatch-idle grace timer is cleared when delivery wins the race
[5/8] no-op when typing was never started     (reply=0, cleanup=0)
[6/8] source-conversation send matches even with channel-target prefix
[7/8] sends to other channels or recipients do not seal the source typing
[8/8] webchat internal-source sink always counts as a source-conversation send

All 8 scenarios pass. Discord typing keepalive halts in lockstep with delivery, and only for the source conversation.
  • Observed result after fix: keepalive halts the moment message(action=send) reports a successful non-dry-run send to the source conversation. Subsequent markRunComplete / markDispatchIdle from the dispatcher's finally block are no-ops, so no further sendTyping packets refresh Discord's TTL after the reply has landed. Cross-channel and cross-recipient sends in the same turn do not affect the source-channel typing.
  • What was not tested: a live Discord DM run with a real bot token. I do not have a spare bot/token wired up here. If a maintainer or @openclaw-mantis can capture the visible bubble disappearance for the redacted live recording the reviewer suggested, that closes the loop.
  • Before evidence: the lingering ~10s typing bubble is documented in the original issue write-up (logs + repro steps in Discord typing indicator lingers ~10s after reply delivery in message_tool_only source-reply path #84276).

Root Cause

  • Root cause: createTypingController only calls cleanup() once both runComplete and dispatchIdle are true. In message_tool_only mode those signals are both fired together from the dispatcher's finally block, after the message tool has already returned. The 6s keepalive can issue one more sendTyping while the tool is in flight, and Discord's ~10s typing TTL keeps the bubble alive long after we think we cleaned up.
  • Missing detection / guardrail: there was no signal between the message tool delivering a visible reply and the typing controller. The controller had no concept of "the visible reply is on screen, stop refreshing the TTL".
  • Contributing context: shortening DISPATCH_IDLE_GRACE_MS makes things worse — it seals the controller before the legitimate markDispatchIdle arrives, but Discord's TTL is independent of our cleanup so the bubble still hangs.

Regression Test Plan

  • Coverage level that should have caught this:
    • Unit test
    • Seam / integration test
    • End-to-end test
    • Existing coverage already sufficient
  • Target test or file: src/auto-reply/reply/typing-persistence.test.ts, src/agents/tools/message-tool.test.ts.
  • Scenario the test should lock in: when the message tool successfully delivers a visible reply under sourceReplyDeliveryMode === "message_tool_only" to the source conversation, the keepalive stops immediately, onCleanup fires once, and any late markRunComplete / markDispatchIdle from the dispatcher's finally block are no-ops. A message.send to a different channel/recipient inside the same turn must not seal the source typing.
  • Why this is the smallest reliable guardrail: the bug class lives in the typing controller's lifecycle gate plus the hand-off from the message tool. Both sides are now covered with unit tests (5 new lifecycle tests + 9 new message-tool tests covering source/cross/internal-source/dry-run/automatic/non-send/throwing-callback paths) and don't require a live channel to exercise.
  • Existing test that already covers this: nothing. There were tests for markRunComplete / markDispatchIdle separately, but nothing for the message_tool_only delivery path.
  • If no new test is added: N/A, new tests are added.

User-visible / Behavior Changes

Discord (and any other channel using message_tool_only) clears the typing indicator in lockstep with delivery instead of holding it for the channel-side TTL. No config flag. The path that was broken now matches what users already expect from the automatic path. Side messages to other conversations within the same turn are not affected.

Diagram

Before:
[message tool send] -> [reply delivered]
            keepalive tick at 6s -> sendTyping (refreshes ~10s TTL)
[run finally] -> markRunComplete + markDispatchIdle
            controller cleans up, but Discord still shows typing
            until its TTL expires (~10s after the reply landed)

After:
[message tool send to source convo] -> [reply delivered]
            -> onSourceReplyDelivered()  (guarded: source channel + target match)
            -> typing.markSourceReplyDelivered()
            -> keepalive loop stops, onCleanup fires, controller sealed
            (no further sendTyping refreshes the TTL)

[message tool send to a different conversation in the same turn]
            -> guard returns false, source typing is left alone

Security Impact (required)

  • New permissions/capabilities? No
  • Secrets/tokens handling changed? No
  • New/changed network calls? No — if anything we make slightly fewer outbound sendTyping calls per turn.
  • Command/tool execution surface changed? No
  • Data access scope changed? No
  • If any Yes, explain risk + mitigation: N/A

Repro + Verification

Environment

  • Integration/channel: Discord DM, chat_type=direct, sourceReplyDeliveryMode === "message_tool_only".
  • Relevant config (redacted):
agents:
  defaults:
    typingMode: instant
messages:
  visibleReplies: message_tool

Steps

  1. Send any prompt to the agent in a Discord DM with message_tool_only configured.
  2. Watch the typing indicator after the reply text appears.
  3. Before this patch: typing bubble persists for ~10s. After: bubble disappears in lockstep with delivery.

Expected

  • Typing bubble clears as soon as the reply message lands in the channel.

Actual

  • With this patch applied, the keepalive loop is stopped via markSourceReplyDelivered() the moment the message tool reports a successful non-dry-run send to the source conversation, so no further sendTyping packets refresh the TTL.

Human Verification (required)

  • Verified scenarios:
    • markSourceReplyDelivered() stops the keepalive immediately and fires onCleanup once.
    • Idempotent across repeat calls.
    • Late markRunComplete / markDispatchIdle / cleanup calls are no-ops once sealed.
    • The 10s dispatch-idle grace timer is cleared if delivery wins the race against markRunComplete.
    • Calling it before typing has started is a clean no-op.
    • Message-tool callback fires only when action === "send", sourceReplyDeliveryMode === "message_tool_only", the result is a send, and dryRun !== true. It does not fire for dry runs, automatic, or non-send actions.
    • Source-conversation guard: callback fires for default-routed sends, prefix-normalized matches (user:123 vs 123), and webchat handledBy === "internal-source" sends. It does not fire for cross-channel sends or same-channel sends to a different recipient.
    • A throwing onSourceReplyDelivered callback does not fail the tool call.
  • Edge cases checked: repeat delivery (idempotent), late tool/block callbacks after delivery (controller sealed so they can't restart typing), heartbeat path (uses a separate typing pipeline so it stays unchanged), cross-conversation message.send inside the same turn (source typing untouched).
  • What I did not verify: a live Discord bot run end to end. I don't have a spare bot/token on this machine.

Review Conversations

  • I replied to or resolved every bot review conversation I addressed in this PR.
  • I left unresolved only the conversations that still need reviewer or maintainer judgment.

Compatibility / Migration

  • Backward compatible? Yes. The new onSourceReplyDelivered option and markSourceReplyDelivered method are both optional. Callers that don't pass the callback get exactly the previous behavior.
  • Config/env changes? No.
  • Migration needed? No.
  • If yes, exact upgrade steps: N/A.

Risks and Mitigations

  • Risk: the message tool's onSourceReplyDelivered callback throws and we swallow the error.
    • Mitigation: the swallow is intentional and narrowly scoped to the callback invocation. Typing cleanup is best-effort and should never fail a successful send. The rest of the tool result path is untouched.
  • Risk: a heuristically-routed send is misclassified as cross-conversation and we miss the chance to seal typing.
    • Mitigation: the source-conversation guard normalizes the channel-target prefix on both sides before comparing, and the webchat handledBy === "internal-source" sink short-circuits to "always source". The fall-through behavior is the same as the original bug (typing lingers for the channel TTL), so a misclassification can only ever degrade to the pre-patch state — it cannot kill typing for a wrong conversation.
  • Risk: an agent that calls message(action=send) to the source conversation more than once in a single turn won't get a typing indicator for the 2nd/3rd call.
    • Mitigation: in message_tool_only mode disableBlockStreaming is already true, so block streaming wasn't driving typing for those follow-up sends anyway. The trade-off (no typing for follow-up sends to the same conversation inside one turn) is the explicit design in Option 2 of the linked issue write-up, and is preferable to a typing bubble that lingers after the user has already seen the first reply.

@openclaw-barnacle openclaw-barnacle Bot added channel: whatsapp-web Channel integration: whatsapp-web agents Agent runtime and tooling size: M triage: needs-real-behavior-proof Candidate: external PR needs after-fix proof from a real setup. labels May 19, 2026
@clawsweeper

clawsweeper Bot commented May 19, 2026

Copy link
Copy Markdown
Contributor

Codex review: needs real behavior proof before merge. Reviewed June 30, 2026, 4:23 PM ET / 20:23 UTC.

Summary
The PR adds a source-reply-delivered typing signal from successful message-tool sends into the shared typing controller, plus Pi/Codex plumbing, tests, and a changelog entry.

PR surface: Source +145, Tests +311, Docs +1. Total +457 across 19 files.

Reproducibility: yes. at source level: current main still lacks a source-delivery terminal hook and still honors explicit instant typing config for Discord message_tool_only runs. I did not run a live Discord client reproduction.

Review metrics: 1 noteworthy metric.

  • Typing Lifecycle Seams: 1 controller method, 1 tool callback, 2 runtime-builder paths added. The diff changes shared typing lifecycle signaling across tool execution and runtime construction, which requires owner-boundary review beyond unit tests.

Stored data model
Persistent data-model change detected: persistent cache schema: CHANGELOG.md. Confirm migration or upgrade compatibility proof before merge.

Merge readiness
Overall: 🧂 unranked krab
Proof: 🦪 silver shellfish
Patch quality: 🧂 unranked krab
Result: blocked until stronger real behavior proof is added.

Overall follows the weaker of proof and patch quality, so missing proof can cap an otherwise strong patch.

Rank-up moves:

  • [P1] Add redacted live Discord proof or runtime logs showing a message_tool_only reply and post-delivery typing behavior after the fix.
  • Refresh the branch around current main and current runtime-builder paths before another merge review.

Proof guidance:

  • [P1] Needs stronger real behavior proof before merge: The PR body provides terminal output from an inline semantic script but explicitly says no live Discord bot run was tested, so visible transport proof is not sufficient for this Discord UX change. After adding proof, update the PR body; ClawSweeper should re-review automatically. If it does not, the PR author or someone with repository write access can comment @clawsweeper re-review.

Mantis proof suggestion
A short real Discord visual or diagnostic proof would materially verify the user-visible typing indicator behavior that unit tests cannot show. A maintainer can ask Mantis to capture proof by posting this exact PR comment:

@openclaw-mantis visual task: record a Discord message_tool_only reply and verify the typing indicator clears after the visible reply lands, with private IDs redacted.

Risk before merge

  • [P1] Current main only partially overlaps the PR’s intended fix; explicit typing configuration may still need a source-delivery terminal signal or a maintainer-approved alternate policy.
  • [P1] The branch is currently conflicting/dirty and the submitted diff touches older runtime-builder paths, so the live PR cannot be reviewed as merge-ready until refreshed.
  • [P1] The PR changes shared message_tool_only typing semantics, so same-turn follow-up sends and non-Discord channels need owner-boundary approval before merge.

Maintainer options:

  1. Refresh The Shared Signal Approach
    Rebase this PR, wire the callback through the active embedded runner and Codex dynamic tool builder, drop the changelog edit, and prove live Discord behavior.
  2. Prefer Discord-Scoped Policy
    If maintainers decide Discord should own the behavior, close or pause this shared lifecycle branch after confirming the Discord-scoped path covers explicit typing config.
  3. Pause Until Ownership Is Settled
    Because the branch changes a shared message_tool_only lifecycle signal, it can stay open but should not merge until the owner boundary is explicit.

Next step before merge

  • [P1] The remaining decision is maintainer selection of the typing lifecycle owner plus branch refresh and live proof, not a narrow automated repair.

Security
Cleared: No concrete security or supply-chain issue is visible in the diff; it changes typing lifecycle code/tests and one changelog line without dependencies, workflows, permissions, or secrets.

Review findings

  • [P1] Move the callback onto the active embedded runner — src/agents/pi-embedded-runner/run/attempt.ts:1433
  • [P1] Wire Codex tools in the current dynamic builder — extensions/codex/src/app-server/run-attempt.ts:3310
  • [P3] Drop the release-owned changelog edit — CHANGELOG.md:14
Review details

Best possible solution:

Choose one canonical lifecycle owner for configured message_tool_only Discord typing, refresh that implementation against current embedded/Codex runtime paths, drop the changelog edit, and verify with redacted live transport proof.

Do we have a high-confidence way to reproduce the issue?

Yes at source level: current main still lacks a source-delivery terminal hook and still honors explicit instant typing config for Discord message_tool_only runs. I did not run a live Discord client reproduction.

Is this the best way to solve the issue?

No as submitted: the shared lifecycle idea is plausible, but the branch is stale/conflicting and must be refreshed against current runtime paths and maintainer owner-boundary choice.

Full review comments:

  • [P1] Move the callback onto the active embedded runner — src/agents/pi-embedded-runner/run/attempt.ts:1433
    This patch wires onSourceReplyDelivered through the old Pi embedded runner path, but current main builds normal embedded tools in src/agents/embedded-agent-runner/run/attempt.ts. After conflict resolution, the active runtime would still miss the callback and typing would keep refreshing after tool delivery.
    Confidence: 0.91
  • [P1] Wire Codex tools in the current dynamic builder — extensions/codex/src/app-server/run-attempt.ts:3310
    The Codex app-server dynamic tool builder now lives in extensions/codex/src/app-server/dynamic-tool-build.ts. Adding the callback in run-attempt.ts leaves current Codex app-server runs without the source-reply-delivered signal after the branch is refreshed.
    Confidence: 0.89
  • [P3] Drop the release-owned changelog edit — CHANGELOG.md:14
    CHANGELOG.md is release-owned in this repository, so normal PRs should keep release-note context in the PR body or commit message instead of editing the changelog directly.
    Confidence: 0.94

Overall correctness: patch is incorrect
Overall confidence: 0.84

AGENTS.md: found and applied where relevant.

Codex review notes: model internal, reasoning high; reviewed against 640258d7b31d.

Label changes

Label justifications:

  • P2: The PR targets a user-visible Discord typing feedback bug with limited channel-specific blast radius.
  • merge-risk: 🚨 compatibility: The diff changes shared message_tool_only typing lifecycle behavior that can affect channel/plugin expectations beyond Discord.
  • rating: 🧂 unranked krab: Overall readiness is 🧂 unranked krab; proof is 🦪 silver shellfish and patch quality is 🧂 unranked krab.
  • status: 📣 needs proof: The PR needs real behavior proof before ClawSweeper can clear the contributor ask. Needs stronger real behavior proof before merge: The PR body provides terminal output from an inline semantic script but explicitly says no live Discord bot run was tested, so visible transport proof is not sufficient for this Discord UX change. After adding proof, update the PR body; ClawSweeper should re-review automatically. If it does not, the PR author or someone with repository write access can comment @clawsweeper re-review.
Evidence reviewed

PR surface:

Source +145, Tests +311, Docs +1. Total +457 across 19 files.

View PR surface stats
Area Files Added Removed Net
Source 12 145 0 +145
Tests 6 311 0 +311
Docs 1 1 0 +1
Config 0 0 0 0
Generated 0 0 0 0
Other 0 0 0 0
Total 19 457 0 +457

Acceptance criteria:

  • [P1] Redacted live Discord DM or guild run showing message_tool_only visible reply and post-delivery typing behavior.
  • [P1] Focused tests for src/auto-reply/reply/typing-persistence.test.ts, src/agents/tools/message-tool.test.ts, and relevant Discord monitor tests after refresh.

What I checked:

  • Repository policy read: Root AGENTS.md and relevant scoped guides were read fully; deep PR review, Codex source inspection, compatibility-risk, and release-owned changelog guidance affected this review. (AGENTS.md:1, 640258d7b31d)
  • Live PR state: GitHub reports this PR head d2aabd3 as mergeable=CONFLICTING and mergeStateStatus=DIRTY. (d2aabd3cd455)
  • Current main typing controller: Current main exposes markRunComplete/markDispatchIdle/cleanup only, starts a keepalive loop when enabled, and has no source-reply-delivered terminal hook. (src/auto-reply/reply/typing.ts:25, 640258d7b31d)
  • Discord keepalive policy: Current Discord processing disables core typing keepalive only when reply typing feedback exists or message_tool_only has no explicit typingMode/typingInterval, so explicit typing config remains a separate behavior choice. (extensions/discord/src/monitor/message-handler.process.ts:253, 640258d7b31d)
  • Active runtime path mismatch: Current main constructs embedded tools through src/agents/embedded-agent-runner/run/attempt.ts and Codex app-server tools through extensions/codex/src/app-server/dynamic-tool-build.ts; the PR edits older pi/run-attempt locations. (src/agents/embedded-agent-runner/run/attempt.ts:1254, 640258d7b31d)
  • Merged partial overlap: The merged Discord-scoped PR intentionally preserves explicit typingMode / typingInterval behavior, so it partially overlaps this PR but does not prove the configured instant-typing case is obsolete. (94ab33036e90)

Likely related people:

  • steipete: Merged the Discord reply typing lifecycle PR that owns the current carried feedback/prestart path this PR must integrate with. (role: adjacent merger and owner; confidence: high; commits: 6f20f29688d7; files: extensions/discord/src/monitor/reply-typing-feedback.ts, extensions/discord/src/monitor/message-handler.reply-typing-policy.ts, extensions/discord/src/monitor/message-handler.process.ts)
  • zhuisDEV: Opened the merged Discord reply typing lifecycle PR whose implementation defines the current Discord feedback owner around this behavior. (role: adjacent feature proposer; confidence: medium; commits: 6f20f29688d7; files: extensions/discord/src/monitor/reply-typing-feedback.ts, extensions/discord/src/monitor/message-handler.reply-typing-policy.ts, extensions/discord/src/monitor/message-handler.process.ts)
  • dr00-eth: Authored the merged Discord-scoped keepalive PR that partially overlaps this issue and intentionally preserves explicit typing config behavior. (role: recent overlapping fix contributor; confidence: medium; commits: 94ab33036e90; files: extensions/discord/src/monitor/message-handler.process.ts, extensions/discord/src/monitor/reply-typing-feedback.ts, src/auto-reply/reply/typing.ts)
  • Ayaan Zaidi: Authored the nearby shared typing change tracked by the open cleanup-race PR, which affects the same controller family though not the same post-delivery root cause. (role: adjacent shared typing contributor; confidence: medium; commits: 45b86450795d; files: src/channels/typing.ts, src/auto-reply/reply/typing.ts)
  • Agustin Rivera: Current blame for the shared typing controller and Discord feedback lines points to recent commit 6ead092, but this appears snapshot-like and is weak as original feature ownership evidence. (role: recent current-main contributor; confidence: low; commits: 6ead092302; files: src/auto-reply/reply/typing.ts, extensions/discord/src/monitor/message-handler.process.ts, extensions/discord/src/monitor/reply-typing-feedback.ts)
What the crustacean ranks mean
  • 🦀 challenger crab: rare, exceptional readiness with strong proof, clean implementation, and convincing validation.
  • 🦞 diamond lobster: very strong readiness with only minor maintainer review expected.
  • 🐚 platinum hermit: good normal PR, likely mergeable with ordinary maintainer review.
  • 🦐 gold shrimp: useful signal, but proof or patch confidence is still limited.
  • 🦪 silver shellfish: thin signal; proof, validation, or implementation needs work.
  • 🧂 unranked krab: not merge-ready because proof is missing/unusable or there are serious correctness or safety concerns.
  • 🌊 off-meta tidepool: rating does not apply to this item.

Shiny media proof means a screenshot, video, or linked artifact directly shows the changed behavior. Runtime, network, CSP, and security claims still need visible diagnostics.

How this review workflow works
  • ClawSweeper keeps one durable marker-backed review comment per issue or PR.
  • Re-runs edit this comment so the latest verdict, findings, and automation markers stay together instead of adding duplicate bot comments.
  • A fresh review can be triggered by eligible @clawsweeper re-review comments, exact-item GitHub events, scheduled/background review runs, or manual workflow dispatch.
  • PR/issue authors and users with repository write access can comment @clawsweeper re-review or @clawsweeper re-run on an open PR or issue to request a fresh review only.
  • Maintainers can also comment @clawsweeper review to request a fresh review only.
  • Fresh-review commands do not start repair, autofix, rebase, CI repair, or automerge.
  • Maintainer-only repair and merge flows require explicit commands such as @clawsweeper autofix, @clawsweeper automerge, @clawsweeper fix ci, or @clawsweeper address review.
  • Maintainers can comment @clawsweeper explain to ask for more context, or @clawsweeper stop to stop active automation.

@clawsweeper clawsweeper Bot added rating: 🧂 unranked krab Not merge-ready due to missing proof or serious correctness/safety concerns. status: 📣 needs proof The PR needs real behavior proof before ClawSweeper can clear the contributor ask. P2 Normal backlog priority with limited blast radius. labels May 19, 2026
@openclaw-barnacle openclaw-barnacle Bot added extensions: codex proof: supplied External PR includes structured after-fix real behavior proof. and removed triage: needs-real-behavior-proof Candidate: external PR needs after-fix proof from a real setup. labels May 19, 2026
@Rohang2005

Rohang2005 commented May 19, 2026

Copy link
Copy Markdown
Contributor Author

Addressed all three required changes.

@Rohang2005

Copy link
Copy Markdown
Contributor Author

@mcaxtr could you please take a look at this PR? Thank you for your time!

@clawsweeper clawsweeper Bot added merge-risk: 🚨 other 🚨 Merging this PR has meaningful risk outside the owned taxonomy. merge-risk: 🚨 compatibility 🚨 May break existing users, config, migrations, defaults, or upgrade paths. and removed merge-risk: 🚨 other 🚨 Merging this PR has meaningful risk outside the owned taxonomy. labels Jun 19, 2026
@openclaw-barnacle

Copy link
Copy Markdown

This pull request has been automatically marked as stale due to inactivity.
Please add updates or it will be closed.

@openclaw-barnacle openclaw-barnacle Bot added the stale Marked as stale due to inactivity label Jul 15, 2026
@clawsweeper

clawsweeper Bot commented Jul 15, 2026

Copy link
Copy Markdown
Contributor

@Rohang2005 thanks for the PR. ClawSweeper is still waiting on real behavior proof before this can move forward.

Useful proof can be a screenshot, short video, terminal output, copied live output, linked artifact, or redacted logs that show the changed behavior after the fix. Please redact private tokens, phone numbers, private endpoints, customer data, and anything else sensitive.

Once proof is added to the PR body or a comment, ClawSweeper or a maintainer can re-check it.

@openclaw-barnacle openclaw-barnacle Bot removed the stale Marked as stale due to inactivity label Jul 16, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

agents Agent runtime and tooling channel: whatsapp-web Channel integration: whatsapp-web extensions: codex merge-risk: 🚨 compatibility 🚨 May break existing users, config, migrations, defaults, or upgrade paths. P2 Normal backlog priority with limited blast radius. proof: supplied External PR includes structured after-fix real behavior proof. rating: 🧂 unranked krab Not merge-ready due to missing proof or serious correctness/safety concerns. size: M status: 📣 needs proof The PR needs real behavior proof before ClawSweeper can clear the contributor ask.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Discord typing indicator lingers ~10s after reply delivery in message_tool_only source-reply path

1 participant