Files
mokosh/.planning/REQUIREMENTS.md
Mark 66e6f503a4 docs(01-12): state + roadmap + requirements — Plan 01-12 closure
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 (3fe018b plan-baseline-revision → 34a9ce1
  Wave 0 → f86fd60 + abab6e1 Wave 1 → 7732a30 Wave 2 → 110cebc Wave 3
  → 468f16d Wave 4 → e8d2881 Wave 5 → b909c37 Wave 6 + 865d394
  pre-checkpoint + f319c7d SUMMARY); 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>
2026-05-20 08:33:52 +02:00

12 KiB
Raw Blame History

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 (with chrome.offscreen.Reason.DISPLAY_MEDIA), NOT chrome.tabCapture as 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 is video/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 same MediaStream, 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.md for the byte-level root-cause evidence.

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 v2 maskInputFn covering input[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 / XMLHttpRequest with response code >= 400). Each entry conforms to the verbatim CON-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 as screenshot.png in 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.zip and contains exactly:

    session_report_2025-05-15_14-32-10.zip
    ├── video/
    │   └── last_30sec.webm
    ├── rrweb/
    │   └── session.json
    ├── logs/
    │   └── events.json
    ├── screenshot.png
    └── meta.json
    

    Binding: CON-archive-layout.

    • SPEC §10 acceptance criteria: #7.
  • REQ-meta-json-schema: meta.json inside 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.json declares exactly the permission set in DEC-011 (tabCapture, activeTab, downloads, scripting, storage; host_permissions: ["<all_urls>"]) and requests a user gesture for tabCapture on 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.ts shape + tests/i18n/locale-parity.test.ts en↔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 build produces 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 (0 googleapis / 0 https://fonts in dist/ verified by tests/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 maskInputFn AND 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".

  1. The extension installs in Chrome without errors. → REQ-install-clean, REQ-manifest-permissions
  2. The video buffer runs continuously on any tab. → REQ-video-ring-buffer
  3. The buffer always contains no more than 30 seconds of video. → REQ-video-ring-buffer
  4. rrweb records DOM events without errors on typical pages (forms, tables, modal windows). → REQ-rrweb-dom-buffer
  5. The event log captures clicks, navigation, and network errors. → REQ-user-event-log
  6. On button press, the archive is downloaded to "Downloads" in < 5 seconds. → REQ-archive-export-latency
  7. The archive opens; last_30sec.webm plays back in a browser. → REQ-archive-layout, REQ-video-ring-buffer
  8. Passwords do not appear in the log or rrweb snapshots. → REQ-password-confidentiality
  9. 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