0.8.0 — remove the narration fallback that could not run
deck runtime v4, deck transport v4.
startNarration() opened on !pickVoice() && !hasClips(). The gate is synchronous and every way to detect a recording is asynchronous — under file:// a request is not available at all — so hasClips() could only ever return a constant true and the branch behind it never ran on any deck.
Removed: lcdMessage, msgTimer, lcdn, both novoice strings, and deck transport's .lcd:has(.n.msg) rule, which existed only to reveal that message below 400px. The transport block holds 56 rules now, not 57.
What actually handles a missing recording stays: clip.onerror in narrateCurrent() falls back to the speech synthesiser, per slide, after the failure rather than predicting it.
No behaviour change. Sites re-pin and run npm run design.