* fix(engine): h265 renders no longer fail on hosts with more than 16 cores
libx265 rejects more than 16 frame threads, so the thread count taken from the
CPU quota is now capped at 16 for x265. x264 is unchanged.
* fix(engine): pass the encoder to the thread cap in the CFR re-encode
* fix(core): release decoded preview audio once no clip uses its source
The preview transport cached every decoded audio buffer by source until the player was destroyed. Each scheduling pass now drops cached buffers whose source no clip in the document still uses (scene edits, swapped sources), and keeps the rest so playback never re-decodes a clip still in the film.
* fix(core): drop the comment the comment-share ratchet rejects
* perf(producer): the audio task probes each video for sound instead of extracting its frames
* test(producer): the audio task finds a video's sound from a probe, with no frames extracted
* perf(engine): the audio mix reads clips held at a URL many at a time
* style(engine): format the remote clip slot choice
* fix(producer): the audio task places a video's sound in the window extraction would give it
* style(producer): format the slot cases of the script-src audio test
* fix(studio-server): project history no longer copies video, audio or huge files
* fix(studio-server): clean drops old video and audio copies in every history
* fix(studio-server): TypeScript source is not media, so its history is kept
* fix(studio-server): split the media reclaim and point the slow-copy route test at a non-media file
* fix(studio-server): no unused expression when collecting a history's hashes
* fix(cli): capture images declared only through srcset
* chore: prepare conflict resolution against current main
* fix(capture): retain srcset coverage with validated GIF redirects
* fix(cli): close asset streams when clients disconnect
* chore: prepare conflict resolution against current main
* fix(cli): retain asset disconnect cleanup with current main
* fix(cli): honor HTML attribute casing in frame-rate defaults
* chore: prepare conflict resolution against current main
* fix(cli): preserve HTML fps casing with shared cloud defaults
* fix(core): preserve literal percent in beat source paths
* chore: prepare conflict resolution against current main
* fix(core): retain beat path handling with current main
* fix(cli): preserve stylesheet order during website capture
* chore: prepare conflict resolution against current main
* fix(cli): retain captured stylesheet order with current main
* chore: prepare conflict resolution against current main
* fix(capture): retain cascade coverage with validated redirects
* fix(cli): detect beats from child media sources
* chore: prepare conflict resolution against current main
* fix(cli): integrate child beat sources with native decoding
* fix(cli): init and skills update only touch HyperFrames skills; --skip-skills works
* fix(cli): init never touches installed skills and no command removes one
* fix(cli): shorten the init skills comment
* fix(cli): shorten the init skills comment
* fix(cli): the stale-skills notice reaches agents that run without a terminal
* test(cli): a run without a terminal now checks skills in the background
* fix(cli): the stale-skills notice also prints on --json runs
* perf(engine): remote sources of a site keep their probe results for the whole render
* test(engine): probe a content-addressed URL once per render
* style(engine): format the audio probe split
* fix(sdk): a delete is kept hidden when any script lookup could reach it, not only an id
* fix(sdk): a lookup argument that is not one closed literal keeps the delete hidden
A `<canvas layoutsubtree class="hf-vfx-src">` nested inside another capture
canvas blocks the renderer main thread in drawElementImage, so `check` and
`snapshot` time out with no output. Refuse either direction of the nest with a
reportVfxError and leave the chain unregistered.
Also scope the two host lookups to immediate children (`:scope >`) so a nested
host's src/out canvas is never bound to the outer host, and read the
`data-vfx-ref-visible` flag in resolveCaptureSource so a canvas reached as both
a host's own source and as a ref gets one consistent `visible`/keepBitmap.
Refs #4405
Co-authored-by: Claude Sonnet 5.5 <noreply@anthropic.com>
* fix(cli): recognize painted gradient children on older Chrome
* fix(cli): recognize ancestor image text masks
* fix(cli): report clipped ancestor text on older Chrome
The media_src_kind_mismatch rule classified .mp3 and .jpeg but not .m4a or
.avif, so an <img> pointed at an audio file or a <video> at a still slipped
through for those two formats. Add .avif to IMAGE_SRC_EXT and .m4a to
AUDIO_SRC_EXT.
.ogg stays out: its container can carry Theora video as well as Vorbis or
Opus, so the extension does not name the kind. .m4a is the opposite case --
it is audio-only, and video in the same MP4 container is .m4v, which
VIDEO_SRC_EXT already lists. The .ogg case keeps its existing coverage and
gains an explicit unknown-extension case alongside it.
Refs #4382
Co-authored-by: Yi-111-a <Yi-111-a@users.noreply.github.com>