@event4u/agent-config 8.10.0 → 8.12.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 (226) hide show
  1. package/.claude-plugin/marketplace.json +1 -1
  2. package/AGENTS.md +1 -0
  3. package/CHANGELOG.md +67 -149
  4. package/README.md +6 -6
  5. package/dist/agent-src/commands/challenge-me/vision.md +121 -32
  6. package/dist/agent-src/commands/challenge-me/with-docs.md +21 -8
  7. package/dist/agent-src/commands/commit/in-chunks.md +1 -1
  8. package/dist/agent-src/commands/commit.md +2 -1
  9. package/dist/agent-src/commands/cost/report.md +2 -1
  10. package/dist/agent-src/commands/feature/dev.md +4 -4
  11. package/dist/agent-src/commands/humanize.md +101 -0
  12. package/dist/agent-src/commands/jira-ticket.md +2 -2
  13. package/dist/agent-src/commands/memory/load.md +15 -0
  14. package/dist/agent-src/commands/optimize/project.md +12 -0
  15. package/dist/agent-src/commands/roadmap/create.md +12 -11
  16. package/dist/agent-src/commands/tests/create.md +1 -1
  17. package/dist/agent-src/commands/worktree/cleanup.md +22 -17
  18. package/dist/agent-src/commands/worktree/create.md +3 -1
  19. package/dist/agent-src/commands/worktree/status.md +12 -0
  20. package/dist/agent-src/contexts/execution/autonomy-mechanics.md +66 -0
  21. package/dist/agent-src/contexts/execution/orchestration-benchmark-gate.md +1 -0
  22. package/dist/agent-src/contexts/execution/orchestration-telemetry.md +47 -3
  23. package/dist/agent-src/contexts/execution/roadmap-ci-steps-mechanics.md +117 -0
  24. package/dist/agent-src/contexts/execution/roadmap-process-loop.md +111 -85
  25. package/dist/agent-src/contexts/execution/roadmap-writing-source-derived.md +65 -0
  26. package/dist/agent-src/contexts/execution/subagent-modes-detail.md +84 -0
  27. package/dist/agent-src/rules/architecture.md +6 -51
  28. package/dist/agent-src/rules/autonomous-execution.md +7 -37
  29. package/dist/agent-src/rules/broken-access-control.md +7 -45
  30. package/dist/agent-src/rules/code-comment-discipline.md +64 -0
  31. package/dist/agent-src/rules/context-hygiene.md +14 -0
  32. package/dist/agent-src/rules/decision-revisit-gate.md +9 -77
  33. package/dist/agent-src/rules/delegation-policy.md +10 -8
  34. package/dist/agent-src/rules/design-fidelity.md +4 -0
  35. package/dist/agent-src/rules/git-history-discipline.md +4 -79
  36. package/dist/agent-src/rules/improve-before-implement.md +7 -66
  37. package/dist/agent-src/rules/legal-safety-floor.md +11 -55
  38. package/dist/agent-src/rules/no-roadmap-references.md +13 -77
  39. package/dist/agent-src/rules/persona-governance.md +5 -47
  40. package/dist/agent-src/rules/provider-lifecycle-discipline.md +6 -32
  41. package/dist/agent-src/rules/roadmap-ci-steps-policy.md +21 -104
  42. package/dist/agent-src/rules/roadmap-progress-sync.md +5 -56
  43. package/dist/agent-src/rules/think-before-action.md +10 -0
  44. package/dist/agent-src/rules/untrusted-input-defense.md +3 -75
  45. package/dist/agent-src/rules/verify-before-complete.md +12 -0
  46. package/dist/agent-src/skills/agent-docs-writing/SKILL.md +96 -12
  47. package/dist/agent-src/skills/ai-council/SKILL.md +19 -9
  48. package/dist/agent-src/skills/api-design/SKILL.md +7 -5
  49. package/dist/agent-src/skills/api-testing/SKILL.md +1 -1
  50. package/dist/agent-src/skills/authz-review/SKILL.md +59 -2
  51. package/dist/agent-src/skills/blast-radius-analyzer/SKILL.md +1 -1
  52. package/dist/agent-src/skills/bug-analyzer/SKILL.md +19 -16
  53. package/dist/agent-src/skills/code-refactoring/SKILL.md +9 -9
  54. package/dist/agent-src/skills/content-funnel-design/SKILL.md +2 -0
  55. package/dist/agent-src/skills/data-flow-mapper/SKILL.md +1 -1
  56. package/dist/agent-src/skills/decision-review/SKILL.md +86 -0
  57. package/dist/agent-src/skills/defense-in-depth/SKILL.md +2 -2
  58. package/dist/agent-src/skills/dependency-upgrade/SKILL.md +7 -7
  59. package/dist/agent-src/skills/design-intelligence/SKILL.md +8 -8
  60. package/dist/agent-src/skills/design-review/SKILL.md +23 -2
  61. package/dist/agent-src/skills/doc-coauthoring/SKILL.md +2 -0
  62. package/dist/agent-src/skills/editorial-calendar/SKILL.md +2 -0
  63. package/dist/agent-src/skills/fe-design/SKILL.md +7 -9
  64. package/dist/agent-src/skills/git-workflow/SKILL.md +86 -0
  65. package/dist/agent-src/skills/humanizer/SKILL.md +147 -0
  66. package/dist/agent-src/skills/humanizer/data/patterns.md +190 -0
  67. package/dist/agent-src/skills/humanizer/evals/triggers.json +17 -0
  68. package/dist/agent-src/skills/laravel/SKILL.md +14 -1
  69. package/dist/agent-src/skills/launch-readiness/SKILL.md +20 -19
  70. package/dist/agent-src/skills/legal-practice-profile/SKILL.md +126 -0
  71. package/dist/agent-src/skills/logging-monitoring/SKILL.md +1 -1
  72. package/dist/agent-src/skills/mcp/SKILL.md +1 -1
  73. package/dist/agent-src/skills/memory-consolidation/SKILL.md +14 -1
  74. package/dist/agent-src/skills/migration-architect/SKILL.md +2 -1
  75. package/dist/agent-src/skills/module-detect-on-the-fly/SKILL.md +58 -1
  76. package/dist/agent-src/skills/performance/SKILL.md +1 -1
  77. package/dist/agent-src/skills/php-debugging/SKILL.md +17 -0
  78. package/dist/agent-src/skills/readme-writing/SKILL.md +2 -0
  79. package/dist/agent-src/skills/readme-writing-package/SKILL.md +2 -0
  80. package/dist/agent-src/skills/release-comms/SKILL.md +2 -0
  81. package/dist/agent-src/skills/roadmap-writing/SKILL.md +22 -51
  82. package/dist/agent-src/skills/security-audit/SKILL.md +6 -9
  83. package/dist/agent-src/skills/sentry-integration/SKILL.md +2 -2
  84. package/dist/agent-src/skills/skill-improvement-pipeline/SKILL.md +8 -0
  85. package/dist/agent-src/skills/source-discovery/SKILL.md +26 -24
  86. package/dist/agent-src/skills/subagent-orchestration/SKILL.md +55 -46
  87. package/dist/agent-src/skills/subagent-orchestration/evals/evals.json +42 -0
  88. package/dist/agent-src/skills/systematic-debugging/SKILL.md +10 -0
  89. package/dist/agent-src/skills/using-git-worktrees/SKILL.md +10 -0
  90. package/dist/agent-src/skills/worktree-lifecycle/SKILL.md +27 -20
  91. package/dist/agent-src/skills/worktree-lifecycle/evals/evals.json +38 -0
  92. package/dist/agent-src/templates/agent-settings.md +3 -2
  93. package/dist/agent-src/templates/agents/agent-project-settings.example.yml +15 -1
  94. package/dist/agent-src/templates/contexts/knowledge-card.md +12 -0
  95. package/dist/agent-src/templates/roadmaps.md +14 -0
  96. package/dist/cli/commands/recordTriggerEval.js +4 -14
  97. package/dist/cli/commands/recordTriggerEval.js.map +1 -1
  98. package/dist/discovery/deprecation-report.md +1 -1
  99. package/dist/discovery/discovery-manifest.json +157 -88
  100. package/dist/discovery/discovery-manifest.json.sha256 +1 -1
  101. package/dist/discovery/discovery-manifest.summary.md +6 -6
  102. package/dist/discovery/orphan-report.md +1 -1
  103. package/dist/discovery/packs.json +13 -10
  104. package/dist/discovery/trust-report.md +3 -3
  105. package/dist/discovery/workspaces.json +14 -9
  106. package/dist/install/install.mjs +12 -7
  107. package/dist/mcp/registry-manifest.json +4 -4
  108. package/dist/router.json +1 -1
  109. package/dist/scripts/_lib/claude_settings_hooks.js +8 -0
  110. package/dist/scripts/_lib/claude_settings_hooks.js.map +1 -1
  111. package/dist/scripts/_lib/trigger_eval_floors.js +24 -0
  112. package/dist/scripts/_lib/trigger_eval_floors.js.map +1 -0
  113. package/dist/scripts/condense.js +12 -2
  114. package/dist/scripts/condense.js.map +1 -1
  115. package/dist/server/schemas/settings.js +5 -2
  116. package/dist/server/schemas/settings.js.map +1 -1
  117. package/docs/CLAIMS.md +54 -5
  118. package/docs/architecture.md +4 -4
  119. package/docs/archive/CHANGELOG-pre-8.12.0.md +304 -0
  120. package/docs/benchmark.md +90 -0
  121. package/docs/catalog.md +8 -5
  122. package/docs/command-flows.md +2 -1
  123. package/docs/contracts/ai-council-config.md +97 -0
  124. package/docs/contracts/command-clusters.md +1 -0
  125. package/docs/contracts/evidence-based-pruning.md +1 -0
  126. package/docs/contracts/hook-architecture-v1.md +25 -0
  127. package/docs/contracts/kernel-membership.md +35 -0
  128. package/docs/contracts/measurement-baseline.md +1 -0
  129. package/docs/contracts/persona-schema.md +49 -0
  130. package/docs/contracts/provider-lifecycle.md +29 -4
  131. package/docs/contracts/release-sizing.md +22 -0
  132. package/docs/contracts/write-engine.md +38 -1
  133. package/docs/customization.md +12 -0
  134. package/docs/decisions/ADR-002-kernel-bucket-overrides.md +11 -0
  135. package/docs/decisions/ADR-003-flat-cluster-subs-and-colon-syntax.md +11 -0
  136. package/docs/decisions/ADR-006-skill-tools-python-pilot.md +1 -1
  137. package/docs/decisions/ADR-028-root-layout.md +1 -1
  138. package/docs/decisions/ADR-038-canonical-settings-path.md +10 -0
  139. package/docs/decisions/ADR-092-defer-command-tier-alias-removal.md +29 -5
  140. package/docs/decisions/ADR-093-ai-council-config-user-global.md +1 -1
  141. package/docs/decisions/ADR-100-global-knowledge-card-sharing.md +7 -0
  142. package/docs/decisions/ADR-103-global-knowledge-default-off-until-measured.md +2 -2
  143. package/docs/decisions/ADR-105-automatic-subagent-orchestration.md +1 -1
  144. package/docs/decisions/ADR-114-commit-policy-iron-law-override.md +11 -0
  145. package/docs/decisions/ADR-116-memory-tripwire-activation-path.md +11 -1
  146. package/docs/decisions/ADR-117-subagents-auto-default-on.md +2 -1
  147. package/docs/decisions/ADR-118-loop-engineering-boundaries.md +162 -0
  148. package/docs/decisions/ADR-119-global-knowledge-default-on.md +104 -0
  149. package/docs/decisions/ADR-120-council-chairman-mode.md +70 -0
  150. package/docs/decisions/ADR-121-knowledge-sensitivity-classes.md +90 -0
  151. package/docs/decisions/ADR-200-python-to-typescript-migration.md +11 -1
  152. package/docs/decisions/ADR-rule-kernel-and-router.md +11 -0
  153. package/docs/decisions/INDEX.md +13 -9
  154. package/docs/design/council-vs-solo-baseline.md +92 -0
  155. package/docs/design/cross-model-parity-eval.md +82 -0
  156. package/docs/design/length-neutral-judge-rerun.md +92 -0
  157. package/docs/design/utilization-window-criteria.md +51 -0
  158. package/docs/featured-skills.md +2 -2
  159. package/docs/getting-started-by-role.md +1 -1
  160. package/docs/getting-started.md +2 -2
  161. package/docs/governance-advantage.md +1 -1
  162. package/docs/guidelines/agent-infra/agent-interaction-and-decision-quality.md +68 -0
  163. package/docs/guidelines/agent-infra/roadmap-progress-mechanics.md +80 -5
  164. package/docs/guidelines/agent-infra/rule-body-migration-inventory.md +241 -0
  165. package/docs/guidelines/agent-infra/untrusted-input-spotlighting.md +80 -3
  166. package/docs/guidelines/code-clarity.md +191 -1
  167. package/docs/guidelines/design-antipatterns.md +20 -0
  168. package/docs/guidelines/php/php-coding-patterns.md +12 -2
  169. package/docs/maintainers/branch-protection.md +87 -0
  170. package/docs/maintainers/system-map.md +85 -0
  171. package/docs/proof.md +32 -15
  172. package/docs/wedge/production-validator/production-validator.md +27 -0
  173. package/package.json +1 -1
  174. package/src/config/agent-settings.template.yml +38 -9
  175. package/src/scripts/_cli/cmd_doctor.ts +129 -1
  176. package/src/scripts/_lib/auto_dispatch.corpus.test.ts +87 -0
  177. package/src/scripts/_lib/claude_settings_hooks.ts +8 -0
  178. package/src/scripts/_lib/knowledge_global.ts +50 -2
  179. package/src/scripts/_lib/knowledge_global_promote.ts +150 -0
  180. package/src/scripts/_lib/knowledge_global_redaction.ts +42 -4
  181. package/src/scripts/_lib/lexical_index.ts +15 -2
  182. package/src/scripts/_lib/orchestration_record.ts +14 -0
  183. package/src/scripts/_lib/trigger_eval_floors.ts +31 -0
  184. package/src/scripts/ai_council/chairman.ts +90 -0
  185. package/src/scripts/ai_council/clients.ts +18 -3
  186. package/src/scripts/ai_council/config.ts +157 -0
  187. package/src/scripts/ai_council/debate_gates.ts +89 -0
  188. package/src/scripts/ai_council/orchestrator.ts +252 -2
  189. package/src/scripts/ai_council/prompts.ts +121 -11
  190. package/src/scripts/ai_council/replay.ts +17 -0
  191. package/src/scripts/ai_council/stance_tally.ts +184 -0
  192. package/src/scripts/ai_tells_rules.ts +433 -0
  193. package/src/scripts/bench_humanizer_eval.ts +240 -0
  194. package/src/scripts/bench_persona_placebo.ts +308 -0
  195. package/src/scripts/bench_quality_rerun.ts +357 -0
  196. package/src/scripts/build_discovery_manifest.ts +6 -0
  197. package/src/scripts/build_proof.ts +30 -9
  198. package/src/scripts/check_artefact_count_messaging.ts +56 -0
  199. package/src/scripts/check_claims.ts +40 -0
  200. package/src/scripts/check_knowledge_cards.ts +33 -4
  201. package/src/scripts/check_portability.ts +1 -0
  202. package/src/scripts/check_rule_invariants.ts +10 -3
  203. package/src/scripts/complexity_report.ts +776 -0
  204. package/src/scripts/condense.ts +16 -2
  205. package/src/scripts/consumer_matrix.ts +292 -14
  206. package/src/scripts/council_cli.ts +203 -1
  207. package/src/scripts/detect_ai_tells.ts +312 -0
  208. package/src/scripts/explain_run.ts +593 -0
  209. package/src/scripts/install.ts +12 -0
  210. package/src/scripts/knowledge_global_cli.ts +235 -46
  211. package/src/scripts/lint_framework_leakage.ts +88 -7
  212. package/src/scripts/lint_framework_leakage_allowlist.json +59 -572
  213. package/src/scripts/lint_knowledge_scale.ts +30 -0
  214. package/src/scripts/lint_originality_shingles.ts +210 -0
  215. package/src/scripts/orchestration_record.ts +1 -0
  216. package/src/scripts/rule_backlinks.ts +0 -0
  217. package/src/scripts/schemas/agent-settings.schema.json +11 -0
  218. package/src/scripts/self_review_gate.ts +41 -15
  219. package/src/scripts/skill_eval_coverage.ts +71 -3
  220. package/src/scripts/skill_linter.ts +1 -0
  221. package/src/scripts/trigger_eval_rotation.ts +344 -0
  222. package/src/scripts/update_counts.ts +5 -17
  223. package/src/scripts/worktree_cleanup_check.ts +263 -0
  224. package/src/server/schemas/settings.ts +8 -3
  225. package/src/scripts/analysis_freshness.ts +0 -362
  226. package/src/scripts/export_replay_corpus.ts +0 -208
package/docs/catalog.md CHANGED
@@ -1,13 +1,13 @@
1
1
  # agent-config — Public Catalog
2
2
 
3
- Consumer-facing catalog of all **639 public artefacts** shipped by
3
+ Consumer-facing catalog of all **642 public artefacts** shipped by
4
4
  this package. Internal package-maintenance rules and deprecation shims
5
5
  are excluded.
6
6
 
7
7
  > **Regenerate:** `./scripts-run src/scripts/generate_index`
8
8
  > Auto-generated — do not edit manually.
9
9
 
10
- ## Skills (270)
10
+ ## Skills (271)
11
11
 
12
12
  > **Behavioural-eval coverage is measured, not implied.** A skill is
13
13
  > behaviourally evaluated only if it ships `evals/evals.json`; most do
@@ -129,6 +129,7 @@ are excluded.
129
129
  | skill | [`guideline-writing`](../dist/agent-src/skills/guideline-writing/SKILL.md) | | Use when creating or editing a guideline in docs/guidelines/ — reference material cited by skills, no auto-triggers — even when the user just says 'write up our naming conventions'. |
130
130
  | skill | [`hiring-loop-design`](../dist/agent-src/skills/hiring-loop-design/SKILL.md) | | Use when shaping an engineering hiring loop — stages, take-home vs live, calibration, bar-raiser, signal-vs-noise audit. Triggers on 'design our interview loop', 'audit our hiring bar'. |
131
131
  | skill | [`html-deck`](../dist/agent-src/skills/html-deck/SKILL.md) | | Build a slide presentation as one HTML file — fixed 1920×1080 canvas letterboxed to any viewport, layout-system-first, type floors. Use for deck, slides, presentation, or pitch requests. |
132
+ | skill | [`humanizer`](../dist/agent-src/skills/humanizer/SKILL.md) | | Use when removing AI-writing tells from deliverable prose — posts, articles, drafts. Triggers on 'make this sound less like AI', 'humanize this draft', 'this reads like ChatGPT wrote it'. |
132
133
  | skill | [`iconography`](../dist/agent-src/skills/iconography/SKILL.md) | | Resolve an icon request to a concrete Iconify name and emit the embedding for the project's stack. Use when adding icons, picking an icon set, or wiring Lucide/Heroicons/Phosphor/Tabler. |
133
134
  | skill | [`image-analyser`](../dist/agent-src/skills/image-analyser/SKILL.md) | | Use to analyse a character image down to the smallest mole and diff against a canon — per-feature spec, OCR-reads tattoo text, flags drift. Triggers 'analyse this image', 'match the canon'. |
134
135
  | skill | [`image-creator`](../dist/agent-src/skills/image-creator/SKILL.md) | | Use to generate a character image to spec — max-fidelity reproducible prompt from a Canon Spec, anchors-first, provider/governance-gated. Triggers 'generate this character', 'render to spec'. |
@@ -265,7 +266,7 @@ are excluded.
265
266
  | skill | [`sql-writing`](../dist/agent-src/skills/sql-writing/SKILL.md) | | Use when writing raw SQL — MariaDB/MySQL syntax, parameterization, raw migrations, seeders with `DB::statement`; fires even on a pasted query asking 'why is this slow'. |
266
267
  | skill | [`stakeholder-tradeoff`](../dist/agent-src/skills/stakeholder-tradeoff/SKILL.md) | | Use when stakeholders pull a decision in different directions — frames each lens, builds a trade-off matrix, surfaces the cost of every choice — even if the user just says 'PO and ops disagree'. |
267
268
  | skill | [`standards-from-config`](../dist/agent-src/skills/standards-from-config/SKILL.md) | | Use when you need this project's coding standards (line length, quotes, import order, naming, commit format) — derive them from the REAL tooling config as a pointer + digest, never a guessed claim. |
268
- | skill | [`subagent-orchestration`](../dist/agent-src/skills/subagent-orchestration/SKILL.md) | | Use when orchestrating implementer/judge subagents — seven modes (do-and-judge ±two-stage, do-in-steps/parallel/worktrees, do-competitively, judge-with-debate) — models from .agent-settings.yml. |
269
+ | skill | [`subagent-orchestration`](../dist/agent-src/skills/subagent-orchestration/SKILL.md) | | Use when orchestrating implementer/judge subagents — form gate + eight modes (do-and-judge ±two-stage, steps/parallel/worktrees, competitively, debate, live-app-judge). |
269
270
  | skill | [`supply-chain-intake`](../dist/agent-src/skills/supply-chain-intake/SKILL.md) | | Before adding/installing any dependency the agent named — verify the package exists (slopsquatting: ~1 in 5 AI suggestions are hallucinated), isn't typo-adjacent, is pinned + locked, and CVE-scanned |
270
271
  | skill | [`symfony-workflow`](../dist/agent-src/skills/symfony-workflow/SKILL.md) | | Writes Symfony PHP — DI container, bundles, Doctrine, Messenger, Security voters, console commands. For Laravel / Eloquent / Artisan use `laravel`. For framework-free PHP use `php-coder`. |
271
272
  | skill | [`systematic-debugging`](../dist/agent-src/skills/systematic-debugging/SKILL.md) | | Use on a bug, test failure, crash, or unexpected behavior — enforce reproduce → isolate → hypothesize → verify before any fix; fires even on 'this is broken' / 'quick fix'. |
@@ -298,7 +299,7 @@ are excluded.
298
299
  | skill | [`wireframe`](../dist/agent-src/skills/wireframe/SKILL.md) | | Explore a flow or layout with 3+ disposable lo-fi greyscale wireframes on a named axis, before any hi-fi work. Use when the user wants to sketch directions or explore structure. |
299
300
  | skill | [`worktree-lifecycle`](../dist/agent-src/skills/worktree-lifecycle/SKILL.md) | | Use when governing a worktree across its whole life — scope-lock declaration, merge-readiness status, scoped verification, and safe cleanup that refuses while unique unmerged commits exist. |
300
301
 
301
- ## Rules (102)
302
+ ## Rules (103)
302
303
 
303
304
  | kind | name | type | description |
304
305
  |---|---|---|---|
@@ -315,6 +316,7 @@ are excluded.
315
316
  | rule | [`brand-source-of-truth`](../dist/agent-src/rules/brand-source-of-truth.md) | auto | Consumer brand tokens + voice profile are the run's source of truth — the corpus fills gaps, never overrides |
316
317
  | rule | [`broken-access-control`](../dist/agent-src/rules/broken-access-control.md) | auto | Endpoint/query returning user or tenant data — authenticated ≠ authorized; enforce a server-derived ownership/tenant/role check + the three negative tests (401/non-owner/cross-tenant) |
317
318
  | rule | [`cli-output-handling`](../dist/agent-src/rules/cli-output-handling.md) | auto | Verbose CLI output (git, tests, linters, docker, npm, composer) — wrap with rtk; tail/grep fallback |
319
+ | rule | [`code-comment-discipline`](../dist/agent-src/rules/code-comment-discipline.md) | auto | Writing/editing code in any language — a comment states a WHY or a constraint the code cannot show; never restate what names/types already say; no signature-mirroring docblocks |
318
320
  | rule | [`command-suggestion-policy`](../dist/agent-src/rules/command-suggestion-policy.md) | auto | Prompt matches an eligible slash command — surface as numbered options with as-is escape; never auto-execute |
319
321
  | rule | [`commit-conventions`](../dist/agent-src/rules/commit-conventions.md) | auto | Git commit format, branch naming, conventional commits, committing, pushing, creating PRs |
320
322
  | rule | [`commit-policy`](../dist/agent-src/rules/commit-policy.md) | always | Commit policy — never commit and never ask about committing unless the user said so this turn, the roadmap authorizes it, or a commit command is invoked |
@@ -405,7 +407,7 @@ are excluded.
405
407
  | rule | [`user-interrupt-priority`](../dist/agent-src/rules/user-interrupt-priority.md) | auto | New user instruction mid-flight — STOP the current task, run the new one in full, ASK before resuming |
406
408
  | rule | [`verify-before-complete`](../dist/agent-src/rules/verify-before-complete.md) | always | Verify before completion — run tests and quality tools before claiming done |
407
409
 
408
- ## Commands (177)
410
+ ## Commands (178)
409
411
 
410
412
  | kind | name | cluster | description |
411
413
  |---|---|---|---|
@@ -484,6 +486,7 @@ are excluded.
484
486
  | command | [`ghostwriter-show`](../dist/agent-src/commands/ghostwriter/show.md) | cluster: ghostwriter | Render a single ghostwriter profile in full — identity, style fingerprint, voice samples, taboos, source URLs. Read-only. |
485
487
  | command | [`ghostwriter-write`](../dist/agent-src/commands/ghostwriter/write.md) | cluster: ghostwriter | Draft a markdown post in the voice of a captured public-figure ghostwriter profile; appends the mandatory non-removable disclosure footer. |
486
488
  | command | [`grill-me`](../dist/agent-src/commands/grill-me.md) | cluster: challenge-me | Alias for /challenge-me — interactive grill-style interview that sharpens a fuzzy plan/idea into a copyable Markdown pitch |
489
+ | command | [`humanize`](../dist/agent-src/commands/humanize.md) | cluster: humanize | Remove AI-writing tells from pasted text or a file — runs the humanizer skill's draft→audit→final loop and prints the rewrite plus a detector summary. |
487
490
  | command | [`image`](../dist/agent-src/commands/image.md) | cluster: image | Character-image fidelity orchestrator — analyse, create, and verify a character image against its canon. Routes to analyse, create, verify. |
488
491
  | command | [`image-analyse`](../dist/agent-src/commands/image/analyse.md) | cluster: image | Analyse a character image down to the smallest mole and diff it against a canon — per-feature spec, OCR tattoo text, severity-ranked drift report. |
489
492
  | command | [`image-create`](../dist/agent-src/commands/image/create.md) | cluster: image | Generate a character image to spec — assemble a max-fidelity, anchors-first prompt from a Canon Spec; governance- and provider-gated, dry-run by default. |
@@ -7,7 +7,7 @@
7
7
 
8
8
  > Every command is classified in `src/flows/surface-map.yaml` (coverage enforced by `scripts/lint_command_flow_coverage.py`). The four user-work flows carry rich definitions in `src/flows/<flow>.yaml`.
9
9
 
10
- **177 commands** across **10 surfaces** (4 user-work flows + 6 platform/domain surfaces).
10
+ **178 commands** across **10 surfaces** (4 user-work flows + 6 platform/domain surfaces).
11
11
 
12
12
  ## User-work flows
13
13
 
@@ -240,6 +240,7 @@ _Ghostwriter + post-as voice pipeline._
240
240
  - `ghostwriter-list` — List captured ghostwriter profiles under agents/reference/ghostwriter/ as a numbered table with confidence,…
241
241
  - `ghostwriter-show` — Render a single ghostwriter profile in full — identity, style fingerprint, voice samples, taboos, source UR…
242
242
  - `ghostwriter-write` — Draft a markdown post in the voice of a captured public-figure ghostwriter profile; appends the mandatory n…
243
+ - `humanize` — Remove AI-writing tells from pasted text or a file — runs the humanizer skill's draft→audit→final loop and…
243
244
  - `post-as` — Consumer-facing write entry points — :me drafts in the maintainer's own voice from .agent-user.md (no discl…
244
245
  - `post-as-ghostwriter` — Thin alias for /ghostwriter:write — drafts a copyable markdown post in a captured public-figure voice with…
245
246
  - `post-as-me` — Draft a copyable markdown post in the maintainer's own voice (style source = .agent-user.md.voice_sample).…
@@ -159,6 +159,15 @@ Implications:
159
159
  user opt into a per-day cap; counter state persists at
160
160
  `~/.event4u/agent-config/cli-calls.json` with daily UTC reset (wired in
161
161
  Phase 1 of the CLI-transport roadmap).
162
+ - **Omitting `model:` for a vendor `cli` member is a PIN, not "latest".**
163
+ Each vendor CLI client (`anthropic` / `openai` / `gemini`) falls back to a
164
+ dedicated `DEFAULT_*_CLI_MODEL` constant when `model` is unset
165
+ (`clients.ts`); `xai` / `perplexity` CLIs are community API wrappers and
166
+ reuse their `DEFAULT_*_MODEL` API constant. The value is a deliberate pin;
167
+ the vendor CLI's own default may be newer. Bump the constant intentionally —
168
+ never assume the omitted default tracks the provider's latest release. The
169
+ CLI constants are separate from the API ones because the two can legitimately
170
+ diverge — `openai` API `gpt-4o` vs CLI `gpt-5` is the proof.
162
171
  - **Quota observability (step-8 D1, D4):** every `council run` /
163
172
  `council debate` prints a one-line `council:quota · <provider>
164
173
  used/limit · …` summary before the first member fires. Only
@@ -366,6 +375,94 @@ _artefact mode: full|redacted (counts only)_
366
375
 
367
376
  Findings are ranked by `consensus_strength` descending. Empty sessions
368
377
  emit the heading plus `*No findings were extracted for this session.*`.
378
+ The trailer additionally carries two aggregate lines — **Evidence spread**
379
+ (high/medium/low counts across findings) and **Provider spread** (distinct
380
+ providers that deliberated) — folded in beside `_artefact mode:_`.
381
+
382
+ ### Stance tally (Phase 1 — option-level verdict)
383
+
384
+ `consensus_scoring` scores *findings*; `stance_tally` produces an
385
+ *option-level* verdict for "A or B?" questions. **Default-off**; with the
386
+ block absent the council path is byte-identical to today.
387
+
388
+ **Configuration.**
389
+
390
+ - `stance_tally.enabled` (bool, default `false`) — master switch. A
391
+ non-bool value is rejected at config load (`CouncilConfigError`); unknown
392
+ values are not silently coerced.
393
+
394
+ **Behaviour when enabled.** The final round appends a mandatory closing-line
395
+ contract — `STANCE: <label> | CONFIDENCE: high|med|low | DEALBREAKER: yes|no`
396
+ — parsed deterministically (`stance_tally.ts`), never inferred from prose.
397
+ Weights are confidence factors (`high 1.0 / med 0.75 / low 0.5`); `W_total`
398
+ sums base weights over every member with a parseable stance (abstentions
399
+ included, so they raise the bar). Consensus requires an option to clear
400
+ `⅔ × W_total`; below threshold a structured **split** is returned to the
401
+ user — never a forced winner, never an auto-added round. The synthesis gains
402
+ a **Vote Tally** section (one line per option, the threshold, and a
403
+ cleared-or-escalated line). The final-round wiring is LIVE (2026-07-12): `consult` appends the contract to
404
+ the final round and `render` emits the Vote Tally block, threaded via
405
+ `payload.stance_tally`. A member whose stance line is missing or unparseable is
406
+ a repair-marker; the bounded stance-line-only repair CALL (policy: `repair_action`
407
+ — confirm-interactive / auto-fire under `--auto-continue`) and its estimate row
408
+ are the remaining dispatch wiring.
409
+
410
+ ### Chairman synthesis (Phase 2 — opt-in)
411
+
412
+ The skill's own Iron Law argues the host, having framed the artefact, cannot
413
+ independently judge it. `chairman` lets a **non-deliberating member** author the
414
+ synthesis instead. **Default `host`** = today's behaviour, byte-identical.
415
+
416
+ **Configuration.**
417
+
418
+ - `chairman.mode` (enum `host` | `member` | `auto`, default `host`) — an unknown
419
+ value is rejected at config load.
420
+ - `chairman.member` (string, required when `mode: member`) — must name a member
421
+ that exists AND is enabled; **fails closed** at load otherwise.
422
+ - `members.<name>.tier` (int ≥ 1, optional) — capability rank used only as the
423
+ `auto` tie-break (higher = stronger); non-integer / < 1 rejected at load.
424
+
425
+ **Selection** (`chairman.ts` `select_chairman`, pure): `host` → host synthesis;
426
+ `member` → the named member, but only if it did **not** deliberate this session
427
+ (a member that argued cannot self-judge — else host fallback with a visible
428
+ annotation); `auto` → **provider-family difference primary, tier tie-break,
429
+ config-order final** — decided by the contested-design council pass
430
+ (claude-sonnet-4-5 + gpt-4o, 2-round debate, 2026-07-12): independence from the
431
+ deliberators' priors is the binding constraint for a judge, so `auto` picks a
432
+ non-deliberating member (provider-different by construction under the
433
+ one-member-per-provider invariant); among candidates the optional
434
+ `members.<name>.tier` wins, else the deterministic config order; no
435
+ non-deliberating member → annotated host fallback. The billable chairman
436
+ dispatch (rendering the synthesis as one member call in `cmd_run`) is the
437
+ remaining wiring step.
438
+
439
+ ### Debate enforcement gates (Phase 3 — opt-in)
440
+
441
+ - `debate_gates.enabled` (bool, default `false`) — when on, round-2+ debate
442
+ prompts carry the **anti-conformity directive** (`prompts.ANTI_CONFORMITY_DIRECTIVE`:
443
+ defend a position; change only on a specific named flaw; agreement without a
444
+ named reason is conformity). Byte-identical across api/cli/manual (it is part of
445
+ the shared `user_prompt`). Default-off keeps the debate path byte-identical.
446
+ - `restate.enabled` (bool, default `false`) — or the `--restate` debate flag:
447
+ a pre-round-1 pass collecting a ≤ 50-word restatement + one alternative
448
+ framing per member (billable, through the same spend gate), rendered above
449
+ the round-1 responses; a restatement with little token overlap vs the stated
450
+ ask is flagged before further spend.
451
+
452
+ The deterministic post-round detectors — dissent-quota (`debate_gates.dissent_quota_met`)
453
+ and the novelty gate (`debate_gates.is_near_duplicate`, reusing the shared
454
+ Jaccard util) — are implemented and tested as pure functions.
455
+
456
+ **Repair-call policy** (`debate_gates.repair_action`) — decided by the
457
+ contested-design council pass (claude-sonnet-4-5 + gpt-4o, 2026-07-12): a cost
458
+ estimate is an upper bound, not a spend commitment, and repairs are failure-mode
459
+ responses — so **interactive runs get a one-line confirm** before each repair
460
+ call; **unattended runs (`--auto-continue`) auto-fire** under the hard cap
461
+ (≤ 1 repair per member per round, absolute — an already-repaired member is
462
+ skipped in every mode); manual-transport members follow the same policy. The repair dispatch is LIVE in `run_debate` (2026-07-12): post-round checks on
463
+ round 2+, ≤ 1 repair per member per round, dispatched via the CLI's
464
+ `_make_repair_confirm` transport (auto-fire under `--auto-continue`, one-line
465
+ confirm interactive); a successful repair replaces the member's round entry.
369
466
 
370
467
  ### Decision resolution by impact (Phase 10, ask-user routing)
371
468
 
@@ -48,6 +48,7 @@ column 1 of this table.
48
48
  | `orchestrate` | — | _(none yet — cluster head only)_ | new — runtime executor for YAML pipelines under `.agent-config/orchestrations/` per the [`orchestration-dsl-v1`](orchestration-dsl-v1.md) contract; chains personas / skills / commands / sub-agents deterministically. Single cluster head; sub-commands deferred until a second verb is needed. |
49
49
  | `sync` | 4 | `agent-settings` · `gitignore` · `gitignore-fix` | new cluster 2026-07-08 — absorbs the former single-sub `sync-gitignore` cluster (slug-neutral nests: `sync-agent-settings`, `sync-gitignore`, `sync-gitignore-fix` keep their slugs; the gitignore node keeps its own `fix` sub-dir, mirroring the `agents/user` deep-nest precedent). Bare `/sync` shows the menu. |
50
50
  | `ghostwriter` | — | `fetch` · `write` · `list` · `show` · `delete` | new cluster 2026-05-15 — third voice primitive for AI-assisted writing in the public voice of a public figure. Hybrid storage: real-person profiles live consumer-side under `agents/reference/ghostwriter/<slug>.md` (gitignored by default); package source ships only `fictional: true` fixtures. Zero network code in the package — `:fetch` delegates web-fetch / web-search to the host agent. Mandatory disclosure footer on every `:write` output (no opt-out). Schema: [`ghostwriter-schema`](ghostwriter-schema.md). |
51
+ | `humanize` | — | _(none yet — cluster head only)_ | new cluster 2026-07-11 (`road-to-humanized-writing` Phase 3) — on-demand AI-tell removal for deliverable prose (pasted text or file path) via the [`humanizer`](../../src/skills/humanizer/SKILL.md) skill's draft→audit→final loop + the `detect_ai_tells.ts` detector; `--voice=<slug\|me>` reuses the write-engine style-source resolution (no second voice mechanism). Counterpart to the engine-internal step 4b in [`write-engine`](write-engine.md). Single cluster head; sub-commands deferred until a second verb is needed. |
51
52
  | `post-as` | — | `me` · `ghostwriter` | new cluster 2026-05-15 — consumer-facing write entry points. `:me` reads `.agent-user.md.voice_sample` and drafts in the maintainer's own voice (no disclosure footer — the user is the author); `:ghostwriter` is a thin alias for `/ghostwriter:write` with the mandatory disclosure footer. Both share the procedural [`write-engine`](write-engine.md) contract — style source and footer are the only axes of variation. |
52
53
  | `video` | — | `from-script` · `from-song` · `scene` · `storyboard` · `stitch` | new cluster 2026-05-17 — AI video generation pipeline. Cluster head orchestrates the full flow; `:scene` runs a single scene end-to-end (script → blueprint → still → motion → clip); `:storyboard` expands a script into per-scene blueprints + reference stills with character-lock JSON; `:from-script` walks a multi-scene script through storyboard + per-scene generation; `:from-song` builds a music-video from a song + reference images — derived/briefed timed script (via the `song-to-script` skill + `probe-audio.sh` hybrid segmentation), optional character-lock, then stitch with the song muxed as the master track and a mandatory AI-generation disclosure; `:stitch` concatenates scene clips with `ffmpeg` against a scene manifest. Provider-agnostic via the adapter contract under `scripts/media/lib/adapter-contract.md`; cost-gated with mandatory `AIV_DRYRUN=true` default and explicit confirmation before live provider calls. |
53
54
  | `knowledge` | — | `ingest` · `list` · `forget` · `cross-repo` | local-knowledge namespace (employee-product Phase 7); `:cross-repo` added 2026-05-30 (`road-to-leaner-core-and-discovery` Phase 4) — read-only targeted retrieval over opted-in `linked_projects` siblings (ADR-032 Option A), per [`cross-repo-retrieval`](cross-repo-retrieval.md). The pre-existing `ingest`/`list`/`forget` sub-commands are recorded in the registry here for the first time. |
@@ -94,6 +94,7 @@ candidate; the human, seeing the evidence, makes the call.
94
94
 
95
95
  ## See also
96
96
 
97
+ - [`ADR-118`](../decisions/ADR-118-loop-engineering-boundaries.md) — engagement counts stay ONE input; the pruning decision is never automated (disposition #2).
97
98
  - [`local-analytics.md`](local-analytics.md) — the measurement events + privacy floor.
98
99
  - [`capability-packs.md`](capability-packs.md) — sibling per-pack budget governance.
99
100
  - [`ADR-041`](../decisions/ADR-041-controlled-command-verbs.md) — sibling command-surface governance.
@@ -192,6 +192,31 @@ Phase 7.4 ships a regression test that spawns two concurrent
192
192
  dispatcher invocations against the same event and asserts no torn
193
193
  writes (file ends with valid JSON, last-writer-wins).
194
194
 
195
+ ## Hook-resilience shim — every registered command degrades silently
196
+
197
+ Every hook command the installer registers (Claude managed block + plugin
198
+ `hooks/hooks.json`, Cursor, Windsurf, Gemini, the Augment trampoline) follows
199
+ one shape (road-to-opt-subagent-harvest P1.4):
200
+
201
+ 1. **Resolve the dispatcher** — project-local binary first, PATH fallback
202
+ where the platform supports it (Claude: `$CLAUDE_PROJECT_DIR/agent-config`
203
+ → `agent-config`).
204
+ 2. **Missing dispatcher → silent `exit 0`.** A hook must never error-spam or
205
+ block the agent loop on a repo where the suite is not (yet) installed.
206
+ This is the honest degrade even for `fail_closed` concerns: an absent
207
+ dispatcher cannot evaluate anything, so there is nothing to fail closed
208
+ ON — the deny power exists only where the suite exists.
209
+ 3. **Present dispatcher → exit code PROPAGATES.** No `|| true` around the
210
+ dispatch call itself: a `fail_closed: true` concern (e.g.
211
+ `block-no-verify`) keeps its deny. Fail-open of crashed concerns is
212
+ handled INSIDE `dispatch_hook.ts` per the manifest's `fail_closed` flag,
213
+ never by the outer shim.
214
+
215
+ The Augment trampoline (`src/scripts/hooks/augment-dispatcher.sh`) is the
216
+ reference implementation of the same contract in shell form (`set -u`,
217
+ silent bails, unconditional `exit 0` — Augment concerns are all
218
+ observe-only, so blanket exit 0 is correct there).
219
+
195
220
  ## Copilot fallback pattern
196
221
 
197
222
  Copilot has no hook surface. Concerns whose source rule cites
@@ -302,3 +302,38 @@ with the trigger-relaxed parameter, lock new value, re-attempt.
302
302
  | 2026-05-06 | `agents/runtime/council/sessions/20260506T044941Z-phase1-cross-check-r2.json` | Council R2 (3500 tokens) — locks median r, splits criterion #3, adds criterion #5, raises per-rule cap to 2.5k, defines abort criteria | <!-- council-ref-allowed: contract decision trace -->
303
303
  | 2026-05-06 | this file | kernel set locked: 9 rules, projected 23 071 chars (median r = 0.712) |
304
304
  | 2026-05-06 | P2.2 condensation + `scripts/iron_law_sha.py --all-kernel` | empirical: 25 590 chars (r_actual = 0.795 across kernel; longer rules condense less than the pilot median) — see `docs/decisions/ADR-002-kernel-bucket-overrides.md` (KERNEL_HARD raised 25k → 26k, 6 per-rule overrides ≤ 4k ceiling, all Iron-Law SHAs preserved) |
305
+
306
+ ## § 10 — Changing a protected invariant
307
+
308
+ The semantic-invariants gate (`src/scripts/check_rule_invariants.ts` over
309
+ `tests/golden/invariants.json`, 19 protected strings across the 9 kernel
310
+ rules) enforces string presence in BOTH `src/rules/` and the
311
+ `dist/agent-src/rules/` projection. String matching is deliberately the
312
+ current enforcement: it is zero-cost and trips on casual edits. Its known
313
+ brittleness — a semantically equivalent rewording breaks the gate — is
314
+ handled by process, not by weakening the gate.
315
+
316
+ **Rewording a protected string is allowed, but never "update the gate
317
+ green".** A PR that changes an entry in `tests/golden/invariants.json`
318
+ MUST:
319
+
320
+ 1. Name WHICH invariant changes and WHY the wording changes (PR body).
321
+ 2. State old/new side-by-side with an explicit assertion-equivalence
322
+ sentence ("the new wording still guarantees X").
323
+ 3. Re-run and quote `check_rule_invariants.ts --mutation-selftest` in the
324
+ PR (the selftest guards the checker against silently-green
325
+ normalisation bugs after the edit).
326
+ 4. Cite the behavioral eval covering the invariant where one exists; where
327
+ none exists, say so explicitly — an uncovered invariant rewording gets
328
+ extra review scrutiny, not less.
329
+
330
+ Kernel-edit slow-rollout rules (own PR, ≥ 24 h soak between kernel merges,
331
+ per `scope-control § kernel-rule-edits`) apply on top — the invariants file
332
+ is part of the kernel surface.
333
+
334
+ **ID migration is gated, not planned.** Migrating string fragments to
335
+ frontmatter invariant IDs happens only after behavioral evals cover ≥ 10
336
+ of the 19 invariants. Until then, IDs would claim guarantees nothing
337
+ verifies — an ID whose text drifted validates nothing, and that failure is
338
+ silent, unlike a string miss (council convergence, anthropic/
339
+ claude-sonnet-4-5 + openai/gpt-4o, 2026-07-10).
@@ -96,6 +96,7 @@ P2 roadmap reads — not the live `internal/bench/reports/` directory.
96
96
 
97
97
  ## Cross-references
98
98
 
99
+ - [`ADR-118`](../decisions/ADR-118-loop-engineering-boundaries.md) · bench-drift stays advisory by decision — never a blocking gate (disposition #4)
99
100
  - [`benchmark-report-schema.md`](benchmark-report-schema.md) · per-report JSON schema
100
101
  - [`benchmark-corpus-spec.md`](benchmark-corpus-spec.md) · corpus YAML schema
101
102
  - [`condensation-default-kill-criterion.md`](condensation-default-kill-criterion.md) · decision table read by step-4 closeout
@@ -144,6 +144,55 @@ major version bump in the package release notes. Size-cap tightening
144
144
  is breaking when it forces existing personas to lose content; size-cap
145
145
  loosening is non-breaking.
146
146
 
147
+ ## § 8 — Governance discipline (the four checks)
148
+
149
+ _Origin: migrated from `src/rules/persona-governance.md` per the P4 pattern of `road-to-kernel-and-router.md`. The rule keeps the Iron Law and the check names; the detail lives here._
150
+
151
+ Personas are review lenses, not free real estate. Every specialist persona has a maintenance cost: it must stay aligned with this schema, the cited skills must still want it, and the per-domain reasoning surface must not bloat to the point that no single persona is load-bearing.
152
+
153
+ ### 8.1 Per-domain cap — ≤ 2 specialised personas per content domain
154
+
155
+ A **content domain** is a self-contained creative or technical surface that one or two specialist personas can fully cover. Current domains:
156
+
157
+ | Domain | Specialists allowed | Examples |
158
+ |---|---|---|
159
+ | ai-video / ai-image / ai-audio | ≤ 2 | one director-shaped lens + one technical-tuning lens |
160
+ | backend engineering | ≤ 2 | architect + ORM-tamer |
161
+ | frontend engineering | ≤ 2 | component / lifecycle + design / a11y |
162
+ | security | ≤ 2 | abuse-case + secrets-and-trust |
163
+ | gtm / growth | ≤ 2 | CMO + RevOps |
164
+ | money / strategy | ≤ 2 | finance-partner + strategist |
165
+ | people / org | ≤ 2 | engineering-manager + people-strategist |
166
+ | customer / discovery | ≤ 2 | discovery-lead + customer-success-lead |
167
+
168
+ **Core personas** (`developer`, `senior-engineer`, `product-owner`, `stakeholder`, `critical-challenger`, `ai-agent`) are exempt — they are always-loaded cross-cutting lenses, not domain specialists.
169
+
170
+ A new specialist into a full domain MUST come with a deprecation candidate from the same domain. The agent surfaces both, then runs an ai-council debate (per [`ai-council`](../../src/skills/ai-council/SKILL.md)) before any rename / merge / delete.
171
+
172
+ ### 8.2 Skill citation floor — ≥ 1 cite before merge
173
+
174
+ A specialist persona without a `personas: [<id>]` citation in at least one skill's frontmatter is dead weight. The PR adding the persona MUST also add the citation, OR the PR is rejected. Citation map lives in [`docs/personas.md § Skill citations`](../personas.md#skill-citations).
175
+
176
+ ### 8.3 Deprecation path — delete immediately, record in commit
177
+
178
+ A persona being removed is **deleted in the same commit** that lands its replacement. The commit message names the successor (or "merged into X") and cites the council decision (or maintainer rationale) that authorised it. No soak window — internal personas have no external consumers; a persona file kept around as a tombstone is dead weight the linter still loads. No silent deletes either: the audit trail is the commit, not a docs table.
179
+
180
+ ### 8.4 Schema conformance — the skill linter is the gate
181
+
182
+ Every persona file is linted against this contract (§ 1–§ 5) by the skill linter: frontmatter shape, tier enum, wing enum, required sections per tier, line budget per tier (with wing override), `Unique Questions` ≥ 3, filename / id match, description ≤ 160 chars. The agent runs `./scripts-run src/scripts/skill_linter` before any persona PR is marked ready.
183
+
184
+ ### Failure modes — what counts as a violation
185
+
186
+ - Adding a third specialist to a full domain without naming the deprecation candidate.
187
+ - Landing a specialist with no `personas: [<id>]` cite in any skill.
188
+ - Renaming or deleting a persona file without naming the successor (or sunset reason) in the commit message.
189
+ - Editing core-tier personas in-place with breaking changes (rename, section removal) without bumping to a new id.
190
+ - Skipping the skill linter (`./scripts-run src/scripts/skill_linter`) on a persona PR.
191
+
192
+ ### Governance day-one state
193
+
194
+ Resolved 2026-05-17 via two-round ai-council debate (members: anthropic/claude-sonnet-4-5, openai/gpt-4o — converged on delete-and-fold): `pixar-storyboard-artist` deleted; its acting / beat-decomposition lens folded into the [`pixar-storyteller`](../../src/skills/pixar-storyteller/SKILL.md) skill body. Active per-domain count for `ai-video` is now 2 (`ai-video-technical-director`, `hollywood-director`), within cap. Total active personas in the root cluster: 24 (plus 5 advisors in `personas/advisors/`). Full inventory + ownership in [`docs/personas.md`](../personas.md).
195
+
147
196
  ## See also
148
197
 
149
198
  - [`skill-domains`](skill-domains.md) — sister taxonomy for skills
@@ -68,19 +68,44 @@ When the agent picks a provider for a `/video:*` / `/image:*` /
68
68
  1. **Read** the `provider_lifecycle` tag from the adapter's header
69
69
  comment **and** the matching `<provider id="…">` block in
70
70
  `agents/templates/.ai-video.xml.example` (or the operator's
71
- `agents/.ai-video.xml`).
71
+ `agents/.ai-video.xml`). This applies to every resolution path —
72
+ `--provider <id>`, `<default-video-provider>` /
73
+ `<default-image-provider>`, or a skill's default. A **mismatch
74
+ between the two sources is a contract violation** and MUST be
75
+ surfaced before running.
72
76
  2. **Refuse-and-surface** if the operator's resolved default is a
73
77
  non-`stable` tier — name the tier and the path to this contract
74
78
  document, then emit one clarifying question (per
75
79
  [`ask-when-uncertain`](../../.augment/rules/ask-when-uncertain.md)):
76
80
  either pick a `stable` provider, or confirm the non-stable run.
81
+ No silent default. No "I'll just try it".
77
82
  3. **Record** in the run summary which tier the chosen adapter
78
- carries — this is the audit log entry the agent-in-the-loop
79
- model rests on.
83
+ carries — the summary line after every `/video:*` / `/image:*` /
84
+ `/audio:*` run names the chosen provider AND its tier. This is the
85
+ audit log entry the agent-in-the-loop model rests on.
86
+ 4. **Never auto-promote.** Promotion is the maintainer's call. The
87
+ agent MAY draft a promotion checklist (per
88
+ [§ 2 — Promotion path](#-2--promotion-path)) for maintainer
89
+ review, but the tier-flip commit is human-authored.
80
90
 
81
91
  The agent never picks `deprecated` silently. If a successor is
82
92
  declared, the agent surfaces "X is deprecated; successor: Y" before
83
- running.
93
+ running — even with confirmation.
94
+
95
+ ### § 4a — Failure modes (agent-side violations)
96
+
97
+ _Origin: migrated from `src/rules/provider-lifecycle-discipline.md` per the P4 pattern of `road-to-kernel-and-router.md`. The rule keeps the Iron Law and the read-tier / refuse-and-surface one-liners; the detail lives here._
98
+
99
+ - Running `/video:scene` against the `<default-video-provider>` without reading the lifecycle tag first → violation.
100
+ - Picking a `community` provider because it was named in the prompt, without surfacing the tier → violation.
101
+ - 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).
102
+ - 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/`.
103
+
104
+ ### § 4b — Why agent-in-the-loop, not a Python gate
105
+
106
+ 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.
107
+
108
+ 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.
84
109
 
85
110
  ## § 5 — Day-one assignment
86
111
 
@@ -21,6 +21,28 @@ Scope discipline, not a ratio: what qualifies is a judgment call the
21
21
  maintainer makes when labeling the release PR
22
22
  ([`release-pr-gating.md`](release-pr-gating.md)).
23
23
 
24
+ ### Primary goal declaration
25
+
26
+ Every release PR body carries one literal line:
27
+
28
+ ```
29
+ Primary-Goal: <one sentence>
30
+ ```
31
+
32
+ A release bundling multiple major themes anyway annotates the
33
+ **exception + reason** in the release notes ("this release bundles N
34
+ themes because <reason>; future releases return to one primary goal").
35
+ The declaration keeps the norm visible and the exception deliberate.
36
+
37
+ Explicitly REJECTED (council, anthropic/claude-sonnet-4-5 +
38
+ openai/gpt-4o, 2026-07-10): a mechanical subsystem-count lint on the
39
+ release PR. A file→subsystem map is its own maintenance burden, and
40
+ changed-file counts are a bad proxy for scope (a one-line kernel change
41
+ has a larger blast radius than 50 lines in a niche skill). Sizing stays
42
+ a norm enforced by declaration + human judgment; if the maintainer
43
+ wrote a nine-theme release, the maintainer already judged it — the
44
+ header makes that judgment explicit, not automatic.
45
+
24
46
  ## Major subsystems are independently disableable where feasible
25
47
 
26
48
  A major subsystem shipped or substantially reworked in a release is
@@ -65,7 +65,8 @@ One question per turn, in this order:
65
65
  Modifiers may be supplied via flags (`--tone=casual --length=200
66
66
  --channel=linkedin-post --audience="early-stage founders"`) to skip
67
67
  the interactive interview. `--as=<slug>` selects the ghostwriter
68
- non-interactively for `/ghostwriter:write` and the alias.
68
+ non-interactively for `/ghostwriter:write` and the alias. `--raw`
69
+ skips the step-4b humanize audit for this run (see § 4b).
69
70
 
70
71
  #### Per-channel defaults
71
72
 
@@ -102,6 +103,42 @@ Emit the body as a single fenced markdown block. The body MUST:
102
103
  - Respect `style.fingerprint.hashtag_rules` and `emoji_rules`.
103
104
  - Stay within ±15% of the requested length.
104
105
 
106
+ ### 4b. Humanize audit (default-on, `--raw` opts out)
107
+
108
+ After drafting and before the footer, run the AI-tell audit from the
109
+ [`humanizer`](../../src/skills/humanizer/SKILL.md) skill against the
110
+ draft body:
111
+
112
+ 1. Ask: "What makes this draft read AI-generated?" — audit against the
113
+ pattern catalog (`src/skills/humanizer/data/patterns.md`), counting
114
+ clusters, never isolated hits.
115
+ 2. Revise the draft to clear the audit findings while preserving the
116
+ step-4 fingerprint constraints and full coverage.
117
+ 3. Where a runtime is available, verify the final body with
118
+ `npx tsx src/scripts/detect_ai_tells.ts --stdin --fail` under the
119
+ thresholds from the consumer's `humanizer:` block in
120
+ `.agent-project-settings.yml` (defaults: hard 0, cluster score 3 per
121
+ 500 words, dash density 2 per 500 words). No runtime → the prose
122
+ audit in (1) is the pass; do not skip it.
123
+
124
+ Precedence and scope rules (binding, not judgment calls):
125
+
126
+ - **Fingerprint wins.** When the profile's captured voice legitimately
127
+ uses a watched pattern (a figure who genuinely writes in em dashes,
128
+ `emoji_rules: allowed`, hashtag rules), the step-4 fingerprint
129
+ constraint is authoritative and the corresponding tell is suppressed
130
+ for that run.
131
+ - **The disclosure footer (§ 5) is exempt.** It is a literal template
132
+ string appended after this step — the audit never inspects, rewords,
133
+ or removes it.
134
+ - **Technical/reference output is excluded.** When the requested
135
+ artifact is reference or technical documentation, skip step 4b and
136
+ say so — neutral, plain prose is the correct register there.
137
+ - **`--raw` opts out per run.** The flag skips step 4b entirely (for
138
+ deliberate neutral-register output); it never touches the footer
139
+ rules. Default is on for every engine consumer
140
+ (`humanizer.write_engine: on`).
141
+
105
142
  ### 5. Append the disclosure footer (ghostwriter only)
106
143
 
107
144
  For ghostwriter consumers, append on its own line, separated by a
@@ -406,6 +406,18 @@ agents/
406
406
  Full classification (git policy, retention, owner) for every allowed entry:
407
407
  [`docs/contracts/agents-layout.md`](contracts/agents-layout.md).
408
408
 
409
+ #### Environment bootstrap (optional)
410
+
411
+ If standing up your project takes more than a package install — starting
412
+ services, seeding fixtures, generating config — declare a single **`env-bootstrap`**
413
+ entry in your runner file (a `Taskfile.yml` / `Makefile` target or a
414
+ `package.json` script named `env-bootstrap`). When present, the agent surfaces
415
+ it as the suggested first action at worktree/session stand-up (see the
416
+ `using-git-worktrees` skill § 5) — **suggest-only, never auto-run**. This gives
417
+ long-running work one deterministic stand-up entry instead of re-deriving it
418
+ each session. Purely optional: with no entry, dependency install + a green
419
+ baseline is the whole stand-up.
420
+
409
421
  #### User inbox workflow (`agents/tmp/` → `agents/tmp.old/`)
410
422
 
411
423
  Drop a note or draft into `agents/tmp/` and point a command at it
@@ -1,3 +1,14 @@
1
+ ---
2
+ adr: 002
3
+ status: accepted
4
+ date: 2026-05-06
5
+ decision: kernel-bucket-overrides
6
+ supersedes: —
7
+ superseded_by: —
8
+ phase: road-to-kernel-and-router · P2.2
9
+ type: structural
10
+ ---
11
+
1
12
  # ADR-002 — Kernel-Bucket Cap Raise (25k → 26k) and Per-Rule Iron-Law Overrides
2
13
 
3
14
  - **Status:** Accepted (2026-05-06)
@@ -1,3 +1,14 @@
1
+ ---
2
+ adr: 003
3
+ status: accepted
4
+ date: 2026-05-07
5
+ decision: flat-cluster-subs-and-colon-syntax
6
+ supersedes: —
7
+ superseded_by: —
8
+ phase: command-cluster contract (Phase 2 follow-up)
9
+ type: structural
10
+ ---
11
+
1
12
  # ADR-003 — Flat Cluster Sub-Commands and Colon-Canonical Invocation
2
13
 
3
14
  - **Status:** Accepted (2026-05-07)
@@ -5,7 +5,7 @@ date: 2026-05-09
5
5
  decision: skill-tools-python-pilot-pass
6
6
  supersedes: —
7
7
  superseded_by: —
8
- phase: road-to-better-skills-and-profiles · Block D (D1–D5)
8
+ phase: road-to-better-skills-and-profiles · Block D (D1–D5) — historical: Python pilot; zero .py remains post-ADR-200
9
9
  ---
10
10
 
11
11
  # ADR-006 — Skill-Tools Python Pilot: Outcome and Decision
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  adr: 028
3
- status: accepted
3
+ status: superseded
4
4
  date: 2026-05-25
5
5
  decision: root-layout
6
6
  supersedes: —
@@ -1,3 +1,13 @@
1
+ ---
2
+ adr: 038
3
+ status: accepted
4
+ date: 2026-06-01
5
+ decision: canonical-settings-path
6
+ supersedes: —
7
+ superseded_by: —
8
+ type: structural
9
+ ---
10
+
1
11
  # ADR-038: Canonical settings path is `agents/settings/.agent-settings.yml`
2
12
 
3
13
  - **Status:** Accepted