@event4u/agent-config 2.23.0 → 2.25.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 (82) hide show
  1. package/.agent-src/commands/create-pr/description-only.md +39 -11
  2. package/.agent-src/commands/create-pr.md +59 -5
  3. package/.agent-src/commands/video/from-script.md +123 -0
  4. package/.agent-src/commands/video/scene.md +92 -0
  5. package/.agent-src/commands/video/stitch.md +83 -0
  6. package/.agent-src/commands/video/storyboard.md +95 -0
  7. package/.agent-src/commands/video.md +59 -0
  8. package/.agent-src/contexts/execution/roadmap-process-loop.md +69 -14
  9. package/.agent-src/personas/README.md +5 -1
  10. package/.agent-src/personas/ai-video-technical-director.md +81 -0
  11. package/.agent-src/personas/hollywood-director.md +99 -0
  12. package/.agent-src/profiles/content_creator.yml +5 -0
  13. package/.agent-src/rules/media-governance-routing.md +82 -0
  14. package/.agent-src/rules/persona-governance.md +90 -0
  15. package/.agent-src/rules/post-push-rewrite-discipline.md +70 -0
  16. package/.agent-src/rules/provider-lifecycle-discipline.md +75 -0
  17. package/.agent-src/rules/roadmap-ci-steps-policy.md +145 -0
  18. package/.agent-src/rules/roadmap-progress-sync.md +11 -5
  19. package/.agent-src/skills/character-consistency/SKILL.md +131 -0
  20. package/.agent-src/skills/git-workflow/SKILL.md +133 -0
  21. package/.agent-src/skills/motion-choreographer/SKILL.md +161 -0
  22. package/.agent-src/skills/pixar-storyteller/SKILL.md +120 -0
  23. package/.agent-src/skills/roadmap-writing/SKILL.md +10 -0
  24. package/.agent-src/skills/scene-expander/SKILL.md +137 -0
  25. package/.agent-src/skills/scene-expander/scene-blueprint.schema.yaml +108 -0
  26. package/.agent-src/skills/subagent-orchestration/SKILL.md +17 -15
  27. package/.agent-src/skills/video-director/SKILL.md +126 -0
  28. package/.agent-src/templates/agent-settings.md +19 -0
  29. package/.agent-src/templates/agents/agent-project-settings.example.yml +1 -1
  30. package/.agent-src/templates/roadmaps.md +16 -0
  31. package/.claude-plugin/marketplace.json +11 -1
  32. package/CHANGELOG.md +65 -0
  33. package/README.md +7 -5
  34. package/config/agent-settings.template.yml +54 -0
  35. package/docs/adrs/caveman/0001-default-off-until-bench.md +2 -2
  36. package/docs/adrs/cost/0001-hard-stop-hook.md +1 -1
  37. package/docs/adrs/smoke/0001-per-tier-smoke-scripts.md +2 -2
  38. package/docs/architecture.md +3 -3
  39. package/docs/catalog.md +18 -5
  40. package/docs/contracts/command-clusters.md +1 -0
  41. package/docs/contracts/compression-default-kill-criterion.md +1 -1
  42. package/docs/contracts/file-ownership-matrix.json +405 -0
  43. package/docs/contracts/provider-lifecycle.md +122 -0
  44. package/docs/decisions/ADR-011-domain-pack-readiness.md +213 -0
  45. package/docs/decisions/INDEX.md +1 -0
  46. package/docs/getting-started-by-role.md +10 -0
  47. package/docs/getting-started.md +2 -2
  48. package/docs/parity/ruflo.md +3 -3
  49. package/docs/personas.md +73 -26
  50. package/docs/profiles.md +9 -4
  51. package/package.json +1 -1
  52. package/scripts/_tmp_scan_framework_leakage.py +119 -0
  53. package/scripts/ai-video/adapters/gemini-veo.sh +62 -0
  54. package/scripts/ai-video/adapters/higgsfield.sh +88 -0
  55. package/scripts/ai-video/adapters/kling.sh +59 -0
  56. package/scripts/ai-video/adapters/openai-images.sh +57 -0
  57. package/scripts/ai-video/adapters/sora.sh +60 -0
  58. package/scripts/ai-video/lib/adapter-common.sh +116 -0
  59. package/scripts/ai-video/lib/adapter-contract.md +163 -0
  60. package/scripts/ai-video/lib/fixtures/gemini-veo/result.json +1 -0
  61. package/scripts/ai-video/lib/fixtures/gemini-veo/scene-0001.mp4 +1 -0
  62. package/scripts/ai-video/lib/fixtures/higgsfield/result.json +1 -0
  63. package/scripts/ai-video/lib/fixtures/higgsfield/scene-0001.mp4 +1 -0
  64. package/scripts/ai-video/lib/fixtures/kling/result.json +1 -0
  65. package/scripts/ai-video/lib/fixtures/kling/scene-0001.mp4 +1 -0
  66. package/scripts/ai-video/lib/fixtures/openai-images/result.json +1 -0
  67. package/scripts/ai-video/lib/fixtures/openai-images/scene-0001.png +3 -0
  68. package/scripts/ai-video/lib/fixtures/sora/result.json +1 -0
  69. package/scripts/ai-video/lib/fixtures/sora/scene-0001.mp4 +1 -0
  70. package/scripts/ai-video/lib/load-config.sh +140 -0
  71. package/scripts/ai-video/lib/operator-pick.sh +119 -0
  72. package/scripts/ai-video/lib/parse-blueprint.sh +122 -0
  73. package/scripts/ai-video/lib/redact.sh +85 -0
  74. package/scripts/ai-video/lib/validate-deps.sh +132 -0
  75. package/scripts/ai-video/stitch.sh +154 -0
  76. package/scripts/ai-video/test-pipeline.sh +169 -0
  77. package/scripts/check_portability.py +6 -0
  78. package/scripts/lint_media_policy_linkage.py +140 -0
  79. package/scripts/lint_persona_governance.py +164 -0
  80. package/scripts/lint_roadmap_ci_steps.py +182 -0
  81. package/scripts/schemas/command.schema.json +8 -0
  82. package/scripts/smoke/schema.sh +1 -1
@@ -0,0 +1,120 @@
1
+ ---
2
+ name: pixar-storyteller
3
+ description: "Use when turning an idea into a Pixar-style animation prompt — character sheet, scene, image, video — anchored in emotional beat, want, obstacle. Triggers 'Pixar prompt', 'animated scene'."
4
+ source: package
5
+ domain: product
6
+ ---
7
+
8
+ # pixar-storyteller
9
+
10
+ > Turn an animation beat into the **four-block storyboard**:
11
+ > CHARACTER SHEET · SCENE PROMPT · IMAGE PROMPT · VIDEO PROMPT.
12
+ > Output is provider-agnostic; provider tuning is
13
+ > [`motion-choreographer`](../motion-choreographer/SKILL.md).
14
+ >
15
+ > The acting / storyboard lens is enforced inline by the procedure
16
+ > and self-review below.
17
+
18
+ ## When to use
19
+
20
+ - A scene is animated / stylized (not photoreal) and needs an
21
+ emotional read, not a film-set read.
22
+ - The character must want something and the environment must
23
+ respond — flat poses fail.
24
+ - Live-action / photoreal beats → [`video-director`](../video-director/SKILL.md).
25
+
26
+ Do NOT use when:
27
+
28
+ - The deliverable is provider-tuned token grammar →
29
+ `motion-choreographer` after this skill.
30
+ - A character must be re-used across scenes → run
31
+ [`character-consistency`](../character-consistency/SKILL.md) first
32
+ to lock the CHARACTER SHEET, then call this skill.
33
+ - The brief is a static graphic / poster → `canvas-design`.
34
+
35
+ ## Procedure
36
+
37
+ ### Step 0: Inspect
38
+
39
+ 1. Confirm the input is an animated / stylized beat.
40
+ 2. If `character.json` exists under `agents/ai-video/<project>/characters/`,
41
+ read identity tokens — reused verbatim in CHARACTER SHEET.
42
+ 3. Read the beat once. Name the *want* and the *obstacle* in one
43
+ sentence each before drafting.
44
+
45
+ ### Step 1: Draft the four blocks
46
+
47
+ Emit each block under a labeled heading. Blocks are mandatory and
48
+ in this order:
49
+
50
+ 1. **CHARACTER SHEET** — silhouette, palette, wardrobe, signature
51
+ prop, posture default, eye behavior. Verbatim from `character.json`
52
+ when a lock exists.
53
+ 2. **SCENE PROMPT** — single emotional beat, want, obstacle,
54
+ stylistic anchor (specific film + year — "Up (2009)", not
55
+ "Pixar-style"), environment reaction.
56
+ 3. **IMAGE PROMPT** — one still at the peak of the beat. Names
57
+ composition, eye line, palette. No motion verbs.
58
+ 4. **VIDEO PROMPT** — decomposes the moment into
59
+ `anticipation Xs · action Ys · reaction Zs` with explicit beat
60
+ counts. Names which secondary motion (hair, cloth, dust) reacts
61
+ on which beat.
62
+
63
+ ### Step 2: Self-review
64
+
65
+ 1. Exactly one emotional beat in SCENE PROMPT? Compound moods fail.
66
+ 2. Stylistic anchor is a specific film + year? Generic style → fail.
67
+ 3. VIDEO PROMPT names beat counts per phase?
68
+ 4. IMAGE PROMPT names eye line?
69
+ 5. CHARACTER SHEET matches `character.json` byte-for-byte when a
70
+ lock exists?
71
+
72
+ Any "no" → revise that block.
73
+
74
+ ### Step 3: Validate
75
+
76
+ 1. Output is plain text, one labeled block per heading, ready for
77
+ `scripts/ai-video/lib/parse-blueprint.sh`.
78
+ 2. No provider tokens — that is `motion-choreographer`.
79
+ 3. No lens / focal-length prescriptions — that is `video-director`'s
80
+ block, not this one.
81
+
82
+ ## Output format
83
+
84
+ 1. **`scenes/<id>/prompt.txt`** — four labeled blocks, ready for
85
+ the blueprint parser.
86
+ 2. **`scenes/<id>/review.md`** — one-paragraph rationale per
87
+ non-obvious choice (stylistic anchor, environment reaction,
88
+ beat decomposition).
89
+
90
+ ## Gotcha
91
+
92
+ - The model defaults to "Pixar-style" with no film anchor — that
93
+ reads as a wishlist. Force a specific title + year.
94
+ - Neutral faces are the AI default — every beat names a feeling
95
+ the face is doing, including eye line direction.
96
+ - Environment-as-backdrop is the silent failure mode — name what
97
+ the world *does* in response to the character.
98
+ - Collapsing anticipation and action into one verb makes motion
99
+ look teleported. Both phases or the prompt fails review.
100
+ - When `character.json` exists, paraphrasing breaks Character Lock —
101
+ copy identity tokens verbatim.
102
+
103
+ ## Do NOT
104
+
105
+ - Do NOT prescribe lenses or focal lengths — that is `video-director`.
106
+ - Do NOT emit provider-specific tokens — that is `motion-choreographer`.
107
+ - Do NOT cite "Pixar-style" without a specific film + year.
108
+ - Do NOT compound emotional beats ("sad but hopeful and tired").
109
+
110
+ ## Policies
111
+
112
+ The Pixar-storyteller skill anchors prompts to named films and studios by design — the policy surface is the largest in the video cluster:
113
+
114
+ - [`agents/policies/media/style.md`](../../../agents/policies/media/style.md) — naming a film + year as the *primary* anchor crosses the "in the style of [STUDIO]" trigger; surface and refuse without a transformative-intent rationale.
115
+ - [`agents/policies/media/likeness.md`](../../../agents/policies/media/likeness.md) — when a beat references a named animator's signature character (real-person extension of style).
116
+ - [`agents/policies/media/public-figures.md`](../../../agents/policies/media/public-figures.md) — when the storyteller's character is a recognised public figure rendered in Pixar shape.
117
+ - [`agents/policies/media/disclosure.md`](../../../agents/policies/media/disclosure.md) — every Pixar-style output ships with the AI-generation disclosure; parody / commentary cases are flagged for human review.
118
+
119
+ Refuse-and-surface when style ⇒ primary signature, not one influence among several.
120
+
@@ -137,6 +137,16 @@ to every roadmap you author.
137
137
  user (`commit-policy` Iron Law). A roadmap is "implementation-complete"
138
138
  once its checkboxes are ticked and verification has been run — merge
139
139
  timing is tracked outside the roadmap.
140
+ * Schedule full-pipeline CI literals (`task ci`, `task ci-fast`,
141
+ `task ci-strict`, `make ci`, `make test`, `npm/pnpm run check`,
142
+ `yarn check`, `composer test`, whole-suite `vendor/bin/phpunit`,
143
+ whole-suite `php artisan test`) as checkbox steps when
144
+ `quality.local_auto_run: false` — blocked by
145
+ `task lint-roadmap-ci-steps` per
146
+ [`roadmap-ci-steps-policy`](../../rules/roadmap-ci-steps-policy.md).
147
+ Reword as narrow verifications, or mark with
148
+ `<!-- carve-out: new-gate-verification -->` when it verifies a NEW
149
+ gate this roadmap introduces.
140
150
  * Use ALL-CAPS Iron-Law fenced blocks — those belong in
141
151
  [`kernel-membership`](../../../docs/contracts/kernel-membership.md)-listed
142
152
  rules, not roadmaps.
@@ -0,0 +1,137 @@
1
+ ---
2
+ name: scene-expander
3
+ description: "Use when expanding a one-line idea into the 12-block Cinematic Scene Blueprint — provider-agnostic, includes optional dialogue + ambient. Triggers 'expand this scene', 'blueprint for X'."
4
+ personas:
5
+ - hollywood-director
6
+ source: package
7
+ domain: product
8
+ ---
9
+
10
+ # scene-expander
11
+
12
+ > Expand a one-line idea or script line into the **Cinematic Scene
13
+ > Blueprint** — 12 labeled blocks consumed by
14
+ > [`parse-blueprint.sh`](./scene-blueprint.schema.yaml). Picks
15
+ > `hollywood-director` for live-action; hands off animated beats to
16
+ > [`pixar-storyteller`](../pixar-storyteller/SKILL.md). Output is
17
+ > provider-agnostic — provider tuning is
18
+ > [`motion-choreographer`](../motion-choreographer/SKILL.md).
19
+
20
+ ## When to use
21
+
22
+ - A script line, idea, or beat needs a full blueprint before any
23
+ adapter runs.
24
+ - A `/video:from-script` run is parsing `## Scene N` headings and
25
+ needs each scene expanded.
26
+
27
+ Do NOT use when:
28
+
29
+ - The brief is already an 11-block cinematic prompt → call
30
+ `video-director` directly to refine it.
31
+ - The brief is a static graphic → `canvas-design`.
32
+ - Provider-specific token tuning is the next step →
33
+ `motion-choreographer`.
34
+
35
+ ## Procedure
36
+
37
+ ### Step 0: Inspect
38
+
39
+ 1. Read the input line. Classify as **live-action / photoreal** or
40
+ **animated / stylized**.
41
+ 2. Live-action → load `hollywood-director` voice. Animated → hand
42
+ off to [`pixar-storyteller`](../pixar-storyteller/SKILL.md) (its
43
+ procedure carries the acting / beat-decomposition lens). Hybrid
44
+ (live-action with VFX) → `hollywood-director`; record VFX intent
45
+ in ENVIRONMENT.
46
+ 3. Check for an existing `character.json` lock under
47
+ `agents/ai-video/<project>/characters/`.
48
+
49
+ ### Step 1: Emit the 12 blocks
50
+
51
+ One label per line. Order is mandatory.
52
+
53
+ 1. **STYLE** — stylistic anchor (live-action: film stock + decade,
54
+ e.g. "Kodak 5219, 2015"; animated: specific film + year).
55
+ 2. **SUBJECT** — character read; verbatim identity tokens when a
56
+ lock exists.
57
+ 3. **ENVIRONMENT** — location, time-of-day, weather, era; what the
58
+ world does in response to the subject.
59
+ 4. **ACTION** — anticipation / action / reaction with beat counts
60
+ (`0.5s / 1.2s / 0.8s`). No adjective paragraphs.
61
+ 5. **CAMERA** — position, height, distance, move (lock-off, dolly,
62
+ handheld, push, pull). Off-axis when on-axis is default.
63
+ 6. **LENS** — focal length in mm and aperture intent. "Cinematic"
64
+ alone fails.
65
+ 7. **LIGHTING** — key / fill / back / practical named; "golden
66
+ hour" requires a sun angle.
67
+ 8. **MOOD** — one emotional read.
68
+ 9. **DIALOGUE** — optional. If present: `speaker: "line"`, one per
69
+ line. Marks `audio: native` capability requirement.
70
+ 10. **AMBIENT SOUND** — optional. Layer list (wind, traffic,
71
+ crowd, ocean). Marks `audio: native` or routes to ffmpeg mux.
72
+ 11. **DURATION** — seconds (integer or one decimal).
73
+ 12. **NEGATIVE** — clichés to reject, load-bearing order top-first.
74
+ Always names: centered framing, symmetric composition, generic
75
+ "cinematic", soap-opera contrast.
76
+
77
+ ### Step 2: Self-review
78
+
79
+ 1. Live-action / animated classification consistent across blocks?
80
+ 2. LENS present with mm (live-action) OR stylistic anchor with
81
+ film+year (animated)?
82
+ 3. LIGHTING with a direction?
83
+ 4. ACTION names beat counts, not adjectives?
84
+ 5. DIALOGUE / AMBIENT SOUND present → the run requires `audio:
85
+ native` adapter OR ffmpeg-mux fallback declared.
86
+ 6. NEGATIVE ≥ 4 entries, load-bearing top?
87
+ 7. SUBJECT verbatim from `character.json` when a lock exists?
88
+
89
+ Any "no" → revise that block.
90
+
91
+ ### Step 3: Validate
92
+
93
+ 1. Pipe output through `scripts/ai-video/lib/parse-blueprint.sh` —
94
+ exits 0 and emits valid adapter-contract JSON.
95
+ 2. No provider tokens (no aspect / model / duration flags).
96
+
97
+ ## Output format
98
+
99
+ 1. **`scenes/<id>/prompt.txt`** — 12 labeled blocks, ready for
100
+ `parse-blueprint.sh`.
101
+ 2. **`scenes/<id>/blueprint.json`** — parser output, adapter-stdin
102
+ ready.
103
+ 3. **`scenes/<id>/review.md`** — one-paragraph rationale per
104
+ non-obvious choice.
105
+
106
+ ## Gotcha
107
+
108
+ - The model wants to skip optional DIALOGUE / AMBIENT SOUND blocks
109
+ silently — if they could plausibly belong, emit them; the parser
110
+ treats missing blocks as `null`, not as an error.
111
+ - Live-action without LENS mm fails the parser's strict mode.
112
+ - Animated without a film+year anchor in STYLE drifts on every run.
113
+ - ACTION written as "the character does X dramatically" fails —
114
+ adapters need verbs with beat counts.
115
+ - DIALOGUE forces `audio: native` requirement — flag this to the
116
+ orchestrator so it picks a capable adapter (Veo / Sora).
117
+
118
+ ## Do NOT
119
+
120
+ - Do NOT emit provider tokens — that is `motion-choreographer`.
121
+ - Do NOT skip the blueprint parser validation step.
122
+ - Do NOT paraphrase identity tokens when a lock exists.
123
+ - Do NOT mix live-action LENS prescriptions with animated STYLE
124
+ anchors in the same scene — pick one mode.
125
+
126
+ ## Policies
127
+
128
+ The 12-block Cinematic Scene Blueprint is the policy choke point — every downstream skill (`motion-choreographer`, `video-director`) inherits whatever the blueprint encodes. Before emitting:
129
+
130
+ - [`agents/policies/media/likeness.md`](../../../agents/policies/media/likeness.md) — when the SUBJECT block names or visually identifies a real person.
131
+ - [`agents/policies/media/public-figures.md`](../../../agents/policies/media/public-figures.md) — when the SUBJECT block is a recognised public figure.
132
+ - [`agents/policies/media/brand-impersonation.md`](../../../agents/policies/media/brand-impersonation.md) — when STYLE / ENVIRONMENT references a recognised brand's visual identity.
133
+ - [`agents/policies/media/style.md`](../../../agents/policies/media/style.md) — when STYLE anchors to a named living artist or studio as the primary signature.
134
+ - [`agents/policies/media/disclosure.md`](../../../agents/policies/media/disclosure.md) — every distributed blueprint output carries the AI-generation disclosure downstream.
135
+
136
+ Refuse-and-surface at the blueprint layer; do not push policy questions down to the adapter.
137
+
@@ -0,0 +1,108 @@
1
+ # Scene Blueprint Schema (v1)
2
+ #
3
+ # Maps the 12 labeled blocks emitted by `scene-expander` to the
4
+ # adapter-contract JSON consumed by every adapter under
5
+ # `scripts/ai-video/adapters/`. Validation lives in
6
+ # `scripts/ai-video/lib/parse-blueprint.sh`.
7
+ #
8
+ # Source format: plain-text, one labeled block per line OR per
9
+ # heading. Labels are case-insensitive; whitespace around `:` is
10
+ # tolerated. Block order is the canonical order below — out-of-order
11
+ # blocks are accepted but logged as a warning.
12
+
13
+ version: 1
14
+
15
+ blocks:
16
+ STYLE:
17
+ required: true
18
+ target: prompt.style
19
+ description: "Film stock + decade (live-action) or film title + year (animated)."
20
+
21
+ SUBJECT:
22
+ required: true
23
+ target: prompt.subject
24
+ description: "Character read. Verbatim from character.json when locked."
25
+
26
+ ENVIRONMENT:
27
+ required: true
28
+ target: prompt.environment
29
+ description: "Location, time-of-day, weather, era; world reaction."
30
+
31
+ ACTION:
32
+ required: true
33
+ target: prompt.action
34
+ description: "Anticipation / action / reaction with beat counts."
35
+
36
+ CAMERA:
37
+ required: true
38
+ target: prompt.camera
39
+ description: "Position, height, distance, move."
40
+
41
+ LENS:
42
+ required: true
43
+ target: prompt.lens
44
+ description: "Focal length in mm + aperture intent (live-action). Animated runs may emit 'n/a' but the block must be present."
45
+
46
+ LIGHTING:
47
+ required: true
48
+ target: prompt.lighting
49
+ description: "Key / fill / back / practical with direction."
50
+
51
+ MOOD:
52
+ required: true
53
+ target: prompt.mood
54
+ description: "Single emotional read."
55
+
56
+ DIALOGUE:
57
+ required: false
58
+ target: audio.dialogue
59
+ description: "Optional. Marks audio.native requirement when present."
60
+ null_when_absent: true
61
+
62
+ AMBIENT SOUND:
63
+ required: false
64
+ target: audio.ambient
65
+ description: "Optional ambient layer list."
66
+ null_when_absent: true
67
+
68
+ DURATION:
69
+ required: true
70
+ target: duration
71
+ type: number
72
+ description: "Seconds. Integer or one decimal."
73
+
74
+ NEGATIVE:
75
+ required: true
76
+ target: negative
77
+ description: "Clichés to reject, load-bearing top-first."
78
+
79
+ # Adapter-contract JSON shape produced by parse-blueprint.sh
80
+ output_shape: |
81
+ {
82
+ "prompt": {
83
+ "style": "...",
84
+ "subject": "...",
85
+ "environment": "...",
86
+ "action": "...",
87
+ "camera": "...",
88
+ "lens": "...",
89
+ "lighting": "...",
90
+ "mood": "..."
91
+ },
92
+ "audio": {
93
+ "dialogue": [...] | null,
94
+ "ambient": [...] | null,
95
+ "enable_native_audio": true | false
96
+ },
97
+ "duration": 5.0,
98
+ "negative": ["...", "..."],
99
+ "requires": {
100
+ "audio_native": true | false
101
+ }
102
+ }
103
+
104
+ # `enable_native_audio` derives from: DIALOGUE present OR AMBIENT SOUND present.
105
+ # Orchestrator uses `requires.audio_native` to pick an adapter with
106
+ # `audio: native` capability (Phase 4 Step 1). When no native adapter
107
+ # is available the orchestrator routes audio.* to ffmpeg mux at
108
+ # stitch time (Phase 4 Step 7) and clears `enable_native_audio`.
@@ -56,7 +56,7 @@ model pairing. Defaults come from
56
56
  Descriptive, not enforced. Documents the **expected agent-to-agent
57
57
  communication topology** so consumers can predict latency, failure
58
58
  modes, and where consensus is required. Cited from
59
- [`external-findings.md § 2`](../../../agents/audit-2026-05-14-north-star/external-findings.md)
59
+ [`external-findings.md § 2`](../../../agents/council-sessions/audit-2026-05-14-north-star/external-findings.md) <!-- council-ref-allowed: ADR decision trace for topology anti-drift defaults -->
60
60
  row 7 (Ruflo's `hierarchical, 6–8 agents, raft consensus` anti-drift
61
61
  default).
62
62
 
@@ -72,8 +72,8 @@ default).
72
72
 
73
73
  **Anti-drift default** (Ruflo convention, descriptive only):
74
74
  `hierarchical, 6–8 agents, raft consensus`. Consumers free to
75
- override per orchestration — table is **starting point**, not a
76
- constraint. Topology is metadata for capacity planning, not
75
+ override per orchestration — the table is the **starting point**,
76
+ not a constraint. Topology is metadata for capacity planning, not
77
77
  runtime-enforced.
78
78
 
79
79
  **Glossary:**
@@ -81,7 +81,7 @@ runtime-enforced.
81
81
  - `mesh` — agents see each other's outputs (e.g. competing diffs).
82
82
  - `hierarchical-mesh` — peer debate followed by hub reconciliation.
83
83
  - `ring` — output of step N feeds input of step N+1 in order.
84
- - `star` — N agents fan out from single hub; no peer comms.
84
+ - `star` — N agents fan out from a single hub; no peer comms.
85
85
  - `adaptive` — topology shifts per step; outer chain remains hub.
86
86
 
87
87
  ### 1. do-and-judge
@@ -193,17 +193,19 @@ step is under ~30 minutes. The branch-creation, context-switch, and
193
193
  worktree-cleanup cost dominates. Stick with mode 1 (do-and-judge)
194
194
  or mode 3 (do-in-steps) for those.
195
195
 
196
- **Competitive variant — per-candidate isolation.** Mode 5
197
- (`do-competitively`) + worktrees: each candidate runs in its own
198
- worktree (no cross-candidate state leak). Selection rules:
199
-
200
- - **No auto-merge.** Orchestrator never merges candidate branches.
201
- Hard Floor per [`non-destructive-by-default`](../../rules/non-destructive-by-default.md)
202
- applies even under standing autonomy. ADR-005 records reasoning.
203
- - **Ranked presentation.** Judge ranks 1..N with one-line
204
- justifications; user picks winner.
205
- - **Loser worktrees stay.** Orchestrator does not auto-delete losing
206
- worktrees user keeps option to harvest a partial idea before cleanup.
196
+ **Competitive variant — per-candidate isolation.** When mode 5
197
+ (`do-competitively`) is combined with worktrees, each candidate
198
+ implementer runs in its own worktree (so candidates cannot read each
199
+ other's open files or branch state). Selection rules:
200
+
201
+ - **No auto-merge.** The orchestrator never merges a candidate
202
+ branch. Hard Floor per [`non-destructive-by-default`](../../rules/non-destructive-by-default.md)
203
+ applies even under standing autonomy. ADR-005 records the reasoning.
204
+ - **Ranked presentation.** Judge ranks candidates (1..N) with a
205
+ one-line justification per rank; user picks the winner.
206
+ - **Loser worktrees stay.** The orchestrator does not delete losing
207
+ worktrees automatically — the user keeps the option to harvest a
208
+ partial idea before cleanup.
207
209
 
208
210
  ## Status taxonomy — every subagent return uses one envelope
209
211
 
@@ -0,0 +1,126 @@
1
+ ---
2
+ name: video-director
3
+ description: "Use when turning a scene idea into the 11-block cinematic prompt for live-action AI video — lens, lighting, blocking, motion, negatives. Triggers 'cinematic prompt', 'film-grade scene'."
4
+ personas:
5
+ - hollywood-director
6
+ source: package
7
+ domain: product
8
+ ---
9
+
10
+ # video-director
11
+
12
+ > Turn a scene idea into the **11-block cinematic prompt** the
13
+ > `hollywood-director` persona ships. Output is provider-agnostic
14
+ > prose; provider-specific tuning is handed off to
15
+ > [`motion-choreographer`](../motion-choreographer/SKILL.md).
16
+
17
+ ## When to use
18
+
19
+ - A scene idea, beat, or script line needs to become a cinematic
20
+ prompt ready to feed an image+video pipeline.
21
+ - A draft prompt reads as "AI video" — flat, centered, generic
22
+ golden-hour — and needs directorial choices on the page.
23
+ - Live-action / photoreal scenes. For animation acting beats, route
24
+ to [`pixar-storyteller`](../pixar-storyteller/SKILL.md).
25
+
26
+ Do NOT use when:
27
+
28
+ - The deliverable is a still graphic or poster → `canvas-design`.
29
+ - The work is provider-specific token tuning →
30
+ `motion-choreographer` after this skill has produced the blocks.
31
+ - A character identity must be re-used across scenes → run
32
+ [`character-consistency`](../character-consistency/SKILL.md) first
33
+ to lock identity tokens, then call this skill.
34
+
35
+ ## Procedure
36
+
37
+ ### Step 0: Inspect
38
+
39
+ 1. Confirm the input is a live-action / photoreal beat (not animation).
40
+ 2. If a `character.json` exists under `agents/ai-video/<project>/characters/`,
41
+ read the identity tokens — they are reused verbatim.
42
+ 3. Read the scene's intent in one sentence — what is the camera
43
+ witnessing, and why now?
44
+
45
+ ### Step 1: Draft the 11 blocks
46
+
47
+ Emit each block on its own labeled line. Blocks are mandatory and
48
+ in this order:
49
+
50
+ 1. **SCENE** — location, time-of-day, weather, era.
51
+ 2. **CHARACTER** — verbatim identity tokens from `character.json`
52
+ when present; otherwise silhouette + wardrobe + signature prop.
53
+ 3. **ACTION** — verbs and beats. Anticipation → action → reaction
54
+ named separately. No "doing things" prose.
55
+ 4. **CAMERA** — position, height, distance, move (lock-off, dolly,
56
+ handheld, push, pull). Off-axis when on-axis is the AI default.
57
+ 5. **LENS** — focal length in mm (24 / 35 / 50 / 85 / 200) and
58
+ aperture intent (deep / shallow). "Cinematic" alone fails.
59
+ 6. **LIGHTING** — key, fill, back, practical sources named. "Golden
60
+ hour" requires an angle (low-east 15°, etc.).
61
+ 7. **ENVIRONMENT MOTION** — what the world does (wind, water,
62
+ crowd, traffic) and on which beat.
63
+ 8. **SECONDARY MOTION** — hair, cloth, dust, breath. Names the
64
+ reactive layer that sells the primary action.
65
+ 9. **MOOD** — one emotional read; no compound moods.
66
+ 10. **DURATION** — seconds. Integer or one decimal.
67
+ 11. **NEGATIVE CONSTRAINTS** — clichés to reject, in load-bearing
68
+ order (top survives truncation). Always names: centered framing,
69
+ symmetric composition, generic "cinematic", soap-opera contrast.
70
+
71
+ ### Step 2: Self-review
72
+
73
+ 1. Lens length present? "Cinematic" without mm → fail.
74
+ 2. Lighting direction present? "Golden hour" without angle → fail.
75
+ 3. ACTION names beats, not adjectives?
76
+ 4. NEGATIVE block has at least 4 entries, load-bearing on top?
77
+ 5. CHARACTER block reuses identity tokens verbatim when a lock exists?
78
+
79
+ Any "no" → revise that block before handing off.
80
+
81
+ ### Step 3: Validate
82
+
83
+ 1. Output is plain text, one labeled block per line, ready for
84
+ `scripts/ai-video/lib/parse-blueprint.sh` (Phase 3 Step 5).
85
+ 2. No provider tokens (no `--aspect`, no `--model`). That is
86
+ `motion-choreographer`'s job.
87
+
88
+ ## Output format
89
+
90
+ 1. **`scenes/<id>/prompt.txt`** — 11 labeled blocks, one per line,
91
+ ready for the blueprint parser.
92
+ 2. **`scenes/<id>/review.md`** — one-paragraph rationale per
93
+ non-obvious directorial choice (lens, light angle, camera move).
94
+
95
+ ## Gotcha
96
+
97
+ - The model defaults to centered, on-axis, symmetric — name an
98
+ off-axis or rule-of-thirds camera or it will silently center.
99
+ - "Golden hour" alone reads as a sunset GIF; require a sun angle.
100
+ - ACTION written as a paragraph of adjectives ("dynamically", "powerfully")
101
+ fails — adapters need verbs with beat counts.
102
+ - When `character.json` exists, paraphrasing identity tokens breaks
103
+ Character Lock — copy them verbatim.
104
+ - Negative constraints in the truncated tail get dropped — load-
105
+ bearing ones go first.
106
+
107
+ ## Do NOT
108
+
109
+ - Do NOT emit provider-specific tokens (aspect ratio, model id,
110
+ duration flags) — that is `motion-choreographer`'s scope.
111
+ - Do NOT collapse anticipation / action / reaction into one verb.
112
+ - Do NOT use "cinematic" without lens + lighting + camera move.
113
+ - Do NOT invent character details when a `character.json` exists.
114
+
115
+ ## Policies
116
+
117
+ 11-block cinematic prompt is live-action shape — real-person + brand-impersonation risks highest in cluster. Before emitting:
118
+
119
+ - [`agents/policies/media/likeness.md`](../../../agents/policies/media/likeness.md) — prompt names / visually identifies real person on camera.
120
+ - [`agents/policies/media/public-figures.md`](../../../agents/policies/media/public-figures.md) — subject is recognised public figure.
121
+ - [`agents/policies/media/brand-impersonation.md`](../../../agents/policies/media/brand-impersonation.md) — prompt copies journalism / broadcaster / regulated-industry visual identity.
122
+ - [`agents/policies/media/style.md`](../../../agents/policies/media/style.md) — LIGHT / LENS anchored to named living cinematographer's signature.
123
+ - [`agents/policies/media/disclosure.md`](../../../agents/policies/media/disclosure.md) — every distributed live-action AI clip carries non-removable AI-generation disclosure.
124
+
125
+ Refuse-and-surface at directorial layer; live-action realism amplifies every downstream policy gap.
126
+
@@ -217,6 +217,23 @@ roadmap:
217
217
  # mandatory before any "roadmap complete" claim, regardless of cadence.
218
218
  quality_cadence: end_of_roadmap
219
219
 
220
+ # --- Quality / CI execution ---
221
+ quality:
222
+ # Run local quality / CI tasks and tests autonomously (true, false)
223
+ # true = agent runs the quality pipeline whenever work is ready
224
+ # for verification, without asking (default)
225
+ # false = agent asks before running quality tools / tests locally
226
+ # Carve-out: NEW CI gates / smoke tests / test files MUST run
227
+ # locally regardless of this flag — without execution the gate is
228
+ # unverified evidence. Iron Law `verify-before-complete` still applies.
229
+ local_auto_run: true
230
+
231
+ # Wait for remote CI to finish on the PR / pipeline (true, false)
232
+ # true = poll GitHub check-runs / pipeline after push and report
233
+ # green / red before handing back
234
+ # false = push and hand back immediately (default)
235
+ wait_for_remote_ci: false
236
+
220
237
  # --- Subagent orchestration ---
221
238
  subagents:
222
239
  # Model for implementer subagents (empty = same tier as the session model)
@@ -447,6 +464,8 @@ the canonical narrative lives in
447
464
  | `hooks.chat_history.script` | path | `scripts/chat_history.py` | Override path to the chat-history CLI. Set only when the script lives outside the standard location. |
448
465
  | `pipelines.skill_improvement` | `true`, `false` | `true` | When `true`: propose learning capture after meaningful tasks. When `false`: silent. Included in every profile except `custom`. |
449
466
  | `roadmap.quality_cadence` | `end_of_roadmap`, `per_phase`, `per_step` | `end_of_roadmap` | When `/roadmap:process-step|phase|full` runs the project's quality pipeline. Default skips per-step / per-phase runs and gates only the final archival. `per_phase` runs once after every phase; `per_step` is the legacy verbose mode. Step checkboxes and the dashboard are always updated regardless. `verify-before-complete` still requires fresh output before any "roadmap complete" claim. |
467
+ | `quality.local_auto_run` | `true`, `false` | `true` | When `true`: agent runs the project's quality pipeline (`task ci`, `make test`, `npm run check`, PHPStan, ECS, Rector, test suites) autonomously when work is ready for verification. When `false`: agent asks before running locally. **Carve-out**: NEW CI gates / smoke tests / test files MUST run locally regardless of this flag — without execution the new gate is unverified evidence. Iron Law `verify-before-complete` still applies; suppressed runs require the agent to surface the gap before claiming completion. |
468
+ | `quality.wait_for_remote_ci` | `true`, `false` | `false` | When `true`: after `git push`, the agent polls GitHub check-runs / pipeline status on the PR and reports green / red before handing back. When `false`: agent pushes and hands back immediately; the user inspects CI themselves (default — saves agent runtime and tokens). |
450
469
  | `subagents.implementer_model` | model alias or empty | _(empty)_ | Model for implementer subagents. Empty = same tier as session model. See [subagent-configuration](../contexts/subagent-configuration.md). |
451
470
  | `subagents.judge_model` | model alias or empty | _(empty)_ | Model for judge subagents. Empty = one tier above implementer (opus if sonnet, sonnet if haiku). |
452
471
  | `subagents.max_parallel` | integer | `3` | Maximum parallel subagent invocations. `1` serializes. |
@@ -39,7 +39,7 @@ schema_version: 1
39
39
  # CI guard: a release bump of `package.json` must update this value
40
40
  # in lockstep — see scripts/check_template_pin_drift.py (road-to-
41
41
  # portable-runtime-and-update-check P3.3).
42
- agent_config_version: "2.21.0"
42
+ agent_config_version: "2.24.0"
43
43
 
44
44
  # --- Project identity ---
45
45
  project:
@@ -84,6 +84,22 @@ php artisan test # Tests (or: vendor/bin/phpunit)
84
84
 
85
85
  Check `AGENTS.md` or `Makefile` / `Taskfile.yml` for the exact commands.
86
86
 
87
+ ### CI-step gate (when `quality.local_auto_run: false`)
88
+
89
+ Roadmaps **must not** schedule full-pipeline literals (`task ci`,
90
+ `task ci-fast`, `task ci-strict`, `make ci`, `make test`,
91
+ `npm/pnpm run check`, `yarn check`, `composer test`, whole-suite
92
+ `vendor/bin/phpunit`, whole-suite `php artisan test`) as checkbox
93
+ steps when `quality.local_auto_run` is `false` in
94
+ `.agent-settings.yml` — `task lint-roadmap-ci-steps` blocks them.
95
+ Reword as narrow verifications (`vendor/bin/phpstan analyse
96
+ app/Modules/X`, `php artisan test --filter=…`) or mark with
97
+ `<!-- carve-out: new-gate-verification -->` when the step verifies a
98
+ **new** gate this roadmap introduces. At execution,
99
+ `/roadmap:process-*` flips matching steps to `[-]` with reason and
100
+ skips them. Full contract:
101
+ [`roadmap-ci-steps-policy`](../rules/roadmap-ci-steps-policy.md).
102
+
87
103
  ---
88
104
 
89
105
  ## Template