Functional Testing — Cycle 8

Date: 2026-04-16 Working directory: C:\Users\keen4\WxManBran\tools\tropical-update-publisher\build_v2\v1\tools\tropical-update-publisher Baseline: refinement-functional-verify-7.md (81 PASS / 30 MISSING / 100.0% health). Mode: STABILITY cycle — no source edits required; cycle scope is re-verification of the verify-7 landing state.

Summary Table

Metric Cycle 7 (test report) Verify 7 (baseline) Cycle 8 (this report) Δ vs Cycle 7 Δ vs Verify 7
Total features 111 111 111 0 0
PASS 80 81 81 +1 0
FAIL 0 0 0 0 0
BLOCKED 0 0 0 0 0
PARTIAL 0 0 0 0 0
REGRESSION 0 0 0 0 0
MISSING 31 30 30 −1 0
UNTESTED 0 0 0 0 0
Health Score 100.0% 100.0% 100.0% 0.0% 0.0%

Health Score formula: PASS / (PASS + FAIL + BLOCKED + PARTIAL) = 81 / 81 = 100.0%.

Master-list audit (direct grep against refinement-functional-master-list.md):

  • ^### F[0-9]111 feature sections (matches legend).
  • ^- Status: PASS$81.
  • ^- Status: MISSING$30.
  • ^- Status: (FAIL|BLOCKED|PARTIAL|UNTESTED)$0.
  • Totals sum: 81 + 30 + 0 = 111 ✓.

Cycle-8 delta attribution: zero transitions. The +1 PASS / −1 MISSING vs. Cycle 7 landed during the verify-7 fix cycle (F034 MISSING → PASS via wired PublishFooter + tests/renderer/publishFooter.test.tsx); Cycle 8 is a stability-only pass — no status fields moved on the master list this cycle and no master-list edit is required.

Phase 0 — Mechanical Completeness Sweep

All three gates exit 0 with the current source tree and a fresh renderer rebuild:

Command Result Log
npm run build exit 0 (Vite renderer dist/renderer/assets/index-DHPen0XE.js 984.45 kB / index-DOffPx65.css 53.56 kB + tsc main + tsc preload) refinement-state/functional-cycle-8-artifacts/build.log
npm run typecheck exit 0 (main + preload + renderer) refinement-state/functional-cycle-8-artifacts/typecheck.log
npm run lint exit 0 (zero warnings) refinement-state/functional-cycle-8-artifacts/lint.log

The Vite build continues to emit the same Tailwind informational warning on duration-[var(--motion-duration-medium)] that has been present since cycle 2 — not an error, unchanged since verify-7. Renderer bundle size is identical to verify-7 (984.45 kB) — confirms zero source drift since verify-7 landed.

N = 0 compile errors. No fixes needed before feature testing; proceeded directly to the full-suite stability runs and direct service smokes.

Full-Suite Test Runs (× 3 consecutive)

Run Test Files Tests Duration Start Log
1 55/56 PASS (1 failed) 577/578 PASS (1 failed) 43.79s 21:33:32 refinement-state/functional-cycle-8-artifacts/test-run-1.log
2 55/56 PASS (1 failed) 577/578 PASS (1 failed) 82.34s 21:34:29 refinement-state/functional-cycle-8-artifacts/test-run-2.log
3 56/56 PASS 578/578 PASS 35.04s 21:36:05 refinement-state/functional-cycle-8-artifacts/test-run-3.log

Result: 1/3 runs fully green (run 3). Runs 1 and 2 both tripped the same Radix Dialog parallel-load flake on tests/renderer/shadcn-smoke.test.tsx > App + Dialog smoke > keeps keyboard focus inside the dialog while open (focus trap / error path: focus must not leak) — this is the same focus-trap variant that tripped verify-7 run 1. Cycle 7 was the first 3/3-clean cycle since cycle 4; cycle 8 returns to a flakier pattern (1/3 clean) — back-to-back hits on the same test indicate the parallel-load race window may be wider in this run’s machine load than during verify-7.

Test-count delta: identical to verify-7 (578 tests across 56 files). No new tests landed; no tests removed; every green-run test count identical.

Failure root cause (both runs): expect(dialog.contains(active)).toBe(true) at tests/renderer/shadcn-smoke.test.tsx:173. The dialog is mounted but document.activeElement does not yet point inside the dialog by the time the 15s waitFor polls. This is a render/effect timing race in Radix Dialog’s Focus Scope setup under parallel-loaded test pools — not a regression in any F-feature implementation.

Isolated Reruns — regression check on historically flaky specs

Test File Result Duration Log
tests/renderer/shadcn-smoke.test.tsx 16/16 PASS 16.40s (1.68s test time) refinement-state/functional-cycle-8-artifacts/shadcn-smoke-isolated.log
tests/renderer/publishFooter.test.tsx 4/4 PASS 5.14s (329ms test time) refinement-state/functional-cycle-8-artifacts/publishFooter-isolated.log
tests/renderer/useGitPublish.test.tsx 2/2 PASS 4.71s (159ms test time) refinement-state/functional-cycle-8-artifacts/useGitPublish-isolated.log

All three specs green on first isolated invocation. The shadcn-smoke 16/16 clean (including the keeps keyboard focus inside the dialog while open test that failed in runs 1+2) proves the run-1+2 failures were a parallel-load flake, not a regression. Both publishFooter (verify-7 landed) and useGitPublish (verify-7’s other historically tracked spec) ran green isolated.

Direct Service Smoke Evidence — regenerated against dist/

Five service-level smokes regenerated in refinement-state/test-fixtures/cycle-8/ using the cycle-7 generators (modified only to stamp cycle: 8 and use cycle8- tmp prefixes):

Feature Generator Fixture Result
F008 launcher scripts smoke-launchers.js launchers-smoke.json 14/14 structural checks PASS (allStructuralChecksPass: true; bat 424 B / vbs 697 B / ps1 1374 B — identical bytecounts to cycle-7 / verify-7)
F036 / F037 / F038 FileValidator (R4) smoke-file-validator.js file-validator-smoke.json 22/22 cases + 8 TZ labels — total ok=11, tzCount=8 (matrix identical to verify-7; results + tzResults JSON byte-equal)
F044 determineFolderName smoke-folder-name.js folder-name-smoke.json 13/13 cases — total ok=11 (positive priority matrix + 2 expected-empty error paths; identical to verify-7)
F028 / R2 FileCopyService per-file YouTube smoke-file-copy-perfile-yt.js file-copy-perfile-yt-result.json 3 files copied, metaWritten: [true, true, false], distinct YouTube IDs = true, meta3 absent = true (verify block byte-equal to verify-7)
F035 IncomingFilesService smoke-incoming-files.mjs incoming-files-smoke.json happy path returns 4 names alpha-sorted (2025-10-01-Update.docx, 2025-10-02-Update.DOCX, 2025-10-03-Update.docx, z.docx) + ENOENT → [] + empty dir → [] + EACCES → FILES_LIST_INCOMING_IO_ERROR (data byte-equal to verify-7 sans timestamp / cycle marker)

Every smoke matched its verify-7 counterpart byte-for-byte (excluding only timestamp + cycle markers — verified via JSON.stringify equality script). Service-layer contracts remain byte-stable for two consecutive cycles now (verify-7 → cycle-8 = no drift, after cycle-7 → verify-7 = no drift).

Source Tree Stability

A mtime scan across src/ and tests/ (script: refinement-state/test-fixtures/cycle-8/mtime-scan.js, log: refinement-state/functional-cycle-8-artifacts/mtime-scan.log) returns the verify-7-landed set with no new entries. Top-7 most-recently-modified files (all timestamped 2026-04-16, all unchanged since verify-7):

File Last mtime Status
tests/renderer/publishFooter.test.tsx 2026-04-17T00:48:54Z F034 verify-7 landing — unchanged
src/renderer/routes/Placeholders.tsx 2026-04-17T00:47:39Z F034 verify-7 wiring — unchanged
src/renderer/components/EmptyState.tsx 2026-04-16T23:51:46Z F090 cycle-7 — unchanged
tests/renderer/emptyState.test.tsx 2026-04-16T23:49:44Z F090 cycle-7 — unchanged
src/renderer/features/publish/PublishFooter.tsx 2026-04-16T20:51:35Z F034 component — unchanged
tests/shared/launchers.test.ts 2026-04-16T20:15:20Z F008 — unchanged
tests/renderer/useGitPublish.test.tsx 2026-04-16T19:39:25Z F029 derivative — unchanged

No other source files have been modified since verify-7. All 143 src/tests files scanned. The tool-root launcher scripts, package.json, vitest.config.ts, tsconfig*.json, and every other main/preload/renderer file is byte-identical to the verify-7 snapshot.

Test file list count (refinement-state/test-fixtures/cycle-8/count-test-files.jsrefinement-state/functional-cycle-8-artifacts/test-files-count.log): 56 test files matching \.test\.(ts|tsx|js)$. Matches the verify-7 count exactly.

Carry-Over Findings

None. F034 was promoted to PASS in verify-7 with full live wiring + 4-test isolated coverage. Verify-7’s prior carry-over (PublishFooter orphaned dead code from cycle-7) has been resolved.

No new orphans detected this cycle. No dead-code paths discovered. The prior verify-7 finding 1 (carry-over closed) is the last remaining note from the multi-cycle backlog.

Detailed Findings

FAIL list

None. Zero FAIL features this cycle. All 81 PASS features retain PASS via:

  • Run 3’s full clean 578/578 sweep (covers 80 of 81 PASS features — every test-covered feature runs at least once green).
  • Isolated reruns of publishFooter (4/4) + useGitPublish (2/2) re-verify the F034 + F029 derivative paths even if they had landed in runs 1 or 2’s flake (they did not — only shadcn-smoke did).
  • Direct service smokes re-verify F008 + F028 + F035 + F036 + F037 + F038 + F044 service-layer contracts byte-equal to verify-7.

BLOCKED list

None. Zero BLOCKED features. No external-dependency gates tripped this cycle (no live NHC fetch, no live git push, no live email).

PARTIAL list

None. Zero PARTIAL features.

REGRESSION list

None. Zero PASS → FAIL/PARTIAL/BLOCKED transitions. The two parallel-load flake activations on shadcn-smoke.test.tsx > keeps keyboard focus inside the dialog while open are infrastructure flake (Radix Dialog focus-trap timing race), not implementation regressions:

  • The App + Dialog smoke describe block is a synthetic smoke test that exercises shadcn UI primitives generically, not a verifier for any specific F-feature on the master list.
  • The same test passes 16/16 in isolated invocation (1.68s test time) — proves the focus-trap behavior itself is correct.
  • The flake has been observed periodically since cycle 4 (when the test first landed) and has never blocked a cycle landing.

MISSING inventory — 30 features (unchanged from verify-7)

  • F009 assets/ + WMB_Logo.png / icon.ico — MEDIUM
  • F030–F033 publish queue rows / commit-message input / YouTube UI / status log — HIGH (core publish-view UX). F034 was the fifth in this cluster and now PASSES (verify-7 landing).
  • F039 document-creator renderer section — HIGH
  • F045 quick-browse renderer section — HIGH
  • F050 header logo + git-status indicator widget — MEDIUM
  • F087–F089 command palette / shortcut wiring / context menus — MEDIUM
  • F093–F111 Phase 2 (NHC/AI/email/draft queue/rich dashboard/historical/notifications/QoL/audit compliance) — deferred multi-session scope

Priority bucketing is unchanged from verify-7; no priority drift this cycle.

New Discoveries (Stability Mode)

  1. Cycle 8 hit the parallel-load flake twice in a row — runs 1 and 2 both tripped on keeps keyboard focus inside the dialog while open. Cycle 7 saw 0/3 hits, verify-7 saw 1/3 hits, cycle 8 saw 2/3 hits. Interpretation: the flake activation rate is sensitive to environmental factors (machine load, parallel pool scheduling, GC timing) outside our control. The verify-6 contingency plan (move shadcn-smoke.test.tsx to a single-threaded test project) becomes more attractive after this cycle’s elevated activation rate, but I am not recommending the move yet — the test passes 16/16 in isolation in 1.68s, so the flake remains an infrastructure timing artifact, not a regression. If a future cycle hits 3/3 on the same variant, the move should land.
  2. F034 PASS holds for a second consecutive cycle — verify-7 landed it; cycle-8 confirms via 4/4 isolated rerun + green pass in run-3 of the full suite. The component renders, the IPC handler returns the snapshot, the error/loading branches are exercised, and the <footer aria-label="Publish destination path"> landmark is asserted. No regression risk detected.
  3. Service-layer byte-stability now confirmed for two consecutive cycles — every direct smoke fixture (F008, F028+R2, F035, F036+F037+F038, F044) matches verify-7 byte-for-byte (sans timestamp / cycle marker). The implementation surface for these feature clusters is settled.
  4. No spec drift detectedproject-spec.md unchanged since cycle 6. Section 6.9 footer copy still matches PublishFooter’s rendered text (verified in verify-7 finding-set, still true this cycle because neither spec nor implementation moved).

Git Safety

  • No live git-publish E2E was executed this cycle. F029 (Git Publish Workflow) derivative coverage held green across the full-suite runs:
    • tests/main/publishService.test.ts — 12/12 PASS in every run.
    • tests/main/gitService.mocks.test.ts — 11/11 PASS in every run.
    • tests/main/publishHistoryService.test.ts — 2/2 PASS in every run.
    • tests/main/gitGetStatusHandlers.test.ts — 7/7 PASS in every run.
  • The cycle-2 disposable-branch E2E artifact (refinement-state/test-fixtures/cycle-2/publish-e2e-result.json) remains authoritative live evidence — no live git layer change has landed since.
  • No disposable test branches created this cycle. No remote refs touched. No main writes. No config.json mutations. No worktrees or stashes introduced. Git working tree unchanged.

This matches the cycle-6 / cycle-7 / verify-7 guidance: use the live disposable-branch E2E only when a git-layer change lands; otherwise the static mocked-git suite is sufficient regression signal.

GUI / Screenshots

  • No live Electron launch attempted this cycle. Source tree byte-unchanged since verify-7 (mtime scan above), so GUI visuals are identical to the verify-7 snapshot.
  • Cycle-2 screenshots (refinement-state/screenshots/cycle-2/interactive-first-run-before.png, interactive-after-continue.png) remain representative of the app shell.
  • refinement-state/screenshots/cycle-8/ intentionally left empty; next fix cycle should repopulate when F030–F033 (publish queue/commit-message/YouTube UI/status log) UI lands.
  • F034’s visual contract (footer landmark with aria-label="Publish destination path", polite live region for loading state, error branch with structured IPC failure copy, happy-path “Files are copied to {fullIncomingPath}” rendering) is asserted at the DOM level by the 4 tests in publishFooter.test.tsx (green in run 3 + isolated rerun) — no additional GUI inspection signal needed.
  • F090’s visual contract (icon chip, title, description, onboarding links, accessibility landmarks) is asserted at the DOM level by the 7 tests in emptyState.test.tsx (green in run 3) — no additional GUI inspection signal needed.

Evidence Index

  • Compile sweep: refinement-state/functional-cycle-8-artifacts/build.log, typecheck.log, lint.log
  • Full suite runs: refinement-state/functional-cycle-8-artifacts/test-run-1.log (577/578, 43.79s, flake on shadcn-smoke focus-trap), test-run-2.log (577/578, 82.34s, same flake), test-run-3.log (578/578, 35.04s, fully green)
  • Isolated reruns: shadcn-smoke-isolated.log (16/16 in 1.68s — flake-test passes isolated), publishFooter-isolated.log (4/4 in 329ms), useGitPublish-isolated.log (2/2 in 159ms)
  • Direct service smoke logs: smoke-launchers.log, smoke-file-validator.log, smoke-folder-name.log, smoke-file-copy-perfile-yt.log, smoke-incoming-files.log
  • Fixture outputs (regenerated this cycle, byte-equal to verify-7 sans timestamp/cycle): refinement-state/test-fixtures/cycle-8/launchers-smoke.json, file-validator-smoke.json, folder-name-smoke.json, file-copy-perfile-yt-result.json, incoming-files-smoke.json
  • Generator scripts: refinement-state/test-fixtures/cycle-8/smoke-launchers.js, smoke-file-validator.js, smoke-folder-name.js, smoke-file-copy-perfile-yt.js, smoke-incoming-files.mjs
  • Scratch scripts: refinement-state/test-fixtures/cycle-8/count-test-files.js (test file enumerator), mtime-scan.js (source tree stability scan)
  • Source tree audit: refinement-state/functional-cycle-8-artifacts/mtime-scan.log (143 files scanned, top-25 emitted), test-files-count.log (56 test files enumerated)

Master-List Update

No edits required this cycle. Master list is already correctly aligned with verify-7 state:

  • F034: PASS (verify-7 landing held; 4/4 isolated rerun + run-3 full-suite re-verification this cycle).
  • F090: PASS (cycle-7 landing held; 7/7 emptyState tests green in run 3).
  • All other 79 PASS features: no evidence drift; covered by run 3’s full clean 578-test sweep.
  • All other 30 MISSING features: no code progress; statuses unchanged.

Totals reconfirmed: 81 PASS + 30 MISSING + 0 other = 111 ✓ (matches legend).

Verification That State Is Accurately Recorded

Master list totals audited directly via grep against refinement-state/refinement-functional-master-list.md:

  • ^### F[0-9] → 111 feature sections ✓
  • ^- Status: PASS$ → 81 ✓
  • ^- Status: MISSING$ → 30 ✓
  • ^- Status: (PARTIAL|FAIL|UNTESTED|BLOCKED)$ → 0 ✓

Totals sum: 81 + 30 + 0 + 0 + 0 + 0 = 111

Health Score: 81 / (81 + 0 + 0 + 0) = 100.0%

Direct service smoke artifacts all regenerated and match verify-7 byte-for-byte (sans timestamp / cycle). Full-suite Run 3 fully green. Isolated reruns of historically flaky specs all green on first invocation. No regressions. No demotions. No promotions.


End of cycle 8 report. Stability cycle: zero code changes, zero status transitions, 1/3 full-suite runs green (cleanest run = run 3 at 578/578 in 35.04s), all 5 direct service smokes reconfirmed byte-equal to verify-7. The two flake activations on shadcn-smoke.test.tsx > keeps keyboard focus inside the dialog while open are infrastructure-timing artifacts (test passes 16/16 in 1.68s isolated), not regressions in any F-feature. The codebase remains at 100% health on 81 PASS features; 30 MISSING features continue to be deferred multi-session scope. Watch flag for next cycle: if 3/3 runs hit the same focus-trap flake variant, escalate the verify-6 contingency plan (move shadcn-smoke.test.tsx to a single-threaded test project).

TESTING_COMPLETE