diff --git a/.planning/intel/decisions.md b/.planning/intel/decisions.md index d06a83d..e61d3c3 100644 --- a/.planning/intel/decisions.md +++ b/.planning/intel/decisions.md @@ -58,6 +58,16 @@ Status legend (synthesized, since SPEC has no formal ADR status field): user gesture on first invocation; on tab switch the capture re-attaches. - Confirming source: `README.md` §"Технический стек". +## Amendment (Phase 01-stabilize-video-pipeline, 2026-05-15) + +- AMENDED-BY: Phase 01 CONTEXT.md D-01..D-05 +- Replace `chrome.tabCapture.capture()` with `navigator.mediaDevices.getDisplayMedia()` called from the offscreen document. +- Offscreen document is created with `chrome.offscreen.Reason.DISPLAY_MEDIA` (replaces `USER_MEDIA`). +- Codec/bitrate/timeslice binding unchanged: `video/webm; codecs=vp9` @ 400 000 bps, MediaRecorder timeslice 2000 ms. +- Trade-off accepted: SPEC §1 "silent operation" is given up — Chrome's permanent "Sharing your screen" indicator is shown while recording. Phase 1 accepts this in exchange for broader capture coverage and elimination of `tabCapture` user-gesture juggling. +- Tab-switch re-attachment clause is REMOVED — `getDisplayMedia` captures a screen/window, not a tab. There is nothing to re-attach. +- Manifest permission `tabCapture` is REPLACED with `desktopCapture` (the latter is harmless: `getDisplayMedia` is a web standard API and does NOT actually require `desktopCapture`, but we declare it for clarity per CONTEXT.md D-05). + --- ## DEC-004: DOM Capture via rrweb @@ -151,6 +161,14 @@ Status legend (synthesized, since SPEC has no formal ADR status field): - Decision: To prevent the 30 s idle unload of MV3 Service Workers, a `chrome.alarms` alarm fires every 20 seconds to keep the worker alive. +## Amendment (Phase 01-stabilize-video-pipeline, 2026-05-15) + +- AMENDED-BY: Phase 01 CONTEXT.md D-17..D-18 +- Replace `chrome.alarms`-driven 20 s keepalive with a long-lived `chrome.runtime.connect` port opened from the offscreen document to the Service Worker. The port emits a `PING` message every 25 s; both directions of traffic reset the SW's 30 s idle timer per Chrome 110+ semantics (developer.chrome.com/blog/longer-esw-lifetimes). +- The `alarms` permission is removed from `manifest.json` (it is no longer used by Phase 1; Phase 2 / 3 may re-add if needed). +- Port lifetime cap (~5 minutes per Chromium-extensions community gist sunnyguan/f94058f66fab89e59e75b1ac1bf1a06e) is mitigated by reconnecting on `onDisconnect` and pre-emptively at ~290 s. +- See `.planning/phases/01-stabilize-video-pipeline/01-RESEARCH.md` Pattern 5 for the canonical implementation. + --- ## DEC-011: Manifest Permissions Set