diff --git a/docs/HANDOFF-2026-06-20-mesh-netbird.md b/docs/HANDOFF-2026-06-20-mesh-netbird.md index c92c9479..4f78524f 100644 --- a/docs/HANDOFF-2026-06-20-mesh-netbird.md +++ b/docs/HANDOFF-2026-06-20-mesh-netbird.md @@ -39,8 +39,33 @@ claude-login.html, chown 1000:1000, restart, verify sha256+health). Recreate fro `2679725907` = federation_peer_contact_id(.120 pubkey 535fb91f…), name "Archy-X250-EXP". It's a **duplicate-contact SURFACING** problem (user confirmed doubles). -## TODO (resume here) -### #12 Fix duplicate mesh contacts ← user chose this NEXT +## SESSION 2 PROGRESS (2026-06-20, code-complete — NOT yet deployed; user held deploy) +All committed to local `main`; NOT pushed to gitea-vps2/origin yet, NOT sideloaded. +- **#12 dup contacts DONE** (`f92e442b`, +3 unit tests pass). Backend `group_peer_twins()` + helper (mesh/mod.rs) dedups by `arch_pubkey_hex`, radio twin = canonical send id, unions + messages; wired into conversations.list/messages + mesh.contacts-list. **KEY FINDING:** + conversations.list/messages have NO frontend consumer — the live chat list renders the + *frontend* merge `mergedPeers` (Mesh.vue), which matched twins by the `Archy-z6Mk…` advert + prefix that the device RENAME broke. Real fix = merge by `arch_pubkey_hex` (now exposed on the + MeshPeer TS type). Should also clear `.120→.89` and likely **#5** (Arch Mobile on .116, same bug). +- **Companion crash diagnostic SHIPPED** (`b3633ec5`): main.ts global handler now shows the REAL + error + keeps a 25-entry `window.__archyErrors` ring buffer + catches async/unhandledrejection. + Still need to deploy + repro on the optiplex node (read `window.__archyErrors` via chrome://inspect) + to get the actual throw. User says LAN/mobile-browser fine → Tailscale-WebView-specific. +- **#3 dual-ecash pay-for-file DONE** (`8f06d88f`, compiles): payer tries Cashu→Fedimint, seller + accepts both (verify_and_receive_payment: non-"cashu" = reissue_into_any), new + fedimint_client::spend_from_any(), wallet.ecash-balance reports total_sats. LIVE federation + validation pending (two nodes sharing a federation). +- **#2 mobile scroll cutoff DONE** (`a8c668ee`): DashboardMobileNav wrote `--mobile-tab-bar-height:0px` + when the bar was hidden/unlaid-out, defeating the `,88px` fallback → bar covered last row. Now never + writes 0 (removes var → fallback), re-measures on rAF + post-WebView-injection. Backup hypothesis if + it persists: `.dashboard-view` is `min-h-screen`(100vh) → mobile-browser toolbar overlap, switch to dvh. + +NEXT when deploying: build release binary (opt-level 3, ~13min) + frontend, sideload to .116 first +(verify #12 dedup + #5), then .198/.228/.89 (.89 was stale 7c17a96). Confirm "optiplex" node id. + +## TODO (original resume — #12 now DONE above) +### #12 Fix duplicate mesh contacts ← DONE this session (see SESSION 2 PROGRESS) Root cause: `handle_mesh_contacts_list` (api/rpc/mesh/typed_messages.rs:1126) and `handle_conversations_list` (api/rpc/mesh/status.rs:89) emit **one row per `state.peers` entry** with **no cross-transport dedup**. A node can have TWO peers: a radio peer (low contact_id, firmware key)