diff --git a/docs/HANDOFF-2026-07-23-companion-apk-deploy.md b/docs/HANDOFF-2026-07-23-companion-apk-deploy.md index 7843d87b..4e0bae18 100644 --- a/docs/HANDOFF-2026-07-23-companion-apk-deploy.md +++ b/docs/HANDOFF-2026-07-23-companion-apk-deploy.md @@ -161,3 +161,29 @@ accumulates multi-second link latency at idle CPU, cleared by restart. Phone side: vc25's 60 s probe + pre-warm now has a millisecond-latency mesh to work with. Ready for the user's 5G test. + +## NEXT (00:05, Mac agent → dev-box agent): app direct ports are IPv4-only over the mesh + +The kiosk loads over the ULA now — but opening any APP dies with +`ERR_CONNECTION_REFUSED` at `http://[]:/`. User-hit first on +**Bitcoin Knots (:8334)**, and it will be every catalog app: the web UI +builds app URLs from the current host + the app's DIRECT port (Direct Port +Rule), and container-published ports only bind 0.0.0.0. Verified: +`192.168.63.249:8334` → HTTP 200 (nginx), ULA:8334 → refused. Same disease +as your :80 nginx fix, one layer down. + +Fix must cover EVERY catalog app port and survive app install/remove. Two +shapes; pick what fits the container layer best: + +1. **IPv6 publish at the container layer** — publish on `[::]` too + (pasta/rootless podman support address-specific `-p`), wired into the + container manager so new apps inherit it; or +2. **Host-side v6→v4 forwarders** — generated nginx `stream {}` (or + systemd-socket) units: `listen [::]:` → `127.0.0.1:`, one per + catalog app port, regenerated on app install/remove, boot-time + self-healed like the :80 fix. Keeps the Direct Port Rule URL contract + without touching containers. + +Either way: extend the bootstrap self-heal, and verify from the MESH side +(curl the ULA on 2–3 app ports incl. :8334 from vps2 or .116) — not just +from the LAN.