Imported from lebobo88/RLM-Creative (
.claude/skills/shot-list-protocol/SKILL.md). Install upstream withnpx skills add lebobo88/RLM-Creative --skill shot-list-protocol. Copyright stays with the author.
Shot List Protocol
Helios's working document for translating a CreativeBrief into a renderable ShotList. Every visual asset traces back to a shot entry.
Purpose
Produce a ShotList envelope that satisfies the Hydra schema, follows channel-appropriate pacing, and gives downstream generation tools (comfyui, video-synth, gemini-image) unambiguous direction.
When to use
/photo-directionis invoked./creative-campaignreaches the visual-direction phase and Helios needs to fan out renders.- An asset fails QC and a re-shot/re-render needs a refreshed entry.
Envelope schema (Hydra hydra_core/schemas.py:Shot)
Each shot:
shot_id—sh-{seq:03}within a list (e.g.sh-001,sh-002)description— one sentence, action-first, subject-secondcamera_angle— one ofwide,closeup,medium,aerial,povfocal_length_mm— integer; see lens grammar belowduration_sec— float; only for motion shots, omit for stillslighting_notes— concise: key, fill, rim, practicals, time-of-day, mood ref
The enclosing ShotList envelope adds: type: "ShotList", campaign_id, shots: [Shot], target_channel, aspect_ratio, total_runtime_sec.
Inputs
- Active
CreativeBrief(objective, key_messages, channels, brand_constraints) - Optional mood references from
eights.memory.recall(tags=["shot-library"])
Outputs
ShotListJSON written viarlm.output.writetoRLM/output/photo/{campaign_id}-shotlist-{date}.json- One or more
AssetJobenvelopes derived from the list, dispatched to comfyui / video-synth / gemini-image
Camera angle grammar
- wide — establishes geography; subject occupies < 25% of frame; use to orient
- medium — subject from waist or hip up; conversational; default for product-in-context
- closeup — subject from shoulders up, or product macro; emotional or detail beat
- aerial — top-down or high-angle drone perspective; scale, scope, pattern
- pov — first-person; immersive, used sparingly; pairs with hand-held motion
Lens / focal-length grammar (full-frame equivalent)
| mm | Use |
|---|---|
| 14-24 | Ultra-wide; environment, architecture, immersive POV; distortion warning |
| 28-35 | Reportage / documentary; wide-medium; lifestyle in context |
| 50 | Normal lens; matches human perspective; honest portraiture |
| 85 | Classic portrait; flattering compression; soft background separation |
| 100-135 | Tight portrait, beauty, product macro |
| 200+ | Telephoto compression; isolated subject, sports, candid |
| Macro (any mm with macro mode) | 1:1 or closer; product details, textures |
Anamorphic: prefix with anamorphic- and the squeezed FF-equivalent (e.g. anamorphic-40).
Pacing rules per channel
Total runtime caps and cut cadence:
| Channel | Max runtime | Cut cadence | Aspect | Safe area notes |
|---|---|---|---|---|
| TikTok | <= 30s (sweet spot 9-21s) | every 1.5-3s in first 6s; then 2-4s | 9:16 | Top 15% / bottom 20% UI overlay |
| Instagram Reel | <= 90s (sweet spot 15-45s) | every 2-4s | 9:16 | Caption-safe bottom 18% |
| Instagram Feed video | <= 60s | every 2-5s | 4:5 or 1:1 | |
| YouTube Shorts | <= 60s | every 2-4s | 9:16 | |
| YouTube standard | no hard cap; ad-cut every 7-12s | varies by genre | 16:9 (4K master) | |
| X / Twitter | <= 140s (sweet spot 30s) | 2-4s | 16:9 or 1:1 | Autoplay muted; first frame must read |
| <= 10 min (sweet spot 30-90s) | 3-6s | 16:9 or 1:1 | ||
| Threads | <= 5 min (sweet spot 15-30s) | 2-4s | 9:16 or 1:1 | |
| Broadcast TVC | :15 / :30 / :60 exact | per board | 16:9 | Title-safe 90%, action-safe 93% |
| OOH digital | 6-15s loop | static-feeling | varies | Legibility at distance |
Hook rule: the first shot MUST land the core key_message visually within the first 3 seconds for short-form social, first 2 seconds for TikTok.
Rule of thumb: shots/min = 60 / average_cut_seconds. Hand-edit if narrative beats demand longer holds.
Procedure
- Read the
CreativeBrief. Identify whichkey_messagesmap to visual beats vs copy beats. - Pull mood + reference shots from
eights.memory.recall(tags=["shot-library"], k=12). - Draft 6-12 shots (longer for broadcast; 4-8 for short-form social).
- For each shot: pick angle, focal length, duration, lighting; populate
lighting_notesusingcolor-sciencemood entries. - Validate:
shot_idsequence is contiguous; totalduration_sec<= channel cap; first 3 seconds carry the hook. - Emit
ShotListenvelope; derive anAssetJobper shot tagged with the destination workflow recipe (seecomfyui-workflow-recipes). - Hand off to Helios sub-crew for render; await
brand-safetyandcolor-sciencechecks before sign-off.
Validation checklist
- Every shot has all six required fields populated
-
camera_angleis from the controlled vocabulary -
focal_length_mmis a positive integer -
duration_secis omitted for stills; present for motion - Sum of
duration_sec<= channel max runtime - First-3s hook is identified and labeled
-
aspect_ratiomatchestarget_channel - No two adjacent shots share identical
camera_angleANDfocal_length_mmunless intentional (a held beat)
Failure modes / escalation
- Total runtime exceeds channel cap — trim, or split into multi-cut campaign; do NOT emit over-cap.
- A shot requires a real person's likeness — route through
brand-safetyIP-clearance before render. - Workflow recipe unavailable for an asset kind — escalate to Helios; consider adding a new recipe (procedural resource, low-risk class).
References
- Schema:
hydra_core/schemas.pyin the Hydra repository (Shot,ShotList) - Mood + grade:
color-science - Render:
comfyui-workflow-recipes