docs(contacts-plan): mark W7 B1+B2 done + field-verified

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
2026-06-15 16:59:26 -04:00
co-authored by Claude Opus 4.8
parent 1ed64cbede
commit e47ea9c52f
+23 -18
View File
@@ -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<FriendStore>`; 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