fix: #80507 show dry-run output for message send/poll#94684
Conversation
|
Codex review: passed. Reviewed June 18, 2026, 11:50 PM ET / 03:50 UTC. Summary PR surface: Source 0. Total 0 across 1 file. Reproducibility: yes. source-reproducible. The linked issue has captured CLI output, and current main shows send/poll results carry Review metrics: 1 noteworthy metric.
Root-cause cluster Members:
Proposal only: this assessment does not dispatch repair, suppress jobs, mutate sibling items, close, or merge anything. Merge readiness Overall follows the weaker of proof and patch quality, so missing proof can cap an otherwise strong patch. Rank-up moves:
Risk before merge
Maintainer options:
Next step before merge
Security Review detailsBest possible solution: Land one Do we have a high-confidence way to reproduce the issue? Yes, source-reproducible. The linked issue has captured CLI output, and current main shows send/poll results carry Is this the best way to solve the issue? Yes. Checking AGENTS.md: found and applied where relevant. Codex review notes: model internal, reasoning high; reviewed against 36bfe77db19c. Label changesLabel changes:
Label justifications:
Evidence reviewedPR surface: Source 0. Total 0 across 1 file. View PR surface stats
What I checked:
Likely related people:
What the crustacean ranks mean
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
|
|
/clownfish automerge |
|
Clownfish is on the reef for this PR. 🐠 I tagged A maintainer can call |
Thank you. I will continue to follow this. |
|
/clownfish automerge |
|
Clownfish is on the reef for this PR. 🐠 I tagged A maintainer can call |
|
🦞✅ Source: What merged:
Automerge notes:
The automerge loop is complete. Automerge progress:
|
…aw#94684) Summary: - The branch changes `formatMessageCliText` to render dry-run message output from `result.dryRun` instead of only `handledBy === "dry-run"`. - PR surface: Source 0. Total 0 across 1 file. - Reproducibility: yes. source-reproducible. The linked issue has captured CLI output, and current main shows ... e the formatter still checks `handledBy === "dry-run"`; I did not execute the CLI in this read-only review. Automerge notes: - No ClawSweeper repair was needed after automerge opt-in. Validation: - ClawSweeper review passed for head dce6d6a. - Required merge gates passed before the squash merge. Prepared head SHA: dce6d6a Review: openclaw#94684 (comment) Co-authored-by: lizeyu-xydt <[email protected]>
…aw#94684) Summary: - The branch changes `formatMessageCliText` to render dry-run message output from `result.dryRun` instead of only `handledBy === "dry-run"`. - PR surface: Source 0. Total 0 across 1 file. - Reproducibility: yes. source-reproducible. The linked issue has captured CLI output, and current main shows ... e the formatter still checks `handledBy === "dry-run"`; I did not execute the CLI in this read-only review. Automerge notes: - No ClawSweeper repair was needed after automerge opt-in. Validation: - ClawSweeper review passed for head dce6d6a. - Required merge gates passed before the squash merge. Prepared head SHA: dce6d6a Review: openclaw#94684 (comment) Co-authored-by: lizeyu-xydt <[email protected]>
Summary
When
openclaw message send --dry-runis used, the pretty-text CLI output incorrectly prints✅ Sent via <channel>. Message ID: unknown— the same success message as a real send. The formatter checksresult.handledBy === "dry-run", but the send/poll execution path (executeSendAction) always returnshandledBy: "core"with a separatedryRun: trueflag, so the dry-run branch is dead code.The fix changes the condition from
result.handledBy === "dry-run"toresult.dryRun. All four variants ofMessageActionRunResult(send,broadcast,poll,action) include the requireddryRun: booleanfield, making this a type-safe single-line fix.Fixes #80507
Real behavior proof
Behavior addressed: Fix
openclaw message send --dry-run(and the equivalent poll path) so the pretty-text CLI output shows a muted[dry-run] would run send via <channel>line instead of incorrectly printing✅ Sent via <channel>. Message ID: unknown.Real environment tested: Linux 6.8.0-124-generic x64 / OpenClaw 2026.6.8 (built from source at a8d60d3) / Node.js v25.9.0
Exact steps or command run after this patch:
After-fix evidence:
Observed result after the fix: The pretty-text output now correctly prints
[dry-run] would run send via slack(muted style) instead of the old buggy✅ Sent via Slack. Message ID: unknown. The--jsonoutput confirmsdryRun: trueandhandledBy: "core"— proving the fix correctly checksresult.dryRunrather than the never-setresult.handledBy === "dry-run".What was not tested: The broadcast dry-run path (kind: "broadcast" with
handledBy: "dry-run") was not explicitly tested, but the type-safe change preserves existing behavior for broadcast sincedryRunis also present on that variant.Tests and validation
Type safety
The
MessageActionRunResultunion type guarantees correctness:kind: "send"→handledByis never"dry-run"(was dead code)kind: "poll"→handledByis never"dry-run"(was dead code)kind: "broadcast"andkind: "action"→handledByCAN be"dry-run", butdryRunis also present and truthy — behavior preservedThe fix moves from checking a value that can never be
"dry-run"on the send/poll path (handledBy) to checking the field that correctly indicates dry-run state (dryRun).Build verification
Risk checklist
Current review state