--- context: phase-4-plan-preferences captured: 2026-05-20 expires_when: /gsd-plan-phase 4 completes --- # Phase 4 plan-phase preferences (captured pre-UI-SPEC exit) User invoked `/gsd-plan-phase 4` 2026-05-20 and answered both initial gate questions before workflow exited at UI-SPEC gate. These preferences should be re-honored on next `/gsd-plan-phase 4` invocation (after `/gsd-ui-phase 4` completes): ## UI Design Contract gate **Decision:** Generate UI-SPEC.md first → run `/gsd-ui-phase 4` before re-running plan-phase. **Caveat to revisit:** Unlike Phase 3 (false-positive null-spec), Phase 4 has genuine UI work — specifically the dark-surface logo contrast fix (Plan 01-10 obs 2026-05-20). The cursor visibility constraint is purely behavioral (getDisplayMedia `video: {cursor: 'always'}` — 1 line in src/offscreen/recorder.ts) and does not need designer iteration. /gsd-ui-phase 4 should produce a thin-but-real UI-SPEC covering ONLY: - dark-surface logo contrast strategy (media query + alt-color SVG vs wrapper background vs neutral palette swap — designer picks) - (informational only) cursor visibility constraint — list as inherited behavioral change, not a design surface If /gsd-ui-phase 4 surfaces the "is this a UI phase?" question, answer "yes — but narrow scope (dark-logo design only; cursor is behavioral)". ## Research gate **Decision:** Research first (light) → spawn gsd-phase-researcher before planning. **Scope for researcher (~10-20 min):** 1. **setimmediate polyfill replacement strategy** — current source is `vite-plugin-node-polyfills` (per Plan 01-12 disclosure). Options: (a) inline manual polyfill `globalThis.setImmediate ||= (fn, ...args) => queueMicrotask(() => fn(...args))` — bypasses plugin entirely (b) configure vite-plugin-node-polyfills to disable setimmediate inclusion (c) document acceptance with explicit CSP-allow rationale (already-done Phase 1 acceptance log path) Recommend best path for v1 close. 2. **SW state persistence 5-min idle test patterns under MV3** — ROADMAP SC #1 requires "extension idle for >5 minutes, then exporting, the archive still contains a non-empty video buffer". Best practices for: - Forcing SW unload in Puppeteer (`chrome.runtime.reload()`? or just wait for natural idle eviction at 30s?) - Verifying buffer survives across reload (IndexedDB? `chrome.storage.local`? existing keepalivePort architecture from Plan 01-05?) - 5min Puppeteer timeout considerations (CI lane vs default) 3. **chrome.scripting.executeScript world:'ISOLATED' best practices** for the A29 cs-injection-world fix (per Plan 03-02 introduced pattern). Confirm: re-targeting the rrweb probe to a fresh probe tab (instead of reading iana.org leftover) is the canonical fix; identify any pitfalls. Researcher should NOT investigate: - rrweb v2 upgrade implementation path (deferred to v1.1/v2 per D-P3-03 + D-P4-01) - Full rrweb maskInputFn or data-sensitive masking (out of scope v1 per charter shift) - Programmatic SW-RAM measurement via chrome.devtools Memory API (deferred to v1.1/v2 per D-P3-04 + D-P4-01) - Any audit P1 #11/#14/#15 deep-dive (already-understood fixes; planner works directly from CONTEXT.md ``) ## Auto-cleanup Delete this file when /gsd-plan-phase 4 successfully completes planner spawn (after honoring these preferences).