mirror of
https://github.com/vitorpamplona/amethyst.git
synced 2026-10-06 03:38:23 +00:00
The chip required the sender and the author to publish the same protocol, capped the row at two, and shipped opt-out. All three go. Symmetry was a proxy for "I can actually pay this way", and it is the wrong proxy: paying a Monero address needs a wallet, not a published address of one. What the sender happens to say about themselves never determined whether the hand-off would work — the installed-app probe does, and it was already running. So `PayToRailMatcher.match` no longer takes the sender's list, `selectFor` drops the `senderTargets` gate, and `canOpen` becomes the substantive filter with the rest as preconditions. Dropping symmetry moves the probe set. It used to be the sender's own target list, which is why `warm()` could replace the cache wholesale; it is now the targets of whichever author's picker is open. So `warm()` merges instead of replacing — replacing would evict what was learned about every other author the moment a second picker opened — and the `LaunchedEffect` keys on the author's observed kind:10133 rather than on `paymentTargetsState`. MAX_CHIPS existed because symmetry could pass several protocols at once with nothing else narrowing them. Discovery narrows them: a target with no installed app never reaches the picker, so the cap was bounding a row that discovery already bounds, and an arbitrary two-chip truncation would now hide a target the user can genuinely pay. `showPayToZapChip` defaults on for the same reason. The opt-out was justified by fiat handles carrying legal names, but the chip only ever surfaces a target its author chose to publish, to a device that can already open it. The setting's copy said "when you and the author both publish the same payment method" and the toggle read "Offer shared payment methods" — both described the gate that no longer exists, so both are rewritten. Tests follow the contract rather than the old shape: symmetry cases become capability cases, `everyOpenableTargetIsOfferedWithNoCap` replaces the cap assertion, and one new case pins the inverse of the rule that was removed — a target the sender does not publish is still offered. The lazy-read test keeps its guarantee, minus the sender-empty branch that no longer exists. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01JXKZeV6FNhXF9BBjgEtfvS