chore(01-13): wave-0 — clean broken Approach-A artifacts per 01-11-SUMMARY
Restore a clean baseline before promoting thec647f61prototype to production paths (Wave 1) and building out Approach-B driver scaffolding (Wave 2). All deletions trace back to falsifications documented in 01-11-SUMMARY.md. Deleted — broken Approach-A files: - src/test-hooks/sw-hooks.ts MV3 SW blocks dynamic import (Chromium es_modules.md; w3c/webextensions#212). The gated `await import('../test-hooks/ sw-hooks')` from 01-11 Wave 1 never resolved → SW silently died → production listeners never registered. File was dead-on-arrival; no fix possible while MV3 SWs disallow dynamic import. Approach-B replaces SW-side instrumentation with the extension-internal harness page's chrome.action.* + chrome.notifications.* surface (full privilege; no monkey-patching needed). - tests/uat/lib/{launch,extension,sw,offscreen,assertions}.ts Popup-bridge architecture (01-11dbd977c) — falsification 2 + falsification 3 in 01-11-SUMMARY: `sw.evaluate` exposes only chrome.{loadTimes,csi}, NOT chrome.action.* / chrome.notifications.* / chrome.runtime.sendMessage; setPopup-juggling for extension-id resolution turned out to be unnecessary (browser.extensions() works directly per the prototype). These files will be reborn in Wave 2 around the extension-page architecture. Kept: tests/uat/lib/zip.ts (host-side JSZip work — architecture- agnostic; A12+A13 still use it) and tests/uat/lib/test-hook- contract.d.ts (type mirror — extended in Wave 3 but kept as-is here). - tests/uat/prototype/probe_{offscreen,sw,tabs,tabs2}.mjs Feasibility-research probes (01-11 spike) that empirically falsified the Approach-A hypotheses. The findings are encoded in 01-11- SUMMARY.md; the probes themselves are dead code. - tests/uat/harness.test.ts 01-11 Wave 2 popup-bridge orchestrator (dbd977c). Imports the now-deleted tests/uat/lib/{assertions,extension,sw,offscreen,launch} modules — would not typecheck after this commit. Reborn in Wave 3A as the Approach-B orchestrator (extension-internal page driver + A0 grep gate + 13 assertion drivers). Reverted — SW-side dynamic-import gate comment block: - src/background/index.ts lines 13-29 The existing comment block (post-spike) described the SW-side gated dynamic import that never landed. Rewritten to cite 01-13 Approach-B explicitly, link to 01-11-SUMMARY.md falsification, and clarify that the Tier-1 grep gate's enduring value is catching regressions in the offscreen chunk's __MOKOSH_UAT__ gate (the SW chunk is hook-free by construction). Updated — Tier-1 grep gate FORBIDDEN_HOOK_STRINGS inventory: - tests/background/no-test-hooks-in-prod-bundle.test.ts Removed: `simulateUserStop` (Approach-A naming; replaced by Approach-B `dispatchEndedOnTrack` which matches the W3C dispatchEvent semantics per RESEARCH §7 BLOCKER — track.stop() does NOT fire 'ended' per spec, so the simulation MUST use dispatchEvent). Added: `installFakeDisplayMedia`, `uninstallFakeDisplayMedia`, `dispatchEndedOnTrack`, `__mokoshOffscreenQuery`. Total inventory: 8 surface strings (was 5). Each MUST be absent from every file under dist/ post-build. Verification (all GREEN): - `npm run build` — exit 0; dist/ populated. - `grep -rln <forbidden> dist/` — 0 matches. - `npm run build:test` — exit 0; dist-test/ populated; offscreen-hooks chunk contains `installFakeDisplayMedia` (gate runs correctly against the test build's distinct artifact). - `npx tsc --noEmit` — exit 0 (root + tests/uat/tsconfig.json). - `npx vitest run` — 92/92 tests passing (was 89; the +3 new tests come from the FORBIDDEN_HOOK_STRINGS list expanding 5 → 8 — each forbidden string is one parametric `it(...)` block). Both prior-failing tests now GREEN: - tests/background/sw-bundle-import.test.ts (was missing dist/ → 92/92 requires the test run to have a current dist/; vitest gate test rebuilds via execFile when SKIP_BUILD≠1, otherwise relies on prior `npm run build`). - tests/background/no-test-hooks-in-prod-bundle.test.ts (was failing on stale dist; now GREEN against the freshly-rebuilt clean bundle). Wave 1 (next): promote tests/uat/prototype/{extension-page-harness.html, extension-page-harness.ts,a6.test.ts} to tests/uat/ via `git mv`; update vite.test.config.ts rollup input. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -10,22 +10,36 @@ import type {
|
||||
import { remuxSegments } from './webm-remux';
|
||||
import JSZip from 'jszip';
|
||||
|
||||
// ─── Plan 01-11: gated test-hook dynamic import ───────────────────────
|
||||
// MUST run BEFORE any chrome.* addListener call below so the SW-side
|
||||
// test hook's addListener monkey-patches catch every handler
|
||||
// registration. The `__MOKOSH_UAT__` token is text-replaced by Vite at
|
||||
// build time — `false` in production (vite.config.ts), `true` only in
|
||||
// the test bundle (vite.test.config.ts). The `if (false)` branch is a
|
||||
// static dead branch and Rollup tree-shakes the entire `await import`
|
||||
// away (Plan 01-11 RESEARCH §6, refined: we use a dedicated token
|
||||
// rather than `import.meta.env.MODE === 'test'` because vitest also
|
||||
// runs with MODE='test' and gating on MODE would activate the hooks
|
||||
// inside unit tests + clobber their vi.fn() chrome.* mocks).
|
||||
// ─── Plan 01-13: NO SW-side test hook gate (Approach B) ──────────────
|
||||
// Plan 01-11 originally planned a gated `await import('../test-hooks/sw-hooks')`
|
||||
// here to instrument chrome.* handler registrations from the SW side.
|
||||
// EMPIRICAL FALSIFICATION (01-11 spike, see 01-11-SUMMARY.md): MV3
|
||||
// service workers BLOCK dynamic import (Chromium es_modules.md:
|
||||
// "Dynamic import is currently blocked in Service Workers, but it
|
||||
// will change in the future."; w3c/webextensions#212 still open as of
|
||||
// May 2026). The `await import(...)` never resolved → the SW silently
|
||||
// died at top-of-module init → production chrome.* listeners never
|
||||
// registered → the entire service worker was non-functional.
|
||||
//
|
||||
// The Tier-1 grep gate `tests/background/no-test-hooks-in-prod-bundle
|
||||
// .test.ts` enforces that `__mokoshTest` is absent from every file
|
||||
// under `dist/` post-build (T-1-11-01 — Elevation of Privilege via
|
||||
// leaked hook surface).
|
||||
// Plan 01-13 (Approach B) DROPS the SW-side hook entirely:
|
||||
// - The OFFSCREEN-side test hook (src/test-hooks/offscreen-hooks.ts)
|
||||
// still works because offscreen IS a DOM document where dynamic
|
||||
// import is supported. See src/offscreen/recorder.ts top-of-module
|
||||
// for the surviving `if (__MOKOSH_UAT__) { await import(...) }`.
|
||||
// - SW-side state (badge text, popup, isRecording proxy) is queried
|
||||
// by the extension-internal harness page via chrome.action.*
|
||||
// directly (the page has full chrome.* privilege, unlike the
|
||||
// restricted CDP `sw.evaluate` surface that 01-11 tried first).
|
||||
// - Architectural rationale + full falsification table:
|
||||
// .planning/phases/01-stabilize-video-pipeline/01-11-SUMMARY.md
|
||||
//
|
||||
// SECURITY INVARIANT (T-1-11-01, retained): production bundle MUST
|
||||
// contain NO test-hook surface strings. The Tier-1 grep gate
|
||||
// `tests/background/no-test-hooks-in-prod-bundle.test.ts` enforces
|
||||
// post-build. In Approach B this invariant is trivially satisfied for
|
||||
// the SW chunk (no hook imports here at all); the gate's enduring
|
||||
// value is catching regressions in the offscreen chunk's
|
||||
// `__MOKOSH_UAT__` gate.
|
||||
|
||||
// Default MIME applied when a wire chunk somehow lacks a type
|
||||
// field (defense-in-depth: in normal operation the offscreen recorder
|
||||
|
||||
Reference in New Issue
Block a user