Repository navigation
Description
Part of #2598 — encrypted LAN phone access, automatic route recovery and pairing upgrades.
User-visible slice
A Human explicitly enables phone LAN access on the computer, scans its trusted QR with the installed phone app, approves that phone's key once, reads the real Host Feed and exchanges a DM over the encrypted local route. Revoking the phone closes access. No Connect account, Tailscale, manually installed certificate, typed IP or router configuration is required.
Acceptance
- LAN starts disabled; an explicit enable control with clear notice and matching CLI opens only a restricted encrypted-device entry. A separate disable control closes it. Updating the plugin alone never enables LAN.
- Preserve the loopback DSH operator boundary and canonical Device Pairing authority. Reuse the merged pinned-Host-key Noise channel (feat(connect): encrypt paired-device traffic with pinned Noise XK #2547), with explicit LAN admission, no raw fallback and lifecycle cleanup; document any necessary same-listener ADR refinement.
- The existing pairing chooser/Host management flow supports LAN. A trusted QR binds the intended Host key and expiring offer; the Host approves the exact phone key. Reused/expired/rejected offers and wrong keys fail with stable reasons. Host credentials stay on the Host.
- Native phone reads real Host state without Internet access. Separately verify real DM send/reply with an available model; external model reachability is not LAN reachability.
- Existing Tailscale and Connect paths continue to work under their existing trust contracts. A paired phone retains valid trust across ordinary restart; unsupported/legacy LAN trust refuses clearly until the later upgrade slice.
- Revocation terminates admitted encrypted connections and refuses later requests; disablement releases LAN resources. Host/phone failures cannot accidentally publish the full Web Client or operator API.
- Ship CLI parity for every added/changed Host command/route, protected handling of enrollment material, bounded secret-free lifecycle diagnostics and bilingual CLI/release documentation.
- Focused automated tests run through the real pairing owner/encrypted gateway and Host client seam, including wire confidentiality, identity/refusal, lifecycle and CLI behavior. Update feature journeys and native platform configuration deliberately; no broad cleartext exception as a shortcut.
- Provide a runnable isolated Host plus native phone path, capture required redacted UI evidence and obtain Human feedback before expanding the next slice. Follow the shared device QA lanes. Record each platform's actual verification result separately; one platform's success does not qualify the other.
Boundaries and sequencing
This is the first end-to-end PR in #2598. Healthy-route proactive switching, offline changed-address rediscovery and transactional legacy pairing upgrade are subsequent slices, not disconnected prerequisites to this slice. The final spec still requires iOS and Android qualification; first feedback uses one available reserved native QA combination.
Respect existing pairing UX work (#2517/#2581), CLI authority (#2098) and encrypted transport (#2547). Implement in an isolated issue branch; inspect active claims before changing shared surfaces. Keep specification requirements and its test plan authoritative. A backend listener or UI mock alone does not complete this ticket.
Activity
DoodleBears commentedon Oct 22, 2026
Agent work claim
codex/local/01a1639d-a211-7a30-a976-b6f6416ca9b1(not a DSH Session)codex/2599-lan-pairingDoodleBears commentedon Oct 22, 2026
Agent implementation progress
codex/local/01a1639d-a211-7a30-a976-b6f6416ca9b1013bf12ab51ad5d9e2fbf150ebf494f097f1625f.fix(mobile): compile LAN DNS adapter and align Expo types
fix(cli): expose device fingerprint before pairing approval
DoodleBears commentedon Oct 22, 2026
Agent work outcome
codex/local/01a1639d-a211-7a30-a976-b6f6416ca9b1bac5bf9d7bc461f4d5bea33aff020dc6236f331e. Source branch is clean and pushed.Merge pull request #2600 from BotHarness/codex/2599-lan-pairing
DoodleBears commentedon Oct 22, 2026
Merged; native acceptance remains open
codex/local/01a1639d-a211-7a30-a976-b6f6416ca9b19cd926c0b3e34a376c0d7f715712f77bb6ce9770on 2026-10-22 18:50:57 UTC.DoodleBears commentedon Oct 22, 2026
Agent work claim — Release lint follow-up
codex/local/01a1639d-a211-7a30-a976-b6f6416ca9b1includeSubdomains="false"on the four existing network-security domains and extend the source regression assertion.codex/2599-lan-release-lint, based on current mainbdcc996a1ae1fa6d83439647bda4e4643b2b21aeMerge pull request #2605 from BotHarness/codex/2599-lan-release-lint
DoodleBears commentedon Oct 22, 2026
Android QA continuation on fixed main
843d84b1c304a6dfac4c405c1da70ebfe2512ed1:9018D62C4CD5B3EDC79C8BE9DF0EFB49BF873F9B0C5AE85B0D7FC628EC928E44; signer matches the previous development package. Cold startup shows the native LAN chooser; existing settings/notification choice/reverse mappings remain unchanged. No uninstall or data clear.device-revoked; ordinary HTTP paths return404; same-Profile restart preserves Host identity/opt-in/port; disable releases the port. Operator remains loopback-bound. No Host/LAN ADB reverse was used.429 GoUsageLimitError/QUOTA. Transport success does not qualify a model reply.Task:
codex/local/01a16542-d757-7b72-83ab-e75facdf3e0c. This is partial Android acceptance, not completion of #2599.feat(devices): add opt-in encrypted LAN phone pairing
fix(devices): bound LAN frames and preserve route recovery
fix(mobile): declare exact LAN network security domains