Files
hyperframes/packages
Vance Ingalls 608c3b50ba fix(engine): give the group sub-mix the failure contract, and sanitize its path
Review finding 4 plus the workdir-traversal tail item.

**The group loop had no try/catch.** `parseAudioFxChain`, `parseAutomation` and
`applyAudioFxChain` were called bare, so a malformed `data-fx-chain` on a BUS —
hand-authored, or written by a newer studio carrying an effect id this engine
does not know — threw straight out of `processCompositionAudio`. That bypassed
the MixResult/`failures[]` shape every caller handles, and skipped `bail()`, so
the temp dir leaked with it. The per-element loop has always wrapped the
identical calls. Now both do, with the same rule: an `AudioFxRenderError` stays
fatal, because substituting the dry signal for a processed one ships a render
that sounds plausible and is not what was authored.

**The traversal is real, and narrower than it looks.** `group-${groupId}.wav`
defuses a bare `../` — the segment is `group-..`, not `..` — but an id holding a
slash BEFORE the dots escapes: `a/../../escaped` normalizes to
`<workDir>/../escaped.wav`, outside the tree `bail()`'s rmSync can reach.
Verified: without `safePathSegment` the test finds `escaped.wav` sitting beside
workDir. `data-audio-group` reaches this file straight from the document; the
studio's `GROUP_ID_PATTERN` guards only ids the studio itself mints.

Two tests, each verified against a revert of its own fix. engine: 66 files.
2026-08-20 16:41:19 -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