* fix(cli): capture retries without WebGL when the page stops answering under software GL
* style(cli): format the capture stall retry test
* style(cli): shorten the stall watcher comment
* fix(cli): drop the comment line the comment ratchet refuses
* test(cli): the stall retry tests use a fake output path that is not a temp file
* fix(studio): a split at a clip's edge leaves the file unchanged
* fix(studio): keep the split margin's doc within the comment width
* chore(studio-server): keep the split margin's comments within the file's share
* fix(cli): check and snapshot load GSAP from the bundled copy, not jsDelivr
* test(cli): bundled GSAP loads on a page whose own requests interception answers
* feat(cli): review notes name the command that reviews the cuts inside a sub-composition
* fix(cli): the review note fires only for a host with cuts inside it
* fix(cli): check drops a request a network change cut when the file loads again
* style(cli): format the network-change check fix
* fix(cli): drop the comment the ratchet would count
* fix(cli): a check out of time drops the requests a network change cut
Frames ffmpeg has written now reach the render's stage progress, so a long source video no longer leaves the render silent between extract_video and capture.
* fix(cli): check no longer calls text occluded by a cover that a CSS mask paints through
* fix(cli): a mask on a wrapper around both the text and the cover does not hide the cover
* style(cli): format the mask walk
* fix(producer): a render that stalls before its first frame says which worker phase it was in
* fix(producer): a retried capture's stall message no longer names the aborted attempt's workers
* fix(producer): the stall diagnostic adds no comment lines and no extra branch to the stall check
* fix(engine): a video clip starting between frames shows its media on the right frame
* chore(engine): trim the helper comment to one line
* chore(engine): drop the helper comment
* test(engine): extract once per start in the off-grid clip test
* fix(engine): a looped clip keeps its loop origin when the start is off the frame grid
* test(engine): three off-grid starts cover the failure modes and keep the flake gate under its limit
* fix(core): the first cut after Play starts on time instead of running ahead
* fix(core): learn half the start delay from Play so the first cut keeps its last frame
* perf(studio): films with thousands of timed clips stop re-reading every clip each frame
* perf(studio): drop the added comment lines the ratchet counts
* fix(cli): a missing registry item names the closest ones, and a blocked browser says how to allow it
* fix(cli): let closestNames carry its rule in its name
* test(studio): edit accuracy evidence screenshots capture only the viewport
* test(studio): edit accuracy screenshots only in the gate's confirmation re-runs
* test(studio): keep the inStudio doc comment on inStudio
* fix(registry): caption components keep the last phrase until its last word ends
* test(registry): caption last group stays visible until its last word ends
* test(registry): narrow the timeline lookup for strict typecheck
* fix(cli): snapshot probes each video clip once for all the times it is asked for
* style(cli): drop the probe cache's added comment lines so the comment ratchet holds
* fix(cli): preview stops at once on Ctrl+C while a Studio tab is open
* fix(cli): a closed Studio tab leaves no timer that holds a stopping preview open
* fix(cli): name the tab-closed wait instead of commenting it
* test(cli): the tab-disconnect test checks the route's own keep-alive timer, not every timer
* fix(cli): adopted audio is labelled voice or sfx by its folder or file name, not always bgm
* fix(cli): let the audio kind helper's name carry the rule
* feat(cli): add installs several named items in one call
* fix(cli): split add's per-item install, and keep soundfx folders as sfx
* ci(studio): run the pull request edit accuracy slice in 10 shards
* ci(studio): run the pull request edit accuracy slice in 15 shards
* ci(studio): pack edit accuracy shards by measured case time so they finish together
* ci(studio): load shard timings with require so happy-dom tests can import the grid
* ci(studio): the slow runner stop judges runner speed, not how long a shard's first cases are
* ci(studio): keep the slow runner comment on one line under 120 characters
* fix(lint): a scene child hidden at zero through a scoped query is not an overlay that starts visible
* fix(lint): a descendant selector inside a scoped query hides the overlay too
* fix(cli): check sees a small sprite move across a large canvas
* style(cli): wrap the media pixel channel comment
* fix(cli): only the liveness signature samples canvases finely, the sweep guard stays coarse
* fix(core): a video plays to the last frame before its out-point instead of stopping a frame early
* fix(core): a dropped frame before an out-point no longer lets the out-point's frame show
* perf(core): a video edit with no animation timeline stops rewriting every clip each frame
* refactor(core): drop the comments the comment ratchet counts
* fix(core): a clip that has fully downloaded stays loaded and plays on time
* refactor(core): drop the comments the comment ratchet counts
* fix(engine): a video on a non-square pixel grid renders at its display shape
* chore(engine): drop comments the names already carry
* fix(engine): a rotated clip with a non-square pixel grid keeps its display shape
* test(engine): the frame probes end their options with -- like every ffprobe call
* fix(cli): anonymous hosts and host in-points move a caption word's lifetime window
* fix(cli): a host's end and playback-start are read like the runtime reads them
* fix(engine): a render no longer waits for a sub-composition timeline no script can register
* fix(engine): the timeline wait matches a twice-mounted id and a template-literal key
* fix(cli): browser clear still reports a folder Windows holds, and the EBUSY test covers EPERM
* fix(cli): browser clear reports a locked browser folder, with a test that fails if it does not
* fix(cli): text-to-speech ignores a foreign PYTHONPATH when it looks for kokoro-onnx
* fix(cli): shorten the pythonEnv comment
* fix(cli): text-to-speech keeps a deliberate PYTHONPATH unless the packages fail with it
* fix(cli): drop the python.ts comments the names already say
* fix(core): the playhead keeps moving at a cut while the incoming take has not started
* fix(core): shorten a comment in the clock
* fix(player): keep the WebKit stops script out of the type check
* fix(core): cut two comments from the clock
* fix(core): a still sub-composition's data-no-timeline on its template root skips the timeline wait
* chore(core): drop a comment the copy already says
* fix(cli): check flags caption words hidden behind a cut-out and ignores a mostly transparent cover
* fix(cli): a caption word's lifetime is shifted only by its composition hosts
* fix(cli): normalize-audio never cuts a clip that is quieter than the target
* fix(cli): carry the boost-hold rule in a name, not a comment
* fix(cli): normalize-audio no longer says a clip is matched when a limit holds it short of the target
* fix(cli): format normalize-audio, drop the extra comment, and say a held clip is held