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>
732 lines
53 KiB
Markdown
732 lines
53 KiB
Markdown
---
|
||
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 && 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 && 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</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 && 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</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>
|