Skip to content

fix(imessage): shed emoji anywhere in poll-vote echo match#98691

Merged
steipete merged 3 commits into
openclaw:mainfrom
omarshahine:fix/imessage-poll-echo-emoji
Jul 1, 2026
Merged

fix(imessage): shed emoji anywhere in poll-vote echo match#98691
steipete merged 3 commits into
openclaw:mainfrom
omarshahine:fix/imessage-poll-echo-emoji

Conversation

@omarshahine

@omarshahine omarshahine commented Jul 1, 2026

Copy link
Copy Markdown
Contributor

What Problem This Solves

Native iMessage poll support merged in #98421, including a poll_vote_echo guard
that suppresses the redundant one-word text the agent tends to send right after
voting (it already shows on the poll) under message_tool_only reply mode.

That guard leaks for any poll whose option carries an emoji. iMessage stores
native poll options with a trailing emoji, e.g. "Lobster 🦞 ", while the
agent echoes its vote with a leading emoji, e.g. "🦞 Lobster.". The guard's
normalizePollEchoText stripped only a leading emoji prefix, so the option
normalized to "lobster 🦞" but the echo to "lobster" — no match, and the
redundant text went out anyway. Plain-word options ("Blue") were unaffected,
which is why it slipped through review.

Confirmed from live chat.db on macOS 26.4.1: the option balloon decoded to
["Lobster 🦞 ", "Crab 🦀 ", "Shrimp 🦐 "], and the leaked reply row decoded to
"🦞 Lobster.".

Why This Change Was Made

The normalizer now sheds emoji anywhere, not just a leading prefix, across
every emoji class so both sides of the comparison shed them symmetrically:

  • Pictographic (🦞) — the reported case
  • Regional-indicator flags (🇺🇸) and subdivision-flag tag chars — these are
    not Extended_Pictographic, so they need their own ranges
  • Keycap sequences (1️⃣) cleared as a unit, so an emoji-only keycap label
    normalizes to empty instead of leaving a stray "1"
  • ZWJ / skin-tone combiners

Internal punctuation is preserved, so C#, C++, Node.js stay distinct. An
emoji-only label normalizes to empty and the guard's existing non-empty-option
check fails open (never wrongly suppresses).

User Impact

  • Voting on an iMessage poll whose options include emoji (the common case —
    iMessage's own UI encourages emoji options) no longer produces a redundant
    one-word text next to the vote.
  • No behavior change for plain-word options, non-poll sends, or any text that
    adds content beyond the bare option label.
  • No config or API surface change.

Evidence

  • New unit test src/agents/tools/message-tool.poll-echo.test.ts — 5 passing,
    covering the emoji-suffix/prefix match, regional-indicator flags, subdivision
    tags, ZWJ/skin-tone, keycap-as-unit, keycap-empty, plain-digit/# preservation,
    and C#/C++/Node.js.
  • src/agents/tools/message-tool.test.ts "poll vote echo guard" — 8 passing,
    including a new integration test casting a vote whose resolved option is
    "Lobster 🦞 " then sending "🦞 Lobster." and asserting status:suppressed,
    reason:poll_vote_echo.
  • pnpm tsgo:core — clean.
  • Independent Codex review (gpt-5.4): first pass flagged the flag + keycap gaps;
    after hardening, re-review READY with no remaining findings.
  • Live on macOS 26.4.1: the fix is deployed on the running gateway and suppresses
    the "🦞 Lobster." echo end-to-end.

Before/after proof (real data, both function versions run verbatim)

Runs the actual normalizePollEchoText source from origin/main (buggy) and
this branch, against the exact strings captured from chat.db (poll balloon
"Lobster 🦞 ", leaked reply "🦞 Lobster."), through the guard's real
comparison (outboundText && norm(option) && norm(text) === norm(option)):

case                                     main         fix
--------------------------------------------------------------------
LIVE bug (crustacean)                    leaked       SUPPRESSED   <-- FIXED
control: plain word ("Blue")             SUPPRESSED   SUPPRESSED
flag option ("USA 🇺🇸")                   leaked       SUPPRESSED   <-- FIXED
skin-tone ("Team 👍🏽")                    leaked       SUPPRESSED   <-- FIXED
keycap emoji-only (must NOT suppress)    SUPPRESSED   leaked       <-- FIXED
distinct option ("Blue" vs "Red")        leaked       leaked
--------------------------------------------------------------------
norm('Lobster 🦞 ') main = "lobster 🦞"   ← mismatch → leaks
norm('🦞 Lobster.')  main = "lobster"
norm('Lobster 🦞 ') fix  = "lobster"      ← match → suppressed
norm('🦞 Lobster.')  fix  = "lobster"

The plain-word control suppresses on both, which is why only emoji options failed
and the regression slipped #98421 review. Distinct options never suppress on
either, confirming no new false positives.

🤖 Generated with Claude Code

https://claude.ai/code/session_01MinTomscE31ajaCggnYu2A

iMessage native poll options carry a trailing emoji ("Lobster 🦞 ") while the
agent echoes its vote with a leading one ("🦞 Lobster.") under message_tool_only
reply mode. normalizePollEchoText stripped only a leading emoji prefix, so
"lobster 🦞" never matched "lobster" and the redundant text leaked past the
poll_vote_echo guard (shipped in openclaw#98421).

Shed emoji anywhere across every class: pictographic, regional-indicator flags
(🇺🇸), subdivision-flag tag chars, ZWJ, skin-tone, and keycap sequences cleared
as a unit (so "1️⃣" -> "" not "1", while a plain "1"/"#"/"*" survives). Internal
punctuation stays so C#/C++/Node.js remain distinct; emoji-only labels normalize
to empty and the guard's existing empty-option check fails open. Re-exports
normalizePollEchoText with a focused unit test across every emoji class plus a
message-tool integration test for the emoji-suffixed-option case.
@openclaw-barnacle openclaw-barnacle Bot added agents Agent runtime and tooling size: S maintainer Maintainer-authored PR labels Jul 1, 2026
@clawsweeper

clawsweeper Bot commented Jul 1, 2026

Copy link
Copy Markdown
Contributor

Codex review: needs real behavior proof before merge. Reviewed July 1, 2026, 2:29 PM ET / 18:29 UTC.

Summary
The branch extracts poll-vote echo matching into a dedicated helper and updates the message tool/tests so emoji-bearing iMessage poll options suppress the redundant echoed vote text.

Reproducibility: yes. Current main strips only a leading emoji prefix, so source inspection and a direct normalization probe show Lobster 🦞 and 🦞 Lobster. fail the existing comparison.

Review metrics: none identified.

Stored data model
Persistent data-model change detected: persistent cache schema: docs/reference/prompt-caching.md, persistent cache schema: docs/reference/token-use.md, serialized state: src/cron/persisted-shape.onexit.test.ts, unknown-truncated-pull-files, vector/embedding metadata: docs/reference/token-use.md, vector/embedding metadata: ui/src/ui/controllers/cron.test.ts. Confirm migration or upgrade compatibility proof before merge.

Merge readiness
Overall: 🦪 silver shellfish
Proof: 🦪 silver shellfish
Patch quality: 🐚 platinum hermit
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 inspectable redacted iMessage proof showing the emoji-option echo is suppressed and a non-matching send still goes out.

Proof guidance:

  • [P1] Needs stronger real behavior proof before merge: The PR body includes a copied comparison table and live claim, but no inspectable artifact or redacted runtime output showing the after-fix iMessage suppression path. 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 real iMessage/macOS proof would materially help verify the visible redundant echo is suppressed without hiding unrelated text. A maintainer can ask Mantis to capture proof by posting this exact PR comment:

@openclaw-mantis visual task: verify an iMessage poll vote on an emoji-suffixed option suppresses the redundant leading-emoji text echo and still allows non-matching content.

Risk before merge

  • [P1] The changed matcher controls whether visible post-vote text is suppressed, so an unproven edge case could hide or leak a message.
  • [P1] The PR body has a live iMessage claim and comparison table, but no inspectable redacted log, terminal output, screenshot, recording, or linked artifact showing the after-fix iMessage path.

Maintainer options:

  1. Attach real iMessage proof (recommended)
    Add redacted inspectable output or media showing an emoji-suffixed iMessage poll vote suppresses only the redundant echoed vote text.
  2. Maintainer-owned live verification
    A maintainer can run the same iMessage flow and attach Mantis or local proof before accepting the proof burden.

Next step before merge

  • [P1] The remaining blocker is contributor or maintainer real-behavior proof, which automation cannot supply for the contributor's iMessage setup.

Security
Cleared: The prospective merge only changes agent message-tool source and tests; no dependency, workflow, secret, permission, package, or supply-chain surface remains in the merge delta.

Review details

Best possible solution:

Merge the narrow matcher after inspectable redacted iMessage proof, or maintainer-owned live verification, confirms emoji-option echo suppression and a non-matching send that remains visible.

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

Yes. Current main strips only a leading emoji prefix, so source inspection and a direct normalization probe show Lobster 🦞 and 🦞 Lobster. fail the existing comparison.

Is this the best way to solve the issue?

Yes for the code shape: the helper stays in the message-tool owner boundary and preserves emoji identity while ignoring placement. It is not merge-ready until the live iMessage behavior has inspectable proof.

AGENTS.md: found and applied where relevant.

Codex review notes: model internal, reasoning high; reviewed against 53fe2e4bc3ca.

Label changes

Label justifications:

  • P2: This is a bounded iMessage message-delivery bug fix with limited blast radius but a real pre-merge proof gap.
  • merge-risk: 🚨 message-delivery: The PR changes the condition that suppresses outbound visible text after an iMessage poll vote.
  • rating: 🦪 silver shellfish: Overall readiness is 🦪 silver shellfish; proof is 🦪 silver shellfish and patch quality is 🐚 platinum hermit.
  • 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 includes a copied comparison table and live claim, but no inspectable artifact or redacted runtime output showing the after-fix iMessage suppression path. 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

What I checked:

  • Repository policy read: Root AGENTS.md and the relevant src/agents, src/agents/tools, src/gateway, and src/plugin-sdk scoped guides were read; the message-delivery and proof requirements affected this review. (AGENTS.md:1, 53fe2e4bc3ca)
  • Current-main root cause: Current main normalizes poll echo text by stripping only a leading emoji prefix, so trailing emoji in the voted option remains in the comparison. (src/agents/tools/message-tool.ts:175, 53fe2e4bc3ca)
  • Direct source proof: A read-only Node probe showed current main does not match Lobster 🦞 with 🦞 Lobster., while the PR matcher does and keeps distinct keycap/emoji signatures distinct. (53fe2e4bc3ca)
  • Focused merge result: Comparing current main to the GitHub prospective merge commit shows only four changed files: message-tool source/test plus the new poll-vote-echo source/test files. (fed24523cc8a)
  • PR matcher shape: The new helper normalizes words separately from an emoji signature and requires matching signatures when both sides contain emoji, preventing the earlier mixed-keycap collision. (src/agents/tools/poll-vote-echo.ts:27, 4f323f0cc9c1)
  • Call site uses matcher: The potential merge replaces the old string equality check with isPollVoteEchoText(vote.option, outboundText) at the existing suppression decision point. (src/agents/tools/message-tool.ts:1395, fed24523cc8a)

Likely related people:

  • omarshahine: Authored the native iMessage poll support PR that added the poll-vote echo path and authored the first two commits on this follow-up branch. (role: recent feature contributor; confidence: high; commits: c92c33d10806, 998871751437, 2569c04abbe7; files: extensions/imessage/src/actions.ts, src/agents/tools/message-tool.ts, src/agents/tools/message-tool.test.ts)
  • steipete: Merged the native iMessage poll support PR, is assigned/review-requested here, and authored the latest head commit that preserved poll option emoji identity. (role: recent hardening contributor and merger; confidence: high; commits: c92c33d10806, 4f323f0cc9c1; files: src/agents/tools/poll-vote-echo.ts, src/agents/tools/message-tool.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 Jul 1, 2026
ClawSweeper/CI check-lint flagged no-misleading-character-class: combining
marks (VS16, U+20E3), ZWJ, and skin-tone modifiers are misleading inside a
single character class. Rewrite the emoji strip as an alternation using
property escapes (\p{Regional_Indicator}, \p{Emoji_Modifier}) plus standalone
atoms so the same normalization behavior passes lint. Behavior unchanged;
poll-echo unit + integration tests still green.
@clawsweeper clawsweeper Bot added rating: 🦪 silver shellfish Thin PR readiness signal; proof, validation, or implementation needs work. merge-risk: 🚨 message-delivery 🚨 May drop, duplicate, misroute, suppress, or wrongly target messages. and removed rating: 🧂 unranked krab Not merge-ready due to missing proof or serious correctness/safety concerns. labels Jul 1, 2026
@steipete steipete self-assigned this Jul 1, 2026
@steipete
steipete requested a review from a team as a code owner July 1, 2026 18:22
@openclaw-barnacle openclaw-barnacle Bot added docs Improvements or additions to documentation channel: discord Channel integration: discord channel: telegram Channel integration: telegram app: ios App: ios app: macos App: macos app: web-ui App: web-ui gateway Gateway runtime cli CLI command changes scripts Repository scripts commands Command implementations extensions: qa-lab extensions: memory-wiki extensions: codex extensions: inworld Extension: inworld and removed size: S labels Jul 1, 2026
@steipete

steipete commented Jul 1, 2026

Copy link
Copy Markdown
Contributor

Land-ready maintainer pass complete at exact head 4f323f0cc9c1b1afaacf607ff3cb1d6aa981eb07.

Improvements:

  • extracted poll-vote echo matching into a focused helper;
  • preserved ordered emoji/keycap identity instead of stripping all emoji;
  • added coverage for keycaps, flags, modifiers, ZWJ sequences, tag characters, and decorative emoji.

Proof:

  • node scripts/run-vitest.mjs src/agents/tools/poll-vote-echo.test.ts src/agents/tools/message-tool.test.ts — 133 tests passed;
  • fresh autoreview — no actionable findings (0.94 confidence);
  • hosted CI run 28538778377 — successful after rerunning one unrelated MCP timing failure;
  • exact-head Blacksmith Testbox lease tbx_01kwfeqf7bzcq9n3a0mfc0pnp0 / run 28538805171 — pnpm check:changed passed;
  • OPENCLAW_TESTBOX=1 scripts/pr prepare-run 98691 — exact-head hosted gates passed.

Live native Messages poll proof is unavailable on this host because SIP prevents IMCore helper injection. The touched matcher behavior is covered by focused tests and the exact-head hosted gates above.

@steipete
steipete merged commit d0b30e0 into openclaw:main Jul 1, 2026
250 of 257 checks passed
@steipete

steipete commented Jul 1, 2026

Copy link
Copy Markdown
Contributor

Merged via squash.

liuhao1024 pushed a commit to liuhao1024/openclaw that referenced this pull request Jul 1, 2026
…98691)

* fix(imessage): shed emoji anywhere in poll-vote echo match

iMessage native poll options carry a trailing emoji ("Lobster 🦞 ") while the
agent echoes its vote with a leading one ("🦞 Lobster.") under message_tool_only
reply mode. normalizePollEchoText stripped only a leading emoji prefix, so
"lobster 🦞" never matched "lobster" and the redundant text leaked past the
poll_vote_echo guard (shipped in openclaw#98421).

Shed emoji anywhere across every class: pictographic, regional-indicator flags
(🇺🇸), subdivision-flag tag chars, ZWJ, skin-tone, and keycap sequences cleared
as a unit (so "1️⃣" -> "" not "1", while a plain "1"/"#"/"*" survives). Internal
punctuation stays so C#/C++/Node.js remain distinct; emoji-only labels normalize
to empty and the guard's existing empty-option check fails open. Re-exports
normalizePollEchoText with a focused unit test across every emoji class plus a
message-tool integration test for the emoji-suffixed-option case.

* fix(imessage): make poll-echo emoji regex lint-safe

ClawSweeper/CI check-lint flagged no-misleading-character-class: combining
marks (VS16, U+20E3), ZWJ, and skin-tone modifiers are misleading inside a
single character class. Rewrite the emoji strip as an alternation using
property escapes (\p{Regional_Indicator}, \p{Emoji_Modifier}) plus standalone
atoms so the same normalization behavior passes lint. Behavior unchanged;
poll-echo unit + integration tests still green.

* fix(imessage): preserve poll option emoji identity

---------

Co-authored-by: Omar Shahine <[email protected]>
Co-authored-by: Peter Steinberger <[email protected]>
github-actions Bot pushed a commit to Desicool/openclaw that referenced this pull request Jul 2, 2026
…98691)

* fix(imessage): shed emoji anywhere in poll-vote echo match

iMessage native poll options carry a trailing emoji ("Lobster 🦞 ") while the
agent echoes its vote with a leading one ("🦞 Lobster.") under message_tool_only
reply mode. normalizePollEchoText stripped only a leading emoji prefix, so
"lobster 🦞" never matched "lobster" and the redundant text leaked past the
poll_vote_echo guard (shipped in openclaw#98421).

Shed emoji anywhere across every class: pictographic, regional-indicator flags
(🇺🇸), subdivision-flag tag chars, ZWJ, skin-tone, and keycap sequences cleared
as a unit (so "1️⃣" -> "" not "1", while a plain "1"/"#"/"*" survives). Internal
punctuation stays so C#/C++/Node.js remain distinct; emoji-only labels normalize
to empty and the guard's existing empty-option check fails open. Re-exports
normalizePollEchoText with a focused unit test across every emoji class plus a
message-tool integration test for the emoji-suffixed-option case.

* fix(imessage): make poll-echo emoji regex lint-safe

ClawSweeper/CI check-lint flagged no-misleading-character-class: combining
marks (VS16, U+20E3), ZWJ, and skin-tone modifiers are misleading inside a
single character class. Rewrite the emoji strip as an alternation using
property escapes (\p{Regional_Indicator}, \p{Emoji_Modifier}) plus standalone
atoms so the same normalization behavior passes lint. Behavior unchanged;
poll-echo unit + integration tests still green.

* fix(imessage): preserve poll option emoji identity

---------

Co-authored-by: Omar Shahine <[email protected]>
Co-authored-by: Peter Steinberger <[email protected]>
chenyangjun-xy pushed a commit to chenyangjun-xy/openclaw that referenced this pull request Jul 3, 2026
…98691)

* fix(imessage): shed emoji anywhere in poll-vote echo match

iMessage native poll options carry a trailing emoji ("Lobster 🦞 ") while the
agent echoes its vote with a leading one ("🦞 Lobster.") under message_tool_only
reply mode. normalizePollEchoText stripped only a leading emoji prefix, so
"lobster 🦞" never matched "lobster" and the redundant text leaked past the
poll_vote_echo guard (shipped in openclaw#98421).

Shed emoji anywhere across every class: pictographic, regional-indicator flags
(🇺🇸), subdivision-flag tag chars, ZWJ, skin-tone, and keycap sequences cleared
as a unit (so "1️⃣" -> "" not "1", while a plain "1"/"#"/"*" survives). Internal
punctuation stays so C#/C++/Node.js remain distinct; emoji-only labels normalize
to empty and the guard's existing empty-option check fails open. Re-exports
normalizePollEchoText with a focused unit test across every emoji class plus a
message-tool integration test for the emoji-suffixed-option case.

* fix(imessage): make poll-echo emoji regex lint-safe

ClawSweeper/CI check-lint flagged no-misleading-character-class: combining
marks (VS16, U+20E3), ZWJ, and skin-tone modifiers are misleading inside a
single character class. Rewrite the emoji strip as an alternation using
property escapes (\p{Regional_Indicator}, \p{Emoji_Modifier}) plus standalone
atoms so the same normalization behavior passes lint. Behavior unchanged;
poll-echo unit + integration tests still green.

* fix(imessage): preserve poll option emoji identity

---------

Co-authored-by: Omar Shahine <[email protected]>
Co-authored-by: Peter Steinberger <[email protected]>
sheyanmin pushed a commit to sheyanmin/openclaw that referenced this pull request Jul 8, 2026
…98691)

* fix(imessage): shed emoji anywhere in poll-vote echo match

iMessage native poll options carry a trailing emoji ("Lobster 🦞 ") while the
agent echoes its vote with a leading one ("🦞 Lobster.") under message_tool_only
reply mode. normalizePollEchoText stripped only a leading emoji prefix, so
"lobster 🦞" never matched "lobster" and the redundant text leaked past the
poll_vote_echo guard (shipped in openclaw#98421).

Shed emoji anywhere across every class: pictographic, regional-indicator flags
(🇺🇸), subdivision-flag tag chars, ZWJ, skin-tone, and keycap sequences cleared
as a unit (so "1️⃣" -> "" not "1", while a plain "1"/"#"/"*" survives). Internal
punctuation stays so C#/C++/Node.js remain distinct; emoji-only labels normalize
to empty and the guard's existing empty-option check fails open. Re-exports
normalizePollEchoText with a focused unit test across every emoji class plus a
message-tool integration test for the emoji-suffixed-option case.

* fix(imessage): make poll-echo emoji regex lint-safe

ClawSweeper/CI check-lint flagged no-misleading-character-class: combining
marks (VS16, U+20E3), ZWJ, and skin-tone modifiers are misleading inside a
single character class. Rewrite the emoji strip as an alternation using
property escapes (\p{Regional_Indicator}, \p{Emoji_Modifier}) plus standalone
atoms so the same normalization behavior passes lint. Behavior unchanged;
poll-echo unit + integration tests still green.

* fix(imessage): preserve poll option emoji identity

---------

Co-authored-by: Omar Shahine <[email protected]>
Co-authored-by: Peter Steinberger <[email protected]>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

agents Agent runtime and tooling app: ios App: ios app: macos App: macos app: web-ui App: web-ui channel: discord Channel integration: discord channel: telegram Channel integration: telegram cli CLI command changes commands Command implementations docs Improvements or additions to documentation extensions: codex extensions: inworld Extension: inworld extensions: memory-wiki extensions: qa-lab gateway Gateway runtime maintainer Maintainer-authored PR merge-risk: 🚨 message-delivery 🚨 May drop, duplicate, misroute, suppress, or wrongly target messages. P2 Normal backlog priority with limited blast radius. rating: 🦪 silver shellfish Thin PR readiness signal; proof, validation, or implementation needs work. scripts Repository scripts size: XL 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.

2 participants