Repository navigation
fix(buzz): keep implicit replies at thread root - #138879
Conversation
|
🦞👀 Pull request received. I will update this pull request when review starts. ClawSweeper review completeClawSweeper finished reviewing this revision. The review result is being finalized. |
|
Codex review: needs maintainer review before merge. Reviewed September 5, 2026, 1:45 PM ET / 17:45 UTC. ClawSweeper reviewWhat this changesThe Buzz plugin anchors implicit replies to the thread root, preserves explicitly requested child replies, and expands routing regression coverage. Merge readiness✅ Ready for maintainer review This remains necessary: current main and v2026.9.1 still have the message-tool routing gap. The earlier merged fix covers automatic delivery; no blocking defects were found in this patch. Priority: P1 Review scores
Verification
How this fits togetherOpenClaw’s message tool supplies the conversation thread and reply intent to the Buzz plugin. The plugin selects the reply parent before its transport encodes and publishes the message. flowchart TD
A[Message tool send] --> B[Shared reply inheritance]
B --> C[Buzz reply policy]
C --> D{Reply intent}
D -->|Implicit| E[Thread root]
D -->|Explicit| F[Requested parent]
E --> G[Encode tags and publish]
F --> G
Before mergeNone. Agent review detailsSecurityNone. PR surfaceSource +6, Tests +18. Total +24 across 2 files. View PR surface stats
Review metrics
Root-cause clusterRelationship: Members:
Proposal only: this assessment does not dispatch repair, suppress jobs, mutate sibling items, close, or merge anything. Technical reviewBest possible solution: Keep root selection in Buzz’s existing hook, preserving explicit nesting and off mode; the encoder cannot absorb this decision because it lacks explicit-reply intent. Do we have a high-confidence way to reproduce the issue? Yes: current source shows a threaded message-tool send without explicit replyTo inheriting the triggering child ID, which the existing encoder preserves as its parent. This review did not execute the reproduction. Is this the best way to solve the issue? Yes: the existing channel hook receives both root identity and explicit intent, making it the appropriate repair boundary without imposing Buzz policy on other channels. AGENTS.md: found and applied where relevant. Codex review notes: model internal, reasoning high; reviewed against 3e4becea5e2c. LabelsLabel justifications:
EvidenceWhat I checked:
Likely related people:
Rating scale
Overall follows the weaker of proof and patch quality. Workflow
HistoryReview history (3 earlier review cycles) |
Simplify the shared channel hook and cover implicit message-tool routing without replyDelivery metadata. Preserve explicit child replies and top-level controls. Co-authored-by: sunlit-deng <yang.jiajun1@xydigit.com>
|
Merged via squash.
|
* commit '911d7d5b0c107f7274f2415ca9655dcc6105f0e8': (867 commits) fix(skills): deliver pending Workshop approval controls (#139248) fix(gateway): deliver loopback ask_user prompts to the originating channel (#138831) docs: keep root agent instructions focused on repository policy (#139258) fix(matrix): exclude archived state roots from scans and selection (#112329) perf(agents): prepare exact tool names once per catalog batch (#139267) fix: preserve Swarm progress and simplify owner plumbing (#139269) fix(tailscale): release claims after gateway process-group exit (#139261) refactor(cli): simplify lazy command registration (#139108) test(ui): retain synthetic widget failure evidence (#139229) fix(buzz): keep implicit replies at thread root (#138879) test(diagnostics): await graceful Gateway shutdown before cleanup (#139247) fix(ci): unblock releases with different tooling package managers (#139259) feat(ui): add social preview links for private sessions (#139250) fix(codex): retain failed conversations for guarded continuation (#139246) chore(ui): refresh control ui locales (#139200) fix(ci): run browser checks for real-gateway inputs (#139256) fix(llama-cpp): reconcile managed router state before requests (#136363) chore(i18n): refresh native locales (#139237) refactor(worker): unify inference payload handling (#139245) refactor(terminal): replay wrapped prefixes in one pass (#139240) ...
* fix(buzz): keep implicit replies at thread root * fix(buzz): keep implicit replies at their thread root Simplify the shared channel hook and cover implicit message-tool routing without replyDelivery metadata. Preserve explicit child replies and top-level controls. Co-authored-by: sunlit-deng <yang.jiajun1@xydigit.com> --------- Co-authored-by: Peter Steinberger <steipete@gmail.com> Co-authored-by: sunlit-deng <yang.jiajun1@xydigit.com>
What Problem This Solves
Fixes Buzz implicit replies that nest under the triggering child message instead of staying at the thread root. Fixes #138812.
Why This Change Was Made
The shared message-action path already supplies the thread root and whether the reply target was explicit. The Buzz plugin now uses that existing threading hook to normalize implicit replies to the root. Explicit child replies keep their nesting, and automatic off-mode replies retain their top-level behavior. The encoder and generic routing policy are unchanged.
The maintainer refinement removes a redundant unequal-ID check, replaces a stale comment, and makes the regression table explicitly cover message-tool calls without
replyDeliverymetadata. The original contributor commits remain in the ancestry.User Impact
Implicit Buzz replies remain in the active thread. Explicit child replies and top-level sends continue to work.
Evidence
The independent hosted proof exercised production
runMessageAction, the Buzz adapter, and an authenticated signed local WebSocket relay. The baseline emitted both root and child-reply tags for an implicit reply; the candidate emitted only the root reply tag. Explicit-child, explicit-root, off-mode, and top-level controls passed. All 51 focused channel, inbound, and bus tests passed. The executed production file matches the published candidate byte-for-byte. The parent proof run is red because the separate Feishu lane referenced a stale test filename; the Buzz job passed.This is synthetic relay transport proof, not a hosted Buzz service or native-client recording. The existing reporter reproduction supplies the client symptom. Direct inspection of Buzz's threading implementation confirms its root/child tag contract.
Fresh independent Codex review through P2 found no actionable defects. Production +9/-3 (net +6), tests +34/-16 (net +18). The small production addition is the missing plugin-owned default-routing decision; putting it in the encoder would flatten explicit child replies, and putting it in core would impose Buzz policy on other channels. Exact published-head CI passed.
Thanks @sunlit-deng for the original fix and reproduction.