Files
harbor-net/docs/goals/windows-modular-client/EVIDENCE.md

53 KiB

Windows Tauri Proxy Client Evidence

Acceptance Evidence

Record target-perspective proof:

  • app screenshot or state payload;
  • generated ProxiFyre config artifact;
  • helper/apply response;
  • component status showing missing/installed states;
  • Windows manual checklist results.

Task 1: Supersede Old Windows Node Plan

Accepted evidence for this checkpoint:

  • README.md now states that Windows app routing is planned as a separate Tauri 2 desktop utility, not APP_MODE=windows inside the current Node gateway/client server.
  • docs/roadmap.md now lists windows-gaming as a standalone Tauri 2 app direction and points to this execution plan.
  • docs/superpowers/specs/2026-05-21-windows-client-design.md is marked superseded and points to the product/tech brief plus this plan.
  • docs/superpowers/plans/2026-05-21-windows-client.md is marked superseded and says not to execute the old Node APP_MODE=windows plan.
  • Both old Windows docs now state that the content below is historical context and may contradict the active Tauri plan.

Product-level app evidence is not expected for Task 1 because this task is documentation cutover only.

Task 2: Scaffold Tauri App Shell

Accepted evidence for this checkpoint:

  • apps/windows-client now contains a standalone Tauri 2 + React + TypeScript app scaffold.
  • The shell has five visible navigation surfaces: Overview, Profiles, Targets, Components, Logs.
  • The shell shows the intended component split: Control App installed, Proxyfier Layer missing, Local sing-box missing/optional.
  • The shell route line starts with the MVP external proxy path: Selected apps -> Proxyfier -> Existing proxy.
  • Browser verification confirmed each navigation button renders a matching page heading.
  • Native Rust/Tauri compilation is blocked in this environment because Rust, Cargo, rustup, MSVC Build Tools, and Windows SDK components are not installed.

Task 3: Define Domain Models And Validation

Accepted evidence for this checkpoint:

  • apps/windows-client/src-tauri/src/models.rs now defines Rust DTO/domain models for profiles, profile items, targets, component status, and activity entries.
  • apps/windows-client/src-tauri/src/validation.rs now normalizes profile and target inputs.
  • apps/windows-client/src/domain/types.ts mirrors the Rust-facing DTOs for React/TypeScript callers.
  • apps/windows-client/src-tauri/tests/domain_tests.rs contains Rust tests for process/folder/exe normalization, malformed protocol rejection, external target normalization, local sing-box target definition without installed component state, and malformed target field rejection.
  • The validation design keeps Local sing-box optional: a local target can require singbox, but target definition validation does not require that component to be installed.

Rust test execution remains blocked by the missing Rust/MSVC toolchain recorded in Task 2.

Task 4: Implement JSON Storage And Activity Log

Accepted evidence for this checkpoint:

  • apps/windows-client/src-tauri/src/storage.rs now defines JsonStorage with a default root of C:\ProgramData\VpnProxy.
  • The storage paths split source config files under config, activity under state, and future generated artifacts under generated.
  • Profiles, targets, components, and activity have typed JSON read/write methods.
  • Writes create parent directories, write through a sibling .tmp file, and copy the existing source file to a sibling .bak file before overwrite.
  • Missing files and invalid JSON fall back to empty collections instead of crashing callers.
  • apps/windows-client/src-tauri/src/activity.rs now owns activity sorting, append, and cap behavior.
  • apps/windows-client/src-tauri/tests/storage_tests.rs contains Rust tests for ProgramData default root, roundtrip persistence, invalid JSON fallback, backup creation, and activity cap/sort.

Rust test execution remains blocked by the missing Rust/MSVC toolchain recorded in Task 2, so this checkpoint is implemented but Rust-unproven in the current environment.

Task 5: Add Proxy Router Adapter Boundary And ProxiFyre Adapter

Accepted evidence for this checkpoint:

  • apps/windows-client/src-tauri/src/adapters/proxy_router.rs now defines the ProxyRouterAdapter trait, request DTO, generated config DTO, and structured adapter errors.
  • apps/windows-client/src-tauri/src/adapters/proxifyre.rs now defines ProxiFyreAdapter and typed ProxiFyreConfig / ProxiFyreProxy derived-config DTOs.
  • The ProxiFyre generated JSON follows the official ProxiFyre app-config.json shape: logLevel, bypassLan, proxies, appNames, socks5ProxyEndpoint, and supportedProtocols.
  • Enabled profiles generate ProxiFyre proxy entries from source profile items and targets; disabled profiles are skipped.
  • External SOCKS5 targets do not require Local sing-box component state.
  • Targets that require a component, such as local-singbox requiring singbox, are blocked unless the component is installed and running.
  • HTTP targets are rejected by the ProxiFyre adapter because ProxiFyre is a SOCKS5 proxy-router backend.
  • apps/windows-client/src-tauri/tests/proxifyre_adapter_tests.rs contains tests for Discord + external SOCKS5 config generation, disabled profile skipping, missing local sing-box blocking, running local sing-box allowing generation, and HTTP rejection.

Rust test execution remains blocked by the missing Rust/MSVC toolchain recorded in Task 2, so this checkpoint is implemented but Rust-unproven in the current environment.

Task 6: Add Tauri Commands

Accepted evidence for this checkpoint:

  • apps/windows-client/src-tauri/src/commands.rs now defines structured Tauri command DTOs and handlers for status, profiles, targets, components, resolve preview, apply, and logs.
  • apps/windows-client/src-tauri/src/main.rs now registers the Task 6 commands through tauri::generate_handler!.
  • apps/windows-client/src/api/tauriCommands.ts now exposes typed async invoke(...) wrappers for get_status, get_profiles, save_profile, get_targets, save_target, get_components, resolve_profile_preview, apply_profiles, and get_logs.
  • Command responses use structured JSON DTOs and camelCase fields for the TypeScript boundary.
  • Save profile/target command services normalize inputs through the existing Rust validation layer before writing JSON source files.
  • Apply uses the ProxyRouterAdapter boundary, writes the generated ProxiFyre config artifact under the configured generated directory, calls a helper trait, and records success activity.
  • Adapter-blocked apply, such as a local-singbox target with missing/stopped sing-box, records an error activity entry before returning a structured command error.
  • apps/windows-client/src-tauri/tests/command_tests.rs contains Rust tests for save normalization/persistence, resolve preview, generated config + mock helper + activity, and blocked local sing-box activity.

Rust test execution remains blocked by the missing Rust/MSVC toolchain recorded in Task 2, so this checkpoint is implemented but Rust-unproven in the current environment.

Task 7: Build MVP UI

Accepted evidence for this checkpoint:

  • apps/windows-client/src/app/App.tsx now owns MVP dashboard state, Tauri command loading, browser preview fallback, profile/target save handlers, profile preview, and apply action state.
  • apps/windows-client/src/features/overview/OverviewPage.tsx now shows route status, active profile/app counts, active target, Proxyfier state, Local sing-box optional state, recent activity, refresh, and apply controls.
  • apps/windows-client/src/features/profiles/ProfilesPage.tsx now provides a usable profile editor for process/folder/exe items, target selection, protocol toggles, enabled state, save, and preview.
  • apps/windows-client/src/features/targets/TargetsPage.tsx now provides an external proxy target editor and target list.
  • apps/windows-client/src/features/components/ComponentsPage.tsx now shows Control App, Proxyfier Layer, and Local sing-box as separate operable components with explicit actions.
  • apps/windows-client/src/features/logs/LogsPage.tsx now shows activity entries and copy diagnostics output.
  • apps/windows-client/src/styles/app.css now provides a responsive compact Windows utility layout with dense metrics, forms, lists, status badges, and component rail.
  • The UI uses Task 6 command wrappers when running inside Tauri and a local preview fallback for browser/dev verification.

Browser screenshot/DOM automation remains blocked by the current sandbox/browser runtime helper failure, so this checkpoint is implemented but browser-unproven in the current environment.

Task 8: Implement Helper And Explicit Installer Boundary

Accepted evidence for this checkpoint:

  • apps/windows-client/src-tauri/src/helper.rs now defines structured helper requests/responses, action names, command specs, command runner abstraction, JSON parsing, explicit install requests, service requests, and ProxiFyre apply request construction.
  • Helper actions use machine-readable names such as install-control-app, install-proxyfier, install-singbox, proxyfier.apply, and service.restart.
  • Helper parsing rejects non-JSON stdout, preserving the rule that app logic does not parse raw PowerShell/stdout text.
  • apps/windows-client/src-tauri/tests/helper_tests.rs contains mock-runner tests for JSON stdin, structured response parsing, elevation flags, explicit install actions, ProxiFyre apply not encoding install, non-JSON rejection, and failed helper exit errors.
  • apps/windows-client/scripts/install-control-app.ps1, install-proxyfier.ps1, and install-singbox.ps1 are explicit component installer entrypoints.
  • Installer scripts are idempotent boundaries: they create marker state only when needed, expose -PlanOnly, check admin before install work, return JSON, and backup existing component config files before overwrite where applicable.
  • apps/windows-client/src-tauri/capabilities/default.json remains narrow with only core:default; its description documents that no shell/sidecar helper launch permission is granted until a packaged helper is declared.

Rust test execution remains blocked by the missing Rust/MSVC toolchain recorded in Task 2, so this checkpoint is implemented but Rust-unproven in the current environment.

Task 9: Add Optional Local Sing-Box Adapter

Accepted evidence for this checkpoint:

  • apps/windows-client/src-tauri/src/adapters/singbox.rs now defines a separate SingBoxAdapter for generated local sing-box config.
  • The generated config uses a local mixed inbound on the configured local-singbox target host/port, a direct outbound placeholder, and route.final pointing at that outbound.
  • SingBoxGenerationRequest accepts an optional binary path; SingBoxCommandChecker writes a temporary config and runs sing-box check -c <config> only when a binary path is supplied.
  • Local sing-box config generation requires a target that is local, SOCKS5, and declares requires_component: singbox.
  • Local sing-box config generation is blocked unless the singbox component is installed, running, and in ComponentState::Running.
  • apps/windows-client/src-tauri/tests/singbox_adapter_tests.rs contains tests for config generation, optional check skipping, failed check propagation, missing/stopped sing-box blocking, and external ProxiFyre generation without sing-box.
  • apps/windows-client/src/features/targets/TargetsPage.tsx now renders the local sing-box target as an explicit install prompt row instead of a normal ready target when it requires singbox.
  • apps/windows-client/src/features/components/ComponentsPage.tsx now labels stopped/missing Local sing-box as optional and only needed when this PC should expose a local target.

Rust test execution remains blocked by the missing Rust/MSVC toolchain recorded in Task 2, so this checkpoint is implemented but Rust-unproven in the current environment.

Task 10: Package, Verify, And Record Evidence

Accepted evidence for this checkpoint:

  • apps/windows-client/README.md now documents the Windows client component split, source JSON paths, generated artifact paths, development commands, native prerequisites, explicit installer boundaries, and MVP verification flow.
  • README.md now links the Windows client README, documents Windows client build/test commands, explains the three separate installer scripts, and records that generated ProxiFyre/sing-box files are derived artifacts.
  • docs/roadmap.md now records the Windows client checkpoint: MVP slice exists, frontend build passes, native Rust/Tauri verification needs the Windows Rust/MSVC toolchain, and Local sing-box remains optional.
  • Browser target-perspective state was captured against the Windows client dev server on http://127.0.0.1:5174/: title VPN Proxy Windows, five navigation surfaces, external SOCKS5 route line, Control App/Proxyfier/Local sing-box component rail, and no horizontal overflow.
  • Browser route checks confirmed Overview, Profiles, Targets, Components, and Logs surfaces render. Targets showed Local sing-box as an install prompt.
  • Browser preview apply produced the visible notice proxifyre.stage-generated-config with Generated config staged in preview mode and showed C:\ProgramData\VpnProxy\generated\proxifyre-app-config.json.
  • Installer -PlanOnly commands returned structured JSON for Control App, Proxyfier Layer, and Local sing-box without install side effects.
  • Native Rust/Tauri build and real generated-file/helper/service behavior remain implemented but unproven in this environment because Rust/Cargo/MSVC Build Tools are not installed and no elevated Windows helper/service run was performed.

Verification

Record focused checks that passed, including command and important output.

Task 1 Verification

Command:

rg -n "Tauri|superseded|Superseded|windows-client-product-tech-brief|apps/windows-client" README.md docs

Important output included:

  • README.md:58:Windows app routing is planned as a separate Tauri 2 desktop utility
  • docs\roadmap.md:11:standalone Tauri 2 app + ProxiFyre adapter + optional native sing-box.exe
  • docs\roadmap.md:91:- Standalone Tauri 2 + React/TypeScript + Rust app under apps/windows-client
  • docs\superpowers\specs\2026-05-21-windows-client-design.md:3:> Superseded: this document describes the earlier Node/web-control Windows direction.
  • docs\superpowers\specs\2026-05-21-windows-client-design.md:7:> Content below is retained for historical context and may contradict the active
  • docs\superpowers\plans\2026-05-21-windows-client.md:3:> Superseded: do not execute this Node APP_MODE=windows plan as the current
  • docs\superpowers\plans\2026-05-21-windows-client.md:7:> Content below is retained for historical context and may contradict the active

Command:

git diff --check

Result:

  • No whitespace errors reported.
  • Git warned that several modified Markdown files will be normalized from LF to CRLF next time Git touches them.

Task 2 Verification

Command:

node --version
npm --version
cargo --version
rustc --version

Important output:

  • node: v26.4.0
  • npm: 11.17.0
  • cargo: not recognized
  • rustc: not recognized

Command:

cd apps/windows-client
npm install

Important output:

  • added 72 packages
  • found 0 vulnerabilities
  • npm warned that esbuild@0.28.1 has an install script not yet covered by allowScripts.

Command:

cd apps/windows-client
npm run build

Important output:

  • tsc && vite build
  • vite v7.3.6 building client environment for production
  • 36 modules transformed
  • built in 426ms

Command:

cd apps/windows-client
npm run tauri -- info

Important output:

  • Tauri detected app config: framework React, bundler Vite, frontendDist: ../dist, devUrl: http://localhost:5173/.
  • Tauri packages detected: @tauri-apps/api 2.11.1, @tauri-apps/cli 2.11.4, Rust crate tauri: 2.
  • Environment blockers: no Visual Studio/MSVC Build Tools, rustc not installed, Cargo not installed, rustup not installed.

Command:

cd apps/windows-client/src-tauri
cargo test

Result:

  • Blocked: cargo is not recognized in the current environment.

Browser verification:

  • Dev server: http://127.0.0.1:5173/.
  • DOM snapshot showed all five primary nav buttons and the component status rail.
  • Route click checks returned ok: true for Overview, Profiles, Targets, Components, and Logs.
  • Layout metrics at 1280px viewport: app shell grid 260px 1020px, no horizontal overflow (bodyClientWidth: 1280, bodyScrollWidth: 1280).

Task 3 Verification

Command:

cd apps/windows-client
npm run build

Important output:

  • tsc && vite build
  • 36 modules transformed
  • built in 424ms

Command:

cd apps/windows-client/src-tauri
cargo test

Result:

  • Blocked: cargo is not recognized in the current environment.

Command:

cd apps/windows-client
npm run tauri -- info

Important output:

  • App config still detected as React/Vite Tauri app.
  • Environment still reports missing MSVC Build Tools, rustc, Cargo, and rustup.

Command:

rg -n "ProfileInput|ProfileItemInput|TargetInput|ComponentStatus|ActivityEntry|normalize_profile|normalize_target|local_singbox_target_can_exist_before_component_is_installed|rejects_malformed_target_fields" apps\windows-client\src-tauri apps\windows-client\src\domain\types.ts

Important output included:

  • apps\windows-client\src-tauri\src\models.rs:60:pub struct ProfileInput
  • apps\windows-client\src-tauri\src\models.rs:92:pub struct TargetInput
  • apps\windows-client\src-tauri\src\models.rs:117:pub struct ComponentStatus
  • apps\windows-client\src-tauri\src\models.rs:132:pub struct ActivityEntry
  • apps\windows-client\src-tauri\src\validation.rs:109:pub fn normalize_profile
  • apps\windows-client\src-tauri\src\validation.rs:175:pub fn normalize_target
  • apps\windows-client\src-tauri\tests\domain_tests.rs:94:fn local_singbox_target_can_exist_before_component_is_installed
  • apps\windows-client\src-tauri\tests\domain_tests.rs:111:fn rejects_malformed_target_fields

Task 4 Verification

Command:

cd apps/windows-client
npm run build

Important output:

  • tsc && vite build
  • 36 modules transformed
  • built in 395ms

Command:

cd apps/windows-client/src-tauri
cargo test

Result:

  • Blocked: cargo is not recognized in the current environment.

Command:

cd apps/windows-client
npm run tauri -- info

Important output:

  • App config still detected as React/Vite Tauri app.
  • Environment still reports missing Visual Studio/MSVC Build Tools, rustc, Cargo, rustup, and Rust toolchain.

Command:

rg -n "default_config_root|write_profiles|read_profiles|backup_path|append_activity|activity_entries_are_sorted_and_capped|invalid_json_falls_back_to_empty_collection|roundtrips_profiles_targets_components_and_activity" apps\windows-client\src-tauri

Important output included:

  • apps\windows-client\src-tauri\src\storage.rs:8:pub fn default_config_root
  • apps\windows-client\src-tauri\src\storage.rs:79:pub fn read_profiles
  • apps\windows-client\src-tauri\src\storage.rs:83:pub fn write_profiles
  • apps\windows-client\src-tauri\src\storage.rs:150:pub fn backup_path
  • apps\windows-client\src-tauri\src\activity.rs:16:pub fn append_activity
  • apps\windows-client\src-tauri\tests\storage_tests.rs:26:fn roundtrips_profiles_targets_components_and_activity
  • apps\windows-client\src-tauri\tests\storage_tests.rs:55:fn invalid_json_falls_back_to_empty_collection
  • apps\windows-client\src-tauri\tests\storage_tests.rs:93:fn activity_entries_are_sorted_and_capped

Command:

git diff --check

Result:

  • No whitespace errors reported.
  • Git warned that several modified Markdown files will be normalized from LF to CRLF next time Git touches them.

Task 5 Verification

External reference checked:

  • Official ProxiFyre README: https://github.com/wiresock/proxifyre
  • Relevant config fields: app-config.json, logLevel, bypassLan, proxies, appNames, socks5ProxyEndpoint, supportedProtocols.

Command:

cd apps/windows-client
npm run build

Important output:

  • tsc && vite build
  • 36 modules transformed
  • built in 401ms

Command:

cd apps/windows-client/src-tauri
cargo test

Result:

  • Blocked: cargo is not recognized in the current environment.

Command:

cd apps/windows-client
npm run tauri -- info

Important output:

  • App config still detected as React/Vite Tauri app.
  • Environment still reports missing Visual Studio/MSVC Build Tools, rustc, Cargo, rustup, and Rust toolchain.

Command:

rg -n "ProxyRouterAdapter|ProxiFyreAdapter|PROXIFYRE_OUTPUT_FILE|generate_proxifyre_config|generates_proxifyre_config_for_discord_external_socks5_target|blocks_local_singbox_target_when_required_component_is_missing|rejects_http_target" apps\windows-client\src-tauri

Important output included:

  • apps\windows-client\src-tauri\src\adapters\proxy_router.rs:58:pub trait ProxyRouterAdapter
  • apps\windows-client\src-tauri\src\adapters\proxifyre.rs:21:pub struct ProxiFyreAdapter
  • apps\windows-client\src-tauri\src\adapters\proxifyre.rs:34:pub fn generate_proxifyre_config
  • apps\windows-client\src-tauri\tests\proxifyre_adapter_tests.rs:16:fn generates_proxifyre_config_for_discord_external_socks5_target
  • apps\windows-client\src-tauri\tests\proxifyre_adapter_tests.rs:61:fn blocks_local_singbox_target_when_required_component_is_missing
  • apps\windows-client\src-tauri\tests\proxifyre_adapter_tests.rs:92:fn rejects_http_target_because_proxifyre_adapter_is_socks5_only

Command:

git diff --check

Result:

  • No whitespace errors reported.
  • Git warned that several modified Markdown files will be normalized from LF to CRLF next time Git touches them.

Task 6 Verification

Command:

cd apps/windows-client
npm run build

Important output:

  • tsc && vite build
  • 38 modules transformed
  • built in 393ms

Command:

cd apps/windows-client
npm run tauri -- info

Important output:

  • App config still detected as React/Vite Tauri app.
  • Environment still reports missing Visual Studio/MSVC Build Tools, rustc, Cargo, rustup, and Rust toolchain.

Command:

cd apps/windows-client/src-tauri
cargo test

Result:

  • Blocked: cargo is not recognized in the current environment.

Command:

rg -n "tauri::command|get_status|get_profiles|save_profile|get_targets|save_target|get_components|resolve_profile_preview|apply_profiles|get_logs|apply_generates_derived_config_and_records_activity_with_mock_helper|invoke<" apps\windows-client\src-tauri apps\windows-client\src\api\tauriCommands.ts

Important output included:

  • apps\windows-client\src-tauri\src\commands.rs:284:pub fn get_status
  • apps\windows-client\src-tauri\src\commands.rs:289:pub fn get_profiles
  • apps\windows-client\src-tauri\src\commands.rs:296:pub fn save_profile
  • apps\windows-client\src-tauri\src\commands.rs:304:pub fn get_targets
  • apps\windows-client\src-tauri\src\commands.rs:309:pub fn save_target
  • apps\windows-client\src-tauri\src\commands.rs:317:pub fn get_components
  • apps\windows-client\src-tauri\src\commands.rs:324:pub fn resolve_profile_preview
  • apps\windows-client\src-tauri\src\commands.rs:331:pub fn apply_profiles
  • apps\windows-client\src-tauri\src\commands.rs:343:pub fn get_logs
  • apps\windows-client\src-tauri\tests\command_tests.rs:116:fn apply_generates_derived_config_and_records_activity_with_mock_helper
  • apps\windows-client\src\api\tauriCommands.ts:96:return invoke<StatusResponse>('get_status')
  • apps\windows-client\src\api\tauriCommands.ts:126:return invoke<ApplyProfilesResponse>('apply_profiles')

Command:

rg -n "activity_for_apply_error|apply_blocks_local_singbox_target_when_component_is_missing|apply_generates_derived_config_and_records_activity_with_mock_helper|invoke<|generate_handler" apps\windows-client\src-tauri apps\windows-client\src\api\tauriCommands.ts

Important output included:

  • apps\windows-client\src-tauri\src\main.rs:17:.invoke_handler(tauri::generate_handler![
  • apps\windows-client\src-tauri\src\commands.rs:479:let activity = activity_for_apply_error
  • apps\windows-client\src-tauri\src\commands.rs:633:fn activity_for_apply_error
  • apps\windows-client\src-tauri\tests\command_tests.rs:116:fn apply_generates_derived_config_and_records_activity_with_mock_helper
  • apps\windows-client\src-tauri\tests\command_tests.rs:158:fn apply_blocks_local_singbox_target_when_component_is_missing

Command:

git diff --check

Result:

  • No whitespace errors reported.
  • Git warned that several modified Markdown files will be normalized from LF to CRLF next time Git touches them.

Task 7 Verification

Command:

cd apps/windows-client
npm run build

Important output:

  • tsc && vite build
  • 38 modules transformed
  • built in 431ms

Command:

cd apps/windows-client
npm run dev -- --host 127.0.0.1

Important output:

  • VITE v7.3.6 ready in 206 ms
  • Local: http://127.0.0.1:5173/

Command:

Invoke-WebRequest -UseBasicParsing -Uri 'http://127.0.0.1:5173/' | Select-Object StatusCode,Content

Important output:

  • StatusCode 200
  • Response content starts with <!doctype html>.

Command:

rg -n "Apply changes|Save profile|Save target|External proxy first|Local sing-box|resolveProfilePreview|applyProfiles|Copy diagnostics|Preview state loaded" apps\windows-client\src\app apps\windows-client\src\features apps\windows-client\src\api\tauriCommands.ts

Important output included:

  • apps\windows-client\src\app\App.tsx:328:const preview = await resolveProfilePreview(input)
  • apps\windows-client\src\app\App.tsx:371:const response = await applyProfiles()
  • apps\windows-client\src\features\overview\OverviewPage.tsx:36:<h2>External proxy first, local sing-box optional</h2>
  • apps\windows-client\src\features\overview\OverviewPage.tsx:43:{isApplying ? 'Applying' : 'Apply changes'}
  • apps\windows-client\src\features\profiles\ProfilesPage.tsx:48:Save profile
  • apps\windows-client\src\features\targets\TargetsPage.tsx:27:Save target
  • apps\windows-client\src\features\logs\LogsPage.tsx:29:Copy diagnostics

Command:

git diff --check

Result:

  • No whitespace errors reported.
  • Git warned that several modified Markdown files will be normalized from LF to CRLF next time Git touches them.

Blocked browser evidence:

  • Browser skill file listed in session context was stale; current skill was found at C:\Users\PC\.codex\plugins\cache\openai-bundled\browser\26.623.101652\skills\control-in-app-browser\SKILL.md and read before browser work.
  • mcp__node_repl.js browser setup failed with windows sandbox failed: helper_unknown_error: setup refresh had errors.
  • apply_patch also failed with the same sandbox helper error, so Task 7 file edits were made with explicit escalated Set-Content fallback against Task 7-allowed files only.

Task 8 Verification

Command:

cd apps/windows-client
npm run build

Important output:

  • tsc && vite build
  • 38 modules transformed
  • built in 404ms

Command:

cd apps/windows-client/src-tauri
cargo test

Result:

  • Blocked: cargo is not recognized in the current environment.

Command:

cd apps/windows-client
npm run tauri -- info

Important output:

  • App config still detected as React/Vite Tauri app.
  • Environment still reports missing Visual Studio/MSVC Build Tools, rustc, Cargo, rustup, and Rust toolchain.

Command:

$files = @(
  'apps\windows-client\scripts\install-control-app.ps1',
  'apps\windows-client\scripts\install-proxyfier.ps1',
  'apps\windows-client\scripts\install-singbox.ps1'
)
foreach ($file in $files) {
  $tokens = $null
  $errors = $null
  [System.Management.Automation.Language.Parser]::ParseFile((Resolve-Path $file), [ref]$tokens, [ref]$errors) | Out-Null
  if ($errors.Count -gt 0) { Write-Error "$file parser errors" }
  Write-Output "$file parser ok"
}

Important output:

  • apps\windows-client\scripts\install-control-app.ps1 parser ok
  • apps\windows-client\scripts\install-proxyfier.ps1 parser ok
  • apps\windows-client\scripts\install-singbox.ps1 parser ok

Command:

& 'apps\windows-client\scripts\install-control-app.ps1' -PlanOnly
& 'apps\windows-client\scripts\install-proxyfier.ps1' -PlanOnly
& 'apps\windows-client\scripts\install-singbox.ps1' -PlanOnly

Important output:

  • Control App returned JSON with "success": true, "action": "install-control-app", "changed": false, and "planOnly": true.
  • Proxyfier returned JSON with "success": true, "action": "install-proxyfier", "changed": false, "serviceName": "ProxiFyreService", and "planOnly": true.
  • Local sing-box returned JSON with "success": true, "action": "install-singbox", "changed": false, "serviceName": "VpnProxySingBox", and "planOnly": true.

Command:

rg -n "proxyfier\.apply|service\.restart|runner\(\)|install_request|proxifyre_apply_request|helper_response_decode|PlanOnly|core:default|no shell or sidecar" apps\windows-client\src-tauri apps\windows-client\scripts

Important output included:

  • apps\windows-client\src-tauri\src\helper.rs:14:#[serde(rename = "proxyfier.apply")]
  • apps\windows-client\src-tauri\src\helper.rs:22:#[serde(rename = "service.restart")]
  • apps\windows-client\src-tauri\src\helper.rs:131:"helper_response_decode"
  • apps\windows-client\src-tauri\src\helper.rs:137:pub fn install_request
  • apps\windows-client\src-tauri\src\helper.rs:159:pub fn proxifyre_apply_request
  • apps\windows-client\src-tauri\tests\helper_tests.rs:73:fn install_requests_are_explicit_component_actions
  • apps\windows-client\src-tauri\capabilities\default.json:6:"permissions": ["core:default"]
  • apps\windows-client\scripts\install-control-app.ps1:50:if ($PlanOnly)
  • apps\windows-client\scripts\install-proxyfier.ps1:53:if ($PlanOnly)
  • apps\windows-client\scripts\install-singbox.ps1:53:if ($PlanOnly)

Command:

Get-Content -LiteralPath 'apps\windows-client\src-tauri\capabilities\default.json' -Raw | ConvertFrom-Json | Select-Object identifier,description,permissions

Result:

  • JSON parsed successfully.
  • identifier: default
  • Description states that no shell or sidecar permission is granted until a packaged helper is declared.

Command:

git diff --check

Result:

  • No whitespace errors reported.
  • Git warned that several modified Markdown files will be normalized from LF to CRLF next time Git touches them.

Task 9 Verification

External references checked:

  • Official sing-box Mixed inbound docs: https://sing-box.sagernet.org/configuration/inbound/mixed/.
  • Official sing-box Direct outbound docs: https://sing-box.sagernet.org/configuration/outbound/direct/.
  • Official sing-box Route docs for route.final: https://sing-box.sagernet.org/configuration/route/.
  • Official sing-box Log docs for log structure: https://sing-box.sagernet.org/configuration/log/.

Command:

cd apps/windows-client
npm run build

Important output:

  • tsc && vite build
  • 38 modules transformed
  • built in 469ms

Command:

cd apps/windows-client/src-tauri
cargo test

Result:

  • Blocked: cargo is not recognized in the current environment.

Command:

cd apps/windows-client
npm run tauri -- info

Important output:

  • App config still detected as React/Vite Tauri app.
  • Environment still reports missing Visual Studio/MSVC Build Tools, rustc, Cargo, rustup, and Rust toolchain.

Command:

rg -n "SingBoxAdapter|SingBoxGenerationRequest|sing-box check|install prompt|Optional\. Install|external_proxifyre_apply_does_not_require_singbox_component" apps\windows-client\src-tauri apps\windows-client\src\features

Important output included:

  • apps\windows-client\src-tauri\src\adapters\singbox.rs:18:pub struct SingBoxAdapter
  • apps\windows-client\src-tauri\src\adapters\singbox.rs:39:request: SingBoxGenerationRequest<'_>
  • apps\windows-client\src-tauri\src\adapters\singbox.rs:221:format!("sing-box check failed: {message}")
  • apps\windows-client\src-tauri\tests\singbox_adapter_tests.rs:145:fn external_proxifyre_apply_does_not_require_singbox_component
  • apps\windows-client\src\features\targets\TargetsPage.tsx:83:{localSingboxPrompt ? 'install prompt' : target.kind === 'local' ? 'local' : 'external'}
  • apps\windows-client\src\features\components\ComponentsPage.tsx:18:? 'Optional. Install and start only when this PC should expose a local target.'

Command:

git diff --check

Result:

  • No whitespace errors reported.
  • Git warned that several modified Markdown files will be normalized from LF to CRLF next time Git touches them.

Task 10 Verification

Command:

cd apps/windows-client
npm run build

Important output:

  • tsc && vite build
  • 38 modules transformed
  • built in 428ms

Command:

cd apps/windows-client/src-tauri
cargo test

Result:

  • Blocked: cargo is not recognized in the current environment.

Command:

cd apps/windows-client
npm run tauri -- info

Important output:

  • WebView2 detected: 149.0.4022.98.
  • Environment still reports missing Visual Studio/MSVC Build Tools, rustc, Cargo, rustup, and Rust toolchain.
  • App config detected as React/Vite with frontendDist: ../dist and devUrl: http://localhost:5173/.

Command:

cd apps/windows-client
npm run tauri -- build

Result:

  • Blocked: failed to run 'cargo metadata' ... program not found.

Command:

$files = @(
  'apps\windows-client\scripts\install-control-app.ps1',
  'apps\windows-client\scripts\install-proxyfier.ps1',
  'apps\windows-client\scripts\install-singbox.ps1'
)
foreach ($file in $files) {
  $tokens = $null
  $errors = $null
  [System.Management.Automation.Language.Parser]::ParseFile((Resolve-Path $file), [ref]$tokens, [ref]$errors) | Out-Null
  if ($errors.Count -gt 0) { Write-Error "$file parser errors" } else { Write-Output "$file parser ok" }
}

Important output:

  • apps\windows-client\scripts\install-control-app.ps1 parser ok
  • apps\windows-client\scripts\install-proxyfier.ps1 parser ok
  • apps\windows-client\scripts\install-singbox.ps1 parser ok

Command:

$files = @(
  'apps\windows-client\scripts\install-control-app.ps1',
  'apps\windows-client\scripts\install-proxyfier.ps1',
  'apps\windows-client\scripts\install-singbox.ps1'
)
foreach ($file in $files) { & $file -PlanOnly }

Important output:

  • Control App returned JSON with "success": true, "action": "install-control-app", "changed": false, and "planOnly": true.
  • Proxyfier returned JSON with "success": true, "action": "install-proxyfier", "changed": false, "serviceName": "ProxiFyreService", and "planOnly": true.
  • Local sing-box returned JSON with "success": true, "action": "install-singbox", "changed": false, "serviceName": "VpnProxySingBox", and "planOnly": true.

Browser evidence:

  • Port 5173 was already occupied by an unrelated page, so the Windows client dev server was started on http://127.0.0.1:5174/ with --strictPort.
  • Initial app state payload included:
    • title: VPN Proxy Windows
    • routeHeading: Overview
    • panelHeading: External proxy first, local sing-box optional
    • routeLine: Selected apps -> ProxiFyre -> Existing proxy 192.168.50.111:8080
    • component rail: Control AppRunning, Proxyfier LayerNot installed, Local sing-boxNot installed
    • horizontalOverflow: false
  • Route checks returned five surfaces: Overview, Profiles, Targets, Components, Logs.
  • Targets route text included Local sing-boxSOCKS5 127.0.0.1:1080Install and start Local sing-box before using this target.install prompt.
  • Preview apply on Overview produced a visible notice: proxifyre.stage-generated-configGenerated config staged in preview mode.
  • Preview apply also kept C:\ProgramData\VpnProxy\generated\proxifyre-app-config.json visible.
  • Browser tab was closed after verification. The extra dev server on 5174 was stopped. The attempted process for 5173 was already not running.

Command:

rg -n "Windows client README|install-control-app|install-proxyfier|install-singbox|C:\\ProgramData\\VpnProxy|Current checkpoint|npm run build|cargo test" README.md docs\roadmap.md apps\windows-client\README.md

Important output included:

  • README.md:66:- Windows client README: apps/windows-client/README.md
  • README.md:97:& .\scripts\install-control-app.ps1 -PlanOnly
  • README.md:98:& .\scripts\install-proxyfier.ps1 -PlanOnly
  • README.md:99:& .\scripts\install-singbox.ps1 -PlanOnly
  • README.md:107:C:\ProgramData\VpnProxy\config
  • docs\roadmap.md:89:Current checkpoint:
  • apps\windows-client\README.md:60:cargo test

Command:

git diff --check

Result:

  • No whitespace errors reported.
  • Git warned that several modified Markdown files will be normalized from LF to CRLF next time Git touches them.

Review Notes

Record plan-reviewer, reviewer, maintainer, or verifier findings that changed the result.

PRE Review

Mode: PRE

Verdict: aligned for Task 1.

Findings:

  • No blocker findings.
  • The plan has explicit outcome, truth owner, contract boundary, cutover, displaced path, kill criteria, and evidence requirements.
  • Task 1 is documentation-only and its allowed file scope avoids runtime source files, matching the cutover requirement.

POST Review

Mode: POST

Verdict: aligned.

Findings:

  • No blocker or major findings.
  • Implementation stayed within Task 1's documentation-only file scope.
  • Displaced Node APP_MODE=windows path is demoted in README, roadmap, and both older Windows docs.
  • Acceptance evidence for this checkpoint is sufficient because Task 1 is cutover documentation, not product behavior.

Correctness Review

Findings:

  • No correctness issues found for this documentation checkpoint.
  • Residual risk: product behavior remains unimplemented; app/build/generated-config evidence is deferred to later tasks.

Maintainer Review

Findings:

  • Minor risk found and fixed: the old Windows spec still contains historical text such as "No Electron or Tauri wrapper"; both old Windows docs now explicitly warn that the remaining content is historical and may contradict the active Tauri plan.
  • No duplicate current-looking Windows implementation path remains after the added superseded notes.

Task 2 PRE Review

Mode: PRE

Verdict: aligned.

Findings:

  • No blocker findings.
  • Task 2 creates only the separate apps/windows-client Tauri app slice plus evidence updates.
  • Current Node gateway/client runtime files remain out of scope.

Task 2 POST Review

Mode: POST

Verdict: aligned with environment caveat.

Findings:

  • No blocker or major findings.
  • The implementation stayed within the Tauri app slice and did not extend the current Node server.
  • Frontend build and browser shell evidence are captured.
  • Native Rust/Tauri checks are blocked by missing local toolchain, so this checkpoint is implemented but native-unproven.

Task 2 Correctness Review

Findings:

  • No runtime correctness issues found in the scaffold shell.
  • Residual risk: Tauri native compilation must be run after installing Rust, rustup, and Visual Studio Build Tools with MSVC/Windows SDK.

Task 2 Maintainer Review

Findings:

  • No duplicate Windows implementation path introduced.
  • The placeholder getShellSnapshot() is intentionally local shell scaffolding; Task 6 must replace it with typed Tauri command calls.

Task 3 PRE Review

Mode: PRE

Verdict: aligned.

Findings:

  • No blocker findings.
  • Task 3 scope is limited to domain models, validation, TypeScript mirror types, and domain tests.
  • Current Node gateway/client runtime files remain out of scope.

Task 3 POST Review

Mode: POST

Verdict: aligned with environment caveat.

Findings:

  • No blocker or major findings.
  • Models and validation were added in the Tauri app slice only.
  • TypeScript build passed.
  • Rust domain tests are authored but not executable in this environment because Rust/Cargo/MSVC are missing, so this checkpoint is implemented but Rust-unproven.

Task 3 Correctness Review

Findings:

  • No TypeScript/runtime issues found by npm run build.
  • Residual risk: Rust syntax and tests must be validated once Rust and MSVC Build Tools are installed.

Task 3 Maintainer Review

Findings:

  • No duplicate truth path introduced.
  • The Rust validation module is currently imported by integration tests via path modules because Task 3 did not modify lib.rs; Task 6 should expose stable crate modules when commands integrate the domain layer.

Task 4 PRE Review

Mode: PRE

Verdict: aligned.

Findings:

  • No blocker findings.
  • Task 4 scope is limited to JSON storage, activity helpers, and storage tests.
  • UI screens, current Node gateway/client code, and adapter/helper behavior remain out of scope.

Task 4 POST Review

Mode: POST

Verdict: aligned with environment caveat.

Findings:

  • No blocker or major findings.
  • Implementation stayed within the Tauri Rust storage/activity slice and storage tests.
  • Source truth remains JSON under the planned ProgramData root, with generated artifacts represented only as a path directory.
  • Rust tests are authored but not executable in this environment because Rust/Cargo/MSVC are missing.

Task 4 Correctness Review

Findings:

  • No TypeScript/runtime issues found by npm run build.
  • Storage writes use temp files and create backups before overwriting existing source files.
  • Invalid JSON fallback intentionally returns empty collections, matching the Task 4 evidence contract.
  • Residual risk: Rust syntax and behavior must be validated once Rust and MSVC Build Tools are installed.

Task 4 Maintainer Review

Findings:

  • No duplicate storage truth path introduced.
  • Activity ordering/capping is isolated in activity.rs so future commands can reuse it without duplicating list policy.
  • The Rust modules are currently imported by integration tests via path modules because Task 4 did not modify lib.rs; Task 6 should expose stable crate modules when commands integrate storage.

Task 5 PRE Review

Mode: PRE

Verdict: aligned.

Findings:

  • No blocker findings.
  • Task 5 scope is limited to proxy-router adapter boundary, ProxiFyre generated config, and adapter tests.
  • UI screens, current Node gateway/client code, helper/service operations, and Tauri commands remain out of scope.

Task 5 POST Review

Mode: POST

Verdict: aligned with environment caveat.

Findings:

  • No blocker or major findings.
  • Implementation stayed within the Tauri Rust adapter slice and ProxiFyre adapter tests.
  • ProxyRouterAdapter keeps UI and source profile models separated from ProxiFyre-specific config fields.
  • External SOCKS5 generation explicitly does not depend on Local sing-box component state.
  • Rust tests are authored but not executable in this environment because Rust/Cargo/MSVC are missing.

Task 5 Correctness Review

Findings:

  • No TypeScript/runtime issues found by npm run build.
  • ProxiFyre output uses the current official object-shaped app-config.json format with a proxies list.
  • Component dependency checks are target-driven, so missing singbox blocks only targets that declare requires_component: singbox.
  • Residual risk: Rust syntax and behavior must be validated once Rust and MSVC Build Tools are installed.

Task 5 Maintainer Review

Findings:

  • No duplicate adapter path introduced.
  • ProxiFyre-specific DTOs stay inside proxifyre.rs; shared callers should depend on ProxyRouterAdapter and ProxyRouterGeneratedConfig.
  • The Rust adapter modules are currently imported by integration tests via path modules because Task 5 did not modify lib.rs; Task 6 should expose stable crate modules when commands integrate adapters.

Task 6 PRE Review

Mode: PRE

Verdict: aligned.

Findings:

  • No blocker findings.
  • Task 6 scope is limited to Tauri command handlers, command wrappers, command tests, and command registration.
  • Full UI screens, privileged helper implementation, installer scripts, and current Node gateway/client code remain out of scope.

Task 6 POST Review

Mode: POST

Verdict: aligned with environment caveat.

Findings:

  • No blocker or major findings.
  • Implementation stayed in the Tauri command/API slice and did not implement the Task 7 UI.
  • Commands return structured DTOs and errors instead of raw PowerShell/stdout parsing.
  • Apply remains behind adapter/helper interfaces; the Task 6 helper is staged/mock-style and does not perform hidden privileged installation.
  • Rust command tests are authored but not executable in this environment because Rust/Cargo/MSVC are missing.

Task 6 Correctness Review

Findings:

  • No TypeScript/runtime issues found by npm run build.
  • Apply writes a generated ProxiFyre config artifact, calls the helper boundary, and records success activity.
  • Apply also records error activity when blocked by adapter checks, preserving user-visible failure evidence.
  • Residual risk: Rust syntax and command macro wiring must be validated once Rust and MSVC Build Tools are installed.

Task 6 Maintainer Review

Findings:

  • Command DTOs keep the TypeScript boundary camelCase without changing the source domain model storage contract.
  • The command service functions are separately callable from tests, so future helper integration can replace StagedApplyHelper without rewriting the UI wrapper.
  • Residual maintainability caveat: src-tauri/src/lib.rs still contains the original scaffold run() path without command registration because Task 6's allowed file list targeted main.rs; a later cleanup should align or remove that stale scaffold entrypoint.

Task 7 PRE Review

Mode: PRE

Verdict: aligned.

Findings:

  • No blocker findings in the plan contract.
  • Task 7 scope is limited to React app/features/styles and must not change Rust command/adapter behavior.
  • Required evidence is app-visible state, but browser automation availability must be verified during the task.

Task 7 POST Review

Mode: POST

Verdict: aligned with browser evidence caveat.

Findings:

  • No blocker or major findings in the implemented UI slice.
  • Implementation stayed within apps/windows-client/src/app, src/features, and src/styles.
  • UI is wired to Task 6 command wrappers with a preview fallback, so the desktop UI can be developed in a browser while still using Tauri commands in-app.
  • Browser screenshot/DOM evidence could not be captured because the browser runtime failed with the sandbox helper error.

Task 7 Correctness Review

Findings:

  • npm run build passed after the UI rewrite.
  • Overview, Profiles, Targets, Components, and Logs now expose the MVP workflows requested by Task 7.
  • Apply, profile preview, profile save, and target save call the command wrapper boundary and fall back locally when outside Tauri.
  • Residual risk: actual browser rendering and Tauri runtime command calls must be verified once the sandbox/browser helper issue is resolved.

Task 7 Maintainer Review

Findings:

  • UI state is centralized in App.tsx for the MVP; this is acceptable for Task 7 but should move to query/state hooks if the app grows.
  • The preview fallback is isolated to UI state and does not create a second source of truth for persisted configuration.
  • apply_patch was unavailable due sandbox helper failure, so Task 7 edits used escalated Set-Content fallback; future edits should return to apply_patch when the tool is healthy.

Task 8 PRE Review

Mode: PRE

Verdict: aligned.

Findings:

  • No blocker findings.
  • Task 8 scope is limited to helper abstraction, installer scripts, capability declaration, and helper tests.
  • Hidden installer invocation inside profile apply remains forbidden and was not added.

Task 8 POST Review

Mode: POST

Verdict: aligned with environment caveat.

Findings:

  • No blocker or major findings.
  • Helper boundary returns structured JSON and rejects unstructured stdout.
  • Installer entrypoints are explicit per component and expose -PlanOnly evidence without admin/install side effects.
  • Capability remains narrow; no broad shell/sidecar permission was introduced.
  • Rust helper tests are authored but not executable in this environment because Rust/Cargo/MSVC are missing.

Task 8 Correctness Review

Findings:

  • npm run build passed after Task 8 changes.
  • PowerShell parser checks passed for all three installer scripts.
  • -PlanOnly output proves all three installer scripts return machine-readable JSON and do not perform install work in plan mode.
  • Residual risk: real elevated install/service/apply behavior still requires manual Windows verification with installed helper and components.

Task 8 Maintainer Review

Findings:

  • No duplicate helper path introduced; helper.rs owns the helper JSON contract and runner abstraction.
  • Installer scripts remain thin boundaries and do not contain application profile/apply logic.
  • Task 6 still uses StagedApplyHelper; integrating the real helper into apply should be done in a later command/helper integration task or package verification pass.

Task 9 PRE Review

Mode: PRE

Verdict: aligned.

Findings:

  • No blocker findings.
  • Task 9 scope is limited to the optional sing-box adapter, adapter tests, and Targets/Components UI surfaces.
  • The plan forbids making sing-box mandatory for external targets; implementation must keep that dependency attached only to local targets declaring requires_component: singbox.

Task 9 POST Review

Mode: POST

Verdict: aligned with environment caveat.

Findings:

  • No blocker or major findings.
  • SingBoxAdapter is separate from ProxiFyreAdapter and does not alter external target apply behavior.
  • Binary validation is explicit and optional: config generation calls a checker only when a sing-box binary path is supplied.
  • UI changes make Local sing-box an explicit install prompt when absent instead of presenting it as a normal ready external path.
  • Rust tests are authored but not executable in this environment because Rust/Cargo/MSVC are missing.

Task 9 Correctness Review

Findings:

  • npm run build passed after Task 9 UI changes.
  • Local sing-box config generation checks the local target shape and requires the sing-box component to be installed and running.
  • The Task 9 tests include external ProxiFyre generation with missing sing-box to preserve the no-mandatory-sing-box invariant.
  • Residual risk: Rust syntax and actual sing-box check execution must be validated once Rust, MSVC Build Tools, and a real sing-box binary are installed.

Task 9 Maintainer Review

Findings:

  • No hidden installer path was introduced; install/service flows remain behind the explicit helper and installer boundary from Task 8.
  • sing-box generated config remains a derived artifact; no new source-of-truth JSON path was added.
  • The new adapter is currently test-imported directly like earlier Rust integration tests; a later integration cleanup should expose adapter modules through the stable crate entrypoint when package verification wires Local sing-box into commands.

Task 10 PRE Review

Mode: PRE

Verdict: aligned.

Findings:

  • No blocker findings in the plan contract.
  • Task 10 scope is documentation, final verification, target-perspective evidence, and the Windows app slice.
  • The acceptance gate requires honest handling of native Windows/Rust/service checks that cannot run in this environment.

Task 10 POST Review

Mode: POST

Verdict: aligned with native verification blocker.

Findings:

  • No blocker or major findings in the Task 10 documentation and verification updates.
  • README and roadmap now describe the separate Control App, Proxyfier Layer, and optional Local sing-box flows.
  • Browser evidence proves the MVP app surfaces and external SOCKS5 route line from the user's perspective.
  • Installer -PlanOnly evidence proves explicit component boundaries without side effects.
  • Native Tauri build, Rust tests, and real elevated service/helper behavior remain implemented but unproven until Rust/Cargo/MSVC and component binaries/services are available.

Task 10 Correctness Review

Findings:

  • npm run build passed after documentation updates.
  • Browser preview apply showed the intended generated ProxiFyre config path and staged helper response.
  • cargo test and npm run tauri -- build are blocked by missing cargo; this is recorded as an environment blocker rather than a passing result.
  • Real generated ProxiFyre file creation through Tauri commands is not proven in this environment because native command execution cannot run without the Rust toolchain.

Task 10 Maintainer Review

Findings:

  • No current Node gateway/client runtime files were changed for Windows behavior.
  • The Windows client README keeps operational knowledge local to apps/windows-client, while the root README points to it.
  • No additional source-of-truth path was introduced; docs keep JSON under C:\ProgramData\VpnProxy\config as source and generated files under generated as derived artifacts.
  • Residual cleanup for a future task: expose Rust modules through a stable crate entrypoint and run full native tests/build once the Windows toolchain is installed.