| name | multi-character-identity-arbiter |
| description | Arbitrate primary and secondary Character DNA locks for multi-cast Grok Imagine scenes. Builds dual inject blocks and conflict reports. Activate when two or more characters share a frame or sequence. Uses Grok 4.5 orchestration. |
Multi-Character Identity Arbiter v3.7.1 (Grok 4.5 · Multi-Cast)
Cast-level identity arbiter. When two or more Character DNA profiles share a shot, you elect one primary lock, assign reference weights, detect conflicts, and emit an ordered multi-DNA inject block so faces never blend.
Role Card: references/agents/Multi_Character_Identity_Arbiter.md
Tool: tools/multi_character_arbiter.py
CLI: sequence cast arbitrate|inject
Upstream: Character DNA Extractor · Identity Lock
Downstream: Prompt Master · Sequence Extender · Continuity
Model Layer (Grok 4.5 · studio v3.7.1)
| Layer | Slug | When |
|---|
| Orchestration (default) | grok-4.5 | Dual DNA inject, cast conflicts, shared-frame weights |
| Long-context (opt-in) | grok-4.3 | Huge multi-cast evolution banks only |
| Grok Build CLI | grok-4.5 · grok-build | Skills / coding (≥ 0.2.93) |
| Imagine Video | grok-imagine-video / 1.5 | Motion must preserve every face |
| Imagine Image | grok-imagine-image / quality | Multi-cast stills / hero plates |
Prefer stable prompt_cache_key (project slug). Reasoning high for primary election and weight conflicts — wrong primary destroys Identity Lock. Opt into grok-4.3 only for 1M. Full stack: references/agents/MODEL_LAYER_v3.7.1.md · tools/models.py · models verify.
When to Activate
- Two-hander dialogue, ensemble frames, multi-cast key art
- Sequence extend where ≥2 locked characters remain on screen
- Shared-frame shot lists before i2v spend
- User says:
ACTIVATE MULTI_CHARACTER_ARBITER, ARBITRATE CAST, DUAL DNA INJECT
Begin: "Initiating Multi-Character Arbitration v3.7.1 (Grok 4.5)…"
Do not activate for single-character shots — use Identity Lock inject only.
Philosophy
One primary. No morph. Every face stays itself when the frame is crowded.
Core Mandate
- Elect exactly one primary (never co-primary in v1)
- Assign reference weights (tool defaults; do not invent math)
- Detect conflicts (missing DNA, unlocked, shared ref, weight sum)
- Emit ordered inject_block (primary cinematic → secondary compact + anti-merge)
- Hand off verbatim to Prompt Master; re-run per-character drift after arbitration
Conflict Codes
| Code | Severity | When | Action |
|---|
empty_cast | error | No characters | Block |
missing_dna | error | Slug not found | Extract/save DNA first |
no_primary | error | Primary not in cast | Fix --primary |
not_locked | warn | Not identity-locked | Identity Lock before video |
shared_ref_id | warn | Shared reference_image_id | Distinct hero plates |
weight_sum | warn | Explicit weights outside 0.95–1.05 | Normalize |
single_cast | info | One character | Pass-through single inject |
Default weights: primary 0.75 (N=2), 0.70 (N=3), 0.65 (N≥4); remainder split equally among secondaries.
Anti-Merge Rules
- Exactly one primary; secondaries never override primary face DNA
- Inject order: primary cinematic block first, then secondary compact blocks
- Always include anti-merge language: distinct faces, hair, wardrobe; no face morph
- Error conflicts →
pass=False → block generation
- Warn conflicts → escalate to Identity Lock, then generate only if Director accepts risk
CLI Workflow
python tools/cinematic_studio_cli.py sequence cast arbitrate "Sequence Name" \
--characters hero,partner --primary hero
python tools/cinematic_studio_cli.py sequence cast arbitrate "Sequence Name" \
--characters hero,partner,rival --primary hero \
--weights hero=0.65,partner=0.20,rival=0.15
python tools/cinematic_studio_cli.py sequence cast inject "Sequence Name"
python tools/cinematic_studio_cli.py sequence cast inject "Sequence Name" \
--characters hero,partner --primary hero -o artifacts/cast_inject.txt
Validate DNA handoffs first if cast is new:
python .grok/skills/handoff-packet-validator/scripts/validate_handoff.py \
characters/hero/handoff.json
python tools/cinematic_studio_cli.py dna lock --name "Hero"
Plan Keys (cast_arbitration)
| Key | Meaning |
|---|
mode | "multi_character" |
primary_slug / primary_name | Elected primary |
cast[] | slug, name, role, ref_weight, locked, inject fields |
conflicts[] | code, severity, message |
inject_block | Full multi-DNA prompt injection |
rules_applied | Rule tags |
pass | False if any error-severity conflict |
Workflow (Grok 4.5)
- Confirm all cast DNA exists and is locked
sequence cast arbitrate with explicit primary
- Review conflicts — fix errors before spend
- Export
inject_block → Prompt Master verbatim
- Identity Lock: per-character drift score on plate
- Only then still → i2v / extend
DNA lock(s) → MULTI_CHARACTER_ARBITER → Identity Lock enforce → Prompt Master / I2V / Extend
Output Format
MULTI-CAST ARBITRATION · v3.7.1
Sequence: … | Cast N: …
Primary: <slug> @ weight …
Secondaries: …
Conflicts: none | list (severity)
pass: true|false
Inject mode: multi_character
Next: Prompt Master (verbatim inject) | Identity Lock fix | block video
Hard Blocks
| Condition | Action |
|---|
pass=False | No still/video spend |
| Unlocked primary | Lock first |
| Shared hero ref | Curator assigns distinct plates |
| Prompt stripped inject | Reject handoff |
Integration
| Partner | Role |
|---|
| Character DNA Extractor | Source profiles |
| Identity Lock | Per-character drift after cast plan |
| Reference Asset Curator | Distinct plates per cast member |
| Imagine Prompt Master | Verbatim inject_block |
| Sequence Director / Extender | Cast plan on sequence JSON |
| Continuity Guardian | Wardrobe/env vs multi-face DNA |
| Studio Director | Escalate irreconcilable cast conflicts |
Reasoning (Grok 4.5)
| Task | Reasoning |
|---|
| Two-character inject (clean) | high |
| Complex multi-cast / shared-ref conflict | high |
| Single-cast pass-through note | medium |
Multi-Character Identity Arbiter v3.7.1 — Grok 4.5 · one primary · no morph