Skip to content

feat: send arbitrary emoji tapbacks#180

Open
markxiong0122 wants to merge 1 commit into
openclaw:mainfrom
markxiong0122:feat/emoji-tapback-send
Open

feat: send arbitrary emoji tapbacks#180
markxiong0122 wants to merge 1 commit into
openclaw:mainfrom
markxiong0122:feat/emoji-tapback-send

Conversation

@markxiong0122

Copy link
Copy Markdown

Summary

  • add --emoji and --remove support to bridge-backed imsg tapback
  • accept the dedicated emoji parameter over JSON-RPC without routing it through the classic six-kind whitelist
  • send with IMEmojiTapback + IMTapbackSender, using the target message-part item when available and the guid/range initializer as fallback
  • advertise rpc_features:["tapback.emoji"] separately from the injected bridge selector so clients can require both halves

Verification

  • make build-dylib
  • make test (478 tests, including RPC emoji forwarding + status feature marker)
  • live macOS 26 Messages.app gate through JSON-RPC: 💀 add appeared as type:"custom", exact emoji matched, associated_message_type=2006; explicit remove verified gone

@clawsweeper clawsweeper Bot added proof: sufficient Contributor real behavior proof is sufficient. rating: 🦐 gold shrimp Decent PR readiness signal, but merge confidence is limited. status: ⏳ waiting on author ClawSweeper has contributor-facing work open and is waiting for author action. P2 Normal priority bug or improvement with limited blast radius. merge-risk: 🚨 compatibility 🚨 Merging this PR could break existing users, config, migrations, defaults, or upgrades. labels Jul 15, 2026
@clawsweeper

clawsweeper Bot commented Jul 15, 2026

Copy link
Copy Markdown

Codex review: needs maintainer review before merge. Reviewed July 19, 2026, 4:36 AM ET / 08:36 UTC.

Summary
The PR adds arbitrary emoji tapback add/remove support through the CLI, JSON-RPC bridge, native Messages bridge, capability status output, and focused tests.

Reproducibility: not applicable. This PR adds a new capability rather than fixing an established current-main bug; its reported live macOS run is verification evidence.

Review metrics: 2 noteworthy metrics.

  • Changed surface: 7 files affected; 192 additions, 40 deletions. The feature crosses CLI, RPC, native bridge, status output, and tests, so its contract must remain consistent across layers.
  • Focused regression coverage: 1 custom-emoji RPC forwarding test added. It verifies that the custom path does not use the classic reaction type.

Merge readiness
Overall: 🐚 platinum hermit
Proof: 🦞 diamond lobster
Patch quality: 🐚 platinum hermit
Result: ready for maintainer review.

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

Rank-up moves:

  • [P2] Confirm the selector-gated custom-tapback path against the supported macOS range before merge.

Risk before merge

  • [P2] The new selector-gated private-framework send path and its initializer fallback may behave differently across supported macOS releases; maintainers should confirm that the existing standard reaction path remains unaffected.

Maintainer options:

  1. Confirm selector-gated compatibility (recommended)
    Review the private-framework availability checks and both sender initializer paths against the supported macOS range before merging.
  2. Accept the detected-platform scope
    Merge with the capability marker as the caller gate if maintainers intentionally support arbitrary emoji only where the detected selectors are available.

Next step before merge

  • [P2] No discrete correctness repair remains after the alias-path correction; a human should make the private-framework compatibility decision before merge.

Security
Cleared: The reviewed diff adds private framework calls but no new dependency, workflow, secret, permission, or supply-chain surface.

Review details

Best possible solution:

Land the focused custom-tapback capability only after confirming that selector-gated fallback behavior is compatible across the supported macOS range and retains all classic reaction aliases.

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

Not applicable: this PR adds a new capability rather than fixing an established current-main bug; its reported live macOS run is verification evidence.

Is this the best way to solve the issue?

Yes, conditionally: routing only explicit emoji values through the custom path preserves existing reaction and kind normalization, which is narrower than replacing classic reactions.

AGENTS.md: found and applied where relevant.

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

Label changes

Label changes:

  • add rating: 🐚 platinum hermit: Overall readiness is 🐚 platinum hermit; proof is 🦞 diamond lobster and patch quality is 🐚 platinum hermit.
  • add status: 👀 ready for maintainer look: ClawSweeper has no concrete contributor-facing blocker left for this PR. Sufficient (live_output): The PR body reports a real macOS 26 Messages.app JSON-RPC add-and-remove run with observed custom-tapback metadata, and the supplied context marks that proof sufficient.
  • remove rating: 🦐 gold shrimp: Current PR rating is rating: 🐚 platinum hermit, so this older rating label is no longer current.
  • remove status: ⏳ waiting on author: Current PR status label is status: 👀 ready for maintainer look.

Label justifications:

  • P2: This is a bounded user-facing messaging enhancement without evidence of an urgent existing-user regression.
  • merge-risk: 🚨 compatibility: The PR adds selector-gated calls to private Messages framework classes and initializer fallbacks that can vary by macOS version.
  • rating: 🐚 platinum hermit: Overall readiness is 🐚 platinum hermit; proof is 🦞 diamond lobster and patch quality is 🐚 platinum hermit.
  • status: 👀 ready for maintainer look: ClawSweeper has no concrete contributor-facing blocker left for this PR. Sufficient (live_output): The PR body reports a real macOS 26 Messages.app JSON-RPC add-and-remove run with observed custom-tapback metadata, and the supplied context marks that proof sufficient.
  • proof: sufficient: Contributor real behavior proof is sufficient. The PR body reports a real macOS 26 Messages.app JSON-RPC add-and-remove run with observed custom-tapback metadata, and the supplied context marks that proof sufficient.
Evidence reviewed

What I checked:

  • Standard alias path preserved: The RPC handler only takes the custom path for a nonempty explicit emoji; otherwise it derives the classic reaction from reaction or kind, addressing the prior alias-routing concern. (Sources/imsg/RPCServer+BridgeMessageHandlers.swift:347, 0fa09c993fdd)
  • Focused custom-emoji test: The added RPC test asserts that custom emoji and removal state reach the bridge without a legacy reactionType, covering the new contract boundary. (Tests/imsgTests/RPCBridgeMessageHandlersTests.swift:226, 0fa09c993fdd)
  • Live behavior evidence: The PR body reports a macOS 26 Messages.app JSON-RPC run where a skull emoji appeared as a custom tapback and explicit removal removed it; the supplied context marks proof as sufficient. (0fa09c993fdd)
  • Compatibility-sensitive bridge path: The patch detects IMEmojiTapback and IMTapbackSender selectors and chooses a message-part initializer with a GUID/range fallback, so supported macOS-version behavior needs merge-time scrutiny. (Sources/IMsgHelper/IMsgInjected.m:950, 0fa09c993fdd)

Likely related people:

  • markxiong0122: Authored the proposed cross-layer custom-tapback implementation and the focused RPC coverage under review. (role: implementation author; confidence: high; commits: 0fa09c993fdd; files: Sources/IMsgHelper/IMsgInjected.m, Sources/imsg/RPCServer+BridgeMessageHandlers.swift, Sources/imsg/Commands/BridgeMessagingCommands.swift)
  • unattributed current-main bridge owner: The checkout inspection command was unavailable in this read-only environment, so current-main provenance could not be safely attributed beyond the supplied PR context. (role: adjacent owner; confidence: low; files: Sources/IMsgHelper/IMsgInjected.m, Sources/imsg/RPCServer+BridgeMessageHandlers.swift)
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.
Review history (5 earlier review cycles)
  • reviewed 2026-07-15T06:06:48.012Z sha 0fa09c9 :: needs changes before merge. :: [P1] Preserve standard emoji aliases before taking the custom path
  • reviewed 2026-07-15T07:16:25.923Z sha 0fa09c9 :: needs changes before merge. :: [P1] Preserve standard emoji aliases before taking the custom path
  • reviewed 2026-07-15T08:32:51.361Z sha 0fa09c9 :: needs changes before merge. :: [P1] Preserve standard emoji aliases before taking the custom path
  • reviewed 2026-07-15T09:22:22.064Z sha 0fa09c9 :: needs changes before merge. :: [P1] Preserve standard emoji aliases before taking the custom path
  • reviewed 2026-07-17T08:35:23.383Z sha 0fa09c9 :: needs changes before merge. :: [P1] Preserve standard emoji aliases before taking the custom path

@clawsweeper clawsweeper Bot added 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. and removed rating: 🦐 gold shrimp Decent PR readiness signal, but merge confidence is limited. status: ⏳ waiting on author ClawSweeper has contributor-facing work open and is waiting for author action. labels Jul 19, 2026
@clawsweeper

clawsweeper Bot commented Jul 19, 2026

Copy link
Copy Markdown

ClawSweeper status: review started.

I am starting a fresh review of this pull request: feat: send arbitrary emoji tapbacks This is item 1/1 in the current shard. Shard 0/1.

This placeholder means the worker is alive and reading the current context. I will edit this same comment with the actual review when the claws are done clicking.

Crustacean status: shell secured, claws on keyboard, evidence pebbles being sorted.

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

Labels

merge-risk: 🚨 compatibility 🚨 Merging this PR could break existing users, config, migrations, defaults, or upgrades. P2 Normal priority bug or improvement with limited blast radius. proof: sufficient Contributor real behavior proof is sufficient. 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.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant