--- phase: 03-spec-10-smoke-verification-dom-event-log-verification plan: 01 subsystem: testing tags: - uat-harness - a29 - rrweb - dom-verification - spec-10-4 - req-rrweb-dom-buffer - approach-b - probe-html - eventtype-enum - phase-3-wave-1 requires: - phase: 01-stabilize-video-pipeline provides: "Plan 01-13 UAT harness Approach B (extension-internal page + synthetic MediaStream; page-side assertA* + host-side driveA* + harness.test.ts orchestrator); FORBIDDEN_HOOK_STRINGS lockstep pattern; pre-checkpoint bundle gates" - phase: 02-stabilize-export-pipeline provides: "Plan 02-04 A24-A28 harness extension (closest analog); findLatestZip helper at tests/uat/lib/harness-page-driver.ts; JSZip host-side parse pattern; chained-assertion / mtime-sort pattern; rrweb wiring + GET_RRWEB_EVENTS bridge production-shipped (src/content/index.ts:284-318)" provides: - 1 new UAT harness assertion (A29) empirically verifying REQ-rrweb-dom-buffer + SPEC §10 #4 end-to-end through a real Chrome instance against synthetic probe HTML (form + table + modal + DOM-mutation trigger) - assertA29 page-side orchestrator (DOM mutation dispatch + setupFreshRecording + SAVE) at tests/uat/extension-page-harness.ts - driveA29 host-side 3-phase driver (page.evaluate + findLatestZip + JSZip rrweb/session.json + EventType-enum grep) at tests/uat/lib/harness-page-driver.ts - Probe HTML in tests/uat/extension-page-harness.html (form with text+email+password+submit; table with thead+2 rows; modal trigger button with hidden modal div) appended BELOW existing scaffold; head + tokens.css link preserved - EventType import `import { EventType } from '@rrweb/types';` (already transitively present; first explicit use) - Orchestrator extension: drivers array 28 → 29; total 30/30 with A0; banner mentions A29 affects: - phase-03 plans 02/03/04/05 (will follow same Approach B template + can chain off A29 if needed) - phase-04 future rrweb v2 upgrade (A29's EventType enum import surface needs migration validation if @rrweb/types relocates NodeType per RESEARCH §"State of the Art") tech-stack: added: - "@rrweb/types EventType enum (explicit import in tests/uat/lib/harness-page-driver.ts; transitively present via rrweb 2.0.0-alpha.4 since Phase 1)" patterns: - "Approach B harness extension (Plan 02-04 verbatim template): page-side assertXX + host-side driveXX 3-phase (page.evaluate → findLatestZip → JSZip parse + grep) — proven on driveA26 (meta.json) + driveA28 (zip-layout); reused verbatim for driveA29 (rrweb/session.json)" - "RESEARCH Pitfall 1 mitigation pattern: synthetic probe HTML + pre-SAVE DOM mutation dispatch (input.value + dispatchEvent + modal click) ensures rrweb emits IncrementalSnapshot in addition to Meta + FullSnapshot — empirically verified A29.5 GREEN with events.length=4 + event types {2,3,4}" - "Page-side orchestrator (NOT stub) — assertA29 dispatches DOM mutation + setupFreshRecording + SAVE because the mutation MUST land BEFORE the GET_RRWEB_EVENTS bridge pulls the buffer; chaining off A28's already-completed zip would miss the IncrementalSnapshot window per Pitfall 1" key-files: modified: - tests/uat/extension-page-harness.html (probe HTML: form#probe-form + table#probe-table + button#probe-modal-trigger + div#probe-modal — appended BELOW existing `
` scaffold; head + tokens.css link preserved; no