4f5665a2bd
P1 fixes from compound engineering review:
- Fix subscription churn flooding relays: DisposableEffect keyed on
feedMode/noteId (stable) instead of feedState (changes every 250ms)
- BoundedLargeCache: AtomicInteger counter replaces O(n)
ConcurrentSkipListMap.size() — eliminates 50K traversal per event
- Non-atomic updateHealth(): use MutableStateFlow.update{} for
atomic compare-and-set instead of read-modify-write race
P2 fixes:
- DesktopThreadFilter: LinkedHashSet for O(1) containment checks,
down from O(R²) with MutableList
- consumeContactList: createdAt guard ensures newer events always win
- consumeEvent error logging: include event ID and relay URL
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>