VideoRefusal has four members and three of them are exercised against a real decoder in frontend/media/browser/. 'undecodable-codec' is not: the only coverage is frontend/ui-core/src/screens/videoImport.test.tsx, which hands the screen a fake runtime already returning that refusal.
The obstacle is that the refusal needs a clip the runner can contain but not decode, and the Playwright Chromium encodes and decodes the same set - VP8, VP9, H.264 and AV1 all both ways, HEVC neither. So there is no codec it can encode into a fixture but then decline to open, and the fixtures are encoded in-browser precisely because this distribution has no media toolchain.
The prose, the union member and the UI branch are all in place; what is missing is a real canDecode() === false from a real decoder.
Direction: either commit a tiny HEVC clip obtained without a host toolchain, or accept a stubbed decoder at this one boundary and say so where the gap is recorded.
VideoRefusalhas four members and three of them are exercised against a real decoder infrontend/media/browser/.'undecodable-codec'is not: the only coverage isfrontend/ui-core/src/screens/videoImport.test.tsx, which hands the screen a fake runtime already returning that refusal.The obstacle is that the refusal needs a clip the runner can contain but not decode, and the Playwright Chromium encodes and decodes the same set - VP8, VP9, H.264 and AV1 all both ways, HEVC neither. So there is no codec it can encode into a fixture but then decline to open, and the fixtures are encoded in-browser precisely because this distribution has no media toolchain.
The prose, the union member and the UI branch are all in place; what is missing is a real
canDecode() === falsefrom a real decoder.Direction: either commit a tiny HEVC clip obtained without a host toolchain, or accept a stubbed decoder at this one boundary and say so where the gap is recorded.