Bugs from puppeteer inspection:
1. Old buggy renders left 0-byte cache files behind. New code never
re-rendered because cache_path.exists() was True.
Fix: validate cache file is >1KB, otherwise re-render.
2. FastAPI @app.get only handles GET, not HEAD. Frontend's HEAD check
returned 405, then GET re-rendered (correct), but second click also
returned 405 then 200 again — confusing.
Fix: use @app.api_route with methods=['GET', 'HEAD']
3. If ffmpeg fails partway, broken file remains in cache.
Fix: unlink on any failure path.
Also deleted existing empty cache files in container.