Last updated: 2026-07-28 KST
This is the first document Windows Codex should read after AGENTS.md. It turns
the current repository state, the completed macOS safety work, and the
v0.1.0 release plan into an executable Windows work order.
Resume update (2026-07-28): the baseline/parity group and the Phase 2 launcher lifecycle/IPC implementation are complete. Release packaging is deterministic, extraction/checksum verification passes, and the current candidate is intentionally unsigned because the owner declined the cost of a commercial code-signing certificate. The owner subsequently defined the portable release as current-user-only and waived a live second-account run on the single-user release machine. Keep the exact-user ACL regression test; a future installer must explicitly distinguish
Current userfromAll users. The owner also accepted the DNS ownership fault-injection test as sufficient forv0.1.0: all 30 focused checks passed 10 consecutive runs and both solutions built cleanly. Do not describe it as a live external DNS collision. The owner waived the clean Windows 11, missing-WireGuard, and fresh SmartScreen-reputation run forv0.1.0. Do not describe those cases as tested; keep the unsigned warning, checksum guidance, and supported prerequisites. Resume with the owner-operated matrix indocs/windows-release-hardening.md, then finish the remaining local artifact and release-tag gates. The detailed original work order remains below as implementation history.Parity audit update (2026-07-29): the Settings Protection Mode toggle was found to be a false promise. Its value was only logged and echoed by plan validation; no site-blocking behavior existed. The control and unused IPC field were removed, and Settings now describes the mandatory owned-state cleanup that the service actually performs. Run both Windows solutions and all focused tests before producing another candidate. See
docs/platform-parity-audit.md. A macOS cross-target pass with .NET 10.0.301 compiled every non-WinUI project with zero warnings/errors and passed 28/30 focused checks. The two remaining checks require PowerShell and Windows Principal, and WinUI still requires its Windows-only XAML compiler. Do not treat the cross-target pass as the native Windows rerun.UI/UX handoff update (2026-07-31): before changing WinUI, read
docs/windows-ui-ux-handoff.mdanddocs/ui-design-principles.md. Replace the large circular connection control, fixed-width/light-only layout, and uneven card rows using Windows-native responsive controls. Do not port SwiftUI code or change networking behavior as part of that pass.
- Work from Windows 11 x64 for Windows code, builds, launcher behavior, UAC, WireGuard, DNS, route, adapter, and recovery tests.
- Read
docs/windows-mvp-handoff.md,docs/windows-mvp-progress.md, anddocs/v0.1.0-release-plan.mdbefore editing. - Never read, print, commit, or attach a real WireGuard
.confor private key. Use the existing fake-key fixtures for automated tests. - Never stop, disable, reconfigure, or change the startup mode of AdGuard, antivirus, security DNS, another VPN, or another third-party product.
- Keep Windows networking native. Reuse macOS product semantics and tests where
useful, but do not port Network Extension,
utun, SwiftUI, XPC, or macOS packaging code into Windows. - Captive-portal discovery, sign-in, and recovery are outside
v0.1.0. The user authenticates with VPN Router disconnected and connects only after normal internet access works.
Run these from the repository root in PowerShell:
git status --short --branch
git pull --ff-only
dotnet --info
Test-Path 'C:\Program Files\WireGuard\wireguard.exe'
dotnet build .\windows\VpnRouter.slnx -nr:false
dotnet build .\windows\VpnRouterVs.sln -nr:false
dotnet run --project .\windows\VpnRouter.Tests\VpnRouter.Tests.csproj --no-buildThe current focused test executable contains 30 checks. Reconcile the progress
document if the Windows baseline produces a different count. Do not run a
network-mutating script until the normal build/tests pass and
scripts/windows/restore-network-dev.ps1 has been inspected without using the
-ResetDnsToDhcp option.
The signed macOS build-20 run adds evidence and semantics that Windows should match natively:
- Explicitly expand the media roots to include
www.youtube.comandwww.netflix.com, in addition to the existing CDN families. - Retain rotating IPv4 answers for their original 15-minute lifetime across refreshes instead of dropping an address merely because one lookup rotated.
- Bound an active route plan to 512 IPv4 host routes and fail before partial mutation when the limit would be exceeded.
- Filter target-domain AAAA responses while leaving target A and unrelated AAAA responses unchanged.
- Treat browser secure DNS as a preflight limitation. Never change Chrome or Edge policy automatically.
- Continuously prove ownership of the DNS response path and fail safe through complete VPN Router cleanup when ownership is lost.
- Do not alter another VPN. Test a second-VPN transition using Windows adapter and DNS state; add a Windows-native fail-safe only if the existing DNS ownership monitor does not already catch it.
- Diagnostic/troubleshooting output contains bounded state, counts, timestamps, and failure codes only. It must not contain raw configs, keys, domains, addresses, DNS payloads, or unrestricted logs.
Windows already implements several of these behaviors, including target AAAA
filtering, 15-minute managed-route expiry, browser DnsOverHttpsMode inspection,
DNS ownership monitoring, and crash recovery. Verify before changing them; add
only missing behavior and regression tests.
- Update
DomainRuleExpanderand its focused test for the two explicitwwwmedia entry points. - Confirm
ManagedRouteLifecycleretains distinct rotating answers until their original expiry. Add a focused test if the existing refresh tests do not prove it. - Add a 512-route combined static/dynamic limit before Windows route mutation, with a no-partial-write test.
- Re-run the focused tests and both solution builds.
- Add a backend information/handshake command containing a protocol version, product version, and payload identity. Make both launcher readiness and the desktop app reject an incompatible stale backend.
- Replace the named-pipe
InteractiveSidallow rule with the actual launching user SID plus administrators/System. Add ACL tests; a different interactive user must not receive privileged IPC access. - Make the desktop app single-instance. A second portable launch must activate or reconnect to the existing UI and must not start a second backend.
- Define UI-close behavior:
- connected: the elevated backend remains alive and recoverable;
- disconnected: request a graceful backend exit;
- reopening: reconnect and derive state from the backend.
- Retain only the active and immediately previous valid payload cache while disconnected.
- Add a visible portable-data cleanup action that refuses while connected and does not delete imported profiles or DPAPI secrets unless the UI explicitly says so.
- First portable launch produces one UAC prompt and one dashboard.
- Second launch produces no second backend or duplicate dashboard.
- Closing/reopening the UI while connected preserves and resynchronizes state.
- Backend/protocol version mismatch produces a useful error without mutating the network.
- Failed UAC, extraction, or readiness leaves DNS, routes, and WireGuard unchanged.
- DNS ownership loss and backend termination restore network state without changing third-party products.
Use the unchecked matrix in docs/v0.1.0-release-plan.md. Record only sanitized
counts and outcomes. After the dogfooding matrix passes, complete release
warnings/tests, version metadata, README, checksums, signing decision, and the
exact release tag.
- OpenVPN, L2TP, provider-account automation, installer/MSIX, automatic update, ARM64/x86, application routing, or full IPv6 split routing.
- Account-dependent Netflix automation; the release plan already accepts observed Japan-exit media/CDN traffic.
- More YouTube player automation unless a routing regression appears. The
previous HTTP/media and Japan-exit evidence is sufficient for
v0.1.0.
After each task group:
- Update
docs/windows-mvp-progress.mdwith the exact test/build and owner-operated evidence. - Update checkbox state in
docs/v0.1.0-release-plan.md. - Run
git diff --check. - Commit only sanitized source, tests, and docs. Never add LocalAppData artifacts, logs, imported profiles, raw troubleshooting files, or WireGuard configs.