From e47ea9c52fe409fee66d2b29b7e5b8c649fc9d18 Mon Sep 17 00:00:00 2001 From: Mollusk Date: Mon, 15 Jun 2026 16:59:26 -0400 Subject: [PATCH] docs(contacts-plan): mark W7 B1+B2 done + field-verified Co-Authored-By: Claude Opus 4.8 --- docs/contacts-plan.md | 41 +++++++++++++++++++++++------------------ 1 file changed, 23 insertions(+), 18 deletions(-) diff --git a/docs/contacts-plan.md b/docs/contacts-plan.md index 91c5c5b..e36617d 100644 --- a/docs/contacts-plan.md +++ b/docs/contacts-plan.md @@ -148,25 +148,30 @@ address book), though a lightweight mutual-add is optional polish. single persistent `Router`; a room "join" becomes subscribe-a-gossip-topic + spawn-audio-tasks (not rebuild-everything); `NetworkMode` changes require a full endpoint rebuild (acceptable — already "applies on next join"). -- **B1 (persistent network stack) — DONE 2026-06-15, tests-green (⚠️ 2-machine - field test pending; on branch `w7-b1-persistent-endpoint`, not merged).** A - persistent `NetStack` (endpoint + gossip + `Router`) is built once at startup and - reused across calls; a new persistent `AudioRouter` (`src/network/iroh_impl.rs`) - delegates inbound audio links to the active session's `Shared` (`bind` on join, - `clear` on leave), so the single router/endpoint outlive any room session. Join - no longer rebuilds the endpoint; network-mode/identity changes rebuild the stack - when idle, else defer to the next Leave/Join. This is the prerequisite for wiring - the live listener (below). -- **STILL deferred (B2, after B1 merges):** - - Spawn `serve` on the persistent endpoint (via the Router's FRIENDS_ALPN - handler), outside the room session; the rate-limited outbound ping scheduler - (app open + slow refresh); report our current gathering via `restamp`; render - friend status + a **room-name tag + Join** entry (overlaps P5). +- **B1 (persistent network stack) — DONE + 2-machine field-verified 2026-06-15 + (`fdab4e0`, merged).** A persistent `NetStack` (endpoint + gossip + `Router`) is + built once at startup and reused across calls; a new persistent `AudioRouter` + (`src/network/iroh_impl.rs`) delegates inbound audio links to the active session's + `Shared` (`bind` on join, `clear` on leave), so the single router/endpoint outlive + any room session. Join no longer rebuilds the endpoint; network-mode/identity + changes rebuild the stack when idle, else defer to the next Leave/Join. +- **B2 (live listener + friends ownership) — DONE + 2-machine field-verified + 2026-06-15 (`1ed64cb`, merged).** Friends ownership moved into core (shared + `Mutex`; malformed load → read-only, never overwrites = A16 fixed; + commands + `FriendsUpdated`; GUI is a read-only mirror). Live listener = + `FriendsProtocol` `ProtocolHandler` on the persistent Router for `FRIENDS_ALPN` + (NOT `serve` — the router owns `accept()`; shared `exchange()` body), reply policy + via `should_answer` reporting our restamped member ticket. Outbound scheduler + folded into the core loop (`tokio::select!`, 60s, 3s startup delay), **fully dark + while Invisible**, detached per-tick; `note_seen` auto-heal on connect; P5 UI shows + online/offline/in-room+Join. Bootstrap caveat: a friend with no saved addr shows + offline until one ticket-based call seeds `last_addr`. -### P5 — Recents + UI — Medium -Local recents list (cosmetic room tags). Friends-list UI with status dots -("available" / "appears offline"), the discoverable shortcut toggle, and the -join-friend's-room entries from P4. Invisible/discoverable controls in Settings. +### P5 — Recents + UI — UI status/Join DONE 2026-06-15 (B2); recents PENDING +Friends-list UI with status (online / offline / in-room + Join) + Invisible/Normal/ +Discoverable controls in Settings — **DONE (B2)**. **STILL pending:** local recents +list (cosmetic room tags) and a cosmetic **room name/label** (the presence Pong's +`name` is empty until labels exist), plus an **add-friend-from-room** button. ### P6 — Opt-in discovery — Small Wire the *discoverable* state to n0 DNS publish (default off, time-boxed). Lookup