@event4u/agent-config 2.11.0 → 2.13.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 (75) hide show
  1. package/.agent-src/commands/council/analysis.md +142 -0
  2. package/.agent-src/commands/council/debate.md +129 -0
  3. package/.agent-src/commands/council/default.md +8 -0
  4. package/.agent-src/commands/council/design.md +16 -12
  5. package/.agent-src/commands/council/optimize.md +16 -15
  6. package/.agent-src/commands/council/pr.md +12 -12
  7. package/.agent-src/commands/council.md +48 -2
  8. package/.agent-src/personas/advisors/contrarian.md +95 -0
  9. package/.agent-src/personas/advisors/executor.md +99 -0
  10. package/.agent-src/personas/advisors/expansionist.md +98 -0
  11. package/.agent-src/personas/advisors/first-principles.md +98 -0
  12. package/.agent-src/personas/advisors/outsider.md +102 -0
  13. package/.agent-src/rules/copilot-routing.md +19 -0
  14. package/.agent-src/rules/devcontainer-routing.md +20 -0
  15. package/.agent-src/rules/laravel-routing.md +20 -0
  16. package/.agent-src/rules/symfony-routing.md +20 -0
  17. package/.agent-src/skills/ai-council/SKILL.md +180 -2
  18. package/.agent-src/skills/canvas-design/SKILL.md +132 -0
  19. package/.agent-src/skills/canvas-design/evals/triggers.json +16 -0
  20. package/.agent-src/skills/copilot-config/SKILL.md +1 -1
  21. package/.agent-src/skills/devcontainer/SKILL.md +1 -1
  22. package/.agent-src/skills/doc-coauthoring/SKILL.md +129 -0
  23. package/.agent-src/skills/doc-coauthoring/evals/triggers.json +16 -0
  24. package/.agent-src/skills/laravel/SKILL.md +1 -1
  25. package/.agent-src/skills/project-analysis-core/SKILL.md +1 -1
  26. package/.agent-src/skills/project-analyzer/SKILL.md +1 -1
  27. package/.agent-src/skills/skill-writing/SKILL.md +101 -16
  28. package/.agent-src/skills/sql-writing/SKILL.md +1 -1
  29. package/.agent-src/skills/symfony-workflow/SKILL.md +1 -1
  30. package/.agent-src/skills/universal-project-analysis/SKILL.md +1 -1
  31. package/.agent-src/templates/agents/agent-project-settings.example.yml +1 -1
  32. package/.claude-plugin/marketplace.json +5 -1
  33. package/AGENTS.md +1 -1
  34. package/CHANGELOG.md +78 -0
  35. package/CONTRIBUTING.md +5 -0
  36. package/README.md +3 -3
  37. package/config/agent-settings.template.yml +5 -84
  38. package/docs/architecture/multi-tool-projection.md +53 -0
  39. package/docs/architecture/{compression.md → source-projection.md} +21 -3
  40. package/docs/architecture.md +6 -6
  41. package/docs/catalog.md +21 -11
  42. package/docs/contracts/adr-architectural-consensus-mechanism.md +67 -0
  43. package/docs/contracts/adr-level-6-productization.md +2 -2
  44. package/docs/contracts/ai-council-config.md +186 -0
  45. package/docs/contracts/command-clusters.md +57 -1
  46. package/docs/contracts/multi-tool-projection-fidelity.md +109 -0
  47. package/docs/getting-started.md +2 -2
  48. package/package.json +1 -1
  49. package/scripts/_archive/README.md +59 -0
  50. package/scripts/ai_council/_default_prices.py +10 -1
  51. package/scripts/ai_council/advisors.py +148 -0
  52. package/scripts/ai_council/clients.py +189 -4
  53. package/scripts/ai_council/config.py +368 -0
  54. package/scripts/ai_council/consensus.py +290 -0
  55. package/scripts/ai_council/orchestrator.py +634 -16
  56. package/scripts/ai_council/prompts.py +335 -0
  57. package/scripts/check_compressed_paths.py +6 -1
  58. package/scripts/check_references.py +25 -0
  59. package/scripts/ci_time_ratio.py +168 -0
  60. package/scripts/council_cli.py +1007 -32
  61. package/scripts/measure_projection_bytes.py +159 -0
  62. package/scripts/measure_roadmap_trajectory.py +112 -0
  63. package/scripts/probe_projection_fidelity.py +202 -0
  64. package/scripts/run_skill_evals.py +185 -0
  65. package/scripts/schemas/skill.schema.json +4 -0
  66. package/scripts/score_skill_selection.py +198 -0
  67. package/scripts/skill_collision_clusters.py +162 -0
  68. package/scripts/skill_linter.py +71 -1
  69. /package/scripts/{_backfill_skill_domains.py → _archive/_backfill_skill_domains.py} +0 -0
  70. /package/scripts/{_bootstrap_tier_frontmatter.py → _archive/_bootstrap_tier_frontmatter.py} +0 -0
  71. /package/scripts/{_p43_bodies.py → _archive/_p43_bodies.py} +0 -0
  72. /package/scripts/{_p43_compress.py → _archive/_p43_compress.py} +0 -0
  73. /package/scripts/{_p4_migrate.py → _archive/_p4_migrate.py} +0 -0
  74. /package/scripts/{_phase2_shim_helper.py → _archive/_phase2_shim_helper.py} +0 -0
  75. /package/scripts/{_pilot_council_question.py → _archive/_pilot_council_question.py} +0 -0
package/docs/catalog.md CHANGED
@@ -1,13 +1,13 @@
1
1
  # agent-config — Public Catalog
2
2
 
3
- Consumer-facing catalog of all **442 public artefacts** shipped by
3
+ Consumer-facing catalog of all **452 public artefacts** shipped by
4
4
  this package. Internal package-maintenance rules and deprecation shims
5
5
  are excluded.
6
6
 
7
7
  > **Regenerate:** `python3 scripts/generate_index.py`
8
8
  > Auto-generated — do not edit manually.
9
9
 
10
- ## Skills (206)
10
+ ## Skills (210)
11
11
 
12
12
  | kind | name | extra | description |
13
13
  |---|---|---|---|
@@ -32,6 +32,7 @@ are excluded.
32
32
  | skill | [`blast-radius-analyzer`](../.agent-src/skills/blast-radius-analyzer/SKILL.md) | | Use BEFORE editing shared code — enumerates every call site, event consumer, queue worker, API client, migration, and test that a planned change will touch, with a file:line citation per dependency. |
33
33
  | skill | [`bug-analyzer`](../.agent-src/skills/bug-analyzer/SKILL.md) | | Use when the user shares a Sentry error, Jira bug ticket, or error description and wants root cause analysis. Also for proactive bug hunting and code audits for hidden bugs. |
34
34
  | skill | [`build-buy-partner`](../.agent-src/skills/build-buy-partner/SKILL.md) | | Use when deciding insource vs outsource vs acquire — integration-cost analysis, dependency-risk, optionality preservation. Triggers on 'should we build', 'buy vs partner'. |
35
+ | skill | [`canvas-design`](../.agent-src/skills/canvas-design/SKILL.md) | | Use when creating static visual art — posters, marketing visuals, brand assets, PDF/PNG design pieces — even if the user just says 'design a poster' or 'mach uns ein Visual'. |
35
36
  | skill | [`check-refs`](../.agent-src/skills/check-refs/SKILL.md) | | Use when verifying cross-references between skills, rules, commands, guidelines, and context documents are not broken after edits, renames, or deletions. |
36
37
  | skill | [`churn-prevention`](../.agent-src/skills/churn-prevention/SKILL.md) | | Use when designing churn defence — health-score signals, churn-cause split (involuntary / value / relationship / fit), early-warning loop. Triggers on 'why are accounts leaving'. |
37
38
  | skill | [`code-refactoring`](../.agent-src/skills/code-refactoring/SKILL.md) | | Use when the user says "refactor this", "rename class", or "move method". Safely refactors PHP code — finds all callers, updates downstream dependencies, and verifies with quality tools. |
@@ -48,7 +49,7 @@ are excluded.
48
49
  | skill | [`contracts-cognition`](../.agent-src/skills/contracts-cognition/SKILL.md) | | Use when reading a contract for risk and constraint — clause shape, redline priority, what the contract actually binds. Triggers on 'review this contract', 'what does this MSA constrain'. |
49
50
  | skill | [`conventional-commits-writing`](../.agent-src/skills/conventional-commits-writing/SKILL.md) | | Use when writing commit messages or squash-merge titles — `feat:`, `fix:`, `chore:`, scopes, breaking changes — even when the user just says 'commit this' without naming Conventional Commits. |
50
51
  | skill | [`copilot-agents-optimization`](../.agent-src/skills/copilot-agents-optimization/SKILL.md) | | Use when optimizing AGENTS.md or copilot-instructions.md — deduplicates against .augment/ content, enforces line budgets, and focuses each file on its audience. |
51
- | skill | [`copilot-config`](../.agent-src/skills/copilot-config/SKILL.md) | | Use when configuring GitHub Copilot — copilot-instructions.md, PR review patterns, output optimization even when the user just says 'tune Copilot' or 'why is Copilot commenting on X'. |
52
+ | skill | [`copilot-config`](../.agent-src/skills/copilot-config/SKILL.md) | | Tune the GitHub Copilot AI `copilot-instructions.md`, PR-review patterns, suggestion behavior, output verbosity. NOT for dev-environment setup (use `devcontainer`). |
52
53
  | skill | [`customer-research`](../.agent-src/skills/customer-research/SKILL.md) | | Use when shaping a discovery slice — JTBD-framed interview guide, switch-event focus, verbatim quotes not summaries. Triggers on 'talk to users', 'why did they cancel', 'before we build X'. |
53
54
  | skill | [`dashboard-design`](../.agent-src/skills/dashboard-design/SKILL.md) | | Use when designing monitoring dashboards — visualization selection, layout principles, observability strategies (RED/USE/Golden Signals), and data storytelling. |
54
55
  | skill | [`data-flow-mapper`](../.agent-src/skills/data-flow-mapper/SKILL.md) | | Use BEFORE editing code that touches user data — traces the value from entry → validation → transformation → storage → egress, every hop cited with file:line. |
@@ -62,9 +63,10 @@ are excluded.
62
63
  | skill | [`dependency-upgrade`](../.agent-src/skills/dependency-upgrade/SKILL.md) | | Use when upgrading dependencies — "update Laravel", "bump PHP version", or "upgrade packages". Covers changelog review, breaking change detection, and verification. |
63
64
  | skill | [`description-assist`](../.agent-src/skills/description-assist/SKILL.md) | | Use when polishing a skill/rule/command/guideline frontmatter description — pushier phrasing, trigger coverage, undertrigger audit — even if the user just says 'make this pushier'. |
64
65
  | skill | [`design-review`](../.agent-src/skills/design-review/SKILL.md) | | Use when the user says "review the design", "check the UI", or wants a comprehensive UI/UX review. Uses a 7-phase methodology covering interaction, responsiveness, accessibility, and more. |
65
- | skill | [`devcontainer`](../.agent-src/skills/devcontainer/SKILL.md) | | Use when configuring DevContainers or GitHub Codespaces — devcontainer.json, custom images, secrets, VS Code features even when the user just says 'why does my Codespace not start'. |
66
+ | skill | [`devcontainer`](../.agent-src/skills/devcontainer/SKILL.md) | | Wire up DevContainers / GitHub Codespaces — `devcontainer.json`, container images, secrets, VS Code features, port forwarding. NOT for tuning Copilot itself (use `copilot-config`). |
66
67
  | skill | [`developer-like-execution`](../.agent-src/skills/developer-like-execution/SKILL.md) | | Use when implementing, debugging, refactoring, or reviewing code — enforces the think → analyze → verify → execute workflow — even when the user just says 'implement X' without naming it. |
67
68
  | skill | [`discovery-interview`](../.agent-src/skills/discovery-interview/SKILL.md) | | Use when running discovery interviews — question-bank build, bias audit, insight extraction. Triggers on 'audit my guide', 'extract insights from transcript', 'is my hypothesis falsifiable'. |
69
+ | skill | [`doc-coauthoring`](../.agent-src/skills/doc-coauthoring/SKILL.md) | | Use when co-authoring a PRD, design doc, RFC, decision doc, or technical spec — 3-stage flow (context → section-by-section → reader-test) — even if the user just says 'help me write this spec'. |
68
70
  | skill | [`docker`](../.agent-src/skills/docker/SKILL.md) | | Use when working with Docker — Dockerfile edits, docker-compose services, containers, or the dual-container (fast + Xdebug) setup — even when the user just says 'my container won't start'. |
69
71
  | skill | [`dto-creator`](../.agent-src/skills/dto-creator/SKILL.md) | | Use when the user says "create a DTO", "new data transfer object", or needs to convert request/response data into a typed PHP class. Creates DTOs with SimpleDto base class and attribute mapping. |
70
72
  | skill | [`editorial-calendar`](../.agent-src/skills/editorial-calendar/SKILL.md) | | Use when shaping cadence — evergreen / campaign / reactive split, beat-mapping across channel stages, content-debt management. Triggers on 'plan our content cadence', 'what should we publish'. |
@@ -96,7 +98,7 @@ are excluded.
96
98
  | skill | [`judge-code-quality`](../.agent-src/skills/judge-code-quality/SKILL.md) | | Use when a diff needs a readability review — naming, single-responsibility, DRY, dead code, mismatch with codebase conventions — dispatched by /review-changes, /do-and-judge, /judge. |
97
99
  | skill | [`judge-security-auditor`](../.agent-src/skills/judge-security-auditor/SKILL.md) | | Use when a diff may introduce security risk — authZ, injection, secrets, unsafe deserialization, SSRF, XSS, mass assignment — dispatched by /review-changes, /do-and-judge, /judge. |
98
100
  | skill | [`judge-test-coverage`](../.agent-src/skills/judge-test-coverage/SKILL.md) | | Use when a diff may lack tests — missing assertions, uncovered branches, over-mocking, no regression test for a bug fix — dispatched by /review-changes, /do-and-judge, /judge, even without 'tests'. |
99
- | skill | [`laravel`](../.agent-src/skills/laravel/SKILL.md) | | Writes Laravel code following framework conventions, project architecture, and modern best practices for controllers, requests, services, jobs, events, policies, and application structure. |
101
+ | skill | [`laravel`](../.agent-src/skills/laravel/SKILL.md) | | Writes Laravel PHP Eloquent, Artisan controllers, FormRequests, jobs, events, policies, providers. For Symfony / Doctrine use `symfony-workflow`. For framework-free PHP use `php-coder`. |
100
102
  | skill | [`laravel-horizon`](../.agent-src/skills/laravel-horizon/SKILL.md) | | Use when working with Laravel queues in production — Horizon dashboard, worker supervision, job metrics, balancing strategies — even when the user just says 'my jobs are piling up'. |
101
103
  | skill | [`laravel-mail`](../.agent-src/skills/laravel-mail/SKILL.md) | | Use when building Laravel emails — Mailables, Markdown templates, queued sending, attachments, previews — even when the user says 'send this as an email' without naming Mailables. |
102
104
  | skill | [`laravel-middleware`](../.agent-src/skills/laravel-middleware/SKILL.md) | | Use when creating or modifying Laravel middleware — request/response filtering, groups, priority, terminable middleware, or route-level assignment. |
@@ -125,6 +127,7 @@ are excluded.
125
127
  | skill | [`mobile-e2e-strategy`](../.agent-src/skills/mobile-e2e-strategy/SKILL.md) | | Use when picking a mobile E2E framework — Detox / Appium / Maestro / XCUITest / Espresso — or planning iOS Simulator / Android Emulator coverage in CI for RN, Expo, or native apps. |
126
128
  | skill | [`module-management`](../.agent-src/skills/module-management/SKILL.md) | | Use when the user says "create module", "explore module", or works within app/Modules/. Understands module structure, auto-loading, route registration, and namespace conventions. |
127
129
  | skill | [`multi-tenancy`](../.agent-src/skills/multi-tenancy/SKILL.md) | | Use when working with the multi-tenant architecture — customer DB switching, FQDN routing, tenant isolation, or cross-tenant operations. |
130
+ | skill | [`nextjs-patterns`](../.agent-src/skills/nextjs-patterns/SKILL.md) | | Writes Next.js App Router code — Server Components, Server Actions, RSC boundaries, route handlers, caching, and streaming — matching framework conventions and project architecture. |
128
131
  | skill | [`okr-tree-modeling`](../.agent-src/skills/okr-tree-modeling/SKILL.md) | | Use when decomposing a company objective into team OKRs, auditing a draft OKR tree, or stress-testing an existing one for measurability and laddering. |
129
132
  | skill | [`onboarding-design`](../.agent-src/skills/onboarding-design/SKILL.md) | | Use when designing customer onboarding — time-to-first-value, milestone design, friction audit, drop-off diagnosis. Triggers on 'fix onboarding', 'why do new accounts churn fast'. |
130
133
  | skill | [`onboarding-program`](../.agent-src/skills/onboarding-program/SKILL.md) | | Use when shaping employee onboarding — time-to-productivity, role-by-role program, mentor pairing, 30/60/90 milestones. Triggers on 'design our onboarding', 'why are new hires ramping slow'. |
@@ -146,7 +149,7 @@ are excluded.
146
149
  | skill | [`po-discovery`](../.agent-src/skills/po-discovery/SKILL.md) | | Use when shaping a fuzzy product ask into a refined backlog item — problem framing, user-story rewrite, AC tightening — even if the user just says 'help me write this ticket'. |
147
150
  | skill | [`positioning-strategy`](../.agent-src/skills/positioning-strategy/SKILL.md) | | Use when locking the market frame — category, segment, alternative, point-of-view — before messaging, launch, or pricing rides on it. Triggers on 'who are we for', 'opposable audit'. |
148
151
  | skill | [`privacy-review`](../.agent-src/skills/privacy-review/SKILL.md) | | Use when reviewing data flows for GDPR / CCPA / HIPAA fit — regulatory-regime delta, consent shape, breach-impact triage. Triggers on 'is this GDPR-safe', 'do we need a DPA'. |
149
- | skill | [`project-analysis-core`](../.agent-src/skills/project-analysis-core/SKILL.md) | | Use for the universal deep-analysis workflow: project discovery, version resolution, docs loading, architecture mapping, execution flow, and package research. |
152
+ | skill | [`project-analysis-core`](../.agent-src/skills/project-analysis-core/SKILL.md) | | Raw discovery primitives project discovery, version resolution, docs loading, architecture mapping, execution flow. Called by `universal-project-analysis`. Single-pass scan → `project-analyzer`. |
150
153
  | skill | [`project-analysis-hypothesis-driven`](../.agent-src/skills/project-analysis-hypothesis-driven/SKILL.md) | | Use when a bug has multiple plausible causes across layers — competing hypotheses, validation loops, evidence-based conclusions — even when the user just says 'why is this happening?'. |
151
154
  | skill | [`project-analysis-laravel`](../.agent-src/skills/project-analysis-laravel/SKILL.md) | | Use for deep Laravel project analysis: boot flow, request lifecycle, container usage, Eloquent/data flow, async systems, and Laravel-specific failure patterns. |
152
155
  | skill | [`project-analysis-nextjs`](../.agent-src/skills/project-analysis-nextjs/SKILL.md) | | Use for deep Next.js analysis: server vs client boundaries, routing, data fetching, caching, rendering modes, and hydration/runtime issues. |
@@ -154,7 +157,7 @@ are excluded.
154
157
  | skill | [`project-analysis-react`](../.agent-src/skills/project-analysis-react/SKILL.md) | | Use for deep React analysis: component tree, state flow, props flow, hooks usage, rendering behavior, and React-specific failure patterns. |
155
158
  | skill | [`project-analysis-symfony`](../.agent-src/skills/project-analysis-symfony/SKILL.md) | | Use for deep Symfony project analysis: kernel/bootstrap, container wiring, routing/request flow, Doctrine, security, Messenger, and Symfony-specific failure patterns. |
156
159
  | skill | [`project-analysis-zend-laminas`](../.agent-src/skills/project-analysis-zend-laminas/SKILL.md) | | Use for deep Zend Framework or Laminas project analysis: bootstrap, config merge order, service manager, MVC flow, data layer, and migration-specific risks. |
157
- | skill | [`project-analyzer`](../.agent-src/skills/project-analyzer/SKILL.md) | | ONLY when user explicitly requests: full project analysis, tech stack detection, or structured analysis documents for agents/analysis/. NOT for regular feature work. |
160
+ | skill | [`project-analyzer`](../.agent-src/skills/project-analyzer/SKILL.md) | | ONLY when user asks for single-pass tech-stack detection or `agents/analysis/` write-up. Deep multi-pass audit → `universal-project-analysis`. Raw primitives `project-analysis-core`. |
158
161
  | skill | [`project-docs`](../.agent-src/skills/project-docs/SKILL.md) | | Use when looking for project-specific documentation. Knows which docs exist in agents/docs/ and agents/contexts/ and maps work areas to relevant docs. |
159
162
  | skill | [`prompt-engineering-patterns`](../.agent-src/skills/prompt-engineering-patterns/SKILL.md) | | Use when designing production-LLM prompts — few-shot, chain-of-thought, system prompts, templates, self-verification — distinct from prompt-optimizer and refine-prompt. |
160
163
  | skill | [`prompt-optimizer`](../.agent-src/skills/prompt-optimizer/SKILL.md) | | Use when the user wants a prompt optimized for ChatGPT, Claude, Gemini, or another AI — 'make this prompt better', 'optimize for ChatGPT', 'rewrite my prompt' — even without saying 'optimize'. |
@@ -193,6 +196,7 @@ are excluded.
193
196
  | skill | [`sql-writing`](../.agent-src/skills/sql-writing/SKILL.md) | | Use when writing raw SQL — MariaDB/MySQL syntax, parameterization, raw migrations, seeders with `DB::statement` — even when the user just pastes a query and asks 'why is this slow' without naming SQL. |
194
197
  | skill | [`stakeholder-tradeoff`](../.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'. |
195
198
  | skill | [`subagent-orchestration`](../.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. |
199
+ | skill | [`symfony-workflow`](../.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`. |
196
200
  | skill | [`systematic-debugging`](../.agent-src/skills/systematic-debugging/SKILL.md) | | Use when hitting a bug, test failure, crash, or unexpected behavior — enforces reproduce → isolate → hypothesize → verify before any fix — even when the user just says 'this is broken' or 'quick fix'. |
197
201
  | skill | [`tailwind-engineer`](../.agent-src/skills/tailwind-engineer/SKILL.md) | | Use when writing or reviewing Tailwind CSS — utility-first, design-token discipline, no inline-style drift, responsive variants, dark mode — even on 'style this' or 'mach das hübsch'. |
198
202
  | skill | [`tech-debt-tracker`](../.agent-src/skills/tech-debt-tracker/SKILL.md) | | Use when surfacing tech debt as trackable items — interest-vs-principal framing, prioritisation by carrying cost, repayment plan — even if the user just says 'this codebase is a mess'. |
@@ -208,7 +212,7 @@ are excluded.
208
212
  | skill | [`traefik`](../.agent-src/skills/traefik/SKILL.md) | | Use when setting up Traefik as a local reverse proxy — real domains on 127.0.0.1, trusted HTTPS via mkcert, automatic service discovery, and multi-project routing. |
209
213
  | skill | [`ui-component-architect`](../.agent-src/skills/ui-component-architect/SKILL.md) | | Use when shaping a UI component tree — composition vs inheritance, slot patterns, prop API design, controlled vs uncontrolled, polymorphic — even on 'split this component'. |
210
214
  | skill | [`unit-economics-modeling`](../.agent-src/skills/unit-economics-modeling/SKILL.md) | | Use when modeling CAC, LTV, payback, contribution margin, or burn-multiple per customer — SaaS, marketplace, or transactional. Triggers on 'are we unit-economic', 'what is our LTV/CAC'. |
211
- | skill | [`universal-project-analysis`](../.agent-src/skills/universal-project-analysis/SKILL.md) | | ONLY when user explicitly requests: full project analysis, deep codebase audit, or comprehensive architecture review. Routes to core and framework-specific analysis skills. |
215
+ | skill | [`universal-project-analysis`](../.agent-src/skills/universal-project-analysis/SKILL.md) | | ONLY when user asks for deep multi-pass codebase audit orchestrator routing to `project-analysis-core` + framework-specific `project-analysis-*`. Single-pass scan → `project-analyzer`. |
212
216
  | skill | [`upstream-contribute`](../.agent-src/skills/upstream-contribute/SKILL.md) | | Use when a learning, new skill, rule improvement, or bug fix from a consumer project should be contributed back to the shared agent-config package. |
213
217
  | skill | [`using-git-worktrees`](../.agent-src/skills/using-git-worktrees/SKILL.md) | | Use when starting parallel work in isolation from the current branch — spawn a git worktree with ignore-safety checks and a clean test baseline — even when the user says 'try this on the side'. |
214
218
  | skill | [`validate-feature-fit`](../.agent-src/skills/validate-feature-fit/SKILL.md) | | Validate whether a feature request fits the existing codebase — check for duplicates, contradictions, scope creep, and architectural misfit |
@@ -218,7 +222,7 @@ are excluded.
218
222
  | skill | [`voice-and-tone-design`](../.agent-src/skills/voice-and-tone-design/SKILL.md) | | Use when shaping brand voice — voice attributes, tone-by-context matrix, consistency review. Triggers on 'define our voice', 'why does our copy sound different on every surface'. |
219
223
  | skill | [`websocket`](../.agent-src/skills/websocket/SKILL.md) | | Use when building real-time features — WebSocket broadcasting, live updates, presence channels, connection state — even when the user just says 'push this to the client live'. |
220
224
 
221
- ## Rules (58)
225
+ ## Rules (62)
222
226
 
223
227
  | kind | name | type | description |
224
228
  |---|---|---|---|
@@ -237,6 +241,8 @@ are excluded.
237
241
  | rule | [`commit-conventions`](../.agent-src/rules/commit-conventions.md) | auto | Git commit message format, branch naming, conventional commits, committing, pushing, or creating pull requests |
238
242
  | rule | [`commit-policy`](../.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 |
239
243
  | rule | [`context-hygiene`](../.agent-src/rules/context-hygiene.md) | auto | When debugging, fixing errors, or running long conversations — 3-failure stop rule, tool-loop detection, fresh-chat triggers |
244
+ | rule | [`copilot-routing`](../.agent-src/rules/copilot-routing.md) | auto | When configuring the GitHub Copilot AI assistant — copilot-instructions.md, PR-review comment patterns, suggestion behavior — route to the copilot-config skill |
245
+ | rule | [`devcontainer-routing`](../.agent-src/rules/devcontainer-routing.md) | auto | When wiring DevContainers or GitHub Codespaces — devcontainer.json, container images, VS Code features, port forwarding — route to the devcontainer skill |
240
246
  | rule | [`direct-answers`](../.agent-src/rules/direct-answers.md) | always | Always — direct, unembellished answers. No flattery, no invented facts (verify load-bearing claims, otherwise ask). Emojis only as functional markers. Brevity is the default. |
241
247
  | rule | [`docker-commands`](../.agent-src/rules/docker-commands.md) | auto | Running PHP commands inside Docker containers — artisan, composer, phpstan, rector, ecs, phpunit, tests, migrations, and any CLI tool execution |
242
248
  | rule | [`domain-adoption-policy`](../.agent-src/rules/domain-adoption-policy.md) | auto | Adopting a new domain track (mobile, ML, blockchain, IoT, gaming) — gates import on demand, ownership, CI fit, Sunset compatibility BEFORE harvest |
@@ -247,6 +253,7 @@ are excluded.
247
253
  | rule | [`improve-before-implement`](../.agent-src/rules/improve-before-implement.md) | auto | Before implementing features or architectural changes — validate the request against existing code, challenge weak requirements, suggest improvements |
248
254
  | rule | [`invite-challenge`](../.agent-src/rules/invite-challenge.md) | auto | Before executing a complex plan or non-trivial design — ask 'am I solving the right problem?' and pause for user confirmation, even when no ambiguity |
249
255
  | rule | [`language-and-tone`](../.agent-src/rules/language-and-tone.md) | always | Language and tone — informal German Du, English code comments, .md files always English |
256
+ | rule | [`laravel-routing`](../.agent-src/rules/laravel-routing.md) | auto | When writing or reviewing Laravel code — controllers, Eloquent, Artisan, jobs, events, policies — route to the laravel skill |
250
257
  | rule | [`laravel-translations`](../.agent-src/rules/laravel-translations.md) | auto | Laravel language files, translations, i18n, lang/de, lang/en, __() helper, localization, multilingual text |
251
258
  | rule | [`markdown-safe-codeblocks`](../.agent-src/rules/markdown-safe-codeblocks.md) | auto | Generating markdown output that contains code blocks — prevent broken nesting |
252
259
  | rule | [`minimal-safe-diff`](../.agent-src/rules/minimal-safe-diff.md) | auto | When writing or reviewing a diff — the smallest change that solves the stated problem; no drive-by edits, opportunistic refactors, or reformatting |
@@ -272,6 +279,7 @@ are excluded.
272
279
  | rule | [`skill-improvement-trigger`](../.agent-src/rules/skill-improvement-trigger.md) | auto | After completing a meaningful task — trigger post-task learning capture if pipelines.skill_improvement is enabled |
273
280
  | rule | [`skill-quality`](../.agent-src/rules/skill-quality.md) | auto | Creating, editing, or reviewing skills — minimum quality standard, every skill must be executable, validated, and self-contained |
274
281
  | rule | [`slash-command-routing-policy`](../.agent-src/rules/slash-command-routing-policy.md) | auto | When user types a slash command like /create-pr, /commit, or pastes command file content |
282
+ | rule | [`symfony-routing`](../.agent-src/rules/symfony-routing.md) | auto | When writing or reviewing Symfony code — DI container, bundles, Doctrine, Messenger, Security voters, console commands — route to the symfony-workflow skill |
275
283
  | rule | [`think-before-action`](../.agent-src/rules/think-before-action.md) | auto | Before coding, modifying, or debugging — analyze first, verify with real tools, never guess or trial-and-error |
276
284
  | rule | [`token-efficiency`](../.agent-src/rules/token-efficiency.md) | auto | When running CLI tools, fetching logs, or producing replies — redirect verbose output, minimize tool calls, keep replies concise |
277
285
  | rule | [`token-optimizer-maintenance`](../.agent-src/rules/token-optimizer-maintenance.md) | auto | Editing a token-optimizer-cited asset (cli-output-handling, rtk-output-filtering, token-efficiency, markitdown) — sync catalog same commit |
@@ -281,7 +289,7 @@ are excluded.
281
289
  | rule | [`user-interaction`](../.agent-src/rules/user-interaction.md) | auto | Asking the user a question, presenting options, or summarizing progress — numbered-options Iron Law, single-recommendation rule, progress indicators |
282
290
  | rule | [`verify-before-complete`](../.agent-src/rules/verify-before-complete.md) | always | Verify before completion — run tests and quality tools before claiming done |
283
291
 
284
- ## Commands (106)
292
+ ## Commands (108)
285
293
 
286
294
  | kind | name | cluster | description |
287
295
  |---|---|---|---|
@@ -309,11 +317,13 @@ are excluded.
309
317
  | command | [`context:refactor`](../.agent-src/commands/context/refactor.md) | cluster: context | Analyze, update, and extend an existing context document |
310
318
  | command | [`context`](../.agent-src/commands/context.md) | cluster: context | Context orchestrator — routes to create, refactor |
311
319
  | command | [`cost-report`](../.agent-src/commands/cost-report.md) | | Capture token cost from the active Claude Code session, append to the local sessions store, and surface the 50/75/90/100% budget alert ladder with cost-profile suggestions. |
320
+ | command | [`council:analysis`](../.agent-src/commands/council/analysis.md) | cluster: council | Run the council on a local analysis output (project-analyze, audit script, codebase scan) — critiques the analysis itself for dedup, evidence quality, and roadmap-readiness. |
321
+ | command | [`council:debate`](../.agent-src/commands/council/debate.md) | cluster: council | Multi-round council debate with progressive cost disclosure — each member produces a position, then rebuts the strongest opposing position in subsequent rounds. User confirms spend between rounds. |
312
322
  | command | [`council:default`](../.agent-src/commands/council/default.md) | cluster: council | Default council lens — neutral framing, redacted context, advisory output only. Run `/council default <input>` for prompt/roadmap/diff/files; the cluster shows a menu when invoked bare. |
313
323
  | command | [`council:design`](../.agent-src/commands/council/design.md) | cluster: council | Run the council on a design document, ADR, or architecture proposal — surfaces hidden coupling, missing rollback, and sequencing risk before commitment. |
314
324
  | command | [`council:optimize`](../.agent-src/commands/council/optimize.md) | cluster: council | Run the council on an optimization target — perf hot path, memory pattern, query, or an /optimize-* output — for ranked, evidence-based suggestions instead of generic advice. |
315
325
  | command | [`council:pr`](../.agent-src/commands/council/pr.md) | cluster: council | Pull a GitHub PR via gh CLI and run the council on the diff with a PR-specific neutrality preamble — read-only by default; comment posting is opt-in. |
316
- | command | [`council`](../.agent-src/commands/council.md) | cluster: council | Council orchestrator — routes to default, pr, design, optimize |
326
+ | command | [`council`](../.agent-src/commands/council.md) | cluster: council | Council orchestrator — routes to default, pr, design, optimize, analysis, debate |
317
327
  | command | [`create-pr:description-only`](../.agent-src/commands/create-pr/description-only.md) | cluster: create-pr | Generate a PR description as a copyable markdown block — used standalone or by create-pr |
318
328
  | command | [`create-pr`](../.agent-src/commands/create-pr.md) | cluster: create-pr | Create a GitHub PR with structured description from Jira ticket and code changes |
319
329
  | command | [`e2e-heal`](../.agent-src/commands/e2e-heal.md) | | Find, debug, and fix failing Playwright E2E tests |
@@ -0,0 +1,67 @@
1
+ ---
2
+ stability: beta
3
+ keep-beta-until: 2026-08-12
4
+ ---
5
+
6
+ # ADR — Architectural Consensus Mechanism (bus-factor / multi-author readiness)
7
+
8
+ > **Status:** Decided · 2026-05-14
9
+ > **Context:** v2 council finding C1 (file [01-bus-factor-and-consensus.md](../../agents/council-sessions/2026-05-14-v2-analysis/feedback/01-bus-factor-and-consensus.md)) flagged that a single-author skill suite cannot detect ontology drift (two skills with overlapping triggers, drift between description and body, generic best-practice patterns repeated across clusters). The package needs a **mechanical consensus signal** that does not depend on the original author's judgment.
10
+ > **Roadmap:** Closes Phase 5.2 of [`step-1-v2-feedback-followup`](../../agents/roadmaps/step-1-v2-feedback-followup.md).
11
+
12
+ ## Decision
13
+
14
+ A **two-tier consensus mechanism**, layered by cost:
15
+
16
+ 1. **Tier A — Automated ontology lint (every PR).** `scripts/skill_collision_clusters.py` produces `agents/reports/skill-collision-clusters.json`. New skills that fall into an existing collision cluster (description-vector similarity ≥ threshold or trigger-keyword overlap ≥ threshold) **break the build** unless paired with one of:
17
+ - A routing rule (tier-2a path-prefix or tier-3 keyword) that declares ownership, OR
18
+ - An ADR under `docs/contracts/adr-*.md` that names the trade-off.
19
+ 2. **Tier B — ADR on first collision (per cluster, not per skill).** When Tier A flags a new collision and the author chooses to keep both skills, they write a one-page ADR naming what each skill owns and where the boundary lives. The ADR is **per cluster**, not per skill — adding a fourth `php-*` skill to an established `php-*` cluster does not require a new ADR; only the cluster's first ADR matters.
20
+
21
+ Tier C (external review per N skills) is **rejected** as standing process; it is reserved for major-version boundaries (v3, v4) where the host wants a one-shot external sanity pass.
22
+
23
+ ## Why this was a real question
24
+
25
+ The three options from feedback file 01 were:
26
+
27
+ | Option | Cost | Detection power | Failure mode |
28
+ |---|---|---|---|
29
+ | (a) ADR per cluster | medium author cost, near-zero CI cost | high once written, zero before | author forgets to write the ADR; drift accumulates silently |
30
+ | (b) Automated ontology lint | low marginal cost per PR, one-time build cost | catches collisions at PR time; no semantic depth | flags noise (similar descriptions that own different surfaces); needs threshold tuning |
31
+ | (c) External review per N skills | high USD + calendar cost | high but lagged | gate fires too late; expensive |
32
+
33
+ Picking only (a) means the gate fires after the drift has already shipped (review of a written ADR ≠ detection of a missing ADR). Picking only (b) means the lint surfaces a number but the human still has to decide what to do with it. Picking only (c) means the gate fires once per quarter at best and costs real money.
34
+
35
+ The two-tier choice is the convener-skeptic synthesis: **(b) is the always-on gate, (a) is the high-signal moment (b) creates.** (c) stays reserved for the moments where neither (b) nor (a) can answer — and those moments are rare enough not to warrant standing process.
36
+
37
+ ## Consequences
38
+
39
+ - **Author cost (steady-state):** zero. The lint runs in CI; the author only writes an ADR when they introduce a new cluster head.
40
+ - **Author cost (when collisions land):** one ADR per cluster, ~150-300 lines.
41
+ - **CI cost:** O(skills²) similarity scan; current 210 skills → ~22k pairs scanned at ms-each. Acceptable for `ci-fast`.
42
+ - **Reviewer cost:** the cluster ADR is the single review surface — reviewers don't have to re-derive the cluster boundary on every PR touching the cluster.
43
+ - **What this does not catch:** drift between a skill's description and its body. That is a different problem, addressed by `audit-descriptions` / `lint-skills` (already in CI).
44
+ - **What this does not replace:** the `skill-quality` Iron-Law rule (every skill must be executable, validated, self-contained) and `description-assist` (push-toward-trigger phrasing). Those remain author-time obligations.
45
+
46
+ ## Rejected alternatives
47
+
48
+ - **(c) alone — external review per N skills.** Too expensive as standing process; gate fires too late to prevent drift.
49
+ - **Tier A as warn-only forever.** Defeats the purpose — drift accumulates if there is no fail-the-build state.
50
+ - **Persona-prompted self-review** (host runs sibling models). Rejected by `ai-council` skill (council convergence, 2026-05-06): same model, same blind spots, more cost.
51
+
52
+ ## Acceptance test
53
+
54
+ - [x] `scripts/skill_collision_clusters.py` exists and emits `agents/reports/skill-collision-clusters.json`
55
+ - [x] `scripts/score_skill_selection.py` exists and emits `agents/reports/skill-selection-accuracy.json`
56
+ - [x] Phase 3 routing rules (`laravel-routing`, `symfony-routing`, `copilot-routing`, `devcontainer-routing`) demonstrate the tier-B response to a flagged cluster
57
+ - [ ] Lint promoted to `fail-the-build` once thresholds are confirmed stable across one full release cycle (currently `warn-only`)
58
+
59
+ The final acceptance gate (lint going from warn-only to fail-the-build) is deferred to the next release window so the threshold has time to settle without breaking PRs on borderline noise. Tracked as a follow-up in the next step-N roadmap.
60
+
61
+ ## Related
62
+
63
+ - Origin: [`agents/council-sessions/2026-05-14-v2-analysis/feedback/01-bus-factor-and-consensus.md`](../../agents/council-sessions/2026-05-14-v2-analysis/feedback/01-bus-factor-and-consensus.md)
64
+ - Mechanical scripts: [`scripts/skill_collision_clusters.py`](../../scripts/skill_collision_clusters.py), [`scripts/score_skill_selection.py`](../../scripts/score_skill_selection.py)
65
+ - Sibling decision: [`docs/contracts/rule-router.md`](rule-router.md) — the routing layer the ADR feeds
66
+ - Sibling decision: [`docs/contracts/multi-tool-projection-fidelity.md`](multi-tool-projection-fidelity.md) — Phase 4 of the same roadmap
67
+ - Standing skill: [`.augment/skills/ai-council/SKILL.md`](../../.augment/skills/ai-council/SKILL.md) — the explicit-opt-in path for the rare moments tier C is invoked
@@ -73,7 +73,7 @@ stability: stable
73
73
  § Beta-review markers; `scripts/check_beta_review_markers.py` wired
74
74
  into `task ci`; 39 beta contracts back-filled (P5.4).
75
75
  - Test-redundancy audit produced
76
- [`road-to-test-cleanup.md`](../../agents/roadmaps/road-to-test-cleanup.md)
76
+ [`step-5-test-cleanup.md`](../../agents/roadmaps/step-5-test-cleanup.md)
77
77
  — audit-only, no deletions (P5.5).
78
78
 
79
79
  ### Release-trunk discipline (Phase 1)
@@ -119,7 +119,7 @@ keep-beta-until dates beyond the window.
119
119
  - **Showcase capture** → future `road-to-showcase-capture.md` when a
120
120
  hosted-LLM runner is on the table.
121
121
  - **Test-suite deletion** →
122
- [`road-to-test-cleanup.md`](../../agents/roadmaps/road-to-test-cleanup.md)
122
+ [`step-5-test-cleanup.md`](../../agents/roadmaps/step-5-test-cleanup.md)
123
123
  (audit-only sibling spawned by P5.5; non-destructive by default).
124
124
  - **Persona Block B** (Architect / Risk-Officer extension) —
125
125
  anti-recommended per the sibling closure decision; not deferred,
@@ -0,0 +1,186 @@
1
+ ---
2
+ stability: beta
3
+ keep-beta-until: 2026-08-12
4
+ ---
5
+
6
+ # AI-Council Config (`agents/.ai-council.yml`)
7
+
8
+ **Purpose.** Lock the schema, validation, and precedence rules for the
9
+ centralized council config file. Every later phase of
10
+ [`step-2-ai-council-consolidation.md`](../../agents/roadmaps/step-2-ai-council-consolidation.md)
11
+ reads from this file; the contract here is the boundary that prevents
12
+ drift across the loader, the CLI, the orchestrator, and the
13
+ `agents/.ai-council.yml` file itself.
14
+
15
+ **Audience.** Authors of `scripts/ai_council/config.py`, `council_cli.py`,
16
+ `scripts/ai_council/orchestrator.py`, and the `agents/.ai-council.yml`
17
+ starter. Also reviewers checking that new providers / advisors / debate
18
+ features keep the schema intact.
19
+
20
+ **Status.** Internal-locked. Changes require a contract version bump and
21
+ a revision entry in the consuming roadmap.
22
+
23
+ ## File location
24
+
25
+ The single source of truth is **`agents/.ai-council.yml`** at the
26
+ project root. The legacy `ai_council.*` block under `.agent-settings.yml`
27
+ is removed by Phase 0 Step 5 and replaced by a one-line breadcrumb
28
+ pointing at this contract.
29
+
30
+ ## Top-level schema
31
+
32
+ ```yaml
33
+ enabled: <bool> # master switch, required
34
+ defaults: # per-invocation defaults, required
35
+ mode: <"api" | "manual">
36
+ min_rounds: <int >= 1>
37
+ deep_min_rounds: <int >= min_rounds>
38
+ max_output_tokens: <int >= 0> # 0 widens to provider ceiling
39
+ session_retention_days: <int >= 0> # 0 disables pruning
40
+ debate_max_rounds: <int >= 2> # reserved by Phase 0, wired in Phase 7
41
+ cost_budget: # hard caps per /council invocation, required
42
+ max_input_tokens: <int >= 0> # 0 disables this cap
43
+ max_output_tokens: <int >= 0> # 0 disables this cap
44
+ max_calls: <int >= 0> # 0 disables this cap
45
+ max_total_usd: <number >= 0> # 0 disables the USD ceiling
46
+ members: # per-provider blocks, at least one enabled
47
+ <provider>:
48
+ enabled: <bool>
49
+ model: <string>
50
+ api_key_ref: <string> # see `api_key_ref` forms below
51
+ mode: <"api" | "manual"> # optional override of defaults.mode
52
+ advisors: # Thinking-style replace-mode advisors
53
+ <advisor-key>:
54
+ enabled: <bool>
55
+ member: <provider> # required; references members.<provider>
56
+ model: <string> # optional; overrides member.model
57
+ persona: <path> # optional; defaults to personas/advisors/<advisor-key>.md
58
+ ```
59
+
60
+ Supported `<provider>` keys: `anthropic`, `openai`, `gemini`, `xai`,
61
+ `perplexity`. Unknown providers fail validation closed.
62
+
63
+ ### Advisor block (Phase 6, replace-mode)
64
+
65
+ Five built-in advisor keys ship under
66
+ [`.agent-src.uncompressed/personas/advisors/`](../../.agent-src.uncompressed/personas/advisors/):
67
+ `contrarian`, `first-principles`, `expansionist`, `outsider`,
68
+ `executor`. Each entry binds one advisor to one enabled provider. When
69
+ `enabled: true`, the orchestrator REPLACES that provider's plain-member
70
+ call with the advisor-persona call — the run keeps the same total call
71
+ count as a plain run.
72
+
73
+ - `member` is required and must name a known provider. The validator
74
+ rejects an enabled advisor whose `member` is missing from the
75
+ `members` block, OR exists but has `enabled: false` — silent skips
76
+ on the spend path are not allowed.
77
+ - `model` is optional. When omitted, the advisor inherits its bound
78
+ member's `model`. When set, it overrides for that advisor call only.
79
+ - `persona` is optional. When omitted, the loader resolves the file at
80
+ `personas/advisors/<advisor-key>.md` relative to the package root.
81
+
82
+ ### Advisor persona labels in peer-review (preserve-persona)
83
+
84
+ Phase 5 peer-review anonymisation strips provider/model identity per
85
+ the Iron Law of Neutrality. On an advisor-mode run, the anonymisation
86
+ step preserves the **advisor persona label** as signal — peer-review
87
+ output renders as `Response A (Contrarian)`, never
88
+ `Response A (Anthropic Opus)`. Plain runs strip identity entirely.
89
+ Hard-coded behaviour — no flag, no opt-out.
90
+
91
+ ## `api_key_ref` forms
92
+
93
+ Exactly two forms. Raw keys in the yml are a hard validation error.
94
+
95
+ - `file:<path>` — read from a 0600 file. Relative paths resolve under
96
+ `~/.event4u/agent-config/`; absolute paths are honored as
97
+ written. The legacy `~/.config/agent-config/` location is still read
98
+ as a fallback by `scripts/_lib/user_global_paths.py`.
99
+ - `env:<VAR>` — read from the named environment variable at load time.
100
+ Missing or empty env var is a `KeyGateError`.
101
+
102
+ ## Precedence
103
+
104
+ Resolution order for every member-level setting (mode, model, key):
105
+
106
+ ```
107
+ invocation flag > per-member field > defaults block > built-in fallback
108
+ ```
109
+
110
+ Same shape applies to round counts (`--rounds N` > `defaults.min_rounds`,
111
+ plus the `deep_min_rounds` floor when `--depth deep` or a consuming
112
+ artefact's `council_depth: deep` frontmatter fires).
113
+
114
+ ## Normative behaviour — migrated verbatim
115
+
116
+ These rules are part of the contract; the consuming YAML reproduces them
117
+ as comments and the loader enforces them.
118
+
119
+ - **Iron Law of Neutrality.** Council members never see the host agent's
120
+ reasoning — only the artefact + a neutral system prompt. Phase 6 Step 3a
121
+ preserves advisor persona labels in peer-review but strips provider
122
+ identity.
123
+ - **Autonomy carve-out — no silent spend.** The `/council` command always
124
+ asks before invoking, even under autonomy: on. Cost is real and paid.
125
+ - **Manual vs API transport.** `api` = direct SDK call against the
126
+ provider's API (billable). `manual` = copy-paste loop, user is the
127
+ transport (free). Per-invocation flag > per-member override > defaults.
128
+ - **Tokens never stored in this yml.** Keys live in 0600 files
129
+ (`~/.event4u/agent-config/<provider>.key`, installed via
130
+ `bash scripts/install_<provider>_key.sh` for providers that ship an
131
+ installer) or in env vars. Validation rejects any literal-looking key.
132
+ - **`max_output_tokens: 0` widening.** Internally widened to the safe
133
+ provider ceiling (16384) because Anthropic rejects `max_tokens=0`. The
134
+ CLI `--max-tokens` flag overrides this on a single invocation; the
135
+ cost estimator uses the same value as its worst-case ceiling.
136
+ - **`deep_min_rounds` is monotonic.** Effective rounds =
137
+ `max(deep_min_rounds, min_rounds)`. Lowering `deep_min_rounds` below
138
+ `min_rounds` has no effect. Standard tasks keep `min_rounds`; cost
139
+ rises only when an artefact opts in via `council_depth: deep` in
140
+ frontmatter or `--depth deep` on the CLI.
141
+ - **Session retention.** `agents/council-sessions/` audit folders older
142
+ than `defaults.session_retention_days` are pruned automatically on the
143
+ next `save()`. `0` disables pruning — disk grows unbounded.
144
+ - **`cost_budget` semantics.** The orchestrator pauses before any member
145
+ whose projected spend would breach a cap and asks the user to continue.
146
+ Each `0` value disables that single cap; other caps still apply.
147
+ Prices come from [`agents/.agent-prices.md`](../../agents/.agent-prices.md)
148
+ (gitignored, refreshed weekly by `python3 scripts/update_prices.py`;
149
+ bootstrapped from `scripts/ai_council/_default_prices.py` on first run).
150
+
151
+ ## Validation rules
152
+
153
+ A loader call (`scripts/ai_council/config.py:load_council_config()`)
154
+ must reject the file with a clear `KeyGateError` (or equivalent typed
155
+ error) when any of these hold:
156
+
157
+ 1. Required top-level key missing (`enabled`, `defaults`, `cost_budget`,
158
+ `members`).
159
+ 2. `members` block has no provider with `enabled: true`.
160
+ 3. Unknown provider key under `members` or `advisors`.
161
+ 4. `api_key_ref` missing for an enabled member, or in an unknown form
162
+ (not `file:` and not `env:`), or pointing at a non-existent file /
163
+ missing env var.
164
+ 5. A value under `api_key_ref` looks like a raw secret (starts with
165
+ `sk-`, `pk-`, `xai-`, or matches a provider's key prefix).
166
+ 6. `defaults.deep_min_rounds < defaults.min_rounds` is allowed (clamped
167
+ by the monotonic rule at runtime) but logged as a warning.
168
+ 7. `defaults.mode` not in `{"api", "manual"}`; per-member `mode` override
169
+ same constraint.
170
+ 8. `advisors.<key>.member` missing, unknown, or pointing at a
171
+ `members.<provider>` that does not exist or has `enabled: false`
172
+ (when the advisor itself is `enabled: true`). Silent skips are not
173
+ allowed — a typo never costs the user money on an unintended call
174
+ plan.
175
+ 9. `advisors.<key>.model` is set but not a string.
176
+
177
+ ## Migration footprint (Phase 0)
178
+
179
+ - `.agent-settings.yml` → 14-key inventory under `ai_council:` removed
180
+ after a one-line breadcrumb comment is in place pointing at this
181
+ contract.
182
+ - `.agent-settings.template.yml` → same removal.
183
+ - New file `agents/.ai-council.yml` checked in with two enabled
184
+ providers (anthropic + openai) and three disabled
185
+ (gemini + xai + perplexity). Models pre-filled from the Phase 0
186
+ default set; comments mirror this contract.
@@ -42,7 +42,7 @@ column 1 of this table.
42
42
  | `judge` | 2 | `solo` · `on-diff` · `steps` | `judge` (legacy standalone) · `do-and-judge` · `do-in-steps` |
43
43
  | `commit` | 2 | `in-chunks` | `commit-in-chunks` |
44
44
  | `create-pr` | 2 | `description-only` | `create-pr-description` |
45
- | `council` | 3 | `default` · `pr` · `design` · `optimize` | `council` (legacy default lens) · `council-pr` · `council-design` · `council-optimize` |
45
+ | `council` | 3 | `default` · `pr` · `design` · `optimize` · `analysis` | `council` (legacy default lens) · `council-pr` · `council-design` · `council-optimize`; `analysis` added 2026-05-14 — wrapper for local analysis outputs with a Top-N consensus tail block consumed by `/roadmap create` |
46
46
  | `challenge-me` | — | `vision` · `with-docs` | new — Pocock-inspired one-question-at-a-time interview; `vision` is the standard 95%-confidence variant, `with-docs` adds doc/glossary awareness with a session-scoped glossary and load-bearing claim-vs-code verification |
47
47
  | `research` | 2 | `deep` · `report` | preliminary-research scaffolder ported from `Weizhena/Deep-Research-skills` (cluster head emits `outline.yaml` + `fields.yaml` against the `research-schema` contract). `:deep` populates per-item JSON in batches with native web-search + JSON-Schema self-validation (no Python runtime); `:report` renders `report.md` directly + optionally emits a `jq` template for deterministic regeneration. `add-items` / `add-fields` intentionally **not** ported — re-run `/research <topic>` to extend the field framework. |
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. |
@@ -119,6 +119,62 @@ grandfathered indefinitely; modifying them does NOT require adding
119
119
  the field. The goal is to stop the atomic surface from growing,
120
120
  not to retro-fit every legacy command into a cluster.
121
121
 
122
+ ## Master / wrapper sub-command shape (`council` cluster)
123
+
124
+ The `council` cluster uses a **master / wrapper** shape within the flat
125
+ ADR-003 dispatch — the only cluster currently shaped this way. It does
126
+ not break ADR-003 (still one level of sub-commands) and is documented
127
+ here so future lens additions follow the same shape.
128
+
129
+ - **Master:** `/council default` owns the full orchestration — Step 1
130
+ (resolve target + capture `original_ask`), Step 2 (configure check +
131
+ price-table freshness), Step 3 (cost confirmation), Step 4 (run CLI),
132
+ Step 5 / 5a / 5b (render → critical-evaluation lens → user options),
133
+ Step 6 (hard floor). See [`commands/council.md` → `## Architecture`](../../.agent-src.uncompressed/commands/council.md).
134
+ - **Wrappers:** `/council pr` · `/council design` · `/council optimize`
135
+ resolve lens-specific input (PR target / design artefact / optimization
136
+ target + metric), capture a wrapper-specific `original_ask`, then
137
+ delegate to `/council default` with `mode_override=<lens>`. They MUST
138
+ NOT re-implement cost-gate, CLI invocation, render, or host-verdict;
139
+ those flow through the master verbatim. Wrapper step references anchor
140
+ to the master (e.g. "cost gate from `/council default` Step 3",
141
+ "render via Step 5/5a/5b of `/council default`"), not the wrapper.
142
+ - **Single source of lens addendums:** lens-specific neutrality
143
+ addendums live in [`scripts/ai_council/prompts.py:_MODE_TABLE`](../../scripts/ai_council/prompts.py)
144
+ and are selected by `mode_override`. A new lens = a new `_MODE_TABLE`
145
+ entry **plus** a new wrapper file mirroring the `pr.md` / `design.md` /
146
+ `optimize.md` shape (~100–130 lines). No new master.
147
+ - **Behavioural changes** to the orchestration (e.g. a new render step)
148
+ land in `default.md` + `_MODE_TABLE` only; wrappers inherit
149
+ automatically. This invariant is what makes the shape safe under the
150
+ flat ADR-003 contract — the wrapper is text-only delegation.
151
+
152
+ Cluster-table names are unchanged: `/council default` is the master,
153
+ the other wrappers (`pr`, `design`, `optimize`, `analysis`) follow the
154
+ same shape. The deprecation shims for the four legacy slugs (`/council`,
155
+ `/council-pr`, `/council-design`, `/council-optimize`) continue to
156
+ follow the standard shim contract below.
157
+
158
+ ### Wrapper output shapes (consumer contract)
159
+
160
+ Each wrapper renders the standard stacked + Convergence/Divergence
161
+ layout from `/council default` Step 5/5a/5b. Wrappers MAY append a
162
+ **lens-specific tail block** when their output is the input to a
163
+ downstream command — locking the tail shape avoids brittle scraping.
164
+
165
+ | Wrapper | Tail block | Downstream consumer |
166
+ |---|---|---|
167
+ | `pr` | (optional) one-line PR header at top; no structured tail | `gh pr comment` (opt-in single comment) |
168
+ | `design` | (none — open-ended prose) | Human reader; `/feature plan` / `/feature refactor` |
169
+ | `optimize` | (none — open-ended prose) | Human reader |
170
+ | `analysis` | `## Top-N consensus findings (roadmap-ready first)` — numbered list, each finding with `evidence-grade` (confirmed / inferred / speculative), `roadmap-ready` (yes / needs-discovery), `cited by`, `supporting citation` | `/roadmap create` |
171
+
172
+ The `analysis` Top-N block is the only structured tail shipped today.
173
+ Its fields are normative — `/roadmap create` parses them to draft a
174
+ roadmap; renaming or reordering them is a breaking change for the
175
+ council → roadmap pipeline. Cap at N=10 unless the upstream analysis
176
+ has fewer findings.
177
+
122
178
  ## Deprecation shim contract
123
179
 
124
180
  A shim is a one-file stub that: