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

1343 lines
53 KiB
Markdown

# 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:
```powershell
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:
```powershell
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:
```powershell
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:
```powershell
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:
```powershell
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:
```powershell
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:
```powershell
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:
```powershell
cd apps/windows-client
npm run build
```
Important output:
- `tsc && vite build`
- `36 modules transformed`
- `built in 424ms`
Command:
```powershell
cd apps/windows-client/src-tauri
cargo test
```
Result:
- Blocked: `cargo` is not recognized in the current environment.
Command:
```powershell
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:
```powershell
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:
```powershell
cd apps/windows-client
npm run build
```
Important output:
- `tsc && vite build`
- `36 modules transformed`
- `built in 395ms`
Command:
```powershell
cd apps/windows-client/src-tauri
cargo test
```
Result:
- Blocked: `cargo` is not recognized in the current environment.
Command:
```powershell
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:
```powershell
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:
```powershell
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:
```powershell
cd apps/windows-client
npm run build
```
Important output:
- `tsc && vite build`
- `36 modules transformed`
- `built in 401ms`
Command:
```powershell
cd apps/windows-client/src-tauri
cargo test
```
Result:
- Blocked: `cargo` is not recognized in the current environment.
Command:
```powershell
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:
```powershell
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:
```powershell
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:
```powershell
cd apps/windows-client
npm run build
```
Important output:
- `tsc && vite build`
- `38 modules transformed`
- `built in 393ms`
Command:
```powershell
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:
```powershell
cd apps/windows-client/src-tauri
cargo test
```
Result:
- Blocked: `cargo` is not recognized in the current environment.
Command:
```powershell
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:
```powershell
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:
```powershell
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:
```powershell
cd apps/windows-client
npm run build
```
Important output:
- `tsc && vite build`
- `38 modules transformed`
- `built in 431ms`
Command:
```powershell
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:
```powershell
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:
```powershell
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:
```powershell
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:
```powershell
cd apps/windows-client
npm run build
```
Important output:
- `tsc && vite build`
- `38 modules transformed`
- `built in 404ms`
Command:
```powershell
cd apps/windows-client/src-tauri
cargo test
```
Result:
- Blocked: `cargo` is not recognized in the current environment.
Command:
```powershell
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:
```powershell
$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:
```powershell
& '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:
```powershell
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:
```powershell
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:
```powershell
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:
```powershell
cd apps/windows-client
npm run build
```
Important output:
- `tsc && vite build`
- `38 modules transformed`
- `built in 469ms`
Command:
```powershell
cd apps/windows-client/src-tauri
cargo test
```
Result:
- Blocked: `cargo` is not recognized in the current environment.
Command:
```powershell
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:
```powershell
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:
```powershell
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:
```powershell
cd apps/windows-client
npm run build
```
Important output:
- `tsc && vite build`
- `38 modules transformed`
- `built in 428ms`
Command:
```powershell
cd apps/windows-client/src-tauri
cargo test
```
Result:
- Blocked: `cargo` is not recognized in the current environment.
Command:
```powershell
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:
```powershell
cd apps/windows-client
npm run tauri -- build
```
Result:
- Blocked: `failed to run 'cargo metadata' ... program not found`.
Command:
```powershell
$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:
```powershell
$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:
```powershell
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:
```powershell
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.