Files
hyperframes/packages
Vance Ingalls 5d0c9827aa fix(core): stop the runtime stamping timing onto an <hf-audio-group> bus
Where the phantom rows came from. The runtime stamps `data-start="0"` and
`data-duration=<whole composition>` on every id'd child of the composition root
"so they appear in the timeline even without animations" (init.ts, the
`window.parent !== window` block). Its only skips were SCRIPT / STYLE / LINK, so
an `<hf-audio-group>` got stamped too — which made it match the clip-manifest
selector `[data-start], …`, so the bus entered `__clipManifest` as
`kind: "element"`, `tagName: "hf-audio-group"`, 0 → 40s, and the studio drew it
as an ordinary full-width clip row directly above the real group header.

Observed on audio-real: 18 timeline elements, two of them
`Voiceover|voiceover|hf-audio-group|manifest|0-40.0` and the same for `sfx`. 16
after this change, and the group rows and FX rack are unaffected.

That row was draggable, trimmable and DELETABLE, and deleting it deletes the bus
element — which is why deleting it took the group's automation lanes and its FX
rack with it. Nothing was corrupted; the rack's subject was gone.

`isTimelineIgnoredElement` in studio already excluded the tag with this exact
reasoning, but it only guards the DOM-scan and implicit-layer paths. The bus
arrived through the manifest, upstream of all of them, so the guard never saw
it. Fixed at the source instead: both stamp loops now skip the tag.

Not fixed: the `Stage` row in the same screenshot. That one is a real implicit
layer for `<div class="stage">` — a visual container the author wrote — and it
belongs in the timeline. `data-hf-ignore` on such a wrapper suppresses its row.

Regression test asserts the bus keeps no timing while an id'd sibling still gets
stamped; verified it fails on a revert. It has to stage `window.parent !== window`
because the stamp only runs inside the studio preview, and it lives inside the
`initSandboxRuntimeModular` describe so it gets the DOM reset — outside it, a
previous test's leftover root wins `resolveRootCompositionElement()` and nothing
is stamped at all, which reads as a pass.

core: 122 files, 2481 tests.
2026-08-20 16:41:07 -07:00
..
2026-08-20 19:03:09 -04:00
2026-08-20 19:03:09 -04:00
2026-08-20 19:03:09 -04:00
2026-08-20 19:03:09 -04:00
2026-08-20 19:03:09 -04:00