@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
@@ -0,0 +1,213 @@
1
+ ---
2
+ adr: 011
3
+ status: accepted
4
+ date: 2026-05-17
5
+ decision: domain-pack-readiness
6
+ supersedes: —
7
+ superseded_by: —
8
+ phase: v2.x · universal-platform-refinement Phase 6
9
+ type: prospective
10
+ ---
11
+
12
+ # ADR-011 — Domain-Pack Readiness
13
+
14
+ ## Status
15
+
16
+ **Accepted** · 2026-05-17 · one-round council pass complete
17
+ (`agents/council-responses/adr-011-domain-pack-readiness.json/debate-round-1.json`, actual spend $0.0300). <!-- council-ref-allowed: ADR decision trace; convergence summary inline in §Council-debate-trace -->
18
+ Split verdict — Anthropic accepted *with* tightened trigger; OpenAI
19
+ accepted as written. The host folded Anthropic's structural critique
20
+ into the trigger and added the escape clause both members' reasoning
21
+ implied. Trace under §Council-debate-trace.
22
+
23
+ ## Context
24
+
25
+ `event4u/agent-config` shipped its first heavyweight domain capability
26
+ in PR #176 (AI Video Pipeline, merged at `2.24.0`): 5 provider
27
+ adapters, 3 personas, 5 skills, the `/video:*` command cluster, a
28
+ Banana-Arc pixel-similarity regression harness, secret redaction at
29
+ every adapter boundary, and 50 roadmap steps clean. The strategic
30
+ review that followed gave the work `8.9 / 10` overall (engineering
31
+ `9.7`, governance `9.2`, UX `10`) but flagged scope discipline at
32
+ `6.8 / 10` and named a `8.9 → 9.6` target delta. The named gap is
33
+ *not* engineering — it is the positioning / role-guide / rule-layer
34
+ surface that did not catch up to the new capability. The current
35
+ roadmap (`universal-platform-refinement`) closes that gap in Phases
36
+ 1–5; Phase 6 records the *non-extraction* decision so the deferral is
37
+ auditable.
38
+
39
+ The pressure to extract video into a separately-installable
40
+ "domain pack" comes from three places:
41
+
42
+ 1. The strategic review's `8.9 → 9.6` argument — "make the future
43
+ audio / image / docs / exports domains land cheaply". Cited at
44
+ `agents/roadmaps/universal-platform-refinement.md` lines 19 and 132.
45
+ 2. PR #176's scope-discipline score (`6.8 / 10`) — the load-bearing
46
+ data point against premature extraction. Cited at line 19, 117.
47
+ 3. The predecessor council's explicit rejection of milestone-split
48
+ shipping of the video pipeline. Trace:
49
+ [`archive/ai-video-pipeline.md` § Divergences (no consensus)](../../agents/roadmaps/archive/ai-video-pipeline.md#L162-L164):
50
+ *"Single-PR vs. milestone split — Reviewer B recommended splitting
51
+ into milestone PRs; Sonnet R3 and GPT-4o final pass both reject
52
+ this, citing the roadmap's explicit single-PR iron constraint and
53
+ the dead-code risk of partial states. Host: the iron constraint
54
+ stands."* Same reasoning applies one level up: extracting video
55
+ today creates a domain-pack abstraction with no peer to share with
56
+ and a dead-code risk in the not-yet-built domains.
57
+
58
+ The repository currently has exactly **one** heavyweight domain
59
+ (video). Audio, image, docs, and exports are named future concerns —
60
+ none is built. An abstraction whose only consumer is the abstraction
61
+ itself is a structural liability, not an asset.
62
+
63
+ ## Decision
64
+
65
+ > **The platform stays thin-root and ships future domains (audio,
66
+ > image, docs, exports) as in-repo capability bundles, not as
67
+ > separately-installable packs, until at least two independent
68
+ > domains exist with overlapping execution surfaces.**
69
+
70
+ "Overlapping execution surfaces" means shared code beyond the kernel
71
+ + router — e.g. two adapters that both implement the four-method
72
+ shell contract, two skill clusters that both consume the
73
+ `media-governance-routing` rule, two domains that both need
74
+ provider-lifecycle tiering. The video adapters alone do not satisfy
75
+ this — they are a single execution surface.
76
+
77
+ ## Consequences
78
+
79
+ ### (i) What stays under `.agent-src.uncompressed/` today
80
+
81
+ The complete video capability stays in the existing flat layout —
82
+ no path changes, no symlink relocation, no namespace prefix:
83
+
84
+ - `.agent-src.uncompressed/skills/{character-consistency,motion-choreographer,pixar-storyteller,scene-expander,video-director}/`
85
+ - `.agent-src.uncompressed/personas/{ai-video-technical-director,hollywood-director}.md`
86
+ (the third video persona, `pixar-storyboard-artist`, was folded
87
+ into `skills/pixar-storyteller/` per the persona-cap council pass
88
+ recorded in `persona-governance`)
89
+ - `.agent-src.uncompressed/commands/video/{from-script,scene,storyboard,stitch}.md`
90
+ - `scripts/ai-video/` (the 5 adapter scripts + `lib/`)
91
+ - `agents/policies/media/` (Phase 2 output — already structured as
92
+ a project-local policy directory, *not* a pack)
93
+
94
+ ### (ii) The trigger that flips this decision
95
+
96
+ The non-extraction stance is **falsifiable**. The trigger is split
97
+ into a *design gate* (fires before domain 2 is built) and two
98
+ *confirmation gates* (fire after domain 2 ships) — sequenced this way
99
+ to avoid the "two-domain monolith" trap the council flagged in
100
+ round 1 (Anthropic, Option 2): if condition 1 only fires *after*
101
+ domain 2 is built, the shared infrastructure is already entangled
102
+ and extraction is materially harder than predicting overlap in
103
+ advance.
104
+
105
+ **Design gate (fires BEFORE domain 2 implementation starts):**
106
+
107
+ 1. **Overlap-prediction document.** Before the first commit on a
108
+ second heavyweight domain (audio, image, docs, exports, or other),
109
+ write `docs/contracts/domain-pack-overlap-inventory.md` listing
110
+ ≥ 3 structural patterns *predicted* to be shared between video
111
+ and the new domain (e.g. shared adapter contract, shared
112
+ governance routing, shared provider-lifecycle declaration, shared
113
+ persona-cap policy). Each prediction includes a falsifiable test
114
+ that confirms or refutes it after domain 2 ships. If ≥ 3 testable
115
+ predictions cannot be written, the domain is not yet a candidate
116
+ for shared abstraction — build it in-repo, revisit when patterns
117
+ emerge.
118
+
119
+ **Confirmation gates (fire AFTER domain 2 ships):**
120
+
121
+ 2. **Heavyweight-domain landing.** A second domain has landed in
122
+ `main` matching the PR #176 shape: adapter cluster + skill
123
+ cluster + command cluster + governance rule + policy directory.
124
+ One-skill additions do not count.
125
+ 3. **Shared-abstraction stability.** The patterns named in the
126
+ prediction document have shipped without breaking changes for at
127
+ least one minor release. Stability proves the predictions were
128
+ real, not refactoring churn.
129
+
130
+ **Escape clause (Anthropic round-1 critique, folded back):** if all
131
+ three gates fire and extraction is then judged "too expensive" by
132
+ the team, **this decision was wrong**. Re-open the ADR and record
133
+ the failure mode — the trigger structure is one-way unless this
134
+ clause is honoured. Without it, the ADR becomes a one-way door
135
+ disguised as a two-way door.
136
+
137
+ The placeholder roadmap
138
+ [`agents/roadmaps/domain-pack-extraction-when-triggered.md`](../../agents/roadmaps/domain-pack-extraction-when-triggered.md)
139
+ holds the marker; status `draft` keeps it dashboard-suppressed until
140
+ the design gate fires.
141
+
142
+ ### (iii) What is **not** extracted today
143
+
144
+ Explicitly enumerated so a future reader does not mistake silence
145
+ for ambiguity:
146
+
147
+ - The five video adapters (`gemini-veo`, `kling`, `openai-images`,
148
+ `higgsfield`, `sora`) — stay in `scripts/ai-video/`.
149
+ - The two remaining video personas — stay in `.agent-src.uncompressed/personas/`.
150
+ - The `/video:*` command cluster — stays in `.agent-src.uncompressed/commands/video/`.
151
+ - The `media-governance-routing` rule + `agents/policies/media/`
152
+ policy files — stay where Phase 2 placed them.
153
+ - The provider-lifecycle contract + the `provider-lifecycle-discipline`
154
+ rule — stay where Phase 3 placed them.
155
+ - The three Phase 4 test files (`tests/test_ai_video_blueprint_schema.py`,
156
+ `test_prompt_optimization.py`, `test_ai_video_adapter_contract.py`)
157
+ — stay in the root `tests/` tree.
158
+
159
+ ## Alternatives Considered
160
+
161
+ ### A) Extract video into `agents/domain-packs/ai-video/` today
162
+
163
+ Rejected. The extraction creates an abstraction with no peer, so the
164
+ shape of the pack interface is determined by exactly one consumer.
165
+ When the second domain arrives, the interface is likely wrong (cited
166
+ predecessor council reasoning on milestone-split: dead-code risk of
167
+ partial states). The strategic review's `8.9 → 9.6` argument is
168
+ **real** but **not unlocked by extracting today** — see roadmap §Notes
169
+ line 132.
170
+
171
+ ### B) Ship the placeholder roadmap as `proposed` instead of `draft`
172
+
173
+ Rejected. A `proposed` roadmap appears in the dashboard and creates
174
+ implicit pressure to schedule it. A `draft` marker keeps the trigger
175
+ visible to future maintainers without scheduling work that depends
176
+ on conditions that do not yet hold.
177
+
178
+ ### C) Pin a date for re-evaluation
179
+
180
+ Rejected. The trigger is structural (two domains + overlap inventory),
181
+ not temporal. Pinning a date (e.g. "review 2027-Q1") replaces a
182
+ condition-based gate with a calendar-based one, which `no-roadmap-references`
183
+ treats as a smell.
184
+
185
+ ## Council-debate trace
186
+
187
+ One round · 2 members · actual spend $0.0300 · raw responses at
188
+ [`agents/council-responses/adr-011-domain-pack-readiness.json/debate-round-1.json`](../../agents/council-responses/adr-011-domain-pack-readiness.json/debate-round-1.json). <!-- council-ref-allowed: ADR decision-trace to originating council response -->
189
+
190
+ | Member | Pick | Core argument | Folded back? |
191
+ |---|---|---|---|
192
+ | `anthropic/claude-sonnet-4-5` | **Option 2** (accept with tightened trigger) | Trigger as originally written is waterfall-sequenced (build → discover → stabilise) — condition 1 only fires *after* domain 2 is built, creating the "two-domain monolith" trap. Fix: move overlap-prediction to a *design gate* before domain 2 implementation, plus add an escape clause naming the failure mode when extraction is later judged too expensive. | **Yes** — Consequences §(ii) split into design gate + confirmation gates; escape clause added verbatim. |
193
+ | `openai/gpt-4o` | **Option 1** (accept as written) | Triggers are structural, not temporal — appropriate guard against premature abstraction. Secondary signal worth tracking: developer-sentiment / community feedback on perceived lack of shared infrastructure. | **Partial** — host did not promote qualitative signals to gates (would conflict with the "structural, not temporal" principle both members affirmed), but the escape clause covers the team-cost case Anthropic named and OpenAI implied. |
194
+
195
+ ### Host verdict
196
+
197
+ Anthropic's structural critique is load-bearing: the original trigger
198
+ was sequenced as a waterfall where the gating condition could not be
199
+ checked until after the gate had implicitly been passed. The fix —
200
+ moving overlap-prediction to a design-stage document — is a strict
201
+ improvement that costs nothing today (no domain 2 exists; no design
202
+ gate to clear). Folding the escape clause closes the one-way-door
203
+ risk both members' reasoning pointed at, even though only Anthropic
204
+ named it explicitly.
205
+
206
+ OpenAI's qualitative-signal point is noted but not promoted to a
207
+ gate: every "is the lack of shared infrastructure slowing us down?"
208
+ question is answerable by writing the overlap-prediction document
209
+ and seeing whether ≥ 3 testable predictions emerge. The design gate
210
+ absorbs the qualitative signal into a structural check.
211
+
212
+ Status: `proposed → accepted` with the council-driven trigger
213
+ revision and escape clause in place.
@@ -14,6 +14,7 @@ _Auto-generated by `scripts/adr/regenerate_index.py`. Do not edit._
14
14
  | [ADR-008](ADR-008-installed-tools-manifest.md) | Committed Installed Tools Manifest Separate From Settings | proposed | 2026-05-12 | — |
15
15
  | [ADR-009](ADR-009-event4u-namespace.md) | Event4U Namespace And Claude Desktop Zip Bundles | accepted | 2026-05-13 | — |
16
16
  | [ADR-010](ADR-010-profile-pack-preset-boundary.md) | Profile Pack Preset Boundary | proposed | 2026-05-16 | — |
17
+ | [ADR-011](ADR-011-domain-pack-readiness.md) | Domain Pack Readiness | accepted | 2026-05-17 | — |
17
18
 
18
19
  ## Unnumbered (legacy)
19
20
 
@@ -16,6 +16,16 @@
16
16
  - [`messaging-architecture`](../.agent-src/skills/messaging-architecture/SKILL.md) — primary message + supporting proofs + audience-by-message matrix.
17
17
  - [`editorial-calendar`](../.agent-src/skills/editorial-calendar/SKILL.md) — evergreen vs campaign vs reactive cadence across channels.
18
18
 
19
+ ### Video
20
+
21
+ - [`/video:from-script`](../.agent-src/commands/video/from-script.md) — end-to-end pipeline: script → character-locked image → motion+audio prompt → provider render → stitched clip.
22
+ - [`/video:storyboard`](../.agent-src/commands/video/storyboard.md) — expand a one-line idea into the 12-block Cinematic Scene Blueprint (provider-agnostic).
23
+ - [`/video:scene`](../.agent-src/commands/video/scene.md) — render a single scene from an existing blueprint against the configured provider adapter.
24
+ - [`/video:stitch`](../.agent-src/commands/video/stitch.md) — assemble rendered scenes into the final clip via ffmpeg.
25
+ - [`character-consistency`](../.agent-src/skills/character-consistency/SKILL.md) — lock identity tokens (silhouette, palette, wardrobe, prop) so a character stays visually identical across scenes.
26
+
27
+ `AIV_DRYRUN=true` is the mandatory default — no provider call, no spend until you opt in.
28
+
19
29
  **Install path:** **MCP recommended.** Claude Desktop is the lowest-friction entry; no terminal required. See [`docs/mcp.md`](mcp.md). CLI install works too if you already use a code editor.
20
30
 
21
31
  ---
@@ -106,7 +106,7 @@ Your agent is now:
106
106
  - **Respecting your codebase** — no conflicting patterns
107
107
  - **Following standards** — consistent code quality
108
108
 
109
- This is enforced automatically by 79 rules. No configuration needed.
109
+ This is enforced automatically by 84 rules. No configuration needed.
110
110
 
111
111
  ---
112
112
 
package/docs/personas.md CHANGED
@@ -5,32 +5,79 @@ skill — not sub-agents, not execution modes. Each persona shapes
5
5
  *what* the agent looks for in a diff, plan, or artifact; the host
6
6
  identity, tools, and workflow stay the same.
7
7
 
8
- This page catalogs the 11 personas shipped with `event4u/agent-config`
9
- and explains how `personas:` (lens axis) interacts with `/mode`
10
- (role-mode axis).
11
-
12
- ## Catalog
13
-
14
- | ID | Role | Tier | Lens summary |
15
- |---|---|---|---|
16
- | `developer` | Developer | core | Pragmatic implementer voice — what's the smallest correct change? |
17
- | `senior-engineer` | Senior Engineer | core | Long-horizon impact what does this look like in 6 months? |
18
- | `product-owner` | Product Owner | core | Outcome over output — does this move the user metric? |
19
- | `stakeholder` | Stakeholder | core | Risk and politicswho owns the rollback if this fails? |
20
- | `critical-challenger` | Critical Challenger | core | Devil's-advocate voice — what assumption is load-bearing here? |
21
- | `ai-agent` | AI Agent | core | Tool-economy voicetoken cost, prompt clarity, automation seam. |
22
- | `qa` | QA | specialist | Test coverage and regression gates. |
23
- | `backend-architect` | Backend Architect | specialist | Service-layer boundaries, transaction scope, contract changes. |
24
- | `eloquent-tamer` | Eloquent Tamer | specialist | N+1, query shape, ORM idioms that melt the database. |
25
- | `security-engineer` | Security Engineer | specialist | OWASP-shaped failure modes, secret leakage, trust boundaries. |
26
- | `frontend-engineer` | Frontend Engineer | specialist | Component lifecycle, reactive state, hydration boundaries. |
27
-
28
- Tier rules:
29
-
30
- - **Core (6)** — always-loaded cast. 5 sections (Focus · Mindset · Unique Questions · Output Expectations · Anti-Patterns), ≤ 120 lines.
31
- - **Specialist (5)** opt-in lenses. 7 sections (Core-5 + Critical Rules + Workflows), ≤ 100 lines.
32
-
33
- Schema contract: [`docs/contracts/persona-schema.md`](contracts/persona-schema.md).
8
+ This page catalogs the **24 active personas** shipped with
9
+ `event4u/agent-config` (6 core + 18 specialists), plus the 5
10
+ **advisor** personas in `personas/advisors/`. It also explains how
11
+ `personas:` (lens axis) interacts with `/mode` (role-mode axis).
12
+ Removed personas are deleted in-commit (no soak window) — see
13
+ [`persona-governance § Deprecation path`](../.agent-src/rules/persona-governance.md).
14
+
15
+ ## Catalog — Core (always-loaded, 6)
16
+
17
+ | ID | Role | Wing | Owner | Lens summary |
18
+ |---|---|---|---|---|
19
+ | `developer` | Developer | | package | Pragmatic implementer voice what's the smallest correct change? |
20
+ | `senior-engineer` | Senior Engineer | | package | Long-horizon impact — what does this look like in 6 months? |
21
+ | `stakeholder` | Stakeholder | | package | Risk and politics who owns the rollback if this fails? |
22
+ | `critical-challenger` | Critical Challenger | | package | Devil's-advocate voice what assumption is load-bearing here? |
23
+ | `ai-agent` | AI Agent | | package | Tool-economy voice — token cost, prompt clarity, automation seam. |
24
+
25
+ Note: `product-owner` was reclassified to **specialist** at v2.0 see below.
26
+
27
+ ## Catalog — Specialists (opt-in, 18 active)
28
+
29
+ | ID | Role | Wing | Owner | Lens summary |
30
+ |---|---|---|---|---|
31
+ | `qa` | QA | | package | Test coverage and regression gates. |
32
+ | `backend-architect` | Backend Architect | — | package | Service-layer boundaries, transaction scope, contract changes. |
33
+ | `eloquent-tamer` | Eloquent Tamer | — | package | N+1, query shape, ORM idioms that melt the database. |
34
+ | `security-engineer` | Security Engineer | — | package | OWASP-shaped failure modes, secret leakage, trust boundaries. |
35
+ | `frontend-engineer` | Frontend Engineer | — | package | Component lifecycle, reactive state, hydration boundaries. |
36
+ | `product-owner` | Product Owner | — | package | Outcomes named, AC unfalsifiable, scope on record. |
37
+ | `tech-writer` | Tech Writer | — | package | Release narratives, READMEs, AGENTS.md thin. |
38
+ | `revops-maintainer` | RevOps Maintainer | — | package | Contributor lifecycle, package adoption funnel, release readiness. |
39
+ | `discovery-lead` | Discovery Lead | — | package | Switch events, falsifiable hypotheses, theme ranking. |
40
+ | `hollywood-director` | Hollywood Director (`ai-video`) | — | package | Live-action lens, lighting, blocking, negative constraints. |
41
+ | `ai-video-technical-director` | AI Video Technical Director (`ai-video`) | — | package | Provider tuning — Veo / Kling / Sora / Higgsfield / OpenAI grammar. |
42
+ | `cmo` | CMO | 3 | package | Positioning anchored, messaging stacked, launches sequenced. |
43
+ | `growth-pm` | Growth PM | 3 | package | Leaky-bucket vs growth-loop classified, activation correlated. |
44
+ | `customer-success-lead` | Customer Success Lead | 3 | package | TTFV falsifiable, churn cause split, expansion pulled, NRR. |
45
+ | `revops` | RevOps | 3 | package | Stage exit criteria, MEDDIC slots, forecast falsifiable. |
46
+ | `engineering-manager` | Engineering Manager | 4 | package | 1:1 cadence, hiring loop, throughput-vs-morale tradeoff. |
47
+ | `people-strategist` | People Strategist | 4 | package | Team shape, comp bands, ramp definitions, feedback craft. |
48
+ | `finance-partner` | Finance Partner | 4 | package | Unit economics, runway, scenarios, the next 18 months. |
49
+ | `strategist` | Strategist | 4 | package | Build-vs-buy, market entry, moat, vision, contracts, privacy. |
50
+
51
+ ## Per-domain count (persona-governance cap: max 2 specialists per domain)
52
+
53
+ | Domain | Active specialists | Within cap |
54
+ |---|---|---|
55
+ | `ai-video` | `hollywood-director`, `ai-video-technical-director` | ✅ 2/2 |
56
+ | GTM (Wing 3) | `cmo`, `growth-pm`, `customer-success-lead`, `revops` | ✅ (wing, not domain) |
57
+ | Ops / Money (Wing 4) | `engineering-manager`, `people-strategist`, `finance-partner`, `strategist` | ✅ (wing, not domain) |
58
+ | Backend | `backend-architect`, `eloquent-tamer` | ✅ 2/2 |
59
+
60
+ Per-domain count is enforced by `scripts/lint_persona_governance.py` (wired into `task ci`).
61
+
62
+ ## Advisors (`personas/advisors/`, 5)
63
+
64
+ Adversarial / second-opinion voices invoked by `ai-council` debates,
65
+ not cited by skills directly:
66
+
67
+ | ID | Lens |
68
+ |---|---|
69
+ | `contrarian` | Opposing the consensus position |
70
+ | `executor` | Shipping bias — what's the minimum to land it? |
71
+ | `expansionist` | Scope-widening — what else does this unlock? |
72
+ | `first-principles` | Refuses analogy — derive from physics of the problem |
73
+ | `outsider` | Naive reader — does this hold without prior context? |
74
+
75
+ ## Tier rules
76
+
77
+ - **Core (≤ 6)** — always-loaded cast. 5 sections (Focus · Mindset · Unique Questions · Output Expectations · Anti-Patterns), ≤ 120 lines.
78
+ - **Specialist** — opt-in lenses. 7 sections (Core-5 + Critical Rules + Workflows). Line cap is wing-scoped: ≤ 100 (no wing / Wings 1–2), ≤ 140 (Wings 3–4) per [`persona-schema § 4`](contracts/persona-schema.md).
79
+
80
+ Schema contract: [`docs/contracts/persona-schema.md`](contracts/persona-schema.md). Governance rule: [`persona-governance`](../.agent-src/rules/persona-governance.md).
34
81
 
35
82
  ## When to invoke a persona
36
83
 
package/docs/profiles.md CHANGED
@@ -25,10 +25,15 @@ Next.js · React · Node. **Preset default: `balanced`.**
25
25
  ## ✍️ `content_creator` — writers, ghostwriters, marketers
26
26
 
27
27
  Draft in someone else's voice, plan a quarter of content, ship a
28
- launch announcement. `/ghostwriter` fetches and writes against a
29
- public-figure voice profile; `/post-as` is the same primitive for
30
- your own voice (`.agent-user.md`); `voice-and-tone-design` and
31
- `messaging-architecture` lock the brand frame before any copy ships.
28
+ launch announcement, render a cinematic AI video. `/ghostwriter`
29
+ fetches and writes against a public-figure voice profile; `/post-as`
30
+ is the same primitive for your own voice (`.agent-user.md`);
31
+ `voice-and-tone-design` and `messaging-architecture` lock the brand
32
+ frame before any copy ships; `/video:from-script` and `/video:storyboard`
33
+ drive the AI video pipeline (script → character-locked image →
34
+ motion+audio prompt → provider render → stitched clip), with
35
+ `character-consistency` locking identity tokens across scenes and
36
+ `AIV_DRYRUN=true` as the cost-safety default.
32
37
  **Preset default: `balanced`.**
33
38
  [Profile YAML](../.agent-src.uncompressed/profiles/content_creator.yml) ·
34
39
  [Role guide](getting-started-by-role.md#creator-writer-marketer-indie-content-shop).
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@event4u/agent-config",
3
- "version": "2.24.0",
3
+ "version": "2.25.0",
4
4
  "description": "Shared agent configuration \u2014 skills, rules, commands, guidelines, and templates for AI coding tools",
5
5
  "license": "MIT",
6
6
  "private": false,
@@ -0,0 +1,119 @@
1
+ #!/usr/bin/env python3
2
+ """Scan generic skills/rules/commands for framework/language leakage.
3
+
4
+ Carve-out criterion: artifact filename or directory path matches an explicit
5
+ framework/language marker. Everything else MUST be framework-neutral.
6
+ TEMPORARY scanner — delete after audit roadmap is drafted.
7
+ """
8
+ from __future__ import annotations
9
+
10
+ import re
11
+ import sys
12
+ from pathlib import Path
13
+
14
+ ROOT = Path(".agent-src.uncompressed")
15
+
16
+ CARVE_OUT_PATTERNS = [
17
+ r"laravel", r"^php-", r"^eloquent", r"^blade", r"^livewire", r"^flux",
18
+ r"^pest-", r"^artisan-", r"^composer-", r"^jobs-events$", r"^symfony",
19
+ r"^nextjs", r"^react-", r"^async-python", r"^openapi$", r"^quality-tools",
20
+ r"^sql-writing", r"^tailwind", r"^terraform", r"^terragrunt", r"^traefik",
21
+ r"^mobile-e2e",
22
+ r"^project-analysis-(laravel|symfony|nextjs|react|node-express|zend-laminas)",
23
+ r"^docker", r"^aws-", r"^grafana", r"^playwright",
24
+ r"^laravel-", r"^docker-", r"^symfony-", r"^copilot-", r"^devcontainer",
25
+ r"-routing$",
26
+ ]
27
+ CARVE_OUT_RE = re.compile("|".join(CARVE_OUT_PATTERNS), re.IGNORECASE)
28
+
29
+ LEAKAGE = {
30
+ "Laravel": [
31
+ r"\bLaravel\b", r"\bEloquent\b", r"\bArtisan\b", r"\bFormRequest\b",
32
+ r"\bForm Request\b", r"\bBlade\b(?! Runner)", r"\bLivewire\b",
33
+ r"\bResource::(make|collection)\b", r"\bModel::\b",
34
+ r"\bapp/Http/", r"\broutes/(api|web)\.php",
35
+ r"\bdatabase/(migrations|seeders|factories)\b",
36
+ r"\bphp artisan\b", r"\bIlluminate\\\\", r"\bIlluminate\\",
37
+ r"\bbootstrap/app\.php",
38
+ ],
39
+ "PHP": [
40
+ r"\bPHPStan\b", r"\bPest\b(?! Control)", r"\bPHPUnit\b", r"\bRector\b",
41
+ r"\bECS\b", r"\bcomposer\.json\b", r"\bvendor/bin/",
42
+ r"\bdeclare\(strict_types=1\)", r"\.php\b",
43
+ r"\bnamespace App\\\\", r"\bnamespace App\\",
44
+ r"\bcomposer (require|install|update|dump-autoload)\b",
45
+ ],
46
+ "Symfony": [
47
+ r"\bSymfony\b", r"\bbin/console\b", r"\bDoctrine\b", r"\bTwig\b",
48
+ ],
49
+ "JS-specific": [
50
+ r"\bpackage\.json\b",
51
+ r"\bnpm (install|run|test|ci)\b",
52
+ r"\byarn (install|add|test)\b",
53
+ r"\bpnpm (install|add|run|test)\b",
54
+ r"\bnode_modules\b",
55
+ ],
56
+ "Python-specific": [
57
+ r"\bpyproject\.toml\b", r"\brequirements\.txt\b",
58
+ r"\bpip install\b", r"\bpytest\b",
59
+ ],
60
+ }
61
+
62
+
63
+ def is_carve_out(path: Path) -> bool:
64
+ for p in path.parts:
65
+ stem = p.removesuffix(".md")
66
+ if CARVE_OUT_RE.search(stem):
67
+ return True
68
+ return False
69
+
70
+
71
+ def scan_file(path: Path) -> dict:
72
+ text = path.read_text(encoding="utf-8", errors="ignore")
73
+ lines = text.splitlines()
74
+ hits: dict[str, list[tuple[int, str, str]]] = {}
75
+ for category, patterns in LEAKAGE.items():
76
+ for pat in patterns:
77
+ rx = re.compile(pat)
78
+ for i, line in enumerate(lines, start=1):
79
+ if rx.search(line):
80
+ hits.setdefault(category, []).append(
81
+ (i, pat, line.strip()[:160])
82
+ )
83
+ return hits
84
+
85
+
86
+ def scan_dir(subdir: str) -> list[tuple[Path, dict]]:
87
+ target = ROOT / subdir
88
+ out = []
89
+ for f in sorted(target.rglob("*.md")):
90
+ if is_carve_out(f):
91
+ continue
92
+ if f.name.startswith("_"):
93
+ continue
94
+ hits = scan_file(f)
95
+ if hits:
96
+ out.append((f, hits))
97
+ return out
98
+
99
+
100
+ def main():
101
+ for label, sub in [("SKILLS", "skills"), ("RULES", "rules"), ("COMMANDS", "commands")]:
102
+ print(f"\n===== {label} (generic, non-carve-out) =====")
103
+ results = scan_dir(sub)
104
+ if not results:
105
+ print(" (clean)")
106
+ continue
107
+ for path, hits in results:
108
+ total = sum(len(v) for v in hits.values())
109
+ print(f"\n [{total:3d}] {path}")
110
+ for cat, items in hits.items():
111
+ print(f" {cat}: {len(items)}")
112
+ for line_no, pat, snippet in items[:6]:
113
+ print(f" L{line_no:4d} /{pat}/ {snippet}")
114
+ if len(items) > 6:
115
+ print(f" ... +{len(items) - 6} more")
116
+
117
+
118
+ if __name__ == "__main__":
119
+ main()
@@ -9,6 +9,11 @@
9
9
  # Contract: scripts/ai-video/lib/adapter-contract.md
10
10
  # Provider: top-level <provider id="gemini-veo" kind="video"> in
11
11
  # agents/.ai-video.xml.
12
+ #
13
+ # Lifecycle: experimental — structural shape conformant; no maintainer
14
+ # real-API smoke trace captured yet. See docs/contracts/provider-lifecycle.md
15
+ # for promotion criteria. The agent must surface this tier and ask
16
+ # before defaulting to this adapter.
12
17
 
13
18
  set -euo pipefail
14
19
 
@@ -11,6 +11,12 @@
11
11
  # agents/.ai-video.xml. Preset → motion-choreographer profile mapping
12
12
  # is documented in agents/ai-video/prompts/motion-choreography.md
13
13
  # (Phase 6).
14
+ #
15
+ # Lifecycle: experimental — capability-discovery path conformant; no
16
+ # maintainer real-API smoke trace captured yet. See
17
+ # docs/contracts/provider-lifecycle.md for promotion criteria. The
18
+ # agent must surface this tier and ask before defaulting to this
19
+ # adapter.
14
20
 
15
21
  set -euo pipefail
16
22
 
@@ -9,6 +9,11 @@
9
9
  # Contract: scripts/ai-video/lib/adapter-contract.md
10
10
  # Provider: top-level <provider id="kling" kind="video"> in
11
11
  # agents/.ai-video.xml.
12
+ #
13
+ # Lifecycle: experimental — async submit/poll/fetch contract conformant;
14
+ # no maintainer real-API smoke trace captured yet. See
15
+ # docs/contracts/provider-lifecycle.md for promotion criteria. The agent
16
+ # must surface this tier and ask before defaulting to this adapter.
12
17
 
13
18
  set -euo pipefail
14
19
 
@@ -9,6 +9,11 @@
9
9
  # Contract: scripts/ai-video/lib/adapter-contract.md
10
10
  # Provider: top-level <provider id="openai-images" kind="image"> in
11
11
  # agents/.ai-video.xml.
12
+ #
13
+ # Lifecycle: experimental — structural shape conformant; no maintainer
14
+ # real-API smoke trace captured yet. See docs/contracts/provider-lifecycle.md
15
+ # for promotion criteria. The agent must surface this tier and ask
16
+ # before defaulting to this adapter.
12
17
 
13
18
  set -euo pipefail
14
19
 
@@ -9,6 +9,12 @@
9
9
  # Contract: scripts/ai-video/lib/adapter-contract.md
10
10
  # Provider: top-level <provider id="sora" kind="video"> in
11
11
  # agents/.ai-video.xml.
12
+ #
13
+ # Lifecycle: experimental — structural-prompt path conformant; no
14
+ # maintainer real-API smoke trace captured yet. See
15
+ # docs/contracts/provider-lifecycle.md for promotion criteria. The
16
+ # agent must surface this tier and ask before defaulting to this
17
+ # adapter.
12
18
 
13
19
  set -euo pipefail
14
20
 
@@ -319,6 +319,12 @@ _TASK_DETECTOR_SKIP = (
319
319
  "rules/package-ci-checks.md",
320
320
  "contexts/communication/rules-auto/package-ci-checks-mechanics.md",
321
321
  "contexts/contracts/agents-md-anatomy.md",
322
+ # roadmap-ci-steps-policy defines the gate by listing the forbidden
323
+ # CI-shaped literals; its mechanics doc and the execution loop +
324
+ # authoring skill enumerate the same literals to detect them.
325
+ "rules/roadmap-ci-steps-policy.md",
326
+ "contexts/execution/roadmap-process-loop.md",
327
+ "skills/roadmap-writing/SKILL.md",
322
328
  )
323
329
 
324
330