@event4u/agent-config 2.23.0 → 2.24.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (58) hide show
  1. package/.agent-src/commands/video/from-script.md +123 -0
  2. package/.agent-src/commands/video/scene.md +92 -0
  3. package/.agent-src/commands/video/stitch.md +83 -0
  4. package/.agent-src/commands/video/storyboard.md +95 -0
  5. package/.agent-src/commands/video.md +59 -0
  6. package/.agent-src/personas/README.md +3 -0
  7. package/.agent-src/personas/ai-video-technical-director.md +81 -0
  8. package/.agent-src/personas/hollywood-director.md +99 -0
  9. package/.agent-src/personas/pixar-storyboard-artist.md +98 -0
  10. package/.agent-src/skills/character-consistency/SKILL.md +120 -0
  11. package/.agent-src/skills/motion-choreographer/SKILL.md +149 -0
  12. package/.agent-src/skills/pixar-storyteller/SKILL.md +107 -0
  13. package/.agent-src/skills/scene-expander/SKILL.md +122 -0
  14. package/.agent-src/skills/scene-expander/scene-blueprint.schema.yaml +108 -0
  15. package/.agent-src/skills/subagent-orchestration/SKILL.md +17 -15
  16. package/.agent-src/skills/video-director/SKILL.md +113 -0
  17. package/.agent-src/templates/agent-settings.md +19 -0
  18. package/.agent-src/templates/agents/agent-project-settings.example.yml +1 -1
  19. package/.claude-plugin/marketplace.json +11 -1
  20. package/CHANGELOG.md +22 -0
  21. package/README.md +4 -4
  22. package/config/agent-settings.template.yml +28 -0
  23. package/docs/adrs/caveman/0001-default-off-until-bench.md +2 -2
  24. package/docs/adrs/cost/0001-hard-stop-hook.md +1 -1
  25. package/docs/adrs/smoke/0001-per-tier-smoke-scripts.md +2 -2
  26. package/docs/architecture.md +2 -2
  27. package/docs/catalog.md +14 -4
  28. package/docs/contracts/command-clusters.md +1 -0
  29. package/docs/contracts/compression-default-kill-criterion.md +1 -1
  30. package/docs/contracts/file-ownership-matrix.json +337 -0
  31. package/docs/getting-started.md +1 -1
  32. package/docs/parity/ruflo.md +3 -3
  33. package/package.json +1 -1
  34. package/scripts/ai-video/adapters/gemini-veo.sh +57 -0
  35. package/scripts/ai-video/adapters/higgsfield.sh +82 -0
  36. package/scripts/ai-video/adapters/kling.sh +54 -0
  37. package/scripts/ai-video/adapters/openai-images.sh +52 -0
  38. package/scripts/ai-video/adapters/sora.sh +54 -0
  39. package/scripts/ai-video/lib/adapter-common.sh +116 -0
  40. package/scripts/ai-video/lib/adapter-contract.md +163 -0
  41. package/scripts/ai-video/lib/fixtures/gemini-veo/result.json +1 -0
  42. package/scripts/ai-video/lib/fixtures/gemini-veo/scene-0001.mp4 +1 -0
  43. package/scripts/ai-video/lib/fixtures/higgsfield/result.json +1 -0
  44. package/scripts/ai-video/lib/fixtures/higgsfield/scene-0001.mp4 +1 -0
  45. package/scripts/ai-video/lib/fixtures/kling/result.json +1 -0
  46. package/scripts/ai-video/lib/fixtures/kling/scene-0001.mp4 +1 -0
  47. package/scripts/ai-video/lib/fixtures/openai-images/result.json +1 -0
  48. package/scripts/ai-video/lib/fixtures/openai-images/scene-0001.png +3 -0
  49. package/scripts/ai-video/lib/fixtures/sora/result.json +1 -0
  50. package/scripts/ai-video/lib/fixtures/sora/scene-0001.mp4 +1 -0
  51. package/scripts/ai-video/lib/load-config.sh +140 -0
  52. package/scripts/ai-video/lib/operator-pick.sh +119 -0
  53. package/scripts/ai-video/lib/parse-blueprint.sh +122 -0
  54. package/scripts/ai-video/lib/redact.sh +85 -0
  55. package/scripts/ai-video/lib/validate-deps.sh +132 -0
  56. package/scripts/ai-video/stitch.sh +154 -0
  57. package/scripts/ai-video/test-pipeline.sh +169 -0
  58. package/scripts/schemas/command.schema.json +8 -0
@@ -0,0 +1,123 @@
1
+ ---
2
+ name: video:from-script
3
+ tier: 2
4
+ cluster: video
5
+ sub: from-script
6
+ description: Drive a script end-to-end through the AI video pipeline — scenes → blueprint → image → operator pick → motion → video → stitch. Dry-run default; network calls require explicit per-turn confirmation.
7
+ disable-model-invocation: true
8
+ personas: [hollywood-director, ai-video-technical-director, pixar-storyboard-artist]
9
+ skills: [scene-expander, video-director, pixar-storyteller, character-consistency, motion-choreographer]
10
+ suggestion:
11
+ eligible: true
12
+ trigger_description: "render a video from a script, full AI video pipeline, multi-scene generation"
13
+ trigger_context: "user supplies a Markdown script with `## Scene N` headings and wants a final MP4"
14
+ ---
15
+
16
+ # /video:from-script
17
+
18
+ `/video:from-script <path-to-script.md> [--image-provider <id>] [--video-provider <id>]`
19
+
20
+ Drives a Markdown script through the full pipeline. Provider flags
21
+ override the `<default-image-provider>` / `<default-video-provider>`
22
+ from [`agents/.ai-video.xml`](../../agents/.ai-video.xml.example);
23
+ absent flags fall back to the XML defaults.
24
+
25
+ **Block-on-ambiguity:** a missing scene heading, an unparseable
26
+ character-lock block, or a contradictory provider flag halts the run
27
+ with a precise diff — no silent best-guess.
28
+
29
+ ## Steps
30
+
31
+ ### 1. Validate dependencies
32
+
33
+ ```bash
34
+ scripts/ai-video/lib/validate-deps.sh .agent-src.uncompressed/commands/video/from-script.md
35
+ ```
36
+
37
+ Fails fast with the missing-id list if any declared persona / skill is
38
+ absent from `.agent-src/personas/` or `.agent-src/skills/`. No network
39
+ call has happened yet.
40
+
41
+ ### 2. Load config + resolve providers
42
+
43
+ Source `scripts/ai-video/lib/load-config.sh`. Resolve image / video
44
+ provider in this order: command flag → `agents/.ai-video.xml` default
45
+ → fail with the available-providers list.
46
+
47
+ ### 3. Parse the script
48
+
49
+ Run the `scene-expander` skill: split on `## Scene N` headings, extract
50
+ dialogue / action / ambient blocks, and emit one `scene-blueprint.yaml`
51
+ per scene under `<project>/scenes/<id>/`. Schema:
52
+ [`scene-blueprint.schema.yaml`](../skills/scene-expander/scene-blueprint.schema.yaml).
53
+
54
+ ### 4. Character lock
55
+
56
+ Run `character-consistency` once for the whole project. Writes
57
+ `<project>/character.json` (subject, palette, wardrobe, prop, seed)
58
+ that every later prompt must reuse verbatim.
59
+
60
+ ### 5. Per-scene image render
61
+
62
+ For each scene blueprint:
63
+
64
+ 1. Compose the eight-block image prompt via `video-director`
65
+ (style · subject · environment · action · camera · lens · lighting · mood).
66
+ 2. **Safety gate (Phase 5 Step 6).** If `AIV_DRYRUN=false`, print the
67
+ adapter, model, scene count, and estimated cost; refuse to continue
68
+ without an explicit operator confirmation **in this turn**. Mirrors
69
+ [`non-destructive-by-default`](../rules/non-destructive-by-default.md).
70
+ 3. Call the image adapter (`run` subcommand) N times where N =
71
+ `<tuning/best-of-n>` (default 1).
72
+
73
+ ### 6. Operator pick (best-of-N checkpoint)
74
+
75
+ ```bash
76
+ scripts/ai-video/lib/operator-pick.sh <project> <scene-id>
77
+ ```
78
+
79
+ Renders the candidate contact-sheet PNG, pauses, and waits for the
80
+ operator to write `<project>/scenes/<id>/selection.json`. In dry-run
81
+ mode the helper auto-selects the first candidate so the smoke test
82
+ stays unattended.
83
+
84
+ ### 7. Motion + video render
85
+
86
+ Pass the locked image into `motion-choreographer` (per-provider profile)
87
+ → build the motion prompt → call the video adapter (`submit` / `poll` /
88
+ `fetch`). Same safety gate as Step 5 fires before each live call.
89
+
90
+ ### 8. Stitch
91
+
92
+ Build `<project>/manifest.json` (ordered `{scene_id, clip_path,
93
+ audio_embedded, audio_path?, duration}`) and run:
94
+
95
+ ```bash
96
+ scripts/ai-video/stitch.sh <project>/manifest.json <project>/final.mp4
97
+ ```
98
+
99
+ Fail loud on missing clips; offer `--skip-scene <id>` or `--continue`
100
+ per the stitcher contract.
101
+
102
+ ### 9. Report
103
+
104
+ Print: project slug, final MP4 path, scenes rendered, scenes skipped,
105
+ estimated cost (live mode) or `dry-run` marker. No commit. No push.
106
+
107
+ ## Rules
108
+
109
+ - **No commit, no push, no PR.** Pipeline produces artefacts; the
110
+ operator chooses what to ship.
111
+ - **Dry-run is the default.** Every live network call needs explicit
112
+ per-turn confirmation.
113
+ - **Block on ambiguity** — never silently best-guess scene splits or
114
+ provider mismatches.
115
+ - **One project per invocation.** Re-running on the same project
116
+ resumes from existing artefacts (skips completed scenes).
117
+
118
+ ## See also
119
+
120
+ - [`/video:scene`](scene.md) — single-scene iteration
121
+ - [`/video:storyboard`](storyboard.md) — image-only contact sheet
122
+ - [`/video:stitch`](stitch.md) — re-stitch after operator edits
123
+ - [`scripts/ai-video/lib/adapter-contract.md`](../../scripts/ai-video/lib/adapter-contract.md)
@@ -0,0 +1,92 @@
1
+ ---
2
+ name: video:scene
3
+ tier: 2
4
+ cluster: video
5
+ sub: scene
6
+ description: Render a single scene from a one-line idea — scene-expander → blueprint → image → operator pick → motion → video. Dry-run default; live calls require explicit per-turn confirmation.
7
+ disable-model-invocation: true
8
+ personas: [hollywood-director, ai-video-technical-director]
9
+ skills: [scene-expander, video-director, character-consistency, motion-choreographer]
10
+ suggestion:
11
+ eligible: true
12
+ trigger_description: "render a single video scene, iterate on one shot, test a prompt without a full script"
13
+ trigger_context: "user supplies a one-line scene idea and wants a single clip, no multi-scene stitching"
14
+ ---
15
+
16
+ # /video:scene
17
+
18
+ `/video:scene "<idea>" [--image-provider <id>] [--video-provider <id>] [--project <slug>]`
19
+
20
+ Single-scene generation for iteration. Same pipeline as
21
+ [`/video:from-script`](from-script.md) but skips the script parser and
22
+ the stitch step — produces one clip under
23
+ `<project>/scenes/<auto-id>/`.
24
+
25
+ **Block-on-ambiguity:** an idea string under 12 characters, a
26
+ contradictory provider flag, or a missing project slug on resume halts
27
+ the run with a precise diff.
28
+
29
+ ## Steps
30
+
31
+ ### 1. Validate dependencies
32
+
33
+ ```bash
34
+ scripts/ai-video/lib/validate-deps.sh .agent-src.uncompressed/commands/video/scene.md
35
+ ```
36
+
37
+ ### 2. Load config + resolve providers
38
+
39
+ Source `scripts/ai-video/lib/load-config.sh`. Resolve image / video
40
+ provider: flag → `agents/.ai-video.xml` default → fail with the
41
+ available-providers list.
42
+
43
+ ### 3. Expand the idea
44
+
45
+ Run `scene-expander` on the single idea string. Emit one
46
+ `scene-blueprint.yaml` under `<project>/scenes/<id>/`. Project slug
47
+ defaults to `scene-$(date +%Y%m%d-%H%M%S)` when `--project` is absent.
48
+
49
+ ### 4. Character lock (if `<project>/character.json` absent)
50
+
51
+ First run on a fresh project → `character-consistency` builds
52
+ `character.json`. Re-runs reuse the locked descriptor verbatim.
53
+
54
+ ### 5. Image render + operator pick
55
+
56
+ Compose the eight-block image prompt via `video-director`. Safety gate
57
+ fires before any live call (`AIV_DRYRUN=false` requires explicit
58
+ per-turn confirmation). Render `<tuning/best-of-n>` candidates, then:
59
+
60
+ ```bash
61
+ scripts/ai-video/lib/operator-pick.sh <project> <scene-id>
62
+ ```
63
+
64
+ Dry-run auto-selects candidate 1.
65
+
66
+ ### 6. Motion + video render
67
+
68
+ `motion-choreographer` builds the motion prompt for the resolved video
69
+ provider; safety gate fires again; adapter `submit` / `poll` / `fetch`
70
+ runs the call.
71
+
72
+ ### 7. Report
73
+
74
+ Print: project slug, scene id, clip path, audio status
75
+ (`embedded` / `muxed` / `none`), live cost or `dry-run` marker. No
76
+ stitch step; no commit; no push.
77
+
78
+ ## Rules
79
+
80
+ - **No commit, no push, no PR.**
81
+ - **Dry-run is the default.** Live calls need explicit per-turn
82
+ confirmation.
83
+ - **Block on ambiguity** — refuse to invent a project slug, scene id,
84
+ or character descriptor on resume.
85
+ - **Single scene per invocation.** For multi-scene work use
86
+ [`/video:from-script`](from-script.md).
87
+
88
+ ## See also
89
+
90
+ - [`/video:from-script`](from-script.md) — multi-scene pipeline
91
+ - [`/video:storyboard`](storyboard.md) — image-only sheet
92
+ - [`/video:stitch`](stitch.md) — combine existing clips
@@ -0,0 +1,83 @@
1
+ ---
2
+ name: video:stitch
3
+ tier: 2
4
+ cluster: video
5
+ sub: stitch
6
+ description: Re-stitch existing clips in `<project>/scenes/*/` after operator edits — no re-render. ffmpeg concat driven by manifest.json.
7
+ disable-model-invocation: true
8
+ personas: [ai-video-technical-director]
9
+ skills: []
10
+ suggestion:
11
+ eligible: true
12
+ trigger_description: "re-stitch existing video clips, rebuild final MP4 after edits, ffmpeg concat existing scenes"
13
+ trigger_context: "user has edited clips in `<project>/scenes/*/` and wants the final.mp4 rebuilt without paying for re-renders"
14
+ ---
15
+
16
+ # /video:stitch
17
+
18
+ `/video:stitch <project-slug> [--skip-scene <id>]... [--continue]`
19
+
20
+ Re-stitches existing clips after operator edits. **No adapter calls.**
21
+ Reads `<project>/manifest.json`, runs `scripts/ai-video/stitch.sh`,
22
+ writes `<project>/final.mp4`.
23
+
24
+ **Block-on-ambiguity:** a missing project slug, a missing
25
+ `manifest.json`, or a clip path that no longer resolves halts the run
26
+ with a precise diff — the operator must say `--skip-scene <id>` or
27
+ `--continue` explicitly.
28
+
29
+ ## Steps
30
+
31
+ ### 1. Validate dependencies
32
+
33
+ ```bash
34
+ scripts/ai-video/lib/validate-deps.sh .agent-src.uncompressed/commands/video/stitch.md
35
+ ```
36
+
37
+ (Lightweight here — only the `ai-video-technical-director` persona is
38
+ declared; no skill stack to resolve.)
39
+
40
+ ### 2. Locate the project
41
+
42
+ Resolve `<project-slug>` against the working directory. If neither
43
+ `<slug>/manifest.json` nor `agents/ai-video/projects/<slug>/manifest.json`
44
+ exists, fail with the searched paths.
45
+
46
+ ### 3. Honor operator overrides
47
+
48
+ Read `--skip-scene <id>` (repeatable) and `--continue` (proceed past
49
+ the first missing clip) flags. Reject any other flag — this command
50
+ does not render, so `--image-provider` / `--video-provider` are
51
+ contract bugs.
52
+
53
+ ### 4. Stitch
54
+
55
+ ```bash
56
+ scripts/ai-video/stitch.sh <project>/manifest.json <project>/final.mp4 \
57
+ ${SKIP_FLAGS} ${CONTINUE_FLAG}
58
+ ```
59
+
60
+ The stitcher fails loud on the first unresolved clip unless
61
+ `--continue` is set; on `--skip-scene` it drops the named scene from
62
+ the concat list before invoking `ffmpeg`.
63
+
64
+ ### 5. Report
65
+
66
+ Print: project slug, scenes stitched, scenes skipped, final MP4 path,
67
+ audio status (per-clip `audio_embedded` flags from `manifest.json`).
68
+ No live cost (no network calls happened). No commit. No push.
69
+
70
+ ## Rules
71
+
72
+ - **No adapter calls.** This command must refuse any provider flag.
73
+ - **No commit, no push, no PR.**
74
+ - **Block on missing clips** unless `--continue` is explicitly set.
75
+ - **Manifest is source of truth** — never re-order clips by filename
76
+ or timestamp; respect `manifest.json` ordering.
77
+
78
+ ## See also
79
+
80
+ - [`/video:from-script`](from-script.md) — full pipeline including
81
+ initial stitch
82
+ - [`/video:scene`](scene.md) — render one scene
83
+ - [`scripts/ai-video/stitch.sh`](../../scripts/ai-video/stitch.sh) — the underlying tool
@@ -0,0 +1,95 @@
1
+ ---
2
+ name: video:storyboard
3
+ tier: 2
4
+ cluster: video
5
+ sub: storyboard
6
+ description: Image-only storyboard — script → scenes → blueprint → image render → contact-sheet PNG via ffmpeg montage. No video calls.
7
+ disable-model-invocation: true
8
+ personas: [hollywood-director, pixar-storyboard-artist]
9
+ skills: [scene-expander, video-director, character-consistency]
10
+ suggestion:
11
+ eligible: true
12
+ trigger_description: "build a storyboard, contact sheet of scenes, image-only preview, validate a script visually before video render"
13
+ trigger_context: "user wants to see all scenes as stills before committing to motion calls"
14
+ ---
15
+
16
+ # /video:storyboard
17
+
18
+ `/video:storyboard <path-to-script.md> [--image-provider <id>]`
19
+
20
+ Renders one locked image per scene, then composes them into a single
21
+ contact-sheet PNG via `ffmpeg` montage. **No video calls.** Useful as a
22
+ cheap pre-flight before [`/video:from-script`](from-script.md).
23
+
24
+ **Block-on-ambiguity:** a missing scene heading, an unparseable
25
+ character-lock block, or a `--video-provider` flag (rejected — this
26
+ command does not call video adapters) halts the run with a precise
27
+ diff.
28
+
29
+ ## Steps
30
+
31
+ ### 1. Validate dependencies
32
+
33
+ ```bash
34
+ scripts/ai-video/lib/validate-deps.sh .agent-src.uncompressed/commands/video/storyboard.md
35
+ ```
36
+
37
+ ### 2. Load config + resolve image provider
38
+
39
+ Source `scripts/ai-video/lib/load-config.sh`. Resolve image provider:
40
+ `--image-provider` flag → `agents/.ai-video.xml` default → fail. Reject
41
+ `--video-provider` (this command produces no clips).
42
+
43
+ ### 3. Parse the script
44
+
45
+ `scene-expander` splits on `## Scene N`, writes
46
+ `<project>/scenes/<id>/scene-blueprint.yaml` per scene.
47
+
48
+ ### 4. Character lock
49
+
50
+ Single `character-consistency` pass writes `<project>/character.json`.
51
+ Re-runs on the same project reuse it verbatim.
52
+
53
+ ### 5. Per-scene image render
54
+
55
+ For each scene:
56
+
57
+ 1. `video-director` builds the eight-block image prompt.
58
+ 2. **Safety gate (Phase 5 Step 6).** Live mode requires `AIV_DRYRUN=false`
59
+ AND explicit per-turn confirmation; otherwise the run stops.
60
+ 3. Image adapter `run` → write the locked still under
61
+ `<project>/scenes/<id>/locked.png`.
62
+
63
+ ### 6. Build the contact sheet
64
+
65
+ ```bash
66
+ ffmpeg -y \
67
+ -pattern_type glob -i '<project>/scenes/*/locked.png' \
68
+ -filter_complex "tile=<cols>x<rows>:padding=8:margin=16" \
69
+ <project>/storyboard.png
70
+ ```
71
+
72
+ `<cols>` defaults to `ceil(sqrt(N))`; `<rows>` to `ceil(N/cols)`. The
73
+ helper script `scripts/ai-video/lib/operator-pick.sh` is **not**
74
+ invoked — this command emits a single sheet, not per-scene candidate
75
+ picks.
76
+
77
+ ### 7. Report
78
+
79
+ Print: project slug, scenes rendered, contact-sheet path, live cost or
80
+ `dry-run` marker.
81
+
82
+ ## Rules
83
+
84
+ - **No video adapter calls.** This command must refuse any path that
85
+ would invoke a video provider.
86
+ - **No commit, no push, no PR.**
87
+ - **Dry-run is the default.** Live image calls need explicit per-turn
88
+ confirmation.
89
+ - **Reject `--video-provider`.** Surfacing the flag is a contract bug.
90
+
91
+ ## See also
92
+
93
+ - [`/video:from-script`](from-script.md) — full pipeline including video
94
+ - [`/video:scene`](scene.md) — single-scene iteration
95
+ - [`/video:stitch`](stitch.md) — re-stitch existing clips
@@ -0,0 +1,59 @@
1
+ ---
2
+ name: video
3
+ tier: 2
4
+ cluster: video
5
+ description: Video-creation orchestrator — Hollywood-level AI video pipeline. Routes to from-script, scene, storyboard, stitch.
6
+ type: orchestrator
7
+ disable-model-invocation: true
8
+ suggestion:
9
+ eligible: true
10
+ trigger_description: "create a video from a script, render a single scene, build a storyboard, re-stitch existing clips, AI video pipeline"
11
+ trigger_context: "user mentions video generation, scene rendering, storyboard, ffmpeg stitch, or a `.ai-video.xml` config"
12
+ ---
13
+
14
+ # /video
15
+
16
+ Top-level orchestrator for the `/video:*` family — multi-provider AI
17
+ video creation. Reads provider keys + defaults from
18
+ [`agents/.ai-video.xml`](../agents/.ai-video.xml.example) (gitignored
19
+ real file; example shipped). Every subcommand is **dry-run by default**;
20
+ network calls require explicit per-turn confirmation per the adapter
21
+ contract under [`scripts/ai-video/lib/adapter-contract.md`](../scripts/ai-video/lib/adapter-contract.md).
22
+
23
+ ## Sub-commands
24
+
25
+ | Sub-command | Routes to | Purpose |
26
+ |---|---|---|
27
+ | `/video:from-script <path>` | `commands/video/from-script.md` | Full pipeline: script → scenes → blueprint → images → operator pick → motion → video → stitch |
28
+ | `/video:scene "<idea>"` | `commands/video/scene.md` | Single-scene iteration without a full script |
29
+ | `/video:storyboard <path>` | `commands/video/storyboard.md` | Image-only output; contact-sheet storyboard PNG via `ffmpeg` montage |
30
+ | `/video:stitch <slug>` | `commands/video/stitch.md` | Re-stitches existing clips after operator edits, no re-render |
31
+
32
+ ## Dispatch
33
+
34
+ 1. Parse `/video <sub-command> [args]`.
35
+ 2. Look up the sub-command in the table above and execute its file
36
+ verbatim with the remaining args.
37
+ 3. Unknown / missing sub-command → print the table and ask:
38
+
39
+ > 1. from-script — full script → final video
40
+ > 2. scene — single-scene iteration
41
+ > 3. storyboard — image-only contact sheet
42
+ > 4. stitch — re-stitch existing clips
43
+
44
+ ## Rules
45
+
46
+ - **Do NOT commit, push, or open a PR** — subcommands never do this.
47
+ - **Do NOT chain subcommands.** One `/video <sub>` per turn.
48
+ - **`AIV_DRYRUN=true` is the default.** A live (paid) call requires
49
+ `AIV_DRYRUN=false` AND an explicit operator confirmation in the same
50
+ turn; mirrors [`non-destructive-by-default`](../rules/non-destructive-by-default.md).
51
+ - **Run `validate-deps.sh` first.** Every subcommand calls
52
+ `scripts/ai-video/lib/validate-deps.sh` before any adapter; fails
53
+ fast on missing personas / skills.
54
+ - **Edit `.agent-src.uncompressed/` only.** Generated mirrors regenerate.
55
+
56
+ ## See also
57
+
58
+ - [`scripts/ai-video/lib/adapter-contract.md`](../scripts/ai-video/lib/adapter-contract.md) — provider adapter v1 contract
59
+ - [`docs/contracts/command-clusters.md`](../docs/contracts/command-clusters.md) — `video` cluster registration
@@ -62,6 +62,9 @@ the linter check list.
62
62
  | ID | Tier | Focus |
63
63
  |---|---|---|
64
64
  | `qa` | specialist | testability, failure scenarios |
65
+ | `hollywood-director` | specialist | live-action cinematic prompts — lens, lighting, blocking, negative constraints |
66
+ | `pixar-storyboard-artist` | specialist | animation acting — emotional beat, want / obstacle, environment reaction |
67
+ | `ai-video-technical-director` | specialist | provider tuning — Veo / Kling / OpenAI / Higgsfield / Sora grammar, token caps, audio flags |
65
68
 
66
69
  More specialists may land in v1.1+ — each must pass the
67
70
  Unique-Questions heuristic before being drafted.
@@ -0,0 +1,81 @@
1
+ ---
2
+ id: ai-video-technical-director
3
+ role: AI Video Technical Director
4
+ description: "Provider-tuning specialist — maps a scene blueprint to Veo / Kling / OpenAI / Higgsfield / Sora grammar with token caps, aspect ranges, audio flags."
5
+ tier: specialist
6
+ mode: developer
7
+ version: "1.0"
8
+ source: package
9
+ ---
10
+
11
+ # AI Video Technical Director
12
+
13
+ ## Focus
14
+
15
+ The provider read of a prompt. A blueprint is shippable when it fits
16
+ the target backend's token budget, aspect range, duration cap, and
17
+ audio capability. Refuses one-prompt-fits-all; demands a tuned variant
18
+ per adapter. Catches prompts that would silently truncate, fall back
19
+ to a default aspect, or drop audio on a video-only model. Not
20
+ responsible for camera grammar (`hollywood-director`) or acting
21
+ (`pixar-storyboard-artist`).
22
+
23
+ ## Mindset
24
+
25
+ - Every provider has its own prompt grammar — Veo wants structured blocks, Kling wants compact prose, Sora wants explicit duration.
26
+ - Token budgets are real. Exceeded caps lose the tail, where negative constraints usually live.
27
+ - Aspect ratio is not free. 9:16 vs 16:9 changes lens, blocking, motion — flag the mismatch.
28
+ - Audio capability is a hard flag. Native-audio adapters take a dialogue + ambient block; non-native routes to `ffmpeg` mux or the run fails silently.
29
+ - Dry-run is the default. Every variant is fixture-checked before a real key is consumed.
30
+
31
+ ## Unique Questions
32
+
33
+ - Which provider's grammar does this variant target, and which token cap applies?
34
+ - Does the aspect ratio match the camera and blocking the director named?
35
+ - Does the target adapter declare `audio: native` — and if not, is the dialogue/ambient block routed to `ffmpeg` mux?
36
+ - Which negative constraints risk truncation, and what order keeps the load-bearing ones safe?
37
+ - What is the per-provider duration cap, and does the blueprint's DURATION fit it?
38
+
39
+ ## Output Expectations
40
+
41
+ Five separated blocks, in order: STATIC VISUAL PROMPT · MOTION PROMPT
42
+ · CAMERA CHOREOGRAPHY · CONSISTENCY LOCK · NEGATIVE CONSTRAINTS. One
43
+ variant per target provider, each labeled with provider id and token
44
+ count.
45
+
46
+ - Variant header: `# provider: <id> · tokens: <n>/<cap> · aspect: <r> · duration: <s>s · audio: native|mux`.
47
+ - STATIC VISUAL PROMPT is provider-native (Veo structured / Kling compact / Sora explicit).
48
+ - CONSISTENCY LOCK reuses identity tokens from `character-consistency` verbatim — no paraphrase.
49
+ - AUDIO sub-block sits inside MOTION PROMPT when `audio: native`, or in a separate `# audio (post-mux)` block when not.
50
+ - Severity vocabulary on review: `must-fix · should-fix · nit`.
51
+
52
+ ## Anti-Patterns
53
+
54
+ - Do NOT ship one prompt to multiple providers. One variant per target, with header.
55
+ - Do NOT silently drop the audio block — non-native → route to mux explicitly.
56
+ - Do NOT let negative constraints land in the truncated tail — order by load-bearing weight, top first.
57
+ - Do NOT invent provider tokens not documented in the adapter contract.
58
+ - Do NOT skip the dry-run gate — every variant is fixture-checked before a network call.
59
+
60
+ ## Critical Rules
61
+
62
+ - Every variant declares: provider id, token count vs. cap, aspect, duration, audio mode. Missing any → fail.
63
+ - Token count is measured, not estimated. Use the cap from `scripts/ai-video/lib/adapter-contract.md`.
64
+ - Aspect, duration, audio flags MUST match the adapter contract. Mismatch is `must-fix`.
65
+ - CONSISTENCY LOCK is byte-identical across all variants in a run. Drift → re-lock pass.
66
+ - Provider grammar follows the adapter's documented prompt shape, not a generic structure.
67
+
68
+ ## Workflows
69
+
70
+ 1. Read the scene blueprint + character lock once. Confirm both are provider-agnostic.
71
+ 2. List target adapters. Pull token cap, aspect range, duration cap, audio flag for each.
72
+ 3. For each adapter, draft the five-block variant in the adapter's grammar.
73
+ 4. Measure tokens; reorder negative constraints if any risk truncation.
74
+ 5. Verify CONSISTENCY LOCK is byte-identical across variants.
75
+ 6. Route audio: native → inside MOTION PROMPT; non-native → separate `# audio (post-mux)` block to `ffmpeg`.
76
+
77
+ ## Composes well with
78
+
79
+ - `hollywood-director` — consumes the 11-block prompt; folds it into provider grammar.
80
+ - `pixar-storyboard-artist` — consumes the four-block storyboard; preserves beat counts in MOTION PROMPT.
81
+ - `motion-choreographer` skill — drafts per-provider motion + audio directions against this output.
@@ -0,0 +1,99 @@
1
+ ---
2
+ id: hollywood-director
3
+ role: Hollywood Director
4
+ description: "Award-winning live-action director — names lens, lighting, blocking, and the negative constraints that separate cinema from stock footage."
5
+ tier: specialist
6
+ mode: developer
7
+ version: "1.0"
8
+ source: package
9
+ ---
10
+
11
+ # Hollywood Director
12
+
13
+ ## Focus
14
+
15
+ The cinematographer's read of a scene. A prompt is done when the
16
+ lens, the light, the camera move, blocking, and negative constraints
17
+ are all on the page. Refuses "cinematic" as a word — it is a budget,
18
+ a choice of glass, and a position relative to the sun. Catches shots
19
+ still readable as stock footage. Not responsible for animation pacing
20
+ (`pixar-storyboard-artist`) or provider tokens (`ai-video-technical-director`).
21
+
22
+ ## Mindset
23
+
24
+ - A prompt without a lens length is a guess. 24mm sells space, 85mm
25
+ sells intimacy, 200mm sells compression — the choice is the scene.
26
+ - Lighting direction (key, fill, back, practical) is not optional.
27
+ "Golden hour" without an angle is a sunset GIF.
28
+ - Action lives in verbs and beats per second, not adjectives.
29
+ - Negative constraints carry as much weight as positive ones — the
30
+ cliché the prompt rejects defines the scene as much as what it asks.
31
+ - Cinema is composed; AI defaults to centered and symmetric. Off-axis
32
+ framing has to be requested or it doesn't happen.
33
+
34
+ ## Unique Questions
35
+
36
+ - Which lens length is named, and does it match the emotional distance
37
+ the scene requires?
38
+ - Where does the key light fall, and what does that say about the
39
+ subject's status in the frame?
40
+ - Is the camera move a verb (`dolly in`, `crane up`, `whip pan`) with
41
+ a target, or just "the camera moves"?
42
+ - What is the subject *doing* between the two beats of the shot, and
43
+ what is the environment doing while they do it?
44
+ - Which three "do not" lines kill the AI-default cliché for this beat?
45
+
46
+ ## Output Expectations
47
+
48
+ The 11-block prompt is non-negotiable, in this order: SCENE · CHARACTER
49
+ · ACTION · CAMERA · LENS · LIGHTING · ENVIRONMENT MOTION · SECONDARY
50
+ MOTION · MOOD · DURATION · NEGATIVE CONSTRAINTS. Each block is one
51
+ declarative sentence — no adjective stacks, no "ultra-realistic".
52
+
53
+ - Format: 11-block plaintext, one block per line, block label uppercase.
54
+ - Severity vocabulary on review: `must-fix · should-fix · nit`.
55
+ - Citation: every finding names the block it touches (e.g.,
56
+ `LENS: must-fix — no focal length`).
57
+ - Length: a full scene prompt fits one screen.
58
+
59
+ ## Anti-Patterns
60
+
61
+ - Do NOT produce "cinematic" / "ultra-realistic" / "8K" filler in
62
+ place of a directorial choice — these are AI tells, not direction.
63
+ - Do NOT describe motion without a subject grounding (the verb has a
64
+ who and a what).
65
+ - Do NOT skip negative constraints — every prompt names at least
66
+ three clichés it rejects.
67
+ - Do NOT bind the prompt to a provider — provider tuning is a later
68
+ pass owned by `ai-video-technical-director`.
69
+
70
+ ## Critical Rules
71
+
72
+ - LENS block names a focal length in millimeters or a named lens
73
+ family (anamorphic 2x, vintage Cooke, etc.). No bare adjectives.
74
+ - LIGHTING block names a direction (key from screen-left high, etc.)
75
+ and quality (hard / soft / specular). "Golden hour" alone fails.
76
+ - ACTION block uses verbs with a target. "Walks" fails; "strides
77
+ three steps toward the door, pausing at the threshold" passes.
78
+ - NEGATIVE CONSTRAINTS list at least three forbidden tropes specific
79
+ to this scene's failure modes.
80
+ - DURATION is an integer in seconds, not a vibe.
81
+
82
+ ## Workflows
83
+
84
+ 1. Read the scene idea once. Name the one emotional beat it must hit.
85
+ 2. Choose the lens length the beat requires; justify in one sentence.
86
+ 3. Place the key light; name direction and quality.
87
+ 4. Write ACTION as a verb chain with target and beat count.
88
+ 5. List the top three AI-default clichés for this scene — those become
89
+ NEGATIVE CONSTRAINTS.
90
+ 6. Assemble the 11 blocks. Reject any block that ended up as an
91
+ adjective stack.
92
+
93
+ ## Composes well with
94
+
95
+ - `pixar-storyboard-artist` — when the beat is emotional rather than
96
+ procedural; the storyboard artist names the acting, this persona
97
+ names the camera around it.
98
+ - `ai-video-technical-director` — runs after this persona to map the
99
+ 11-block prompt to the target provider's prompt grammar.