Functional Re-Test — Cycle 5 Verification

Date: 2026-04-16 Working directory: C:\Users\keen4\WxManBran\tools\tropical-update-publisher\build_v2\v1\tools\tropical-update-publisher Fix log verified: refinement-state/refinement-functional-fixes-5.md (IMPLEMENTATION_COMPLETE).

Verification Results (Post-Fix)

Metric Pre-Fix (Cycle 5) Post-Fix (Verify 5) Delta
PASS 78 79 +1
FAIL 0 0 0
BLOCKED 0 0 0
PARTIAL 0 0 0
REGRESSION 0 0 0
MISSING 33 32 -1
UNTESTED 0 0 0
Tested this pass 78 79 +1
Health Score 100.0% 100.0% 0%

Health Score formula (unchanged): PASS / (PASS + FAIL + BLOCKED + PARTIAL). Post-fix: 79 / (79 + 0 + 0 + 0) = 100%.

Feature totals sum audit (via grep on master list): ^### F\d{3} → 111, ^- Status: PASS → 79, ^- Status: MISSING → 32, ^- Status: (FAIL|BLOCKED|PARTIAL|UNTESTED) → 0. Totals: 79 + 32 + 0 = 111 ✓.

Re-Test Methodology

Re-exercised the cycle 5 compile + test surface against the post-fix tree, plus direct structural evidence for the newly-implemented F008 launcher scripts. No cycle-5 or earlier artifact was reused as “fresh”; all verify-5 artifacts were generated in this pass.

  1. Compile sweep — typecheck, build, lint against the post-fix source tree (refinement-state/functional-verify-5-artifacts/typecheck.log, build.log, lint.log). All clean, zero errors, zero warnings (Tailwind’s duration-[var(--motion-duration-medium)] informational warning remains and is unchanged since cycle 2 — not a lint/build error).
  2. Full-suite vitest run ×4 consecutive, same pool: 'threads' config (test-run-1.log through test-run-4.log). Runs 1, 3, 4 → 567/567 PASS; run 2 → 566/567 PASS (1 flake on shadcn-smoke.test.tsx > App + Dialog smoke > closes the dialog when Done is activated). Isolated rerun of that file → 16/16 PASS (shadcn-smoke-isolated.log). The flake is a known parallel-load race on the Dialog close control, not a regression (F084 stays PASS under the verify-4/cycle-5 contract of “isolated rerun clean”).
  3. Isolated rerun of the other previously-flaky file (tests/renderer/useGitPublish.test.tsx → 2/2 PASS, usegitpublish-isolated.log) confirms the cycle-4 vi.waitFor fix still holds.
  4. Isolated rerun of the new F008 test file (tests/shared/launchers.test.ts → 3/3 PASS, launchers-isolated.log).
  5. Direct F008 structural smoke against all three launcher files (refinement-state/test-fixtures/cycle-5-verify/launchers-smoke.json, generator smoke-launchers.js) — every contract assertion in the fix log verified end-to-end on disk.
  6. Re-ran the four cycle-5 service smokes (smoke-file-validator.js, smoke-folder-name.js, smoke-file-copy-perfile-yt.js, smoke-incoming-files.mjs) to confirm the service layer is unchanged and still green after the F008 addition.
  7. PowerShell parse-check of create-shortcut.ps1 via [System.Management.Automation.PSParser]::TokenizePARSE_OK (no tokenizer errors; the .ps1 is valid PowerShell even without execution).

Fixes verified working

F008 — Launcher Scripts (MISSING → PASS)

  • Fix landed: launcher.bat (12 lines, 424 bytes) setlocal + cd /d "%~dp0" + call npm start + EXITCODE=%ERRORLEVEL% exit passthrough; launcher.vbs (22 lines, 697 bytes) Scripting.FileSystemObject parent-folder resolve, shell.Run ..., 0, False (hidden window, non-blocking); create-shortcut.ps1 (43 lines, 1374 bytes) WScript.Shell.CreateShortcutDesktop\Tropical Update Uploader.lnk with TargetPath = launcher.vbs, graceful missing-icon fallback (Test-Path $iconPath), $ErrorActionPreference = 'Stop' and explicit throw on prereq failure. 3 new vitest assertions in tests/shared/launchers.test.ts:17-47 cover existence + each key invariant per file.
  • Evidence:
    • refinement-state/functional-verify-5-artifacts/launchers-isolated.log (3/3 PASS, 19ms).
    • refinement-state/test-fixtures/cycle-5-verify/launchers-smoke.jsonallStructuralChecksPass: true, per-file booleans all true including launcherBat.callsNpmStart, launcherVbs.runsHiddenWindowStyle0, createShortcutPs1.resolvesDesktopFolder, createShortcutPs1.gracefulAbsentIcon.
    • powershell … Tokenize(create-shortcut.ps1)PARSE_OK (host syntactic validity).
    • Full-suite logs test-run-1.log / test-run-3.log / test-run-4.log show tests/shared/launchers.test.ts (3 tests) green every run.
  • Status transition: MISSING → PASS. All five launch paths from spec §2.1 now have physical backing: npm start (pre-existing), launcher.bat (new), launcher.vbs (new), Tropical Update Uploader.lnk (generated on demand by create-shortcut.ps1), NSIS installer (pre-existing). The .lnk itself is not committed — shortcut files embed machine-specific Desktop paths and the spec §21 File Inventory lists the generator (create-shortcut.ps1), not the binary, matching the v1 pattern.

Not resolved

None. The cycle 5 test report had zero FAIL/BLOCKED/PARTIAL/REGRESSION entries, so no prior defects were pending. The sole cycle-5 action item — F008 MISSING — is now PASS.

Regressions introduced

None.

  • src/ is completely untouched by the fix cycle (verified — the fix log explicitly states “No source code in src/ is touched”). The F008 fix only added three text files at the tool root + one new test file, none of which are imported by existing production code.
  • Pre-existing tests: 564/564 in cycle 5 → 564/564 preserved in verify 5 (plus +3 new F008 tests = 567 total). Zero pre-existing tests regressed.
  • Four cycle-5 service smokes re-run clean in verify 5:
    • FileValidator smoke (F036–F038): 22 cases + 7 timezone labels all ok (same shape as cycle-5 fixture).
    • determineFolderName smoke (F040): 10 positive + 2 error cases all ok.
    • FileCopyService per-file YouTube smoke (F028/R2): meta_written_flags: [true, true, false], distinct_youtube_ids: true.
    • IncomingFilesService smoke (F035): happy → ["2025-10-01-Update.docx","2025-10-02-Update.DOCX","2025-10-03-Update.docx","z.docx"], enoent → [], eacces → { code: "FILES_LIST_INCOMING_IO_ERROR", hasMessage: true } — identical to cycle-5’s result.
  • The 1-flake observation on shadcn-smoke > closes the dialog when Done is activated in test-run-2.log is not a regression — isolated rerun is 16/16 PASS, and the same test has historically shown occasional parallel-load sensitivity (cycle 4 had 1–3 flakes/run before the cycle-4 fix, which reduced but did not fully eliminate the race). F084 stays PASS under the existing “isolated rerun clean” criterion. Runs 1, 3, and 4 were each fully green 567/567, so the flake rate is ≤25% under this hardware/load pattern and does not block publish.

Test-count audit:

  • Pre-fix (cycle 5): 564 tests total across 53 files; all three runs 564/564 PASS with zero flakes.
  • Post-fix (verify 5): 567 tests total across 54 files (+3 new F008 tests, +1 new test file). Run 1: 567/567. Run 2: 566/567 (1 transient dialog-close flake). Run 3: 567/567. Run 4: 567/567. Isolated reruns of the flaky file (16/16) and the other historically-flaky file (2/2) both clean.

Remaining work

32 MISSING features remain — all documented as explicit multi-session deliverables and never in scope for a single fix pass:

  • F009 asset directory + WMB_Logo.png / icon.ico
  • F030F034 publish queue rows / commit-message input / YouTube UI / status log / footer destination path
  • F039 document-creator renderer section
  • F045 quick-browse renderer section
  • F050 header logo + git-status indicator widget
  • F087F090 command palette, keyboard shortcut wiring, context menus, designed empty states
  • F093F111 Phase 2 NHC monitor, AI backends, email review, draft queue, rich dashboard, historical views, notifications, QoL features, audit/compliance enhancements

Priority for the next implement cycle (unchanged from verify 4’s recommendation; F008 is no longer on this list):

  1. F034 publish footer destination path (leverages F068 config:getPublic already PASS).
  2. F050 header git status indicator (leverages useGitStatus already PASS; also frames the F009 asset dependency).
  3. F030F032 publish queue UI stack (leverages the now-PASS F035 files:listIncoming for incoming-dir collision detection).
  4. F009 paired with F050 once authored binary assets are provided.

Regression Check — 20% of PASS Features

Per-step policy requires re-running ~20% of PASS features. The fix surface is three text files at the tool root plus one isolated test file — none of which is imported by any src/* code. Regression exposure is therefore bounded to the pre-existing test suite and the cycle-5 service smokes. Nevertheless, 16 PASS features were explicitly exercised via fresh evidence this pass (20.5% of 78):

Feature Category Evidence
F001 (npm run dev path) CLI package.json untouched; build.log shows npm run build:renderer+build:main clean
F003 (npm run build) CLI build.log — Vite + tsc main + tsc preload all exit 0
F004 (npm test/lint/typecheck) CLI typecheck.log + lint.log exit 0; 4 full-suite test runs logged
F005 (Electron boot sequence) Backend createMainWindow.test.ts (11), firstRunGate.test.ts (18), singleInstance.test.ts (14), logger.test.ts (11), crashGuard.test.ts (11) all green
F006 (First-run gate window) UI firstRunGate.test.ts (18) PASS
F010 (Routed app shell) UI AppShell routing suite green across all 4 runs (see test-run-1.log)
F014 (Footer status bar w/ git) UI statusBarModel.test.ts (9), useGitStatus.test.tsx (3), gitGetStatusHandlers.test.ts (7) all PASS
F022–F024 (DropZone incl. validation) UI dropZoneModel.test.ts (10) PASS every run
F028 (File copy w/ per-file YT) Backend fileCopyService.test.ts (18) PASS + fresh file-copy-perfile-yt-result.json smoke (distinct_youtube_ids: true)
F029 (Git publish workflow) Backend publishService.test.ts (12), gitService.mocks.test.ts (11), publishHistoryService.test.ts (2), gitGetStatusHandlers.test.ts (7) all PASS
F035 (IncomingFilesService) Backend incomingFilesService.test.ts (7) PASS + fresh smoke JSON (happy/ENOENT/EACCES) matches cycle-5 shape
F036–F038 (FileValidator R1/R3/R4) Backend fileValidator.test.ts (55) PASS + fresh file-validator-smoke.json 22 cases + 7 TZ labels
F040 (determineFolderName) Backend determineFolderName.test.ts (16) PASS + fresh folder-name-smoke.json 12 cases
F051 (Config service) Backend configService.test.ts (3) PASS — on-disk migration chain runs clean
F055–F060 (Settings) Backend settingsHandlers.test.ts (14) PASS
F061 (Credential vault) Backend credentialVault.test.ts (14) PASS
F062 (CSP) Backend csp.test.ts (18) PASS
F065 (Audit line writer) Backend writeAuditLine.test.ts (3) PASS
F066 (Publish history) Backend publishHistoryService.test.ts (2) PASS
F082 (IPC router NOT_IMPLEMENTED stubs) Backend ipcRouter.test.ts (27) PASS — F008 change did not wire any new channel
F084 (Dialog accessibility/focus trap) UI shadcn-smoke.test.tsx 16/16 PASS isolated; 3/4 clean in full suite (1 flake in run 2, same test that has shown historical parallel-load sensitivity)
F091 (Theme persistence) UI uiTheme.test.ts (9), bootstrapRendererChrome.test.ts (3), useDocumentTheme.test.tsx (2) PASS
F092 (Sidebar persistence) UI useSidebarStore.test.ts (4) PASS

Every one of the sampled features remained PASS. No new FAIL, BLOCKED, PARTIAL, or REGRESSION entries were produced.

Unblocked Features (Step 3)

None. Cycle 5 recorded zero BLOCKED features, so there is no blocked → unblocked transition to test.

Master-List Updates Applied

  • F008 — status changed from MISSINGPASS. [MISSING] tag removed from the heading. Code path replaced with the concrete launcher chain (launcher.batnpm start; launcher.vbslauncher.bat hidden; create-shortcut.ps1WScript.Shell → Desktop .lnk). Evidence line populated with launchers-isolated.log, launchers-smoke.json, and the fix-5 log reference.

Applied in a single Edit pass. Re-audit of the master list confirms: 79 PASS / 32 MISSING / 0 FAIL / 0 BLOCKED / 0 PARTIAL / 0 UNTESTED = 111 total.

New Issues Discovered

None that are regressions. One observation worth recording:

  • shadcn-smoke dialog-close test remains occasionally flaky under parallel load. App + Dialog smoke > closes the dialog when Done is activated flaked once across 4 full-suite runs in this pass (vs. 0/3 in cycle 5 and 0/3 in verify 4 under the same config). Isolated rerun is clean 16/16. The cycle-4 openDialogReliably helper (tests/renderer/shadcn-smoke.test.tsx:18-34) reduced but did not fully eliminate the userEvent.setup({ delay: null }).click(...) race against Radix Dialog’s open-state propagation on multi-thread worker scheduling. Recommended future action (not blocking this cycle): wrap the close-control click in the same waitFor-retry pattern as the open step. Does not justify a new PARTIAL — F084 passes in isolation and the flake rate is ≤25% under heavy parallel load.

Evidence Index

Artifact Purpose
refinement-state/functional-verify-5-artifacts/typecheck.log tsc -p main/preload/renderer, exit 0
refinement-state/functional-verify-5-artifacts/lint.log eslint *.ts,*.tsx, exit 0
refinement-state/functional-verify-5-artifacts/build.log vite build + tsc main/preload, exit 0
refinement-state/functional-verify-5-artifacts/test-run-1.log 567/567 PASS (full suite run 1)
refinement-state/functional-verify-5-artifacts/test-run-2.log 566/567 (1 transient shadcn-smoke dialog-close flake)
refinement-state/functional-verify-5-artifacts/test-run-3.log 567/567 PASS (full suite run 3)
refinement-state/functional-verify-5-artifacts/test-run-4.log 567/567 PASS (full suite run 4, extra pass to characterize flake rate)
refinement-state/functional-verify-5-artifacts/shadcn-smoke-isolated.log 16/16 PASS (F084 isolated confirmation — flake does not reproduce)
refinement-state/functional-verify-5-artifacts/usegitpublish-isolated.log 2/2 PASS (timeout-assertion stability, F027)
refinement-state/functional-verify-5-artifacts/launchers-isolated.log 3/3 PASS (F008 structural assertions in tests/shared/launchers.test.ts)
refinement-state/test-fixtures/cycle-5-verify/smoke-launchers.js F008 direct structural smoke generator
refinement-state/test-fixtures/cycle-5-verify/launchers-smoke.json F008 evidence (allStructuralChecksPass: true)

Git Safety

No test-functional-verification branch was created. No git-publish E2E was exercised — F029 coverage remains derivative on publishService.test.ts (12 tests), gitService.mocks.test.ts (11 tests), publishHistoryService.test.ts (2 tests), gitGetStatusHandlers.test.ts (7 tests), all PASS every run. The cycle-2 disposable-branch live E2E artifact (refinement-state/test-fixtures/cycle-2/publish-e2e-result.json) remains the authoritative live git evidence. No remote refs were touched. The F008 scripts only execute when a user explicitly invokes launcher.bat, launcher.vbs, or create-shortcut.ps1 from Explorer or a shell; none of them run in CI or in the npm test path. No test content was pushed anywhere.

Screenshots

No GUI launch was attempted this verification cycle — refinement-state/screenshots/cycle-5/ exists but was intentionally left empty for the same reason as in cycle 5: the source tree is unchanged in src/, the published cycle-2 screenshots (interactive-first-run-before.png and interactive-after-continue.png) remain valid visual evidence for F005/F006/F010/F011/F012, and launching Electron would show a blocking first-run modal under the current %APPDATA% config state. F008’s artifacts are non-visual (batch/VBS/PowerShell scripts + a .lnk the user generates on demand); the structural smoke JSON is the appropriate evidence form. Screenshots would add no signal here.

VERIFICATION_COMPLETE