mirror of
https://github.com/vitorpamplona/amethyst.git
synced 2026-08-09 08:04:45 +00:00
A group-scoped content event (kind-9 chat, poll, kind-11 thread) is keyed to its RelayGroupChannel by the relay that served it, because a NIP-29 event doesn't carry its host relay. That's correct for the group's own host-pinned subscriptions, but a message resolved from a NON-host relay -- e.g. a quoted kind-9 fetched by id during missing-event resolution -- was filed under GroupId(groupId, strangerRelay), a channel the group's screens never read, so the message silently vanished (the serving-relay hazard). LocalCache.attachToRelayGroupIfScoped / attachThreadToRelayGroupIfScoped now, when no channel is keyed to the serving relay, redirect the stray to the group's single confirmed host channel via redirectStrayRelayGroupContent, keyed off RelayGroupChannel.hasRelaySignedState(). A phantom channel never has relay-signed state, so the redirect can only ever land on a real host, never on another phantom -- the fix is strictly safe and the common host-pinned arrival stays an untouched O(1) fast path (the scan runs only on the rare no-channel-for-serving-relay miss). Also add the cache-prune gap-fill can't-miss test: drive the production RelayLoadingCursors down a real relay, rewindTo below the window, and confirm the pruned band re-loads with no gap. Tests: RelayGroupContentRoutingTest (pure router + the channel signal); RelayGroupHistoryPagingRelayTest gains the rewind reload case. The LocalCache wiring is unit-covered at the router level but still device- untested end-to-end (flagged in the test plan). Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01CDK63toGbE7DQxKxrQnhMU