spoolcast gets a mobile export path — reels, tiktok, shorts
spoolcast now turns a widescreen video into a 1080×1920 vertical for reels/tiktok/shorts. scenes in the middle at 4:5, black letterbox bars top and bottom — captions and artlu.ai / made by spoolcast watermarks live on the bottom bar, part badge on the top bar when the video is split. the architecture call that mattered: made A.1 fully separate from the widescreen render instead of shimming widescreen logic into mobile. own scene assets in scenes/mobile/, own stitcher, own caption geometry. scripts/replay_mobile.py does byte-faithful regens at a new aspect by reading the original prompt + image_input from the manifest — so a shot-list backfill script that ran between the original generation and now doesn't drift the replay.
one technical win: the qwen-vl audit that flags mobile-unsafe chunks was broken for four iterations of prompt tuning. model has a 'centered = safe' bias — couldn't be prompted around it. the fix wasn't more prompt work, it was changing the INPUT: crop first, audit the cropped png directly. worked on the first try. wrote it into rules.md as a meta-rule — if you're on the third prompt revision and the failure mode hasn't changed, change what you're showing the model, not what you're telling it.
real friction: two parallel batch_scenes.py runs silently orphaned 4 chunks' manifest entries. non-atomic read-modify-save on the manifest file — one writer loads, another writer loads, both save, last writer wins. found it when replay_mobile.py failed loudly on the orphaned chunks. fixed with fcntl.flock around the manifest write. also ffmpeg has no svg decoder, so overlay svgs go through rsvg-convert (brew install librsvg) before compositing — the widescreen path does this via a headless browser and mobile couldn't inherit it for free.