first spoolcast pilot live on youtube — 44 chunks, silent defaults caught, rules grew teeth
got one full 5-minute illustrated narrated video shipped to youtube. 44 chunks, stick-figure doodles + puck tts at 1.2x + opencv reveal animations + content-aware camera moves + a matched thumbnail. pipeline: shot list xlsx → kie.ai for images (nano-banana-2, locked style anchor) → chirp3-hd for voice → opencv for reveal frames → remotion headless render. the xlsx is still the ui — edit a row, rerun one preprocessing step, rerender.
two real bugs caught this session. the kie wrapper had a silent quality="basic" default that mapped to 2K resolution, ignoring the session's 1K config — combined with the requests session having no http timeout, that meant a bad-resolution request hung forever with no error. fixed by removing the default (now a required arg, hard typeerror if missing), adding a 60s request timeout, and writing a build_input_from_session() helper that reads session.json so future one-off scripts can't drift from the project standard. then ate 30 minutes thinking the wrapper was still broken — turned out i was piping its output through | head -30 which buffers until upstream exits, killing three working processes assuming hang. the bug was mine; codified the anti-pattern in rules.md.
rules got teeth this session. previous behavior was: when a user ask contradicted a documented rule, the rule got silently rewritten to match the new ask — which meant rules were just snapshots of the most recent decision. fixed with a rule-conflict protocol in rules.md: surface the conflict explicitly with options (update / one-off / keep) before changing anything. also added publishing-rules.md after generating a thumbnail that sold the wrong hook — the actual hook lives in the voiceover script, not the chunk descriptions, and you have to read the whole thing before titling. parameterized canvas dimensions on the remotion side too, so a future 9:16 mobile session works without code changes.