Plan 01-12 closure documentation sync per the plan's Wave 7 Task 1 spec. Three docs land together as one atomic closure commit per the Plan 01-13 + 01-14 closure cadence convention. STATE.md changes: - status: verifying → executing (Plan 01-10 welcome tab still pending) - stopped_at: Plan 01-14 → Plan 01-12 closed via Wave 7 brand-fit ack 2026-05-20 'all good'; Plan 01-10 remains as final Phase 1 functional plan - last_updated + last_activity: 2026-05-19 → 2026-05-20 - progress.completed_plans: 12 → 13 (13 plans: 01-01..01-09 + 01-11 spike + 01-12 + 01-13 + 01-14; Plan 01-10 pending) - progress.percent: 86 → 93 - "Plan 01-13 closure" header annotated: brand/design ack subsequently closed via Plan 01-12 Wave 7 2026-05-20 - New "Plan 01-12 closure (2026-05-20)" section: 7-wave execution arc with all 10 commit hashes (3fe018bplan-baseline-revision →34a9ce1Wave 0 →f86fd60+abab6e1Wave 1 →7732a30Wave 2 →110cebcWave 3 →468f16dWave 4 →e8d2881Wave 5 →b909c37Wave 6 +865d394pre-checkpoint +f319c7dSUMMARY); R2 Lora substitution; 16 i18n keys; branded icons; BADGE_REC_COLOR #b2543d; chrome.i18n fallback; A18-A22 harness; pre-checkpoint bundle gates per feedback-pre-checkpoint-bundle-gates.md; setimmediate polyfill discovery logged to deferred-items.md (Phase 5 hardening); operator brand-fit ack; Plan 01-13 Task 9 functional closure - "Outstanding Phase 1 gates" updated: Plan 01-13 Task 9 + Plan 01-12 CLOSED; only Plan 01-10 remains - Performance Metrics table: Plan 01-12 entry appended (~10h cumulative; 10 tasks; ~50+ files) - Decisions section: 2 new entries for Plan 01-12 design integration + Plan 01-13 Task 9 closure linkage - Session Continuity: last/prior session updated to 2026-05-20 / 2026-05-19 ROADMAP.md changes: - Phase 1 Plans list: 01-12-PLAN.md entry flipped from [ ] to [x] with full closure annotation (R2 Lora self-host, tokens.css canonical, 16 i18n keys across en+ru, branded Loom icons, manifest i18n, BADGE_REC_COLOR madder #b2543d, chrome.i18n fallback, harness A18-A22, operator brand-fit ack 2026-05-20 'all good') - Phase 1 plan count: 13 → 14 plans (01-01 through 01-14) - Progress table Phase 1 row: 7/7 Complete → 13/14 Executing with closure-status disambiguation (functional via Plan 01-13; design/brand via Plan 01-12; Plan 01-10 welcome tab remains) REQUIREMENTS.md changes: - REQ-install-clean: [ ] Pending → [x] Complete (2026-05-20) with annotation: fresh build clean; zero remote-font CSP errors; branded icons; en+ru manifest:name resolution; operator brand-fit ack - REQ-manifest-permissions: [ ] Pending → [x] Complete (2026-05-20) with annotation: manifest:name + :description + :action.default_title migrated to __MSG_*__ + default_locale='en'; manifest validation PASS; en↔ru parity; permissions DEC-011 baseline UNCHANGED - Traceability table: both requirements moved from Phase 3/4 Pending to "Phase 1 closure via Plan 01-12" Complete - Footer: last-updated 2026-05-15 → 2026-05-20 with annotation noting the requirements flipped at Plan 01-12 closure No code changes; pure documentation closure sync. Closure commit hashes: - SUMMARY:f319c7d(.planning/phases/01-stabilize-video-pipeline/01-12-SUMMARY.md) - State sync: this commit (.planning/STATE.md + .planning/ROADMAP.md + .planning/REQUIREMENTS.md) Phase 1 status post-closure: - Functional contract: CLOSED via Plan 01-13 harness PASS (2026-05-19) - Design/brand contract: CLOSED via Plan 01-12 brand-fit ack (2026-05-20) - Remaining: Plan 01-10 (welcome tab) — operator-facing onboarding surface; canonical src/shared/tokens.css from Plan 01-12 now available for swap-in Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
12 KiB
Requirements: Mokosh
Defined: 2026-05-15 Core Value: When an operator hits a bug, one click produces a self-contained archive that lets support reproduce what happened — in under 5 s, no server, no password leaks.
All requirements below are extracted from the SPEC Тз расширение фаза1.md.
The intel files .planning/intel/requirements.md, .planning/intel/constraints.md,
and .planning/intel/decisions.md carry the verbatim wording, source citations,
and technical bindings; this file is the GSD-shaped projection of those facts.
v1 Requirements
Requirements for the Phase 1 SPEC. Each maps to one phase in ROADMAP.md.
Video
- REQ-video-ring-buffer: The extension maintains an in-memory ring
buffer containing the most recent 30 seconds of captured video. AMENDED in
Phase 01: video is acquired via
navigator.mediaDevices.getDisplayMedia()invoked from the offscreen document (withchrome.offscreen.Reason.DISPLAY_MEDIA), NOTchrome.tabCaptureas originally specified. The captured stream is screen-or-window-scoped per the operator's one-time selection in Chrome's native picker, and continues unchanged across tab switches. Encoding isvideo/webm; codecs=vp9@ 400 000 bps. Ring-buffer mechanism FURTHER AMENDED in Phase 01 fix-a3 (debug session webm-playback-freeze, resolved 2026-05-15): the original D-09..D-11 single-continuous-MediaRecorder+ age-trim approach was retired in favor of D-13 restart-segments — the recorder stop()/start()s every 10 s on the sameMediaStream, keeping the last 3 self-contained ~10 s WebM segments (3 × 10 s = 30 s window). Each segment carries its own EBML header + seed VP9 keyframe and is independently decodable, eliminating the orphan-P-frame freeze observed with the trim approach. Bindings: DEC-003 (AMENDED), DEC-009, CON-video-window, CON-video-codec, CON-display-capture-binding (replaces RETIRED CON-tab-capture-binding). CON-webm-header-retention RETIRED in favor of D-13 per-segment header isolation.- SPEC §10 acceptance criteria: #2, #3 — green 2026-05-15 (D-12 ffprobe
gate). #7 (last_30sec.webm plays back in a browser) — REOPENED
2026-05-16: D-13's concat-of-self-contained-segments architecture
produces a multi-EBML-header file that standards-compliant Matroska
parsers (mpv, ffmpeg, Chrome's HTMLMediaElement) play only as the
first segment (~9.94 s) and silently drop segments 2 and 3. The
2026-05-15 "operator-confirmed clean Chrome playback" assessment was
insufficient — it checked playback ran without freezing but did not
measure total duration. Plan 01-08 (WebM remux via ts-ebml +
webm-muxer) will replace
mergeVideoSegments's file-concat with a real single-EBML-headered remux, restoring SPEC §10 #7. See.planning/debug/d13-multi-ebml-concat-unplayable.mdfor the byte-level root-cause evidence.
- SPEC §10 acceptance criteria: #2, #3 — green 2026-05-15 (D-12 ffprobe
gate). #7 (last_30sec.webm plays back in a browser) — REOPENED
2026-05-16: D-13's concat-of-self-contained-segments architecture
produces a multi-EBML-header file that standards-compliant Matroska
parsers (mpv, ffmpeg, Chrome's HTMLMediaElement) play only as the
first segment (~9.94 s) and silently drop segments 2 and 3. The
2026-05-15 "operator-confirmed clean Chrome playback" assessment was
insufficient — it checked playback ran without freezing but did not
measure total duration. Plan 01-08 (WebM remux via ts-ebml +
webm-muxer) will replace
DOM Capture
- REQ-rrweb-dom-buffer: The extension records DOM events via rrweb
(
rrweb.record()) running in the Content Script over a rolling 10-minute window, capped at 5 000 events (oldest dropped on overflow). Sensitive fields are masked via rrweb v2maskInputFncoveringinput[type=password]and[data-sensitive="true"]. Bindings: DEC-004, CON-rrweb-window, CON-sensitive-data-masking.- SPEC §10 acceptance criteria: #4.
Event Logging
- REQ-user-event-log: The extension logs user and runtime events over
a rolling 10-minute window. Captured types:
click(records target selector and element text),input(excludes password fields),navigation(popstate,hashchange, page transitions),js_error(window.onerror,window.onunhandledrejection),network_error(fetch/XMLHttpRequestwith response code >= 400). Each entry conforms to the verbatimCON-event-log-schema. Bindings: CON-event-log-window, CON-event-log-schema, CON-sensitive-data-masking.- SPEC §10 acceptance criteria: #5, #8.
Export
-
REQ-screenshot-on-export: On "Save archive" click, the extension captures a PNG screenshot of the active tab via
chrome.tabs.captureVisibleTab()and includes it asscreenshot.pngin the archive. Binding: DEC-008. -
REQ-popup-ui: The extension exposes a minimal popup with a single button labeled "Сохранить отчёт об ошибке" and a sub-label "Последние 30 сек видео + 10 мин лога". Button state machine:
idle → "Сохраняю..." → "Готово! ✓" → idle(3 s revert). On click: (1) capture screenshot, (2) request video buffer + event log from SW, (3) request rrweb snapshots from Content Script, (4) assemble archive, (5) trigger download, (6) display "Готово! ✓". Russian strings are part of the contract and preserved verbatim. -
REQ-archive-layout: The archive is named
session_report_YYYY-MM-DD_HH-MM-SS.zipand contains exactly:session_report_2025-05-15_14-32-10.zip ├── video/ │ └── last_30sec.webm ├── rrweb/ │ └── session.json ├── logs/ │ └── events.json ├── screenshot.png └── meta.jsonBinding: CON-archive-layout.
- SPEC §10 acceptance criteria: #7.
-
REQ-meta-json-schema:
meta.jsoninside the archive conforms to the verbatim schema:{ "timestamp": "2025-05-15T14:32:10Z", "url": "https://...", "userAgent": "Chrome/...", "extensionVersion": "1.0.0", "videoBufferSeconds": 30, "logDurationMinutes": 10, "totalEvents": 143 }All fields required. Binding: CON-meta-json-schema.
Manifest & Install
-
REQ-manifest-permissions:
manifest.jsondeclares exactly the permission set in DEC-011 (tabCapture,activeTab,downloads,scripting,storage;host_permissions: ["<all_urls>"]) and requests a user gesture fortabCaptureon first activation. Binding: DEC-011, CON-manifest-permissions. COMPLETED Phase 1 Plan 01-12 (2026-05-20): manifest:name + :description + :action.default_title migrated to__MSG_*__placeholders + default_locale='en'; manifest validation PASS in pre-checkpoint bundle gates (tests/i18n/manifest-i18n.test.tsshape +tests/i18n/locale-parity.test.tsen↔ru parity); permissions baseline UNCHANGED (Plan 01-12 added ZERO new permissions). Operator brand-fit ack 2026-05-20.- SPEC §10 acceptance criteria: #1.
-
REQ-install-clean: The extension installs in Chrome without errors via the unpacked-extension load flow. COMPLETED Phase 1 Plan 01-12 (2026-05-20): fresh
npm run buildproduces clean dist/; load unpacked into Chrome shows manifest:name "Mokosh — Session Capture" (EN) or "Mokosh — Запись сессии" (RU) with no permission warnings, no remote-font CSP errors (0googleapis/ 0https://fontsin dist/ verified bytests/build/no-remote-fonts.test.ts), branded Loom-mark icons rendering at 16/48/128 sizes (8-bit RGBA), and 16 i18n keys per locale with en↔ru parity. Operator brand-fit ack 2026-05-20 "all good" on the empirical load.- SPEC §10 acceptance criteria: #1.
Performance & Security
-
REQ-archive-export-latency: From the moment the user clicks the export button, the ZIP archive lands in the "Downloads" folder in under 5 seconds. Binding: CON-archive-export-latency.
- SPEC §10 acceptance criteria: #6.
-
REQ-password-confidentiality: Passwords do not appear in rrweb snapshots OR the user event log. Masking is enforced via rrweb v2
maskInputFnAND explicit value filtering in the event logger for password fields. Binding: CON-sensitive-data-masking.- SPEC §10 acceptance criteria: #8.
v2 Requirements
Deferred to a future phase per SPEC §9 ("Что НЕ входит в Фазу 1"). Tracked but not in current roadmap.
Server & Diagnostics
- SRV-01: Upload captured archives to a remote server.
- SRV-02: AI-driven diagnostics of captured sessions.
- SRV-03: Automatic ticket creation from captured reports.
- SRV-04: Analytics dashboard summarising captured sessions.
Capture
- CAP-01: Audio recording in addition to video.
Out of Scope
Explicitly excluded in Phase 1. Documented to prevent scope creep.
| Feature | Reason |
|---|---|
| Server upload | SPEC §9 — Phase 2 work. Phase 1 is local-only via chrome.downloads. |
| AI diagnostics | SPEC §9 — Phase 2 work. |
| Automatic ticketing | SPEC §9 — Phase 2 work. |
| Analytics dashboard | SPEC §9 — Phase 2 work. |
| Audio recording | SPEC §9 — Phase 2 work. |
chrome.storage / IndexedDB persistence of rolling buffers |
CON-buffer-storage — buffers are in-memory only in Phase 1. |
| Recording inactive tabs | CON-tab-capture-binding — chrome.tabCapture is active-tab-bound by design. |
Phase 1 Acceptance Criteria (SPEC §10 verbatim)
For traceability, all SPEC §10 acceptance criteria are listed once here, each cross-referenced to its supporting REQ-* entries. The developer-facing success metric for the whole project is "all 9 pass".
- The extension installs in Chrome without errors. → REQ-install-clean, REQ-manifest-permissions
- The video buffer runs continuously on any tab. → REQ-video-ring-buffer
- The buffer always contains no more than 30 seconds of video. → REQ-video-ring-buffer
- rrweb records DOM events without errors on typical pages (forms, tables, modal windows). → REQ-rrweb-dom-buffer
- The event log captures clicks, navigation, and network errors. → REQ-user-event-log
- On button press, the archive is downloaded to "Downloads" in < 5 seconds. → REQ-archive-export-latency
- The archive opens;
last_30sec.webmplays back in a browser. → REQ-archive-layout, REQ-video-ring-buffer - Passwords do not appear in the log or rrweb snapshots. → REQ-password-confidentiality
- Extension RAM consumption does not exceed 50 MB in the background. → CON-ram-ceiling (NFR, not a functional REQ).
Traceability
Which phase covers which requirement. See ROADMAP.md for phase details.
| Requirement | Phase | Status |
|---|---|---|
| REQ-video-ring-buffer | Phase 1 | In progress (reopened 2026-05-16: SPEC §10 #7 fails; Plan 01-08 WebM remux pending) |
| REQ-rrweb-dom-buffer | Phase 2 | Pending |
| REQ-user-event-log | Phase 2 | Pending |
| REQ-password-confidentiality | Phase 2 | Pending |
| REQ-popup-ui | Phase 3 | Pending |
| REQ-screenshot-on-export | Phase 3 | Pending |
| REQ-archive-layout | Phase 3 | Pending |
| REQ-meta-json-schema | Phase 3 | Pending |
| REQ-archive-export-latency | Phase 3 | Pending |
| REQ-manifest-permissions | Phase 3 (originally) → Phase 1 closure via Plan 01-12 i18n migration | Complete (2026-05-20 — manifest MSG*_ + default_locale='en' + 16 i18n keys per locale; permissions DEC-011 baseline unchanged; operator brand-fit ack) |
| REQ-install-clean | Phase 4 (originally) → Phase 1 closure via Plan 01-12 design integration | Complete (2026-05-20 — fresh build + load unpacked clean; zero remote-font CSP errors; branded icons rendering; en+ru manifest:name resolution; operator brand-fit ack) |
Coverage:
- v1 requirements: 11 total
- Mapped to phases: 11
- Unmapped: 0 ✓
Note on CON-ram-ceiling (SPEC §10 #9): tracked as a non-functional constraint verified in Phase 4 (smoke verification) rather than as a standalone functional REQ, per the intel synthesis. Phase 4 success criteria include the RAM-ceiling check.
Requirements defined: 2026-05-15 Last updated: 2026-05-20 — REQ-install-clean + REQ-manifest-permissions marked Complete on Plan 01-12 closure (design integration + manifest i18n + operator brand-fit ack) Earlier update: 2026-05-15 — REQ-video-ring-buffer marked Complete on Phase 1 (Plan 01-07) closure