Skip to content

fix(discord): avoid duplicate typing keepalive for tool replies#84288

Merged
vincentkoc merged 1 commit into
openclaw:mainfrom
dr00-eth:fix/message-tool-typing-lifecycle
Jun 24, 2026
Merged

fix(discord): avoid duplicate typing keepalive for tool replies#84288
vincentkoc merged 1 commit into
openclaw:mainfrom
dr00-eth:fix/message-tool-typing-lifecycle

Conversation

@dr00-eth

@dr00-eth dr00-eth commented May 19, 2026

Copy link
Copy Markdown
Contributor

Summary

  • Problem: message-tool-only Discord replies could refresh typing from two lifecycle owners, making Discord show stale multi-second "bot is typing" after the visible reply was already delivered.
  • Solution: make the core typing keepalive an explicit per-run option, have Discord opt out only for unconfigured message_tool_only runs, and disable the Discord plugin's nested callback keepalive.
  • What changed: added typingKeepalive?: boolean to reply options, kept shared reply typing periodic by default, pass typingKeepalive: false from Discord only when sourceReplyDeliveryMode === "message_tool_only" and no explicit typingMode is configured, and set the Discord channel callback keepalive interval to 0.
  • What did NOT change (scope boundary): explicit agents.defaults.typingMode / session.typingMode continues to win, non-Discord channels keep the existing shared keepalive default unless they opt out, typing is not disabled by default, ack reactions are unchanged, and this does not add a Discord "stop typing" call because Discord does not expose one.

Motivation

  • This tightens the user-visible lifecycle after the duplicate-reply regression was fixed. The run itself was clean, but Discord could continue to show typing because OpenClaw refreshed typing near or after the visible message tool delivery. That made it look as if a second response was still being generated even when the transcript showed no fallback or second assistant run.

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: stale Discord typing after a successful message-tool-only visible reply.
  • Real environment tested: macOS local OpenClaw v2026.5.18 gateway, Node v25.6.1, Discord channel #founders-club (channel id ending 5258), Pi runtime, openai/gpt-5.5, messages.groupChat.visibleReplies: "message_tool".
  • Exact steps or command run after this patch:
    1. Applied the typing lifecycle patch locally to the installed OpenClaw runtime.
    2. Restarted the gateway.
    3. Sent Discord test messages in #founders-club.
    4. Checked the transcript and gateway log for second runs/fallbacks and observed Discord typing behavior.
  • Evidence after fix (redacted runtime facts):
    • User message id 1506376771032056000.
    • One gpt-5.5 tool call at 2026-05-19T19:23:44.803Z.
    • One delivery mirror at 2026-05-19T19:23:45.823Z.
    • One successful message tool result at 2026-05-19T19:23:45.982Z with primary Discord message id 1506376839398952981.
    • Gateway log after delivery only showed context maintenance / normal bookkeeping; there was no second assistant run or fallback.
  • Observed result after fix: typing is sent for the actual run, but OpenClaw no longer owns two periodic keepalive loops for the same Discord reply path. Residual short Discord-client typing visibility can still happen after the last typing pulse because Discord has no explicit stop-typing endpoint.
  • What was not tested: full pnpm build && pnpm check && pnpm test; I ran focused validation for the touched auto-reply and Discord extension surfaces.
  • Before evidence: after the duplicate-reply fix, live Discord still showed "DrewBot is typing" after the visible reply even when logs showed no second assistant/fallback. That pointed at typing lifecycle refresh, not duplicate generation.

Root Cause (if applicable)

  • Root cause: default message-tool-only group replies start typing immediately, and Discord typing was being refreshed by both core reply typing and a Discord channel callback keepalive. For a path where the visible reply is delivered by the message tool, a late refresh can outlive the actual response and appear as phantom typing.
  • Missing detection / guardrail: tests covered typing start/cleanup behavior generally, but not "send the first typing signal without a periodic keepalive" or "Discord channel callbacks should not start a nested typing keepalive."
  • Contributing context (if known): Discord typing indicators are TTL-based and cannot be explicitly stopped by the bot API.

Regression Test Plan (if applicable)

  • 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/reply-utils.test.ts
    • extensions/discord/src/monitor/message-handler.process.test.ts
  • Scenario the test should lock in: a typing controller can emit the first typing signal without periodic keepalive ticks; Discord processing does not start a nested callback keepalive; configured Discord typingMode preserves the core keepalive path.
  • Why this is the smallest reliable guardrail: it verifies the exact lifecycle knobs that caused stale typing without relying on Discord client TTL timing.
  • Existing test that already covers this (if any): none.
  • If no new test is added, why not: N/A.

User-visible / Behavior Changes

  • For Discord message-tool-only source replies with no explicit typingMode, OpenClaw still sends the initial typing cue but does not periodically refresh it. Explicitly configured typing behavior and non-Discord shared defaults are preserved.

Diagram (if applicable)

Before:
Discord source reply run -> core typing keepalive
                         -> Discord callback keepalive
                         -> visible message delivered -> typing may still be refreshed

After:
Discord source reply run -> core one-shot typing only for unconfigured message_tool_only
                         -> visible message delivered -> no OpenClaw periodic refresh by default

Security Impact (required)

  • New permissions/capabilities? (Yes/No): No
  • Secrets/tokens handling changed? (Yes/No): No
  • New/changed network calls? (Yes/No): No
  • Command/tool execution surface changed? (Yes/No): No
  • Data access scope changed? (Yes/No): No
  • If any Yes, explain risk + mitigation: N/A

Repro + Verification

Environment

  • OS: macOS
  • Runtime/container: local OpenClaw gateway, Node v25.6.1
  • Model/provider: openai/gpt-5.5, Pi runtime
  • Integration/channel (if any): Discord group/channel, message-tool-only visible replies
  • Relevant config (redacted): messages.groupChat.visibleReplies: "message_tool", no explicit typingMode

Steps

  1. Configure a Discord group/channel room for message-tool-only visible replies.
  2. Trigger the agent in a group channel.
  3. Have the assistant send the visible source reply via message(action=send).
  4. Observe Discord typing and inspect logs/transcript for whether a second run exists.

Expected

  • Typing starts for the real run.
  • Visible reply sends once.
  • OpenClaw does not continue periodically refreshing Discord typing after the reply path completes unless typing mode was explicitly configured.

Actual

  • Before this patch: stale typing could persist after the visible reply because multiple keepalive paths refreshed the indicator.
  • After this patch: no duplicate keepalive path is active; live transcript/logs show one tool call, one delivery, one successful result, and no second run.

Evidence

  • Failing test/log before + passing after
  • Trace/log snippets
  • Screenshot/recording
  • Perf numbers (if relevant)

Focused validation run on this branch:

git diff --check origin/main...HEAD
node scripts/run-vitest.mjs run --config test/vitest/vitest.auto-reply-reply.config.ts src/auto-reply/reply/reply-utils.test.ts src/auto-reply/reply/typing-persistence.test.ts
  Test Files  2 passed (2)
  Tests       73 passed (73)

node scripts/run-vitest.mjs run --config test/vitest/vitest.extension-discord.config.ts extensions/discord/src/monitor/message-handler.process.test.ts
  Test Files  1 passed (1)
  Tests       71 passed (71)

Human Verification (required)

  • Verified scenarios: live Discord message-tool-only reply after local runtime patch; transcript/logs showed one assistant tool call, one delivery mirror, one successful tool result, and no second assistant/fallback.
  • Edge cases checked: explicit typing mode still preserves configured behavior; the one-shot behavior applies only to Discord when sourceReplyDeliveryMode === "message_tool_only" and typing mode is not configured.
  • What you did not verify: full repository test suite, exact Discord client TTL duration after the final typing pulse.

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/No): Yes
  • Config/env changes? (Yes/No): No
  • Migration needed? (Yes/No): No
  • If yes, exact upgrade steps: N/A

Risks and Mitigations

  • Risk: Discord users who relied on unconfigured message-tool-only typing refreshing throughout very long runs may see fewer typing refreshes.
    • Mitigation: explicit agents.defaults.typingMode or session.typingMode continues to opt into configured behavior; non-Discord channels keep their existing shared keepalive default unless they explicitly opt out.

@clawsweeper

clawsweeper Bot commented May 19, 2026

Copy link
Copy Markdown
Contributor

Codex review: needs changes before merge. Reviewed June 24, 2026, 1:15 PM ET / 17:15 UTC.

Summary
The PR adds a shared typingKeepalive reply option, uses it from Discord message-tool-only replies, threads Discord feedback cadence through the plugin wrapper, and adds focused typing lifecycle tests.

PR surface: Source +30, Tests +90. Total +120 across 9 files.

Reproducibility: yes. at source level: current main and v2026.6.10 still default omitted Discord keepaliveIntervalMs to a periodic callback loop, and the PR diff leaves that loop enabled on the core-disable path. I did not rerun a live Discord client in this read-only review.

Review metrics: 1 noteworthy metric.

  • Reply Option Surface: 1 added shared option. The branch adds typingKeepalive to shared reply options, so lifecycle ownership and compatibility need review before merge.

Root-cause cluster
Relationship: fixed_by_candidate
Canonical: #84276
Summary: This PR is a candidate fix for the canonical Discord message-tool-only post-delivery typing-linger issue, with one open competing fix and one merged adjacent lifecycle rewrite.

Members:

Proposal only: this assessment does not dispatch repair, suppress jobs, mutate sibling items, close, or merge anything.

Merge readiness
Overall: 🧂 unranked krab
Proof: 🦞 diamond lobster
Patch quality: 🧂 unranked krab
Result: blocked by patch quality or review findings.

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

Rank-up moves:

  • Disable or intentionally own the Discord feedback keepalive wherever typingKeepalive: false is selected.
  • Refresh the focused Discord monitor tests so they fail if a message-tool-only run still gets periodic sendTyping ticks from the Discord feedback wrapper.

Mantis proof suggestion
A short visible Discord proof would help maintainers confirm the selected lifecycle owner stops post-delivery typing refreshes in the real client. 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 typing appears during the run but does not keep refreshing after the visible message is delivered.

Risk before merge

  • [P1] The PR changes default typing refresh ownership for existing unconfigured Discord message_tool_only rooms, so maintainers need to accept the UX tradeoff before merge.
  • [P1] The open alternate fix at fix(discord): stop typing keepalive on message_tool_only delivery (#84276) #84300 targets the same canonical typing-linger bug with a different lifecycle owner, so landing both unconsolidated could create competing typing policy paths.

Maintainer options:

  1. Fix The Discord Feedback Keepalive (recommended)
    Disable or explicitly own the Discord feedback keepalive on the same unconfigured message-tool-only paths where the core keepalive is disabled, including carried prestart feedback.
  2. Accept The Remaining Discord Loop
    Maintainers may intentionally accept a single Discord-owned refresh loop if the desired fix is only duplicate-loop removal, but the PR body and linked issue expectations should be narrowed.
  3. Pause For The Alternate Signal
    If maintainers prefer the source-reply-delivered signal in fix(discord): stop typing keepalive on message_tool_only delivery (#84276) #84300, pause this PR until one canonical path is selected.
Copy recommended automerge instruction
@clawsweeper automerge

Special instructions:
Fix the Discord message-tool-only typing lifecycle so the branch does not leave `createDiscordReplyTypingFeedback` on its default keepalive cadence when `typingKeepalive: false` is selected. Cover both freshly-created process feedback and carried prestarted feedback, preserve explicit `typingMode` / `typingIntervalSeconds` behavior, and add/update focused Discord monitor tests plus the shared typing controller test.

Next step before merge

  • [P2] There is one concrete repair: make the Discord-owned feedback keepalive obey the same disabled path as the new core typingKeepalive option and cover both fresh and prestarted feedback.

Security
Cleared: No concrete security or supply-chain concern found; the diff changes typing lifecycle code and tests without dependency, permission, secret, workflow, or package changes.

Review findings

  • [P2] Disable the Discord keepalive too — extensions/discord/src/monitor/message-handler.process.ts:468
Review details

Best possible solution:

Make exactly one Discord typing lifecycle owner refresh native typing for message-tool-only replies, preserve explicit typing configuration, and verify the selected path against the canonical issue.

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

Yes at source level: current main and v2026.6.10 still default omitted Discord keepaliveIntervalMs to a periodic callback loop, and the PR diff leaves that loop enabled on the core-disable path. I did not rerun a live Discord client in this read-only review.

Is this the best way to solve the issue?

No as currently patched: suppressing the core keepalive is plausible, but the branch must also handle the Discord-owned callback keepalive or explicitly narrow the intended fix to duplicate-loop removal only.

Full review comments:

  • [P2] Disable the Discord keepalive too — extensions/discord/src/monitor/message-handler.process.ts:468
    When shouldDisableCoreTypingKeepalive is true, this passes undefined into createDiscordReplyTypingFeedback; current createTypingCallbacks treats undefined as the 3s default keepalive, so the Discord-owned loop can still refresh typing after a tool-only visible reply. Pass an explicit disabled cadence for this path and cover the carried prestart feedback path as well, or the canonical lingering-typing bug can remain.
    Confidence: 0.87

Overall correctness: patch is incorrect
Overall confidence: 0.87

AGENTS.md: found and applied where relevant.

Codex review notes: model internal, reasoning high; reviewed against 47d3d1b1f1b2.

Label changes

Label changes:

  • add rating: 🧂 unranked krab: Overall readiness is 🧂 unranked krab; proof is 🦞 diamond lobster and patch quality is 🧂 unranked krab.
  • add status: ⏳ waiting on author: ClawSweeper has contributor-facing work open and is waiting for author action. Sufficient (logs): The PR body provides after-fix live Discord runtime/log facts and focused validation output, though the patch still has a source-level lifecycle bug to fix before merge.
  • remove rating: 🦐 gold shrimp: Current PR rating is rating: 🧂 unranked krab, so this older rating label is no longer current.
  • remove status: 👀 ready for maintainer look: Current PR status label is status: ⏳ waiting on author.

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 default typing refresh behavior for existing unconfigured Discord message-tool-only rooms.
  • rating: 🧂 unranked krab: Overall readiness is 🧂 unranked krab; proof is 🦞 diamond lobster and patch quality is 🧂 unranked krab.
  • status: ⏳ waiting on author: ClawSweeper has contributor-facing work open and is waiting for author action. Sufficient (logs): The PR body provides after-fix live Discord runtime/log facts and focused validation output, though the patch still has a source-level lifecycle bug to fix before merge.
  • proof: sufficient: Contributor real behavior proof is sufficient. The PR body provides after-fix live Discord runtime/log facts and focused validation output, though the patch still has a source-level lifecycle bug to fix before merge.
Evidence reviewed

PR surface:

Source +30, Tests +90. Total +120 across 9 files.

View PR surface stats
Area Files Added Removed Net
Source 6 32 2 +30
Tests 3 90 0 +90
Docs 0 0 0 0
Config 0 0 0 0
Generated 0 0 0 0
Other 0 0 0 0
Total 9 122 2 +120

Acceptance criteria:

  • [P1] git diff --check origin/main...HEAD.
  • [P1] node scripts/run-vitest.mjs run --config test/vitest/vitest.auto-reply-reply.config.ts src/auto-reply/reply/reply-utils.test.ts src/auto-reply/reply/typing-persistence.test.ts.
  • [P1] node scripts/run-vitest.mjs run --config test/vitest/vitest.extension-discord.config.ts extensions/discord/src/monitor/message-handler.process.test.ts extensions/discord/src/monitor/message-handler.queue.test.ts.

What I checked:

  • Root policy read: Root AGENTS.md was read fully and its PR review, compatibility-risk, proof, and plugin-boundary guidance affected this review. (AGENTS.md:1, 47d3d1b1f1b2)
  • Scoped extension policy read: extensions/AGENTS.md was read fully; Discord plugin changes are reviewed against the bundled-plugin boundary and SDK seam guidance. (extensions/AGENTS.md:1, 47d3d1b1f1b2)
  • Live PR state: GitHub reports the current head ffbde4c652c7e037a80cc2b4baac31ec39bbfa83 as mergeable but unstable, with proof: sufficient and merge-risk: 🚨 compatibility labels present. (ffbde4c652c7)
  • PR diff keeps Discord callback keepalive on the disable path: The changed Discord process path passes keepaliveIntervalMs as undefined when shouldDisableCoreTypingKeepalive is true, which means the Discord callback wrapper still receives the default keepalive cadence. (extensions/discord/src/monitor/message-handler.process.ts:468, ffbde4c652c7)
  • Current callback default: Current main resolves an omitted keepaliveIntervalMs to the 3 second default, and createTypingCallbacks starts the keepalive loop after the initial typing start. (src/channels/typing.ts:33, 47d3d1b1f1b2)
  • Current Discord feedback owner: Current main wraps Discord sendTyping in createTypingCallbacks without passing keepaliveIntervalMs, so the Discord-owned feedback object is itself a periodic keepalive owner. (extensions/discord/src/monitor/reply-typing-feedback.ts:36, 47d3d1b1f1b2)

Likely related people:

  • steipete: GitHub metadata shows steipete merged the Discord reply typing lifecycle PR that introduced the current carried feedback/prestart owner this PR must integrate with. (role: merger and adjacent 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 feedback and prestart behavior around this PR. (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)
  • Zaid: Local blame on the central current-main typing and Discord feedback lines points to a recent snapshot commit, though the commit subject is broad and weak as feature ownership evidence. (role: recent current-main snapshot contributor; confidence: low; commits: 9e68fb117892; files: src/channels/typing.ts, extensions/discord/src/monitor/reply-typing-feedback.ts, extensions/discord/src/monitor/message-handler.reply-typing-policy.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 proof: sufficient ClawSweeper judged the real behavior proof convincing. rating: 🐚 platinum hermit Good normal PR readiness with ordinary maintainer review expected. status: 👀 ready for maintainer look ClawSweeper has no concrete contributor-facing blocker left for this PR. P2 Normal backlog priority with limited blast radius. merge-risk: 🚨 compatibility 🚨 May break existing users, config, migrations, defaults, or upgrade paths. labels May 19, 2026
@dr00-eth
dr00-eth force-pushed the fix/message-tool-typing-lifecycle branch from 5e8971f to 3439ab1 Compare May 19, 2026 20:26
@dr00-eth

Copy link
Copy Markdown
Contributor Author

@clawsweeper re-review

Follow-up for the compatibility/rank-up note is pushed in 3439ab10b6.

What changed:

  • Shared reply typing now keeps its existing periodic keepalive default unless a caller explicitly sets typingKeepalive: false.
  • Discord sets typingKeepalive: false only for unconfigured message_tool_only runs, so the stale post-delivery typing fix is Discord-scoped.
  • Configured Discord typingMode now preserves the core keepalive path, with regression coverage.

Validation:

  • git diff --check origin/main...HEAD
  • node scripts/run-vitest.mjs run --config test/vitest/vitest.auto-reply-reply.config.ts src/auto-reply/reply/reply-utils.test.ts src/auto-reply/reply/typing-persistence.test.ts -> 2 files, 73 tests passed
  • node scripts/run-vitest.mjs run --config test/vitest/vitest.extension-discord.config.ts extensions/discord/src/monitor/message-handler.process.test.ts -> 1 file, 71 tests passed

@openclaw-barnacle openclaw-barnacle Bot removed the proof: sufficient ClawSweeper judged the real behavior proof convincing. label May 19, 2026
@clawsweeper

clawsweeper Bot commented May 19, 2026

Copy link
Copy Markdown
Contributor

🦞🧹
ClawSweeper re-review requested.

I asked ClawSweeper to review this item again.
Action: item re-review queued (workflow sweep.yml, event repository_dispatch).
Result: the existing ClawSweeper review comment will be edited in place when the review finishes.

Re-review progress:

@clawsweeper clawsweeper Bot added the proof: sufficient ClawSweeper judged the real behavior proof convincing. label May 19, 2026
@clawsweeper clawsweeper Bot added rating: 🦐 gold shrimp Decent PR readiness signal, but merge confidence is limited. and removed rating: 🐚 platinum hermit Good normal PR readiness with ordinary maintainer review expected. labels Jun 15, 2026
@clawsweeper clawsweeper Bot added rating: 🐚 platinum hermit Good normal PR readiness with ordinary maintainer review expected. and removed rating: 🦐 gold shrimp Decent PR readiness signal, but merge confidence is limited. labels Jun 21, 2026
@clawsweeper clawsweeper Bot added rating: 🦐 gold shrimp Decent PR readiness signal, but merge confidence is limited. and removed rating: 🐚 platinum hermit Good normal PR readiness with ordinary maintainer review expected. labels Jun 24, 2026
@vincentkoc
vincentkoc force-pushed the fix/message-tool-typing-lifecycle branch from 77fd809 to ffbde4c Compare June 24, 2026 17:08
@clawsweeper clawsweeper Bot removed the rating: 🦐 gold shrimp Decent PR readiness signal, but merge confidence is limited. label Jun 24, 2026
@clawsweeper clawsweeper Bot added rating: 🧂 unranked krab Not merge-ready due to missing proof or serious correctness/safety concerns. status: ⏳ waiting on author ClawSweeper has contributor-facing work open and is waiting for author action. and removed status: 👀 ready for maintainer look ClawSweeper has no concrete contributor-facing blocker left for this PR. labels Jun 24, 2026
@vincentkoc
vincentkoc merged commit 94ab330 into openclaw:main Jun 24, 2026
111 of 115 checks passed
@vincentkoc

Copy link
Copy Markdown
Member

Merged via squash.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

channel: discord Channel integration: discord merge-risk: 🚨 compatibility 🚨 May break existing users, config, migrations, defaults, or upgrade paths. P2 Normal backlog priority with limited blast radius. proof: sufficient ClawSweeper judged the real behavior proof convincing. 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: S status: ⏳ waiting on author ClawSweeper has contributor-facing work open and is waiting for author action.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants