Stage 2 of the five-stage pipeline. The selector takes a beat, writes five queries, fetches candidate stills from the source article, ranks them against the hero reference, and picks the highest-scoring candidate within the reject rules. Every step has a measured cost and a rule that closes one class of failures.
For each beat in the audio, the selector pulls candidate stills from the source article and ranks them against the locked hero reference. Highest score wins, subject to the reject rules. The hero reference is held out of the active run, so the calibration is not contaminated.
Identical queries across needs put the same 50 jpgs in every folder. The selector dedups globally, so half the needs see nothing. Five queries per need, character name first, plus a per-need verb:
Every candidate gets scored against the locked hero reference frame using cosine similarity. Highest score wins, subject to the reject rules.
A blanket rule like "no Kanao" or "no romance" rejected the wrong needs - the very need where the forbidden character IS the subject, or where romance IS the subject. Every NEVER names its beat. Hard character constraints stay absolute but the constraint is per-beat, not global:
Pixel review must be at full 1080×1920. Two rejects of 23 shots were false positives at 640px thumbnail - at full resolution they passed cleanly. Confirm any "wrong character" call by opening the source PNG.
The EP_MUSASHI contact sheet shows 19 frames, each captioned with the line the narrator says during that shot and the timestamp window. Same data the build pipeline used to generate the MP4, rendered as a single page so a brand can verify each shot independently against the source.
The first build of the Musashi episode had the right 19 frames for the right 19 lines, but the stills were 5.16 seconds shorter than the audio. The builder rescaled every shot to fit, and the pictures walked ahead of the captions until they were 2.7 seconds out by the end of the video. 7 of 19 shots showed the wrong picture under the caption.
The fix: each shot is given the pause in front of it, so the builder anchors every boundary to the words rather than to the spoken-span-only. After the fix, the same 19 frames against the same audio produced a clean gate with zero defects.
The contact-sheet rules on this page are what prevent the drift from happening in the first place. The drift fix is the recovery path when it does.
Subject carries the claim, not the title pattern. Across 1,297 videos measured against the channel median, the patterns that lift on every channel are:
| Pattern | Lift | Note |
|---|---|---|
| STRONGEST | 1.65x to 4.12x | Across channels |
| WHY | 6.77x on dark history | Per-channel, not universal |
| NUMBERED | 8.24x | 51 videos measured |
| STORY | 3.65x | 24 videos measured |
| TRUTH | 0.29x | Do not use on this channel |
| SHOCK (INSANE / BROKEN / CRAZY) | 0.13x | Underperforms |
| BACKSTORY / TRAGEDY | 0.09x to 0.78x | Underperforms everywhere |
These are per-channel medians against the channel median. The pooled-median math that suggested "STRONGEST = 1.65x" hides the truth: STRONGEST is the only pattern that lifts on every channel measured. Pick on the ratio, not on intuition.
These are the rules that belong specifically to Stage 2. The other three live on the main workflow page.
Identical queries put the same 50 jpgs in every folder; the selector dedups globally, so half the needs see nothing.
$1.50 saved per rebuild"No Kanao" rejected the very need whose line is "Then he met Kanao." Constraints are per-beat, not global.
~25min saved per re-SELECTSix frames passed at 640px and failed at full resolution. Confirm any "wrong character" call by opening the source PNG.
6 frames caught