Files
amethyst/docs/plans
nrobi144 9284e12e86 feat(desktop): Web-of-Trust score badges + amy wot verbs
Adds a friends-of-friends trust score on every user avatar in Desktop
feeds, threads, profile headers, and repost overlays. For pubkey X the
score is the count of accounts in the active user's follow set who also
follow X — Gossip / Snort convention. v1 is display-only; no threshold
filtering.

Data flow
- `commons/wot/WoTService` — sparse `SnapshotStateMap<HexKey, Int>` +
  reverse index + per-follower snapshot for diff-based updates.
  Single-writer coroutine (Channel<Op> → `Snapshot.withMutableSnapshot`)
  serializes all mutations. Cap at 5000 follows/event blocks DoS via
  hostile kind-3s. Guardrail at 2000 follows/account skips WoT for
  mega-accounts.
- `DesktopIAccount.wotService` — per-account instance, matches
  `Kind3FollowListState` / `BookmarkListState` conventions.
- `Main.kt` binds `localCache.accountPubkey`, collects
  `localCache.contactListEvents` → `applyKind3`, collects
  `localCache.followedUsers` → `onFollowSetChange` +
  `subscriptionsCoordinator.loadKind3Batched(...)` with
  `onEose = markReadyOnce`. 2 s fallback timeout guarantees badge
  visibility even if index relays never EOSE.
- `FeedMetadataCoordinator.loadKind3Batched(pubkeys, onEose)` — chunks
  authors into ≤100 per Filter within one subscription. Matches
  nostr-rs-relay defaults.

UI
- `commons/ui/components/UserAvatar` gets an optional
  `badge: @Composable BoxScope.() -> Unit`. Android call sites pass
  null (no compile-time coupling to Desktop-only tooltip APIs).
- `desktopApp/.../ui/note/WoTBadge` — Material3 `TooltipBox` +
  `PlainTooltip` (multiplatform-ready, keyboard/screen-reader a11y).
  `rememberTooltipState(isPersistent = true)` fixes the
  vanish-too-fast desktop default.
- `desktopApp/.../ui/note/WoTBadgedAvatar` — drop-in replacement for
  `UserAvatar` that overlays the badge when
  `LocalWoTService != null && LocalWoTReady && pubkey !in LocalSpamExemptKeys`.
  Score read is a plain `service.scores[userHex] ?: 0` — snapshot
  system tracks per-key, so avatars only recompose when their own
  score changes.
- Call-site migration at 4 v1 surfaces: NoteCard header (covers feed /
  thread / bookmarks / search / QuotedNoteEmbed via NoteCard),
  FeedNoteCard repost header (2 avatars), UserProfileScreen header
  (2 sizes).

Amy verbs
- `amy wot get <pubkey|npub> [--json]` — hydrates a WoTService from the
  local FsEventStore, prints score for target pubkey.
- `amy wot list [--threshold N] [--limit K] [--json]` — sorted score
  list.
- `amy wot sync [--timeout N]` — batch-fetches kind-3 for the active
  follow set from outbox/inbox relays, persists to the event store.

Tests + docs
- 14 unit tests: `WoTServiceTest` covers happy path, sparse map,
  self/follower exclusion, kind-3 churn diff, guardrail, event cap,
  ready gate, clear.
- Manual testing sheet with 17 scenarios at
  `desktopApp/plans/2026-07-01-wot-score-manual-testing-sheet.md`.
- Plan at `docs/plans/2026-07-01-feat-desktop-wot-score-plan.md`.

Prerequisite `DesktopLocalCache.consumeContactList` scoping fix landed
as a separate commit.
2026-07-02 18:03:47 +03:00
..

docs plans (frozen legacy)

Audited 2026-06-30. 52 plans: 48 shipped (archived), 2 in-progress, 2 abandoned.

This is the frozen global plans folder — new plans go in the owning module's plans/ folder instead.

In progress

Plan Summary
2026-04-29-perf-viewport-aware-metadata-loading-plan.md Viewport-aware feed metadata loading — base preloader/rate-limiter infra exists but the LazyListState/snapshotFlow viewport selection isn't clearly wired.
2026-06-18-fix-desktop-macos-bunker-relogin-plan.md macOS cold-boot bunker re-login — PR 1 defense-in-depth shipped, but the actual root cause is still open/unidentified.

Abandoned

Plan Summary
2026-04-23-feat-desktop-relay-config-single-source-plan.md Single DesktopRelayConfig class — never built; relay state landed as DesktopRelayCategories/LocalRelayCategories instead.
2026-05-18-fix-macos-vlc-bundled-discovery-plan.md macOS bundled-VLC setenv discovery fix — moot after VLC/VLCJ was removed entirely in the kdroidFilter migration.

Archived (shipped)

Plan Summary
archive/2026-03-05-fix-nip46-relay-isolation-and-init-plan.md NIP-46 remote signer wired into desktop with dedicated relay isolation and pool-init fixes.
archive/2026-03-05-nip46-bunker-login-deepened.md Desktop bunker:// / nostrconnect:// login over quartz NostrSignerRemote.
archive/2026-03-05-nip46-improvements-plan.md Post-MVP NIP-46 items — auth_url handling and connect validation in quartz.
archive/2026-03-05-nip46-tdd-tests-plan.md TDD tests reproducing the three NIP-46 relay-isolation bugs.
archive/2026-03-10-feat-desktop-advanced-search-plan.md Desktop advanced search with query operators and form UI (AdvancedSearchPanel/SearchQuery).
archive/2026-03-16-desktop-media-manual-testing-plan.md Manual-testing sheet for the desktop media stack (all rows PASS).
archive/2026-03-16-feat-desktop-media-full-parity-plan.md Desktop media full parity — images, upload, gallery, video/audio playback.
archive/2026-03-18-feat-desktop-cache-navigation-persistence-plan.md Cache-centric desktop architecture for navigation persistence (DesktopLocalCache).
archive/2026-03-18-feat-desktop-dm-encrypted-media-plan.md NIP-17 encrypted DM media send/receive in desktop chat.
archive/2026-03-19-feat-deck-messages-stacked-layout-plan.md Stacked messages layout for narrow deck columns.
archive/2026-03-20-feat-remote-signer-loading-error-ux-plan.md Remote-signer loading/error UX — commons SigningState holder.
archive/2026-03-22-feat-clean-cache-single-source-of-truth-plan.md Desktop feeds migrated to cache-centric DesktopFeedViewModel + FeedContentState.
archive/2026-03-24-feat-article-highlights-notes-plan.md Desktop article highlights & note-taking (NIP-84) UI + store.
archive/2026-03-24-feat-weakref-cache-state-extraction-plan.md WeakReference cache (LargeSoftCache) + state-class extraction to commons.
archive/2026-03-24-long-form-reads-manual-testing.md Manual-testing sheet for the long-form Reads feature.
archive/2026-03-30-feat-app-drawer-v1a-plan.md Desktop App Drawer with categories and search (AppDrawer.kt).
archive/2026-03-30-feat-desktop-tor-support-plan.md Embedded Tor support on desktop (DesktopTorManager + kmp-tor).
archive/2026-04-01-fix-tor-traffic-leaks-plan.md Fail-closed Tor-aware client in DesktopHttpClient — no direct connections when Tor ON.
archive/2026-04-02-feat-tor-toggle-restart-ux-plan.md Tor toggle restart UX — confirmation dialog + appRestartKey app rebuild.
archive/2026-04-17-feat-customizable-nav-bar-v1b-plan.md Customizable nav bar — PinnedNavBarState (pin/unpin/reorder).
archive/2026-04-17-feat-workspace-management-ux-plan.md Workspace management UX — CRUD via WorkspaceManager + App Drawer tabs.
archive/2026-04-17-feat-workspaces-v1c-plan.md Named layout-preset workspaces with layout-mode switching.
archive/2026-04-17-test-desktop-distribution.md Test matrix for multi-platform desktop distribution (DMG/MSI/DEB/RPM/AppImage).
archive/2026-04-20-feat-relay-power-tools-plan.md Relay dashboard screen + compose relay picker.
archive/2026-04-21-feat-relay-config-parity-plan.md Relay config parity — NIP-65/DM/Search/Blocked category editors.
archive/2026-04-21-feat-relay-subscription-wiring-plan.md Wire relay-config categories into desktop subscriptions (superseded by 04-22 deepened version).
archive/2026-04-22-feat-relay-persistence-counts-per-screen-picker-plan.md Relay config persistence, correct counts, per-screen relay editors.
archive/2026-04-22-feat-relay-subscription-wiring-plan.md Relay-category subscription wiring via LocalRelayCategories CompositionLocal.
archive/2026-04-22-nip-audio-rooms-draft.md NIP draft for audio-rooms join (moq-lite Lite-03), implemented in :nestsClient.
archive/2026-04-22-pure-kotlin-quic-webtransport-plan.md Pure-Kotlin QUIC + HTTP/3 + WebTransport — the :quic module.
archive/2026-04-23-feat-desktop-multi-account-support-plan.md Desktop multi-account support — AccountSwitcherDropdown + encrypted storage.
archive/2026-04-27-fix-deb-libicu-dependency-plan.md Relax libicu dependency in .deb packages via post-process script + CI wiring.
archive/2026-04-28-multi-account-testing-sheet.md Testing sheet for desktop multi-account.
archive/2026-05-04-fix-bunker-timeouts-and-decryption-plan.md Fix bunker timeouts + broken decryption (BunkerResponseDecrypt + same-id retry).
archive/2026-05-14-fix-account-security-hardening-plan.md Desktop account security hardening — encrypted accounts.json.enc, keychain secrets.
archive/2026-05-22-feat-desktop-note-action-bar-ux-plan.md Note action bar — long-press details + right-click customize.
archive/2026-05-22-fix-desktop-note-action-counters-and-quote-plan.md Fix reactive counters, quote boost, and boost detail popup.
archive/2026-05-26-feat-desktop-profile-editing-plan.md Desktop profile editing full parity (EditProfileScreen + EditProfileFields).
archive/2026-05-28-feat-desktop-search-spotlight-plan.md Search spotlight overlay (Cmd+F) + unified feed header bar.
archive/2026-05-28-feat-desktop-visual-personality-plan.md Desktop visual personality overhaul (theme, shimmer, hover, shortcuts).
archive/2026-05-28-fix-feed-header-search-ux-plan.md Feed header bar layout + inline search UX fixes.
archive/2026-06-02-feat-new-posts-chip-desktop-feed-plan.md "New posts" chip for the desktop feed (commons NewPostsChip + state).
archive/2026-06-02-fix-desktop-feed-review-findings-plan.md Resolve 5 review findings on PR #3124 desktop feed UI refresh.
archive/2026-06-05-feat-profile-replies-section-plan.md Desktop profile Replies tab (DesktopProfileFeedFilter).
archive/2026-06-05-fix-desktop-feed-reply-context-plan.md Desktop feed reply-context rendering (commons ReplyContext).
archive/2026-06-10-feat-unhealthy-relay-review-plan.md Unhealthy relay review banner + sheet (RelayHealthStore + UnhealthyRelayBanner).
archive/2026-06-11-feat-replace-vlcj-with-kdroidfilter-plan.md Replace vlcj with kdroidFilter ComposeMediaPlayer + JCodec/Jaffree.
archive/2026-06-11-vlcj-replacement-testing-sheet.md Manual-testing sheet for the vlcj → kdroidFilter migration.