* 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
* fix(cli): Apple Silicon Macs without ffmpeg get working arm64 ffprobe and ffmpeg
* fix(cli): drop the bundled ffmpeg installers, name the x86-only binary it skipped
* feat(cli): use dedicated HyperFrames OAuth clients
* docs(cli): shorten credential store contract comment
* fix(cli): respect Windows modes in OAuth media test
* fix(cli): keep media workflows on HyperFrames OAuth
* test(cli): scope billing status assertions to wallet rows
* test(cli): align telemetry fixtures and CI auth inputs
* test(cli): stalled-download tests give each stall time for its bytes to reach disk
* test(cli): a stalled download times out once its bytes are on disk, not on a clock
* feat(studio): a preview reload that gives up on the runtime says how far the page got
* refactor(studio): read the reload's page phase in one place, before the frame is let go
* test(studio): every reload page phase is covered, and the hook gains no branch for it
* refactor(studio): the reload page phase reads the window only once the frame has a document
* fix(cli): a project .env only sets the CLI's own settings
The .env in the working directory could set any environment variable for every
command except capture. It now sets only the keys the CLI reads from a project:
the HeyGen, ElevenLabs and Figma credentials and the vision keys, models, Vertex
settings and timeout. Other keys are ignored, and one stderr line names them.
* test(cli): the startup test and comment budget follow the single project .env key list
* fix(cli): a project .env can still turn telemetry off
* fix(engine): late-starting videos play to their last frame
A video whose first frame is after timestamp 0 could end early (frozen
tail) or late: ffprobe's stream duration does not run from the first
frame in every container (fragmented MP4, Matroska). Such a video's end
is now read from its last packet, once, where its facts are probed.
* test(engine): the WebM-with-audio case measures its first frame from the file
* test(engine): the first-frame probe ends its arguments with the input file
* fix(core): the preview's scene window settles when a scene can't unmount instead of hanging the page
* refactor(core): name the scene window's stuck step instead of commenting it
* fix(cli): allow-occlusion on the covering element silences text_occluded
* fix(cli): allow-occlusion also works on graded video and does not excuse a card's own text
* fix(engine): long films start capturing at once instead of after a full effect scan
* fix(engine): give the effect scan two minutes, under the app's stall limit
* fix(engine): show effect scan progress so a long scan reads as preparing, not stalled
* fix(core): telemetry redaction covers folders with spaces in any script
* style(core): shorten the redaction folder note
* fix(core): spaced folders without a root redact only before a file name
* style(core): drop the redaction note that described the leak as intended
* style(core): two fewer comment lines in the redactor
* fix(core): bound the spaced-folder match so long lines stay linear
* feat(cli): a feedback report names why the last check failed
* fix(cli): feedback names a check that threw or never finished, with when it ran
* fix(cli): feedback says how old the last check is