@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.
- package/.agent-src/commands/create-pr/description-only.md +39 -11
- package/.agent-src/commands/create-pr.md +59 -5
- package/.agent-src/commands/video/from-script.md +123 -0
- package/.agent-src/commands/video/scene.md +92 -0
- package/.agent-src/commands/video/stitch.md +83 -0
- package/.agent-src/commands/video/storyboard.md +95 -0
- package/.agent-src/commands/video.md +59 -0
- package/.agent-src/contexts/execution/roadmap-process-loop.md +69 -14
- package/.agent-src/personas/README.md +5 -1
- package/.agent-src/personas/ai-video-technical-director.md +81 -0
- package/.agent-src/personas/hollywood-director.md +99 -0
- package/.agent-src/profiles/content_creator.yml +5 -0
- package/.agent-src/rules/media-governance-routing.md +82 -0
- package/.agent-src/rules/persona-governance.md +90 -0
- package/.agent-src/rules/post-push-rewrite-discipline.md +70 -0
- package/.agent-src/rules/provider-lifecycle-discipline.md +75 -0
- package/.agent-src/rules/roadmap-ci-steps-policy.md +145 -0
- package/.agent-src/rules/roadmap-progress-sync.md +11 -5
- package/.agent-src/skills/character-consistency/SKILL.md +131 -0
- package/.agent-src/skills/git-workflow/SKILL.md +133 -0
- package/.agent-src/skills/motion-choreographer/SKILL.md +161 -0
- package/.agent-src/skills/pixar-storyteller/SKILL.md +120 -0
- package/.agent-src/skills/roadmap-writing/SKILL.md +10 -0
- package/.agent-src/skills/scene-expander/SKILL.md +137 -0
- package/.agent-src/skills/scene-expander/scene-blueprint.schema.yaml +108 -0
- package/.agent-src/skills/subagent-orchestration/SKILL.md +17 -15
- package/.agent-src/skills/video-director/SKILL.md +126 -0
- package/.agent-src/templates/agent-settings.md +19 -0
- package/.agent-src/templates/agents/agent-project-settings.example.yml +1 -1
- package/.agent-src/templates/roadmaps.md +16 -0
- package/.claude-plugin/marketplace.json +11 -1
- package/CHANGELOG.md +65 -0
- package/README.md +7 -5
- package/config/agent-settings.template.yml +54 -0
- package/docs/adrs/caveman/0001-default-off-until-bench.md +2 -2
- package/docs/adrs/cost/0001-hard-stop-hook.md +1 -1
- package/docs/adrs/smoke/0001-per-tier-smoke-scripts.md +2 -2
- package/docs/architecture.md +3 -3
- package/docs/catalog.md +18 -5
- package/docs/contracts/command-clusters.md +1 -0
- package/docs/contracts/compression-default-kill-criterion.md +1 -1
- package/docs/contracts/file-ownership-matrix.json +405 -0
- package/docs/contracts/provider-lifecycle.md +122 -0
- package/docs/decisions/ADR-011-domain-pack-readiness.md +213 -0
- package/docs/decisions/INDEX.md +1 -0
- package/docs/getting-started-by-role.md +10 -0
- package/docs/getting-started.md +2 -2
- package/docs/parity/ruflo.md +3 -3
- package/docs/personas.md +73 -26
- package/docs/profiles.md +9 -4
- package/package.json +1 -1
- package/scripts/_tmp_scan_framework_leakage.py +119 -0
- package/scripts/ai-video/adapters/gemini-veo.sh +62 -0
- package/scripts/ai-video/adapters/higgsfield.sh +88 -0
- package/scripts/ai-video/adapters/kling.sh +59 -0
- package/scripts/ai-video/adapters/openai-images.sh +57 -0
- package/scripts/ai-video/adapters/sora.sh +60 -0
- package/scripts/ai-video/lib/adapter-common.sh +116 -0
- package/scripts/ai-video/lib/adapter-contract.md +163 -0
- package/scripts/ai-video/lib/fixtures/gemini-veo/result.json +1 -0
- package/scripts/ai-video/lib/fixtures/gemini-veo/scene-0001.mp4 +1 -0
- package/scripts/ai-video/lib/fixtures/higgsfield/result.json +1 -0
- package/scripts/ai-video/lib/fixtures/higgsfield/scene-0001.mp4 +1 -0
- package/scripts/ai-video/lib/fixtures/kling/result.json +1 -0
- package/scripts/ai-video/lib/fixtures/kling/scene-0001.mp4 +1 -0
- package/scripts/ai-video/lib/fixtures/openai-images/result.json +1 -0
- package/scripts/ai-video/lib/fixtures/openai-images/scene-0001.png +3 -0
- package/scripts/ai-video/lib/fixtures/sora/result.json +1 -0
- package/scripts/ai-video/lib/fixtures/sora/scene-0001.mp4 +1 -0
- package/scripts/ai-video/lib/load-config.sh +140 -0
- package/scripts/ai-video/lib/operator-pick.sh +119 -0
- package/scripts/ai-video/lib/parse-blueprint.sh +122 -0
- package/scripts/ai-video/lib/redact.sh +85 -0
- package/scripts/ai-video/lib/validate-deps.sh +132 -0
- package/scripts/ai-video/stitch.sh +154 -0
- package/scripts/ai-video/test-pipeline.sh +169 -0
- package/scripts/check_portability.py +6 -0
- package/scripts/lint_media_policy_linkage.py +140 -0
- package/scripts/lint_persona_governance.py +164 -0
- package/scripts/lint_roadmap_ci_steps.py +182 -0
- package/scripts/schemas/command.schema.json +8 -0
- package/scripts/smoke/schema.sh +1 -1
|
@@ -61,9 +61,12 @@ matching `commit:` / `git commit` / `Commit phase` patterns).
|
|
|
61
61
|
- **Commit steps present, non-autonomous** → ask before each commit
|
|
62
62
|
step inside the loop.
|
|
63
63
|
|
|
64
|
-
## 4. Resolve
|
|
64
|
+
## 4. Resolve cadences — read once, cache for the run
|
|
65
65
|
|
|
66
|
-
Read
|
|
66
|
+
Read both keys from `.agent-settings.yml` once and cache for the whole
|
|
67
|
+
run. Do **not** re-read inside the step loop.
|
|
68
|
+
|
|
69
|
+
**`roadmap.quality_cadence`** — when to run the quality pipeline:
|
|
67
70
|
|
|
68
71
|
| Value | Pipeline runs |
|
|
69
72
|
|---|---|
|
|
@@ -75,28 +78,80 @@ Missing / unreadable / unknown → fall back to `end_of_roadmap`.
|
|
|
75
78
|
The Iron Law [`verify-before-complete`](../../rules/verify-before-complete.md)
|
|
76
79
|
still mandates fresh quality output before any "complete" claim.
|
|
77
80
|
|
|
81
|
+
**`roadmap.dashboard_regen_cadence`** — when to run the dashboard
|
|
82
|
+
subprocess between steps:
|
|
83
|
+
|
|
84
|
+
| Value | `./agent-config roadmap:progress` runs |
|
|
85
|
+
|---|---|
|
|
86
|
+
| `per_step` (default) | After every checkbox flip |
|
|
87
|
+
| `every_5_steps` | Every 5th closed step + at phase boundary + at reply end |
|
|
88
|
+
| `phase_boundary` | Only at phase boundaries + run end |
|
|
89
|
+
|
|
90
|
+
`process-step` ignores this — single-step runs always regen at step
|
|
91
|
+
end. Any file-shape touch (rename / phase add / archive — Iron Law 1
|
|
92
|
+
of [`roadmap-progress-sync`](../../rules/roadmap-progress-sync.md))
|
|
93
|
+
forces an immediate regen regardless of cadence. The checkbox flip
|
|
94
|
+
itself is **never** batchable — only the subprocess.
|
|
95
|
+
|
|
78
96
|
## 5. Step loop
|
|
79
97
|
|
|
80
98
|
For each open step in the working set (scope-bound — see wrapper):
|
|
81
99
|
|
|
82
|
-
|
|
100
|
+
0. **CI-step gate** — per
|
|
101
|
+
[`roadmap-ci-steps-policy`](../../rules/roadmap-ci-steps-policy.md).
|
|
102
|
+
When `quality.local_auto_run: false` and the step text matches a
|
|
103
|
+
CI-shaped literal (`task ci`, `task ci-fast`, `task ci-strict`,
|
|
104
|
+
`make ci`, `make test`, `npm/pnpm run check`, `yarn check`,
|
|
105
|
+
`composer test`, whole-suite `vendor/bin/phpunit`, whole-suite
|
|
106
|
+
`php artisan test`) **without** an inline
|
|
107
|
+
`<!-- carve-out: new-gate-verification -->` marker → flip the
|
|
108
|
+
checkbox to `[-]`, append
|
|
109
|
+
`<!-- skipped: quality.local_auto_run=false → remote CI is the gate -->`
|
|
110
|
+
on the same line, regenerate the dashboard, continue to the next
|
|
111
|
+
step. Never run the gate. Carve-out marker present → run normally
|
|
112
|
+
(new gate must be verified once locally). Setting `true` → run
|
|
113
|
+
normally.
|
|
114
|
+
1. **Bundled read — one parallel tool-call block.** The step
|
|
115
|
+
description, the immediately-relevant code files, and any
|
|
116
|
+
guideline/context the step cites are **independent** reads and
|
|
117
|
+
**must** be dispatched together, not serially.
|
|
118
|
+
|
|
119
|
+
```
|
|
120
|
+
parallel:
|
|
121
|
+
- view agents/roadmaps/<file>.md (the step's section)
|
|
122
|
+
- view <files cited in the step text>
|
|
123
|
+
- codebase-retrieval (only if the step is vague)
|
|
124
|
+
```
|
|
125
|
+
|
|
126
|
+
Anti-pattern: `view step` → think → `view file A` → think →
|
|
127
|
+
`view file B`. That's 3 round-trips for what should be 1.
|
|
83
128
|
2. Analyze the codebase for what the step requires.
|
|
84
129
|
3. Decide and act — implement. **No "should I implement this?" prompt.**
|
|
85
130
|
4. **Open question handling:**
|
|
86
131
|
- **Council on** → invoke per [`ai-council`](../../skills/ai-council/SKILL.md),
|
|
87
132
|
integrate convergence, proceed. Token spend was opted in.
|
|
88
133
|
- **Council off** → halt, surface once, wait. Resume on next turn.
|
|
89
|
-
5. **Atomic flip
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
134
|
+
5. **Atomic flip — same reply, every step.**
|
|
135
|
+
Flip the checkbox in `agents/roadmaps/<file>.md`: `[x]` done ·
|
|
136
|
+
`[~]` partial · `[-]` skipped. **Non-skippable, non-batchable**
|
|
137
|
+
per Iron Law 2 of
|
|
138
|
+
[`roadmap-progress-sync`](../../rules/roadmap-progress-sync.md).
|
|
139
|
+
A loop iteration that lands work without flipping its box is a
|
|
140
|
+
rule violation. Do not save flips for the archive commit.
|
|
141
|
+
6. **Dashboard regen — cadence-gated.** Run
|
|
142
|
+
`./agent-config roadmap:progress` when due per
|
|
143
|
+
`roadmap.dashboard_regen_cadence` (resolved in § 4):
|
|
144
|
+
- `per_step` → always after the flip.
|
|
145
|
+
- `every_5_steps` → after the 5th, 10th, … closed step **of this
|
|
146
|
+
run**, or when the reply ends with closed steps pending regen.
|
|
147
|
+
- `phase_boundary` → skip; the boundary handler in § 5 wrapper /
|
|
148
|
+
§ 6 runs the regen.
|
|
149
|
+
- Any file-shape touch (rename / phase add / archive — Iron Law 1)
|
|
150
|
+
→ run immediately regardless of cadence.
|
|
151
|
+
|
|
152
|
+
Skipped regens accumulate into the next due regen — the markdown
|
|
153
|
+
file is the source of truth between regens.
|
|
154
|
+
7. Run quality pipeline if cadence is `per_step`.
|
|
100
155
|
|
|
101
156
|
### Halt conditions
|
|
102
157
|
|
|
@@ -62,9 +62,13 @@ 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
|
+
| `ai-video-technical-director` | specialist | provider tuning — Veo / Kling / OpenAI / Higgsfield / Sora grammar, token caps, audio flags |
|
|
65
67
|
|
|
66
68
|
More specialists may land in v1.1+ — each must pass the
|
|
67
|
-
Unique-Questions heuristic before being drafted.
|
|
69
|
+
Unique-Questions heuristic before being drafted. Removed personas
|
|
70
|
+
are deleted in-commit (no soak window) per
|
|
71
|
+
[`persona-governance § Deprecation path`](../rules/persona-governance.md).
|
|
68
72
|
|
|
69
73
|
## How skills use personas
|
|
70
74
|
|
|
@@ -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-storyteller` skill).
|
|
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-storyteller` skill — 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-storyteller` skill) 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-storyteller` skill — when the beat is emotional rather than
|
|
96
|
+
procedural; the storyteller skill 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.
|
|
@@ -16,10 +16,15 @@ profile:
|
|
|
16
16
|
- editorial-calendar
|
|
17
17
|
- release-comms
|
|
18
18
|
- prompt-engineering-patterns
|
|
19
|
+
- character-consistency
|
|
19
20
|
surface:
|
|
20
21
|
commands_hint:
|
|
21
22
|
- work
|
|
22
23
|
- post-as
|
|
23
24
|
- ghostwriter
|
|
24
25
|
- optimize-prompt
|
|
26
|
+
- video:from-script
|
|
27
|
+
- video:storyboard
|
|
28
|
+
- video:scene
|
|
29
|
+
- video:stitch
|
|
25
30
|
docs_first_pointer: "docs/getting-started-by-role.md#content_creator"
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
---
|
|
2
|
+
type: "auto"
|
|
3
|
+
tier: "2a"
|
|
4
|
+
description: "When generating AI video/image/voice — surface project-local media policies (likeness, style, public-figures, voice-cloning, disclosure)"
|
|
5
|
+
source: package
|
|
6
|
+
triggers:
|
|
7
|
+
- keyword: "/video:"
|
|
8
|
+
- keyword: "/image:"
|
|
9
|
+
- keyword: "/audio:"
|
|
10
|
+
- keyword: "deepfake"
|
|
11
|
+
- keyword: "voice clone"
|
|
12
|
+
- keyword: "voice cloning"
|
|
13
|
+
- keyword: "likeness"
|
|
14
|
+
- keyword: "brand impersonation"
|
|
15
|
+
- phrase: "in the style of"
|
|
16
|
+
- phrase: "in the voice of"
|
|
17
|
+
- phrase: "as [public figure]"
|
|
18
|
+
- phrase: "impersonate"
|
|
19
|
+
applies_to_user_types:
|
|
20
|
+
- "creator"
|
|
21
|
+
- "marketing"
|
|
22
|
+
- "gtm"
|
|
23
|
+
validator_ignore:
|
|
24
|
+
- type: "substring"
|
|
25
|
+
pattern: "../../agents/"
|
|
26
|
+
reason: "Routing rule whose subject matter is the project-local agents/policies/media/ tree; every body link points there by design."
|
|
27
|
+
- type: "substring"
|
|
28
|
+
pattern: ".agent-src.uncompressed/"
|
|
29
|
+
reason: "Rule contrasts project-local placement with the .agent-src.uncompressed/rules/ alternative — mentioning the path is the argument."
|
|
30
|
+
---
|
|
31
|
+
|
|
32
|
+
# Media Governance Routing
|
|
33
|
+
|
|
34
|
+
## Iron Law
|
|
35
|
+
|
|
36
|
+
```
|
|
37
|
+
WHEN AI VIDEO, IMAGE, OR VOICE GENERATION FIRES, CONSULT THE PROJECT-LOCAL
|
|
38
|
+
MEDIA POLICIES IN agents/policies/media/ BEFORE EMITTING THE PROMPT TO
|
|
39
|
+
THE PROVIDER. REFUSE-AND-SURFACE OVER GUESS-AND-RENDER.
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
Routes agent to project-local media governance policy layer at [`agents/policies/media/`](../../agents/policies/media/) when video / image / voice surface fires. Policies are LLM-readable decision frameworks consulted in-session, not Python-enforced gates — see [`agents/policies/media/README.md § Enforcement model`](../../agents/policies/media/README.md) for full agent-in-the-loop contract.
|
|
43
|
+
|
|
44
|
+
## What this rule surfaces
|
|
45
|
+
|
|
46
|
+
Any trigger match → agent loads into context:
|
|
47
|
+
|
|
48
|
+
- [`agents/policies/media/likeness.md`](../../agents/policies/media/likeness.md) — real person's visual likeness.
|
|
49
|
+
- [`agents/policies/media/style.md`](../../agents/policies/media/style.md) — named living artist's distinctive style.
|
|
50
|
+
- [`agents/policies/media/public-figures.md`](../../agents/policies/media/public-figures.md) — recognised public figures.
|
|
51
|
+
- [`agents/policies/media/voice-cloning.md`](../../agents/policies/media/voice-cloning.md) — vocal likeness.
|
|
52
|
+
- [`agents/policies/media/disclosure.md`](../../agents/policies/media/disclosure.md) — mandatory non-removable AI-generation disclosure.
|
|
53
|
+
- [`agents/policies/media/brand-impersonation.md`](../../agents/policies/media/brand-impersonation.md) — brand / broadcaster identity imitation.
|
|
54
|
+
- [`agents/policies/media/transparency.md`](../../agents/policies/media/transparency.md) — provenance metadata (C2PA, SynthID).
|
|
55
|
+
|
|
56
|
+
Each policy carries own trigger block → within active context agent narrows from superset to policies whose specific patterns actually fired (e.g. prompt naming public figure → `public-figures.md` + `disclosure.md`; `--no-disclosure` → `disclosure.md` standalone).
|
|
57
|
+
|
|
58
|
+
## Why project-local, not `.agent-src.uncompressed/rules/`
|
|
59
|
+
|
|
60
|
+
Seven media policies live under [`agents/policies/media/`](../../agents/policies/media/), not as `.agent-src.uncompressed/rules/domain-safety-media-*.md`, for three reasons:
|
|
61
|
+
|
|
62
|
+
1. **Consumed by skills + adapters**, not surfaced as standalone always-loaded prose. Cost non-trivial (7 × ~80 lines = ~560 lines always-context if hoisted to rules), and most sessions never touch video / image / voice surface.
|
|
63
|
+
2. **Enforcement model project-local** — working precedent (`/ghostwriter:*` mandatory footer in `write-engine.md`) + audit log (session transcripts) are project artifacts. Rules under `.agent-src.uncompressed/` are tool-portable governance; these policies are domain-specific bindings.
|
|
64
|
+
3. **Extraction to reusable domain pack explicitly deferred** until second non-video domain (audio, image, docs, exports) lands with overlapping execution surfaces. Until then, one-domain abstraction structurally premature — policies stay project-local, routing rule on-demand bridge.
|
|
65
|
+
|
|
66
|
+
This routing rule is the bridge: sits in always-loaded rule set so trigger keywords surface project-local policies into context on demand, without paying full always-loaded cost.
|
|
67
|
+
|
|
68
|
+
## CI reachability guarantee
|
|
69
|
+
|
|
70
|
+
[`scripts/lint_media_policy_linkage.py`](../../scripts/lint_media_policy_linkage.py) fails build if any policy file under `agents/policies/media/` not linked from:
|
|
71
|
+
|
|
72
|
+
- this routing rule, **or**
|
|
73
|
+
- a skill's `## Policies` see-also block, **or**
|
|
74
|
+
- another policy file's `## See also` block.
|
|
75
|
+
|
|
76
|
+
Policy that no skill, rule, or sibling policy references → silent policy. CI check is structural reachability guarantee that agent-in-the-loop model rests on.
|
|
77
|
+
|
|
78
|
+
## See also
|
|
79
|
+
|
|
80
|
+
- [`agents/policies/media/README.md`](../../agents/policies/media/README.md) — full enforcement-model contract.
|
|
81
|
+
- [`.augment/rules/ask-when-uncertain.md`](../../.augment/rules/ask-when-uncertain.md) — single-question refusal-path discipline every policy depends on.
|
|
82
|
+
- [`docs/contracts/write-engine.md`](../docs/contracts/write-engine.md) — prose-disclosure precedent extended to media by [`disclosure.md`](../../agents/policies/media/disclosure.md).
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
---
|
|
2
|
+
type: "auto"
|
|
3
|
+
tier: "2a"
|
|
4
|
+
description: "When creating, editing, or proposing personas — enforce per-domain cap (≤ 2 specialists), ≥ 1 skill citation, and the deprecation path"
|
|
5
|
+
source: package
|
|
6
|
+
triggers:
|
|
7
|
+
- path_prefix: ".agent-src.uncompressed/personas/"
|
|
8
|
+
- path_prefix: ".agent-src/personas/"
|
|
9
|
+
- keyword: "persona"
|
|
10
|
+
- keyword: "personas"
|
|
11
|
+
- phrase: "new persona"
|
|
12
|
+
- phrase: "add a persona"
|
|
13
|
+
- phrase: "specialist persona"
|
|
14
|
+
- phrase: "review lens"
|
|
15
|
+
routes_to:
|
|
16
|
+
- "contract:persona-schema"
|
|
17
|
+
applies_to_user_types:
|
|
18
|
+
- "maintainer"
|
|
19
|
+
- "developer"
|
|
20
|
+
validator_ignore:
|
|
21
|
+
- type: "substring"
|
|
22
|
+
pattern: "../../docs/"
|
|
23
|
+
reason: "Rule routes to docs/contracts/persona-schema.md and docs/personas.md — the canonical persona catalog and schema live there by design."
|
|
24
|
+
- type: "substring"
|
|
25
|
+
pattern: ".agent-src.uncompressed/"
|
|
26
|
+
reason: "Rule documents the persona authoring tree (.agent-src.uncompressed/personas/) as the deprecation-path operand."
|
|
27
|
+
---
|
|
28
|
+
|
|
29
|
+
# Persona Governance
|
|
30
|
+
|
|
31
|
+
## Iron Law
|
|
32
|
+
|
|
33
|
+
```
|
|
34
|
+
ONE PERSONA, ONE OWNER, ONE SKILL CITATION, ONE DOMAIN SLOT.
|
|
35
|
+
NO NEW SPECIALIST WITHOUT A DEPRECATION CANDIDATE WHEN THE DOMAIN IS FULL.
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
Personas are review lenses, not free real estate. Every specialist persona has a maintenance cost: it must stay aligned with the schema, the cited skills must still want it, and the per-domain reasoning surface must not bloat to the point that no single persona is load-bearing. This rule routes the agent to [`docs/contracts/persona-schema.md`](../docs/contracts/persona-schema.md) and [`docs/personas.md`](../../docs/personas.md) and enforces the four discipline checks below.
|
|
39
|
+
|
|
40
|
+
## The four checks
|
|
41
|
+
|
|
42
|
+
### 1. Per-domain cap — ≤ 2 specialised personas per content domain
|
|
43
|
+
|
|
44
|
+
A **content domain** is a self-contained creative or technical surface that one or two specialist personas can fully cover. Current domains:
|
|
45
|
+
|
|
46
|
+
| Domain | Specialists allowed | Examples |
|
|
47
|
+
|---|---|---|
|
|
48
|
+
| ai-video / ai-image / ai-audio | ≤ 2 | one director-shaped lens + one technical-tuning lens |
|
|
49
|
+
| backend engineering | ≤ 2 | architect + ORM-tamer |
|
|
50
|
+
| frontend engineering | ≤ 2 | component / lifecycle + design / a11y |
|
|
51
|
+
| security | ≤ 2 | abuse-case + secrets-and-trust |
|
|
52
|
+
| gtm / growth | ≤ 2 | CMO + RevOps |
|
|
53
|
+
| money / strategy | ≤ 2 | finance-partner + strategist |
|
|
54
|
+
| people / org | ≤ 2 | engineering-manager + people-strategist |
|
|
55
|
+
| customer / discovery | ≤ 2 | discovery-lead + customer-success-lead |
|
|
56
|
+
|
|
57
|
+
**Core personas** (`developer`, `senior-engineer`, `product-owner`, `stakeholder`, `critical-challenger`, `ai-agent`) are exempt — they are always-loaded cross-cutting lenses, not domain specialists.
|
|
58
|
+
|
|
59
|
+
A new specialist into a full domain MUST come with a deprecation candidate from the same domain. The agent surfaces both, then runs an ai-council debate (per [`ai-council`](../../.agent-src/skills/ai-council/SKILL.md)) before any rename / merge / delete.
|
|
60
|
+
|
|
61
|
+
### 2. Skill citation floor — ≥ 1 cite before merge
|
|
62
|
+
|
|
63
|
+
A specialist persona without a `personas: [<id>]` citation in at least one skill's frontmatter is dead weight. The PR adding the persona MUST also add the citation, OR the PR is rejected. Citation map lives in [`docs/personas.md § Skill citations`](../../docs/personas.md#skill-citations).
|
|
64
|
+
|
|
65
|
+
### 3. Deprecation path — delete immediately, record in commit
|
|
66
|
+
|
|
67
|
+
A persona being removed is **deleted in the same commit** that lands its replacement. The commit message names the successor (or "merged into X") and cites the council decision (or maintainer rationale) that authorised it. No soak window — internal personas have no external consumers; a persona file kept around as a tombstone is dead weight the linter still loads. No silent deletes either: the audit trail is the commit, not a docs table.
|
|
68
|
+
|
|
69
|
+
### 4. Schema conformance — the skill linter is the gate
|
|
70
|
+
|
|
71
|
+
Every persona file is linted against [`docs/contracts/persona-schema.md`](../docs/contracts/persona-schema.md) by the skill linter: frontmatter shape, tier enum, wing enum, required sections per tier, line budget per tier (with wing override), `Unique Questions` ≥ 3, filename / id match, description ≤ 160 chars. The agent runs `python3 scripts/skill_linter.py` before any persona PR is marked ready.
|
|
72
|
+
|
|
73
|
+
## Failure modes — what counts as a violation
|
|
74
|
+
|
|
75
|
+
- Adding a third specialist to a full domain without naming the deprecation candidate.
|
|
76
|
+
- Landing a specialist with no `personas: [<id>]` cite in any skill.
|
|
77
|
+
- Renaming or deleting a persona file without naming the successor (or sunset reason) in the commit message.
|
|
78
|
+
- Editing core-tier personas in-place with breaking changes (rename, section removal) without bumping to a new id.
|
|
79
|
+
- Skipping the skill linter (`python3 scripts/skill_linter.py`) on a persona PR.
|
|
80
|
+
|
|
81
|
+
## Day-one state
|
|
82
|
+
|
|
83
|
+
Resolved 2026-05-17 via two-round ai-council debate (members: anthropic/claude-sonnet-4-5, openai/gpt-4o — converged delete-and-fold): `pixar-storyboard-artist` deleted; acting / beat-decomposition lens folded into [`pixar-storyteller`](../skills/pixar-storyteller/SKILL.md) skill body. Active per-domain count for `ai-video` now 2 (`ai-video-technical-director`, `hollywood-director`), within cap. Total active personas in root cluster: 24 (plus 5 advisors in `personas/advisors/`). Full inventory + ownership in [`docs/personas.md`](../../docs/personas.md).
|
|
84
|
+
|
|
85
|
+
## See also
|
|
86
|
+
|
|
87
|
+
- [`docs/contracts/persona-schema.md`](../docs/contracts/persona-schema.md) — schema lock, tiers, sections, size budgets, linter enforcement surface.
|
|
88
|
+
- [`docs/personas.md`](../../docs/personas.md) — active persona catalog, citation map, ownership column.
|
|
89
|
+
- [`ai-council`](../../.agent-src/skills/ai-council/SKILL.md) — neutral second-opinion mechanism used for merge / deprecation decisions.
|
|
90
|
+
- [`skill-quality`](skill-quality.md) — sibling discipline rule for skill files.
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
---
|
|
2
|
+
type: "auto"
|
|
3
|
+
tier: "2a"
|
|
4
|
+
alwaysApply: false
|
|
5
|
+
description: "Git history after a push — squash/amend/rebase of pushed commits must pair with immediate re-push in same turn; stop on divergent state"
|
|
6
|
+
source: package
|
|
7
|
+
triggers:
|
|
8
|
+
- intent: "squash the pushed branch"
|
|
9
|
+
- intent: "clean up commits on the PR branch"
|
|
10
|
+
- intent: "tidy history after pushing"
|
|
11
|
+
- keyword: "git rebase -i"
|
|
12
|
+
- keyword: "--amend"
|
|
13
|
+
- keyword: "force-push"
|
|
14
|
+
- keyword: "--force-with-lease"
|
|
15
|
+
- phrase: "branch diverged"
|
|
16
|
+
- phrase: "pull --rebase failed"
|
|
17
|
+
- phrase: "ahead and behind"
|
|
18
|
+
routes_to:
|
|
19
|
+
- "skill:git-workflow"
|
|
20
|
+
---
|
|
21
|
+
|
|
22
|
+
# Post-Push Rewrite Discipline
|
|
23
|
+
|
|
24
|
+
## Iron Law
|
|
25
|
+
|
|
26
|
+
```
|
|
27
|
+
ONCE PUSHED, A COMMIT IS PUBLISHED.
|
|
28
|
+
ANY REWRITE OF PUSHED HISTORY MUST PAIR WITH AN IMMEDIATE RE-PUSH
|
|
29
|
+
IN THE SAME TURN — OR DON'T REWRITE.
|
|
30
|
+
NEVER END A SESSION WITH REWRITTEN-BUT-UNPUSHED LOCAL HISTORY.
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
## Two protective stops
|
|
34
|
+
|
|
35
|
+
1. **Pre-rewrite stop.** Before any squash / amend / rebase on a
|
|
36
|
+
branch that is on origin: `git fetch && git rev-list --left-right
|
|
37
|
+
--count HEAD...@{u}`. If **either** side is non-zero — STOP and
|
|
38
|
+
route to `skill:git-workflow § Divergent-State Recovery`. A blind
|
|
39
|
+
`git pull --rebase` in this state is the documented failure mode.
|
|
40
|
+
|
|
41
|
+
2. **Post-rewrite stop.** After the rewrite, push in the **same turn**
|
|
42
|
+
with `--force-with-lease=<branch>:<fetched-sha>` and verify
|
|
43
|
+
`git rev-parse origin/<branch>` equals `git rev-parse HEAD`.
|
|
44
|
+
If the push fails (hook, network, token budget) — fix the cause
|
|
45
|
+
and re-push **before** ending the session, committing new work,
|
|
46
|
+
or handing off.
|
|
47
|
+
|
|
48
|
+
If either stop fires and resolution is not immediate → tag the state
|
|
49
|
+
(`git tag local-rewritten-tip-<ISO-date>`) and hand control back to
|
|
50
|
+
the user. Do not let a new session inherit a dirty divergence.
|
|
51
|
+
|
|
52
|
+
## Why this rule exists
|
|
53
|
+
|
|
54
|
+
A previous session squashed a pushed branch, the push hook failed at
|
|
55
|
+
the token boundary, the session ended — and the next session saw
|
|
56
|
+
local and origin pointing at different SHAs for the same logical work.
|
|
57
|
+
A blind `git pull --rebase` cascaded into conflicts across every
|
|
58
|
+
derived file (`.compression-hashes.json`, router projections). Recovery
|
|
59
|
+
required forensic SHA-archaeology. This rule makes that sequence
|
|
60
|
+
structurally impossible: rewrite without immediate push is forbidden.
|
|
61
|
+
|
|
62
|
+
## See also
|
|
63
|
+
|
|
64
|
+
- [`no-unsolicited-rebase`](no-unsolicited-rebase.md) — whether to
|
|
65
|
+
rewrite at all (this rule kicks in once rewriting is authorized).
|
|
66
|
+
- [`skill:git-workflow`](../skills/git-workflow/SKILL.md) — Safe
|
|
67
|
+
Squash-After-Push protocol and Divergent-State Recovery decision
|
|
68
|
+
tree.
|
|
69
|
+
- [`commit-policy`](commit-policy.md) — never rewrite or commit
|
|
70
|
+
without explicit authorization.
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
---
|
|
2
|
+
type: "auto"
|
|
3
|
+
tier: "2a"
|
|
4
|
+
description: "When editing an AI video/image/audio adapter — declare lifecycle tier (experimental | stable | deprecated | community); never default to non-stable"
|
|
5
|
+
source: package
|
|
6
|
+
triggers:
|
|
7
|
+
- keyword: "/video:"
|
|
8
|
+
- keyword: "/image:"
|
|
9
|
+
- keyword: "/audio:"
|
|
10
|
+
- keyword: "ai-video"
|
|
11
|
+
- keyword: "ai-image"
|
|
12
|
+
- keyword: "ai-audio"
|
|
13
|
+
- keyword: "adapter"
|
|
14
|
+
- keyword: "provider"
|
|
15
|
+
- path_prefix: "scripts/ai-video/adapters/"
|
|
16
|
+
- path_prefix: "agents/.ai-video.xml"
|
|
17
|
+
- phrase: "lifecycle"
|
|
18
|
+
- phrase: "default provider"
|
|
19
|
+
routes_to:
|
|
20
|
+
- "contract:provider-lifecycle"
|
|
21
|
+
applies_to_user_types:
|
|
22
|
+
- "creator"
|
|
23
|
+
- "developer"
|
|
24
|
+
- "maintainer"
|
|
25
|
+
---
|
|
26
|
+
|
|
27
|
+
# Provider Lifecycle Discipline
|
|
28
|
+
|
|
29
|
+
## Iron Law
|
|
30
|
+
|
|
31
|
+
```
|
|
32
|
+
NEVER DEFAULT TO A NON-STABLE PROVIDER SILENTLY.
|
|
33
|
+
SURFACE THE LIFECYCLE TIER. ASK BEFORE RUNNING.
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
This rule routes the agent to [`docs/contracts/provider-lifecycle.md`](../docs/contracts/provider-lifecycle.md) whenever a `/video:* / /image:* / /audio:*` surface fires, an adapter under `scripts/ai-video/adapters/` is read or edited, or `agents/.ai-video.xml.example` (or the operator's `agents/.ai-video.xml`) is in play. The contract defines four tiers — `experimental | stable | deprecated | community` — and the agent's obligations per tier.
|
|
37
|
+
|
|
38
|
+
## What this rule enforces
|
|
39
|
+
|
|
40
|
+
1. **Read the tier before picking.** When the agent resolves a provider (from `--provider <id>`, from `<default-video-provider>` / `<default-image-provider>`, or from a skill's default), it MUST read both:
|
|
41
|
+
- the `<lifecycle>` element under `<provider id="…">` in `agents/.ai-video.xml.example` (or the operator's `.ai-video.xml`), and
|
|
42
|
+
- the `Lifecycle:` header comment in `scripts/ai-video/adapters/<id>.sh`.
|
|
43
|
+
Mismatch between the two is a contract violation and MUST be surfaced before running.
|
|
44
|
+
|
|
45
|
+
2. **Refuse-and-surface on non-stable.** If the resolved default is `experimental`, `deprecated`, or `community`, the agent surfaces the tier and the path to the contract, then emits **one** clarifying question (per [`ask-when-uncertain`](ask-when-uncertain.md)): either confirm the non-stable run, or pick a `stable` provider. No silent default. No "I'll just try it".
|
|
46
|
+
|
|
47
|
+
3. **Refuse `deprecated` without naming the successor.** A `deprecated` adapter's header comment records the successor; the agent surfaces "X is deprecated; successor: Y" before any run, even with confirmation.
|
|
48
|
+
|
|
49
|
+
4. **Record the tier in the run summary.** The summary line emitted after every `/video:* / /image:* / /audio:*` run names the chosen provider AND its tier. This is the audit-log entry the agent-in-the-loop enforcement model rests on.
|
|
50
|
+
|
|
51
|
+
5. **Promotion is the maintainer's call.** The agent never auto-promotes `experimental → stable`. It MAY draft a promotion checklist (see [`docs/contracts/provider-lifecycle.md § 2`](../docs/contracts/provider-lifecycle.md#-2--promotion-path)) for maintainer review, but the tier-flip commit is human-authored.
|
|
52
|
+
|
|
53
|
+
## Failure modes — what counts as a violation
|
|
54
|
+
|
|
55
|
+
- Running `/video:scene` against the `<default-video-provider>` without reading the lifecycle tag first → violation.
|
|
56
|
+
- Picking a `community` provider because it was named in the prompt, without surfacing the tier → violation.
|
|
57
|
+
- Editing an adapter and leaving its header `Lifecycle:` comment out of sync with `agents/.ai-video.xml.example` → violation (CI does not catch this; the agent must).
|
|
58
|
+
- Auto-promoting an adapter from `experimental` to `stable` because "dry-run worked" → violation. Promotion requires a maintainer-captured real-API smoke trace under `agents/ai-video/smoke-traces/`.
|
|
59
|
+
|
|
60
|
+
## Day-one state
|
|
61
|
+
|
|
62
|
+
All five shipped adapters (`openai-images`, `gemini-veo`, `kling`, `higgsfield`, `sora`) ship as `experimental`. This means **every** default `/video:* / /image:*` run today triggers the refuse-and-surface path. That is intentional — it is the conservative-by-construction posture the contract argues for. As maintainers capture smoke traces and flip individual adapters to `stable`, the friction reduces per-adapter.
|
|
63
|
+
|
|
64
|
+
## Why agent-in-the-loop, not Python gate
|
|
65
|
+
|
|
66
|
+
A Python pre-run gate enumerating tier-by-command rules would either be too coarse (`experimental → block`, breaking day-to-day dev iteration) or too detailed (per-command tier matrix, drifting from reality on every new provider). The agent reading the tag at run time, surfacing the tier, and asking is the correct enforcement surface: the model that picked the provider is the model that surfaces the obligation, and the human is the policy decision point.
|
|
67
|
+
|
|
68
|
+
The CI guarantee is structural reachability — the linter would fail if a provider was declared in `agents/.ai-video.xml.example` without a lifecycle tag (extension planned). It does not enforce the runtime obligation; the agent does.
|
|
69
|
+
|
|
70
|
+
## See also
|
|
71
|
+
|
|
72
|
+
- [`docs/contracts/provider-lifecycle.md`](../docs/contracts/provider-lifecycle.md) — the full tier definitions, promotion / demotion criteria, and day-one assignment matrix.
|
|
73
|
+
- [`scripts/ai-video/lib/adapter-contract.md`](../../scripts/ai-video/lib/adapter-contract.md) — the four-method shell surface every adapter implements; the tier tag is read alongside this contract.
|
|
74
|
+
- [`media-governance-routing`](media-governance-routing.md) — sibling tier-2a rule that surfaces the prompt-side policy layer; this rule covers the provider-side discipline.
|
|
75
|
+
- [`ask-when-uncertain`](ask-when-uncertain.md) — the one-question-per-turn discipline the refuse-and-surface path uses.
|