docs(01-13): wave-4 task-8 — Plan 01-09 closure-via-harness amendment + STATE.md sync

Lands the Wave 4 closure docs:
- 01-09-PLAN.md Amendment 2: harness PASS (npm run test:uat 14/14 GREEN at d793c9e)
  now closes Plan 01-09 functional contract (original Task 5 steps 4, 5, 7-13, 15);
  operator retains only step 1 (build) + step 14 (brand/design ack — Plan 01-13
  Task 9 charter). Coverage map table pins each retired manual step to its
  corresponding harness assertion (A1-A13).
- STATE.md sync: completed_plans 9->11, percent 92->~95, last_updated
  2026-05-19T10:40:00Z; Current Position narrative replaced with Plan 01-13
  landing summary + outstanding Phase 1 gates (Plan 01-13 Task 9 operator
  checkpoint, Plan 01-10 welcome tab, Plan 01-12 design integration awaiting
  designer reply).

Verification (post-edit, docs-only — no src/ touched):
- npm run test:uat: 14/14 GREEN at d793c9e baseline preserved
- npx vitest: 94/94 (the no-test-hooks-in-prod-bundle.test.ts default 5s timeout
  flake is harness-side, not introduced by this commit; re-run with
  --testTimeout=60000 passes)
- git status post-commit: clean

Followup: ROADMAP.md is missing entries for Plans 01-08 through 01-12 (these were
all added mid-phase across multiple sessions and the roadmap was never amended;
the Phase-1 Plans block lines 74-80 stops at 01-07 and the progress table line
238 shows the stale '7/7 Complete' count). Backfilling those entries is a
separate concern — out of scope for Plan 01-13 closure per plan-checker flag #4
(hold the line; do not inject). STATE.md notes the counter > total mismatch for
visibility.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-05-19 10:50:13 +02:00
parent d793c9e1e5
commit 9c5ff8b2a7
2 changed files with 66 additions and 13 deletions

View File

@@ -582,6 +582,42 @@ NO 'as any', NO @ts-ignore — every new chrome.* call must be properly typed vi
- grep -n "notifications" manifest.json returns at least one match within the permissions array.
</verification>
## Amendment 2 (2026-05-19) — Closure via Plan 01-13 Harness
**Closure gate change.** Task 5's 15-step operator-driven empirical checkpoint is superseded as the primary closure gate by Plan 01-13's Puppeteer-based UAT harness (`npm run test:uat`). At commit `d793c9e` (Plan 01-13 Wave 3D) all 14 harness assertions are GREEN; the harness drives Chrome end-to-end via an extension-internal page (`tests/uat/extension-page-harness.html`) with synthetic `getDisplayMedia` + offscreen test hooks, and exercises every functional contract Task 5 originally verified manually. See `.planning/phases/01-stabilize-video-pipeline/01-13-SUMMARY.md` (written post-Task-9 of Plan 01-13) for the assertion-to-contract mapping.
**Coverage map — original Task 5 steps now covered by `npm run test:uat`:**
| Task 5 step | Original manual check | Harness assertion |
|-------------|----------------------|-------------------|
| Step 4 | onStartup notification fires within ~2 s | A8 (Bug A canonical: chrome.notifications.create called once with valid icon) |
| Step 5 | Picker is monitor-only (entire-screen) | A3 (displaySurface === 'monitor' on captured track via synthetic stream) |
| Step 7 | Badge transitions to REC on START_RECORDING | A2 (chrome.action badge text === 'REC' after toolbar onClicked path) |
| Step 8 | Buffer holds last 30 s across continuous capture | A11 (35 s synthetic playback yields ≥ 3 self-contained segments via offscreen test hook) |
| Step 9 | Popup opens (NOT picker) on toolbar click while recording; SAVE produces zip | A4 + A5 (setPopup pointing at SAVE-only popup during isRecording; SAVE_ARCHIVE → chrome.downloads zip) |
| Step 10 | Zip contains video/last_30sec.webm that plays end-to-end | A12 + A13 (ffprobe-via-host on extracted webm; zip structure + meta.json schema validation) |
| Step 11 | Stop-sharing → badge OFF, NO recovery notification (Bug B fix) | A6 (Bug B canonical: track.dispatchEvent('ended') → badge='', notification count delta = 0) |
| Step 12 | Post-stop toolbar click re-triggers picker | A6 indirectly + A4 (setPopup back to '' after stop puts onClicked in path) |
| Step 13 | Idle toolbar click triggers picker directly | A1 (SW bootstraps with setIdleMode → setPopup('')); A2 covers the click → REC path |
| Step 15 | ERROR state + recovery notification for genuine error codes | A7 (synthetic RECORDING_ERROR with non-user-stopped code → ERR badge + recovery notification create) |
Original Task 5 step 6 (manual picker dismiss + accept) is a UI-handler step subsumed by A3's synthetic-stream bypass — the picker UI itself is not the contract; the post-grant `displaySurface === 'monitor'` validation is, and A3 pins it.
**Operator steps retained:**
The harness cannot verify two things, both retained as operator-facing gates:
1. **Step 1 (build verification)** — `npm run build` must exit 0 against the operator's local toolchain (Node version, npm registry availability, etc.). The harness assumes `dist/` exists; this step is the build-environment sanity check.
2. **Step 14 (brand / design check)** — Plan 01-13's charter explicitly does NOT cover visual / brand / typography correctness (notification iconography, badge color contrast against the operator's OS theme, popup typography rendering on the operator's locale). This is the operator-only gate per Plan 01-13's scope. The operator visually inspects the loaded extension on their actual Chrome + OS combination and confirms the brand presentation matches the design intent.
**What Plan 01-09 closure now requires:**
- `npm run build` exit 0 (operator's local sanity check — Step 1 retained).
- `npm run test:uat` exit 0 with 14/14 GREEN (replaces operator Steps 4, 5, 7-13, 15 — the functional contract).
- Operator brand/design ack on the loaded extension (Step 14 retained as the operator gate Plan 01-13 carves out).
The historical 15-step empirical checkpoint (lines 519-548 above) remains in this document as the reference for the original closure intent, and as a fallback if the harness toolchain becomes unavailable (e.g., Puppeteer breakage on a future Chrome major where the harness needs revision).
<success_criteria>
Plan 01-09 is complete when:
1. The 4 displaySurface tests + 13 toolbar/badge/notification/popup-idle-race tests (17 new total) are all GREEN.