mirror of
https://github.com/vitorpamplona/amethyst.git
synced 2026-08-09 16:14:40 +00:00
Three-reviewer pass over the branch. Fixes, most-severe first: HIGH — channel-instance swap froze open screens. The subclass-upgrade design replaced a group's RelayGroupChannel with a Buzz-typed instance on dialect discovery, but screens/feeds/composers capture the instance for life, so all of them kept rendering the orphan (frozen feed; composer stuck on kind 9). Removed BuzzWorkspaceChannel entirely; RelayGroupChannel is a single stable type again. Buzz-only overlay state (edit + canvas) now lives in BuzzWorkspaceStates, a registry keyed by the channel UUID — dialect discovery no longer touches object identity. The swap also silently dropped all relay-signed state (name, members, admin status, pins, threads) and demoted the confirmed host; gone with the swap. HIGH — wrong thread-root got messages relay-rejected AFTER the draft was destroyed. A reply to a direct reply derived root=parent (buzzThreadRoot null on a collapsed reply), which Buzz's ancestry validator rejects. Fallback is now buzzThreadRoot() ?: buzzThreadReply() ?: parent.id. Also: minichat (kind 1111) replies in Buzz channels are relay-rejected, so they're gated off for Buzz relays. HIGH — pre-create defeated stray-redirect and marked the dialect off unverified input. consumeBuzzTimelineEvent no longer pre-creates the channel; attachment goes through the shared NIP-29 path (with its stray protection), and the dialect is marked only off a VERIFIED event (markBuzzIfVerified) — a hostile relay can no longer flip what the composer sends. MEDIUM — engram tombstone divergence: a memory body missing `value` decoded as a null tombstone (a deletion) where Buzz rejects it. `value` is now required (no default); added NIP-AE slug-grammar validation. Pinned by test. MEDIUM — unbounded edit overlay: pruneOldMessagesChannel now prunes overlay entries for reaped messages. Overlay is keyed by channel id so own offline edits (null relay) apply too. Also: 40002 inbound reply linkage in computeReplyTo (we emit thread markers we couldn't read); registered-but-unhandled 40901/40902/48001 now consumed; unconditional Buzz-kind widening (kills the history-cursor-skip); stream mention dedup; persona empty-list omission for content-hash parity; thread-marker positional guard; edit-note-loading blank-row fallback. Full amethyst unit suite + affected quartz suites green. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01J8KBSw6smQRyXLiWHeDsZ8