---
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>
