fix(bridge): repair group add/remove-member on macOS 26 (vend fallback + renamed selectors)#185
Conversation
…bugs)
chat-add-member failed with "Could not vend handle" for every address —
including confirmed-reachable iMessage numbers — while chat-create worked.
Two independent bugs stacked in the add path:
1. Handle vend used a one-shot IMHandleWithID: and bailed on nil. That selector
returns nil for many reachable handles; getIMHandlesForID: still resolves them.
create-chat already routes through vendIMHandle() (which tries both + service
match + fallback); add-member took the shortcut. Route add-member through the
same vendIMHandle() helper.
2. The participant-invite selector was renamed on macOS 26 (Tahoe):
inviteParticipantsToiMessageChat:reason: -> inviteParticipants:reason:
(verified via IMChat runtime introspection). respondsToSelector returned NO,
so add failed with "selector not available" once the vend was fixed. Probe
for the current selector, fall back to the old name for older macOS.
chat-remove-member had the identical macOS 26 selector rename
(removeParticipantsFromiMessageChat:reason: -> removeParticipants:reason:) —
fixed the same way so remove doesn't regress the moment add works.
Verified live on macOS 26.0 / imsg 0.13.1 (SIP off, bridge v2): add-member now
returns {added:true} and the participant lands in chat.db; create/rename/status
unaffected.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
|
Codex review: needs real behavior proof before merge. Reviewed July 18, 2026, 11:11 PM ET / July 19, 2026, 03:11 UTC. Summary Reproducibility: no. a high-confidence live reproduction requires a macOS 26 Messages environment. The source path and the contributor's redacted add-member result make the failure mechanism credible, but the checkout cannot independently exercise it. Review metrics: 1 noteworthy metric.
Merge readiness Overall follows the weaker of proof and patch quality, so missing proof can cap an otherwise strong patch. Rank-up moves:
Proof guidance:
Risk before merge
Maintainer options:
Next step before merge
Security Review detailsBest possible solution: Keep one shared handle-vending path and runtime selector probing, then land it after redacted evidence shows successful add and remove on macOS 26 plus a legacy-selector-compatible macOS run when available. Do we have a high-confidence way to reproduce the issue? No; a high-confidence live reproduction requires a macOS 26 Messages environment. The source path and the contributor's redacted add-member result make the failure mechanism credible, but the checkout cannot independently exercise it. Is this the best way to solve the issue? Unclear; reusing the existing vending helper and probing selectors is the narrowest maintainable approach, but the remove path and older-runtime fallback still need direct behavior evidence. AGENTS.md: found and applied where relevant. Codex review notes: model internal, reasoning high; reviewed against ca91c41b47e0. Label changesLabel changes:
Label justifications:
Evidence reviewedWhat 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
|
Co-authored-by: Akshay <186180952+oficiallyAkshay@users.noreply.github.com>
chat-add-memberfails withDylib error: Could not vend handlefor every address — including confirmed-reachable iMessage numbers — whilechat-createworks fine. Root-caused live on macOS 26.0 / imsg 0.13.1 (SIP off, bridge v2) to two stacked bugs in the add path, plus the same class of bug in remove.1. Handle vend used a no-fallback shortcut
handleAddParticipantcalledIMHandleRegistrar'sIMHandleWithID:directly and bailed on nil. That selector returns nil for many reachable handles;getIMHandlesForID:still resolves them.create-chatalready routes through thevendIMHandle()helper (tries both selectors + service match + fallback) — add-member took the shortcut. Fix: route add-member through the samevendIMHandle().2. Participant-invite selector renamed on macOS 26
Once the vend was fixed, add failed with
inviteParticipantsToiMessageChat:reason: not available. IMChat runtime introspection on macOS 26 (Tahoe) shows the selector is nowinviteParticipants:reason:(same(NSArray*, NSInteger)shape). Fix: probe for the current selector, fall back to the old name for older macOS.3. Remove has the identical rename
chat-remove-memberfails withremoveParticipantsFromiMessageChat:reason: not available; the current selector isremoveParticipants:reason:. Fixed the same probe-with-fallback way so remove doesn't regress the instant add works.Verification (live, macOS 26.0 / imsg 0.13.1)
Participant confirmed in chat.db (chat_handle_join).
create/rename/statusunaffected.🤖 Generated with Claude Code