@event4u/agent-config 3.0.0 → 3.1.1

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 (208) hide show
  1. package/.agent-src/commands/install-via-agent.md +129 -0
  2. package/.agent-src/commands/video/from-script.md +1 -1
  3. package/.agent-src/commands/video.md +1 -1
  4. package/.agent-src/contexts/execution/cheap-question-mechanics.md +81 -0
  5. package/.agent-src/rules/caveman-speak.md +2 -2
  6. package/.agent-src/rules/context-hygiene.md +36 -0
  7. package/.agent-src/rules/engineering-safety-floor.md +102 -0
  8. package/.agent-src/rules/finance-safety-floor.md +114 -0
  9. package/.agent-src/rules/git-history-discipline.md +1 -1
  10. package/.agent-src/rules/no-cheap-questions.md +34 -32
  11. package/.agent-src/rules/provider-lifecycle-discipline.md +4 -4
  12. package/.agent-src/rules/strategy-safety-floor.md +114 -0
  13. package/.agent-src/skills/agents-md-thin-root/SKILL.md +15 -9
  14. package/.agent-src/skills/async-python-patterns/SKILL.md +1 -1
  15. package/.agent-src/skills/project-analysis-node-express/SKILL.md +1 -1
  16. package/.agent-src/skills/readme-reviewer/SKILL.md +52 -3
  17. package/.agent-src/skills/readme-writing/SKILL.md +52 -4
  18. package/.agent-src/skills/readme-writing-package/SKILL.md +48 -5
  19. package/.agent-src/skills/systematic-debugging/SKILL.md +41 -0
  20. package/.agent-src/templates/agents/agent-project-settings.example.yml +1 -1
  21. package/.agent-src/templates/hooks/pre-commit-frontmatter +66 -0
  22. package/.agent-src/templates/hooks/pre-commit-roadmap-progress +78 -39
  23. package/.agent-src/templates/scripts/work_engine/_lib/agent_settings.py +4 -1
  24. package/.agent-src/templates/scripts/work_engine/orchestration.py +25 -11
  25. package/.claude-plugin/marketplace.json +2 -1
  26. package/AGENTS.md +10 -8
  27. package/CHANGELOG.md +233 -123
  28. package/README.md +165 -553
  29. package/config/agent-settings.template.yml +0 -7
  30. package/config/discovery/packs.yml +20 -0
  31. package/config/discovery/unassigned-artefacts.yml +2 -0
  32. package/config/gitignore-block.txt +19 -3
  33. package/dist/cli/commands/uiServe.js +13 -4
  34. package/dist/cli/commands/uiServe.js.map +1 -1
  35. package/dist/cli/registry.js +2 -0
  36. package/dist/cli/registry.js.map +1 -1
  37. package/dist/discovery/deprecation-report.md +7 -0
  38. package/dist/discovery/discovery-manifest.json +2107 -1409
  39. package/dist/discovery/discovery-manifest.json.sha256 +1 -1
  40. package/dist/discovery/discovery-manifest.summary.md +9 -9
  41. package/dist/discovery/orphan-report.md +10 -0
  42. package/dist/discovery/packs.json +1002 -0
  43. package/dist/discovery/trust-report.md +26 -0
  44. package/dist/discovery/workspaces.json +705 -0
  45. package/dist/mcp/registry-manifest.json +4 -4
  46. package/dist/router.json +1623 -0
  47. package/dist/server/app.js +11 -3
  48. package/dist/server/app.js.map +1 -1
  49. package/dist/server/io/atomicMultiWrite.js +3 -1
  50. package/dist/server/io/atomicMultiWrite.js.map +1 -1
  51. package/dist/server/io/yamlIO.js +22 -0
  52. package/dist/server/io/yamlIO.js.map +1 -1
  53. package/dist/server/routes/ping.js +8 -0
  54. package/dist/server/routes/ping.js.map +1 -1
  55. package/dist/server/routes/schema.js +2 -2
  56. package/dist/server/routes/schema.js.map +1 -1
  57. package/dist/server/routes/settings.js +104 -23
  58. package/dist/server/routes/settings.js.map +1 -1
  59. package/dist/server/routes/userMd.js +37 -27
  60. package/dist/server/routes/userMd.js.map +1 -1
  61. package/dist/server/routes/wizard.js +256 -20
  62. package/dist/server/routes/wizard.js.map +1 -1
  63. package/dist/server/schemas/settings.js +0 -1
  64. package/dist/server/schemas/settings.js.map +1 -1
  65. package/dist/server/token.js +10 -3
  66. package/dist/server/token.js.map +1 -1
  67. package/dist/server/writeRoot.js +28 -11
  68. package/dist/server/writeRoot.js.map +1 -1
  69. package/dist/server/writeRoot.test.js +22 -4
  70. package/dist/server/writeRoot.test.js.map +1 -1
  71. package/dist/shared/userMd/formAdapter.js +29 -51
  72. package/dist/shared/userMd/formAdapter.js.map +1 -1
  73. package/dist/shared/userMd/schema.js +32 -104
  74. package/dist/shared/userMd/schema.js.map +1 -1
  75. package/dist/shared/userMd/utils.js +64 -50
  76. package/dist/shared/userMd/utils.js.map +1 -1
  77. package/dist/ui/assets/index-D-DY1ywI.js +35 -0
  78. package/dist/ui/assets/index-D-DY1ywI.js.map +1 -0
  79. package/dist/ui/index.html +1 -1
  80. package/docs/adrs/router/0001-three-tier-routing.md +5 -5
  81. package/docs/adrs/smoke/0001-per-tier-smoke-scripts.md +1 -1
  82. package/docs/architecture.md +3 -3
  83. package/docs/archive/CHANGELOG-pre-3.1.0.md +167 -0
  84. package/docs/catalog.md +30 -26
  85. package/docs/contracts/CHANGELOG-conventions.md +1 -1
  86. package/docs/contracts/agent-user-schema.md +6 -9
  87. package/docs/contracts/consumer-bridge.md +79 -0
  88. package/docs/contracts/discovery-manifest.md +209 -0
  89. package/docs/contracts/discovery-manifest.schema.json +77 -4
  90. package/docs/contracts/explain-trace.schema.json +1 -1
  91. package/docs/contracts/file-ownership-matrix.json +197 -13
  92. package/docs/contracts/frontmatter-contract.md +140 -0
  93. package/docs/contracts/gui-wizard.md +223 -0
  94. package/docs/contracts/installer-agent-mode.md +137 -0
  95. package/docs/contracts/kernel-membership.md +1 -1
  96. package/docs/contracts/mcp-tool-inventory.md +9 -9
  97. package/docs/contracts/namespace.md +6 -6
  98. package/docs/contracts/provider-lifecycle.md +5 -5
  99. package/docs/contracts/rule-router.md +4 -4
  100. package/docs/contracts/settings-api.md +53 -6
  101. package/docs/contracts/smoke-contracts.md +3 -3
  102. package/docs/contracts/trust-and-safety.md +144 -0
  103. package/docs/customization.md +2 -2
  104. package/docs/decisions/ADR-007-agent-discovery-scopes.md +12 -0
  105. package/docs/decisions/ADR-013-discovery-frontmatter-contract.md +24 -0
  106. package/docs/decisions/ADR-015-discovery-manifest-contract.md +146 -0
  107. package/docs/decisions/ADR-016-installer-architecture.md +189 -0
  108. package/docs/decisions/ADR-017-monorepo-physical-layout.md +261 -0
  109. package/docs/decisions/ADR-018-trust-and-safety-layer.md +159 -0
  110. package/docs/decisions/ADR-019-router-json-dist-location.md +124 -0
  111. package/docs/decisions/ADR-020-global-only-consumer-scope.md +123 -0
  112. package/docs/decisions/ADR-021-deployment-shape.md +153 -0
  113. package/docs/decisions/INDEX.md +7 -0
  114. package/docs/deploy/connector-setup.md +129 -0
  115. package/docs/deploy/env-vars.md +70 -0
  116. package/docs/deploy/policy-cookbook.md +130 -0
  117. package/docs/deploy/quickstart.md +112 -0
  118. package/docs/distribution/public-install-smoke.md +68 -0
  119. package/docs/distribution/registries.md +55 -0
  120. package/docs/distribution/telemetry-privacy.md +128 -0
  121. package/docs/distribution/telemetry-schema.md +174 -0
  122. package/docs/featured-skills.md +95 -0
  123. package/docs/getting-started-by-role.md +19 -1
  124. package/docs/getting-started.md +2 -2
  125. package/docs/guidelines/agent-infra/installed-tools-manifest.md +11 -8
  126. package/docs/guidelines/docs/readme-size-and-splitting.md +53 -1
  127. package/docs/installation.md +27 -14
  128. package/docs/maintainers/dev-mode.md +105 -0
  129. package/docs/setup/per-ide/claude-desktop.md +3 -2
  130. package/docs/wizard.md +39 -4
  131. package/package.json +18 -1
  132. package/scripts/__pycache__/validate_frontmatter.cpython-312.pyc +0 -0
  133. package/scripts/_cli/cmd_doctor.py +150 -2
  134. package/scripts/_cli/cmd_explain.py +2 -1
  135. package/scripts/_cli/cmd_migrate_to_global.py +415 -0
  136. package/scripts/_cli/cmd_settings_migrate.py +146 -0
  137. package/scripts/_cli/explain_last/route.py +2 -1
  138. package/scripts/_dispatch.bash +36 -3
  139. package/scripts/_lib/__pycache__/__init__.cpython-312.pyc +0 -0
  140. package/scripts/_lib/__pycache__/agent_src.cpython-312.pyc +0 -0
  141. package/scripts/_lib/agent_settings.py +4 -1
  142. package/scripts/_lib/agent_src.py +157 -0
  143. package/scripts/agent-config +17 -6
  144. package/scripts/audit_skill_descriptions.py +18 -6
  145. package/scripts/build_discovery_manifest.py +373 -17
  146. package/scripts/check_artefact_checksums.py +104 -0
  147. package/scripts/check_cluster_patterns.py +20 -4
  148. package/scripts/check_command_count_messaging.py +33 -14
  149. package/scripts/check_council_references.py +43 -4
  150. package/scripts/check_overlay_cascade_subdirs.py +7 -3
  151. package/scripts/check_references.py +5 -2
  152. package/scripts/check_reply_consistency.py +32 -9
  153. package/scripts/check_template_pin_drift.py +24 -7
  154. package/scripts/check_token_optimizer_freshness.py +18 -3
  155. package/scripts/compile_router.py +34 -2
  156. package/scripts/compress.py +162 -44
  157. package/scripts/config/presets.py +19 -1
  158. package/scripts/config/profiles.py +16 -1
  159. package/scripts/discovery_stats.py +70 -0
  160. package/scripts/expected_perms.json +47 -0
  161. package/scripts/generate_index.py +78 -46
  162. package/scripts/generate_ownership_matrix.py +98 -43
  163. package/scripts/generate_pack_manifests.py +183 -0
  164. package/scripts/install +18 -1
  165. package/scripts/install.py +934 -59
  166. package/scripts/install.sh +27 -9
  167. package/scripts/lint_agents_layout.py +93 -13
  168. package/scripts/lint_agents_md.py +1 -1
  169. package/scripts/lint_archived_skills.py +32 -16
  170. package/scripts/lint_bench_corpus.py +14 -2
  171. package/scripts/lint_command_tiers.py +15 -2
  172. package/scripts/lint_featured_skills.py +139 -0
  173. package/scripts/lint_framework_leakage.py +33 -6
  174. package/scripts/lint_global_paths.py +147 -0
  175. package/scripts/lint_orchestration_dsl.py +6 -3
  176. package/scripts/lint_pack_boundaries.py +147 -0
  177. package/scripts/lint_pack_first_win.py +103 -0
  178. package/scripts/lint_readme_jargon.py +131 -0
  179. package/scripts/lint_readme_size.py +33 -0
  180. package/scripts/lint_rule_interactions.py +23 -5
  181. package/scripts/lint_rule_tiers.py +12 -3
  182. package/scripts/lint_trust_coherence.py +212 -0
  183. package/scripts/measure_rule_budget.py +22 -4
  184. package/scripts/move_artefact.py +143 -0
  185. package/scripts/new_skill.py +148 -0
  186. package/scripts/plan_physical_move.py +353 -0
  187. package/scripts/refine_ticket_detect.py +30 -7
  188. package/scripts/release.py +22 -2
  189. package/scripts/schemas/command.schema.json +4 -0
  190. package/scripts/skill_linter.py +248 -118
  191. package/scripts/skill_trigger_eval.py +28 -8
  192. package/scripts/smoke/kernel.sh +1 -1
  193. package/scripts/smoke/router.sh +24 -5
  194. package/scripts/smoke/skills.sh +15 -7
  195. package/scripts/smoke_quickstart.py +11 -2
  196. package/scripts/snapshot_agent_outputs.py +144 -0
  197. package/scripts/update_counts.py +45 -17
  198. package/scripts/validate_decision_engine.py +9 -1
  199. package/scripts/validate_discovery_manifest.py +94 -0
  200. package/scripts/validate_frontmatter.py +39 -20
  201. package/scripts/verify_physical_move.py +185 -0
  202. package/templates/agent-user.md +0 -1
  203. package/templates/agent-user.yml +21 -0
  204. package/templates/minimal/agents-overrides-readme.md +46 -0
  205. package/templates/minimal/overrides-gitkeep +2 -0
  206. package/dist/ui/assets/index-BTRcKDlB.js +0 -39
  207. package/dist/ui/assets/index-BTRcKDlB.js.map +0 -1
  208. package/templates/minimal/agents-gitkeep +0 -2
@@ -0,0 +1,129 @@
1
+ ---
2
+ name: install-via-agent
3
+ tier: 2
4
+ skills: []
5
+ description: Drive `@event4u/agent-config` installer through its JSON agent-mode protocol — turn-by-turn workspace + pack selection without TTY.
6
+ disable-model-invocation: true
7
+ suggestion:
8
+ eligible: true
9
+ trigger_description: "install @event4u/agent-config in this project via agent mode, headless install, no TTY"
10
+ trigger_context: "user wants to install or re-install @event4u/agent-config and the agent should drive the picker (not a human at a terminal)"
11
+ workspaces:
12
+ - agent-config-maintainer
13
+ - engineering
14
+ packs:
15
+ - meta
16
+ lifecycle: active
17
+ trust:
18
+ level: core
19
+ confidence: high
20
+ human_review_required: false
21
+ install:
22
+ default: false
23
+ removable: true
24
+ ---
25
+
26
+ # /install-via-agent
27
+
28
+ Drive the `@event4u/agent-config` installer through its **agent-mode**
29
+ protocol — a JSON-over-stdio state machine that lets an LLM agent
30
+ pick workspaces + packs turn-by-turn without a TTY.
31
+
32
+ Contract: [`docs/contracts/installer-agent-mode.md`](../docs/contracts/installer-agent-mode.md).
33
+ Architecture: [ADR-016](../../docs/decisions/ADR-016-installer-architecture.md) § 4, § 6.
34
+
35
+ ## When to use
36
+
37
+ - Headless / CI install where no human is at a keyboard.
38
+ - Re-install with a different workspace + pack mix.
39
+ - Demonstrating the protocol for documentation or smoke tests.
40
+
41
+ For interactive install with a human, run `npx @event4u/agent-config init`
42
+ in a real terminal — the installer auto-detects the TTY and renders
43
+ the `@inquirer/prompts` picker.
44
+
45
+ ## Steps
46
+
47
+ ### 1. Locate the installer
48
+
49
+ ```bash
50
+ which agent-config-installer # global install
51
+ ls node_modules/.bin/agent-config-installer # local install
52
+ # OR run from monorepo dev:
53
+ node packages/core/installer/dist/cli.js --version
54
+ ```
55
+
56
+ ### 2. Turn 1 — request the first question
57
+
58
+ ```bash
59
+ agent-config-installer init --agent --dry-run
60
+ ```
61
+
62
+ The CLI emits a single JSON line:
63
+
64
+ ```json
65
+ {"status":"question","protocol_version":1,"id":"q1.workspaces", … "next_call":"init --agent --answer q1.workspaces=<value>"}
66
+ ```
67
+
68
+ Parse `choices[]` and pick the workspaces the project needs (multi:
69
+ comma-separated values, e.g. `engineering,product`).
70
+
71
+ ### 3. Turn 2 — answer workspaces, request pack list
72
+
73
+ Execute the `next_call` substituting `<value>`:
74
+
75
+ ```bash
76
+ agent-config-installer init --agent --dry-run --answer q1.workspaces=engineering
77
+ ```
78
+
79
+ Response:
80
+
81
+ ```json
82
+ {"status":"question","id":"q2.packs", … "next_call":"… --answer q1.workspaces=engineering --answer q2.packs=<value>"}
83
+ ```
84
+
85
+ Pick from `choices[]`. The list is already scoped to the workspaces
86
+ chosen in turn 1.
87
+
88
+ ### 4. Turn 3 — answer packs, possibly confirm auto-added
89
+
90
+ ```bash
91
+ agent-config-installer init --agent --dry-run --answer q1.workspaces=engineering --answer q2.packs=engineering-base,php
92
+ ```
93
+
94
+ Two terminal cases:
95
+
96
+ - **`done`** — selection complete, no auto-added packs:
97
+
98
+ ```json
99
+ {"status":"done","summary":{"files_written":83,"lockfile_sha256":"…"}}
100
+ ```
101
+
102
+ - **`question` (`q3.confirm`)** — `requires_hint` pulled extra packs
103
+ in. Re-issue with `--answer q3.confirm=yes` to proceed, or
104
+ `--answer q3.confirm=no` to abort with `aborted_by_agent`.
105
+
106
+ ### 5. Drop `--dry-run` for the real install
107
+
108
+ Once the agent has confirmed the plan, repeat the final turn
109
+ without `--dry-run`. Files materialize atomically; the lockfile
110
+ lands at `agents/agent-config.lock.yml`. <!-- ref-ignore -->
111
+
112
+ ## Failure modes
113
+
114
+ - **Exit 2 + `status:"error"`** — `answer_malformed`,
115
+ `out_of_order`, `unknown_workspace`, `unknown_pack`, or
116
+ `aborted_by_agent`. Read `reason` and `expected_question_id`,
117
+ fix the next call, re-issue.
118
+ - **Manifest not found** — pass `--manifest <path>` pointing at
119
+ `dist/discovery/discovery-manifest.json`.
120
+ - **`protocol_version` mismatch** — abort; do not attempt
121
+ recovery. Upgrade the agent or pin an older installer.
122
+
123
+ ## Rules
124
+
125
+ - **One JSON envelope per turn** — never batch.
126
+ - **Re-issue from scratch on doubt** — the installer is stateless;
127
+ carrying all prior answers in `--answer` flags is the contract.
128
+ - **Do NOT commit `agent-config.lock.yml` blind** — review the
129
+ lockfile diff before committing per `commit-policy`.
@@ -31,7 +31,7 @@ install:
31
31
 
32
32
  Drives a Markdown script through the full pipeline. Provider flags
33
33
  override the `<default-image-provider>` / `<default-video-provider>`
34
- from [`agents/.ai-video.xml`](../../../agents/.ai-video.xml.example);
34
+ from [`agents/.ai-video.xml`](../../../agents/templates/.ai-video.xml.example);
35
35
  absent flags fall back to the XML defaults.
36
36
 
37
37
  **Block-on-ambiguity:** a missing scene heading, an unparseable
@@ -27,7 +27,7 @@ install:
27
27
 
28
28
  Top-level orchestrator for the `/video:*` family — multi-provider AI
29
29
  video creation. Reads provider keys + defaults from
30
- [`agents/.ai-video.xml`](../agents/.ai-video.xml.example) (gitignored
30
+ [`agents/.ai-video.xml`](../agents/templates/.ai-video.xml.example) (gitignored
31
31
  real file; example shipped). Every subcommand is **dry-run by default**;
32
32
  network calls require explicit per-turn confirmation per the adapter
33
33
  contract under [`scripts/ai-video/lib/adapter-contract.md`](../scripts/ai-video/lib/adapter-contract.md).
@@ -0,0 +1,81 @@
1
+ # Cheap Question Mechanics
2
+
3
+ Catalog material for [`no-cheap-questions`](../../rules/no-cheap-questions.md) — Iron Laws 3, 4, 5, 6 and the cheap-class catalog. The rule states the laws; this context carries the prose.
4
+
5
+ ## Cheap classes — full catalog
6
+
7
+ Sequencing · format-only · commit / CI / test asks · fenced re-ask · Iron-Law option · context-derived · dominant option · re-ask after decline · paternalistic (IL 3) · continuation under mandate (IL 4) · prereq-for-authorized-action (IL 5) · destination-already-stated (IL 6). Extended examples: [`asking-and-brevity-examples`](../../../docs/guidelines/agent-infra/asking-and-brevity-examples.md#cheap-question-class-catalog--extended-examples).
8
+
9
+ ## Iron Law 3 — No Paternalistic State-Assuming Options
10
+
11
+ ```
12
+ NEVER FABRICATE USER STATE TO JUSTIFY AN OPTION.
13
+ "TAKE A BREAK", "SLEEP ON IT", "COME BACK FRESH" — FORBIDDEN.
14
+ THE USER DECIDES WHEN TO STOP.
15
+ ```
16
+
17
+ ## Iron Law 4 — halt conditions under autonomous mandate
18
+
19
+ ### Mandate triggers
20
+
21
+ A standing autonomous mandate is active when any of these fire:
22
+
23
+ - `/roadmap:process-full` invocation.
24
+ - `/roadmap:process-phase` invocation.
25
+ - Explicit "entscheide selbst / decide and don't ask" in the current or a recent un-revoked turn.
26
+
27
+ ### Halt conditions
28
+
29
+ The only halts named in the invoking command:
30
+
31
+ - **Hard Floor trigger** — bulk deletion, infra change, prod-trunk merge.
32
+ - **Council-off + ambiguity** — host can't resolve without input.
33
+ - **Security-sensitive** — auth, secrets, tenancy, public endpoints (`security-sensitive-stop`).
34
+ - **Scope out of roadmap** — work crosses the roadmap's stated bounds.
35
+ - **Test / quality RED** — failure that cannot be auto-fixed.
36
+
37
+ A clean edit-batch is not a halt condition — pick the next item.
38
+
39
+ ## Iron Law 5 — prereq examples (silent execution, never a question)
40
+
41
+ When the user authorizes a top-level action ("commit", "push", "open PR", "run tests", "deploy"), the following prereq work is execution, not a decision point — never raise a numbered-options block about it:
42
+
43
+ - compression / hash-sync before commit
44
+ - code formatting / linter auto-fix before commit
45
+ - type-check / quality-tool repairs to clear CI gates
46
+ - test repair when the user said "commit and the tests pass"
47
+ - symlink / index regeneration after edits
48
+ - manifest / discovery refresh
49
+ - branch-base inventory when user named the destination
50
+ - pre-push hook fix when it blocks an authorized push and the fix is obvious (gate-script update, stale pattern removal)
51
+
52
+ ### Halt conditions during prereq execution
53
+
54
+ Stop and surface only on:
55
+
56
+ - **Hard Floor trigger** — bulk deletion, infra change, prod-trunk merge.
57
+ - **Test / quality RED** that cannot be auto-fixed → surface + ask.
58
+ - **Genuine ambiguity in WHAT to do** (not HOW to do it).
59
+
60
+ Everything else stays silent execution.
61
+
62
+ ## Iron Law 6 — destination triggers (never re-ask)
63
+
64
+ The user has already named the destination — branch-base inventory does not fire:
65
+
66
+ - "commit in this PR" / "commit auf diesem branch"
67
+ - "commit in PR #218" / explicit PR number
68
+ - "push to `<branch>`"
69
+ - **Implicit**: user is currently ON the branch and says "commit" without a qualifier → the current branch IS the destination.
70
+
71
+ No "which branch?", no "should I open a new PR?", no branch-base inventory. `scope-control`'s branch inventory applies only when the destination is **unstated**.
72
+
73
+ ## When asking IS allowed
74
+
75
+ Real architectural / scope trade-off · vague-request trigger ([`ask-when-uncertain`](../../rules/ask-when-uncertain.md)) · security-sensitive ([`security-sensitive-stop`](../../rules/security-sensitive-stop.md)) · Hard Floor ([`non-destructive-by-default`](../../rules/non-destructive-by-default.md)) · two genuinely-equivalent paths where user preference is the tiebreaker.
76
+
77
+ ## See also
78
+
79
+ - [`no-cheap-questions`](../../rules/no-cheap-questions.md) — the rule.
80
+ - [`commit-policy`](../../rules/commit-policy.md) — when commit IS authorized.
81
+ - [`scope-control § git-ops`](../../rules/scope-control.md) — branch / PR permission gate (fires only when destination unstated).
@@ -33,7 +33,7 @@ Read `caveman.speak_scope` from `.agent-settings.yml`:
33
33
  - `aggressive` — caveman everywhere except Iron-Law literals.
34
34
 
35
35
  Compile-time toggle `caveman.speak`: `false` → rule omitted from
36
- `router.json` (zero runtime cost). `caveman.enabled: false` forces all
36
+ `dist/router.json` (zero runtime cost). `caveman.enabled: false` forces all
37
37
  sub-switches off regardless.
38
38
 
39
39
  ## Carve-outs — byte-for-byte preserved
@@ -86,7 +86,7 @@ Example: *"I will now check the file and see if it exists"* →
86
86
  | Key | Default | Effect |
87
87
  |---|---|---|
88
88
  | `caveman.enabled` | `true` | Master — `false` forces all sub-switches off. |
89
- | `caveman.speak` | `true` | Compile-time include in `router.json`. |
89
+ | `caveman.speak` | `true` | Compile-time include in `dist/router.json`. |
90
90
  | `caveman.speak_scope` | `prose_only` | Runtime scope of caveman grammar. |
91
91
 
92
92
  Cross-rule index: [`frugality-charter § cross-references`](../contexts/contracts/frugality-charter.md#cross-references--frugality-canon-rules).
@@ -90,6 +90,42 @@ Calling the **same tool** more than **2 times in a row** with similar parameters
90
90
  `sequentialthinking` is especially prone to loops. Use at most **once** per task,
91
91
  NEVER for simple file operations, command execution, or straightforward edits.
92
92
 
93
+ ## Read-Loop Detection — the 15 / 25 rule
94
+
95
+ ```
96
+ READING WITHOUT ACTING IS A LOOP.
97
+ EVERY TURN MUST EDIT, RUN, OR ASK.
98
+ ```
99
+
100
+ **Read-only turn:** only `view` / `codebase-retrieval` / `grep` /
101
+ `git log` / `git show`. No `str-replace-editor`, `save-file`, no
102
+ test/build/quality run, no `git commit`.
103
+
104
+ **15-min warning (3 read-only turns in a row) — change approach.**
105
+ Next turn MUST contain at least one of: an edit, a test/build/quality
106
+ command, or an explicit user question. Self-check:
107
+
108
+ 1. Source expectation known? If no → read **once**, then act.
109
+ 2. Can a single failing test name the error? If yes → run it now.
110
+ 3. Regression in working code? → `git log` + `git show <sha> -- <file>`.
111
+ 4. Guessing at mock / payload shape? → read the producer **once**.
112
+
113
+ **25-min abort (5 read-only turns) — STOP and ask:**
114
+
115
+ ```
116
+ > ⛔ Loop: N read-only turns, ~M min. Read: <files>. Hypothesis: <X>.
117
+ > 1. Different approach (suggestion: <Y>)
118
+ > 2. Point me at the right spot
119
+ > 3. Fresh chat with state dump
120
+ ```
121
+
122
+ Non-bypassable. Autonomous mandate (`/work`, `/roadmap:process-*`,
123
+ "entscheide selbst") does **not** lift the abort — it is the safety
124
+ net that protects autonomy from becoming a token sink.
125
+
126
+ Debug procedure for "I'm in a read loop fixing tests" →
127
+ [`systematic-debugging § Debug micro-loop`](../skills/systematic-debugging/SKILL.md#debug-micro-loop--one-test-one-fix-one-re-run).
128
+
93
129
  ## State dump format
94
130
 
95
131
  ```
@@ -0,0 +1,102 @@
1
+ ---
2
+ type: "auto"
3
+ tier: "2a"
4
+ description: "Engineering output touching production, infra, security, data, or external systems — surface blast radius, name rollback path, never autonomous on Hard-Floor triggers"
5
+ source: package
6
+ triggers:
7
+ - keyword: "production"
8
+ - keyword: "deploy"
9
+ - keyword: "migration"
10
+ - keyword: "schema change"
11
+ - keyword: "DROP TABLE"
12
+ - keyword: "TRUNCATE"
13
+ - keyword: "force push"
14
+ - keyword: "rebase main"
15
+ - keyword: "rollback"
16
+ - keyword: "secrets rotation"
17
+ - keyword: "IAM"
18
+ - keyword: "DNS"
19
+ - keyword: "terraform apply"
20
+ - keyword: "kubectl apply"
21
+ - phrase: "ship to prod"
22
+ - phrase: "deploy to production"
23
+ - phrase: "merge to main"
24
+ - phrase: "release this"
25
+ routes_to:
26
+ - "skill:launch-readiness"
27
+ - "skill:threat-modeling"
28
+ workspaces:
29
+ - engineering
30
+ packs:
31
+ - engineering-base
32
+ lifecycle: active
33
+ trust:
34
+ level: core
35
+ confidence: high
36
+ human_review_required: false
37
+ install:
38
+ default: true
39
+ removable: false
40
+ ---
41
+
42
+ # Engineering Safety Floor
43
+
44
+ Domain safety floor for engineering output that crosses into production, infrastructure, security, or external systems. Restates the Hard-Floor obligations from `non-destructive-by-default` and adds engineering-specific surfacing requirements. Auto-active everywhere (lives in `core`).
45
+
46
+ ## Iron Law — production, infra, and bulk-destructive moves are never autonomous
47
+
48
+ ```
49
+ HARD FLOOR OVERRIDES EVERYTHING.
50
+ DEPLOY, MERGE-TO-PROD-TRUNK, PROD DATA / INFRA, BULK DESTRUCTIVE —
51
+ EXPLICIT USER CONFIRMATION ON THIS TURN. NO STANDING AUTONOMY APPLIES.
52
+ ```
53
+
54
+ This rule does not lift the Hard Floor — it surfaces the **engineering-shaped** evidence the user needs to evaluate the call.
55
+
56
+ ## Required structural elements for production-bound changes
57
+
58
+ Before any deploy, prod-trunk merge, schema migration, or infra change, the agent surfaces:
59
+
60
+ 1. **Blast radius** — what breaks if this goes wrong (services, tenants, users, data).
61
+ 2. **Rollback path** — exact command / PR / step to revert; estimated time to rollback.
62
+ 3. **Pre-flight checks** — tests run, quality gates passed, dry-run output (where applicable).
63
+ 4. **Observability** — what signal will detect a regression, and where to look for it.
64
+ 5. **Named risk owner** — who is on call, who approves the change.
65
+
66
+ Missing any of the five → the change is not ready to ship.
67
+
68
+ ## Human review escalation
69
+
70
+ | Trigger | Action |
71
+ |---|---|
72
+ | Schema migration that drops or renames a column | Surface `HUMAN REVIEW REQUIRED`; require explicit user confirmation; route to `migration-architect`. |
73
+ | IAM / policy / secrets rotation | Surface blast radius across all consumers before applying. |
74
+ | Force-push to a shared branch | Refuse without explicit, this-turn permission per `git-history-discipline`. |
75
+ | Bulk delete (≥ 5 unrelated files or whole directories) | Hard Floor — show diff, name the scope, ask. |
76
+ | External-system change (DNS, webhook, OAuth app, payment provider) | Threat-model first per `security-sensitive-stop`. |
77
+
78
+ ## Forbidden moves
79
+
80
+ - Deploy or merge to a production trunk without explicit this-turn permission
81
+ - Schema migration without a stated rollback path
82
+ - `--force` / `--no-verify` / `git reset --hard <pushed>` without explicit, named authorization
83
+ - Disabling tests / quality gates to ship faster
84
+ - Touching `auth`, `billing`, `tenants`, `secrets`, `uploads`, `webhooks` without threat-modeling first (per `security-sensitive-stop`)
85
+ - Claiming a change is "done" / "shipped" without fresh verification evidence (per `verify-before-complete`)
86
+
87
+ ## When this rule applies
88
+
89
+ Active whenever any of these are in the request, the open file, or the loaded skill set:
90
+ - A production-touching skill or command (`launch-readiness`, `threat-modeling`, `incident-commander`, `aws-infrastructure`, `terraform`, `terragrunt`, `github-ci`)
91
+ - Keywords: production, deploy, migration, schema change, DROP TABLE, TRUNCATE, force push, rebase main, rollback, secrets rotation, IAM, DNS, terraform apply, kubectl apply
92
+ - Phrases: "ship to prod", "deploy to production", "merge to main", "release this"
93
+
94
+ ## See also
95
+
96
+ - [`non-destructive-by-default`](non-destructive-by-default.md) — canonical Hard Floor
97
+ - [`scope-control`](scope-control.md) — git-ops permission gate
98
+ - [`security-sensitive-stop`](security-sensitive-stop.md) — threat-model before editing
99
+ - [`verify-before-complete`](verify-before-complete.md) — fresh evidence before completion claims
100
+ - [`commit-policy`](commit-policy.md) — when commits are allowed
101
+ - [`launch-readiness`](../skills/launch-readiness/SKILL.md) — pre-merge checklist
102
+ - [`threat-modeling`](../skills/threat-modeling/SKILL.md) — pre-implementation abuse-case enumeration
@@ -0,0 +1,114 @@
1
+ ---
2
+ type: "auto"
3
+ tier: "2a"
4
+ description: "Finance-pack output (runway, valuation, DCF, scenario, unit economics, forecasting) — never issue final invest/raise call; mandatory disclosure footer; sensitivity + counter-case required"
5
+ source: package
6
+ triggers:
7
+ - keyword: "runway"
8
+ - keyword: "burn"
9
+ - keyword: "valuation"
10
+ - keyword: "DCF"
11
+ - keyword: "IRR"
12
+ - keyword: "MOIC"
13
+ - keyword: "LTV"
14
+ - keyword: "CAC"
15
+ - keyword: "payback"
16
+ - keyword: "sensitivity"
17
+ - keyword: "fundraise"
18
+ - keyword: "term sheet"
19
+ - keyword: "dilution"
20
+ - keyword: "NRR"
21
+ - keyword: "EBITDA"
22
+ - keyword: "free cash flow"
23
+ - phrase: "what's it worth"
24
+ - phrase: "how long do we have"
25
+ - phrase: "should we raise"
26
+ - phrase: "model the scenarios"
27
+ routes_to:
28
+ - "skill:runway-cognition"
29
+ - "skill:dcf-modeling"
30
+ - "skill:scenario-modeling"
31
+ - "skill:unit-economics-modeling"
32
+ - "skill:forecasting"
33
+ workspaces:
34
+ - finance
35
+ packs:
36
+ - finance-basic
37
+ - finance-advanced
38
+ lifecycle: active
39
+ trust:
40
+ level: advisory
41
+ confidence: high
42
+ human_review_required: true
43
+ install:
44
+ default: true
45
+ removable: false
46
+ ---
47
+ <!-- agent-config:human-review-banner -->
48
+ > HUMAN REVIEW REQUIRED · trust: advisory · owner: finance
49
+
50
+ # Finance Safety Floor
51
+
52
+ Domain safety floor for finance-pack artefacts (cash, runway, valuation, scenario, unit economics, forecasting). Auto-activates when `pack-finance-basic` or `pack-finance-advanced` is installed.
53
+
54
+ ## Iron Law — no final investment recommendation
55
+
56
+ ```
57
+ THE AGENT NEVER ISSUES A FINAL "INVEST" / "DON'T INVEST" / "RAISE" / "DON'T RAISE" CALL.
58
+ SURFACE THE TRADE-OFF. NAME THE RISK. THE HUMAN DECIDES.
59
+ ```
60
+
61
+ Holds for every finance-pack skill (`runway-cognition`, `dcf-modeling`, `scenario-modeling`, `unit-economics-modeling`, `forecasting`, `fundraising-narrative`, `forecast-accuracy`). Finance output is decision support, never the decision.
62
+
63
+ ## Mandatory disclosure footer
64
+
65
+ Every finance-pack deliverable (memo, valuation, forecast, runway analysis) ends with:
66
+
67
+ ```
68
+ > **Not investment / tax / legal advice.** Figures are model output, not
69
+ > assured. Sensitivity assumptions are stated above. Human review
70
+ > required before any commit / raise / spend decision.
71
+ ```
72
+
73
+ The footer is non-optional. Drop it → safety violation.
74
+
75
+ ## Required structural elements
76
+
77
+ Each finance deliverable surfaces, in this order:
78
+
79
+ 1. **Assumptions block** — every input value the model uses, sourced or marked `assumption`.
80
+ 2. **Sensitivity** — at least one variable swept (±20% or ±1 σ); single-point estimates without sensitivity are forbidden for valuation and runway.
81
+ 3. **Confidence band** — `high` / `medium` / `low` per the surrounding council / skill conventions, with the reason for the band (data quality, model fit, time horizon).
82
+ 4. **Counter-case** — one sentence on what would invalidate the conclusion ("if growth halves, runway compresses to 7 months").
83
+
84
+ ## Human review escalation
85
+
86
+ | Trigger | Action |
87
+ |---|---|
88
+ | Board-pack-bound figure | Surface `HUMAN REVIEW REQUIRED` banner; do not commit without explicit user confirmation. |
89
+ | External (investor, lender, auditor) consumption | Refuse to finalize; output `DRAFT` watermark. |
90
+ | ≥ €100k single-decision exposure | Mandatory sensitivity + counter-case + named risk owner. |
91
+ | Tax position or accounting treatment | Refuse; route to `domain-safety-disclaimer` and explicitly defer to a CPA / Steuerberater. |
92
+
93
+ ## Forbidden moves
94
+
95
+ - "Based on this model, you should …" without surfacing the assumption set
96
+ - DCF or valuation output without a discount-rate sensitivity sweep
97
+ - Runway figure as a single number (must be a shape: optimistic / base / downside)
98
+ - Forecast accuracy claim without retro-loop reference
99
+ - Comparing two companies / deals without naming the comparability gap
100
+ - Suggesting capital actions (raise, cut, layoff) without naming the human-decision owner
101
+
102
+ ## When this rule applies
103
+
104
+ Active whenever any of these are in the request, the open file, or the loaded skill set:
105
+ - A finance-pack skill name (`runway-cognition`, `dcf-modeling`, `scenario-modeling`, `unit-economics-modeling`, `forecasting`, `fundraising-narrative`, `forecast-accuracy`)
106
+ - Keywords: cash, runway, burn, valuation, DCF, IRR, MOIC, LTV, CAC, payback, scenario, sensitivity, fundraise, raise, term sheet, dilution, ARR, MRR, NRR, churn rate, gross margin, contribution margin, EBITDA, free cash flow
107
+ - Phrases: "what's it worth", "how long do we have", "should we raise", "model the scenarios", "what's our LTV"
108
+
109
+ ## See also
110
+
111
+ - `domain-safety-disclaimer` — generic advisory-content floor (core pack)
112
+ - [`runway-cognition`](../skills/runway-cognition/SKILL.md) — operational depth on runway shape
113
+ - `dcf-modeling` — valuation depth (pack-finance-advanced)
114
+ - `scenario-modeling` — base / upside / downside construction (pack-finance-advanced)
@@ -91,7 +91,7 @@ If either stop fires and resolution is not immediate → tag the state (`git tag
91
91
 
92
92
  ## Why this rule exists
93
93
 
94
- Interactive rebase + fixup loops generate disproportionate token cost on every iteration: re-running CI per replayed commit, resolving the same content conflict in three derived files (`.compression-hashes.json`, `router.json`, `.windsurfrules`), losing the working tree to a stash that silently re-introduces older state. A single conflict can burn the budget of an entire feature.
94
+ Interactive rebase + fixup loops generate disproportionate token cost on every iteration: re-running CI per replayed commit, resolving the same content conflict in three derived files (`.compression-hashes.json`, `dist/router.json`, `.windsurfrules`), losing the working tree to a stash that silently re-introduces older state. A single conflict can burn the budget of an entire feature.
95
95
 
96
96
  A previous session squashed a pushed branch, the push hook failed at the token boundary, the session ended — and the next session saw local and origin pointing at different SHAs for the same logical work. A blind `git pull --rebase` cascaded into conflicts across every derived file. Recovery required forensic SHA-archaeology. The pre/post-rewrite stops make that sequence structurally impossible.
97
97
 
@@ -20,60 +20,62 @@ install:
20
20
 
21
21
  # No Cheap Questions
22
22
 
23
- A question is **cheap** when context already answers it, an option breaches an Iron Law, choices differ only in sequencing / format, or one option is dominant. Mode-independent. Autonomy never lifts the floor.
23
+ Cheap = context answers it, option breaches an Iron Law, choices differ only in sequencing / format, or one option dominates. Mode-independent; autonomy never lifts the floor.
24
24
 
25
25
  ## The Iron Laws
26
26
 
27
27
  ```
28
- NEVER ASK WHAT THE STATED CONTEXT ALREADY ANSWERS.
29
- NEVER PRESENT AN OPTION THAT VIOLATES AN IRON LAW.
30
- NEVER OFFER NUMBERED CHOICES WITHOUT A REAL TRADE-OFF.
28
+ NEVER ASK WHAT CONTEXT ANSWERS.
29
+ NEVER OFFER AN IRON-LAW-VIOLATING OPTION.
30
+ NEVER NUMBER CHOICES WITHOUT A REAL TRADE-OFF.
31
31
  ```
32
32
 
33
- ## Cheap classes
34
-
35
- Sequencing · format-only · commit asks · CI / test asks · fenced re-ask · Iron-Law option · context-derived · dominant option · re-ask after decline · paternalistic (Iron Law 3) · continuation under mandate (Iron Law 4). Catalog: [`asking-and-brevity-examples`](../docs/guidelines/agent-infra/asking-and-brevity-examples.md#cheap-question-class-catalog--extended-examples).
33
+ Cheap-class catalog + IL 3 (no paternalistic state-assuming options): [`cheap-question-mechanics § cheap classes`](../contexts/execution/cheap-question-mechanics.md#cheap-classes--full-catalog).
36
34
 
37
35
  ## Iron Law 4 — No Continuation Prompts Under Autonomous Mandate
38
36
 
39
37
  ```
40
- WHEN A STANDING AUTONOMOUS MANDATE IS ACTIVE /roadmap:process-full,
41
- /roadmap:process-phase, EXPLICIT "ENTSCHEIDE SELBST / DECIDE AND DON'T
42
- ASK" NEVER ASK "WEITER? / NEXT STEP? / SHALL I CONTINUE?".
43
- A CLEAN EDIT-BATCH IS NOT A HALT CONDITION. THE ONLY HALTS ARE THE
44
- FIVE NAMED IN THE INVOKING COMMAND (HARD-FLOOR, COUNCIL-OFF +
45
- AMBIGUITY, SECURITY-SENSITIVE, SCOPE-OUT-OF-ROADMAP, TEST/QUALITY RED).
38
+ STANDING AUTONOMOUS MANDATE ACTIVE NEVER ASK
39
+ "WEITER? / NEXT STEP? / SHALL I CONTINUE?".
40
+ A CLEAN EDIT-BATCH IS NOT A HALT CONDITION.
41
+ ```
42
+
43
+ Mandate triggers + halt list: [`cheap-question-mechanics § Iron Law 4`](../contexts/execution/cheap-question-mechanics.md#iron-law-4--halt-conditions-under-autonomous-mandate).
44
+
45
+ ## Iron Law 5 — Prereq Work Is Execution, Not a Question
46
+
47
+ ```
48
+ USER AUTHORIZES X ("COMMIT" / "PUSH" / "OPEN PR" / "DEPLOY")
49
+ → ALL PREREQ WORK IS EXECUTION. NEVER ASK, NEVER OFFER
50
+ "DO THE PREREQ" vs "SKIP AND BREAK THE GATE".
46
51
  ```
47
52
 
48
- ## Iron Law 3 No Paternalistic State-Assuming Options
53
+ Prereq catalog + halt conditions: [`cheap-question-mechanics § Iron Law 5`](../contexts/execution/cheap-question-mechanics.md#iron-law-5--prereq-examples-silent-execution-never-a-question).
54
+
55
+ ## Iron Law 6 — Destination Already Stated, Never Re-Ask
49
56
 
50
57
  ```
51
- NEVER FABRICATE USER STATE TO JUSTIFY AN OPTION.
52
- "TAKE A BREAK", "SLEEP ON IT", "COME BACK FRESH" — FORBIDDEN.
53
- THE USER DECIDES WHEN TO STOP. THE AGENT DECIDES WHAT TO BUILD NEXT.
58
+ USER NAMED THE DESTINATION DO NOT RE-ASK.
59
+ NO BRANCH-BASE INVENTORY, NO "WHICH BRANCH?", NO "NEW PR?".
54
60
  ```
55
61
 
62
+ Triggers + scope-control interaction: [`cheap-question-mechanics § Iron Law 6`](../contexts/execution/cheap-question-mechanics.md#iron-law-6--destination-triggers-never-re-ask).
63
+
56
64
  ## Pre-Send Self-Check — MANDATORY before every question
57
65
 
58
- Silent, before any numbered-options block:
66
+ Silent, before any numbered-options block. Any "yes" → don't ask:
59
67
 
60
- 1. Answer already in stated context?
61
- 2. Option violates `commit-policy`, `scope-control § git-ops`, or `non-destructive-by-default`?
68
+ 1. Answer in stated context?
69
+ 2. Option violates `commit-policy` / `scope-control § git-ops` / `non-destructive-by-default`?
62
70
  3. Pure sequencing / format, no trade-off?
63
71
  4. One option obviously dominant?
64
72
  5. User fenced step (*"plan only"*, *"review first"*) → deliver + handback.
65
73
  6. User already declined? Re-ask forbidden.
66
- 7. Option assumes user fatigue / frustration without in-message citation? Iron Law 3 — drop.
67
- 8. Standing autonomous mandate + "weiter? / continue?" — Iron Law 4, drop; pick next item.
68
-
69
- Any "yes" don't ask. Pick dominant path, state inline assumption, hand back. Genuine ambiguity → [`ask-when-uncertain`](ask-when-uncertain.md).
70
-
71
- ## When asking IS allowed
74
+ 7. Assumes user fatigue / frustration without citation? IL 3.
75
+ 8. Mandate active + "weiter? / continue?" — IL 4, pick next item.
76
+ 9. Prereq for user-authorized action? IL 5, execute silently.
77
+ 10. Destination (branch / PR) already named? IL 6, never re-ask.
72
78
 
73
- - Real architectural / scope decision with non-obvious trade-offs.
74
- - Vague-request trigger ([`ask-when-uncertain`](ask-when-uncertain.md)).
75
- - Security-sensitive ([`security-sensitive-stop`](security-sensitive-stop.md)).
76
- - Hard Floor ([`non-destructive-by-default`](non-destructive-by-default.md)).
77
- - Two genuinely-equivalent paths; user preference is the tiebreaker.
79
+ Pick dominant path, state inline assumption, hand back. Genuine ambiguity → [`ask-when-uncertain`](ask-when-uncertain.md).
78
80
 
79
- In doubt → ask. This rule narrows asking, never widens silence.
81
+ In doubt → ask. This rule narrows asking, never widens silence. When asking IS allowed: [`cheap-question-mechanics § when-asking-is-allowed`](../contexts/execution/cheap-question-mechanics.md#when-asking-is-allowed).
@@ -45,12 +45,12 @@ NEVER DEFAULT TO A NON-STABLE PROVIDER SILENTLY.
45
45
  SURFACE THE LIFECYCLE TIER. ASK BEFORE RUNNING.
46
46
  ```
47
47
 
48
- This rule routes the agent to [`docs/contracts/provider-lifecycle.md`](../docs/contracts/provider-lifecycle.md) whenever a `/video:* / /image:* / /audio:*` surface fires, an adapter under `scripts/ai-video/adapters/` is read or edited, or `agents/.ai-video.xml.example` (or the operator's `agents/.ai-video.xml`) is in play. The contract defines four tiers — `experimental | stable | deprecated | community` — and the agent's obligations per tier.
48
+ This rule routes the agent to [`docs/contracts/provider-lifecycle.md`](../docs/contracts/provider-lifecycle.md) whenever a `/video:* / /image:* / /audio:*` surface fires, an adapter under `scripts/ai-video/adapters/` is read or edited, or `agents/templates/.ai-video.xml.example` (or the operator's `agents/.ai-video.xml`) is in play. The contract defines four tiers — `experimental | stable | deprecated | community` — and the agent's obligations per tier.
49
49
 
50
50
  ## What this rule enforces
51
51
 
52
52
  1. **Read the tier before picking.** When the agent resolves a provider (from `--provider <id>`, from `<default-video-provider>` / `<default-image-provider>`, or from a skill's default), it MUST read both:
53
- - the `<lifecycle>` element under `<provider id="…">` in `agents/.ai-video.xml.example` (or the operator's `.ai-video.xml`), and
53
+ - the `<lifecycle>` element under `<provider id="…">` in `agents/templates/.ai-video.xml.example` (or the operator's `.ai-video.xml`), and
54
54
  - the `Lifecycle:` header comment in `scripts/ai-video/adapters/<id>.sh`.
55
55
  Mismatch between the two is a contract violation and MUST be surfaced before running.
56
56
 
@@ -66,7 +66,7 @@ This rule routes the agent to [`docs/contracts/provider-lifecycle.md`](../docs/c
66
66
 
67
67
  - Running `/video:scene` against the `<default-video-provider>` without reading the lifecycle tag first → violation.
68
68
  - Picking a `community` provider because it was named in the prompt, without surfacing the tier → violation.
69
- - Editing an adapter and leaving its header `Lifecycle:` comment out of sync with `agents/.ai-video.xml.example` → violation (CI does not catch this; the agent must).
69
+ - Editing an adapter and leaving its header `Lifecycle:` comment out of sync with `agents/templates/.ai-video.xml.example` → violation (CI does not catch this; the agent must).
70
70
  - Auto-promoting an adapter from `experimental` to `stable` because "dry-run worked" → violation. Promotion requires a maintainer-captured real-API smoke trace under `agents/reference/ai-video/smoke-traces/`.
71
71
 
72
72
  ## Day-one state
@@ -77,7 +77,7 @@ All five shipped adapters (`openai-images`, `gemini-veo`, `kling`, `higgsfield`,
77
77
 
78
78
  A Python pre-run gate enumerating tier-by-command rules would either be too coarse (`experimental → block`, breaking day-to-day dev iteration) or too detailed (per-command tier matrix, drifting from reality on every new provider). The agent reading the tag at run time, surfacing the tier, and asking is the correct enforcement surface: the model that picked the provider is the model that surfaces the obligation, and the human is the policy decision point.
79
79
 
80
- The CI guarantee is structural reachability — the linter would fail if a provider was declared in `agents/.ai-video.xml.example` without a lifecycle tag (extension planned). It does not enforce the runtime obligation; the agent does.
80
+ The CI guarantee is structural reachability — the linter would fail if a provider was declared in `agents/templates/.ai-video.xml.example` without a lifecycle tag (extension planned). It does not enforce the runtime obligation; the agent does.
81
81
 
82
82
  ## See also
83
83