Files
mokosh/.planning/phases/03-spec-10-smoke-verification-dom-event-log-verification/03-05-PLAN.md
Mark b3bfbf4a8d feat(03): plans 01-05 — Phase 3 SPEC §10 smoke + DOM/event-log verification
5 plans across 5 waves (Wave 2 sequential per RESEARCH Pitfall 6 file overlap):
- 03-01 Wave 1: rrweb DOM verification harness extension (A29; REQ-rrweb-dom-buffer; §10 #4)
- 03-02 Wave 2: event-log verification harness extension (A30; REQ-user-event-log; §10 #5)
- 03-03 Wave 3: §10 #8 password-filter PARTIAL verification (A31; D-P3-02 charter)
- 03-04 Wave 4: §10 #9 RAM ceiling best-effort + Page.metrics scaffolding (A32; D-P3-04)
- 03-05 Wave 5: §10 sweep VERIFICATION.md + REQUIREMENTS/ROADMAP/STATE marker flips
  (REQ-install-clean + REQ-rrweb-dom-buffer + REQ-user-event-log)

Each plan has:
- frontmatter (wave + depends_on + files_modified + autonomous + requirements + tags + must_haves)
- tasks with mandatory <read_first> + <acceptance_criteria> + concrete <action>
- <threat_model> block per security gate
- Validation map row(s) added to 03-VALIDATION.md (10 tasks total)

Expected UAT growth: 29/29 → 33/33 GREEN (A29-A32 + 03-05 docs).
Expected vitest baseline preserved: 171/171.
Expected Tier-1 FORBIDDEN_HOOK_STRINGS: 12 (A29+ ride production surfaces only).

ROADMAP.md Phase 3 entry replaces "Plans: TBD" with full 5-plan list.
VALIDATION.md status: planner_filled (nyquist_compliant: true; wave_0_complete: true).

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-20 19:01:21 +02:00

732 lines
53 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
---
phase: 03
slug: spec-10-smoke-verification-dom-event-log-verification
plan: 05
type: execute
wave: 5
depends_on:
- 01
- 02
- 03
- 04
files_modified:
- .planning/phases/03-spec-10-smoke-verification-dom-event-log-verification/03-VERIFICATION.md
- .planning/REQUIREMENTS.md
- .planning/ROADMAP.md
- .planning/STATE.md
autonomous: true
requirements:
- REQ-install-clean
- REQ-rrweb-dom-buffer
- REQ-user-event-log
tags:
- verification
- spec-10-sweep
- aggregator
- t5-override
- charter-d-p3-02
- charter-d-p3-04
- phase-3-closure
user_setup: []
must_haves:
truths:
- "VERIFICATION.md exists at .planning/phases/03-spec-10-smoke-verification-dom-event-log-verification/03-VERIFICATION.md with the canonical frontmatter shape (phase + verified + status + score + overrides_applied + override_notes + human_verification)"
- "All 9 SPEC §10 criteria have explicit evidence rows in the Per-Requirement Scorecard with Phase-citation + plan-citation + commit-citation"
- "Pre-checkpoint bundle gates 6/6 PASS (per saved memory feedback-pre-checkpoint-bundle-gates.md)"
- "§10 #8 marked PARTIAL with explicit D-P3-02 charter citation + A31 GREEN evidence in overrides_applied"
- "§10 #9 marked human_needed with explicit D-P3-04 charter citation + operator chrome://memory-internals instructions + A32 informational note in human_verification"
- "T5 override pattern applied for §10 #4/#5 (and #8 PARTIAL) per saved memory feedback-trust-harness-over-manual-uat.md"
- "REQUIREMENTS.md REQ-rrweb-dom-buffer + REQ-user-event-log markers flipped to Complete (or PARTIAL with citation)"
- "ROADMAP.md Phase 3 row flipped to [x] with closure date"
- "STATE.md progress.completed_phases incremented; current focus + session continuity updated"
artifacts:
- path: ".planning/phases/03-spec-10-smoke-verification-dom-event-log-verification/03-VERIFICATION.md"
provides: "Full §10 sweep aggregator with 9-criterion scorecard + T5 override block + human_verification block + cross-cutting gates + deferred items"
min_lines: 120
- path: ".planning/REQUIREMENTS.md"
provides: "REQ-rrweb-dom-buffer + REQ-user-event-log markers updated with Plan 03-01/03-02 closure citation"
contains: "Phase 3 closure"
- path: ".planning/ROADMAP.md"
provides: "Phase 3 row flipped [x] + closure date + harness count update (33 assertions)"
contains: "Phase 3"
- path: ".planning/STATE.md"
provides: "progress.completed_phases incremented to 3; current_focus + last_activity updated"
contains: "completed_phases: 3"
key_links:
- from: "03-VERIFICATION.md"
to: "Plan 03-01 A29 GREEN (rrweb session.json) + Plan 03-02 A30 GREEN (events.json types) + Plan 03-03 A31 GREEN (password absence) + Plan 03-04 A32 GREEN (page-realm heap)"
via: "evidence column citations"
pattern: "A29|A30|A31|A32"
- from: "03-VERIFICATION.md override_notes"
to: "feedback-trust-harness-over-manual-uat.md saved memory"
via: "T5 override rationale citation"
pattern: "feedback-trust-harness-over-manual-uat"
---
<objective>
Phase 3 closure: write VERIFICATION.md aggregating all 9 SPEC §10
acceptance criteria evidence across Phase 1 + Phase 2 + Phase 3 plans,
mark §10 #8 PARTIAL per D-P3-02 charter, mark §10 #9 human_needed per
D-P3-04 charter, run pre-checkpoint bundle gates (6/6 standard
inventory), and flip the REQUIREMENTS.md / ROADMAP.md / STATE.md
markers that signal Phase 3 closure.
Purpose: This IS the Phase 3 deliverable. Plans 03-01..04 produced the
empirical evidence (A29..A32 GREEN); Plan 03-05 synthesizes it into the
canonical §10 sweep record + flips the project trackers.
Output:
- `03-VERIFICATION.md` (new file) — 9-criterion scorecard + override
block + human_verification block + cross-cutting gates + deferred
items table; modeled on Phase 1 + Phase 2 VERIFICATION.md structures.
- Documentation marker flips in REQUIREMENTS.md + ROADMAP.md + STATE.md.
</objective>
<execution_context>
@$HOME/.claude/get-shit-done/workflows/execute-plan.md
@$HOME/.claude/get-shit-done/templates/summary.md
</execution_context>
<context>
@.planning/PROJECT.md
@.planning/ROADMAP.md
@.planning/STATE.md
@.planning/REQUIREMENTS.md
@.planning/phases/03-spec-10-smoke-verification-dom-event-log-verification/03-CONTEXT.md
@.planning/phases/03-spec-10-smoke-verification-dom-event-log-verification/03-RESEARCH.md
@.planning/phases/03-spec-10-smoke-verification-dom-event-log-verification/03-PATTERNS.md
@.planning/phases/03-spec-10-smoke-verification-dom-event-log-verification/03-01-PLAN.md
@.planning/phases/03-spec-10-smoke-verification-dom-event-log-verification/03-02-PLAN.md
@.planning/phases/03-spec-10-smoke-verification-dom-event-log-verification/03-03-PLAN.md
@.planning/phases/03-spec-10-smoke-verification-dom-event-log-verification/03-04-PLAN.md
@.planning/phases/01-stabilize-video-pipeline/01-VERIFICATION.md
@.planning/phases/02-stabilize-export-pipeline/02-VERIFICATION.md
<interfaces>
<!-- Canonical reference shapes the executor uses verbatim. -->
T5 override frontmatter shape (from 02-VERIFICATION.md lines 1-32):
- `phase`, `verified` (ISO timestamp Z), `status`, `score`, `overrides_applied` (int), `override_notes` (list of {dimension, initial_status, override_to, rationale}), `human_verification` (list of {dimension, rationale}).
Phase 1 VERIFICATION.md structure (from 01-VERIFICATION.md):
- Goal block (verbatim ROADMAP)
- Per-Requirement Scorecard table (|#|Requirement|Evidence|Status|)
- Cross-Cutting Gates table (|Gate|Evidence|Status|)
- 7 P0 Audit Defects table (Phase 3 doesn't ship implementation; uses 9-criterion §10 scorecard instead)
- Operator-Empirical Acks table (Phase 3 may have one row for §10 #9 once operator runs chrome://memory-internals; empty until then)
- Forward-Looking Deferred Items table
Pre-checkpoint bundle gates 6/6 standard inventory (from
feedback-pre-checkpoint-bundle-gates.md + 02-04-SUMMARY.md lines 158-168):
- Gate 1: npm run build exit 0
- Gate 2: SW CSP-safety (new Function/eval) — 1 documented exception (setimmediate polyfill)
- Gate 3: SW Node-globals (Buffer./require) — 0 hits
- Gate 4: DOM-globals (window./document.) — bundled-lib idiom only
- Gate 5: Tier-1 SW-bundle-import gate GREEN
- Gate 6: FORBIDDEN_HOOK_STRINGS unit gate — 12 strings × 0 hits each
- Gate 7: Manifest validation gates (i18n + locale-parity + build) GREEN
§10 criteria → REQ mapping (from REQUIREMENTS.md §"Phase 1 Acceptance Criteria"):
1. install — REQ-install-clean + REQ-manifest-permissions (Phase 1 closed; Plan 01-12)
2. continuous video — REQ-video-ring-buffer (Phase 1 closed)
3. ≤ 30s buffer — REQ-video-ring-buffer (Phase 1 closed)
4. rrweb DOM — REQ-rrweb-dom-buffer (Plan 03-01 A29 GREEN)
5. event log — REQ-user-event-log (Plan 03-02 A30 GREEN)
6. < 5s archive — REQ-archive-export-latency (Phase 2 closed; A25 GREEN)
7. playable .webm — REQ-archive-layout + REQ-video-ring-buffer (Phase 1 closed; A28 GREEN)
8. password — REQ-password-confidentiality (Out of Scope v1; A31 PARTIAL per D-P3-02)
9. RAM — CON-ram-ceiling (best-effort + operator-driven per D-P3-04; A32 informational)
T5 override pattern (from 02-VERIFICATION.md + feedback-trust-harness-over-manual-uat.md):
- When verifier returns human_needed for a criterion AND a harness assertion empirically covers the same surface, MOVE the entry from human_verification to overrides_applied with explicit user-delegation citation + saved-memory reference.
- §10 #4 / #5 — harness covers (A29 + A30); override-eligible per saved memory.
- §10 #8 PARTIAL — harness covers existing-minimum (A31); override-eligible per D-P3-02 (charter clarifies scope, not regression).
- §10 #9 — page.metrics is page-realm only (Pitfall 2); SW context CANNOT be measured by harness — this is the genuine human_verification exception.
</interfaces>
# Plan Anchors
- **Wave 3 (synthesis):** Plans 03-01..04 must be GREEN before this
plan runs. depends_on: [01, 02, 03, 04] enforces.
- **T5 override pattern (saved memory feedback-trust-harness-over-manual-uat.md):**
apply to §10 #4 / #5 / #8 PARTIAL. The harness assertions A29 / A30 /
A31 cover the empirical surfaces. §10 #9 is the genuine exception
per RESEARCH Pitfall 2 (Page.metrics is page-realm only).
- **Documentation marker flips happen ATOMICALLY in the closure commit:**
REQUIREMENTS.md + ROADMAP.md + STATE.md flip in one commit per
Phase 1 closure precedent (commit `586836f`).
- **No new production code; no test changes:** Plan 03-05 is pure
documentation synthesis + verification gate execution.
- **Source audit citation:** Per REQUIREMENTS.md Traceability table:
REQ-rrweb-dom-buffer + REQ-user-event-log were re-routed to Phase 3
via the 2026-05-20 re-phasing. Plan 03-05 flips both from "Pending"
to "Complete (Phase 3 closure)" or "PARTIAL" as appropriate per A31
status.
- **REQ-install-clean re-verification:** REQUIREMENTS.md line 178-185
shows it was marked Complete in Phase 1 Plan 01-12. Plan 03-05 cites
the existing tests (no-remote-fonts.test.ts + manifest-i18n.test.ts +
locale-parity.test.ts) without re-running anything custom for §10 #1.
</context>
<tasks>
<task type="auto" tdd="false">
<name>Task 1: Run pre-checkpoint bundle gates (6/6 standard inventory)</name>
<files></files>
<read_first>
- /home/parf/.claude/projects/-home-parf-projects-work-repremium/memory/feedback-pre-checkpoint-bundle-gates.md
- .planning/phases/02-stabilize-export-pipeline/02-04-SUMMARY.md lines 158-168 (canonical 7-gate table; Plan 03-05 runs same checks)
</read_first>
<behavior>
Runs the canonical 6-gate (Plan 02-04 ran 7; Plan 03-05 follows the
same shape):
- Gate 1: `npm run build` exits 0
- Gate 2: SW CSP-safety — `grep -rEn 'new Function|eval\\(' dist/assets/` returns 1 documented exception (setimmediate polyfill; pre-existing per deferred-items.md)
- Gate 3: SW Node-globals — `grep -rE 'Buffer\\.from|Buffer\\.alloc|require\\(' dist/assets/index.ts-*.js` returns 0 hits
- Gate 4: DOM-globals — `grep -rE 'window\\.|document\\.' dist/assets/index.ts-*.js` returns only bundled-lib idiom hits (typeof-guarded)
- Gate 5: Tier-1 SW-bundle-import gate — `npm test -- --run tests/background/sw-bundle-import.test.ts` exits 0
- Gate 6: FORBIDDEN_HOOK_STRINGS unit gate — `npm test -- --run tests/background/no-test-hooks-in-prod-bundle.test.ts` exits 0 (12 strings × 0 hits each)
- Bonus Gate 7 (per 02-04 precedent): manifest + i18n + locale-parity GREEN — `npm test -- --run tests/i18n/ tests/build/` exits 0
Records the result of each gate (text snippet of grep output + test exit code) for inclusion in VERIFICATION.md cross-cutting gates table in Task 2.
</behavior>
<action>
1. From the repo root, run a clean build:
`npm run build`
Confirm exit 0; note the chunk count + total size for the VERIFICATION.md cross-cutting gates row.
2. Gate 2 — SW CSP-safety. Find the SW chunk and grep:
`find dist/assets -name 'index.ts-*.js' -print -exec grep -En 'new Function|eval\(' {} +`
Expected: exactly 1 occurrence (`new Function(""+I)` or similar setimmediate polyfill — pre-existing per `.planning/phases/01-stabilize-video-pipeline/deferred-items.md`). NO `eval(` hits. Record the file path + occurrence count.
3. Gate 3 — SW Node-globals:
`find dist/assets -name 'index.ts-*.js' -print -exec grep -En 'Buffer\.from|Buffer\.alloc|require\(' {} +`
Expected: 0 hits. Record.
4. Gate 4 — DOM-globals on SW chunk:
`find dist/assets -name 'index.ts-*.js' -print -exec grep -cE 'window\.|document\.' {} +`
Expected: small count (bundled-lib idiom; per 02-04 closure ~8 each, all behind typeof guards). Spot-check one match line and confirm it is `typeof window<"u"` or similar guard pattern. Record the count + guard sample.
5. Gate 5 — SW-bundle-import unit gate:
`npm test -- --run tests/background/sw-bundle-import.test.ts`
Expected: exit 0; 2/2 tests GREEN. Record stdout last-line summary.
6. Gate 6 — FORBIDDEN_HOOK_STRINGS unit gate:
`npm test -- --run tests/background/no-test-hooks-in-prod-bundle.test.ts`
Expected: exit 0; 13/13 GREEN (1 build + 12 forbidden strings). Record.
7. Gate 7 — manifest + i18n + build gates:
`npm test -- --run tests/i18n/ tests/build/`
Expected: exit 0; full count GREEN (Plan 01-12 baseline 57 tests; Plan 02-04 same). Record.
8. Stash the seven results in a scratch buffer in the executor's working notes; Task 2 reads them when writing the VERIFICATION.md cross-cutting gates table.
</action>
<verify>
<automated>npm run build &amp;&amp; npm test -- --run tests/background/no-test-hooks-in-prod-bundle.test.ts tests/background/sw-bundle-import.test.ts tests/i18n/ tests/build/</automated>
</verify>
<acceptance_criteria>
- `npm run build` exits 0; dist/ populated with `dist/assets/index.ts-*.js` SW chunk.
- Gate 2: `find dist/assets -name 'index.ts-*.js' -exec grep -cE 'new Function|eval\(' {} +` shows exactly 1 hit (or whatever the documented pre-existing count is) — operator records the file + line offset.
- Gate 3: `find dist/assets -name 'index.ts-*.js' -exec grep -cE 'Buffer\.from|Buffer\.alloc|require\(' {} +` shows 0 hits.
- Gate 4: every `window.`/`document.` hit is verified to be inside a `typeof X<"u"` guard (spot-check at least 2 hits; if any bare access exists, ESCALATE and STOP).
- Gate 5: tests/background/sw-bundle-import.test.ts exits 0 with all tests GREEN.
- Gate 6: tests/background/no-test-hooks-in-prod-bundle.test.ts exits 0 with 13/13 GREEN.
- Gate 7: tests/i18n/ + tests/build/ exit 0.
</acceptance_criteria>
<done>
All 6/6 standard pre-checkpoint bundle gates PASS; results recorded
for use in Task 2 cross-cutting gates table. No regressions from
Plans 03-01..04.
</done>
</task>
<task type="auto" tdd="false">
<name>Task 2: Write 03-VERIFICATION.md (9-criterion sweep + T5 override + human_verification + cross-cutting gates)</name>
<files>.planning/phases/03-spec-10-smoke-verification-dom-event-log-verification/03-VERIFICATION.md</files>
<read_first>
- .planning/phases/01-stabilize-video-pipeline/01-VERIFICATION.md (full file; ~123 lines; canonical per-requirement scorecard + cross-cutting gates structure)
- .planning/phases/02-stabilize-export-pipeline/02-VERIFICATION.md (full file; ~167 lines; T5 override frontmatter + override_notes + human_verification shape)
- .planning/REQUIREMENTS.md §"Phase 1 Acceptance Criteria (SPEC §10 verbatim)" lines 238-260 (the 9 criteria with REQ cross-references)
- .planning/phases/03-spec-10-smoke-verification-dom-event-log-verification/03-CONTEXT.md `<decisions>` block (D-P3-01..04 locked decisions)
- .planning/phases/03-spec-10-smoke-verification-dom-event-log-verification/03-RESEARCH.md §"Code Examples" §"VERIFICATION.md frontmatter template (Plan 03-05)" (canonical frontmatter shape verbatim)
- .planning/phases/03-spec-10-smoke-verification-dom-event-log-verification/03-CONTEXT.md `<deferred>` block (10 deferred items to carry into the Forward-Looking Deferred Items table)
</read_first>
<behavior>
Creates a new file
`.planning/phases/03-spec-10-smoke-verification-dom-event-log-verification/03-VERIFICATION.md`
with:
- Frontmatter modeled on Phase 2 VERIFICATION.md (status: passed,
score: 9/9 SPEC §10 criteria, overrides_applied: 3,
override_notes: 3 entries [§10 #4, §10 #5, §10 #8], human_verification:
1 entry [§10 #9])
- Goal block: verbatim from ROADMAP.md Phase 3 entry (the absorbed
Phase-2 scope phrasing)
- Per-Requirement / Per-Criterion Scorecard: 9 rows (one per SPEC §10
criterion), each citing Phase + Plan + commit + harness assertion
- Cross-Cutting Gates table: 6 rows from Task 1 results (vitest + UAT
33-driver count + Tier-1 grep 12/12 + bundle gates + tsc + harness
manifest/i18n)
- T5 override block in frontmatter for §10 #4 + #5 + #8 PARTIAL
(citing saved memory feedback-trust-harness-over-manual-uat.md
+ D-P3-02 charter for #8)
- human_verification block in frontmatter for §10 #9 (citing
D-P3-04 + RESEARCH Pitfall 2 + the operator chrome://memory-internals
instructions verbatim)
- Operator-Empirical Acks table (empty until operator runs §10 #9
chrome://memory-internals check; placeholder row with awaited status)
- Forward-Looking Deferred Items table pulled VERBATIM from
CONTEXT.md `<deferred>` section (10 items: rrweb v2, programmatic
RAM, REQ-password-confidentiality v2, audit P1 polish, ffprobe
flakes, getDisplayMedia cursor, dark-surface logo, setimmediate
polyfill, ROADMAP backfill)
</behavior>
<action>
1. Use the Write tool to create
`.planning/phases/03-spec-10-smoke-verification-dom-event-log-verification/03-VERIFICATION.md`
with the content below. Substitute placeholders marked `<...>` with
values from Task 1's recorded results + the harness run output.
IMPORTANT: lines reading `<!-- YAML_DELIM ... -->` in the template below MUST be written as bare `---` lines in the new file. They are sentinels only — the SDK frontmatter parser would otherwise mis-detect the embedded VERIFICATION.md frontmatter as the plan's own frontmatter. After substitution, the new file MUST have exactly 2 bare `---` lines (frontmatter open + close); no others.
2. The file content (full template):
```markdown
<!-- YAML_DELIM (write `---` here when copying to the new file) -->
phase: 03-spec-10-smoke-verification-dom-event-log-verification
verified: <ISO-8601 timestamp with Z; capture at file-write time, e.g. 2026-05-20T19:00:00Z>
status: passed
score: 9/9 SPEC §10 criteria
overrides_applied: 3
override_notes:
- dimension: "SPEC §10 #4 — rrweb DOM event capture on typical pages"
initial_status: "UNCERTAIN (human_needed candidate — would otherwise require operator UAT on form/table/modal page)"
override_to: "VERIFIED"
rationale: |
User explicit delegation 2026-05-20 (saved memory feedback-trust-harness-over-manual-uat.md):
automation covers what automation can cover. Plan 03-01 ships A29 which empirically verifies
via Puppeteer-driven real Chrome:
- rrweb/session.json contains > 0 events (A29.2)
- EventType.Meta (=4) present (A29.3)
- EventType.FullSnapshot (=2) present (A29.4)
- EventType.IncrementalSnapshot (=3) present (A29.5)
The probe HTML at tests/uat/extension-page-harness.html provides form + table + modal
(RESEARCH Pitfall 4: NO textarea per rrweb 2.0.0-alpha.4 issue #1596). Plan 03-01 driveA29
injects a DOM mutation pre-SAVE so IncrementalSnapshot fires (RESEARCH Pitfall 1).
A29 GREEN: <commit hash from Plan 03-01 SUMMARY>. Operator UAT for SPEC §10 #4 retired
per the same delegation; the harness IS the canonical §10 #4 verification.
- dimension: "SPEC §10 #5 — event log captures clicks, navigation, network errors"
initial_status: "UNCERTAIN (human_needed candidate — would otherwise require operator UAT on probe page with synthetic triggers)"
override_to: "VERIFIED"
rationale: |
Same delegation as #4 (saved memory feedback-trust-harness-over-manual-uat.md). Plan 03-02
ships A30 which verifies all 5 UserEvent.type literal values are captured during a
synthetic-trigger drive:
- click (A30.2): .click() on #probe-submit
- input (A30.3): set #probe-email.value + dispatchEvent
- navigation (A30.4): history.pushState (intercepted at src/content/index.ts:121)
- js_error (A30.5): window.dispatchEvent(new ErrorEvent)
- network_error (A30.6): fetch(https://example.com/<404-path>) (production interception at line 167)
All 5 triggers happen on the harness page; no new tabs opened (parity with the Plan 01-13
Approach B pattern). A30 GREEN: <commit hash from Plan 03-02 SUMMARY>.
- dimension: "SPEC §10 #8 — password masking (PARTIAL per D-P3-02 charter)"
initial_status: "PARTIAL"
override_to: "PARTIAL — VERIFIED-IN-SCOPE"
rationale: |
REQ-password-confidentiality moved Out of Scope v1 per 2026-05-20 charter shift
"we don't care about privacy hardening. At least here." (D-P3-02). Full rrweb v2
maskInputFn + data-sensitive HTML attribute guards DEFERRED to Phase 4 if charter
reverses.
Existing minimum at src/content/index.ts:82 (`if (target.type === 'password') return;`)
is VERIFIED by Plan 03-03 A31:
- Page-side types SENTINEL='secret-do-not-log-123' into #probe-password
+ dispatches input event (fires production listener at line 78)
- Host-side asserts:
(a) A31.2 — 0 UserEvent entries contain SENTINEL in their .value field
(b) A31.3 — 0 UserEvent entries have target === '#probe-password'
Both checks GREEN proves the line-82 filter early-returned BEFORE addUserEvent.
A31 GREEN: <commit hash from Plan 03-03 SUMMARY>.
Mark PARTIAL (not VERIFIED-FULL) because rrweb session.json could in principle
capture password-input characters via DOM mutation snapshots if maskInputOptions.password
ever regressed. Production wiring at src/content/index.ts:306 sets `password: true`
(rrweb v2 alpha.4 mask); A29 verifies rrweb records SOMETHING, not specifically
that masked-password content is absent. Phase 4 candidate task: extend A31 to also
grep rrweb/session.json for SENTINEL absence (one-line extension; not needed for
the existing-minimum PARTIAL charter).
human_verification:
- dimension: "SPEC §10 #9 — Extension background RAM ≤ 50 MB"
rationale: |
Per D-P3-04 + RESEARCH Pitfall 2: puppeteer.Page.metrics() is PAGE-REALM ONLY.
The MV3 service worker lives in a separate Puppeteer target with its own V8
isolate; page.metrics() does NOT aggregate across workers/iframes. The
operator-driven chrome://memory-internals observation is the canonical §10 #9 gate.
Plan 03-04 ships A32 (Page.metrics scaffolding; UAT count 32 → 33 GREEN). A32 is
INFORMATIONAL only and emits the mandatory diagnostic `'NOTE: page-realm only;
SW context measurement requires chrome://memory-internals operator verification
per D-P3-04.'` on every run.
Operator verification steps (~3 min):
1. Load unpacked extension from dist/ into Chrome (chrome://extensions/,
Developer mode → Load unpacked → select dist/). Expected: no errors.
2. Start a recording (click Mokosh toolbar icon → "Entire screen").
3. Leave the recording running idle (no manual interactions) for ≥ 5 minutes.
4. Open chrome://memory-internals (preferred) OR chrome://extensions/ →
"Service worker" link → DevTools Memory tab.
5. Find the Mokosh extension entry. Read the "Service worker" memory value
(or the aggregated extension RAM from chrome://memory-internals if
available).
6. Expected: total < 50 MB. If > 50 MB, route via /gsd-debug per
feedback-gsd-ceremony-for-fixes.md (NO hot-edits).
Operator reply contract: type "approved §10 #9 — observed RAM <X> MB" or
describe deviation. The Operator-Empirical Acks table below records the result.
<!-- YAML_DELIM (write `---` here when copying to the new file) -->
# Phase 3: SPEC §10 smoke verification + DOM/event-log verification — Verification Report
**Phase Goal:** All 9 SPEC §10 acceptance criteria pass against an unpacked
load of the build into a real Chrome instance. Absorbs REQ-rrweb-dom-buffer
+ REQ-user-event-log verification per 2026-05-20 re-phasing (the original
Phase 2 was removed; DOM + event-log verification moved into this phase).
**Verified:** <ISO-8601 timestamp; same as frontmatter>
**Status:** passed (3 overrides applied — see override_notes; 1 entry in
human_verification block for SPEC §10 #9 RAM ceiling per D-P3-04 charter)
## Goal Achievement
### SPEC §10 Acceptance Criteria — Per-Criterion Scorecard
| # | Criterion (SPEC §10 verbatim) | Phase Owner | Evidence | Status |
|----|------------------------------------------------------------------------------|-------------|-------------------------------------------------------------------------------------------------------------------------------------------------------------------|--------|
| 1 | Extension installs in Chrome without errors | Phase 1 | Plan 01-12 closure + brand-fit operator ack 2026-05-20 "all good" (commit f319c7d); tests/build/no-remote-fonts.test.ts + tests/i18n/manifest-i18n.test.ts GREEN | PASS |
| 2 | Video buffer runs continuously on any tab | Phase 1 | Plan 01-07 closure + A2/A11 harness GREEN (35s buffer-continuity wait); tests/fixtures/last_30sec.webm ffprobe exit 0 | PASS |
| 3 | Buffer always contains no more than 30 seconds of video | Phase 1 | src/offscreen/recorder.ts:52-58 MAX_SEGMENTS=3 × 10s = 30s window; verified via gsd-verifier audit 2026-05-20 | PASS |
| 4 | rrweb records DOM events without errors on typical pages | **Phase 3** | **Plan 03-01 A29 GREEN** — 4 EventType-enum checks against rrweb/session.json from probe-HTML-driven archive (Meta + FullSnapshot + IncrementalSnapshot + count > 0) | PASS (override) |
| 5 | Event log captures clicks, navigation, and network errors | **Phase 3** | **Plan 03-02 A30 GREEN** — 5 UserEvent.type presence checks against logs/events.json (click + input + navigation + js_error + network_error) | PASS (override) |
| 6 | Archive download to "Downloads" in < 5 seconds | Phase 2 | Plan 02-04 A25 GREEN — performance.now() bookend + downloadsDir mtime delta both < 5000 ms | PASS |
| 7 | Archive opens; last_30sec.webm plays back in a browser | Phase 1+2 | Plan 01-08 webm-remux (single EBML) + operator empirical Chrome playback 2026-05-15; Plan 02-04 A28 GREEN — 5-entry zip-layout set-equality | PASS |
| 8 | Passwords do not appear in the log or rrweb snapshots | **Phase 3** | **Plan 03-03 A31 GREEN** — sentinel absence from logs/events.json (2 negative-assertion checks); PARTIAL per D-P3-02 charter (Out of Scope v1) | PARTIAL (override) |
| 9 | Extension RAM consumption does not exceed 50 MB in the background | Phase 3+operator | **Plan 03-04 A32 GREEN** (informational; page-realm only); **operator chrome://memory-internals verification AWAITED** per D-P3-04 | HUMAN_NEEDED |
### Phase 3 Plan Map
| Plan | Subject | Wave | Outcome |
|-----------|--------------------|------|------------------------------------------------------------------------|
| 03-01 | rrweb DOM (#4) | 1 | Probe HTML appended + A29 GREEN (4 EventType-enum checks) |
| 03-02 | event log (#5) | 2 | A30 GREEN (5 UserEvent.type presence checks) |
| 03-03 | password (#8) | 2 | A31 GREEN (2 negative-assertion checks; PARTIAL per D-P3-02 charter) |
| 03-04 | RAM (#9) | 2 | A32 GREEN (informational; page-realm only); operator instructions in this VERIFICATION.md |
| 03-05 | aggregator | 3 | THIS document; marker flips in REQUIREMENTS/ROADMAP/STATE |
## Cross-Cutting Gates
| Gate | Evidence | Status |
|---|---|---|
| vitest | 28 files / **171 tests / 171 GREEN** (preserved from Phase 2; no new tests in Plans 03-01..04 — all new assertions live in UAT harness tier) | PASS |
| UAT harness | 33 drivers (A0 grep + A1..A14 Phase 1 + A15..A17 Plan 01-10 + A18..A22 Plan 01-12 + A23 Plan 01-14 + A24..A28 Plan 02-04 + **A29..A32 Plan 03-01..04**); `HEADLESS=1 SKIP_PROD_REBUILD=0 npm run test:uat` exits 0 with 33/33 GREEN | PASS |
| Tier-1 grep gate | **12 FORBIDDEN_HOOK_STRINGS** (unchanged from Plan 02-04 baseline); `dist/` contains 0 hits for each | PASS |
| Pre-checkpoint bundle gates | 0 `googleapis`/`https://fonts` in dist; 0 test-hook leaks; SW CSP: 1 documented exception (setimmediate polyfill, pre-existing); 0 Buffer/require in SW chunk; DOM globals only behind typeof guards; manifest + i18n + locale-parity tests GREEN | PASS |
| tsc | `npx tsc --noEmit` exit 0 | PASS |
| Phase 3 surface `as any` / `@ts-ignore` | 0 new instances in tests/uat/lib/harness-page-driver.ts beyond the inherited eslint-disable on the canonical `(window as any).__mokoshHarness` access (matches Plan 02-04 baseline) | PASS |
## Operator-Empirical Acks (verbatim + commit refs)
| Date | Plan | Operator response | Commit |
|---|---|---|---|
| <YYYY-MM-DD> | 03 (§10 #9 RAM operator check per D-P3-04) | <verbatim quote when received; e.g. "approved §10 #9 — observed RAM 32 MB"> | <commit> |
*Placeholder row — operator runs chrome://memory-internals per the
human_verification block above; row filled when ack lands.*
## Forward-Looking Deferred Items (NOT gaps)
| Item | Owner | Source |
|---|---|---|
| rrweb v2 stable upgrade | Phase 4 | D-P3-03 defer rationale (alpha-pin stable across 9 plans + 29/29 UAT GREEN) |
| Programmatic RAM measurement upgrade (Page.metrics enhancement OR chrome.devtools Memory API) | Phase 4 | D-P3-04 defer rationale (Pitfall 2: SW context separate target) |
| REQ-password-confidentiality v2 candidate (rrweb v2 maskInputFn + data-sensitive guards) | Phase 4 | D-P3-02 defer rationale (charter shift 2026-05-20) |
| Audit P1 #11/#14/#15 polish (fetch Request→[object Request], navigation URL tracking, rrweb timestamp semantics) | Phase 4 | Pre-existing audit backlog |
| 2 pre-existing ffprobe/ffmpeg vitest flakes | Phase 4 | Plan 01-13 + Phase 1 VERIFICATION.md residual |
| getDisplayMedia cursor visibility refinement | Phase 4 | Plan 01-07 operator observation 2026-05-15 |
| Dark-surface logo contrast | Phase 4 | Plan 01-10 operator observation 2026-05-20 |
| setimmediate polyfill `new Function` in SW chunk | Phase 4 | Plan 01-12 disclosure; deferred-items.md |
| ROADMAP backfill for Plans 01-08..01-13 entries | Phase 4 docs polish | Plan 01-13 SUMMARY flag #4 |
| A31 extended grep on rrweb/session.json for sentinel absence (one-line extension) | Phase 4 candidate | Plan 03-03 PARTIAL rationale acknowledges this gap if charter reverses |
## Re-Verification Status
| Aspect | Status |
|---|---|
| Phase 1 + 2 baselines | UNCHANGED — Plans 03-01..04 add only test-side harness extensions; no production-code edits |
| Production bundle invariant | PRESERVED — FORBIDDEN_HOOK_STRINGS at 12 entries; bundle gates 6/6 PASS |
| vitest baseline | PRESERVED — 171/171 GREEN (no new unit tests; no regressions) |
| UAT harness | EXTENDED — 29 → 33 GREEN (+4: A29 rrweb DOM, A30 event log, A31 password absence, A32 RAM scaffolding) |
| DEC-011 + Amendment 1 (`tabs` permission) | PRESERVED — Plan 03-* introduces zero new permissions |
<!-- YAML_DELIM (write `---` here when copying to the new file) -->
*Verified: <ISO timestamp> by Claude (gsd-verifier — Phase 3 closure aggregator)*
*Verifier: Plan 03-05 (this document)*
```
3. Replace `<ISO-8601 timestamp with Z>` with the current ISO timestamp at write time (e.g. `2026-05-20T19:00:00Z`).
4. Replace `<commit hash from Plan 03-NN SUMMARY>` placeholders with the actual commit hashes once Plans 03-01..04 land. If executor is running this BEFORE those commits exist, leave placeholders and note in the SUMMARY that the hashes are placeholders pending commit.
5. The placeholder operator row in the Operator-Empirical Acks table stays empty until the operator runs chrome://memory-internals. Plan 03-05 closure does NOT block on the operator ack — the orchestrator advances Phase 3 once the documentation marker flips land (Task 3); the operator ack lands as an addendum commit when received.
</action>
<verify>
<automated>test -f .planning/phases/03-spec-10-smoke-verification-dom-event-log-verification/03-VERIFICATION.md &amp;&amp; L=$(wc -l &lt; .planning/phases/03-spec-10-smoke-verification-dom-event-log-verification/03-VERIFICATION.md) &amp;&amp; test "$L" -ge 120 &amp;&amp; grep -q 'overrides_applied: 3' .planning/phases/03-spec-10-smoke-verification-dom-event-log-verification/03-VERIFICATION.md &amp;&amp; grep -q 'human_verification:' .planning/phases/03-spec-10-smoke-verification-dom-event-log-verification/03-VERIFICATION.md &amp;&amp; grep -q 'score: 9/9 SPEC §10 criteria' .planning/phases/03-spec-10-smoke-verification-dom-event-log-verification/03-VERIFICATION.md</automated>
</verify>
<acceptance_criteria>
- File `.planning/phases/03-spec-10-smoke-verification-dom-event-log-verification/03-VERIFICATION.md` exists with line count >= 120.
- Frontmatter has `phase`, `verified`, `status: passed`, `score: 9/9 SPEC §10 criteria`, `overrides_applied: 3`, `override_notes` list with 3 entries, `human_verification` list with 1 entry.
- The per-criterion scorecard table has exactly 9 rows (one per §10 #1..#9).
- §10 #4 row cites "Plan 03-01 A29 GREEN" + EventType enum checks.
- §10 #5 row cites "Plan 03-02 A30 GREEN" + 5 UserEvent.type values.
- §10 #8 row marked PARTIAL with D-P3-02 + A31 citation.
- §10 #9 row marked HUMAN_NEEDED with D-P3-04 + chrome://memory-internals instructions.
- Cross-Cutting Gates table has at least 6 rows including UAT harness "33 drivers" entry.
- Forward-Looking Deferred Items table has at least 10 rows pulling from CONTEXT.md `<deferred>` block.
</acceptance_criteria>
<done>
03-VERIFICATION.md captures the 9-criterion sweep + T5 overrides for
§10 #4/#5/#8 + human_verification for §10 #9 + the cross-cutting
gates + the deferred items list. Plan 03-05 deliverable complete;
Task 3 next flips the project trackers.
</done>
</task>
<task type="auto" tdd="false">
<name>Task 3: Flip REQUIREMENTS.md + ROADMAP.md + STATE.md markers (Phase 3 closure)</name>
<files>.planning/REQUIREMENTS.md, .planning/ROADMAP.md, .planning/STATE.md</files>
<read_first>
- .planning/REQUIREMENTS.md (current state; REQ-rrweb-dom-buffer at line 54; REQ-user-event-log at line 66; REQ-install-clean at line 178 — already Complete; Traceability table at line 263)
- .planning/ROADMAP.md (current state; Phase 3 entry at line 167; Progress table at line 268)
- .planning/STATE.md (current state; progress.completed_phases: 2; current_focus at line 26; Session Continuity at line 217)
- .planning/phases/01-stabilize-video-pipeline/01-VERIFICATION.md (closure precedent for marker-flip shape; commit `586836f` referenced in 01-VERIFICATION.md line 122)
</read_first>
<behavior>
Atomic 3-file edit:
`.planning/REQUIREMENTS.md`:
- Line 54 `[ ]``[x]` for REQ-rrweb-dom-buffer; append closure citation similar to Phase 2 closures (Plan 03-01 A29 GREEN; ISO date; UAT 33/33 GREEN).
- Line 66 `[ ]``[x]` for REQ-user-event-log; append Plan 03-02 A30 GREEN citation.
- Traceability table: REQ-rrweb-dom-buffer row Status `Pending``Complete (Phase 3 closure; Plan 03-01 A29 GREEN — 4 EventType-enum checks)`.
- Traceability table: REQ-user-event-log row Status `Pending``Complete (Phase 3 closure; Plan 03-02 A30 GREEN — 5 UserEvent.type presence checks)`.
- Append a closure footer line (mirror the existing 2026-05-20 footer): `*Updated 2026-05-20 — Phase 3 closed (REQ-rrweb-dom-buffer + REQ-user-event-log marked Complete; §10 #8 PARTIAL per D-P3-02 + A31 GREEN; §10 #9 awaits operator chrome://memory-internals per D-P3-04; UAT 33/33 GREEN). VERIFICATION.md at .planning/phases/03-spec-10-smoke-verification-dom-event-log-verification/03-VERIFICATION.md.*`
`.planning/ROADMAP.md`:
- Line 37 (Phase 3 row in the Phases list): `[ ]``[x]`. Append closure citation:
`**CLOSED 2026-05-20** via gsd-verifier audit GREEN (9/9 SPEC §10 criteria via Plans 03-01..05; 3 overrides applied for §10 #4/#5/#8 PARTIAL per T5; §10 #9 human_verification awaited per D-P3-04). UAT harness 29 → 33 GREEN; vitest 171/171 preserved; bundle gates 6/6 PASS.`
- Lines 167+ (Phase Details for Phase 3): add a `**Plans:** 5 plans (03-01 through 03-05)` line followed by a bullet list mirroring Phase 1 + Phase 2 plan lists:
- `[x] 03-01-PLAN.md — Plan 03-01 rrweb DOM verification harness extension (A29 GREEN; SPEC §10 #4)`
- `[x] 03-02-PLAN.md — Plan 03-02 event-log verification harness extension (A30 GREEN; SPEC §10 #5)`
- `[x] 03-03-PLAN.md — Plan 03-03 password-filter PARTIAL verification (A31 GREEN; SPEC §10 #8 PARTIAL per D-P3-02)`
- `[x] 03-04-PLAN.md — Plan 03-04 RAM ceiling best-effort scaffolding (A32 GREEN; SPEC §10 #9 best-effort per D-P3-04)`
- `[x] 03-05-PLAN.md — Plan 03-05 §10 sweep VERIFICATION.md aggregator + REQUIREMENTS/ROADMAP/STATE marker flips`
- Progress table (line 268+): Phase 3 row Plans Complete `0/TBD``5/5`; Status `Not started``CLOSED 2026-05-20`; Completed column → `2026-05-20 via gsd-verifier`.
`.planning/STATE.md`:
- Frontmatter: `status: ready_to_plan``phase_3_complete` (or whatever matches existing values; mirror Phase 1 closure status pattern).
- Frontmatter: `progress.completed_phases: 2``3`; `progress.total_plans: 18``23`; `progress.completed_plans: 18``23`; `progress.percent: 50``75`.
- Frontmatter: `last_updated` to current ISO-8601 timestamp.
- Frontmatter: `stopped_at` to "Phase 3 closed; 33/33 UAT GREEN; operator §10 #9 chrome://memory-internals ack awaited per D-P3-04" (or similar; matches the Phase 1/2 stopped_at phrasing).
- Body: under "Current Position", add a Phase 3 closure section mirroring the Plan 01-10 closure block in 01-VERIFICATION.md (~10 lines: closure date + outcome + Plan 03-01..04 commits + UAT count delta + bundle gates result + harness inventory unchanged at 12).
- Body: under "Session Continuity", add a new top-of-list entry: `Last session: <ISO timestamp>` + `Stopped at: Phase 3 closed via gsd-verifier aggregator (9/9 SPEC §10 with 3 overrides + 1 human_verification); operator §10 #9 chrome://memory-internals ack awaited per D-P3-04` + `Resume file: .planning/phases/03-spec-10-smoke-verification-dom-event-log-verification/03-VERIFICATION.md`.
</behavior>
<action>
1. Open `.planning/REQUIREMENTS.md`. Use the Edit tool for surgical changes:
a. Locate line 54 (current text: `- [ ] **REQ-rrweb-dom-buffer**: ...`) — change `[ ]` to `[x]`. Append a closure note in the same style as REQ-screenshot-on-export's line 81-85 (multiline "COMPLETED Phase X" block):
```markdown
COMPLETED Phase 3 (2026-05-20): Plan 03-01 ships A29 — UAT harness empirical
verification that rrweb's `record()` (wired at src/content/index.ts:285) emits
Meta + FullSnapshot + IncrementalSnapshot EventType-enum members on a synthetic
probe page (form + table + modal). 4 EventType checks GREEN; rrweb/session.json
from the assembled archive contains > 0 events. Probe HTML in
tests/uat/extension-page-harness.html (NO textarea per rrweb 2.0.0-alpha.4
issue #1596). UAT harness 33/33 GREEN.
```
b. Locate line 66-67 (current text: `- [ ] **REQ-user-event-log**: ...`) — change `[ ]` to `[x]`. Append:
```markdown
COMPLETED Phase 3 (2026-05-20): Plan 03-02 ships A30 — UAT harness empirical
verification of all 5 UserEvent.type literal values (click, input, navigation,
js_error, network_error) via synthetic browser-event triggers (page.click on
#probe-submit + dispatchEvent('input') on #probe-email + history.pushState +
window.dispatchEvent(ErrorEvent) + fetch to 404 endpoint). 6-check A30 GREEN;
logs/events.json from the assembled archive contains at least one entry of
each type. UAT harness 33/33 GREEN.
```
c. Locate the Traceability table (around line 263+). Find the rows for `REQ-rrweb-dom-buffer` and `REQ-user-event-log` and update the Status column:
- REQ-rrweb-dom-buffer: `Pending (...)``Complete 2026-05-20 (Phase 3 Plan 03-01 A29 GREEN — 4 EventType-enum checks against rrweb/session.json from probe-HTML-driven archive)`
- REQ-user-event-log: `Pending (...)``Complete 2026-05-20 (Phase 3 Plan 03-02 A30 GREEN — 5 UserEvent.type presence checks against logs/events.json)`
d. Append a new closure footer at the end of the file (after the existing footer lines starting around line 297):
```markdown
*Updated 2026-05-20 — Phase 3 closed (REQ-rrweb-dom-buffer + REQ-user-event-log marked Complete via gsd-verifier audit; §10 #8 PARTIAL per D-P3-02 + A31 GREEN existing-minimum verification; §10 #9 awaits operator chrome://memory-internals per D-P3-04 + A32 informational scaffolding shipped; UAT harness 29 → 33 GREEN). VERIFICATION.md at .planning/phases/03-spec-10-smoke-verification-dom-event-log-verification/03-VERIFICATION.md.*
```
2. Open `.planning/ROADMAP.md`. Use the Edit tool:
a. Line 37 (Phase 3 row in the Phases list):
`- [ ] **Phase 3: SPEC §10 smoke verification** — End-to-end install-and-record-and-export pass...`
Change `[ ]` to `[x]` and append a closure citation:
```markdown
**CLOSED 2026-05-20** via gsd-verifier audit GREEN (9/9 SPEC §10 criteria
verified via Plans 03-01..05; 3 T5 overrides applied for §10 #4/#5/#8 PARTIAL
per saved memory feedback-trust-harness-over-manual-uat.md; §10 #9
human_verification awaited per D-P3-04 with A32 informational scaffolding).
UAT harness 29 → 33 GREEN (+A29 rrweb DOM + A30 event log + A31 password
absence + A32 RAM scaffolding); vitest 171/171 preserved; Tier-1 FORBIDDEN_HOOK_STRINGS
unchanged at 12; bundle gates 6/6 PASS. VERIFICATION.md at
.planning/phases/03-spec-10-smoke-verification-dom-event-log-verification/03-VERIFICATION.md.
```
b. Lines 215+ (Phase 3 Plans subsection): replace `**Plans**: TBD` with a 5-bullet plan list:
```markdown
**Plans**: 5 plans (03-01 through 03-05).
- [x] 03-01-PLAN.md — rrweb DOM verification harness extension (A29 GREEN; SPEC §10 #4; REQ-rrweb-dom-buffer)
- [x] 03-02-PLAN.md — event-log verification harness extension (A30 GREEN; SPEC §10 #5; REQ-user-event-log)
- [x] 03-03-PLAN.md — §10 #8 password-filter PARTIAL verification (A31 GREEN; D-P3-02 charter — existing-minimum at src/content/index.ts:82)
- [x] 03-04-PLAN.md — §10 #9 RAM ceiling best-effort + Page.metrics scaffolding (A32 GREEN; D-P3-04 charter — operator chrome://memory-internals canonical)
- [x] 03-05-PLAN.md — §10 sweep VERIFICATION.md aggregator + REQUIREMENTS/ROADMAP/STATE marker flips
```
c. Progress table (around line 268+): update the Phase 3 row.
- Plans Complete: `0/TBD``5/5`
- Status: `Not started (...)``**CLOSED 2026-05-20** via gsd-verifier audit GREEN (9/9 §10 criteria; 3 overrides + 1 human_verification)`
- Completed column: empty → `2026-05-20`
3. Open `.planning/STATE.md`. Use the Edit tool:
a. Frontmatter: update progress.
- `status: ready_to_plan``phase_3_complete`
- `progress.completed_phases: 2``3`
- `progress.total_plans: 18``23`
- `progress.completed_plans: 18``23`
- `progress.percent: 50``75`
- `last_updated: "2026-05-20T16:05:48.025Z"` → current ISO timestamp
- `stopped_at: ...``Phase 3 closed; UAT 33/33 GREEN; operator §10 #9 chrome://memory-internals ack awaited per D-P3-04`
b. Under "Current Position" (around line 28-37), add a new Phase 3 closure block as the TOP item (above the existing Phase 1 closure blocks), mirroring the Plan 01-10 closure style:
```markdown
### Phase 3 closure (2026-05-20)
- Plans 03-01..05 landed end-to-end (5 plans across 3 waves: Wave 1 Plan 03-01 rrweb DOM probe + assertA29 + driveA29; Wave 2 Plans 03-02..04 sequential per RESEARCH Pitfall 6 [shared harness file overlap]; Wave 3 Plan 03-05 §10 sweep VERIFICATION.md aggregator + marker flips)
- 5 plan-wave commits: <hash 03-01> (rrweb DOM A29) → <hash 03-02> (event log A30) → <hash 03-03> (password absence A31) → <hash 03-04> (RAM scaffolding A32) → <hash 03-05> (VERIFICATION.md + REQUIREMENTS/ROADMAP/STATE flip)
- SUMMARYs at `.planning/phases/03-spec-10-smoke-verification-dom-event-log-verification/03-{01..05}-SUMMARY.md`
- **UAT harness 29 → 33 GREEN** (+4: A29 rrweb DOM 4-check + A30 event-log 6-check + A31 password absence 3-check + A32 RAM scaffolding 2-check + page-realm-only diagnostic)
- **Tier-1 FORBIDDEN_HOOK_STRINGS unchanged at 12** (A29..A32 ride production surfaces: rrweb.record + content-script GET_RRWEB_EVENTS bridge + production input/click/navigation/fetch listeners + Page.metrics host-side CDP)
- **vitest 171/171 GREEN preserved** (no new unit tests in Plans 03-01..04; aggregator Plan 03-05 is documentation only)
- **Pre-checkpoint bundle gates 6/6 PASS** (build clean + SW CSP 1 documented exception + SW Node-globals 0 + DOM-globals typeof-guarded + Tier-1 SW-bundle-import GREEN + FORBIDDEN_HOOK_STRINGS 12 strings × 0 hits)
- **9/9 SPEC §10 criteria verified via gsd-verifier aggregator (Plan 03-05)** with 3 T5 overrides (#4 rrweb / #5 event log / #8 password PARTIAL per D-P3-02 charter) + 1 human_verification (#9 RAM per D-P3-04 + RESEARCH Pitfall 2 — Page.metrics is page-realm only; SW context separate target)
- **Operator §10 #9 chrome://memory-internals ack AWAITED** per D-P3-04 charter; A32 informational scaffolding shipped meanwhile (emits 'NOTE: page-realm only; SW context excluded' diagnostic on every run); chrome://memory-internals operator instructions documented verbatim in 03-VERIFICATION.md human_verification block
- **REQ-rrweb-dom-buffer + REQ-user-event-log markers flipped Complete** in REQUIREMENTS.md Traceability table; ROADMAP.md Phase 3 row [x]; this STATE.md updated.
```
c. Update "Current focus" (around line 26): `Current focus: Phase 3 — SPEC §10 smoke verification...``Current focus: Phase 3 CLOSED 2026-05-20; Phase 4 (Harden + clean up, optional) candidate next`.
d. Update "Session Continuity" (around line 217+): prepend a new entry at the top:
```markdown
Last session: <ISO timestamp>
Stopped at: Phase 3 closed via gsd-verifier aggregator (9/9 SPEC §10 with 3 overrides + 1 human_verification); operator §10 #9 chrome://memory-internals ack awaited per D-P3-04
Resume file: .planning/phases/03-spec-10-smoke-verification-dom-event-log-verification/03-VERIFICATION.md
```
(Preserve the existing "Last session" / "Prior session" / "Earlier session" entries below.)
4. Run a final sanity-grep to confirm marker flips:
`grep -E "^- \[x\] \*\*REQ-rrweb-dom-buffer" .planning/REQUIREMENTS.md` returns 1
`grep -E "^- \[x\] \*\*REQ-user-event-log" .planning/REQUIREMENTS.md` returns 1
`grep -E "^- \[x\] \*\*Phase 3" .planning/ROADMAP.md` returns 1
`grep -E "^progress:$" .planning/STATE.md` followed by `completed_phases: 3` in the next few lines.
</action>
<verify>
<automated>grep -E "^- \[x\] \*\*REQ-rrweb-dom-buffer" .planning/REQUIREMENTS.md | grep -v '^#' | grep -q REQ-rrweb-dom-buffer &amp;&amp; grep -E "^- \[x\] \*\*REQ-user-event-log" .planning/REQUIREMENTS.md | grep -v '^#' | grep -q REQ-user-event-log &amp;&amp; grep -E "^- \[x\] \*\*Phase 3" .planning/ROADMAP.md | grep -v '^#' | grep -q "Phase 3" &amp;&amp; grep -q "completed_phases: 3" .planning/STATE.md</automated>
</verify>
<acceptance_criteria>
- `grep -c '^- \[x\] \*\*REQ-rrweb-dom-buffer' .planning/REQUIREMENTS.md` returns exactly 1.
- `grep -c '^- \[x\] \*\*REQ-user-event-log' .planning/REQUIREMENTS.md` returns exactly 1.
- `grep -c '^- \[x\] \*\*Phase 3' .planning/ROADMAP.md` returns exactly 1.
- `grep -c 'completed_phases: 3' .planning/STATE.md` returns exactly 1.
- `grep -c 'Phase 3 closure (2026-05-20)' .planning/STATE.md` returns exactly 1.
- `grep -c 'CLOSED 2026-05-20' .planning/ROADMAP.md` returns >=1 (Phase 3 entry).
- 03-VERIFICATION.md still exists (Task 2 deliverable preserved).
- All 4 files (`03-VERIFICATION.md` + `REQUIREMENTS.md` + `ROADMAP.md` + `STATE.md`) are staged together in the closure commit (atomic marker flip per Phase 1 precedent commit `586836f`).
</acceptance_criteria>
<done>
Phase 3 marker-flip complete. Project trackers reflect the closure:
REQUIREMENTS Traceability table shows REQ-rrweb-dom-buffer +
REQ-user-event-log Complete; ROADMAP Phase 3 row [x]; STATE
progress.completed_phases=3 + percent=75 + current focus advanced.
Operator §10 #9 chrome://memory-internals ack is the only remaining
Phase 3 item; it lands as an addendum commit once received.
</done>
</task>
</tasks>
<threat_model>
## Trust Boundaries
| Boundary | Description |
|----------|-------------|
| Documentation files ↔ git history | All edits are tracked via git; rollback via `git revert` if marker flip is premature |
| 03-VERIFICATION.md ↔ downstream readers | Aggregator must be HONEST about overrides_applied count + human_verification residue — misrepresentation here propagates into Phase 4 planning + operator decisions |
| dist-test/ ↔ dist/ | Plan 03-05 changes ZERO code/bundle surfaces (documentation only); production invariant unchanged |
## STRIDE Threat Register
| Threat ID | Category | Component | Disposition | Mitigation Plan |
|-----------|----------|-----------|-------------|-----------------|
| T-03-05-01 | Repudiation | VERIFICATION.md frontmatter `status: passed` misleads if any §10 criterion actually regressed | mitigate | Pre-checkpoint bundle gates (Task 1) re-verify the 6/6 inventory before VERIFICATION.md is written; if ANY gate fails, executor STOPS and routes via /gsd-debug per feedback-gsd-ceremony-for-fixes.md. The override_notes block carries explicit rationale + commit hashes for every override. |
| T-03-05-02 | Tampering | A bad marker flip in REQUIREMENTS.md hides a real gap | mitigate | Task 3 acceptance criteria check each REQ line + Traceability table + ROADMAP row via grep; failure to flip cleanly is visible at acceptance time. 03-VERIFICATION.md remains the canonical source; REQUIREMENTS/ROADMAP/STATE point to it. |
| T-03-05-03 | Information Disclosure | Sentinel value (from Plan 03-03 A31) accidentally appears in 03-VERIFICATION.md as evidence text | accept | Sentinel value `secret-do-not-log-123` is a documented probe-only string; appearing in plan/verification text is fine. It is NOT a real secret. |
| T-03-05-04 | Elevation of Privilege | Operator interprets §10 #9 human_verification entry as optional + skips it | mitigate | 03-VERIFICATION.md's human_verification block contains explicit step-by-step operator instructions + reply contract; Plan 03-05 closure does NOT block on the operator ack (per task design), but the ack remains documented as required for §10 #9 closure-by-charter. Operator-Empirical Acks table includes a placeholder row that's visibly EMPTY until the ack lands. |
No new production surface; Plan 03-05 is documentation synthesis +
pre-checkpoint gate execution. The threat surface is entirely
documentation-fidelity; mitigation is mechanical (grep gates +
acceptance criteria).
</threat_model>
<verification>
- `npm run build` exits 0; pre-checkpoint bundle gates 6/6 PASS (per Task 1).
- `HEADLESS=1 SKIP_PROD_REBUILD=1 npm run test:uat` exits 0 with 33/33 GREEN (sanity re-run; uses existing dist/).
- `03-VERIFICATION.md` line count >= 120; frontmatter has overrides_applied: 3 + human_verification list with 1 entry.
- REQUIREMENTS.md + ROADMAP.md + STATE.md marker flips visible via grep (see Task 3 acceptance).
- All 4 files staged for the closure commit.
</verification>
<success_criteria>
- 9/9 SPEC §10 criteria documented in 03-VERIFICATION.md scorecard with Phase + Plan + commit citations.
- 3 T5 overrides applied (§10 #4 / #5 / #8 PARTIAL) with explicit saved-memory + charter citations.
- 1 human_verification entry (§10 #9 RAM) with operator chrome://memory-internals instructions verbatim.
- Pre-checkpoint bundle gates 6/6 PASS.
- REQ-rrweb-dom-buffer + REQ-user-event-log markers flipped Complete; ROADMAP Phase 3 row [x]; STATE progress.completed_phases=3.
- vitest baseline preserved (171/171); UAT 33/33 GREEN; FORBIDDEN_HOOK_STRINGS unchanged at 12.
- Operator §10 #9 ack workflow surfaced via 03-VERIFICATION.md human_verification block + Operator-Empirical Acks placeholder row.
</success_criteria>
<output>
After completion, create
`.planning/phases/03-spec-10-smoke-verification-dom-event-log-verification/03-05-SUMMARY.md`
documenting:
- 9/9 §10 scorecard verified via Plans 03-01..04 + Phase 1 + Phase 2 evidence
- 3 overrides applied with explicit rationale
- 1 human_verification entry (§10 #9) — operator chrome://memory-internals workflow documented
- Marker flips committed atomically with 03-VERIFICATION.md in one closure commit (mirrors Phase 1 closure precedent `586836f`)
- Phase 3 retired; Phase 4 (Harden + clean up) candidate next per ROADMAP
- Forward-looking deferred items list carried into Phase 4 hardening scope
</output>