"libmpv owns v0 playback. A second backend requires a failing golden-corpus class, an explicit selection rule, diagnostics, and parity tests; fallback cannot be silent."
The 'Just In Case' Second Engine
It feels responsible to wire in a backup engine. "We'll use libmpv, but if it ever struggles, we'll quietly fall back to AVFoundation." That sentence sounds safe and is quietly poisonous. Now the app has two code paths for every file, twice the surface to test, and — worst of all — a hidden switch that can decide, without telling anyone, which engine the user is actually watching.
Ashen Reel ships one backend: libmpv. Not because a second is forbidden forever, but because a second backend has to earn its way in, and on cutover day nothing had earned it.
The Price of a Second Backend
The invariant sets a high, specific bar. A second backend requires all of: a named failing golden-corpus class (a real file libmpv genuinely can't handle), an explicit selection rule (not a catch-all), parity tests proving the second backend does better on exactly that class, and diagnostics that show which engine ran. Miss any one and the answer is no.
Here is the difference between an evidence-gated selection and a silent fallback, in code:
Why It Shipped With Just One
Here's the punchline: on the 1.0.0 cutover, no required corpus class failed libmpv. Dolby Vision was the one open question, and rather than pre-build an AVFoundation path 'just in case,' Ashen Reel left it as a conditional gate — no failing class, no second backend. The discipline paid a real dividend: one engine, one code path, one thing to trust. You add the second backend the day a real file forces you to, with evidence in hand — and not one day sooner.