@event4u/agent-config 2.24.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 (51) 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 +5 -5
  4. package/.agent-src/commands/video/storyboard.md +1 -1
  5. package/.agent-src/contexts/execution/roadmap-process-loop.md +69 -14
  6. package/.agent-src/personas/README.md +3 -2
  7. package/.agent-src/personas/ai-video-technical-director.md +2 -2
  8. package/.agent-src/personas/hollywood-director.md +3 -3
  9. package/.agent-src/profiles/content_creator.yml +5 -0
  10. package/.agent-src/rules/media-governance-routing.md +82 -0
  11. package/.agent-src/rules/persona-governance.md +90 -0
  12. package/.agent-src/rules/post-push-rewrite-discipline.md +70 -0
  13. package/.agent-src/rules/provider-lifecycle-discipline.md +75 -0
  14. package/.agent-src/rules/roadmap-ci-steps-policy.md +145 -0
  15. package/.agent-src/rules/roadmap-progress-sync.md +11 -5
  16. package/.agent-src/skills/character-consistency/SKILL.md +12 -1
  17. package/.agent-src/skills/git-workflow/SKILL.md +133 -0
  18. package/.agent-src/skills/motion-choreographer/SKILL.md +12 -0
  19. package/.agent-src/skills/pixar-storyteller/SKILL.md +19 -6
  20. package/.agent-src/skills/roadmap-writing/SKILL.md +10 -0
  21. package/.agent-src/skills/scene-expander/SKILL.md +22 -7
  22. package/.agent-src/skills/video-director/SKILL.md +13 -0
  23. package/.agent-src/templates/agents/agent-project-settings.example.yml +1 -1
  24. package/.agent-src/templates/roadmaps.md +16 -0
  25. package/.claude-plugin/marketplace.json +1 -1
  26. package/CHANGELOG.md +43 -0
  27. package/README.md +5 -3
  28. package/config/agent-settings.template.yml +26 -0
  29. package/docs/architecture.md +1 -1
  30. package/docs/catalog.md +5 -2
  31. package/docs/contracts/file-ownership-matrix.json +81 -13
  32. package/docs/contracts/provider-lifecycle.md +122 -0
  33. package/docs/decisions/ADR-011-domain-pack-readiness.md +213 -0
  34. package/docs/decisions/INDEX.md +1 -0
  35. package/docs/getting-started-by-role.md +10 -0
  36. package/docs/getting-started.md +1 -1
  37. package/docs/personas.md +73 -26
  38. package/docs/profiles.md +9 -4
  39. package/package.json +1 -1
  40. package/scripts/_tmp_scan_framework_leakage.py +119 -0
  41. package/scripts/ai-video/adapters/gemini-veo.sh +5 -0
  42. package/scripts/ai-video/adapters/higgsfield.sh +6 -0
  43. package/scripts/ai-video/adapters/kling.sh +5 -0
  44. package/scripts/ai-video/adapters/openai-images.sh +5 -0
  45. package/scripts/ai-video/adapters/sora.sh +6 -0
  46. package/scripts/check_portability.py +6 -0
  47. package/scripts/lint_media_policy_linkage.py +140 -0
  48. package/scripts/lint_persona_governance.py +164 -0
  49. package/scripts/lint_roadmap_ci_steps.py +182 -0
  50. package/scripts/smoke/schema.sh +1 -1
  51. package/.agent-src/personas/pixar-storyboard-artist.md +0 -98
@@ -39,17 +39,45 @@ The user may or may not provide a PR URL or branch name.
39
39
  - If no PR found → use `git diff origin/{default}..HEAD --stat` for the branch diff.
40
40
  3. **Never** reuse a PR number from earlier in the conversation.
41
41
 
42
- ### 2. Gather context
43
-
44
- - **Jira ticket**: Extract ticket ID from branch name (e.g. `fix/DEV-4673-description` → `DEV-4673`).
45
- - If found fetch via Jira API (`GET /issue/{ticketId}`).
46
- - If not found ask the user for a ticket number. Proceed without if none.
47
- - **Diff summary**: `git diff origin/{default}..HEAD --stat` for changed files.
48
- - **Commit messages**: `git log origin/{default}..HEAD --format="%s"` for what was done.
49
- - **PR template**: **MUST** read `.github/pull_request_template.md`. This is mandatory, not optional.
50
- - **Read key changed files** to understand what was done — look for migrations, new classes,
51
- modified services, route changes, config changes.
52
- - **Check roadmap/agent docs** that describe the feature intent (if they exist).
42
+ ### 2. Gather context — **one parallel tool-call block**
43
+
44
+ The four primary fetches below are **independent** and **must** be
45
+ dispatched in a single parallel tool-call block, not serially. Serial
46
+ reads here add 3+ round-trips per PR for zero benefit.
47
+
48
+ ```
49
+ parallel:
50
+ 1. Jira API — GET /issue/{ticketId} (skip when no ticket ID)
51
+ 2. git diff — git diff origin/{default}..HEAD --stat
52
+ 3. git log — git log origin/{default}..HEAD --format="%s"
53
+ 4. view PR template — .github/pull_request_template.md
54
+ ```
55
+
56
+ After the block returns:
57
+
58
+ - **Jira ticket**: ticket ID is extracted from the branch name
59
+ (e.g. `fix/DEV-4673-description` → `DEV-4673`) **before** the
60
+ parallel block. No ticket → skip fetch 1 silently; ask the user
61
+ for a number only after the block, and only if needed.
62
+ - **PR template missing** → fall back to the structure in § 4.
63
+ - **Read key changed files** (migrations, new classes, modified
64
+ services, route/config changes) — second parallel block, keyed
65
+ off the diff summary. Group all file reads in one block.
66
+ - **Check roadmap/agent docs** that describe the feature intent
67
+ (if they exist) — fold into the second block.
68
+
69
+ Anti-pattern (do **not** do this):
70
+
71
+ ```
72
+ turn 1: fetch Jira
73
+ turn 2: git diff
74
+ turn 3: git log
75
+ turn 4: view template
76
+ turn 5: view file A
77
+ turn 6: view file B
78
+ ```
79
+
80
+ That's 6 round-trips for what should be 2.
53
81
 
54
82
  ### 3. Build the PR title
55
83
 
@@ -94,6 +94,44 @@ Resolve `"draft"` (first match wins):
94
94
  3. `routine_confirmations: true` → ask `1. draft / 2. ready`.
95
95
  4. Default → `true` (silent draft).
96
96
 
97
+ #### 3a. Tool selection — single-call mandate
98
+
99
+ ```
100
+ POST THE PR WITH ONE github-api CALL.
101
+ NEVER COMPOSE THE BODY THROUGH SHELL, PYTHON, OR TEMP FILES.
102
+ ```
103
+
104
+ Use the `github-api` tool **directly** with the markdown body in the
105
+ JSON `data` field. The body is a regular JSON string — escaping is the
106
+ tool's job, not yours.
107
+
108
+ ```
109
+ github-api
110
+ method: POST
111
+ path: /repos/{owner}/{repo}/pulls
112
+ data: { "title": "...", "body": "<markdown>", "head": "<branch>",
113
+ "base": "main", "draft": <bool> }
114
+ ```
115
+
116
+ **Hard prohibitions** (each one cost 3+ extra tool calls in past runs):
117
+
118
+ - ❌ `python3 -c "import urllib..."` / `python3 - <<PY ... PY` heredocs
119
+ to serialize the body or POST it.
120
+ - ❌ `save-file PR_BODY.md` → read back → `curl -d @PR_BODY.md`.
121
+ - ❌ `gh pr create --body-file …` shelling out when `github-api` is
122
+ available in this surface.
123
+ - ❌ Splitting `title` and `body` into two API calls (create + PATCH).
124
+
125
+ The body may contain any Markdown — code fences, tables, multi-line
126
+ HTML, emoji. Do **not** preprocess, escape, or strip newlines before
127
+ handing it to `github-api`.
128
+
129
+ If the surface genuinely lacks `github-api` (rare), fall back to
130
+ `gh pr create --title "..." --body-file <(echo -n "<body>")` as a
131
+ **single** shell call, never the python-urllib path.
132
+
133
+ #### 3b. Submit
134
+
97
135
  Create the PR with the approved title/body and the resolved `draft`.
98
136
 
99
137
  **Verify after `draft: false`** — the GitHub REST API sometimes ignores
@@ -126,18 +164,21 @@ Run this strip-pass **after PR creation and after every body PATCH**:
126
164
  - `Pull Request opened by [Augment Code]`
127
165
  - `Co-authored by Augment Code`
128
166
  - Any `augmentcode.com` link the user did not ask for
129
- 3. If any pattern is present, remove it together with surrounding
167
+ 3. **No match done.** Skip steps 4–5; the body is already clean.
168
+ This is the common path and **must not** spend a verify-GET.
169
+ 4. Match found → remove the footer(s) together with surrounding
130
170
  `---` separators and trailing whitespace, then:
131
171
  ```
132
172
  PATCH /repos/{owner}/{repo}/pulls/{number}
133
173
  { "body": "<cleaned body>" }
134
174
  ```
135
- 4. Re-fetch the body once more to verify the strip stuck. If a
136
- pattern reappears (server re-injection), repeat steps 2–4 once;
175
+ Re-fetch the body **once** to verify the strip stuck. If a
176
+ pattern reappears (server re-injection), repeat the PATCH once;
137
177
  if it still reappears, surface the issue to the user and stop
138
178
  (do not enter a strip/PATCH loop).
139
- 5. Briefly note in the reply how many footers were removed (or
140
- "no footers found" if clean).
179
+ 5. Briefly note in the reply how many footers were removed (omit
180
+ the line entirely when nothing was stripped — silence is the
181
+ expected path, not "no footers found").
141
182
 
142
183
  #### 4b. Show the PR URL (verbosity-gated)
143
184
 
@@ -154,6 +195,19 @@ Linked ticket + `routine_confirmations: true` → ask `1. Yes / 2. No`.
154
195
  Default (`false`) → skip silently. **Only emit a transition line when
155
196
  an actual Jira API call succeeded** — never announce "skipped".
156
197
 
198
+ #### 4d. Settings short-circuit — single read per run
199
+
200
+ `verbosity.routine_confirmations`, `verbosity.post_action_reports`, and
201
+ `commands.create_pr.preview_description` are read **once** at the top
202
+ of the run and cached for the whole `/create-pr` invocation. Do **not**
203
+ re-read `.agent-settings.yml` in 4b / 4c — both branches resolve from
204
+ the cached values from step 1.
205
+
206
+ When all three resolve to their silent defaults (`false` / `minimal` /
207
+ `false`), steps 4b–4c collapse to the single `→ #N opened: <url>` line
208
+ from 4b and a silent 4c. No extra file reads, no "checking settings…"
209
+ narration, no confirmation prompts.
210
+
157
211
  ### Rules
158
212
 
159
213
  - **Always use the PR template** from `.github/pull_request_template.md`.
@@ -5,7 +5,7 @@ cluster: video
5
5
  sub: from-script
6
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
7
  disable-model-invocation: true
8
- personas: [hollywood-director, ai-video-technical-director, pixar-storyboard-artist]
8
+ personas: [hollywood-director, ai-video-technical-director]
9
9
  skills: [scene-expander, video-director, pixar-storyteller, character-consistency, motion-choreographer]
10
10
  suggestion:
11
11
  eligible: true
@@ -19,7 +19,7 @@ suggestion:
19
19
 
20
20
  Drives a Markdown script through the full pipeline. Provider flags
21
21
  override the `<default-image-provider>` / `<default-video-provider>`
22
- from [`agents/.ai-video.xml`](../../agents/.ai-video.xml.example);
22
+ from [`agents/.ai-video.xml`](../../../agents/.ai-video.xml.example);
23
23
  absent flags fall back to the XML defaults.
24
24
 
25
25
  **Block-on-ambiguity:** a missing scene heading, an unparseable
@@ -49,7 +49,7 @@ provider in this order: command flag → `agents/.ai-video.xml` default
49
49
  Run the `scene-expander` skill: split on `## Scene N` headings, extract
50
50
  dialogue / action / ambient blocks, and emit one `scene-blueprint.yaml`
51
51
  per scene under `<project>/scenes/<id>/`. Schema:
52
- [`scene-blueprint.schema.yaml`](../skills/scene-expander/scene-blueprint.schema.yaml).
52
+ [`scene-blueprint.schema.yaml`](../../skills/scene-expander/scene-blueprint.schema.yaml).
53
53
 
54
54
  ### 4. Character lock
55
55
 
@@ -66,7 +66,7 @@ For each scene blueprint:
66
66
  2. **Safety gate (Phase 5 Step 6).** If `AIV_DRYRUN=false`, print the
67
67
  adapter, model, scene count, and estimated cost; refuse to continue
68
68
  without an explicit operator confirmation **in this turn**. Mirrors
69
- [`non-destructive-by-default`](../rules/non-destructive-by-default.md).
69
+ [`non-destructive-by-default`](../../rules/non-destructive-by-default.md).
70
70
  3. Call the image adapter (`run` subcommand) N times where N =
71
71
  `<tuning/best-of-n>` (default 1).
72
72
 
@@ -120,4 +120,4 @@ estimated cost (live mode) or `dry-run` marker. No commit. No push.
120
120
  - [`/video:scene`](scene.md) — single-scene iteration
121
121
  - [`/video:storyboard`](storyboard.md) — image-only contact sheet
122
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)
123
+ - [`scripts/ai-video/lib/adapter-contract.md`](../../../scripts/ai-video/lib/adapter-contract.md)
@@ -5,7 +5,7 @@ cluster: video
5
5
  sub: storyboard
6
6
  description: Image-only storyboard — script → scenes → blueprint → image render → contact-sheet PNG via ffmpeg montage. No video calls.
7
7
  disable-model-invocation: true
8
- personas: [hollywood-director, pixar-storyboard-artist]
8
+ personas: [hollywood-director]
9
9
  skills: [scene-expander, video-director, character-consistency]
10
10
  suggestion:
11
11
  eligible: true
@@ -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 quality cadence
64
+ ## 4. Resolve cadences — read once, cache for the run
65
65
 
66
- Read `roadmap.quality_cadence` from `.agent-settings.yml` once:
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
- 1. Read the step description and inline notes.
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 + regen** before moving to step N+1, in the **same
90
- reply** that landed step N's work:
91
- 1. Flip the checkbox in `agents/roadmaps/<file>.md`: `[x]` done ·
92
- `[~]` partial · `[-]` skipped.
93
- 2. Run `./agent-config roadmap:progress` to regenerate the
94
- dashboard.
95
- This pair is **non-skippable** and **non-batchable** per Iron Law 2
96
- of [`roadmap-progress-sync`](../../rules/roadmap-progress-sync.md). A
97
- loop iteration that lands work without flipping its box is a rule
98
- violation. Do not save flips for the archive commit.
99
- 6. Run quality pipeline if cadence is `per_step`.
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
 
@@ -63,11 +63,12 @@ the linter check list.
63
63
  |---|---|---|
64
64
  | `qa` | specialist | testability, failure scenarios |
65
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
66
  | `ai-video-technical-director` | specialist | provider tuning — Veo / Kling / OpenAI / Higgsfield / Sora grammar, token caps, audio flags |
68
67
 
69
68
  More specialists may land in v1.1+ — each must pass the
70
- 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).
71
72
 
72
73
  ## How skills use personas
73
74
 
@@ -18,7 +18,7 @@ audio capability. Refuses one-prompt-fits-all; demands a tuned variant
18
18
  per adapter. Catches prompts that would silently truncate, fall back
19
19
  to a default aspect, or drop audio on a video-only model. Not
20
20
  responsible for camera grammar (`hollywood-director`) or acting
21
- (`pixar-storyboard-artist`).
21
+ (`pixar-storyteller` skill).
22
22
 
23
23
  ## Mindset
24
24
 
@@ -77,5 +77,5 @@ count.
77
77
  ## Composes well with
78
78
 
79
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.
80
+ - `pixar-storyteller` skill — consumes the four-block storyboard; preserves beat counts in MOTION PROMPT.
81
81
  - `motion-choreographer` skill — drafts per-provider motion + audio directions against this output.
@@ -17,7 +17,7 @@ lens, the light, the camera move, blocking, and negative constraints
17
17
  are all on the page. Refuses "cinematic" as a word — it is a budget,
18
18
  a choice of glass, and a position relative to the sun. Catches shots
19
19
  still readable as stock footage. Not responsible for animation pacing
20
- (`pixar-storyboard-artist`) or provider tokens (`ai-video-technical-director`).
20
+ (`pixar-storyteller` skill) or provider tokens (`ai-video-technical-director`).
21
21
 
22
22
  ## Mindset
23
23
 
@@ -92,8 +92,8 @@ declarative sentence — no adjective stacks, no "ultra-realistic".
92
92
 
93
93
  ## Composes well with
94
94
 
95
- - `pixar-storyboard-artist` — when the beat is emotional rather than
96
- procedural; the storyboard artist names the acting, this persona
95
+ - `pixar-storyteller` skill — when the beat is emotional rather than
96
+ procedural; the storyteller skill names the acting, this persona
97
97
  names the camera around it.
98
98
  - `ai-video-technical-director` — runs after this persona to map the
99
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.