diff --git a/.planning/HANDOFF.json b/.planning/HANDOFF.json new file mode 100644 index 0000000..8eedb1e --- /dev/null +++ b/.planning/HANDOFF.json @@ -0,0 +1,96 @@ +{ + "version": "1.0", + "timestamp": "2026-05-20T12:54:42.079Z", + "phase": "02", + "phase_name": "Stabilize export pipeline", + "phase_dir": ".planning/phases/02-stabilize-export-pipeline", + "wave": "pre-execution", + "status": "paused", + "plan_count": 4, + "next_plan": "02-01", + "completed_this_session": [ + {"id": "resume-from-cecefc6", "name": "Resume from prior pause-work checkpoint", "status": "done", "commit": "cecefc6"}, + {"id": "installflow-researcher", "name": "Install-flow + auto-select researcher (12 areas)", "status": "done", "commit": "4d828f1", "notes": "Both operator asks INFEASIBLE in unmanaged Chrome per W3C Screen Capture spec; informational CTA charter validated"}, + {"id": "01-14", "name": "Plan 01-14 monitorTypeSurfaces picker enhancement", "status": "done", "commits": ["41c1f7e", "433ee28", "b467123", "5254145", "9792c0f"], "notes": "A23 harness assertion locks the constraint; vitest 98→100; UAT 15→16"}, + {"id": "01-12", "name": "Plan 01-12 Design Integration (Lora + tokens + icons + i18n)", "status": "done", "commits": ["34a9ce1", "f86fd60", "abab6e1", "7732a30", "110cebc", "468f16d", "e8d2881", "b909c37", "865d394", "f319c7d", "66e6f50"], "notes": "7 waves, 10 tasks; R2 Lora baked in; operator brand-fit ack 'all good' 2026-05-20; vitest 100→147; UAT 16→21"}, + {"id": "01-10", "name": "Plan 01-10 Welcome tab (cycle-1 reject + 5 debug fixes + cycle-2 ack)", "status": "done", "commits": ["89e1e09", "49f087f", "8f329d8", "b112cb7", "4bba679", "d48a715", "0854baf", "a2dfc8c", "d21ed17", "52dc2e6", "d1ef77a"], "notes": "Welcome tab + onboarding flag + harness A15-A17; cycle-1 rejected (missing mark + misleading notif text + notif click failed); 5 inter-cycle debug fixes; cycle-2 ack + brand-rename follow-up; vitest 147→153; UAT 21→24"}, + {"id": "phase-1-verifier", "name": "Phase 1 gsd-verifier goal-backward audit GREEN", "status": "done", "commit": "586836f", "notes": "17/17 must-haves verified; VERIFICATION.md committed; STATE/ROADMAP/REQUIREMENTS markers flipped; Phase 1 100% closed"}, + {"id": "alpha-distribution", "name": "Alpha distribution zip for tester install", "status": "done", "notes": "dist-archives/mokosh-build-2026-05-20-6dbed91.zip (394 KB) + refreshed INSTALL.md; SHA256: 2a9ffe6797534d6a4cf5e040dccde8772245407483693efa17fdd1caca8b1f66"}, + {"id": "rephasing", "name": "Roadmap re-phasing per 'log is internal' charter shift", "status": "done", "commit": "6dbed91", "notes": "Original Phase 2 (DOM/privacy) REMOVED; REQ-rrweb + REQ-user-event-log absorbed by new Phase 3 smoke; REQ-password-confidentiality moved to Out of Scope v1; phases renumbered 3→2, 4→3, 5→4; total_phases 5→4"}, + {"id": "p2-discuss", "name": "Phase 2 (new export pipeline) /gsd-discuss-phase complete", "status": "done", "commit": "cc042a5", "notes": "02-CONTEXT.md captures 3 locked decisions: D-P2-01 offscreen Blob URL; D-P2-02 meta.urls schema; D-P2-03 full scope"}, + {"id": "p2-plan", "name": "Phase 2 /gsd-plan-phase 4 plans created + revised + plan-checker GREEN", "status": "done", "commits": ["0608b22", "9dcfcf0", "df8c086"], "notes": "4 plans 02-01..02-04; iteration 1 surfaced B1 (tabs permission) + 4 flags; user picked add-tabs-permission (DEC-011 Amendment 1); iteration 2 GREEN; CON-manifest-permissions constraint synced"} + ], + "remaining_tasks": [ + { + "id": "02-execute", + "name": "Execute Phase 2 (4 plans across 3 waves)", + "status": "ready", + "plans": [ + {"id": "02-01", "wave": 1, "type": "tdd", "name": "RED tests scaffold (blob-url-download + meta-json-urls-schema + strict-meta-json-validation)", "deps": []}, + {"id": "02-02", "wave": 2, "type": "auto", "name": "Blob URL pipeline (offscreen URL.createObjectURL + SW chrome.downloads + revoke lifecycle)", "deps": ["02-01"], "closes": "P0-6"}, + {"id": "02-03", "wave": 2, "type": "auto", "name": "meta.urls + tab-url-tracker + manifest 'tabs' permission + PROJECT.md DEC-011 Amendment 1 + manifest-i18n test", "deps": ["02-01"], "closes": "P1 #10"}, + {"id": "02-04", "wave": 3, "type": "auto+human-verify", "name": "UAT harness A24-A28 + operator empirical UAT", "deps": ["02-02", "02-03"]} + ], + "resume_with": "/gsd-execute-phase 2 (canonical Skill) OR /gsd-execute-phase 2 --wave 1 (lands RED tests only ~15-30min)" + }, + { + "id": "phase-3-prep", + "name": "Phase 3 (SPEC §10 smoke + DOM/event-log verification)", + "status": "pending_phase_2_closure", + "details": "Absorbs REQ-rrweb-dom-buffer + REQ-user-event-log verification per re-phasing. Includes rrweb 2.0.0-alpha.4 → stable v2 upgrade research. UAT harness extended further." + }, + { + "id": "phase-4-optional", + "name": "Phase 4 (Harden + clean up — optional)", + "status": "pending_phase_3_closure", + "details": "Phase 5-style P1/P2 follow-ups + accumulated session backlog: cursor visibility (Plan 01-07 obs); dark-surface logo contrast (Plan 01-10 obs); 2 pre-existing ffprobe/ffmpeg vitest flakes; setimmediate polyfill `new Function` in SW (vite-plugin-node-polyfills); ROADMAP 01-08..01-13 backfill verification; REQ-password-confidentiality v2 candidate; audit P1 #11/#14/#15 polish" + } + ], + "blockers": [], + "human_actions_pending": [ + { + "action": "Alpha testers verify dist-archives/mokosh-build-2026-05-20-6dbed91.zip", + "context": "Build distributed at end of session; testers run Load Unpacked + verify welcome page + notification CTA flow + recording start/save", + "blocking": false + } + ], + "decisions_this_session": [ + {"decision": "Phase 2 (DOM/event-capture privacy) REMOVED via re-phasing", "rationale": "User charter shift: 'log is internal' + 'we don't care about privacy hardening. At least here.' Archive flow is internal-only; P0-5 password masking dropped from v1; REQ-password-confidentiality moved to Out of Scope v1.", "commit": "6dbed91"}, + {"decision": "DEC-011 Amendment 1: add `tabs` permission to manifest", "rationale": "Required by Phase 2 D-P2-02 meta.urls feature; chrome.tabs.query({}) needs URL visibility beyond active-tab semantics; T-1-02 attack-surface concern acknowledged but overridden since permission is genuinely USED.", "commit": "9dcfcf0"}, + {"decision": "Phase 2 D-P2-01: offscreen-minted Blob URL pipeline replaces base64 data: URL download", "rationale": "Real archives EXCEED Chrome's ~2 MB data-URL cap; without migration the canonical use case (real bug-report archive) breaks. Audit P0-6 recommendation.", "context": "02-CONTEXT.md"}, + {"decision": "Phase 2 D-P2-02: meta.json schema `url:string` → `urls:string[]`", "rationale": "Multi-tab bug-reproduction workflow needs all tab URLs visible during the 30s window, not just active-at-SAVE. Schema-breaking change with REQUIREMENTS.md amendment.", "context": "02-CONTEXT.md"}, + {"decision": "Phase 2 D-P2-03: Full scope = bug fixes + schema validation + harness latency assertion", "rationale": "User direction; most comprehensive Phase 2 closure; ~3-4 plans (planner produced 4).", "context": "02-CONTEXT.md"} + ], + "session_anti_patterns": [ + { + "name": "/gsd-remove-phase CLI cascading rename bug", + "severity": "advisory", + "details": "gsd-sdk query phase.remove (and its /gsd-remove-phase Skill wrapper) has a bug at ~/.claude/get-shit-done/bin/lib/phase.cjs:670-679: the reverse-iteration loop ostensibly avoids conflicts but actually CASCADES renames — Phase 5→4 first, then 4→3 catches the just-renamed-from-5 phase, then 3→2 catches all of them. Net result: all subsequent phases collapse to 'Phase 2'. Plus a related regex at line 676 corrupts '2026-XX' dates to '2002-XX' (replacement-cascade similar). Both buggy outputs verified in this session at first /gsd-remove-phase 2 attempt. Recovery applied via manual edits + revert. Not a Mokosh-side issue; upstream GSD framework concern. NEXT-SESSION: if removing a future phase, prefer manual ROADMAP/STATE/REQUIREMENTS edits over /gsd-remove-phase until the upstream CLI is fixed. Other Skills (/gsd-discuss-phase, /gsd-plan-phase) work correctly." + }, + { + "name": "Charter shift mid-project (re-phasing)", + "severity": "advisory", + "details": "User's 'log is internal' realization mid-session triggered a roadmap re-scope. The canonical GSD response (per artifact-types.md + planner-revision.md) is to /gsd-remove-phase + /gsd-discuss-phase the renumbered phases. NEXT-SESSION: charter shifts are LEGITIMATE; user is the visionary. The discuss-phase ceremony is the right surface to capture them; PROJECT.md DEC-* table is where amendments land with provenance." + } + ], + "uncommitted_files": [], + "context_notes": "Phase 1 fully closed (Phase 1 verifier audit GREEN 2026-05-20; 14/14 plans; 5 operator acks; alpha distribution shipped). Phase 2 re-phased + fully planned + validated; ready for execution. Plans 02-01..02-04 are surgical: 02-01 RED tests, 02-02 Blob URL pipeline (closes P0-6), 02-03 meta.urls + tabs permission (closes P1 #10 + amends DEC-011), 02-04 harness A24-A28 + operator UAT. Estimated executor budget ~2-6h foreground. Wave 1 RED tests fast (~15-30min); Wave 2 parallelable on different surfaces (Blob URL pipeline vs meta.urls + tracker); Wave 3 harness extension + operator checkpoint sequential. Plan-checker iteration 2 GREEN; cleared.", + "next_action": "After /clear: run /gsd-resume-work to load this HANDOFF.json + the .continue-here.md. Recommended first step: /gsd-execute-phase 2 OR /gsd-execute-phase 2 --wave 1 (RED tests only). Alpha distribution build (6dbed91) is in operators' hands in parallel; their feedback flows back via separate session if any cycle-1-style debugs surface.", + "ceremony_state": { + "discuss_phase_complete": true, + "plan_phase_complete": true, + "plan_checker_passes": 2, + "blockers_resolved": ["B1-tabs-permission"], + "flags_resolved": ["F1-archive-layout-A28", "F2-empty-tracker-fallback", "F3-task3-deliberation", "F4-full-suite-verify"] + }, + "test_baselines": { + "vitest_green": 153, + "uat_green": 24, + "forbidden_hook_strings_count": 12, + "production_bundle_hook_free": true, + "phase_2_expected_targets": { + "vitest": "153 + ~15 (02-01 RED → 02-02/03/04 GREEN) = ~168 GREEN", + "uat": "24 → 29 GREEN (A24+A25+A26+A27+A28 added)" + } + } +} diff --git a/.planning/phases/02-stabilize-export-pipeline/.continue-here.md b/.planning/phases/02-stabilize-export-pipeline/.continue-here.md new file mode 100644 index 0000000..a64de14 --- /dev/null +++ b/.planning/phases/02-stabilize-export-pipeline/.continue-here.md @@ -0,0 +1,109 @@ +--- +context: phase +phase: 02-stabilize-export-pipeline +plan_count: 4 +status: paused +last_updated: 2026-05-20T12:54:42.079Z +--- + +# BLOCKING CONSTRAINTS — None + +> No blocking constraints introduced this session. Two **advisory** anti-patterns logged below (do not gate resumption). + +## Critical Anti-Patterns + +| Pattern | Description | Severity | Prevention Mechanism | +|---------|-------------|----------|---------------------| +| `/gsd-remove-phase` CLI cascading rename | gsd-sdk query phase.remove (and its /gsd-remove-phase Skill wrapper) has a bug at `~/.claude/get-shit-done/bin/lib/phase.cjs:670-679`: reverse-iteration loop cascades renames — Phase 5→4, then 4→3 catches just-renamed-from-5, then 3→2 catches all → collapses subsequent phases to "Phase 2". Plus line 676 regex corrupts "2026-XX" → "2002-XX". Verified in this session's first /gsd-remove-phase 2 attempt; recovered via manual edits + revert. | advisory | Upstream GSD-framework bug, NOT Mokosh-side. NEXT-SESSION: if removing a future phase, prefer manual ROADMAP/STATE/REQUIREMENTS edits over /gsd-remove-phase until upstream fixed. /gsd-discuss-phase + /gsd-plan-phase Skills work correctly. | +| Charter shift mid-project | User's "log is internal" realization mid-session triggered roadmap re-scope (Phase 2 DOM/privacy removed entirely). | advisory | Charter shifts are LEGITIMATE; user is the visionary. /gsd-discuss-phase is the canonical surface; PROJECT.md DEC-* table is where amendments land with provenance. | + +--- + +## Current State + +**Phase 2 (Stabilize export pipeline) PLANNING COMPLETE.** Ready for execution. + +- Branch: `gsd/phase-01-stabilize-video-pipeline` at HEAD `df8c086` +- 4 plans validated + plan-checker iteration 2 GREEN +- Test baselines: vitest 153/153 GREEN · UAT 24/24 GREEN · build clean · Tier-1 FORBIDDEN_HOOK_STRINGS = 12 · production bundle hook-free +- Working tree: clean +- Alpha distribution shipped: `dist-archives/mokosh-build-2026-05-20-6dbed91.zip` (testers running in parallel) + +## Plans Ready for Execution + +| Plan | Wave | Type | Scope | Closes | +|---|---|---|---|---| +| **02-01** | 1 | tdd | RED tests scaffold — `blob-url-download.test.ts` + `meta-json-urls-schema.test.ts` + `strict-meta-json-validation.test.ts`; 15 it() blocks total | Test contracts for D-P2-01/02/03 | +| **02-02** | 2 | auto | Blob URL pipeline — offscreen `URL.createObjectURL` + SW `chrome.downloads.download(url)` + `onChanged` revoke lifecycle; new PortMessageType (CREATE_DOWNLOAD_URL / DOWNLOAD_URL / REVOKE_DOWNLOAD_URL); depends_on [02-01] | **P0-6** | +| **02-03** | 2 | auto | meta.urls + tab-url-tracker module + manifest "tabs" permission + PROJECT.md DEC-011 Amendment 1 + manifest-i18n test update; depends_on [02-01] | **P1 #10** | +| **02-04** | 3 | auto + human-verify | UAT harness A24-A28 (Blob URL, <5s latency, 8-field meta, multi-tab urls, archive-layout set-equality) + operator empirical UAT cycle 1; depends_on [02-02, 02-03] | Phase 2 closure | + +## Recent commit chain (most recent first) + +- `df8c086` docs(02): sync CON-manifest-permissions constraint with DEC-011 Amendment 1 +- `9dcfcf0` fix(02): revise plans per checker (B1 + 4 flags) — add tabs permission for D-P2-02 +- `0608b22` feat(02): plans 01-04 — Phase 2 export pipeline closure (Blob URL + meta.urls + schema + harness) +- `cc042a5` docs(02): capture phase context — discuss-phase complete +- `6dbed91` docs(roadmap): re-phase milestone — remove Phase 2 (DOM/event-capture privacy) +- `586836f` docs(01): VERIFICATION + Phase 1 closure markers — goal-backward audit GREEN +- (… Phase 1 closure commits earlier) + +## Required Reading (in order) + +1. `.planning/HANDOFF.json` — machine-readable handoff (sibling to this file) +2. `.planning/STATE.md` — current progress (Phase 1 CLOSED; Phase 2 ready) +3. `.planning/ROADMAP.md` — post-re-phasing structure (4 phases now; Phase 2 = export) +4. `.planning/REQUIREMENTS.md` — REQ-meta-json-schema, REQ-archive-export-latency, etc. +5. `.planning/PROJECT.md` — DEC-011 Amendment 1 + CON-manifest-permissions sync +6. `.planning/phases/02-stabilize-export-pipeline/02-CONTEXT.md` — D-P2-01/02/03 locked decisions + Revision Log +7. `.planning/phases/02-stabilize-export-pipeline/02-01-PLAN.md` — first plan to execute (Wave 1 RED tests) +8. `.planning/phases/02-stabilize-export-pipeline/02-02-PLAN.md` — Wave 2 Blob URL pipeline +9. `.planning/phases/02-stabilize-export-pipeline/02-03-PLAN.md` — Wave 2 meta.urls + tab-tracker + tabs permission +10. `.planning/phases/02-stabilize-export-pipeline/02-04-PLAN.md` — Wave 3 harness + operator UAT +11. Auto-memory at `/home/parf/.claude/projects/-home-parf-projects-work-repremium/memory/MEMORY.md` — feedback constraints from prior sessions + +## Decisions Locked This Session + +- **DEC-011 Amendment 1** (committed `9dcfcf0`): `tabs` added to manifest permissions for Phase 2 D-P2-02 meta.urls feature. Audit T-1-02 acknowledged but overridden — permission is genuinely USED. +- **D-P2-01** (in 02-CONTEXT.md): Offscreen-minted Blob URL pipeline replaces base64 data: URL download. Closes audit P0-6. +- **D-P2-02** (in 02-CONTEXT.md): meta.json schema migrates `url:string` → `urls:string[]`. Closes audit P1 #10. SessionMetadata interface + CON-meta-json-schema both amended. +- **D-P2-03** (in 02-CONTEXT.md): Full scope = bug fixes + strict schema validation + harness <5s latency assertion. ~3-4 plans (4 produced). +- **Re-phasing 2026-05-20** (committed `6dbed91`): Original Phase 2 (DOM/event-capture privacy) REMOVED entirely. REQ-rrweb-dom-buffer + REQ-user-event-log absorbed by new Phase 3 (SPEC §10 smoke). REQ-password-confidentiality → Out of Scope (v1). Total phases 5 → 4. + +## Next-Session Order of Operations + +1. **`/gsd-resume-work`** to load this `.continue-here.md` + `.planning/HANDOFF.json` +2. **Acknowledge any blocking constraints** (none this time; only advisory anti-patterns above) +3. **`/gsd-execute-phase 2`** to start Phase 2 execution (canonical Skill) + - Alternative: `/gsd-execute-phase 2 --wave 1` lands just the RED tests scaffold (~15-30min) for tomorrow's first iteration +4. After Phase 2 closes: `/gsd-verify-work 2` (canonical Phase 2 goal-backward audit) +5. After Phase 2 marker flip: `/gsd-discuss-phase 3` (new Phase 3 = SPEC §10 smoke + DOM/event-log verification absorbed from old Phase 2) +6. Phase 3 → Phase 4 (optional) per ROADMAP + +## Infrastructure State + +- Branch: `gsd/phase-01-stabilize-video-pipeline` at HEAD `df8c086` — branch name preserved per /gsd-plan-phase workflow invariant (branch identity is owned by user's git workflow; ROADMAP phase rename does NOT mutate branch name) +- Build clean: `npm run build` 2.87s; `dist/` reflects current code state (post-re-phasing, post-Plan-01-10, post-all-debug-fixes) +- Alpha distribution: `dist-archives/mokosh-build-2026-05-20-6dbed91.zip` + INSTALL.md (testers running in parallel) +- Two pre-existing vitest flakes (ffprobe/ffmpeg) deferred to Phase 4 hardening; do NOT block Phase 2 + +## Phase 4 Backlog (informational; not gating Phase 2) + +Accumulated through this session for future Phase 4 hardening: + +- 2 pre-existing vitest flakes (ffprobe/ffmpeg) +- `setimmediate` polyfill `new Function` in SW chunk via `vite-plugin-node-polyfills` (pre-existing) +- `getDisplayMedia` cursor visibility refinement (Plan 01-07 operator observation 2026-05-15) +- Dark-surface logo contrast (Plan 01-10 operator observation 2026-05-20) +- rrweb 2.0.0-alpha.4 → stable v2 upgrade research (in Phase 3 plans now? or defer to Phase 4) +- ROADMAP backfill for Plans 01-08..01-13 entries (Plan 01-13 plan-checker flag #4) +- REQ-password-confidentiality v2 candidate +- Audit P1 #11 (fetch Request→[object Request]), #14 (navigation URL), #15 (rrweb timestamp semantics) + +## Context + +Massive session: 2026-05-19 morning → 2026-05-20 afternoon overnight. Phase 1 closed end-to-end (14/14 plans + 5 operator acks + verifier GREEN); alpha distributed; charter shifted ("log is internal"); roadmap re-phased; Phase 2 fully planned + validated. User explicitly chose canonical GSD ceremony throughout: /gsd-discuss-phase + /gsd-plan-phase + plan-checker revision loop all worked correctly (only /gsd-remove-phase had the upstream CLI bug; recovered manually). Phase 2 is ready to execute as soon as next session opens. + +## Next action + +Start with: `/gsd-resume-work` to load this handoff, then `/gsd-execute-phase 2` to start Phase 2 execution.