mirror of
https://github.com/vitorpamplona/amethyst.git
synced 2026-08-10 00:16:59 +00:00
Address the deep-audit findings across the new Concord code: - H1: stop persisting kind-21059 ephemeral typing wraps as durable notes. EphemeralGiftWrapEvent extends GiftWrapEvent, so every heartbeat was stored forever; drop it once the session has ingested it. - H2: follow()/unfollow() now read the offline backup (entriesWithBackup), so a join racing the async backup load can no longer wipe the joined list. - M1 (banlist): fold to the head (honors a chained unban) then union in authorized editions that aren't ancestors of the head — concurrent bans are healed without resurrecting an on-chain unban (CORD-06 down-only). - M2: reproject only the newly-arrived channel wrap incrementally instead of re-decrypting the whole buffer per message (was O(n^2)); refold only projects newly-folded channels. - M3: cancel a session's old state-watcher before replacing it on a Refounding rebuild (was a coroutine + session leak per rekey). - M4: publish typing/state/members/observed-authors under the lock and make revision/observedAuthors updates atomic; clamp future-dated typing. - M5: notification Concord bypass now requires the community to be one this account has currently joined (mirrors the Marmot guard). - M6: Concord chat honors the "Messages in notifications" toggle. - L1: carry NIP-30 emoji tags on minichat replies, image captions and custom-emoji reactions. - C1: make the composer VM init() idempotent so recomposition can't wipe a picked image or an open suggestion list. - C2/C3: ConcordHome channel rows and unread badges react to the channel's own notes flow instead of the global revision (no stale rows / flicker). - C4: try/finally around mint-invite / create / save so a thrown call can't strand the button disabled. - C5: gate the typing ticker on active heartbeats so an idle channel stops waking a 2s loop. Adds regression tests for concurrent-ban union-heal and unauthorized bans. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01CzJ2Cwo8tg4oZq43oRa3ig