From 3d9d3326b2d36f9c7e3d211423de28cdd0f0b1d4 Mon Sep 17 00:00:00 2001 From: Etienne Lescot Date: Sat, 3 Oct 2026 11:18:22 +0200 Subject: [PATCH 1/2] docs(testing): log the v2.0.0-rc.13 macOS computer-use e2e pass --- technical-documentation/testing/manual-e2e-checklist.md | 1 + 1 file changed, 1 insertion(+) diff --git a/technical-documentation/testing/manual-e2e-checklist.md b/technical-documentation/testing/manual-e2e-checklist.md index 5cae7e374..16cf594a5 100644 --- a/technical-documentation/testing/manual-e2e-checklist.md +++ b/technical-documentation/testing/manual-e2e-checklist.md @@ -846,3 +846,4 @@ On macOS 15.2+ it opens at launch, until it has been closed once, while one of i | 2026-10-01 | installed `v2.0.0-rc.8` (build run 36883700385, tag `33a16fe1`, helper from build-whisper-stt run 36830983393; NSIS sha512 matched `latest.yml`), installed over rc.5 for all users, About reports `2.0.0-rc.8` (`win32 x64 · nsis`, Electron 41.2.1) | Windows 11 Home 26200, 1920×1080 @ 125 %, Logitech StreamCam (sub-4K, MF) | **Partial — 2 defects** | **Webcam:** torn and mis-exposed frames in the webcam file (some frames split horizontally into two pictures, others blue-dark or washed out). The maintainer attributes them to the camera itself, not OpenScreen; the same frames are in the rc.1 take of 2026-09-30. **Defect 1 (#960): captions in the preview are stale after switching projects.** Two clips of one asset, captions Bold top-left: after opening another project and reopening this one, clip 1 shows no caption or the wrong line (`0:06` showed "we are recording the screen…", `0:12` and `1:05` nothing) until *Show captions* is toggled; saved data is intact. **Defect 2 (#961): after a working session, closing the editor leaves OpenScreen running with no window** (6 processes, tray only), seen twice: once after takes (HUD, Record mode, restart, cancel), once after only the project dialog, *Edit clip* and a chat turn. An instance that only opened the editor and closed it quit as `window-all-closed` intends, so some hidden window outlives those surfaces. **Loudness in spec:** MP4 export at the Audio facet's default output level (never changed in this project), −15.8 LUFS integrated, −1.4 dBFS sample and −1.4 dBTP true peak; the check asked for a sample peak under −1.5 dBFS, which the AAC overshoot past the −1.5 dBFS limiter cannot meet, so its wording is corrected in this change. **Passed:** HUD layout toggle both ways, tooltips idle and recording (with continuous real moves; a teleported cursor shows the previous control's tooltip, a driver artefact), language menu, *Device settings* (devices, live preview, *Camera quality* 1080p/1440p/4K, 4K default, 1080p persisted across quit/relaunch as `camQuality`, hand-edited `720p` reads back as 4K, device switch persisted), *Hide recording bar* → tray click brings the HUD back, *Quit OpenScreen* (0 processes), second launch exits 0 with one HUD. Source selector (Screens/Windows, Cancel), record with no source opens it and starts after the pick, countdown, pause (span absent from the file) / resume, restart (new helper process, timer reset), cancel (no editor, no file), gear locked during a take. Stop → editor, 53.0 s take with 3 automatic zooms at the clicks, desktop icons hidden in the second take for its whole length. Files: screen and webcam `profile=High`, `has_b_frames=0`, `tv/bt709×3`, AAC 48 kHz, `encoder-selection` hardware. Auto-transcription after the take; *Regenerate as* English. Transcript: clip order, silence spans with durations, monotonic word seeks (4.0 → 11.2 → 16.4 → 21.3 → 21.8 → 27.2 → 56.9 s), live word highlight, Backspace marks skipped + restore, silence-span trim and restore, **#959 checked: sentence-final "time." cut 11.91–12.51 against a speech offset of 12.44 (silencedetect −40 dB) and next speech at 16.46**; typing between words does nothing (packaged gate). Transport, Left/Right 1/60 s, stop at end, navigator narrow/pan. Regions by T/S/A/C, trim edges, *Bring this part back*, undo/redo; zoom levels, custom 1.25 kept, 9 → "Zoom goes from 1× to 2.86×", 3D Orbit/left/right; speed presets, custom 3×, 20 → "Speed can't go higher than 16×"; annotation text/size/plate; Full Camera. Clip reorder carries every modifier; Edit clip grip (0:10.7–0:53.0) and 1:1 crop, Cancel leaves it. Export dialog v2 layout and sizes (1224×720 / 1838×1080 / 1910×1122); MP4 1838×1080 30 fps, video 92.033 s vs audio 92.066 s (1 frame), 2762 frames vs 2760.7 computed (105.941 − 10.312 trim − 5.41 × 2/3 for 3×), frames match the preview at 16.5/28/40 s; GIF cancel (no partial file) then full GIF 816×480, 1383 frames at 15 fps, loop, ffmpeg and GDI+ agree. Imported audio: −18 dB, 1 s fades, ramps at the track's own edges in the export (3.0→4.0 s, 22.0→23.0 s). Captions toggle, Bold, top/left anchors and *Distance from left*, captions unscaled under a zoom. Camera layout presets with Auto reshaping, shape, mirror, Cutout. Cursor facet style and *Show cursor*. Wordmark menu, About (version, Copy to clipboard), light/dark theme, French and back, shortcut rebind (Q adds a zoom) and reset, Ctrl+S toast, Ctrl+O, an older project opens without prompt, reopen keeps regions/settings/audio track. Editor bounds and maximized state restored. Chat (deepseek-v4-flash): "Add a 2x zoom from 0:07 to 0:09" applied as 2.20× with a reason, one undo/redo unit. **Not run:** HUD drag (the HUD window now ends ~45 px above the bar, any longer move lands on the click-tier desktop; short in-window moves did not move it, inconclusive); `Esc` (Claude Desktop swallows it); Ctrl/Shift+wheel (the scroll tool holds no modifier); tray right-click menu (Stop Recording, Save Diagnostics, Update Settings, About from tray) and the Alt-held Help menu; level meter and mic-only/system-only takes, music ducking (nobody spoke); "No camera found"; 4K-camera, no-30-fps, DirectShow, covered-lens and sharpness checks (no such camera / setup); window source and 24H2 context menu; DPI and multi-display (single display, scaling not changed); voice-over recording; region copy/paste and merge/repel, clip duplicate/delete; translation; most AI-settings and chat-history checks; camera background export of Cutout/Custom; caption plate measurement; legacy-project migration checks beyond opening one; macOS and Linux. Also seen: an English text read by the French SAPI voice auto-transcribed as French (detection, not app). | | 2026-10-03 | `v2.0.0-rc.13` CI artifact (build run 37072118778, tag `018d22ab`, same `crates/` `electron/` `src/` `scripts/` as `main` at `0624c148`) against `v2.0.0-rc.12` and `v1.11.0-rc.1`, each run from its installer's extracted app tree; editor checks on a dev build of `main` with rc.13's whole `bin/win32-x64` | Windows 11 Home 26200, Ryzen 5 7520U, AMD Radeon iGPU (D3D11, `h264_amf`) | Partial — no defect | **Export-path slice for #982/#983/#984.** `cargo test -p openscreen-compositor --lib --tests` on the real GPU: 456 passed, including the D3D11 render tests for the device frame, cursor model, click impact and cursor tap. Benchmark A/B in one session: rc.12 4.78× its floor, rc.13 1.71×, 1.11.0-rc.1 1.72× (numbers in `rendering-performance.md`, "The same fix on Windows"). rc.13's scoring exports are byte-identical to rc.12's. Twelve-second variants exported by both builds: the 3D cursor with click impact, the laptop frame **with its shadow**, the window frame, and a colour with Aurora are byte-identical; the two blurred-background variants differ invisibly (PSNR ≥ 67 dB). Frames extracted with ffmpeg show the device frame, 3D cursor, window chrome and rounded corners. Preview while the background is cached: image/colour/gradient switches, blur 100→0→50 and a window resize are all followed, Aurora keeps moving, None stays still, and playback frames show no leftover trail rectangle. **Not run:** real capture and HUD (computer-use screenshots came back uniformly grey, so the editor was driven over CDP, with injected input rather than OS input), Radeon GPU Analyzer register counts, Intel iGPU. | | 2026-10-03 | installed `v2.0.0-rc.13` (NSIS from the release, sha512 matched `latest.yml`), installed over rc.12 for all users, About reports `2.0.0-rc.13` | Windows 11 Home 26200, 1920×1080 @ 125 %, AMD Radeon iGPU, built-in USB2.0 HD UVC WebCam | Partial — 1 defect | **Scoped to the app changes between rc.8, the last computer-use pass, and rc.13**; the export path itself is covered by the rc.13 row above. Real OS mouse and keyboard input throughout; computer-use screenshots came back uniformly grey again, so the app was observed through `PrintWindow` on its own windows and DOM reads over CDP. **Defect: the webcam shows its first frame when a clip is entered past the webcam's last frame from another clip.** Two clips of one take (screen video 50.98 s, webcam 51.24 s, audio and clip 51.31 s): scrubbing from clip 2 to 51.2 s in clip 1 shows the screen's last frame, as 227b9b84 intends, but the webcam's frame 0 (2 of 2; ground truth from ffmpeg: an empty chair from 18.7 s to the end). Scrubbing to the same point from inside clip 1, or to 51.0 s from clip 2, shows the right webcam frame. Cause: `open_and_seek_clip` and `seek_pair` in `crates/compositor/src/live.rs` seek the webcam with `seek_to` and fall back to `seek_to(0.0)`, where `present_frame` uses `seek_to_or_last`; unchanged on `main`. Paused scrub only, in a ~70 ms window at the end of each clip. **Passed:** #961: one take with the countdown overlay, Record mode, editor work and an export, then closing the editor left 0 processes. #966: after rebinding *Add zoom* to Q and *Add audio* to J, the empty-lane hints read "Appuyez sur Q pour ajouter un zoom" and "Appuyez sur J pour ajouter un audio, V pour enregistrer une voix off", and Q adds a zoom. Wordmark menu in French: every row 31 px (one line), menu 261 px wide, "2.0.0-rc.13" in one piece. Preview: playback from 0:12 to 0:45.8 across a trim (0:15.0 → 0:18.5) and a 1.5× region with no canvas stall over 150 ms, 32–50 picture changes a second, wall time matching the edit; stops at 0:51.3 on the screen's and the webcam's last frames. #960 (#964): A → B → A with the playhead at 0:06, the preview is pixel-identical to before (mean difference 0, against 77.9 for project B). Background image → gradient → colour followed in the preview. #968: a media file whose read the OS refused (`icacls` deny on the test file) — *Regenerate* shows the translated "Impossible de lire l'audio de ce média…" hint inline and in the "Échec de la transcription" toast, without the IPC wrapper; the main process logs `MediaUnreadableError … Permission denied`. MP4 export from the GUI, 1752×1080 30 fps: 2930 frames, video 97.633 s against audio 97.666 s, zoom, background, webcam and cursor present in extracted frames, −18.3 LUFS. **Also seen:** the green "Aucune parole détectée" chip from the earlier successful run stays next to the unreadable hint; each clip of the take still carries 0.32 s of audio past its video (what is left of #942), and the export ends each clip at its video (97.63 s, against 98.22 s from the clip lengths the timeline shows). **Not run:** the HUD with no camera (#967; a camera is attached), the macOS HUD fix (c2a8559e), tray, microphone and system-audio content, GIF, macOS and Linux. | +| 2026-10-03 | installed `v2.0.0-rc.13`, CI-built DMG `Openscreen-macOS-Apple-Silicon-2.0.0-rc.13.dmg` from the GitHub Release (tag `018d22ab`), installed over rc.12, `spctl`: accepted, Notarized Developer ID (M4LK7C6S84), About reports `2.0.0-rc.13` | macOS 26.5 (25F71), Mac mini M1, 3840×2160, no camera, no microphone | Partial, no defect | **Scoped to the app changes between rc.8 and rc.13, on macOS**: the Windows row above covers the same diff on Windows and leaves out #967, c2a8559e and macOS, which this row takes. Real OS mouse and keyboard input through computer-use (screenshots worked on this Mac); Apple's picker is owned by Control Centre and cannot be granted, so the operator clicked *Share Entire Screen* for each take. **c2a8559e (HUD kept out of takes after the editor round trip):** take 1 picked from the HUD's record button (`excludedWindowIds: [582]`), stop, editor, Record mode showed the source as *Choose what to record*, *Start recording* reopened Apple's picker instead of reusing the pick, take 2 recorded with `excludedWindowIds: [639]`; frames extracted from both files (28:26 and 13:04) show no HUD where it sat. **#967 (no camera on this Mac):** with `camEnabled: true` and no camera identity in `recording-settings.json`, launch rewrote it to `false` and the HUD showed the camera off; same with a stale identity (`camDeviceId` + `camDeviceName` of an unplugged camera); clicking the toggle keeps it off with the "Camera access is blocked" toast; Record mode reads *Camera Off*. **#961:** closing the editor after take 2 (countdown overlay, Record mode handover) left 0 processes; so did closing it after a long editor session (eight project opens through the native panel, transcriptions, Media mode, an export, the export dialog's save panel cancelled). **#966:** with *Add zoom* bound to X in `shortcuts.json`, the empty zoom lane reads "Press X to add zoom", and "Appuyez sur X pour ajouter un zoom" / "Drücke X, …" in French and German. **Wordmark menu (3bee2d25):** French and German, every row on one line, "2.0.0-rc.13" in one piece. **#960 (b834416c):** project A with captions → project B → A again: captions show at once at 0:06.4, 0:10.2 and 1:05.2 without touching *Show captions* (0:05.3 shows none, a 4.77 to 5.57 s silence in the saved words). **Preview:** playback from 0:12 to the end across four transcript silence cuts, a 2× and a 16× region: picture and captions follow, the readout advances with the edit, stops at 1:06.2; no stall seen, 8 `[pipeline] décodage` opens for one seek and four cuts (consistent with a preload per cut; not compared with rc.12). **227b9b84 / 83fbcecc:** a two-clip project whose first clip is a file with 8 s of video and 10 s of audio (no camera): seeking from clip 2 to 0:09.5 shows clip 1's last frame, the same as 0:07.7, no stderr. A video-only file plays with its picture (e73097c8). **#968:** project whose first asset is `chmod 000`: `MediaUnreadableError … Permission denied` in the main log, clip 2 still transcribed, the asset card shows "Transcription failed" and "Couldn't read this media's audio. Make sure OpenScreen can access the folder it's in, then regenerate." without the IPC wrapper; after `chmod 644`, *Regenerate* runs again (not persisted as no-audio). **Metal compositor (8caaa20d, dd5e914b, 0624c148, 2fb994eb):** laptop frame, 3D cursor, click impact, image background blurred 53 %, Aurora, captions; MP4 1080p60 export of 3374 frames, video and audio 56.23 s against 56.21 s computed (66.154 s minus 5.09 s of cuts minus the 2× and 16× gains), full decode clean; extracted frames show the laptop with its shadow, the blurred background, the 3D cursor with its shadow, rounded screen corners and captions. During playback the preview followed image → image, blur 52 → 1 %, image → colour and back. **Also seen:** the playhead keeps its time when another project is opened (0:41.0 from A shown in B and C). With a hand-written `camDeviceName` and a null `camDeviceId`, the HUD keeps the camera on and the file at `true` (`useCameraHudSync` compares the empty selection with the empty id and returns early); the app always writes both together, so this state is artificial. Out of scope: a 10 s extract with speech under loud video sound transcribes as no speech in Auto (detected `en`, p 0.35) and as "*Musique*" in French. **Not run:** webcam and microphone (none on this Mac), so the Windows row's webcam-past-the-end defect cannot be checked here; click impact not confirmed (the fixture's cursor sidecar has no clicks, and none was identified around the nine clicks of take 2 at preview scale); Aurora motion on a plain colour; `Esc`; tray; GIF; A/B against rc.12; Gatekeeper (the DMG came through `gh`, no quarantine flag); Intel. | From b0ba3b2a1f256b976d91e6dff865ff0e43e6192e Mon Sep 17 00:00:00 2001 From: Etienne Lescot Date: Sat, 3 Oct 2026 11:34:26 +0200 Subject: [PATCH 2/2] docs(testing): restore the macOS RC passes that never reached the results log Adds the rows for v1.10.0-rc.3 (lost in a merge of #486), v1.11.0-rc.1 and its retest (written on a branch never opened as a PR), v2.0.0-rc.8 and v2.0.0-rc.12, and notes that the rc.13 row did not re-measure the 4x preview lag rc.12 found. --- technical-documentation/testing/manual-e2e-checklist.md | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/technical-documentation/testing/manual-e2e-checklist.md b/technical-documentation/testing/manual-e2e-checklist.md index 16cf594a5..27cfc1562 100644 --- a/technical-documentation/testing/manual-e2e-checklist.md +++ b/technical-documentation/testing/manual-e2e-checklist.md @@ -817,6 +817,7 @@ On macOS 15.2+ it opens at launch, until it has been closed once, while one of i | 2026-09-02 | worktree `fix/wgc-aac-sample-rate` (rebuilt `wgc-capture.exe`) | Windows 11 | Partial — helper-level only | Not a capture-to-export HUD pass. Media Foundation `SetInputMediaType` for 96 kHz PCM into AAC returns `0xc00d36b4`; 48 kHz succeeds. Live helper with snap on: forced 96 kHz encoder source reports 48 kHz and `recording-started`. Live helper with snap off: initialize fails at `SetInputMediaType(audio)` with `0xc00d36b4` (hardware, software, and plain MP4 retries). HUD, editor, export, webcam, and tray not run. | | 2026-08-14 | installed `v1.9.5-rc.1`, macOS Apple Silicon DMG (CI-built, Developer ID signed). **rc.2 is not published** — only rc.1 exists on Releases; no native source changed between `v1.9.5-rc.1` and `origin/release/v1.9.5`, so this artifact already carries the rc.2 native payload, but #366 (cross-platform TS) is absent from it | macOS 26.5 (25F71), M1, 1920×1080 @ 2× | **Fail — 1 blocker** | **The plan's assertion-1 criterion does not hold on macOS, in both directions.** On a clean stop `AVAssetWriter.finishWriting()` collapses the fragments into a normal movie: `ftyp mdat moov`, `mvex` ABSENT, 0 `moof`, no `mfra` (45 s / 44.4 MB run). That is exactly the shape the plan calls the headline failure — and the pre-`a6795d23` control recording (2026-08-10) has the *same* shape — so **a clean-stop box walk cannot distinguish fragmented from plain on macOS; only the kill test can.** Fragmenting *is* active: the takes whose writer died mid-fragment retain `mvex` + ~1 `moof` per second of media (shipped-build writer-failure samples: 35 `moof`/36.0 s, 14/15.0 s, 3/4.0 s; plus 18 on a surviving-helper kill). The one kill on the shipped build is the exception that proves the scope — capture had already stalled ~12 s before the kill, so it carries `mvex` but **0 `moof`** and only 1.0 s. No macOS file, clean or killed, ever carried `mfra`. **Blocker: every app-driven recording truncates, then the app discards it.** (Root cause and fix reported in #375 — the fragments carry a negative composition offset in a version 0 `trun`, where ISO/IEC 14496-12 8.8.8.2 defines the field as unsigned, because frame reordering was left on; `AVVideoAllowFrameReorderingKey: false` clears it and restores the crash-resilience the fragmenting was for. Verified at helper level there; **this rc.1 run only reproduced the failure and validated nothing about the fix**. Re-run this section against a CI build carrying #375 before rc.2 ships.) 3/3 takes stopped writing early while the HUD kept counting — media 4.0 s / 36.0 s / 15.0 s against HUD `02:02` / `01:30` / `01:04`. Helper emits `{"event":"error","code":"writer-failed"}`; main log `AVFoundationErrorDomain Code=-11800 … (-16341)`. Stop then hangs ~30 s on "Saving…" and drops the take: no `.session.json`, no `.cursor.json`, no editor. The app *does* surface the raw error in a toast (confirmed by hand on the same machine at 13:28–13:35 — my automated runs screenshotted after it auto-dismissed, so an earlier draft of this row wrongly said there was none). 44,561,966 / 328,337,979 / 139,631,607 / 17,187,009 bytes decodable and thrown away (147 GB free — not disk). Reproduced standalone with the shipped helper at 1080p30/8 Mbps, 2/2 (~9 s, ~5 s), so it is not confined to the app's 4K60 path — but do not read that as load-independent: append rate demonstrably modulates how reliably it bites (#375 measures it reliable at ~57 fps and intermittent at 30 fps). **Reproduced by hand, no automation involved**, on six takes recording a YouTube page — and those six separate the trigger cleanly: **system audio ON → 3/3 died at ~1.0 s and minted 0 projects; system audio OFF → 3/3 survived (3.3 s, 7.4 s, 25.0 s) and minted 1 project each.** **Audio is not the condition, only an accelerant** — a controlled run with system audio off *and not one screenshot taken during the capture* (the screenshot layer hides non-allowlisted windows, so it was the last confound worth eliminating) died the same way: 8.008 s of video, 79,004,330 bytes then flat for 76 s with the helper still alive, 7 `moof`, 0 sidecars, 0 projects, same `-11800`/`-16341`. What audio changes is the window: with a track it is ~1 s, without one ~4–40 s. That reconciles the by-hand takes with mine — a take short enough to stop before the writer dies is clean, which is why 3.3 s and 7.4 s survived and 8.0 s did not, and why the 25.0 s one minted a project while still carrying `mvex` (never cleanly finalised). **Turning audio off is therefore not a safe workaround.** Untested here: microphone — this Mac has no input device, and whether a mic track triggers the same path is an inference, not a measurement. **Helper A/B narrows the with-audio path to the fragmentation line**: helper built twice from source identical to the rc.1 tag, differing only by `writer.movieFragmentInterval` (701 vs 700 lines) — with system audio at 1080p30, WITH the line `writer-failed` 2/2 (2.0 s, 1.0 s), WITHOUT it clean `recording-stopped` 3/3 (40.6 s, 37.9 s, 37.6 s). **Read those counts as a sample, not a law**: a later rebuild of the with-the-line arm survived 22.2 s at the same settings, so the failure is probabilistic and rate-dependent, and the byte-level evidence in #375 is what actually carries the case. The video-only local-vs-shipped gap (local survived 45 s, shipped failed 5/5) is explained by the same variable rather than by the released artifact — the shipped runs encoded at 56.6 fps against 29 fps locally. **Kill test** is confounded on the shipped build (capture already dead before the kill): 17.19 MB → only 1.0 s / 56 packets, 0 `moof`. On a helper that does not fail, a mid-write kill leaves 18 `moof`, decodes clean (`ffmpeg -v error -f null -` exit 0, 1373 packets) and no `mfra` — the shape the plan expects. **#363 gap confirmed, and on macOS it fires with no kill at all**: `writer-failed` alone loses the take; there is no app-side recovery. **Audio**: AAC 48 kHz stereo muxes into the fragmented container, video start `0.000000` vs audio `0.014479` → 14.5 ms drift, under one frame at 30 fps (measured on the 2.0 s written before the writer died). **Compositor + export pass**: preview renders with no camera declared; export MP4 1080p60 H.264+AAC via `h264_videotoolbox (zero-copy VT)`, 5,726,865 bytes, 318 packets, decodes clean, duration matches to within 7 ms — source 26.713 s minus trims 19.910 + 1.513 = 5.290 s expected vs 5.283 s measured, under one frame at 60 fps. **#366 not runnable as specified** (absent from rc.1, rc.2 unpublished, and record→editor never completes); adjacent behaviour measured on an existing project — close+reopen kept 19→19 projects, exactly ONE project references the recording, and Blur BG / padding survived (`showBlur=true`, `padding=16`). NOT covered: Windows-only DPI and wgc-capture, GIF, AI sections, packaging (per plan); webcam PiP and microphone — this Mac has neither (Device settings reports "No microphone found" / "No camera found"). | | 2026-08-22 | installed `v1.10.0-rc.3` — CI-built NSIS artifact from build run 32582966489 (`openscreen-windows`), App menu → About reports `1.10.0-rc.3`, native payload complete and uniformly stamped (19 files in `resources/electron/native/bin/win32-x64`, all `17:59:10`, so helper + compositor addon + av\* DLLs are one matched CI set) | Windows 11 26200, 1920×1080 @ 100% | **Pass — 2 minor defects** | **Pause works, and the measurement that says so is the wall clock.** `createdAt` 20:25:52.208 against a file finalised at 20:30:56.754 is 304.55 s elapsed for a **286.333 s** file — **18.21 s shorter, exactly the paused interval**, so capture was genuinely suspended. The HUD timer froze at `03:58` across two reads 7 s apart with the indicator amber, and resume was clean (`04:01` → `04:08` over 7 s, no time lost). An earlier draft of this row called this a blocking defect, on the strength of comparing the file duration against a timer read *before* the stop click; with tool round-trips of ~20 s that comparison is worthless, and the packet count offered as corroboration proves nothing either — a file is continuous 60 fps whether or not capture was ever suspended. Written down because the wrong version of this measurement is easy to repeat: compare against wall-clock elapsed, never against the last timer you happened to screenshot. **Capture is otherwise sound, on two takes.** 15.8 s: fragmented (`ftyp uuid pdin moov` then 16 `moof`/`mdat`, `mvex` present), `mfra` on the clean stop, 1920×1080 @ 60/1, 948 packets = 15.8 × 60, `ffmpeg -v error -f null -` exit 0, both sidecars written. 286.3 s: 287 `moof`, `mfra` present, 17,180 packets, decodes clean, `.cursor.json` 1.3 MB. No pacing drift and no dropped frames over 4 min 46. **Export passes and honours its settings**: 720p/30 requested from a 1080p60 source gave 1280×720, `avg_frame_rate` 85900/2863 = 30.004, 8590 packets matching the frame count the progress UI itself reported, duration 286.333 s identical to source, decodes clean, 124.5 MB, written to the path chosen in the native save dialog and reported back as "Saved to …". Composition verified by extracting a frame and reading it at full resolution (not from a preview screenshot): gradient background, content inset as a rounded card with a drop shadow, content aspect ≈1.76 against the 16:9 target, synthetic cursor drawn. Note the exporter adds a silent **AAC 48 kHz stereo** track even though no audio source was enabled. **Retracted: "the HUD language menu ignores `Escape`".** It does not — the maintainer confirms the key works by hand. **Claude Desktop swallows `Escape` before it reaches the app under test**, so a synthesised press proves nothing about the app, and `GetForegroundWindow()` returning the HUD does not rescue the inference: the key never left the driver. The companion observation (an outside click on the HUD's own drag handle did not dismiss the menu) is withdrawn with it, since the HUD's own chrome is not "outside" the popover in any meaningful sense. What *is* established is that the blur path shipped in this RC works: `54e12706 fix(hud): dismiss the HUD popovers when the window loses focus` dismissed the menu on a click to the desktop. **Rule for anyone driving keyboard checks from computer-use: `Escape` is unusable as evidence, and any negative keyboard result needs a by-hand confirmation before it goes in this table.** **Behaviour vs doc**: the record button is not disabled without a source — it opens the source selector. No recording starts, so the check's intent holds, but AGENTS.md still describes a disabled button with a "Please select a source to record" tooltip, and that is why no tooltip appears. **Passed**: single launch window, no startup crash; HUD visible under `OPENSCREEN_DISABLE_CONTENT_PROTECTION=1`; tray layout toggles horizontal↔vertical both ways; HUD drag follows the pointer without drift and stays at the drop point; language menu opens with its locale list; minimize hides the HUD without quitting (6 processes still alive); relaunching routes through the single-instance lock, restores the window and mints no duplicate; source selector opens, selecting a card enables Share, and the HUD label becomes the picked source (`Tout l'écran`); record → stop opens the editor with the asset, a timeline clip and a rendered preview; About reports the RC version. **Local transcription works, on GPU** — an earlier draft of this row reported it broken, which was wrong. Relaunching with stdout/stderr captured and importing a 15 s asset that carries an audio track settles it: `[whisper-stt] boot: model=…\whisper-ggml\ggml-small-q8_0.bin host=127.0.0.1 port=64720 threads=16`, `ggml_vulkan: 0 = NVIDIA GeForce RTX 4070 Ti`, `model loaded; backend=whispercpp-vulkan`, then `[stt] done on whispercpp-vulkan: 1 chunk(s), 15.0s audio in 0.1s (0.01 rtf, 106.8x real-time)`. The pane switched to "1 caption lines, derived live from the transcript". **The real (minor) defect is the error message**: on an asset with *no audio track* the captions pane says **"Failed to fetch"**, which reads as a network failure and sent this run hunting a broken STT server that was never involved — the pipeline simply has no audio to extract. It should say so. **Second minor find, from the same stderr**: `listProjects` cannot read three saved projects — one `ZodError` (`transcript.segments[0].endSec must be greater than or equal to startSec`, repeated across `segments`, `words` and `transcripts[0]`) and two `SyntaxError: Unexpected non-whitespace character after JSON`, i.e. truncated or double-written project files. They are skipped silently in the UI. **Caption anchoring — the rc.2→rc.3 delta — is present but its rendering was not measured.** The Position section carries exactly the model those commits describe: `Bottom`/`Top`, the note "Long captions grow upward — the bottom edge stays put", `Distance from bottom` defaulting to **1.5 %**, and Left/Center/Right. What could not be checked is where a caption actually lands, because the only transcript obtainable here came from a 300 Hz sine and yielded one line that never surfaced at any scrubbed position. **Closed out of band: the maintainer ran the caption sections by hand on a real spoken-audio recording and reports them correct**, which is the coverage this automated run could not supply and the last gap standing between this RC and a promote. Also confirmed from stderr: `[content-protection] OFF for the HUD window (OPENSCREEN_DISABLE_CONTENT_PROTECTION=1)`, so the flag does log its effect, and with the flag unset the HUD is correctly invisible to screenshots. **The consequence matters more than the cause: the eight caption anchoring/margin/inset cherry-picks that are the entire delta from rc.2 to rc.3 are NOT covered by this run.** **Not run**: restart and cancel actions; audio capture of any kind; webcam PiP; GIF; DPI scaling; HUD/notes exclusion from captured video with content protection ON (the whole session ran with it off, and the exported frame confirms the HUD *is* captured when it is off); regions, modifiers, timeline navigation, clip operations, persistence; macOS and Linux. **Environment limits that shaped this run, worth knowing before the next one.** `parsecd.exe` runs **elevated** and holds an invisible always-foreground window (`ParsecMinFrameRate16`); the moment OpenScreen loses focus every computer-use click is refused, and because the process is elevated UIPI makes granting Parsec useless — **tray-icon refocus could therefore not be tested at all**. Relaunching the app (single-instance raises it) is the way back. Dragging the HUD only works while every intermediate pointer position stays inside the HUD's own 904×698 mostly-transparent window; as soon as one lands on the desktop, the tier-"click" shell gate refuses the drag mid-gesture and leaves the button down — release it explicitly. Finally, the Microsoft Store package (`EtienneLescot.OpenScreen`, 1.9.6) **shadows the NSIS install in `request_access`**: every grant resolved to the Store bundle and the RC window stayed masked in screenshots while reporting success, until the Store package was removed. Screenshots do **not** interrupt a recording — that hypothesis was raised and disproved by running a 90 s capture with none taken and then taking one mid-capture with the helper surviving. | +| 2026-08-22 | installed `v1.10.0-rc.3`, macOS Apple Silicon DMG from the GitHub release (`Openscreen-macOS-Apple-Silicon-1.10.0-rc.3.dmg`, via Safari), unmodified: `CFBundleShortVersionString` `1.10.0-rc.3`, `spctl` `accepted, source=Notarized Developer ID` (M4LK7C6S84), the only copy of `com.etiennelescot.openscreen` on disk | macOS 26.5, M1, one display (captures at 1920×1080; scale factor not re-measured, the 2026-08-14 row records this display at 2×) | Partial: no defect | Computer-use pass, mostly on the caption anchoring that is the whole rc.2 to rc.3 delta. Restored here: the row was written in #486, then lost when a merge of `main` into that branch dropped it, and #486 was closed as already logged, which was true only of the 2026-08-23 window-capture slice below. **Captions**, on an imported clip of real speech (`say`, about 52 s, muxed to MP4, imported through New Project): auto-transcription fired on import (English detected, 26 lines, near verbatim), and every placement was measured on **exported** frames (`crop=1:1`, rawvideo), never the preview. Bottom at the 1.5 % default: plate bottom at y=1063/1064 of 1080 (16 px, 1.48 %), pixel-identical for two single-line captions 741 px and 999 px wide, both centred at x≈960. Top at the 1.5 % default, 9:16 (needed to force wrapping, since 16:9 phrases never exceed 7 words): plate top at y=29 of 1920 (1.51 %), identical for a 2-line and a 3-line caption, which grow downward (y 29 to 251 vs 29 to 353). Left: plate edge at x≈108 of 1080 for both. **Recording**: a clean stop (second click on the record/timer control) saved `recording-1787474633337.mp4` (227.4 MB, 27.1 s, `ftyp mdat moov`), `.cursor.json` and `.session.json`, made a project and opened it in the editor; a SIGKILL of the helper mid-recording still left a decodable fragmented file (13 `moof`, 14.0 s), so the #375 fragmenting holds. MP4 export at source 1080p and at 9:16 both completed. **Driver note, not a defect**: a respawning `UserNotificationCenter` took OS focus and blocked synthetic clicks until killed before each click; the *Cancel recording* (X) icon discards by design, and the stop-and-save control is the record button itself. **Not covered**: Right alignment and non-default top/bottom distances (not measured), #418 HiDPI frame fill, window capture (see the 2026-08-23 row), webcam and microphone (none attached), GIF, AI features, persistence across reopen, Windows and Linux. | | 2026-08-23 | installed `v1.10.0-rc.3` (Developer ID, unmodified) run with `OPENSCREEN_SCK_CAPTURE_EXE` pointed at a helper built from this branch | macOS 26.6.2 (25G83), M1, 1728×1117 @ 2× | Pass — fixes a blocker | **Window capture section only.** Before: selecting any window in the source picker kills the helper the instant `start()` builds its filter — `Assertion failed: (did_initialize), function CGS_REQUIRE_INIT, file CGInitialization.c, line 44`, SIGABRT, `-[SCContentFilter initWithDesktopIndependentWindow:]` → `SLSGetDisplaysWithRect`. 6/6 attempts on the shipped rc.3, no file, no error surfaced in the UI (the HUD returns to idle as if nothing happened). Display capture is unaffected and always worked, which is why this went unnoticed: the two paths diverge at `makeCaptureTarget`, and only the window branch resolves a rect through SkyLight. After: record → 25.2s → stop → **editor opened on the take**, `recording-1787475175449.mp4` 12,559,123 bytes / 25.18s / 2674×1684, the MP4 and both sidecars written (`.cursor.json`, `.session.json`), one project minted, zero crash reports. Helper-level A/B on an identical request JSON isolates the change: shipped signed helper → assertion, no file; this branch's helper → `recording-started`/`recording-stopped`, 4.49s / 1336×840 decodable MP4. NOT covered: webcam PiP, microphone, system audio (all off for these runs), export, GIF, AI/transcript sections, Windows, Linux. Not covered by unit tests either — `Package.swift` scopes the Swift test target to what runs without a screen, a display server or a TCC grant, and this crash needs all three. | | 2026-09-03 | dev build, worktree `github-issue-385-38d731` @ `437e4bd2` (main). Natives rebuilt from this tree: `wgc-capture.exe` and `compositor_view.node` both dated 2026-09-03, verified by string probe (`[segmentation]` HIT / control `OPENSCREEN_EXPORT_ENCODER` HIT; helper control `encoder-selection` HIT). ONNX Runtime 1.27.1 staged. | Windows 11 26200, 1920×1080 @ 100% | Partial — no defect, one validation unresolved | Post-1.10.0 slice. **Passed:** hardware H.264 is the Windows default (`videoEncoderRuntime: "hardware"` on the plain path); recording AAC valid at 48 kHz; camera background Original/Cutout/Blur/Custom all render in preview **and** in the exported frames; the control is correctly hidden when `onnxruntime.dll` is removed and returns when it is restored; caption anchor presets Top/Left move the band and relabel their sliders, and the exported plate's left edge measured x=192/1920 = 10.00% against `insetX: 10`; crop field down-arrow steps one source pixel (100 → 99.9479) and the preview box carries the source aspect; a zoom lying entirely inside a trim fires in the preview with the playhead parked on it (zoom 19.956–22.927 inside trim 19.931–23.596, checked in the saved project, not by eye); export progress reached 100% with a 1.5× speed region present and reported a real frame total; exported audio and video durations agree within one frame at the export's **30 fps** — 41.200 s audio vs 41.167 s video, a 33 ms gap that is exactly 1/30; `editor-window.json` persists bounds and a hand-planted zero-size/non-boolean state is rejected on relaunch; Regenerate-as lists all 101 whisper language entries; regions and settings survive a restart. **Skipped:** Ctrl/Shift+scroll zoom and pan — the computer-use `scroll` action does not carry a modifier, so the fix that moved the wheel listener to the whole pane could not be exercised either over the ruler or over the lanes; tray context menu (Save Diagnostics, Update Settings) — the desktop shell is granted at tier `click`, which blocks right-click; Update Settings in general — dev build, `app.isPackaged` is false so the submenu is correctly absent; the illegal-AAC-rate snap end-to-end — no 96 kHz device on this machine, covered instead by the helper's own `audio_sample_utils_test` MF probes, which passed at build time. **Note, not a defect:** Escape does not reach the app through this driver (it failed to close the Edit Clip dialog too), so any Escape-based check here is untestable rather than failing — same conclusion as the rc.3 retraction. **Unresolved — do not read this row as clearing it:** the exported duration ran 0.48 s (≈13 frames at 30 fps) under the trim/speed arithmetic — 1236 frames against a predicted 1249, from source 46.300 s minus a 3.665 s trim minus 0.990 s saved by a 2.971 s span at 1.5×. Ruled out: the source being shorter than its container claims (`-count_frames` gives exactly 2778 = 46.300 s × 60 fps). Not reproduced under controlled conditions, and not attributable to any post-1.10.0 change — the trim/speed length arithmetic predates them — so it is logged as an open question rather than a defect against this slice. The silence check in the same run is also weaker than it looks: that recording was ambient-mic screen capture, i.e. mostly silence, so it could not have distinguished an `atempo` hole from the source's own quiet. Both are why the two checks above now demand controlled audio and frame-level arithmetic. | | 2026-09-04 | signed follow-up candidate `256ec082` on `feat/fix-av1-webm-clip-switch`, packaged from a raw-Git-blob build tree (`Openscreen.exe` `32469490…3E6E`, `compositor_view.node` `090B606C…AA3A`) | Windows 11 Pro Insider Preview 26340, 1707×1067 logical | Partial — no defect | **AV1 clip-switch section only, driven by real computer-use against the packaged app.** Three-clip synthetic project: H.264 blue 0–1.50 s, malformed AV1 1.50–1.54 s (`AV1CodecConfigurationRecord` version 127, `avg_frame_rate=0/0`, unknown-sized EBML, and a **nonzero source start of 0.400 s**), H.264 green from 1.54 s. Real pointer control throughout — hover then click on the click-through HUD's Open Studio, ruler clicks and the previous-clip control to seek, the play control to run. **Seeking into the malformed AV1 clip renders that clip's own frame rather than a neighbour's**: the preview turned red at `0:01.5`, against blue at `0:01.2` and green at `0:02.3`. Read those colours as the three fixtures' own identities — blue `(0,0,255)`, AV1 `(254,0,0)`, green `(0,255,1)` at source 0.400 s, measured from the files, **not sampled off the screen**: no screenshot from this session was retained, so the on-screen colours are a qualitative reading and the identification rests on the clip-switch log below. Playback from 1.2 s crossed both boundaries and reached the third clip (green at `0:03.4`) before stopping at the end of the timeline. The app's own stderr binds that traversal to the fixtures in order (`h264-before-blue.mp4` → `legacy-av1-v127-zero-rate.webm` → `h264-after-green.mp4`) and shows the malformed traits being exercised live — 38 × `Unknown version 127 of AV1CodecConfigurationRecord found!` plus `Unknown-sized element at 0x3cd inside parent with finite size` — with no panic, fatal or abort line, the process still logging and still accepting UI input at the end of the pass, and closing Studio from the UI ending the app. (Liveness was polled during the run, but those polls were not persisted; what is checkable afterwards is the log and the fact that every later click landed.) **The AV1 clip is 40 ms, narrower than the 0.1 s playhead readout**, so the AV1 frame is identified by clip-boundary navigation and by the logged clip switch, not by the readout alone. **The fixtures are synthetic**, not a reporter-supplied file. **No Playwright ran in this pass** — the earlier Playwright run against the same package is supplemental and is not manual evidence. **Exit code not captured**: the waiter script threw before recording it, so "normal exit" rests on the UI close, the process disappearing and the absence of any Windows error event for the app. **Not run**: capture/HUD recording flow, webcam, microphone, system audio, export, GIF, transcription, editor operations beyond seek and play, macOS and Linux. **Environment note for the next run**: `request_access` resolves only Start-Menu-registered applications and refreshes that index on a delay, so an unpacked build needs a temporary shortcut *and* a retry before it can be driven at all; and re-fronting through that shortcut launches a **duplicate instance on the default profile** instead of raising the isolated one. | @@ -824,6 +825,9 @@ On macOS 15.2+ it opens at launch, until it has been closed once, while one of i | | | | | | | | | | | | | 2026-09-05 | Windows single-frame decoder ownership follow-up; source SHA-256 `FAF87561...87117`, bundled addon `94bc16d7...43a2c`, app.asar `8063a377...96f04` | Windows 11 build 26340; packaged Electron 41.2.1 | Scoped pass: nonzero AV1 seek and cross-clip playback | Fresh package, unique profile, no addon override; all 15 packaged native files hash-match staging (the existing packaging filter excludes standalone `ffmpeg.exe`). Native keyboard opened Studio after HUD pointer targeting failed; Studio seek/play/close used native input. AV1 at timeline 1.500 s/source 0.400 s rendered red `[255,24,0,255]` with a retained screenshot. During native playback from the first H.264 clip, read-only CDP samples observed blue followed by third-clip green `[0,216,0,255]` at 1.571 s; native logs confirm the malformed AV1 and following H.264 sources. PID 35472 exited 0 through window Close. An earlier sandboxed launch failed during Chromium GPU startup and is excluded from this pass. Limits: synthetic media, two native playback attempts in one successful session, no repeated stability or reporter-file claim; capture/webcam/tray/export not run. Exact-endpoint 4.540 s and one subsequent seek showed first-clip blue after native free-run wrapped: unchanged clip-identity synchronization paths, outside this resource/preflight follow-up; endpoint correctness is not claimed. Historical A/B rows remain separate. | +| 2026-09-05 | installed `v1.11.0-rc.1`, CI-built DMG from build run 33958219380 (`openscreen-mac-arm64`, `release/1.11.0-rc.1` @ `9f30f1cb`; the tag was later re-cut to `5d9e8703` with #618), Developer ID signed and notarized (`spctl`: accepted, Notarized Developer ID), ticket stapled; About reports `1.11.0-rc.1 (dmg)`, Electron 41.2.1; native payload one uniformly stamped set (33 `darwin-arm64` files, Sep 5 11:36) | macOS 26.5 (25F71), M1, 1920×1080 @ 1× plus a 2304×1296 @ 2× pass; no camera, no microphone | Partial: 1 blocker, 4 minor | Real OS mouse and keyboard through computer-use. Written at the time on `claude/e2e-results-v1-11-0-rc1`, which was never opened as a PR. **Blocker (#616, fixed by #618):** packaged STT is dead: the `.app` ships the ffmpeg dylibs but no ffmpeg executable, every `stt:transcribe` fails with `FfmpegUnavailableError: stt:native-extraction-unavailable`, and the UI says only "Failed to fetch" (a cached transcript can still show "Transcript ready" beside it). The Whisper helper itself loads on `whispercpp-metal`; relaunching the unmodified build with only `OPENSCREEN_FFMPEG_PATH` set made it work (65.5 s in 19.3 s, 0.29 RTF), so transcript, captions and word editing below ran with that variable. **Regressions not reproduced:** #375 (65 s take with system audio finalised: video 65.491 s / audio 65.530 s, -12.8 dB mean, `ftyp mdat moov`, all sidecars); the rc.3 window-capture `CGS_REQUIRE_INIT` crash (window 1468×854, 1161 frames, no crash reports); #418 at a real 2× (screen 2304×1296, four edges 100 % non-black; window 2304×1058). **Passed:** HUD layout toggle, drag (tracks the pointer, clamps at the menu bar, stays dropped), locale menu, device panel ("No microphone/camera found"); source picker, record, pause (timer froze at 00:31 for 16 s), stop to editor in under 10 s; play/pause/seek, ruler seek, navigator zoom/pan; z/t/s/a regions, text annotation with Typewriter, blur Mosaic/Gaussian/Oval obscure; export frame math (run A 1883 vs 1882.53 expected, run B at 2× 1872 vs 1872.11; audio and video within 0.98 and 0.99 frames at 30 fps), no `silencedetect` hole at either speed boundary with the level flat at -9.7 dB, caption plate left edge x = 192 for `insetX 10` and top edge y = 16 for 1.5 % (measured on raw frames); GIF 938 frames 1280×720, loop count 0, no LZW corruption, decodes in ffmpeg and Preview; MP4 in QuickTime; packaged word-insertion gate (typing between words inert, a correction propagates to captions); About, Save Diagnostics, Check for Updates ("up to date (1.11.0-rc.1)"), tray Update Settings, 3 modes persisted across restart (`{"mode":"download"}`); shortcut rebind Z to X; every modifier and composition setting survived quit and relaunch. **Minor defects:** (1) the diagnostic bundle carries no logs (`recentLogs`, `mainProcessLogs`, `helperOutput` empty); (2) the blur inspector has no intensity/block-size control (the model stores 12/12) and no freehand shape; (3) a display-resolution change strands the HUD off-screen until restart (the editor window re-clamps, the HUD has no persisted position); (4) GIF at 15 fps writes a 6 cs delay, 16.67 fps, 56.28 s for a 62.40 s programme. **Not defects, checked:** export silence at 30.1999 s is the source's own silence through the trim; `timeline.speedRanges: []` is schema layout; 58 non-monotonic-DTS lines are an ffmpeg null-muxer artifact (0 in ffprobe); an "unrendered" annotation was white on white. **Skipped:** webcam, microphone, voice-over, a second display at another scale (no hardware); `Escape`, modifier+scroll zoom/pan, hover controls on transcript words and silence chips (driver limits); AI chat, clip operations, imported audio, undo/redo, Background/Effects/Layout/Cursor facets, theme/locale switch, restart/cancel while recording, HUD minimize/close, Windows, Linux. | +| 2026-09-07 | locally built and installed `v1.11.0-rc.1` from `release/1.11.0-rc.1` @ `027f9e3c` (rebased on `main`, includes #618). Apple Silicon DMG, Developer ID signed; local development artifact, not published or notarized. Verified payload includes executable `ffmpeg` 8.1.2, compositor, SCK helpers, Whisper/ONNX and FFmpeg dylibs; `codesign --verify --deep --strict` passes. | macOS 26.5, M1 | Partial: STT blocker fixed; 1 system-audio defect | **No-cache STT proof:** opened a project whose asset had zero transcript segments, then used the installed build without `OPENSCREEN_FFMPEG_PATH`. UI progressed `Transcribing 0%` → `Transcript ready`; logs show Whisper Metal loading, native audio extraction and `[stt] done on whispercpp-metal` for the 0.2 s AAC asset (1.9 s inference). The project subsequently contains a new transcript asset id, language, one segment and one word. This rules out the cached transcript masking the former silent ffmpeg failure. A 65.5 s cached-project regenerate also completes normally (19.3 s / 0.29 RTF), but is supporting rather than decisive evidence. An asset with no decodable audio now exposes `NoAudioTrackError` in the UI instead of the previous `FfmpegUnavailableError`. **System audio defect:** with System audio ON and microphone OFF, recorded the entire screen for 20.38 s while a local 440 Hz / 48 kHz tone was actively playing through `afplay` (exit 0). The produced MP4 is healthy (3840×2160 H.264 plus AAC-LC 48 kHz stereo) but its audio is digital silence: AAC averages 2 kb/s and `volumedetect` reports mean/max `-91.0 dB` over 1,957,760 samples. Two shorter controls (0.55 s and 3.23 s) show the same silent track. Capture itself, source selection and clean stop work; this is an audio-content failure, not missing track creation. **Continued editor slice:** imported a local synthetic WAV; waveform, audio inspector, mute and loop all worked. Native Edit-menu undo/redo correctly changed then restored a Zoom modifier (keyboard shortcuts remain inconclusive under this driver). Theme toggled both directions; Cursor inspector toggles and controls were reachable; Edit Clip dialog opened with source preview and crop fields. Chat panel and AI settings opened, but no request was sent because the loaded project contains user recording/transcript. Webcam/voice-over remain unavailable: this Mac reports no camera or microphone. Remaining prior gaps: restart/cancel, clip drag/reorder/copy-paste, modifier anchoring under trims, second mixed-scale display, and Windows/Linux. | +| 2026-09-07 | Correction to the local `v1.11.0-rc.1` retest above. | macOS 26.5, M1 | Pass: system audio | **Retracts the synthetic-tone defect.** The `afplay` control captures digital silence on this machine, but is not representative of the ScreenCaptureKit route. A subsequent user-driven browser/YouTube capture with System audio ON produces a 99.46 s H.264 + AAC-LC 48 kHz stereo MP4 whose audio measures mean `-29.3 dB`, max `-2.6 dB`; the editor waveform visibly matches the signal. System-audio capture, source selection and clean stop pass. | | 2026-09-11 | dev build (`npm run dev`) of `fix/582-antialias-decimation`, base `fbe461e9`, final commit `8d97f799`. The 96 and 192 kHz A/B ran the helper from a clean `npm run build:native:win` of the tree `8d97f799` carries; the 384 kHz A/B and the 48 kHz app run used helpers built with the same command from earlier revisions of this branch, whose helper sources differ from `8d97f799` only in comments and whitespace. The A/B's pre-fix helper was built from `fbe461e9` in a separate worktree. No binary hash is given; build from the commit SHA. | Windows 11 Pro 26340, 2560×1600 @ 150% (as read after the runs) | Scoped pass — no defect; the 96, 192 and 384 kHz (factors 2, 4 and 8) A/B ran and the alias is gone | **Anti-alias decimation (#582) slice.** **48 kHz path, in the app, with real OS input against the click-through HUD:** source picker → Entire screen → Share; system audio on (helper launched with `system: { enabled: true }`); record with countdown; **pause at 00:32** (timer yellow, control switches to resume) and **resume** (red at 00:36); stop → editor opens with the take; playback of the saved recording runs, playhead advancing through 0:04.6 and 0:11.6. Recorded stream `aac, 48000 Hz, 2 ch, 192000 bit/s`, 38.38 s. The endpoint ran at 48 kHz, so nothing decimated on this pass: the 1 kHz reference measured **-26.97 dBFS**, and the 4 kHz and 12 kHz alias bins were empty (-128 and -125 dBFS). The 20 kHz probe component is absent (-136 dBFS), and an AAC encode alone removes it too: the same tone encoded to AAC 192 kbps by ffmpeg, with no capture involved, reads -131 dBFS at 20 kHz against -13.99 dBFS at 1 kHz — so a 20 kHz probe cannot test the capture path. **Decimation path, A/B'd against the pre-fix build at three rates:** a USB DAC was made the default render endpoint and its *shared-mode* format set to 96000, 192000 and 384000 Hz in turn, so loopback reports that rate, the encoder target stays 48000, and the factor is 2, 4 and 8; the helper's own `audio-format` event confirmed the rate in every run. The helper was driven the way the app drives it (config JSON argument, `stop` on stdin), not through the app UI. Fold-bin readings, before → after, for 96 / 192 / 384 kHz: a 36 kHz tone (folds onto 12 kHz) **-22.25 → at most -115.32**, **-23.90 → at most -138.02**, **-24.28 → at most -111.54 dBFS**; a 42 kHz tone (folds onto 6 kHz) **-28.20 → at most -137.14**, **-30.40 → at most -135.09**, **-30.96 → at most -117.25 dBFS**. The after readings bound what the recordings hold and sit near each recording's floor; they are not the filter's leakage, which the design puts at -123 to -155 dBFS at these points. The 1 kHz reference reads -13.98 or -13.99 dBFS in every recording; each pre-fix recording shows its alias only in its own fold bin; every pre-fix reading matches the box average's frequency response to within 0.08 dB; the 384 kHz runs were repeated and agree to 0.01 dB. AAC track length is not used as evidence about the filter's delay or about frame accounting (tracks are whole 1024-sample AAC frames, and repeat runs of the same helper differ by up to six); that output frame counts do not drift is asserted by the helper's suite. Beyond these recordings the behaviour is covered by that suite (95 assertions, including a real-`AudioMixer` case) plus eleven mutation counter-proofs and a control that must stay green. **Check the Advanced tab's format list, and every endpoint, before concluding a machine cannot run this** — a device's current format is not its capability. **Not run:** microphone, webcam, tray menu, export, and every non-Windows platform. A/V sync was not eyeballed: against the output timeline this change puts a decimated stream 39 + 1/factor output frames late (0.81–0.82 ms at a 48 kHz output; the filter's own group delay is 40·factor source frames), below what watching can resolve, so it is asserted numerically in the suite instead. | | 2026-09-13 | `6862a380` + microphone USB-label resolver patch; rebuilt release helpers | macOS 26.6.2, Apple Silicon, Shure MV7 | Partial | Real desktop HUD: selected explicit `Shure MV7 (14ed:1012)`, microphone on, system audio/camera off; started/stopped capture and reached saved editor (16.1 s). Logs confirm the rebuilt helper path and decorated label. Raw AAC is non-silent (mean -37.4 dBFS, peak -13.3 dBFS). Separately, the resolver matched the decorated label to the real AVFoundation MV7 ID. Default input was also MV7, so audio alone does not prove non-default routing. Listening, mixed/system audio, export, non-default-input recording and other platforms were not run; this is not full acceptance. | @@ -844,6 +848,8 @@ On macOS 15.2+ it opens at launch, until it has been closed once, while one of i | 2026-09-30 | installed `v2.0.0-rc.1` (CI artifact, sha512 matched `latest.yml`), installed over 1.10.0 | Windows 11 26200, 1920×1080 @ 125 %, AMD Radeon iGPU | Partial — 2 defects | Launch/HUD, source selector (window and full screen), record with pause/resume, stop→editor ~0.65 s, transport, seek, zoom/speed/trim/full-camera regions with undo/redo, autosave, imported audio track (mixed at the right place and gain), voiceover take, Rec mode, MP4 export (duration = source video stream − trim − speed gain, exact), GIF export (ffmpeg and Pillow decode byte-identical). **Defects:** HUD walks up on a vertical→horizontal flip (#951, fixed in rc.5 by #953); transcript word times VAD-compressed, ~−14 s (fixed for rc.3, #948). GIF export ~3 frames/s vs MP4 ~84 fps (#952). **Not defects, re-triaged:** the Whisper Vulkan boot crash came from a helper staged from an unrelated branch (409cf4d7); "HUD not topmost" is computer-use's own doing (a `screenshot` clears `WS_EX_TOPMOST` on the HUD); the 98 % progress stop was the Windows audio tail (#942). Not covered: installer UI (ran `/S`), updater, tray, cancel/restart, notes, reopen from library, AI chat, macOS/Linux. | | 2026-10-01 | installed `v2.0.0-rc.6` (CI artifact, sha512 matched `latest.yml`), installed over rc.1 | Windows 11 26200, 1920×1080 @ 125 %, AMD Radeon iGPU | Partial — 1 defect (transcript) | Targeted at the Windows changes since rc.1. **#951:** two vertical↔horizontal round trips with real clicks, state read after each, HUD back at the same bounds (`302,149`). **Recording** (full screen + mic + system audio + webcam, instant pause/resume mid-take): screen and webcam H.264 **High**, BT.709 primaries/transfer/matrix, TV range; audio runs 28 ms past video (rc.1: 0.87 s); stop→editor ~1 s. Screen at 57.2 fps average — 181 missed 60 Hz ticks over 52 s, timestamps stay on the clock (video 52.17 s vs audio 52.20 s) — known, #945. **STT:** helper boots on Vulkan, VAD on CPU, no crash; on a ground-truth clip (12.12 s silence then speech), first word at 12.10 s and every sentence boundary within 0.12 s; the "en" CTC aligner downloads in the background and only applies from the next transcription. **Defect:** the last word before one pause ("happened.") lands after it as a 20 ms word, its audio given to the previous word; without the aligner the display order also inverts ("nothing The happened."). Reported to #948. **Export:** 3-clip MP4 720p30, progress reaches 100 % (4200/4203), 4200 frames, video 139.97 s / audio 140.00 s, each clip's speech at the expected offset, decodes clean. **Mixer (#911, instant resume):** a second take with system audio only (mic off) while a 26 s TTS WAV played at 76 % volume (output peak meter 0.985 during the take). No punched hole anywhere in the voice: an alignment-free scan for 2–12 ms dips below 5 % between loud neighbours found none, and the same scan finds 10 ms holes injected into the take. Instant pause/resume (0.32 s button to button) skips 0.330 s of the source, so no voice before the pause is lost (the bug was 80–90 ms). Take is +3 dB over the source, peak −0.1 dBFS, 0 full-scale samples. The first take of this pass had the speakers muted at 0 %, which silences WASAPI loopback, so its audio was not usable. **Not covered:** preview limiter; MCP server; keep-awake; tray; GIF; macOS/Linux. | | 2026-10-01 | installed `v2.0.0-rc.8` (build run 36883700385, tag `33a16fe1`, helper from build-whisper-stt run 36830983393; NSIS sha512 matched `latest.yml`), installed over rc.5 for all users, About reports `2.0.0-rc.8` (`win32 x64 · nsis`, Electron 41.2.1) | Windows 11 Home 26200, 1920×1080 @ 125 %, Logitech StreamCam (sub-4K, MF) | **Partial — 2 defects** | **Webcam:** torn and mis-exposed frames in the webcam file (some frames split horizontally into two pictures, others blue-dark or washed out). The maintainer attributes them to the camera itself, not OpenScreen; the same frames are in the rc.1 take of 2026-09-30. **Defect 1 (#960): captions in the preview are stale after switching projects.** Two clips of one asset, captions Bold top-left: after opening another project and reopening this one, clip 1 shows no caption or the wrong line (`0:06` showed "we are recording the screen…", `0:12` and `1:05` nothing) until *Show captions* is toggled; saved data is intact. **Defect 2 (#961): after a working session, closing the editor leaves OpenScreen running with no window** (6 processes, tray only), seen twice: once after takes (HUD, Record mode, restart, cancel), once after only the project dialog, *Edit clip* and a chat turn. An instance that only opened the editor and closed it quit as `window-all-closed` intends, so some hidden window outlives those surfaces. **Loudness in spec:** MP4 export at the Audio facet's default output level (never changed in this project), −15.8 LUFS integrated, −1.4 dBFS sample and −1.4 dBTP true peak; the check asked for a sample peak under −1.5 dBFS, which the AAC overshoot past the −1.5 dBFS limiter cannot meet, so its wording is corrected in this change. **Passed:** HUD layout toggle both ways, tooltips idle and recording (with continuous real moves; a teleported cursor shows the previous control's tooltip, a driver artefact), language menu, *Device settings* (devices, live preview, *Camera quality* 1080p/1440p/4K, 4K default, 1080p persisted across quit/relaunch as `camQuality`, hand-edited `720p` reads back as 4K, device switch persisted), *Hide recording bar* → tray click brings the HUD back, *Quit OpenScreen* (0 processes), second launch exits 0 with one HUD. Source selector (Screens/Windows, Cancel), record with no source opens it and starts after the pick, countdown, pause (span absent from the file) / resume, restart (new helper process, timer reset), cancel (no editor, no file), gear locked during a take. Stop → editor, 53.0 s take with 3 automatic zooms at the clicks, desktop icons hidden in the second take for its whole length. Files: screen and webcam `profile=High`, `has_b_frames=0`, `tv/bt709×3`, AAC 48 kHz, `encoder-selection` hardware. Auto-transcription after the take; *Regenerate as* English. Transcript: clip order, silence spans with durations, monotonic word seeks (4.0 → 11.2 → 16.4 → 21.3 → 21.8 → 27.2 → 56.9 s), live word highlight, Backspace marks skipped + restore, silence-span trim and restore, **#959 checked: sentence-final "time." cut 11.91–12.51 against a speech offset of 12.44 (silencedetect −40 dB) and next speech at 16.46**; typing between words does nothing (packaged gate). Transport, Left/Right 1/60 s, stop at end, navigator narrow/pan. Regions by T/S/A/C, trim edges, *Bring this part back*, undo/redo; zoom levels, custom 1.25 kept, 9 → "Zoom goes from 1× to 2.86×", 3D Orbit/left/right; speed presets, custom 3×, 20 → "Speed can't go higher than 16×"; annotation text/size/plate; Full Camera. Clip reorder carries every modifier; Edit clip grip (0:10.7–0:53.0) and 1:1 crop, Cancel leaves it. Export dialog v2 layout and sizes (1224×720 / 1838×1080 / 1910×1122); MP4 1838×1080 30 fps, video 92.033 s vs audio 92.066 s (1 frame), 2762 frames vs 2760.7 computed (105.941 − 10.312 trim − 5.41 × 2/3 for 3×), frames match the preview at 16.5/28/40 s; GIF cancel (no partial file) then full GIF 816×480, 1383 frames at 15 fps, loop, ffmpeg and GDI+ agree. Imported audio: −18 dB, 1 s fades, ramps at the track's own edges in the export (3.0→4.0 s, 22.0→23.0 s). Captions toggle, Bold, top/left anchors and *Distance from left*, captions unscaled under a zoom. Camera layout presets with Auto reshaping, shape, mirror, Cutout. Cursor facet style and *Show cursor*. Wordmark menu, About (version, Copy to clipboard), light/dark theme, French and back, shortcut rebind (Q adds a zoom) and reset, Ctrl+S toast, Ctrl+O, an older project opens without prompt, reopen keeps regions/settings/audio track. Editor bounds and maximized state restored. Chat (deepseek-v4-flash): "Add a 2x zoom from 0:07 to 0:09" applied as 2.20× with a reason, one undo/redo unit. **Not run:** HUD drag (the HUD window now ends ~45 px above the bar, any longer move lands on the click-tier desktop; short in-window moves did not move it, inconclusive); `Esc` (Claude Desktop swallows it); Ctrl/Shift+wheel (the scroll tool holds no modifier); tray right-click menu (Stop Recording, Save Diagnostics, Update Settings, About from tray) and the Alt-held Help menu; level meter and mic-only/system-only takes, music ducking (nobody spoke); "No camera found"; 4K-camera, no-30-fps, DirectShow, covered-lens and sharpness checks (no such camera / setup); window source and 24H2 context menu; DPI and multi-display (single display, scaling not changed); voice-over recording; region copy/paste and merge/repel, clip duplicate/delete; translation; most AI-settings and chat-history checks; camera background export of Cutout/Custom; caption plate measurement; legacy-project migration checks beyond opening one; macOS and Linux. Also seen: an English text read by the French SAPI voice auto-transcribed as French (detection, not app). | +| 2026-10-01 | installed `v2.0.0-rc.8`, CI-built DMG `Openscreen-macOS-Apple-Silicon-2.0.0-rc.8.dmg` from the GitHub Release (tag `33a16fe1`, build run 36883700385, sha256 `7a926621...8e99`), installed over rc.7, Developer ID signed, notarized and stapled (`spctl`: accepted, Notarized Developer ID), About reports `2.0.0-rc.8 (dmg)`; native payload one uniformly stamped set (34 files) | macOS 26.5 (25F71), Mac mini M1, 3840×2160 @ 2×, no camera, no microphone | **Partial: 1 should-fix, 4 minor** | Real OS mouse and keyboard through computer-use against the installed release (an rc.7 pass was not run: computer-use access was denied while nobody was at the Mac). **Defect (#965, fixed by #971): the HUD is recorded into every take after an editor round trip** in a picker session: `excludedWindowIds` [7408] then [7458], take C frame at 10 s shows the HUD with its `00:09` timer; `makeCaptureTarget(picked:)` reuses `picked.filter`. **Minor:** #966 the lane says "Press Z" after zoom was rebound to X; #967 with no camera the HUD toggle saves `camEnabled: true`, so Record mode shows Camera On; #968 raw `Error invoking remote method 'stt:transcribe'` after a 60 s ffmpeg timeout behind a pending Downloads TCC prompt; #969 the French wordmark menu wraps and splits the version as `2.0.0-`/`rc.8`. One unexplained app exit, not recurring. **rc.1 blocker gone:** 2 clips + trim + 1.5× speed + zoom + annotation exported 5,123 frames against 5,121 computed (85.351 s), audio and video end together at 85.38 s, `silencedetect` tone continuous across the cut and both speed boundaries. Silent system audio not reproduced (-17 to -20 dB mean); a pending Accessibility grant no longer blocks recording. **Passed:** HUD layout, drag within 2 px, tooltips, language menu, Device settings, *Hide recording bar* and menu-bar restore, Quit, second instance; menu-bar menu and About; picker-less record, pause (00:17 held 6 s), restart, cancel, stop to editor, Record mode handover; capture H.264 High 3840×2160 bt709, keyframe 0.983 s, about 30 Mbit/s; 3 automatic zooms at clicks; transcription on `whispercpp-metal` (46.1 s in 23.7 s), French punctuation (the rc.8 change), word seek, skip, trim silence; captions; editor regions, undo/redo, theme, French; rc.7 camera change (Square 70 %, Original 40 %), layouts, Full Camera, Cutout and Blur; MP4 1080p60 and GIF 778×480, 1,282 frames, loop 0; a schema 6 project opens and saves as 8, settings persist; AI chat zoom with undo/redo; Save Diagnostics with no key. **Not run:** Apple picker interactions (owned by Control Centre, not grantable; the operator clicked *Share Entire Screen*), `Escape` checks, microphone, webcam capture, voice-over (no devices), window source, multi-display, Spaces, notes exclusion, Permissions window, Ctrl/Shift+scroll, clip reorder, imported audio, translation, update flows. | +| 2026-10-02 | installed `v2.0.0-rc.12`, CI-built DMG `Openscreen-macOS-Apple-Silicon-2.0.0-rc.12.dmg` from the GitHub Release (tag `5853f923`, build run 37010880013, sha256 `d76ee67c...ae15`), app byte-identical to the DMG, Notarized Developer ID, About reports `2.0.0-rc.12` | macOS 26.5 (25F71), Mac mini M1, 3840×2160 @ 2×, no camera, no microphone | **Partial (rc.8 to rc.12 changes only): 1 minor regression** | Real OS input through computer-use; the operator clicked *Share Entire Screen* in Apple's picker twice. **#965 to #969 verified fixed** (take B after the editor logs the new HUD id [341] and the HUD is absent at 12 s, the picker is asked again by design; "Press X to add zoom" in English and French; `camEnabled` cleared to false; translated unreadable-media hint after `chmod 000`; French menu rows on one line). **Regression, not filed: inside a 4× speed region the preview lags 1.8 to 3.2 s of source and stays 2.2 to 2.7 s behind after it**, against 0.6 to 1.8 s on rc.8 run from its DMG on the same project; export unaffected; suspected `e358d771` / `b519f236`. Preview at 1× on 1080p and 4K within 0.1 s, cut crossing, entry into a clip past its end shows its last frame, webcam PiP and Full Camera verified; read over CDP, the hidden screen `