Functional Testing — Cycle 8
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.js → refinement-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 — onlyshadcn-smokedid). - 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 smokedescribe 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)
- 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 (moveshadcn-smoke.test.tsxto 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. - 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. - 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.
- No spec drift detected —
project-spec.mdunchanged since cycle 6. Section 6.9 footer copy still matchesPublishFooter’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
mainwrites. Noconfig.jsonmutations. 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 inpublishFooter.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