@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.
- 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 +5 -5
- package/.agent-src/commands/video/storyboard.md +1 -1
- package/.agent-src/contexts/execution/roadmap-process-loop.md +69 -14
- package/.agent-src/personas/README.md +3 -2
- package/.agent-src/personas/ai-video-technical-director.md +2 -2
- package/.agent-src/personas/hollywood-director.md +3 -3
- 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 +12 -1
- package/.agent-src/skills/git-workflow/SKILL.md +133 -0
- package/.agent-src/skills/motion-choreographer/SKILL.md +12 -0
- package/.agent-src/skills/pixar-storyteller/SKILL.md +19 -6
- package/.agent-src/skills/roadmap-writing/SKILL.md +10 -0
- package/.agent-src/skills/scene-expander/SKILL.md +22 -7
- package/.agent-src/skills/video-director/SKILL.md +13 -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 +1 -1
- package/CHANGELOG.md +43 -0
- package/README.md +5 -3
- package/config/agent-settings.template.yml +26 -0
- package/docs/architecture.md +1 -1
- package/docs/catalog.md +5 -2
- package/docs/contracts/file-ownership-matrix.json +81 -13
- 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 +1 -1
- 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 +5 -0
- package/scripts/ai-video/adapters/higgsfield.sh +6 -0
- package/scripts/ai-video/adapters/kling.sh +5 -0
- package/scripts/ai-video/adapters/openai-images.sh +5 -0
- package/scripts/ai-video/adapters/sora.sh +6 -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/smoke/schema.sh +1 -1
- 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.
|
package/docs/decisions/INDEX.md
CHANGED
|
@@ -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
|
---
|
package/docs/getting-started.md
CHANGED
|
@@ -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
|
|
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
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
|
18
|
-
|
|
19
|
-
| `
|
|
20
|
-
| `
|
|
21
|
-
| `
|
|
22
|
-
| `
|
|
23
|
-
| `
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
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
|
|
29
|
-
public-figure voice profile; `/post-as`
|
|
30
|
-
your own voice (`.agent-user.md`);
|
|
31
|
-
`messaging-architecture` lock the brand
|
|
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
|
@@ -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
|
|