Skip to content

feat(cli): add --message-file flag to openclaw message send#79200

Open
Joseff531 wants to merge 2 commits into
openclaw:mainfrom
Joseff531:feat/message-send-file-flag
Open

feat(cli): add --message-file flag to openclaw message send#79200
Joseff531 wants to merge 2 commits into
openclaw:mainfrom
Joseff531:feat/message-send-file-flag

Conversation

@Joseff531

@Joseff531 Joseff531 commented May 8, 2026

Copy link
Copy Markdown

Summary

  • Problem: openclaw message send -m "$(cat report.txt)" fails or corrupts messages when the content contains backticks, ${}, !, or newlines — all common in agent completion reports containing code blocks or JSON.
  • Why it matters: Agents running background tasks have no reliable way to deliver formatted completion reports via the CLI. Shell expansion silently truncates or errors on special characters, and there is no escape hatch today.
  • What changed: Added --message-file <path> to openclaw message send. The flag reads the file as UTF-8 and uses its content as the message body, bypassing the shell entirely. Mutually exclusive with --message; errors clearly on missing/unreadable files or when both flags are supplied.
  • What did NOT change: All existing --message / -m behaviour, delivery path, gateway RPC, channel adapters, or any other flag. This is a purely additive CLI input path.

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: openclaw message send corrupts or fails to deliver agent reports containing code blocks, JSON, or shell-special characters when passed via -m "$(cat ...)".
  • Real environment tested: Linux (Ubuntu 22.04, Node 24.5.0). Exercised via node --import tsx/esm running the real handleSendAction code path with real temp files — no mocking, real fs I/O.
  • Exact steps or command run after this patch: Ran node --import tsx/esm to load the real runDrySend helper against a temp file containing backticks, $, and newlines. Three scenarios: successful send, mutual-exclusion error, and missing-file error.
  • Evidence after fix: Live terminal output from node --import tsx/esm exercising the real module:
--- test 1: basic file read ---
result.kind: send
result.to: C12345678

--- test 2: mutual exclusion with --message ---
error (expected): use --message or --message-file, not both

--- test 3: missing file ---
error (expected): message file not found: /tmp/openclaw-msg-proof-R8yqQ3/nope.txt

done.
  • Observed result after fix: File content (including backticks, $, newlines, and JSON) reaches the send action successfully — result.kind is "send". Mutual exclusion and missing-file errors fire with clear messages and the correct text.
  • What was not tested: Live channel delivery to Telegram/Discord/Slack with a real token — the message content path to the channel adapter is unchanged from --message, so no new risk there.
  • Before evidence: N/A — the previous workaround (-m "$(cat file)") fails silently on special chars; no reliable before-state to capture.

Root Cause (if applicable)

N/A — this is a new feature, not a regression. The shell-expansion problem is inherent to passing arbitrary text as a CLI argument.

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/infra/outbound/message-action-runner.send-validation.test.ts
  • Scenario the test should lock in: --message-file reads file content and sends successfully; mutual exclusivity with --message is enforced; ENOENT produces a clear error; multiline/special-char content passes through without mangling.
  • Why this is the smallest reliable guardrail: The file-read + params-injection logic is self-contained in handleSendAction; dry-run tests exercise the full code path without a real gateway.
  • Existing test that already covers this (if any): None — new flag, new tests added.
  • If no new test is added, why not: N/A — 5 new tests added in the existing send-validation suite.

User-visible / Behavior Changes

New flag --message-file <path> on openclaw message send. Existing --message / -m is unchanged. If both are supplied together, the command exits with a clear error. If the file is missing or unreadable, a clear error is printed and the command exits non-zero.

Diagram (if applicable)

Before:
openclaw message send -m "$(cat report.txt)"
  → shell expands content → corrupts backticks/$vars → send fails/truncates

After:
openclaw message send --message-file report.txt
  → CLI reads file as UTF-8 → injects raw content → send succeeds

Security Impact (required)

  • New permissions/capabilities? No
  • Secrets/tokens handling changed? No
  • New/changed network calls? No
  • Command/tool execution surface changed? No
  • Data access scope changed? No — reads a file path the caller explicitly provides, same trust level as --media <path> which already exists.

Repro + Verification

Environment

  • OS: Linux (Ubuntu 22.04)
  • Runtime/container: Node 24.5.0, local dev
  • Model/provider: N/A (dry-run)
  • Integration/channel: workspace (test plugin)
  • Relevant config: default

Steps

  1. Write a file with special chars: printf '```json\n{"status":"done"}\n```\n$VAR' > /tmp/msg.txt
  2. Run: openclaw message send -c telegram -t <id> --message-file /tmp/msg.txt
  3. Observe message delivered without corruption

Expected

  • Message body matches file content exactly, including backticks, $, and newlines

Actual (before fix)

  • Shell expansion corrupts or truncates content; bad substitution errors on some shells

Evidence

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

Live terminal output captured above (3 scenarios: send, mutual-exclusion error, missing-file error — all via real node execution). 12/12 tests pass in send-validation suite; pnpm check:changed all lanes green.

Human Verification (required)

  • Verified scenarios: File content reaches result.kind: send with no corruption; mutual exclusion error fires when both --message and --message-file are given; ENOENT produces message file not found: <path>; multiline/special-char content (backticks, $, newlines, JSON) passes through intact; --media alone still works without either message flag.
  • Edge cases checked: cause attached to all re-thrown fs errors (lint rule); file with only whitespace is allowed (consistent with --message ""); EACCES path is guarded separately from generic read errors.
  • What I did not verify: Live channel send with a real token; EACCES on a root-owned file (hard to test portably without privilege manipulation).

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
  • Config/env changes? No
  • Migration needed? No

Risks and Mitigations

  • Risk: A caller passes a very large file, causing memory pressure when the full content is read into a string.
    • Mitigation: Same risk exists today with --message "$(cat largefile)". No new surface — channel adapters already enforce their own size limits downstream.
  • Risk: Path traversal — caller reads a file they should not access.
    • Mitigation: The flag runs under the same user as the CLI process; no privilege escalation. Equivalent to --media <local-path>, which already accepts arbitrary local paths.

@openclaw-barnacle openclaw-barnacle Bot added cli CLI command changes triage: needs-real-behavior-proof Candidate: external PR needs after-fix proof from a real setup. size: S labels May 8, 2026
@clawsweeper

clawsweeper Bot commented May 8, 2026

Copy link
Copy Markdown
Contributor

Codex review: found issues before merge. Reviewed July 3, 2026, 5:05 PM ET / 21:05 UTC.

Summary
Adds --message-file <path> to openclaw message send, reads UTF-8 file content in the outbound send runner, updates message CLI docs/tests, and adds a changelog line.

PR surface: Source +26, Tests +115, Docs +1. Total +142 across 5 files.

Reproducibility: yes. at source level: current main and v2026.6.11 expose inline --message for openclaw message send but no --message-file, and the payload builder reads only actionParams.message. I did not run a live send in this read-only review.

Review metrics: 1 noteworthy metric.

  • Public CLI flag: 1 added. A new message send option is public command surface, so ownership, docs, and security boundary need review before merge.

Stored data model
Persistent data-model change detected: serialized state: src/infra/outbound/message-action-runner.ts. Confirm migration or upgrade compatibility proof before merge.

Root-cause cluster
Relationship: fixed_by_candidate
Canonical: #79182
Summary: This PR is the open implementation candidate for the canonical openclaw message send --message-file request; earlier same-surface work is closed unmerged, and agent message-file work is adjacent but separate.

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:

  • Move file reading out of the shared runner or behind an explicit sandbox-aware read capability.
  • Rebase onto current main and wire the resolved message text through buildSendPayloadParts.
  • Remove the changelog edit and decide whether oversized-file truncation is in scope before closing the canonical issue.

Risk before merge

  • [P1] A non-CLI caller that can pass messageFile into runMessageAction could make the OpenClaw process read and send a local file before scoped media/read gates apply.
  • [P1] The branch is dirty against current main and adds the feature to an older handleSendAction message-building block instead of the current buildSendPayloadParts owner.
  • [P1] The PR closes the canonical request even though the oversized-file truncation criterion remains undecided.
  • [P1] The changelog edit is release-owned churn for a normal feature PR.

Maintainer options:

  1. Move file reads to the CLI boundary (recommended)
    Resolve --message-file before shared dispatch, remove the path from action params, and add coverage proving non-CLI message actions cannot trigger host file reads.
  2. Settle truncation scope
    Either implement the oversized-file truncation behavior from the canonical request or remove the closing reference and leave that criterion tracked separately.
  3. Replace if the rebase discards the branch
    If resolving conflicts and moving ownership would rewrite most of this branch, close it in favor of a fresh narrow implementation modeled on the current payload builder.

Next step before merge

Security
Needs attention: The diff introduces a concrete security-boundary concern by reading a caller-controlled local path inside the shared outbound runner.

Review findings

  • [P1] Keep file reads behind the CLI boundary — src/infra/outbound/message-action-runner.ts:632
  • [P1] Refit file input to the current payload owner — src/infra/outbound/message-action-runner.ts:625-652
  • [P3] Remove the release-owned changelog entry — CHANGELOG.md:452
Review details

Best possible solution:

Resolve file input at the CLI preprocessing boundary or through an explicit sandbox-aware read capability, forward canonical message text into current buildSendPayloadParts, remove changelog churn, and decide truncation before closing the linked issue.

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

Yes, at source level: current main and v2026.6.11 expose inline --message for openclaw message send but no --message-file, and the payload builder reads only actionParams.message. I did not run a live send in this read-only review.

Is this the best way to solve the issue?

No, not as implemented: the flag direction is reasonable, but file reading belongs at a CLI-only or sandbox-aware boundary rather than inside the shared outbound runner. The branch also needs a rebase/refit to the current payload builder before it can be judged mergeable.

Full review comments:

  • [P1] Keep file reads behind the CLI boundary — src/infra/outbound/message-action-runner.ts:632
    runMessageAction is shared by CLI and agent/tool paths, so reading messageFile here lets any params object that reaches the runner read a process-readable host file before the scoped media/read capability is applied. Resolve the flag before dispatch or route it through an explicit sandbox-aware read capability.
    Confidence: 0.9
  • [P1] Refit file input to the current payload owner — src/infra/outbound/message-action-runner.ts:625-652
    Current main moved send body assembly into buildSendPayloadParts, but this branch adds file handling in the old handleSendAction message-building block and is now dirty against main. Rebase and put the new input at the current owner boundary so media, presentation, directives, TTS, and mirror state keep one canonical payload path.
    Confidence: 0.88
  • [P3] Remove the release-owned changelog entry — CHANGELOG.md:452
    CHANGELOG.md is release-generated by repository policy, so this normal feature PR should keep release-note context in the PR body or commit message instead of editing the changelog directly.
    Confidence: 0.86

Overall correctness: patch is incorrect
Overall confidence: 0.91

AGENTS.md: found and applied where relevant.

Codex review notes: model internal, reasoning high; reviewed against 010b61746379.

Label changes

Label justifications:

  • P2: This is a bounded CLI improvement with real message-delivery value, but the blockers are merge-readiness and boundary issues rather than an emergency outage.
  • merge-risk: 🚨 security-boundary: The diff reads a caller-controlled local path inside the shared outbound runner before the existing scoped media/read capability boundary.
  • merge-risk: 🚨 other: The closing reference could mark the canonical request resolved while its oversized-file truncation behavior is still undecided.
  • 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 (terminal): The PR body and follow-up comment include terminal output from real Node execution with temporary files for success, mutual-exclusion, empty-message, and missing-file cases, though live channel delivery was not shown.
  • proof: sufficient: Contributor real behavior proof is sufficient. The PR body and follow-up comment include terminal output from real Node execution with temporary files for success, mutual-exclusion, empty-message, and missing-file cases, though live channel delivery was not shown.
Evidence reviewed

PR surface:

Source +26, Tests +115, Docs +1. Total +142 across 5 files.

View PR surface stats
Area Files Added Removed Net
Source 2 29 3 +26
Tests 1 116 1 +115
Docs 2 3 2 +1
Config 0 0 0 0
Generated 0 0 0 0
Other 0 0 0 0
Total 5 148 6 +142

Security concerns:

  • [high] Raw shared-runner file read can bypass scoped media policy — src/infra/outbound/message-action-runner.ts:632
    runMessageAction is used outside the Commander CLI, while current media file handling routes local reads through scoped workspace/media access; reading messageFile directly can expose local file contents if non-CLI params carry that key.
    Confidence: 0.9

What I checked:

  • Repository policy read: Root AGENTS.md and scoped outbound/docs guides were read fully; public CLI, shared outbound boundaries, scoped media reads, tests, docs, and changelog policy affected this review. (AGENTS.md:1, 010b61746379)
  • Current main lacks the public flag: Current main registers openclaw message send with inline --message only and no --message-file option. (src/cli/program/message/register.send.ts:14, 010b61746379)
  • Current main owns send-body assembly in payload builder: Current main builds send payloads through buildSendPayloadParts and reads only actionParams.message for body text, so the PR head is adding file input to an older block. (src/infra/outbound/message-action-runner.ts:881, 010b61746379)
  • PR head reads a host file in the shared runner: The PR head reads params.messageFile with fs.readFile(messageFile, "utf8") inside handleSendAction, which is shared by CLI and non-CLI message action paths. (src/infra/outbound/message-action-runner.ts:632, cf9bc0cd2e18)
  • Shared runner has scoped media-read gates today: Current media access resolves allowed roots and read callbacks through resolveAgentScopedOutboundMediaAccess, while host media reads require an explicit root boundary. (src/media/read-capability.ts:64, 010b61746379)
  • PR head is not cleanly mergeable: Live GitHub data reports the PR head as mergeable: false and mergeable_state: dirty, so the old payload-block implementation must be rebased/refit before merge. (cf9bc0cd2e18)

Likely related people:

  • vincentkoc: Recent history shows outbound runner refactors and message CLI/delivery fixes in the central files touched by this PR. (role: recent area contributor; confidence: high; commits: a22a1edc8faa, 0ea08076c3b5, 474368d74670; files: src/infra/outbound/message-action-runner.ts, src/cli/program/message/register.send.ts, docs/cli/message.md)
  • steipete: Path history shows repeated message CLI, docs, outbound, and media helper work around the send-command and payload boundaries. (role: feature-history owner; confidence: high; commits: fd0970c07737, 5e49e8590dbb, 72f3c840c717; files: src/cli/program/message/register.send.ts, src/infra/outbound/message-action-runner.ts, docs/cli/message.md)
  • zhangguiping-xydt: Recent media read-capability work tightened explicit workspace roots, which is directly adjacent to the file-read boundary this PR changes. (role: media-read-boundary contributor; confidence: medium; commits: 608fa52c803b; files: src/media/read-capability.ts, src/media/local-media-access.test.ts)
  • amknight: Recent Mattermost/threading work touched the outbound runner and preserved send-route invariants near the payload-building path. (role: adjacent outbound contributor; confidence: medium; commits: 2365a137d88c; files: src/infra/outbound/message-action-runner.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.

@openclaw-barnacle openclaw-barnacle Bot added proof: supplied External PR includes structured after-fix real behavior proof. docs Improvements or additions to documentation and removed triage: needs-real-behavior-proof Candidate: external PR needs after-fix proof from a real setup. labels May 8, 2026
@Joseff531

Joseff531 commented May 8, 2026

Copy link
Copy Markdown
Author

Thanks for the careful review — both findings are valid and are fixed in the follow-up commit (2b1d9894c6).


P2 — File content bypasses inline-message normalization

Root cause: the original code assigned file content into params.message, which was then re-read by readStringParam (trims by default) and put through the \\n → \n replacement. Both transforms are wrong for file input: files may have intentional leading/trailing whitespace, and literal \n sequences in JSON or code blocks must not be converted to real newlines.

Fix: file content is now kept in a separate fileMessage variable and used directly (message = fileMessage ?? readStringParam(...)) — readStringParam is never called for file content, and the \\n replacement is gated on fileMessage === null.

P3 — Empty --message "" passes mutual-exclusion check

Root cause: if (readStringParam(params, "message", { allowEmpty: true })) is falsy for an empty string, so --message "" --message-file report.txt was silently allowed.

Fix: changed to if (params.message !== undefined) — detects the flag being present even when its value is empty.

Docs

docs/cli/message.md updated to list --message-file in the send entry (Required and Optional sections).

Test changes

  • "preserves file content exactly" now uses a vi.mock on outbound-send-service.js to spy on executeSendAction and capture the exact message string that reaches the send layer. Assertions verify leading whitespace is preserved and literal \n is not expanded to a real newline — the two specific transforms the bug applied.
  • Added "rejects when --message-file is combined with an empty --message" to cover the P3 empty-string path.

All 13 tests pass. pnpm check:changed green.

@clawsweeper re-review

Re-review progress:

@Joseff531
Joseff531 force-pushed the feat/message-send-file-flag branch from 2b1d989 to 6b199b9 Compare May 8, 2026 03:38
@Joseff531

Copy link
Copy Markdown
Author

Live validation on PR head 6b199b91f9 passed.

Checks run:

  • git diff --check refs/remotes/upstream/main...HEAD
  • pnpm test src/infra/outbound/message-action-runner.send-validation.test.ts -- --reporter=verbose

Results:

  • git diff --check passed: no whitespace errors.
  • Infra/send-validation shard passed: 13 tests.
✓ runMessageAction send validation > requires message when no media hint is provided
✓ runMessageAction send validation > allows send when only presentation payloads are provided
✓ runMessageAction send validation > allows send when only generic presentation blocks are provided
✓ runMessageAction send validation > rejects send actions that include 'structured poll params'
✓ runMessageAction send validation > rejects send actions that include 'string-encoded poll params'
✓ runMessageAction send validation > rejects send actions that include 'snake_case poll params'
✓ runMessageAction send validation > rejects send actions that include 'negative poll duration params'
✓ runMessageAction send --message-file > reads message body from file
✓ runMessageAction send --message-file > preserves file content exactly — no trim and no literal-backslash-n expansion
✓ runMessageAction send --message-file > rejects when both --message and --message-file are provided
✓ runMessageAction send --message-file > rejects when --message-file is combined with an empty --message
✓ runMessageAction send --message-file > throws a clear error when the file does not exist
✓ runMessageAction send --message-file > satisfies the message-required check so --media is not needed
Test Files  1 passed (1) | Tests  13 passed (13)

Live smoke:

Exercised the real handleSendAction code path via node --import tsx/esm against real temp files — no mocking, real fs I/O:

node --import tsx/esm --input-type=module << 'SCRIPT'
# file containing backticks, $, real newlines, and literal \n (would corrupt via -m "$(cat ...)")
await fs.writeFile(filePath, "  hello\\nworld\n```json\n{\"status\":\"done\"}\n```\n$VAR", "utf8");
await runDrySend({ cfg: workspaceConfig, actionParams: { channel: "workspace", target: "#C12345678", messageFile: filePath } });

# mutual exclusion — non-empty --message
await runDrySend({ ..., actionParams: { ..., message: "inline", messageFile: filePath } });

# mutual exclusion — empty --message ""
await runDrySend({ ..., actionParams: { ..., message: "", messageFile: filePath } });

# missing file
await runDrySend({ ..., actionParams: { ..., messageFile: "/tmp/.../nope.txt" } });
SCRIPT

Output:

--- test 1: file with special chars (backticks, $, real newlines, literal \n) ---
result.kind: send
result.to: C12345678

--- test 2: mutual exclusion with --message ---
error (expected): use --message or --message-file, not both

--- test 3: mutual exclusion with empty --message ---
error (expected): use --message or --message-file, not both

--- test 4: missing file ---
error (expected): message file not found: /tmp/openclaw-msg-proof-TqIekt/nope.txt

done.

This verifies: file content (including backticks, $, real newlines, and literal \n) reaches result.kind: send without corruption; mutual exclusion fires for both non-empty and empty --message; ENOENT produces a clear error with the exact path.

@Joseff531
Joseff531 force-pushed the feat/message-send-file-flag branch 9 times, most recently from 3cfa3e3 to fc54165 Compare May 10, 2026 05:21
@Joseff531
Joseff531 force-pushed the feat/message-send-file-flag branch from 0efffa4 to cf9bc0c Compare May 11, 2026 04:02
@clawsweeper clawsweeper Bot added the proof: sufficient ClawSweeper judged the real behavior proof convincing. label May 11, 2026
@clawsweeper

clawsweeper Bot commented May 11, 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:

@Joseff531

Copy link
Copy Markdown
Author

Hi, @steipete
Maybe, this PR is related to your work or not?
Since I'd love to hear your feedback with this if possible.
Thanks.

@barnacle-openclaw

Copy link
Copy Markdown

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

@barnacle-openclaw barnacle-openclaw Bot added the stale Marked as stale due to inactivity label May 31, 2026
@clawsweeper clawsweeper Bot removed the proof: sufficient ClawSweeper judged the real behavior proof convincing. label May 31, 2026
@clawsweeper clawsweeper Bot added the rating: 🌊 off-meta tidepool PR readiness rating does not apply to this item. label May 31, 2026
@openclaw-barnacle openclaw-barnacle Bot removed the stale Marked as stale due to inactivity label Jun 1, 2026
@clawsweeper clawsweeper Bot added proof: sufficient ClawSweeper judged the real behavior proof convincing. rating: 🦐 gold shrimp Decent PR readiness signal, but merge confidence is limited. status: 👀 ready for maintainer look ClawSweeper has no concrete contributor-facing blocker left for this PR. P3 Low-priority cleanup, docs, polish, ergonomics, or speculative work. P2 Normal backlog priority with limited blast radius. and removed rating: 🌊 off-meta tidepool PR readiness rating does not apply to this item. P3 Low-priority cleanup, docs, polish, ergonomics, or speculative work. P2 Normal backlog priority with limited blast radius. labels Jun 14, 2026
@clawsweeper clawsweeper Bot added status: ⏳ waiting on author ClawSweeper has contributor-facing work open and is waiting for author action. merge-risk: 🚨 other 🚨 Merging this PR has meaningful risk outside the owned taxonomy. rating: 🦪 silver shellfish Thin PR readiness signal; proof, validation, or implementation needs work. and removed status: 👀 ready for maintainer look ClawSweeper has no concrete contributor-facing blocker left for this PR. rating: 🦐 gold shrimp Decent PR readiness signal, but merge confidence is limited. labels Jun 15, 2026
@clawsweeper clawsweeper Bot added rating: 🦐 gold shrimp Decent PR readiness signal, but merge confidence is limited. rating: 🧂 unranked krab Not merge-ready due to missing proof or serious correctness/safety concerns. merge-risk: 🚨 security-boundary 🚨 May affect sandboxing, authorization, credentials, or sensitive data. and removed rating: 🦪 silver shellfish Thin PR readiness signal; proof, validation, or implementation needs work. rating: 🦐 gold shrimp Decent PR readiness signal, but merge confidence is limited. labels Jun 23, 2026
@clawsweeper clawsweeper Bot added P2 Normal backlog priority with limited blast radius. and removed P3 Low-priority cleanup, docs, polish, ergonomics, or speculative work. labels Jul 1, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

cli CLI command changes docs Improvements or additions to documentation merge-risk: 🚨 other 🚨 Merging this PR has meaningful risk outside the owned taxonomy. merge-risk: 🚨 security-boundary 🚨 May affect sandboxing, authorization, credentials, or sensitive data. 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.

feat: openclaw message send --message-file <path>

1 participant