Skip to content

0.4.1

Choose a tag to compare

@github-actions github-actions released this 02 Aug 12:14
· 20 commits to main since this release
qa: a replay whose rate nobody measured may decline to name its backend

CI caught this on the 0.4.1 candidate, which is what CI is for. The assertion
added with #135 read "a pack that carries a replay names its backend", reasoning
that the writer always knows which path it chose. It does. It has nowhere legal
to put it.

`backend` rides INSIDE `media.cadence`, and SPEC §5.3 makes `achieved_fps` and
`worst_stall_ms` REQUIRED members of it. `cadenceSummary()` therefore returns null
when nothing could be measured, because the same section forbids reporting a rate
nobody measured. A 1144 ms replay with two fragments on a hosted runner measured
no rate, wrote no cadence, and turned the job red over a perfectly good pack.

The comment beside the writer said exactly this — "a backend with no measured rate
to sit next to has nowhere legal to go" — and the assertion contradicted it. The
code was right and the check was wrong.

What survives is the invariant the writer really guarantees: every cadence it
builds carries a backend, unconditionally. So an absent cadence is accepted, and a
cadence WITHOUT a backend is rejected — which is the shape a regression would
actually produce, and the shape the old fixture was not testing. The fixture is
now two: one pack with no cadence at all, one with a cadence stripped of its
backend.

#62's fallback story keeps its machine-checkable end wherever a rate exists, which
is every capture long enough to measure one. The captures too short to measure a
rate were never the interesting case for "which path produced this".

Gate: PASSED. check:pack-assertions 46 passed.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>