Functional Testing — Cycle 7

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-6.md (80 PASS / 31 MISSING / 100.0% health). Mode: STABILITY cycle — no source edits required; cycle scope is re-verification of the verify-6 landing state.

Summary Table

Metric Cycle 6 (test report) Verify 6 (baseline) Cycle 7 (this report) Δ vs Cycle 6 Δ vs Verify 6
Total features 111 111 111 0 0
PASS 79 80 80 +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 32 31 31 −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) = 80 / 80 = 100.0%.

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

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

Cycle-7 delta attribution: zero transitions. The +1 PASS / −1 MISSING vs. Cycle 6 landed during Verify 6 (F090 MISSING → PASS); Cycle 7 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 typecheck exit 0 (main + preload + renderer) refinement-state/functional-cycle-7-artifacts/typecheck.log
npm run lint exit 0 (zero warnings) refinement-state/functional-cycle-7-artifacts/lint.log
npm run build exit 0 (Vite renderer dist/renderer/assets/index-*.js 982.09 kB / index-*.css 53.56 kB + tsc main + tsc preload) refinement-state/functional-cycle-7-artifacts/build.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-6.

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 Log
1 55/55 PASS 574/574 PASS 31.75s refinement-state/functional-cycle-7-artifacts/test-run-1.log
2 55/55 PASS 574/574 PASS 45.02s refinement-state/functional-cycle-7-artifacts/test-run-2.log
3 55/55 PASS 574/574 PASS 82.84s refinement-state/functional-cycle-7-artifacts/test-run-3.log

All three runs fully green. This is an improvement over verify-6 (2/3 runs clean, run 1 tripped the known Radix Dialog parallel-load flake in shadcn-smoke.test.tsx > App + Dialog smoke > opens the dialog and shows the titled input field) and over cycle 6 (2/3 runs clean, run 3 tripped the same flake family on closes the dialog when Done is activated). Cycle 7 recorded zero flake activations across 1,722 test executions (3 × 574).

Test-count delta: identical to verify-6 (574 tests across 55 files). No new tests landed between verify-6 and cycle 7; no tests removed. Zero regressions in any pre-existing test.

Isolated Reruns — regression check on historically flaky specs

Test File Result Duration Log
tests/renderer/shadcn-smoke.test.tsx 16/16 PASS 16.99s (5.75s test time) refinement-state/functional-cycle-7-artifacts/shadcn-smoke-isolated.log
tests/renderer/useGitPublish.test.tsx 2/2 PASS 8.00s (258ms test time) refinement-state/functional-cycle-7-artifacts/usegitpublish-isolated.log

Both specs green on a single invocation — no retry needed. Combined with the clean 3/3 full-suite runs, this is the cleanest cycle-7 flake signal since cycle 4 (which first introduced shadcn-smoke.test.tsx).

Direct Service Smoke Evidence — regenerated against dist/

Five service-level smokes regenerated in refinement-state/test-fixtures/cycle-7/ using the cycle-6-verify generators (modified only to stamp cycle: 7 and use cycle7- 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 verify-6)
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-6)
F044 determineFolderName smoke-folder-name.js folder-name-smoke.json 13/13 cases — total ok=11 (positive priority matrix + 2 error paths)
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
F035 IncomingFilesService smoke-incoming-files.mjs incoming-files-smoke.json happy path returns 4 names + ENOENT → [] + empty dir → [] + EACCES → FILES_LIST_INCOMING_IO_ERROR

Every smoke matched its verify-6 counterpart exactly (except timestamp / cycle marker). Service-layer contracts remain byte-stable since cycle 6 landed R2 and verify-6 regenerated them.

Source Tree Stability

A mtime scan across src/ and tests/ (script: refinement-state/test-fixtures/cycle-7/mtime-scan.js) returns the verify-6-landed set plus one orphan, all timestamped 2026-04-16 (between cycle-6 test report and verify-6 landing):

  • src/renderer/components/EmptyState.tsx — F090 primitive (wired). No change since verify-6.
  • src/renderer/routes/Placeholders.tsx — F090 consumers (Drafts / Storms / History). No change since verify-6.
  • tests/renderer/emptyState.test.tsx — F090 tests (7/7 PASS in full suite). No change since verify-6.
  • src/renderer/features/publish/PublishFooter.tsx — orphaned F034 attempt. Still dead code; see “Carry-Over Finding” below.

No other source files have been modified since verify-6. 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-6 snapshot.

Test file list count (refinement-state/test-fixtures/cycle-7/list-test-files.js): 55 test files matching \.test\.(ts|tsx|js)$. Matches the verify-6 count exactly.

Carry-Over Finding — F034 PublishFooter still orphaned

src/renderer/features/publish/PublishFooter.tsx (103 LOC, timestamped 2026-04-16 16:51:35) remains in the tree but not wired:

  • grep -rln PublishFooter src/ → only src/renderer/features/publish/PublishFooter.tsx itself (1 hit).
  • grep -rln PublishFooter tests/ → zero hits.
  • No route imports it. No IPC handler references it. No test file exercises it.

Verify-6 finding 1 (refinement-functional-verify-6.md:158-184) already recorded this. No remediation landed between verify-6 and cycle 7; the artifact’s status is unchanged.

Status decision (reconfirmed): F034 remains MISSING. Per rule 10 of the verify methodology, a PASS transition requires live wiring + test coverage + user-visible evidence. None of the three are present this cycle. Flagged again for the next fix cycle with the same two-path remediation offered in verify-6:

  1. Finish it — import <PublishFooter/> into PublishPlaceholder, add tests/renderer/publishFooter.test.tsx (4 tests: error state, loading state, data state with fullIncomingPath, accessibility landmarks), ensure QueryClient provider covers the Publish route (already present via MemoryRouter in publishPlaceholder.test.tsx).
  2. Remove itgit rm src/renderer/features/publish/PublishFooter.tsx as an aborted attempt.

Either path closes the dead-code carryover. Leaving the file as-is risks bit-rot against spec §6.9 if fullIncomingPath exposure shape shifts in a future configGetPublic change.

Detailed Findings

FAIL list

None. Zero FAIL features this cycle. All 80 PASS features retained PASS via the full-suite runs + isolated reruns + direct service smokes.

BLOCKED list

None. Zero BLOCKED features. No external-dependency gates tripped this cycle.

PARTIAL list

None. Zero PARTIAL features.

REGRESSION list

None. Zero PASS → FAIL/PARTIAL/BLOCKED transitions. The three full-suite runs came in 3/3 clean (an improvement over verify-6’s 2/3 and cycle-6’s 2/3); the historically flaky Radix Dialog specs stayed green.

MISSING inventory — 31 features (unchanged from verify-6)

  • F009 assets/ + WMB_Logo.png / icon.ico — MEDIUM
  • F030–F034 publish queue rows / commit-message input / YouTube UI / status log / footer destination path — HIGH (core publish-view UX; F034 has orphaned dead code awaiting wire-up)
  • 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-6; no priority drift this cycle.

New Discoveries (Stability Mode)

  1. Cycle 7 is the first 3/3-green full-suite cycle since cycle 4 — cycles 4, 5, 6, and verify-6 all logged exactly one parallel-load Dialog flake across their 3-run gauntlet. Cycle 7 ran 1,722 test executions without a single flake activation. Interpretation: either the flake’s activation probability is near the tail of the distribution and cycle 7 happened to miss it, or the Vitest v3.2.4 + threaded-pool timing has stabilized enough that the race window is now small enough to miss in a 3-run sample. No action: the verify-6 contingency plan (move shadcn-smoke.test.tsx to a single-threaded test project) stays on standby; only if two consecutive future cycles both green 3/3 would I consider the race truly closed.
  2. F034 carry-over is a one-cycle-old orphan — unchanged since verify-6. Re-flagging for the next fix cycle.
  3. No spec drift detectedproject-spec.md unchanged since cycle 6. Section 23.9 empty-state copy still matches F090’s live rendering (verified in verify-6 finding 5, still true this cycle because neither spec nor implementation moved).
  4. Service-layer byte stability — every one of the 5 cycle-7 smoke fixtures is byte-equivalent to its verify-6 counterpart (sans timestamp + cycle marker). This is the first cycle where all 5 service smokes regenerated without any content drift — earlier cycles had minor ordering or field changes as the implementations matured.

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 disposable test branches created this cycle. No remote refs touched. No main writes. No config.json mutations.
  • Nothing on main changed. No worktrees or stashes introduced.

This matches the cycle-6 / verify-6 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 unchanged since verify-6, so GUI visuals are identical to the verify-6 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-7/ intentionally left empty; next fix cycle should repopulate when F034 wiring or F030-F033 UI lands.
  • 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 all 3 full-suite runs) — no additional GUI inspection signal needed.

Evidence Index

  • Compile sweep: refinement-state/functional-cycle-7-artifacts/typecheck.log, lint.log, build.log
  • Full suite runs: refinement-state/functional-cycle-7-artifacts/test-run-1.log (574/574, 31.75s), test-run-2.log (574/574, 45.02s), test-run-3.log (574/574, 82.84s)
  • Isolated reruns: shadcn-smoke-isolated.log (16/16), usegitpublish-isolated.log (2/2)
  • Direct service smoke logs: smoke-file-validator.log, smoke-folder-name.log, smoke-file-copy-perfile-yt.log, smoke-incoming-files.log, smoke-launchers.log
  • Fixture outputs (regenerated this cycle): refinement-state/test-fixtures/cycle-7/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-7/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-7/list-test-files.js (test file enumerator), mtime-scan.js (source tree stability scan)

Master-List Update

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

  • F090: PASS, wired to src/renderer/components/EmptyState.tsx + three consumer routes. No change.
  • F034: MISSING, despite orphaned PublishFooter.tsx (carryover — see finding above).
  • All other 79 PASS features: no evidence drift.
  • All other 30 MISSING features: no code progress.

Totals reconfirmed: 80 PASS + 31 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$ → 80 ✓
  • ^- Status: MISSING$ → 31 ✓
  • ^- Status: (PARTIAL|FAIL|UNTESTED|BLOCKED)$ → 0 ✓

Totals sum: 80 + 31 + 0 + 0 + 0 + 0 = 111

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

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


End of cycle 7 report. Stability cycle: zero code changes, zero status transitions, 3/3 full-suite runs green (cleanest cycle since cycle 4), all 5 direct service smokes reconfirmed. The one open item — F034’s orphaned PublishFooter.tsx dead code — carries over from verify-6 for the next fix cycle. The codebase remains at 100% health on 80 PASS features and 31 MISSING features continue to be deferred multi-session scope.

TESTING_COMPLETE