Files
mokosh/.planning/phases/01-stabilize-video-pipeline/.continue-here.md
Mark cecefc61f9 wip: phase-01 paused — .continue-here.md handoff (pairs with c60b887 HANDOFF.json)
Human-readable handoff. Captures:
- 3 BLOCKING CONSTRAINTS from saved memory (scope reduction, GSD ceremony, pre-checkpoint gates)
- 3 anti-patterns from this session (improvised artifact types, claiming canonical without verifying, save-stops UX cycle)
- Current state + working tree + test/build baseline
- Next-session order of operations (10 steps)
- Required reading order
- Pending researcher brief (12 areas; was 529-blocked)
- Infrastructure state + API capacity note
- Followup backlog

Resume: /clear → /gsd-resume-work

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-19 17:57:45 +02:00

154 lines
11 KiB
Markdown

---
context: phase
phase: 01-stabilize-video-pipeline
status: paused
last_updated: 2026-05-19T15:53:41Z
---
# BLOCKING CONSTRAINTS — Read Before Anything Else
These persist from prior sessions and are reaffirmed this session:
- [ ] **No unilateral scope reduction** — auto-memory `feedback-no-unilateral-scope-reduction.md`. Surface options via AskUserQuestion or default to FULL scope; never pre-narrow. Applies to orchestrator AND subagent briefs.
- [ ] **GSD ceremony for fixes** — auto-memory `feedback-gsd-ceremony-for-fixes.md`. Bugs route through /gsd-debug; orchestrator does not hot-edit src/.
- [ ] **Pre-checkpoint bundle gates** — auto-memory `feedback-pre-checkpoint-bundle-gates.md`. Before surfacing any operator empirical checkpoint: SW CSP grep (new Function/eval) + SW Node-globals grep (Buffer.from) + DOM-globals grep + Tier-1 SW-bundle-import gate + manifest validation. Failure routes to /gsd-debug, not operator.
Acknowledge each before proceeding.
## Critical Anti-Patterns
| Pattern | Description | Severity | Prevention Mechanism |
|---------|-------------|----------|---------------------|
| Improvised artifact types | Created `01-11-PLAN-AMENDMENT-A.md` without checking GSD artifact-types.md; not a recognized type. Resolved via spike-pivot pattern (Plan 01-11 closed; new Plan 01-13 for proven architecture). | resolved | Cite a doc path when claiming GSD-canonical; never infer. Read `references/planner-revision.md` + `references/artifact-types.md` first. |
| Claiming "canonical" without verifying | Twice this session called things canonical based on inference. User caught both. | advisory | When recommending the canonical path, cite the workflow/reference doc; do not infer. |
| Save-stops UX cycle | Operator reported "doesn't switch off = bug"; shipped fix; operator realized original always-on was correct; reversed. Cycle landed in Amendments 2+3 of 01-09-PLAN.md. | advisory | When operator surfaces UX "bug" that's intentional behavior they observed but didn't expect, clarify charter intent BEFORE shipping a code change. Ask: "is this a bug, or is this unexpected behavior you'd like to confirm matches design intent?" |
---
## Current State
Phase 1 functional contract is **CLOSED via Plan 01-13's harness PASS** (`npm run test:uat` 15/15 GREEN; Bug A + Bug B regression-rewind demos empirically verified). Remaining Phase 1 work:
- **Plan 01-10 (welcome tab)** — plan rewritten + design-swap-in-ready architecture (commit `3a530c2`); executor pending
- **Plan 01-12 (Design Integration)** — plan created (commit `8d1c8fb`); R2 Lora unblocked everything; executor pending
- **Install-flow + auto-select researcher** — 529'd twice during session; re-spawn pending
**Designer responses outstanding: ZERO.** All 9 brand decisions resolved + R2 Lora reply landed (`--mks-font-display: "Lora", "Iowan Old Style", "Times New Roman", serif`). 8 i18n copy strings (Brief §02) inherit D-03 Sober defaults unless brand team overrides.
Test/build baseline at pause:
- vitest **98/98 GREEN**
- `npm run test:uat` **15/15 GREEN** (A0-A14, includes inverted A14 post-charter-reversal)
- tsc clean; `npm run build` clean
- Production bundle hook-free (Tier-1 grep gate, 10 forbidden strings)
- HEAD: `c60b887` (pause WIP commit)
- Branch: `gsd/phase-01-stabilize-video-pipeline`
Working tree at pause:
- `M .gitignore` — adds `dist-archives/` ignore entry (from distribution-zip work); commit as `chore: gitignore dist-archives` in next session OR fold into next docs commit
Distribution artifact available:
- `dist-archives/mokosh-build-2026-05-19-285e46f.zip` (154 KB) + `dist-archives/INSTALL.md`
- SHA256: `e05ff3dff807a3c74cea6ac821d433c24de2e209803237413d12accbb3986ae0`
- Gitignored; not in repo history
---
## Next-Session Order of Operations
1. **`/gsd-resume-work`** to load this `.continue-here.md` + `.planning/HANDOFF.json`
2. **Acknowledge the BLOCKING CONSTRAINTS above** (saved-memory pointers)
3. **Spawn install-flow researcher** (the 529-blocked work; foreground; brief at §"Pending Researcher Brief" below). API should be healthier; if 529 recurs, monitor `status.claude.com` + retry.
4. **AFTER researcher returns:** revise Plan 01-10 (welcome tab CTA may flip from informational to actionable per Ask 1) + possibly amend Plan 01-09 (auto-select picker permissions per Ask 2)
5. **Spawn Plan 01-12 executor** (Design Integration; 7 waves; ~6-10h subagent budget). Wave-by-wave fresh-context spawns recommended.
6. **Spawn Plan 01-10 executor** (welcome tab; 4 autonomous tasks + 1 operator checkpoint; ~3-4h)
7. **Both 01-10 + 01-12 can parallel** — different surfaces, only manifest.json conflict (different keys). Sequential safer if uncertain.
8. **Operator empirical UAT** — fresh build + Load Unpacked + verify welcome tab + branded tokens + Russian copy + Loom mark icon + manifest:name renders correctly
9. **Flip Phase 1 closure markers:** REQUIREMENTS.md, ROADMAP.md (also backfill 01-08..01-13 entries per Plan 01-13 plan-checker flag #4), STATE.md
10. **Phase 2 kickoff** (Stabilize DOM + event-capture privacy)
---
## Required Reading (in this order)
1. `.planning/HANDOFF.json` — structured state (this file's machine-readable sibling)
2. `.planning/STATE.md` — current phase progress
3. `.planning/phases/01-stabilize-video-pipeline/01-13-SUMMARY.md` — Plan 01-13 full narrative including save-stops cycle
4. `.planning/phases/01-stabilize-video-pipeline/01-11-SUMMARY.md` — spike-pivot architectural learnings (NEVER `await import()` in SW; track.dispatchEvent('ended') not stop(); `__MOKOSH_UAT__` token)
5. `.planning/intel/brand-decisions-v1.md` — 9 brand decisions resolved
6. `.planning/intel/brand-decisions-v1-followup-display-font.md` — R2 Lora reply context
7. `.planning/phases/01-stabilize-video-pipeline/01-10-PLAN.md` (commit 3a530c2) — welcome tab plan (design-swap-in-ready)
8. `.planning/phases/01-stabilize-video-pipeline/01-12-PLAN.md` (commit 8d1c8fb) — Design Integration plan (R2 Lora baked in)
9. `.planning/phases/01-stabilize-video-pipeline/01-09-PLAN.md` Amendments 2 + 3 — closure-via-harness + save-stops reversal charter
10. Auto-memory at `/home/parf/.claude/projects/-home-parf-projects-work-repremium/memory/MEMORY.md` — feedback-* files are the saved constraints above
---
## Pending Researcher Brief
Spawn `gsd-phase-researcher` foreground.
**Subject:** Install-flow UX upgrade — research install-time auto-start + auto-select desktop under "minimum friction everywhere" policy.
**Two asks to research:**
### Ask 1: Start recording at install-time
Operator expectation: install extension → recording active. Zero clicks ideal.
Orchestrator hypothesis (verify or refute empirically):
- `getDisplayMedia` REQUIRES user gesture per W3C Screen Capture spec
- `chrome.runtime.onInstalled` callback fires without activation → cannot call getDisplayMedia
- Achievable max: install → welcome tab opens (zero clicks) → operator clicks SINGLE "Start Mokosh" button → recording starts
- Enterprise-policy escape may exist (`ScreenCaptureWithoutGestureAllowedForOrigins`?) for managed deployments
### Ask 2: Auto-select desktop (skip picker)
Operator expectation: no picker dialog; just record what user is looking at.
Orchestrator hypothesis (verify or refute empirically):
- Picker is consent gate; Chrome WILL NOT let extensions auto-pick a screen
- Achievable max: reduce picker friction (displaySurface monitor constraint, chrome.desktopCapture.chooseDesktopMedia(["screen"]), Chrome launch flag `--auto-select-desktop-capture-source` for managed deployments)
- No JS-callable auto-accept exists for unmanaged Chrome
**Research areas (12; cite sources + run probes empirically):**
1. getDisplayMedia gesture requirement empirical (W3C spec + Chromium source if findable)
2. Enterprise policy reality (ScreenCaptureWithoutGestureAllowedForOrigins — real in 2026? syntax? deployment?)
3. Welcome-tab Start-button gesture chain (does activation propagate through chrome.runtime.sendMessage?)
4. chrome.desktopCapture.chooseDesktopMedia auto-accept behavior (single-monitor vs multi-monitor)
5. Chrome 2024-2026 screen-capture API additions (getCurrentBrowsingContextMedia, Capture Handle, others?)
6. Single-monitor auto-accept empirical test (which API auto-accepts on dev machine?)
7. Industry prior art (Loom for Chrome, Awesome Screenshot, Screencastify, Vimeo Record, Veed.io)
8. Permission combinations + manifest implications (desktopCapture, tabs, activeTab)
9. Welcome tab + onStartup notification interplay (combined first-install + restart flow)
10. Privacy / consent UX considerations
11. Synthesized minimum-friction user journey (concrete ASCII flow)
12. Edge cases (macOS screen-recording permission, Linux Wayland vs X11, incognito, managed Chrome)
**Output:** `.planning/phases/01-stabilize-video-pipeline/01-10-RESEARCH.md`.
**Constraints:** foreground spawn; anti-context-anxiety (no AskUserQuestion; commit `wip(01-10-research):` on context exhaustion); cite sources; be honest about IMPOSSIBLE constraints (don't suggest workarounds that don't exist).
---
## Infrastructure State
- Branch: `gsd/phase-01-stabilize-video-pipeline` at HEAD `c60b887` (pause WIP)
- `vite.config.ts` + `vite.test.config.ts` both work; two-bundle separation operational (`npm run build``dist/` hook-free; `npm run build:test``dist-test/` test-instrumented)
- `npm run test:uat` operational (15/15 GREEN; ~75s wall-clock for full harness; A11 35s buffer wait dominates)
- Tier-1 grep gate at `tests/background/no-test-hooks-in-prod-bundle.test.ts` enforces 10 forbidden hook strings absent from production dist/
- `smoke.sh` operational for operator-driven empirical (HEADLESS=0 + real screen-share)
- ffprobe at `/usr/bin/ffprobe` (UAT harness A12 + smoke acceptance gate)
- `dist-archives/` (gitignored) contains tester-install zip + INSTALL.md
## API Capacity Note
Anthropic API hit 529 Overloaded twice during this session's afternoon (during researcher spawn for install-flow + auto-select). User is monitoring `status.claude.com`. Reversal-debug spawn DID work after API recovered. Next session: try researcher first; if 529 recurs, defer to later or use ScheduleWakeup with 30-60min delay.
## Followup Backlog (not blocking; capture for future)
- ROADMAP.md gap: Plans 01-08..01-13 missing entries (Plan 01-13 plan-checker flag #4)
- `tabs` permission gap: harness A2 thinning workaround per 01-11-SUMMARY; production would benefit from adding `tabs` permission
- A12 full ffprobe coverage: synthetic-stream produces frameless WebM in headless; HEADLESS=0 with real screen-share is the escape hatch
- IBM Plex Sans + Mono self-hosting: Plan 01-12 currently leaves them as system fallback; Plan 5 hardening could bundle them