Wire selection into ReelStudio.generate() | Build fresh; separate the demo path |
The real user flow never calls generate(). The design doc named the wrong function, so the error was inherited |
| Rank moments with a Swift heuristic, assign greedily, one clip per slot | One director call over every moment |
A ruleset can only avoid defects; nothing in the pipeline ever saw the whole trip; and one-clip-per-slot caps creativity by construction |
| Director resolves in-points; resolver re-asks it on failure | Editor owns timing and repairs locally |
An LLM round-trip inside composition would fire on every preview rebuild, and preview and export could settle differently |
| Score beats on speech and dialogue | Penalise speech; split it from on-screen text |
The render discards all source audio. The rule selected silent talking heads, and conflated a station sign with talking |
| 3–8 beats covering the whole clip | Moments scaled to content, highlights nested |
Measured: max beat 55s, 14 of 50 over 10s, 11.9s gaps, one zero-length beat. The cap was merging distinct events |
| Cap frames at 16 per clip | Sample at 1 frame / 2s, uncapped |
A flat cap gives 11.9s spacing on a 179s clip. Uncapped costs four cents more and buys a uniform guarantee |
| Shrink frames to save money | Frame size is a bandwidth decision |
Measured flat at 1,070 tokens/frame from 384px to native 1080p. No cost lever exists |
| Stretch or freeze a clip that is too short | Ineligible, filtered before the director runs |
Slowed handheld looks bad and a freeze reads as a bug. With 10× supply a forced fit is never necessary |
| Annotate the template with rhythm phases | The director infers rhythm and returns an arc |
Only ~4 structural facts are unambiguous; the right reading depends on the footage, so precomputing freezes one across every trip |
| Show a progress bar for the indexing wait | Move indexing off the critical path |
The answer to a long wait is not to have it in front of the user |