mirror of
https://github.com/vitorpamplona/amethyst.git
synced 2026-08-10 00:16:59 +00:00
A memory audit found the global strong-reference RumorHosts index could never be kept in sync with LocalCache.notes, which holds WeakReferences: seven prune paths (pruneExpiredEvents — rumors inherit the seal's expiration tag — hidden/old-message/replaceable/reaction/hidden-event prunes, and cleanMemory) plus silent GC eviction dropped rumor notes without clearing their entries, clear() had no callers (logout, account removal, memory trim), and orphaned stubs accumulated unbounded. The stub now lives on the Note (Note.rumorHost): whatever removes or garbage-collects the note frees the stub, closing every leak path by construction. Cost is one nullable reference per Note (~200-400 KB at a 50k-note steady state) versus the index's per-entry map overhead plus unbounded orphan growth. All consumers already held the Note: toNEvent, Account.broadcast, deleteEnvelopes, removeIfWrap, chat pruning, and the ingestion pipeline. RumorHosts is deleted. Also fixes the desktop regression the audit surfaced: the desktop gift-wrap handler now records the wrap on the rumor note, so desktop nevent citations of chat messages point at the wrap id again instead of exposing the private rumor id. https://claude.ai/code/session_01B39MQmrT3dz137nfpXABvo