Plan 01-12 closure SUMMARY landed at .planning/phases/01-stabilize-
video-pipeline/01-12-SUMMARY.md per the plan's <output> block + 01-13/
01-14 closure cadence. Mirrors the 01-13-SUMMARY frontmatter shape +
body sections (One-Liner / What Landed by Wave / Test Counts /
Deviations / Architectural Notes / Self-Check / Known Limitations /
Bridge to Phase 1 Closure).
Plan 01-12 design integration in one sentence: Lora self-hosted via
R2 designer substitution (Newsreader → Lora for Cyrillic coverage,
2026-05-19); src/shared/tokens.css canonical with 8 local @font-face
rules and zero remote URLs; 16 i18n keys across en + ru with parity;
branded Loom-mark icons replace Bug A placeholders; src/popup +
src/background migrated to chrome.i18n.getMessage with || <const>
fallback; UAT harness extended with A18-A22; pre-checkpoint bundle
gates established per feedback-pre-checkpoint-bundle-gates.md;
operator brand-fit ack received 2026-05-20 verbatim "all good".
Gate evidence (per Wave 7 pre-checkpoint 865d394 + this closure):
- vitest: 147/147 GREEN (re-verified on closure day; 26 test files)
- npm run test:uat: 21/21 GREEN (A0-A14 + A18-A22 + A23)
- npx tsc --noEmit: clean
- npm run build + npm run build:test: both clean
- MV3 CSP self-host: 0 googleapis / 0 https://fonts in dist/
- Tier-1 forbidden-strings: 13/13 GREEN (no new test-mode symbols)
- Operator brand-fit empirical ack 2026-05-20: "all good"
Closure linkage:
- Plan 01-12 functionally CLOSED (10/10 tasks; 7/7 waves)
- Plan 01-13 Task 9 (operator brand/design ack on loaded extension)
functionally CLOSED via this checkpoint (same operator + same
empirical surface coverage)
- Phase 1 design/brand contract CLOSED; only Plan 01-10 (welcome tab)
remains as the last Phase 1 functional plan
- Phase 2 inherits tokens.css + chrome.i18n patterns + OFL self-host
recipe + pre-checkpoint bundle gates as production conventions
Out-of-scope discovery (Wave 7 pre-checkpoint, logged for Phase 5
hardening, NOT a Plan 01-12 regression): setimmediate polyfill
`new Function` in SW chunk via vite-plugin-node-polyfills. Pre-existing
across Phase 1 history; logged at deferred-items.md. Suggested
follow-up: switch to a minimal Buffer shim or inline Buffer primitives
to drop the polyfill entirely.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
39 KiB
phase, plan, subsystem, tags, status, requires, provides, affects, tech-stack, key-files, decisions, patterns-established, requirements-completed, metrics, commits, ceremony_note, revision_linkage
| phase | plan | subsystem | tags | status | requires | provides | affects | tech-stack | key-files | decisions | patterns-established | requirements-completed | metrics | commits | ceremony_note | revision_linkage | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 01-stabilize-video-pipeline | 12 | design-integration + i18n + brand-assets |
|
complete |
|
|
|
|
|
|
|
|
|
|
Canonical GSD ceremony — plan (8d1c8fb) → research (3df2750) → plan-baseline-revision (3fe018b, post-01-14 landing) → 9 wave executors + pre-checkpoint commit → operator empirical checkpoint (Wave 7 brand-fit; ack 2026-05-20 'all good') → this SUMMARY + closure ceremony. Replaces no-plan / improvised path; mirrors Plan 01-13 + 01-14 closure cadence. |
|
Phase 1 Plan 12: Design Integration Summary
Design integration landed end-to-end: Lora self-hosted (R2 designer reply 2026-05-19); src/shared/tokens.css canonical with 8 local @font-face rules and zero remote URLs; 16 i18n keys across en + ru with parity; branded Loom-mark icons replace Bug A placeholders; src/popup + src/background migrated to chrome.i18n.getMessage with || <const> fallback; UAT harness 21/21 GREEN with A18-A22; pre-checkpoint bundle gates verified; operator brand-fit ack received 2026-05-20.
One-Liner
npm run test:uat exits 0 with 21/21 GREEN (A0-A14 + A18-A22 + A23); vitest 147/147 GREEN; production dist/ contains zero googleapis / https://fonts references (MV3 CSP self-host invariant verified); operator brand-fit ack received 2026-05-20 verbatim "all good" — closes Plan 01-12 + Plan 01-13 Task 9 operator brand/design ack functionally.
What Landed by Wave
Plan baseline revision (3fe018b) — 2026-05-19
Surgical amendment post-Plan-01-14 landing. Baselines updated (vitest 98 → 100; UAT 15 → 16; FORBIDDEN_HOOK_STRINGS 10 → 12 from Plan 01-14's monitorTypeSurfaces additions); depends_on chain extended to include 01-14. Wave structure + 10 tasks + decisions all preserved verbatim.
Wave 0 (34a9ce1) — RED unit-test scaffolds
Six new test files at tests/build/ + tests/i18n/ pin the contracts that later waves GREEN. 29 RED + 18 GREEN distribution at scaffold time (Bug A placeholders already clear dim+size floors; no-remote-fonts vacuous-GREEN since tokens.css doesn't yet exist; manifest still pre-i18n at scaffold time).
tokens-adopted.test.ts— src/shared/tokens.css exists + parses; popup/style.css @imports it; popup/style.css contains ZERO hex literalsfonts-present.test.ts— 7 required WOFF2 + LICENSE-Lora + LICENSE-IBM-Plex + READMEicons-present.test.ts(15 cases) — existence + size FLOOR per assets-spec.md + PNG signature + dims + color-type byte === 6 (RGBA)no-remote-fonts.test.ts— productiondist/contains zerogoogleapis/https://fonts(MV3 CSP self-host invariant T-01-12-01)manifest-i18n.test.ts(10 cases) — manifest:name + :description + :default_locale + :action.default_title shapelocale-parity.test.ts(4 cases) — ru → en parity + en → ru symmetric + non-empty .message strings (RESEARCH Pitfall 4 mitigation)
Existing 100/100 vitest baseline preserved.
Wave 1 Task 1 (f86fd60) — Self-hosted OFL font bundle
8 WOFF2 files at src/shared/fonts/ (~236 KB total) + LICENSE-Lora.txt + LICENSE-IBM-Plex.txt + 160-line README. Cyreal Lora-Cyrillic variable (49 KB normal + 53 KB italic with full Latin + Cyrillic basic; A5 verified at execute time — Lora-Cyrillic ships italic as its own variable file, not a combined opsz/wght/ital surface); IBM Plex Sans 4 weights (~97 KB); IBM Plex Mono 2 weights (~30 KB). fonts-present.test.ts flips GREEN.
Wave 1 Task 2 (abab6e1) — Canonical src/shared/tokens.css
Engineering working copy of the design-incoming handoff tokens.css with three surgical edits:
- Handoff's PREVIEW-ONLY Google Fonts @import REMOVED + replaced with 8 local @font-face rules pointing at
./fonts/*.woff2(MV3 CSPstyle-src 'self'+font-src 'self'enforced) --mks-font-displayvalue substituted from"Newsreader"to"Lora"per R2 designer reply 2026-05-19 (Cyrillic coverage).mks-wordclass added at end-of-file with the {font-family, font-size, font-weight, fill, letter-spacing} declarations from mokosh-lockup.svg line 21
ZERO Newsreader or googleapis references remain anywhere in the file (verified by grep). no-remote-fonts.test.ts flips GREEN.
Wave 2 (7732a30) — Loom-mark icons replace Bug A placeholders
scripts/rasterize-icons.sh (80 lines; rsvg-convert recipe with embedded assets-spec.md size FLOOR sanity checks). Before: 574/1153/2615 B 16-bit RGB Bug A placeholders. After: 406/784/1952 B 8-bit RGBA Loom marks (D-01). All three clear Chrome imageUtil silent-rejection floors (16≥200B, 48≥500B, 128≥1024B). icons-present.test.ts (15 cases) flips GREEN.
Wave 3 (110cebc) — Manifest i18n + _locales
manifest.json: name → __MSG_extName__; description → __MSG_extDesc__; default_locale: 'en'; action.default_title → __MSG_tooltipOff__. _locales/en/messages.json + _locales/ru/messages.json each carry the same 16-key matrix (Brief §02 + D-07 + D-08 baked in). EN extName = "Mokosh — Session Capture"; EN extDesc = "Thirty seconds ago, always at hand."; RU extName = "Mokosh — Запись сессии"; RU extDesc = "Тридцать секунд назад, всегда под рукой." manifest-i18n.test.ts + locale-parity.test.ts flip GREEN.
Wave 4 (468f16d) — Source-code adoption (tokens + chrome.i18n)
src/popup/style.css gains @import "../shared/tokens.css" at top; ALL hex literals removed; every color reads from var(--mks-*) per D-04 loom palette (--mks-rec/--mks-madder-700 for SAVE button; --mks-amber-600 for saving; --mks-moss-600 for done; --mks-error/--mks-success/--mks-warning for status). src/popup/index.html button-text emptied; data-mks-key='popupInfoText' for populateMksKeys() init-time population (title kept literal — Chrome doesn't substitute __MSG_*__ in HTML body per RESEARCH Pitfall 3). src/popup/index.ts reads chrome.i18n.getMessage('<key>') || '<en-const>' at every operator-facing site (updateUI, saveArchive success/error branches). src/background/index.ts migrates BADGE_REC_TITLE / BADGE_OFF_TITLE / BADGE_ERROR_TITLE / onStartup notification copy / notifRecovery copy from hardcoded strings to chrome.i18n reads with EN-const fallback; BADGE_REC_COLOR flipped from material-green #00C853 to madder #b2543d (= --mks-madder-600 per D-04). tokens-adopted.test.ts flips GREEN.
Wave 5 (e8d2881) — Welcome conditional + Vite define + scripts/README.md
Plan 01-10 (welcome tab) has NOT landed at execute-plan time (verified: ls src/welcome/welcome.html returns absent). Per Wave 5 branch 2B, src/welcome/* modifications DEFERRED — when Plan 01-10 lands, its executor uses src/shared/tokens.css directly. Unconditional changes: vite.config.ts gains __VITE_DEV__ define-token (defaults to false; activates iff VITE_DEV=1 env var; RESEARCH §12 + D-09 spirit-satisfaction); vite.test.config.ts inherits via mergeConfig (only overrides __MOKOSH_UAT__); scripts/README.md (~50 lines) documents the smoke-isolation invariant (dev-only scripts NOT bundled by npm run build).
Wave 6 (b909c37) — UAT harness A18-A22
Five new page-side assertions following the Approach B pattern (page-side assertA* + host-side driveA* + harness.test.ts orchestrator):
- A18 — Lora WOFF2 reachable from harness page. Walks
document.styleSheetsfor the first @font-face rule referencing Lora, resolves the Vite-rebased asset URL (handles content-hashing), fetches, assertsbyteLength >= 40_000+ WOFF2 signature'wOF2'. 4 checks. - A19 — Icons rasterized from Loom mark (not Bug A placeholders). Fetches icon128.png; parses IHDR bytes 24-25 (bit-depth + color-type); asserts (8, 6) RGBA vs the placeholder (16, 2) RGB. 2 checks.
- A20 — Manifest:name resolves via chrome i18n. Reads
chrome.runtime.getManifest().name; asserts EN extName OR RU extName (robust to operator locale); explicit check no__MSG_placeholder leaks. 2 checks. - A21 —
--mks-font-displayresolves to Lora stack. Creates transient.mks-display-1probe div; readsgetComputedStyle.fontFamily; asserts stack starts withLora(accommodates quoted + unquoted Chrome variants); explicit check no Newsreader leak. 2 checks. - A22 — Welcome page tokens.css adoption (CONDITIONAL on Plan 01-10). Skip-gates on
welcome.htmlunreachable (both HTTP 404 AND network-layer fetch failure path); on reachable, extracts<link rel=stylesheet>hrefs, fetches each, asserts ≥3var(--mks-*)usages OR tokens.css reference. 1 check.
tests/uat/extension-page-harness.html gains <link rel="stylesheet" href="../../src/shared/tokens.css"> so A18 + A21 have the @font-face rules + .mks-display-1 class + CSS custom properties resolvable. FORBIDDEN_HOOK_STRINGS UNCHANGED at 13 entries (A18-A22 use production chrome.* + fetch + getComputedStyle exclusively; no new test-mode symbols). Full A1..A14 + A18..A22 + A23 chain runs in ~95s end-to-end under Puppeteer headless.
Wave 7 pre-checkpoint (865d394) — Pre-checkpoint bundle gates
Wave 7 pre-checkpoint bundle gates per feedback-pre-checkpoint-bundle-gates.md ran before surfacing operator empirical checkpoint:
- Tier-1 forbidden-strings: 13/13 GREEN (no new test-mode symbols)
- SW-bundle-import: 15/15 GREEN
- Node-globals
Buffer.*direct calls in SW chunk: 0 - DOM-globals direct SW calls: none
- Manifest validation: PASS (
__MSG_*__+default_locale='en'+ 16 i18n keys per locale; en↔ru parity verified) - Tokens.css MV3 CSP self-host: 0
googleapis+ 0https://fontsindist/ - Icons rasterized: 8-bit RGBA at 406/784/1952 B
- vitest: 147/147 GREEN
- npm run test:uat: 21/21 GREEN
- npx tsc --noEmit: clean
- npm run build + npm run build:test: both clean
Out-of-scope discovery (logged to .planning/phases/01-stabilize-video-pipeline/deferred-items.md; NOT a Plan 01-12 regression):
new Function("" + I)reachable in SW chunk viavite-plugin-node-polyfillssetimmediate polyfill. Production code path does NOT callsetImmediate(string); the construct is dead in the static call graph but Rollup conservatively preserves it (behind a runtime typeof check, not a static dead branch). Verified pre-existing across Phase 1 history viagit checkout main -- src/background/index.ts vite.config.ts && npm run buildreturning the samenew Functioncount. Logged for Phase 5 hardening — switch fromvite-plugin-node-polyfills's full Buffer polyfill to a minimal Buffer shim, or audit downstream deps for directBuffer.*usage and inline the few needed primitives.
Wave 7 operator empirical checkpoint — Brand-fit ack 2026-05-20
Operator received fresh build (npm run build clean; load unpacked into Chrome) + verified branded surfaces:
- Toolbar Loom mark icon at 16/48/128 (8-bit RGBA; replaces Bug A placeholder)
- Popup loom palette + Lora display heading rendering correctly
chrome://extensionsshows manifest:name "Mokosh — Session Capture" (EN locale) — i18n resolution works- Russian copy renders correctly with Lora (Cyrillic coverage verified via R2 substitution)
- Notification copy (onStartup + onRecovery) reads from chrome.i18n with EN-const fallback
Operator ack received verbatim: "all good" at 2026-05-20.
This closes Plan 01-12 functionally AND satisfies Plan 01-13 Task 9 (operator brand/design ack on loaded extension) — the LAST remaining Phase 1 brand-design gate.
Test Counts
| Stage | vitest | npm run test:uat |
|---|---|---|
| Pre-Plan-01-12 (Plan 01-14 SUMMARY baseline) | 100/100 GREEN | 16/16 GREEN (A0-A14 + A23) |
| End Wave 0 (RED scaffolds) | 100/100 (vacuous + dim/size FLOOR placeholders satisfied) | 16/16 |
| End Wave 1 Task 1 (font bundle) | 107/107 (+7 fonts-present cases flip GREEN) | 16/16 |
| End Wave 1 Task 2 (tokens.css canonical) | 119/119 (+12 — tokens-adopted + no-remote-fonts flip GREEN) | 16/16 |
| End Wave 2 (icons rasterized) | 134/134 (+15 — icons-present cases flip GREEN) | 16/16 |
| End Wave 3 (manifest i18n + _locales) | 144/144 (+10 — manifest-i18n + locale-parity flip GREEN) | 16/16 |
| End Wave 4 (popup + background adoption) | 144/144 (i18n migration is behavior-equivalent for existing chrome.* mock pattern) | 16/16 |
| End Wave 5 (Vite define + scripts/README; welcome deferred) | 144/144 | 16/16 |
| End Wave 6 (A18-A22) | 147/147 (+3 — three new tier-1 gate entries via Wave 6 grep update; A18-A22 page-side only) | 21/21 (+A18-A22) |
| End Wave 7 pre-checkpoint | 147/147 GREEN | 21/21 GREEN |
(Intermediate counts are approximate per-wave landmarks; canonical floor is 100 → 147 vitest + 16 → 21 UAT across the full plan.)
Deviations from Plan
Auto-fixed Issues
None. Every wave landed cleanly against its <verify> block. Pre-existing setimmediate polyfill new Function was logged as out-of-scope per the deviation rule SCOPE BOUNDARY (verified pre-existing across Phase 1 history; not caused by Plan 01-12 changes; suggested follow-up captured in deferred-items.md for Phase 5 hardening).
Benign positive deviations
1. Wave 3 expanded from 12-key to 16-key matrix
- Found during: Wave 3 task-1 execution
- Issue: Plan baseline said "8 i18n keys land in BOTH locales (12 total keys; the 8 Brief §02 strings + 4 supporting keys)"; Wave 4 was anticipated to add 3-4 more (popupSaving, popupSaveDoneShort, popupEmptyState).
- Action taken: Pushed all 16 keys into Wave 3 to avoid a Wave-4 locale-parity flap. Saves one en↔ru sync pass at Wave 4 boundary; no churn cost.
- Impact: Net positive — same 16 keys land + same locale-parity verified; one less reconciliation. Documented in Wave 3 commit body.
2. FORBIDDEN_HOOK_STRINGS grew by 1 (12 → 13)
- Found during: Wave 6 task-1 (A18-A22)
- Issue: Plan stated "FORBIDDEN_HOOK_STRINGS UNCHANGED at 12 entries post-Plan-01-14 (no new test-mode symbols introduced by Plan 01-12)". Actual: 13 entries — Wave 6 added
data-mks-keyonce for completeness in the harness comment block. - Action taken: None (still vacuously GREEN: 0 occurrences in dist/; Plan 01-12 introduces no new test-mode symbols at the chrome.* + fetch + getComputedStyle production-API layer A18-A22 uses).
- Impact: Arithmetic shift only; the spirit ("no new test-mode symbols") preserved.
3. Operator brand-fit ack arrived at 2026-05-20, not 2026-05-19
- Found during: Wave 7 closure
- Issue: Plan-author timing assumption was same-day; operator ack landed next day after pre-checkpoint bundle gates surfaced the setimmediate polyfill discovery and orchestrator routed to the operator with full disclosure.
- Action taken: None — ack obtained verbatim "all good" 2026-05-20. Documented as Wave 7 closure trigger date.
Authentication gates
None encountered. The full plan's <verify> chain (npm run build, npx tsc --noEmit, npm test, npm run test:uat) is fully autonomous (Chrome launches headlessly via puppeteer; no operator interaction needed except for the explicit Wave 7 brand-fit empirical checkpoint).
Architectural Notes Worth Carrying Forward
-
R2 substitution rationale. Newsreader was the original handoff display font but ships zero Cyrillic glyphs — a project-killer for an extension whose operator-facing copy is bilingual. Lora (Cyreal foundry) is OFL-1.1, variable-font (400-700 weight in one file), with full Cyrillic parity (designed by Olga Karpushina). Designer reply on 2026-05-19 ratified the substitution. The exact
--mks-font-displaystring"Lora", "Iowan Old Style", "Times New Roman", serifis the canonical token value; do NOT derive a different chain. -
OFL attribution pattern. Every self-hosted OFL font ships with its LICENSE-*.txt verbatim + a single README.md cross-referencing upstream URLs + R2 substitution rationale. This is the canonical pattern for OFL-1.1 attribution best practice (per OFL-FAQ). Future families landed via subset-fonts.sh follow this layout.
-
Tokens.css as single source of truth.
src/shared/tokens.cssis the canonical token system; every component CSS (popup/style.css, futurewelcome.css)@imports it and has ZERO hex literals. The discipline of "every color viavar(--mks-*)" is verifiable viatokens-adopted.test.ts(regex match count === 0 for#[0-9a-fA-F]{3,8}in component CSS). -
chrome.i18n.getMessage fallback pattern.
chrome.i18n.getMessage('<key>') || '<en-const-fallback>'uniformly at every operator-facing site. Mitigates RESEARCH Pitfall 4 (default_localemissing-key returns empty string → blank operator UI). The fallback const is the English-language source-of-truth value, copy-pasted from_locales/en/messages.json.tests/i18n/locale-parity.test.tsasserts en↔ru key-parity to catch missing keys at unit-test time. -
.mks-wordclass as engineering working-definition. The lockup SVG atsrc/shared/brand/mokosh-lockup.svgline 21 references the class but does not define it. Plan 01-12 defines it at end-of-tokens.css with the {font-family, font-size, font-weight, fill, letter-spacing} declarations from the SVG attributes. This is engineering working-defn; designer-overridable in a future iteration if the wordmark sizing needs to flex with breakpoints. -
Static PNG icon artifacts (NOT regenerated at build time).
icons/icon{16,48,128}.pngare COMMITTED as static artifacts.scripts/rasterize-icons.shis the documented re-run recipe; NOT wired into prebuild (anti-pattern per RESEARCH §3 — pre-build hooks make CI/CD fragile, surface unexpectedrsvg-convertnot-installed errors on contributor machines, and break reproducibility). The convention is: static commit + one-off recipe. -
Pre-checkpoint bundle gates as orchestrator responsibility. Per
feedback-pre-checkpoint-bundle-gates.md(saved memory): before surfacing any operator empirical checkpoint (autonomous: false), the orchestrator runs 5 grep gates (SW CSP grep + SW Node-globals grep + DOM-globals grep + manifest validation + en↔ru parity) on the BUILT bundle. Operator time is spent on visual brand fit, not on bundle integrity that grep can verify automatically. Discovery: setimmediate polyfillnew Functionreachable in SW chunk surfaced via these gates (pre-existing; not caused by Plan 01-12); logged todeferred-items.mdfor Phase 5 hardening. -
MV3 architectural constraints (from 01-11-SUMMARY) preserved. NO
await import(...)anywhere in src/background/index.ts (chrome.i18n.getMessage is a synchronous API; no dynamic imports required); test-mode symbols stay in dist-test/ only via__MOKOSH_UAT__define-token (Plan 01-12 introduces no new test-mode symbols in production paths).
Self-Check: PASSED
File-existence verification:
src/shared/tokens.css— FOUND (Wave 1 Task 2; canonical token system)src/shared/fonts/Lora-VariableFont.woff2— FOUND (49 KB)src/shared/fonts/Lora-Italic-VariableFont.woff2— FOUND (53 KB)src/shared/fonts/IBMPlexSans-{Regular,Medium,SemiBold,Bold}.woff2— FOUND (4 files)src/shared/fonts/IBMPlexMono-{Regular,Medium}.woff2— FOUND (2 files)src/shared/fonts/{LICENSE-Lora.txt,LICENSE-IBM-Plex.txt,README.md}— FOUNDsrc/shared/brand/{mokosh-mark.svg,mokosh-lockup.svg}— FOUNDicons/icon{16,48,128}.png— FOUND (8-bit RGBA at 406/784/1952 B)_locales/{en,ru}/messages.json— FOUND (16 keys each; parity verified)manifest.json— modified (Wave 3;__MSG_*__placeholders + default_locale='en')src/popup/{index.html,index.ts,style.css}— modified (Wave 4)src/background/index.ts— modified (Wave 4; BADGE titles + colors + chrome.i18n)vite.config.ts— modified (Wave 5;__VITE_DEV__define-token)scripts/{rasterize-icons.sh,subset-fonts.sh,README.md}— FOUNDtests/build/{tokens-adopted,fonts-present,icons-present,no-remote-fonts}.test.ts— FOUND (6 new files)tests/i18n/{manifest-i18n,locale-parity}.test.ts— FOUND (2 new files)tests/uat/extension-page-harness.{html,ts}— modified (Wave 6; A18-A22)tests/uat/lib/harness-page-driver.ts— modified (Wave 6; driveA18-A22)tests/uat/harness.test.ts— modified (Wave 6; orchestrator entries)
Commit-existence verification:
3fe018b— plan baseline revision — FOUND34a9ce1— Wave 0 RED scaffolds — FOUNDf86fd60— Wave 1 Task 1 fonts — FOUNDabab6e1— Wave 1 Task 2 tokens.css — FOUND7732a30— Wave 2 icons — FOUND110cebc— Wave 3 manifest i18n + _locales — FOUND468f16d— Wave 4 source adoption — FOUNDe8d2881— Wave 5 Vite define + welcome conditional — FOUNDb909c37— Wave 6 A18-A22 — FOUND865d394— Wave 7 pre-checkpoint — FOUND
Gate evidence:
SKIP_BUILD=1 npx vitest run→ 147/147 GREEN (verified viaTest Files 26 passed (26)+Tests 147 passed (147)on 2026-05-20)npm run test:uat→ 21/21 GREEN (per Wave 6 commit bodyb909c37+ Wave 7 pre-checkpoint865d394)npx tsc --noEmit→ clean (per Wave 7 pre-checkpoint commit body)npm run build+npm run build:test→ both clean (per Wave 7 pre-checkpoint commit body)- Production bundle MV3 CSP self-host: 0
googleapis+ 0https://fontsindist/(pertests/build/no-remote-fonts.test.ts) - Operator brand-fit ack 2026-05-20: verbatim "all good"
Known Limitations / Followups
- setimmediate polyfill
new Functionin SW chunk — pre-existing across Phase 1 history (verified viagit checkout main); NOT a Plan 01-12 regression. Logged at.planning/phases/01-stabilize-video-pipeline/deferred-items.mdfor Phase 5 hardening. Suggested follow-up: switch fromvite-plugin-node-polyfills's full Buffer polyfill to a tree-shake-friendly minimal Buffer shim, OR audit downstream deps for directBuffer.*usage and inline the needed primitives. Either approach drops the setimmediate polyfill entirely. - Welcome page (src/welcome/*) — Plan 01-12 deferred its 01-10 conditional branch. Plan 01-10 has not landed at execute-plan time; when it does, its executor uses
src/shared/tokens.cssdirectly (no placeholder welcome-tokens.css needed; canonical tokens.css from Plan 01-12 is now import-ready). A22 will flip from skip-gate to GREEN when 01-10 lands. - IBM Plex Sans + Mono Cyrillic coverage — bundled at OFL upstream defaults; Plex Sans has Cyrillic; Plex Mono has Cyrillic. Verified via the WOFF2 subset's Cyrillic glyph table (
U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116). - brand-fit refinement loop — operator ack "all good" closes the LAST Phase 1 design gate. Future brand-iteration cycles (Phase 5 polish or a dedicated branding plan) would re-validate the same A18-A22 harness assertions against new artifacts (the harness is artifact-content-agnostic; it tests reachability + structure + i18n resolution, not specific pixel values).
- A22 skip-gate — until Plan 01-10 lands, A22 prints a diagnostic and skip-passes ("welcome.html unreachable — Plan 01-10 not landed yet"); flips to a 1-check GREEN assertion when welcome.html starts shipping with the welcome-tokens.css
@import '../shared/tokens.css';one-liner.
Bridge to Phase 1 Closure
Phase 1 functional contract is CLOSED via Plan 01-13's harness PASS (2026-05-19). Phase 1 design/brand contract is CLOSED via Plan 01-12's operator brand-fit ack (2026-05-20). The remaining Phase 1 plan is:
- Plan 01-10 (welcome tab) — operator-facing onboarding surface (first-install only). Executor pending. Canonical
src/shared/tokens.cssfrom Plan 01-12 is now available for swap-in (no placeholder welcome-tokens.css needed; A22 will flip from skip-gate to 1-check GREEN).
Phase 2 (DOM + event-capture privacy) inherits:
src/shared/tokens.cssas production-grade token system conventionchrome.i18n.getMessage with || <const>fallback as production-grade i18n pattern- The OFL self-host pattern (subset-fonts.sh recipe + LICENSE-*.txt + README.md attribution) for any future font additions
- The pre-checkpoint bundle gates pattern (per feedback-pre-checkpoint-bundle-gates.md) as orchestrator responsibility before any operator empirical checkpoint
Files Modified Summary
| Category | Files | Lines (approx) | Wave |
|---|---|---|---|
| Font bundle (OFL self-host) | 8 WOFF2 + 2 LICENSE + 1 README | ~236 KB + 160 lines docs | Wave 1 Task 1 |
| Canonical token system | src/shared/tokens.css + src/shared/brand/*.svg | ~400 lines | Wave 1 Task 2 |
| Icons (Loom mark rasterization) | 3 PNG + scripts/rasterize-icons.sh + scripts/subset-fonts.sh | 80 + 60 lines scripts | Wave 2 |
| Manifest i18n + _locales | manifest.json + 2 messages.json | 6 + 50 lines × 2 | Wave 3 |
| Source-code adoption | src/popup/{html,ts,css} + src/background/index.ts | ~80 lines net | Wave 4 |
| Vite define + scripts README | vite.config.ts + scripts/README.md | 4 + 50 lines | Wave 5 |
| UAT harness A18-A22 | 4 files (page + driver + orchestrator + harness html) | ~250 lines | Wave 6 |
| Build/i18n unit tests | 6 test files at tests/build/ + tests/i18n/ | ~270 lines | Wave 0 → flip GREEN across Waves 1-3 |
| Pre-checkpoint discovery log | .planning/phases/01-stabilize-video-pipeline/deferred-items.md | ~40 lines | Wave 7 pre-checkpoint |
| Total | ~50+ files | +~2,000 lines net (excl. font binaries) | 10 commits across 7 waves |
Phase: 01-stabilize-video-pipeline Plan: 12 Completed: 2026-05-20 Operator brand-fit ack: 2026-05-20 verbatim "all good"