scripts/manual/windows-computer/README.md

Windows native fixture check

A manual integration fixture for VUH-1620, not a model comparison or eval. Nothing in CI, pnpm check, builds or releases launches it or runs its grader. Do not open the fixture or send desktop input until the lead clears a driving window with James. Only this disposable app is in scope; KH2, Herdr, agents and James's other apps remain outside the check.

Fixture.cs uses real Windows Forms text, focus, button, scroll, drag and secondary window events. It writes its state to a private directory atomically. It contains no UI automation or input-injection engine. The existing .NET Framework compiler builds it without opening a window. The frozen manifest declares eight cases and the refusal boundaries; check.ts pins its digest. Changing fixtures or expected outcomes requires a reviewed fixture revision.

Prepare without driving

From this checkout:

pnpm computer:windows:fixture prepare /tmp/windows-native-case

Transfer that new private directory to a task-owned Windows location. Compile through the existing SSH shell (no desktop input):

& 'C:\path\to\prepared\build.ps1' -OutputDirectory 'C:\path\to
ew-run'

The output directory must be new. Retain the emitted executable hash. The script never installs software, opens a window, changes desk-agent, alters app grants or starts a model. The fixture executable takes the run directory as its only argument, and refuses a directory with an existing state.json. Launching that executable in the active console is a separate approved step; an SSH session is not an interactive desktop. Use a native allowed app launch or have James open it. Do not introduce a C:\desk input fallback.

Receipt strategy to validate in the approved window

First establish native inventory/capture and explicit geometry, then inspect the actual window/UIA output. An input requires the latest exact-window screenshot, current lease/authority, owner app grant and explicit foreground permission: the documented Windows API activates its target automatically. Missing grants or a forbidden foreground change refuse before dispatch.

Use one primitive per fresh observation. Treat the native call returning as settlement of that call, never as proof of its effect. Capture the same target again immediately with screenshot and UIA text, and verify the specific intended state: target focus for a focus click, literal field value for typing, focus or selection change for a key, the changed button result, scroll content, or card order. A changed PNG digest alone, unrelated UI changes, or model assertions cannot confirm an action. UIA indexes must come from that actual observation; inspect its real format before mapping any element ID.

Only an observed effect is confirmed. Pre-dispatch validation failure is failed; missing, unchanged, ambiguous or interrupted post-observation is uncertain. Stop on uncertainty, never replay with a new request UUID, retain the lease, and record remaining cases as incomplete. Do not weaken the grader or assert quiescence from an ended call, a closed listener or a quiet fixture. The native adapter's missing stop-proof capability remains a gap. Sign-ins, codes, CAPTCHAs, payments, account changes and destructive operations are outside this fixture and retain ADR 0127's person-only stops.

The grader independently reads the native app's event state and actual host receipts. The driver observes the app through the native computer body; it must not read or write state.json to accomplish tasks. Fixture bookkeeping is a separate verification step, not an automation motor.

Retain and grade

After each approved case, copy its real state.json to the same evidence directory:

pnpm computer:windows:fixture checkpoint RUN_DIR W2
pnpm computer:windows:fixture receipt RUN_DIR W2 ACTUAL_RECEIPT_JSON

For W1 save W1.inventory.json, W1.screenshot.json, and its actual PNG as W1.png. For W2–W7 save the real computer receipts; retain screenshots/UIA before and after each primitive alongside them. A multi-action case retains intermediate receipts separately; its named final receipt is not evidence of the earlier steps. Case receipts cannot reuse the same request UUID.

W7 additionally keeps the current W7.inventory.json and actual stale/cross-window HTTP result as W7.refusal.json (status, body). W8 retains W8.before.state.json, the host's W8.revocation.json, its follow-on W8.refusal.json (status, body), W8.status.json showing recovery required, and W8.state.json after refusal. A refused input must leave the native event state unchanged. No stop-proof claim or automatic release follows.

pnpm computer:windows:fixture grade RUN_DIR

Missing proof stays unavailable; failed or unavailable cases exit nonzero. grade.json is written once so a rerun cannot overwrite a prior verdict. Inspect those retained native screenshots/UIA before claiming Windows input works. These commands invoke no model, computer API or desktop action.