Append RETIRED blocks to CON-tab-capture-binding and CON-service-worker-keepalive (the two SPEC-derived constraints that are no longer valid under getDisplayMedia + port-keepalive). Add new CON-display-capture-binding consolidating the replacement contract. Originals stay intact for provenance; RETIRED is appended below each.
7.6 KiB
7.6 KiB
Constraints (synthesized from SPEC)
All constraints below are sourced from Тз расширение фаза1.md (the SPEC,
precedence 0). The DOC (README.md, precedence 1) is a confirming source where
noted; where it diverges, the SPEC takes precedence per the
ADR > SPEC > PRD > DOC rule.
Type taxonomy:
nfr— non-functional requirement (performance, memory, latency, security)protocol— wire/file format or sequence contractschema— data structure contractapi-contract— external API binding (Chrome extension APIs)
CON-ram-ceiling
- Source:
Тз расширение фаза1.md§10 (acceptance criterion 9) - Type: nfr
- Constraint: The extension's RAM footprint MUST NOT exceed 50 MB while running in the background.
- Component-level expected breakdown (SPEC §4, informative, not binding):
- Video ring buffer: ~1.5–2 MB steady
- rrweb buffer: ~1–3 MB
- Event log: ~100–300 KB
- Total steady-state expected component sum: ~2.6–5.3 MB
- DOC confirming source:
README.md§"Критерии приёмки Фазы 1" — restates the 50 MB ceiling identically. - DOC informational target:
README.md§"Память" reports an expected steady-state of ~5–10 MB. This is a non-binding estimate, not a contradicting requirement; the binding ceiling remains 50 MB. SeeINGEST-CONFLICTS.mdfor the auto-resolved INFO entry.
CON-archive-export-latency
- Source:
Тз расширение фаза1.md§10 (acceptance criterion 6) - Type: nfr
- Constraint: From click to file landing in the Downloads folder MUST be < 5 seconds.
- DOC confirming source:
README.md§"Критерии приёмки Фазы 1".
CON-video-window
- Source:
Тз расширение фаза1.md§4.1 - Type: nfr / protocol
- Constraint: The video ring buffer MUST hold exactly the most recent 30 seconds of footage; older chunks are evicted after each new chunk arrives.
- Exception (DEC-009): the first chunk (WebM header) is exempt from eviction.
CON-rrweb-window
- Source:
Тз расширение фаза1.md§4.2, §8 - Type: nfr / protocol
- Constraint: rrweb events MUST be retained for at most 10 minutes AND at most 5 000 events, whichever is tighter. Eviction sweep runs every 60 s on the time dimension; the 5 000-event cap is enforced on insert (oldest first out).
CON-event-log-window
- Source:
Тз расширение фаза1.md§4.3 - Type: nfr / protocol
- Constraint: The user event log MUST be retained for at most 10 minutes.
CON-video-codec
- Source:
Тз расширение фаза1.md§4.1 - Type: protocol
- Constraint: Video chunks MUST be encoded as
video/webm; codecs=vp9at a target bitrate of400 000 bps(~3 MB/min raw). Chunk cadence (MediaRecorder timeslice) is2000 ms.
CON-webm-header-retention
- Source:
Тз расширение фаза1.md§4.1, §8 - Type: protocol
- Constraint: The first MediaRecorder chunk (WebM container header) MUST be
retained in the buffer indefinitely; the assembled
last_30sec.webmMUST remain playable in a browser.
CON-tab-capture-binding
- Source:
Тз расширение фаза1.md§8 - Type: api-contract
- Constraint:
chrome.tabCaptureoperates only on the active tab. On tab activation change, the recorder MUST re-attach to the new active tab. First invocation requires a user gesture.
RETIRED (Phase 01-stabilize-video-pipeline, 2026-05-15)
- RETIRED-BY: Phase 01 CONTEXT.md D-01 / D-A2
- Reason: This phase replaces
chrome.tabCapturewithnavigator.mediaDevices.getDisplayMedia(). The new API is not active-tab-bound; the recorder captures a screen / window selected once via Chrome's native picker and continues across tab switches. - Replacement: CON-display-capture-binding (below).
CON-service-worker-keepalive
- Source:
Тз расширение фаза1.md§8 - Type: api-contract
- Constraint: MV3 Service Workers unload after ~30 s of inactivity. The
extension MUST keep the worker alive via a
chrome.alarmsalarm firing every 20 seconds.
RETIRED (Phase 01-stabilize-video-pipeline, 2026-05-15)
- RETIRED-BY: Phase 01 CONTEXT.md D-17 / D-A2
- Reason: This phase replaces alarms-driven keepalive with a long-lived
chrome.runtime.connectport between offscreen and Service Worker. Port-message traffic resets the SW idle timer per Chrome 110+ semantics. - Replacement: CON-display-capture-binding (binds the port-keepalive expectations alongside the new capture API).
CON-manifest-permissions
- Source:
Тз расширение фаза1.md§7 - Type: api-contract / schema
- Constraint:
manifest.jsonMUST declare exactly:{ "permissions": [ "tabCapture", "activeTab", "downloads", "scripting", "storage" ], "host_permissions": [ "<all_urls>" ] }
CON-sensitive-data-masking
- Source:
Тз расширение фаза1.md§4.2, §8 - Type: nfr (security / privacy)
- Constraint: Sensitive input fields MUST be masked in both rrweb snapshots and
the event log. Specifically:
input[type=password]— value NEVER recorded; element MUST be masked in rrweb viamaskInputSelector.- Any element with
data-sensitive="true"— masked in rrweb viamaskInputSelector. - The event logger MUST filter
inputevents to drop password field values.
CON-archive-layout
- Source:
Тз расширение фаза1.md§6 - Type: schema (file layout)
- Constraint: The exported ZIP MUST follow the layout in REQ-archive-layout
(verbatim, four top-level entries:
video/,rrweb/,logs/,screenshot.png,meta.json). Filename pattern:session_report_YYYY-MM-DD_HH-MM-SS.zip.
CON-meta-json-schema
- Source:
Тз расширение фаза1.md§6 - Type: schema
- Constraint:
meta.jsonMUST conform to the verbatim schema in REQ-meta-json-schema. All listed fields are required.
CON-event-log-schema
- Source:
Тз расширение фаза1.md§4.3 - Type: schema
- Constraint: Each entry in
events.jsonMUST conform to:{ "timestamp": <epoch_ms>, "type": "click | input | navigation | error | network", "target": "<css_selector>", "value": "<value_or_masked>", "url": "<page_url>", "meta": {} }
CON-buffer-storage
- Source:
Тз расширение фаза1.md§2 - Type: nfr
- Constraint: All Phase 1 buffers MUST live in memory only (Service Worker for
video, Content Script for rrweb + event log).
chrome.storageis permitted but MUST NOT be used to persist the rolling buffers.
CON-display-capture-binding
- Source: Phase 01 CONTEXT.md D-01..D-17, RESEARCH.md Patterns 1 & 5
- Type: api-contract
- Constraint: Video capture uses
navigator.mediaDevices.getDisplayMedia()invoked once per session from the offscreen document withchrome.offscreen.Reason.DISPLAY_MEDIA. The Service Worker is kept alive by a long-livedchrome.runtime.connect({ name: 'video-keepalive' })port opened by the offscreen, with traffic in both directions at a minimum cadence of 25 s and pre-emptive reconnect at 290 s. - Replaces: CON-tab-capture-binding (RETIRED), CON-service-worker-keepalive (RETIRED).
- UX trade-off: Chrome's permanent "Sharing your screen" indicator is shown while recording. SPEC §1 silent-operation property is intentionally relaxed.
CON-no-server-upload
- Source:
Тз расширение фаза1.md§9 - Type: nfr (scope boundary)
- Constraint: Phase 1 MUST NOT transmit any captured data to a remote server.
All export is local-only via
chrome.downloads.