# Functional Requirements (synthesized from SPEC §4–§7, acceptance §10) The SPEC `Тз расширение фаза1.md` does not formally label itself as a PRD set, but sections 4–7 describe user-visible / functional behavior and §10 lists acceptance criteria. Per the orchestrator's instruction, these are extracted here as requirements with IDs derived `REQ-{slug}`. Source key: - `SPEC §X` → `Тз расширение фаза1.md`, section X - `DOC` → `README.md` All requirements below are sourced from the SPEC; the DOC is a confirming source unless noted otherwise. --- ## REQ-video-ring-buffer - Source: `Тз расширение фаза1.md` §4.1 - Scope: Continuous video capture of the active tab - Description: The extension MUST maintain an in-memory ring buffer containing the most recent 30 seconds of video from the currently active browser tab. - Acceptance criteria (from SPEC §10): - Video buffer runs continuously on any tab. - The buffer never holds more than 30 seconds of footage. - The bundled `last_30sec.webm` from the exported archive plays back in a browser. - Technical bindings (see decisions.md): - DEC-003 — `chrome.tabCapture.capture()` for acquisition - DEC-003 — `video/webm; codecs=vp9` @ 400 000 bps, 2000 ms chunks - DEC-009 — header chunk retained indefinitely - Confirming source: `README.md` §"Использование" and §"Кольцевой буфер". --- ## REQ-rrweb-dom-buffer - Source: `Тз расширение фаза1.md` §4.2 - Scope: DOM event recording - Description: The extension MUST record DOM events via rrweb over a rolling 10-minute window from the active page, capped at 5 000 events. - Acceptance criteria (from SPEC §10): - rrweb records DOM events without errors on typical pages (forms, tables, modal windows). - Technical bindings: - DEC-004 — rrweb library - DEC-004 — `maskInputSelector` for `input[type=password]` and `[data-sensitive="true"]` - SPEC §8 — 5 000-event cap; oldest dropped on overflow - SPEC §4.2 — 10-minute TTL purge every 60 s - Confirming source: `README.md` §"Кольцевой буфер". --- ## REQ-user-event-log - Source: `Тз расширение фаза1.md` §4.3 - Scope: User and runtime event logging - Description: The extension MUST log user and runtime events over a rolling 10-minute window. - Captured event types (SPEC §4.3): - `click` — click on any element; records `target` selector and element text - `input` — field value change (passwords excluded) - `navigation` — `popstate`, `hashchange`, page transitions - `js_error` — `window.onerror`, `window.onunhandledrejection` - `network_error` — `fetch` / `XMLHttpRequest` with response code `>= 400` - Log entry schema (SPEC §4.3, verbatim): ```json { "timestamp": 1716800000000, "type": "click | input | navigation | error | network", "target": "CSS-селектор элемента", "value": "текст/значение (маскируется для паролей)", "url": "текущий URL", "meta": {} } ``` - Acceptance criteria (from SPEC §10): - Event log captures clicks, navigation, and network errors. - Passwords do not appear in either the event log or rrweb snapshots. - Confirming source: `README.md` §"Записываемые события". --- ## REQ-screenshot-on-export - Source: `Тз расширение фаза1.md` §4.4, §5 - Scope: One-shot visual capture - Description: At the moment the user clicks "Save archive", the extension MUST capture a PNG screenshot of the active tab via `chrome.tabs.captureVisibleTab` and include it as `screenshot.png` in the archive. - Technical binding: DEC-008. --- ## REQ-popup-ui - Source: `Тз расширение фаза1.md` §5 - Scope: User-facing trigger - Description: The extension MUST expose a minimal popup with a single button labeled "Сохранить отчёт об ошибке" and a sub-label "Последние 30 сек видео + 10 мин лога". - Button state machine (SPEC §5): - `idle` → `Сохраняю...` → `Готово! ✓` → `idle` (after 3 s) - On-click behavior (SPEC §5): 1. Capture screenshot of active tab. 2. Request video buffer + event log from Service Worker. 3. Request rrweb snapshots from Content Script. 4. Assemble archive (see REQ-archive-layout). 5. Trigger download via `chrome.downloads.download()`. 6. Display "Готово! ✓" status. - Confirming source: `README.md` §"Использование". --- ## REQ-archive-layout - Source: `Тз расширение фаза1.md` §6 - Scope: ZIP archive structure - Description: The archive MUST be named `session_report_YYYY-MM-DD_HH-MM-SS.zip` and contain exactly: ``` session_report_2025-05-15_14-32-10.zip ├── video/ │ └── last_30sec.webm # склеенные чанки видеобуфера ├── rrweb/ │ └── session.json # массив DOM-событий rrweb ├── logs/ │ └── events.json # лог действий пользователя ├── screenshot.png # скриншот в момент сохранения └── meta.json # метаданные сессии ``` - Acceptance criteria (from SPEC §10): - Archive opens cleanly. - `last_30sec.webm` plays back in a browser. - Confirming source: `README.md` §"Структура архива" (byte-identical layout). --- ## REQ-meta-json-schema - Source: `Тз расширение фаза1.md` §6 - Scope: Archive metadata - Description: `meta.json` inside the archive MUST conform to the schema: ```json { "timestamp": "2025-05-15T14:32:10Z", "url": "https://...", "userAgent": "Chrome/...", "extensionVersion": "1.0.0", "videoBufferSeconds": 30, "logDurationMinutes": 10, "totalEvents": 143 } ``` - Fields are required (SPEC does not mark any optional). --- ## REQ-manifest-permissions - Source: `Тз расширение фаза1.md` §7 - Scope: Browser permission surface - Description: The extension MUST declare exactly the permission set in DEC-011 and MUST request user gesture for `tabCapture` on first activation. - Acceptance criteria (from SPEC §10): - Extension installs in Chrome without errors. --- ## REQ-archive-export-latency - Source: `Тз расширение фаза1.md` §10 (acceptance) - Scope: Performance — archive delivery - Description: From the moment the user clicks the export button, the ZIP archive MUST land in the "Downloads" folder in under 5 seconds. - Confirming source: `README.md` §"Критерии приёмки Фазы 1". --- ## REQ-password-confidentiality - Source: `Тз расширение фаза1.md` §4.2, §4.3, §8, §10 - Scope: Sensitive data handling - Description: Passwords MUST NOT appear in either rrweb snapshots or the user event log. Masking MUST be enforced by: - rrweb `maskInputSelector` covering `input[type=password]` and `[data-sensitive="true"]` - the event logger explicitly filtering value capture for password fields - Acceptance criteria (from SPEC §10): - Passwords do not leak into either output stream. - Confirming source: `README.md` §"Маскирование чувствительных данных". --- ## REQ-install-clean - Source: `Тз расширение фаза1.md` §10 - Scope: Installability - Description: The extension MUST install in Chrome without errors via the unpacked-extension load flow. - Confirming source: `README.md` §"Установка расширения в Chrome". --- ## Phase 1 Acceptance Criteria (full list, SPEC §10 verbatim) For traceability, all SPEC §10 acceptance criteria are listed here once. Each is also referenced from one or more REQ-* entries above. 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. → see `constraints.md` CON-ram-ceiling (NFR, not a functional REQ).