Skip to content

feat: place attached stickers on their bubble - #366

Merged
steipete merged 2 commits into
openclaw:mainfrom
kilianc:sticker-placement
Nov 5, 2026
Merged

steipete merged 2 commits into
openclaw:mainfrom
kilianc:sticker-placement

Conversation

@kilianc

@kilianc kilianc commented Oct 25, 2026 •

Copy link
Copy Markdown
Contributor

Attached stickers can now specify their position, scale, and clockwise rotation through send.sticker and imsg send-sticker. Positions use the target bubble's dimensions; CLI/RPC rotation uses degrees and is converted to the radians stored by Messages. Omitted values preserve the existing centered defaults.

Placement requires an attachment target, finite values within documented bounds, and a helper advertising selectors.stickerPlacement. CLI and RPC reject unsupported helpers before preparing the sticker. The helper validates the complete geometry again before reading the file or dispatching.

Validation: synthetic Objective-C geometry/refusal fixtures, focused Swift sticker CLI/RPC and asset tests, make lint, and documentation tests; independent P0–P2 review. Full macOS and Linux checks run in this PR's GitHub Actions.

No live run happened during this maintainer pass. No messages or stickers were sent; all proof used fixtures and no-send validation. Recipient rendering was not re-tested live.

Thanks @kilianc for the implementation and fixtures.

@kilianc
kilianc requested a review from a team as a code owner October 25, 2026 22:36
@clawsweeper

clawsweeper Bot commented Oct 25, 2026 •

Copy link
Copy Markdown

🦞👀
ClawSweeper picked this up.

Pull request received. I will update this pull request when review starts.

ClawSweeper review complete

ClawSweeper finished reviewing this revision. The review result is being finalized.

View the workflow run.

@clawsweeper clawsweeper Bot added clawsweeper:intake:feature Preliminary submission classification; full source review pending. P3 Low-risk cleanup, docs, polish, ergonomics, or speculative feature. proof: sufficient Contributor real behavior proof is sufficient. proof: 📸 screenshot Contributor real behavior proof includes screenshot evidence. rating: 🦐 gold shrimp Decent PR readiness signal, but merge confidence is limited. status: ⏳ waiting on maintainer Only explicit maintainer approvals or decisions remain; merge is still blocked. and removed clawsweeper:intake:feature Preliminary submission classification; full source review pending. labels Oct 25, 2026
@clawsweeper

clawsweeper Bot commented Oct 25, 2026

Copy link
Copy Markdown

Codex review: blocked before merge.

What this changes

Adds optional position, scale, and rotation controls for stickers attached to message bubbles through the CLI and RPC.

Example: Send arrow.png attached to a message with x=1, y=1, scale=0.4, and rotation=90.

  • Before: The arrow appears centered at natural size, pointing up.
  • After: The smaller arrow appears at the bottom-right corner, pointing right.

Review scores

Measure Result What it means
Overall readiness 🦐 gold shrimp (3/6) Strong recipient-visible proof supports a focused implementation; the unresolved public-feature decision caps the overall rating.
Proof confidence 🦞 diamond lobster (5/6) ✨ media proof bonus Sufficient (screenshot): Real send.sticker RPC calls exercised the changed helper on Apple silicon macOS 27 with a real iMessage recipient; matching database geometry and the inspected screenshot show corner placement, scaling, and clockwise rotation, while released-helper rejection and helper replacement exercise compatibility.
Patch quality 🐚 platinum hermit (4/6) No actionable review findings were identified.

Product

Kind: Feature · Worth it: Needs a maintainer decision · Fix scope: Complete
User problem: Clients cannot position, resize, or rotate an attached sticker as users can in Messages.
Reason: The demonstrated feature has clear value for sticker composition, but its new public parameters require owner direction.

Merge readiness

⛔ Blocked before merge - 1 item remains

Keep open: this PR adds a working sticker-placement capability absent from current main, with no concrete correctness defect found; its new public controls need an owner’s product decision.

Priority: P3
Reviewed head: ba672a3bcaa4233d5cf521331f983234a073e2c8
Owner decision: Required. See Decision needed.

Decision needed

  • Question: Should attached stickers expose optional x, y, scale, and rotation controls with the proposed bounds and defaults?
  • Recommendation: Approve the placement controls: Accept the bounded optional parameters and existing defaults, using the demonstrated recipient behavior as the contract.
  • Why: The capability works in the supplied live proof, but it extends the public CLI and RPC contract without a recorded owner decision.

Before merge

  • Resolve maintainer decision - Resolve the maintainer decision shown above before merge.

Findings

None.

Agent review details

How this fits together

CLI flags and RPC parameters pass through shared placement validation into the injected Messages helper, which writes geometry into the existing sticker transfer before IMCore sends it.

flowchart LR
  A[CLI flags] --> C[Placement validation]
  B[RPC parameters] --> C
  C --> D[Helper capability check]
  D --> E[Messages helper]
  E --> F[Sticker transfer geometry]
  F --> G[Recipient Messages bubble]
Loading

Technical review

Best possible solution:

If the sticker owners approve the public controls and bounds, retain this focused extension of the existing sticker pipeline.

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

Current-main source establishes the limitation directly through fixed sticker geometry and absent placement parameters; no target code was executed during this read-only review.

Is this the best way to solve the issue?

The implementation uses the existing CLI, RPC, helper, and transfer owners, shares placement validation, and checks older helpers before staging rather than silently losing the requested geometry.

AGENTS.md: found and applied where relevant.

Codex review notes: model internal, reasoning medium; reviewed against 41de9c8b58ff.

Provenance checked

  • Native sticker geometry changes intended behavior with a stated reason (10c91b1: The original implementation retained proven centered geometry and a fixed preview width while target-layout selectors remained uncertain; the PR preserves both defaults and supports explicit geometry with native-format observations and recipient proof.)
  • Strict RPC parameter boundary keeps the original intent (8c90c50: fix(rpc): reject malformed requests #214 centralized strict named-parameter validation to reject coercions, unknown keys, and ambiguous targets before side effects; the new numeric decoder preserves that boundary.)
  • Helper ownership and capability reporting keeps the original intent (cb58dec: refactor: organize the injected helper into private feature modules #296 kept feature fragments in one translation unit with shared ownership and existing selector fallbacks; placement remains within those owners and derives its capability from the existing attach requirements.)

Testing

Proof path: shipped entry point.

Security

None.

Evidence

What I checked:

Likely related people:

  • Omar Shahine: Raw commit 10c91b1 adds Sources/imsg/Commands/StickerCommand.swift:7 relative to its recorded parents. This identifies author metadata, not feature responsibility or a PR merger. (role: source-line author; confidence: high; commits: 10c91b10924e; files: Sources/imsg/Commands/StickerCommand.swift)
  • Peter Steinberger: Raw commit 8c90c50 adds Sources/imsg/RPCServer+StickerHandlers.swift:6 relative to its recorded parents. This identifies author metadata, not feature responsibility or a PR merger. (role: source-line author; confidence: high; commits: 8c90c502687f; files: Sources/imsg/RPCServer+StickerHandlers.swift)

Review metrics

Metric Value Why it matters
Change distribution Production +215/-11; tests +251/-0; documentation, skill, and changelog +44/-7. Growth stays within placement parsing, validation, capability negotiation, native geometry, and corresponding coverage.

Labels

Label changes:

  • add P3: Optional placement improves an advanced sticker workflow while preserving existing sends.
  • add proof: sufficient: Contributor real behavior proof is sufficient.
  • add proof: 📸 screenshot: Contributor real behavior proof includes screenshot evidence.
  • add rating: 🦐 gold shrimp: Overall readiness is 🦐 gold shrimp; proof is 🦞 diamond lobster and patch quality is 🐚 platinum hermit.
  • add status: ⏳ waiting on maintainer: Only explicit maintainer approvals or decisions remain; merge is still blocked.

Label justifications:

  • P3: Optional placement improves an advanced sticker workflow while preserving existing sends.
  • rating: 🦐 gold shrimp: Overall readiness is 🦐 gold shrimp; proof is 🦞 diamond lobster and patch quality is 🐚 platinum hermit.
  • status: ⏳ waiting on maintainer: Only explicit maintainer approvals or decisions remain; merge is still blocked.
  • proof: sufficient: Contributor real behavior proof is sufficient.
  • proof: 📸 screenshot: Contributor real behavior proof includes screenshot evidence.

Rating scale

6/6 🦀 challenger crab · 5/6 🦞 diamond lobster · 4/6 🐚 platinum hermit · 3/6 🦐 gold shrimp · 2/6 🦪 silver shellfish · 1/6 🧂 unranked krab. Overall follows the weaker of proof and patch quality; ✨ marks media proof (a screenshot, video, or linked artifact) that directly shows the changed behavior.

Workflow

ClawSweeper edits this one comment on every review. Comment @clawsweeper re-review for a fresh review only. Repair and merge execution lanes are retired.

Reviewed October 25, 2026, 6:52 PM ET / 22:52 UTC.

kilianc added a commit to kilianc/imsg that referenced this pull request Oct 26, 2026
A build of 0.19.1 with openclaw#365 and openclaw#366, and the fix that reports pre-dispatch sticker and attachment refusals as not started. Its own version makes imsg launch replace a running fork.1 helper.
steipete and others added 2 commits November 5, 2026 10:21
Expose bounded position, scale, and rotation through CLI and RPC, preserve the existing defaults, and require placement capability before staging. Validate helper geometry before dispatch.

Proof uses synthetic fixtures only; no live stickers or messages were sent.

Co-authored-by: Kilian Ciuffolo <kilian.ciuffolo@gmail.com>
@steipete
steipete merged commit 79b86db into openclaw:main Nov 5, 2026
7 of 8 checks passed
steipete added a commit that referenced this pull request Nov 5, 2026
Prepare imsg 0.21.0 for mentions, sticker placement, explicit Name & Photo setters, and the accumulated fixes. Preserve existing changelog entries and contributor credit, synchronize generated version metadata, and document that #365, #366, and #377 have fixture proof only with no live sends or identity changes.

Validation: all 316 existing changelog bullets preserved; version metadata agrees; docs tests pass; independent review has no actionable P0–P2 findings; macOS/Linux CI and CodeQL passed at 8fa910a.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

P3 Low-risk cleanup, docs, polish, ergonomics, or speculative feature. proof: 📸 screenshot Contributor real behavior proof includes screenshot evidence. proof: sufficient Contributor real behavior proof is sufficient. rating: 🦐 gold shrimp Decent PR readiness signal, but merge confidence is limited. status: ⏳ waiting on maintainer Only explicit maintainer approvals or decisions remain; merge is still blocked.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants