Files
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

53 KiB
Raw Permalink Blame History

phase, slug, plan, type, wave, depends_on, files_modified, autonomous, requirements, tags, user_setup, must_haves
phase slug plan type wave depends_on files_modified autonomous requirements tags user_setup must_haves
03 spec-10-smoke-verification-dom-event-log-verification 05 execute 5
01
02
03
04
.planning/phases/03-spec-10-smoke-verification-dom-event-log-verification/03-VERIFICATION.md
.planning/REQUIREMENTS.md
.planning/ROADMAP.md
.planning/STATE.md
true
REQ-install-clean
REQ-rrweb-dom-buffer
REQ-user-event-log
verification
spec-10-sweep
aggregator
t5-override
charter-d-p3-02
charter-d-p3-04
phase-3-closure
truths artifacts key_links
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
path provides min_lines
.planning/phases/03-spec-10-smoke-verification-dom-event-log-verification/03-VERIFICATION.md Full §10 sweep aggregator with 9-criterion scorecard + T5 override block + human_verification block + cross-cutting gates + deferred items 120
path provides contains
.planning/REQUIREMENTS.md REQ-rrweb-dom-buffer + REQ-user-event-log markers updated with Plan 03-01/03-02 closure citation Phase 3 closure
path provides contains
.planning/ROADMAP.md Phase 3 row flipped [x] + closure date + harness count update (33 assertions) Phase 3
path provides contains
.planning/STATE.md progress.completed_phases incremented to 3; current_focus + last_activity updated completed_phases: 3
from to via pattern
03-VERIFICATION.md 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) evidence column citations A29|A30|A31|A32
from to via pattern
03-VERIFICATION.md override_notes feedback-trust-harness-over-manual-uat.md saved memory T5 override rationale citation feedback-trust-harness-over-manual-uat
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.

<execution_context> @$HOME/.claude/get-shit-done/workflows/execute-plan.md @$HOME/.claude/get-shit-done/templates/summary.md </execution_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

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.

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.
Task 1: Run pre-checkpoint bundle gates (6/6 standard inventory) - /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) 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. 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.
  1. 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.

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

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

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

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

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

  7. 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. npm run build && npm test -- --run tests/background/no-test-hooks-in-prod-bundle.test.ts tests/background/sw-bundle-import.test.ts tests/i18n/ tests/build/ <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> 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.
Task 2: Write 03-VERIFICATION.md (9-criterion sweep + T5 override + human_verification + cross-cutting gates) .planning/phases/03-spec-10-smoke-verification-dom-event-log-verification/03-VERIFICATION.md - .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 `` 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 `` block (10 deferred items to carry into the Forward-Looking Deferred Items table) 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 `` 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) 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 `` 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.
  1. The file content (full template):
<!-- 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)*
  1. Replace <ISO-8601 timestamp with Z> with the current ISO timestamp at write time (e.g. 2026-05-20T19:00:00Z).
  2. 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.
  3. 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. test -f .planning/phases/03-spec-10-smoke-verification-dom-event-log-verification/03-VERIFICATION.md && L=$(wc -l < .planning/phases/03-spec-10-smoke-verification-dom-event-log-verification/03-VERIFICATION.md) && test "$L" -ge 120 && grep -q 'overrides_applied: 3' .planning/phases/03-spec-10-smoke-verification-dom-event-log-verification/03-VERIFICATION.md && grep -q 'human_verification:' .planning/phases/03-spec-10-smoke-verification-dom-event-log-verification/03-VERIFICATION.md && grep -q 'score: 9/9 SPEC §10 criteria' .planning/phases/03-spec-10-smoke-verification-dom-event-log-verification/03-VERIFICATION.md <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> 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.
Task 3: Flip REQUIREMENTS.md + ROADMAP.md + STATE.md markers (Phase 3 closure) .planning/REQUIREMENTS.md, .planning/ROADMAP.md, .planning/STATE.md - .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) 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`.
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):

  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:

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

*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.*
  1. 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:

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

**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/TBD5/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

  1. Open .planning/STATE.md. Use the Edit tool:

    a. Frontmatter: update progress.

    • status: ready_to_planphase_3_complete
    • progress.completed_phases: 23
    • progress.total_plans: 1823
    • progress.completed_plans: 1823
    • progress.percent: 5075
    • 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:

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

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

  1. 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. grep -E "^- [x] **REQ-rrweb-dom-buffer" .planning/REQUIREMENTS.md | grep -v '^#' | grep -q REQ-rrweb-dom-buffer && grep -E "^- [x] **REQ-user-event-log" .planning/REQUIREMENTS.md | grep -v '^#' | grep -q REQ-user-event-log && grep -E "^- [x] **Phase 3" .planning/ROADMAP.md | grep -v '^#' | grep -q "Phase 3" && grep -q "completed_phases: 3" .planning/STATE.md <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> 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.

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

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

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