efe021d886
The Painter composites exactly plan.entryActiveCharacters into the entry frame (the same roster the Cinematographer framed). Phase B is told to reuse that roster, but only the entry beat's id was code-enforced — so an LLM slip could leave a character in the painted frame that the runtime entry beat says isn't there. Pin activeCharacters onto the plan's entry beat as a last line of defense, mirroring the existing id pin. Speaker is intentionally left to the prompt: it's coupled to line/TTS, so overwriting it could mis-attribute or orphan Phase B's dialogue. Addresses Copilot review feedback on PR #27. Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>