Skip to content

Commit fd858be

Browse files
committed
test: add wpf installer coverage
1 parent 9753be7 commit fd858be

27 files changed

Lines changed: 963 additions & 54 deletions

.ai/research/2026-05-17/CONTINUE_FROM_HERE.md

Lines changed: 17 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
1-
# OpenCut Research — CONTINUE FROM HERE (for Pass 75)
1+
# OpenCut Research — CONTINUE FROM HERE (for Pass 76)
22

33
**This file's purpose:** if a future autonomous research session starts up, **read this first** before re-doing any of the work already on disk.
44

55
**Last update:** 2026-05-18 (after Pass 74; Passes 1-34 all ran on 2026-05-17)
6-
**Session state:** all mandated artefacts exist, Passes 4-29 closed F261/F262/F270/F264/F266/F199/F191/F197/F195/F202-tooling/F204/F207/F208/F209/F218/F219/F236/F237/F240/F241/F243/F244/F259/F251/F147/F131/F137/F139/F126/F181/F185/F140/F123/F128/F184/F178, Pass 30 closed F177 model_cards sweep gates, Pass 31 closed F176 eval-dataset catalogue, Pass 32 added the F176 follow-up download runner, Pass 33 closed F200 + F211, Pass 34 closed F217 (UXP BackendClient HTTP-shape contract), Pass 35 closed F121/F122/F127a/F130/F133/F135 (dependency security floor + Python 3.11 source-install floor), Pass 36 closed F180 (Wave N-T / F-number governance ledger), Pass 37 closed F213 (Inno install/uninstall smoke in CI), Pass 38 closed F215 (fuzz harness expansion + parser hardening), Pass 39 closed F216 (concurrent job-cancellation race coverage + process termination fix), Pass 40 closed F214 (ML / compose / TTS performance benchmark contract), Pass 41 closed F192 (legacy OpenAPI typed response schemas expanded to 100 routes), Pass 42 closed F198 (code-owned CEP↔UXP parity catalogue + generated JSON artifact), Pass 43 closed F194 (opt-in generated extended MCP route-tool catalogue), Pass 44 closed F201 (WPF installer build in Windows tag/manual CI), Pass 45 closed F203 (Windows Authenticode signing workflow/tooling + renewal docs), Pass 46 closed F223 (RTL/CJK/bidi caption Unicode validation gate), Pass 47 closed F242 (Unicode-aware CJK line breaking), Pass 48 closed F225 (OTIO Marker sidecar for review bundles), Pass 49 closed F226 (SVG drawing annotation overlays in review bundles), Pass 50 closed F227 (threaded review comments and completion status in review bundles), Pass 51 closed F229 (Premiere marker CSV and EDL review-comment exports), Pass 52 closed F231 (HMAC-signed LAN review portal URLs with Caddy/mDNS descriptors), Pass 53 closed F233 (per-project Atom review feeds plus optional HMAC-signed review webhooks), Pass 54 closed F234 (croc/rclone delivery transfer bundles), Pass 55 closed F238 (BT.1702/WCAG photosensitive flash checker upgrade), Pass 56 closed F239 (Microsoft `ai-audio-descriptions` compatible AD review drafts), Pass 57 closed F249 (Flatpak/AppImage Linux release packaging), Pass 58 closed F250 (Aptabase opt-in telemetry), Pass 59 advanced F252.1 (Bolt/WebView scaffold), Pass 60 advanced F252.2 (UXP host-action dispatcher), Pass 61 closed F254 (UXP createSubsequence range handoff), Pass 62 closed F255 (UXP EncoderManager export handoff), Pass 63 closed F256 (UXP Transcript API helpers), Pass 64 closed F257 (UXP ObjectMaskUtils helper), Pass 65 closed F258 (UXP ProjectConverter AAF export helper), Pass 66 closed F260 (UXP migration risk dashboard), Pass 67 closed F267 (UXP UDT smoke harness), Pass 68 closed F263 (full optional-extras pip-audit gate and dependency drift cleanup), Pass 69 closed F271 (per-feature VRAM requirement UI surface), Pass 70 closed F272 (wedding cinematic reel built-in agent skill), Pass 71 closed F193 (dataclass-discovered OpenAPI response schemas), Pass 72 closed F196 (registry/model-card/check contract), Pass 73 closed F206 (PR-fast/release-full CI split), and Pass 74 closed F210 (CEP/UXP Vitest utility coverage). This file documents deferred research/product work for a future Pass 75+, not a broken or incomplete research run.
6+
**Session state:** all mandated artefacts exist, Passes 4-29 closed F261/F262/F270/F264/F266/F199/F191/F197/F195/F202-tooling/F204/F207/F208/F209/F218/F219/F236/F237/F240/F241/F243/F244/F259/F251/F147/F131/F137/F139/F126/F181/F185/F140/F123/F128/F184/F178, Pass 30 closed F177 model_cards sweep gates, Pass 31 closed F176 eval-dataset catalogue, Pass 32 added the F176 follow-up download runner, Pass 33 closed F200 + F211, Pass 34 closed F217 (UXP BackendClient HTTP-shape contract), Pass 35 closed F121/F122/F127a/F130/F133/F135 (dependency security floor + Python 3.11 source-install floor), Pass 36 closed F180 (Wave N-T / F-number governance ledger), Pass 37 closed F213 (Inno install/uninstall smoke in CI), Pass 38 closed F215 (fuzz harness expansion + parser hardening), Pass 39 closed F216 (concurrent job-cancellation race coverage + process termination fix), Pass 40 closed F214 (ML / compose / TTS performance benchmark contract), Pass 41 closed F192 (legacy OpenAPI typed response schemas expanded to 100 routes), Pass 42 closed F198 (code-owned CEP↔UXP parity catalogue + generated JSON artifact), Pass 43 closed F194 (opt-in generated extended MCP route-tool catalogue), Pass 44 closed F201 (WPF installer build in Windows tag/manual CI), Pass 45 closed F203 (Windows Authenticode signing workflow/tooling + renewal docs), Pass 46 closed F223 (RTL/CJK/bidi caption Unicode validation gate), Pass 47 closed F242 (Unicode-aware CJK line breaking), Pass 48 closed F225 (OTIO Marker sidecar for review bundles), Pass 49 closed F226 (SVG drawing annotation overlays in review bundles), Pass 50 closed F227 (threaded review comments and completion status in review bundles), Pass 51 closed F229 (Premiere marker CSV and EDL review-comment exports), Pass 52 closed F231 (HMAC-signed LAN review portal URLs with Caddy/mDNS descriptors), Pass 53 closed F233 (per-project Atom review feeds plus optional HMAC-signed review webhooks), Pass 54 closed F234 (croc/rclone delivery transfer bundles), Pass 55 closed F238 (BT.1702/WCAG photosensitive flash checker upgrade), Pass 56 closed F239 (Microsoft `ai-audio-descriptions` compatible AD review drafts), Pass 57 closed F249 (Flatpak/AppImage Linux release packaging), Pass 58 closed F250 (Aptabase opt-in telemetry), Pass 59 advanced F252.1 (Bolt/WebView scaffold), Pass 60 advanced F252.2 (UXP host-action dispatcher), Pass 61 closed F254 (UXP createSubsequence range handoff), Pass 62 closed F255 (UXP EncoderManager export handoff), Pass 63 closed F256 (UXP Transcript API helpers), Pass 64 closed F257 (UXP ObjectMaskUtils helper), Pass 65 closed F258 (UXP ProjectConverter AAF export helper), Pass 66 closed F260 (UXP migration risk dashboard), Pass 67 closed F267 (UXP UDT smoke harness), Pass 68 closed F263 (full optional-extras pip-audit gate and dependency drift cleanup), Pass 69 closed F271 (per-feature VRAM requirement UI surface), Pass 70 closed F272 (wedding cinematic reel built-in agent skill), Pass 71 closed F193 (dataclass-discovered OpenAPI response schemas), Pass 72 closed F196 (registry/model-card/check contract), Pass 73 closed F206 (PR-fast/release-full CI split), Pass 74 closed F210 (CEP/UXP Vitest utility coverage), and Pass 75 closed F212 (WPF installer xUnit/headless smoke coverage). This file documents deferred research/product work for a future Pass 76+, not a broken or incomplete research run.
77

88
---
99

@@ -15,9 +15,9 @@
1515
- **F-numbers in ledger:** F001-F272 (Pass 1 added F121-F190, Pass 2 added F191-F260, Pass 3 added F261-F272).
1616
- **Wave letters in ledger:** A-M shipped; N-T planned in ROADMAP.md and now F-number-tiered by `.ai/research/2026-05-18/WAVE_N_T_F_NUMBER_LEDGER.md` (F180).
1717

18-
### Pass 75 entry point
18+
### Pass 76 entry point
1919

20-
1. **Continue the remaining queue.** F121/F122/F127a/F130/F133/F135, F123, F126, F128, F137, F139, F140, F147, F176 (+follow-up), F177, F178, F180, F181, F184, F185, F192, F193, F194, F196, F198, F200, F201, F203, F206, F210, F211, F213, F214, F215, F216, F217, F223, F225, F226, F227, F229, F231, F233, F234, F238, F239, F242, F249, F250, F251, F254, F255, F256, F257, F258, F259, F260, F263, F267, F271, F272 are closed. F205 still needs a runner where coverage can finish. F182 (issue seeder) may still depend on a working `gh` auth context. F252.1 and the F252.2 dispatcher slice are complete but F252 remains open for live WebView/in-Premiere UDT result capture; the next local-verifiable Later candidate is F212 (WPF installer xUnit/headless install), but it is XL and Windows-runner heavy. F268 requires an Adobe developer account/storefront process. Larger Pass-1 Now items still requiring model integration: F149/F162/F163/F167/F169.
20+
1. **Continue the remaining queue.** F121/F122/F127a/F130/F133/F135, F123, F126, F128, F137, F139, F140, F147, F176 (+follow-up), F177, F178, F180, F181, F184, F185, F192, F193, F194, F196, F198, F200, F201, F203, F206, F210, F211, F212, F213, F214, F215, F216, F217, F223, F225, F226, F227, F229, F231, F233, F234, F238, F239, F242, F249, F250, F251, F254, F255, F256, F257, F258, F259, F260, F263, F267, F271, F272 are closed. F205 still needs a runner where coverage can finish. F182 (issue seeder) may still depend on a working `gh` auth context. F252.1 and the F252.2 dispatcher slice are complete but F252 remains open for live WebView/in-Premiere UDT result capture. The next local-verifiable Later candidates are F220-F222 (RVC + AI color grading + pacing analysis) unless a model-integration item needs fresh external research first. F268 requires an Adobe developer account/storefront process. Larger Pass-1 Now items still requiring model integration: F149/F162/F163/F167/F169.
2121
2. **F198 is now enforced, not only documented.** `CEP_UXP_PARITY_MATRIX.md` maps all 18 `ocXxx` JSX functions and identifies only two truly CEP-only calls; `opencut/_generated/cep_uxp_parity.json` plus `tests/test_cep_uxp_parity_catalogue.py` keep that claim in sync with `host/index.jsx`.
2222
3. **Complete F179** full `features.md` reconciliation; this remains the largest knowledge debt.
2323
4. **Run a Python 3.11/3.12/3.13 install matrix** for `[all]`; this cannot be fully proven from this VM's single Python 3.12 runtime.
@@ -224,6 +224,19 @@
224224
| Validation | PASS — `npm test` (`8 passed`), `npm run audit:check`, focused F210 Python guard tests (`3 passed`), `py_compile`, focused Ruff, release-smoke `panel-unit`, `npm run build:verify`, `npm run build`, and the PR-fast release-smoke command (`pytest-fast` 705 passed + `panel-unit`) passed locally. |
225225
| Files to review | `extension/com.opencut.panel/client/panel-utils.js`, `extension/com.opencut.panel/tests/`, `extension/com.opencut.panel/vitest.config.mjs`, `extension/com.opencut.uxp/uxp-utils.js`, panel `package.json`/lockfile, `.github/workflows/*.yml`, `scripts/release_smoke.py`, `tests/test_panel_vitest_gate.py`, `ROADMAP.md`, `CHANGELOG.md`, `PROJECT_CONTEXT.md`, and this file. |
226226

227+
### Pass 75 checkpoint
228+
229+
| Item | Status |
230+
|---|---|
231+
| F212 | **DONE** — WPF installer now has xUnit coverage plus Windows-runner quiet install/uninstall smoke wiring. |
232+
| Quiet mode | `InstallerCommandLineOptions` parses `--install/--uninstall --quiet`, temp profile/log flags, and safety toggles for shortcuts, CEP, PATH updates, HKLM registration, Whisper downloads, and optional dependencies. |
233+
| Installer safety | `InstallConfig` now supports configurable `UserDataPath`; uninstall honors the CEP/shortcut/PATH/registration toggles so CI smoke does not touch real developer state. |
234+
| Test suite | `installer/tests/OpenCut.Installer.Tests/` covers command-line parsing, path derivation, installer manifest path override, file copy behavior, progress math, and `SubStream` windowed reads. |
235+
| CI wiring | Release Full runs `scripts/test_wpf_installer.ps1` on Windows and runs `scripts/smoke_wpf_installer.ps1` after the WPF artifact is built. `tests/test_wpf_installer_test_suite.py` is part of release smoke. |
236+
| Build fix | `OpenCut.Installer.csproj` now points `ApplicationIcon` at tracked `Assets/logo.ico`, fixing source builds. |
237+
| Validation | PASS — `scripts/test_wpf_installer.ps1` (`13 passed`), focused installer Python guards (`15 passed`), and `dotnet build installer\src\OpenCut.Installer\OpenCut.Installer.csproj -c Release --nologo` passed locally. The destructive headless smoke remains CI-guarded for Windows release runners with a built self-extracting artifact. |
238+
| Files to review | `installer/src/OpenCut.Installer/CommandLine/`, `installer/src/OpenCut.Installer/Models/InstallConfig.cs`, `installer/src/OpenCut.Installer/Services/{InstallEngine,UninstallEngine}.cs`, `installer/tests/OpenCut.Installer.Tests/`, `scripts/test_wpf_installer.ps1`, `scripts/smoke_wpf_installer.ps1`, `.github/workflows/build.yml`, `tests/test_wpf_installer_test_suite.py`, and roadmap/state docs. |
239+
227240
### Pass 73 checkpoint
228241

229242
| Item | Status |

.ai/research/2026-05-17/FEATURE_BACKLOG_ADDENDUM.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,7 @@ Format: ID — title — what — source(s) — effort (S/M/L/XL) — fit (yes/c
5151
| F209 | MCP tool ↔ route consistency test | DONE in Pass 14 — fixed `opencut_chat_edit` to shipped `POST /chat` and added a live Flask route-consistency gate for all MCP default and special action routes | TEST_COVERAGE §3.3 | S | Done |
5252
| [x] F210 | Vitest unit tests for CEP/UXP utility functions | Closed in Pass 74 — CEP `esc()`, `escPath()`, command-palette indexing, and lazy DOM proxy seams plus UXP escaping/id normalization now have Vitest coverage and CI/release-smoke wiring | TEST_COVERAGE §3.4 | M | Later |
5353
| [x] F211 | Cross-platform launcher script smoke tests in CI | Closed in Pass 33 — 5 launcher entry points covered and wired into release smoke | TEST_COVERAGE §3.5 | S | Next |
54-
| F212 | WPF installer xUnit test suite + headless install in Windows runner | Largest single coverage gap | TEST_COVERAGE §3.6 | XL | Later |
54+
| [x] F212 | WPF installer xUnit test suite + headless install in Windows runner | Closed in Pass 75 — WPF quiet install/uninstall mode, xUnit contract tests, Windows runner headless smoke wiring, and installer icon build fix | TEST_COVERAGE §3.6 | XL | Later |
5555
| [x] F213 | Inno Setup install/uninstall smoke in CI | Closed in Pass 37 with CI-only install/uninstall smoke script + workflow wiring + static guard tests | TEST_COVERAGE §3.6 | M | Next |
5656
| [x] F214 | Extend F128 with ML + TTS perf benchmarks | Closed in Pass 40 — performance benchmark registry pins ASR/upscaler/compose/TTS throughput specs, backend matrix, opt-in execution gate, and wall-clock normalization primitive | TEST_COVERAGE §3.7 | M | Next |
5757
| [x] F215 | Extend fuzz harness with 8 targets | Closed in Pass 38 — 13 total fuzz targets now cover path validation, OTIO parse, FCPXML parse, marker import, C2PA sidecars, plugin manifests, webhook HMAC signatures, and `safe_pip_install` package validation | TEST_COVERAGE §3.8 | M | Next |
@@ -130,7 +130,7 @@ Format: ID — title — what — source(s) — effort (S/M/L/XL) — fit (yes/c
130130
| **Now** | F205, F251, F259 | 3 |
131131
| **Done locally after Pass 23 wrap-up** | F191, F195, F197, F199, F202, F204, F207, F208, F209, F218, F219, F236, F237, F240, F241, F243, F244 | 17 |
132132
| **Next** | [x] F192, [x] F194, [x] F198, [x] F200, [x] F201, [x] F203, [x] F211, [x] F213, [x] F214, [x] F215, [x] F216, [x] F217, [x] F223, [x] F225, [x] F226, [x] F227, [x] F229, [x] F231, [x] F233, [x] F234, [x] F238, [x] F239, [x] F242, [x] F249, [x] F250, F252 (F252.1/F252.2 dispatcher done), [x] F254, [x] F255, [x] F256, [x] F257, [x] F258, [x] F260 | 32 |
133-
| **Later** | [x] F193, [x] F196, [x] F206, [x] F210, F212, F220, F221, F222, F224, F228, F230, F232, F235, F245, F246, F247, F248, F253 | 14 open + F193/F196/F206/F210 closed |
133+
| **Later** | [x] F193, [x] F196, [x] F206, [x] F210, [x] F212, F220, F221, F222, F224, F228, F230, F232, F235, F245, F246, F247, F248, F253 | 13 open + F193/F196/F206/F210/F212 closed |
134134

135135
**Total Pass-2 F-numbers: 70** (F191-F260).
136136
**Total project F-numbers: 140** (F121-F260 from Pass 1 + Pass 2; plus the pre-existing F001-F120 from v4.3).

.ai/research/2026-05-17/PRIORITIZATION_MATRIX.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -183,7 +183,7 @@ The second autonomous research pass on 2026-05-17 added 70 more F-numbers across
183183

184184
**Next (32 items):** [x] F192, [x] F194, [x] F198, [x] F200, [x] F201, [x] F203, [x] F211, [x] F213, [x] F214, [x] F215, [x] F216, [x] F217, [x] F223, [x] F225, [x] F226, [x] F227, [x] F229, [x] F231, [x] F233, [x] F234, [x] F238, [x] F239, [x] F242, [x] F249, [x] F250, F252 (F252.1 scaffold and F252.2 dispatcher done; UDT/live WebView cutover remains), [x] F254, [x] F255, [x] F256, [x] F257, [x] F258, [x] F260. Includes the **F143 conductor + F252 UXP/WebView migration + F225-F229/F231/F233/F234 collaboration extensions** as parallel flagship tracks.
185185

186-
**Later (14 open items + F193/F196/F206/F210 closed):** [x] F193, [x] F196, [x] F206, [x] F210, F212, F220, F221, F222, F224, F228, F230, F232, F235, F245, F246, F247, F248, F253. Includes deferred OSS-quality items (Dolby Vision pipeline, ADM BWF Atmos, IMF builders) that wait on F215 fuzz + F218 import-order regression coverage.
186+
**Later (13 open items + F193/F196/F206/F210/F212 closed):** [x] F193, [x] F196, [x] F206, [x] F210, [x] F212, F220, F221, F222, F224, F228, F230, F232, F235, F245, F246, F247, F248, F253. Includes deferred OSS-quality items (Dolby Vision pipeline, ADM BWF Atmos, IMF builders) that wait on F215 fuzz + F218 import-order regression coverage.
187187

188188
**Two regulatory deadlines bumped to Now:**
189189
- F202 Apple notarisation (Homebrew Cask mandatory Sept 1, 2026)

.ai/research/2026-05-17/TEST_COVERAGE_GAPS.md

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -67,9 +67,9 @@ Pass 74 closed **F210 — Vitest unit tests for CEP/UXP utility functions**. `cl
6767

6868
### 3.6 Installer
6969

70-
The WPF .NET 9 installer (~2,326 lines of C#) has no automated tests. The Inno Setup output is functional-tested only by manual install. The PyInstaller spec is import-smoke-tested only.
70+
The WPF .NET 9 installer now has a focused xUnit suite plus CI-only headless install/uninstall smoke wiring. The Inno Setup output has a separate CI-only install/uninstall smoke. The PyInstaller spec is import-smoke-tested only.
7171

72-
This is the **largest single coverage gap** in the project. **F212 — WPF installer test suite** (XL — would need xUnit project + headless install in a Windows runner). **F213 — Inno Setup install/uninstall smoke** (M — install to temp dir, check shortcut creation, uninstall, check cleanup).
72+
Pass 75 closed **F212 — WPF installer test suite**. `installer/tests/OpenCut.Installer.Tests/` covers command-line parsing, path derivation, file copy behavior, progress math, and payload substream reads. `scripts/smoke_wpf_installer.ps1` runs the built WPF installer in quiet mode on Windows runners, installs to a temp root with temp user data, verifies payload/manifest/registry state, and runs quiet uninstall cleanup. Pass 37 closed **F213 — Inno Setup install/uninstall smoke**.
7373

7474
### 3.7 Performance / regression benchmarks
7575

@@ -135,7 +135,7 @@ This is a single F number: **F205**, already on the Now tier.
135135
| F209 | MCP tool ↔ route consistency test | Done in Pass 14 | S |
136136
| [x] F210 | Vitest unit tests for CEP/UXP utility functions | Closed Pass 74 | M |
137137
| F211 | Cross-platform launcher script smoke tests in CI | Next | S |
138-
| F212 | WPF installer test suite (xUnit + headless install) | Later | XL |
138+
| [x] F212 | WPF installer test suite (xUnit + headless install) | Closed Pass 75 | XL |
139139
| [x] F213 | Inno Setup install/uninstall smoke in CI | Closed Pass 37 | M |
140140
| [x] F214 | Extend F128 with ML + TTS perf benchmarks | Closed Pass 40 | M |
141141
| [x] F215 | Extend fuzz harness with 8 additional targets | Closed Pass 38 | M |

0 commit comments

Comments
 (0)