@event4u/agent-config 7.0.1 → 7.1.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 (103) hide show
  1. package/.claude-plugin/marketplace.json +8 -1
  2. package/CHANGELOG.md +99 -0
  3. package/README.md +4 -2
  4. package/dist/agent-src/commands/council/default.md +28 -20
  5. package/dist/agent-src/commands/evals/fix.json +5 -1
  6. package/dist/agent-src/commands/fix/comments.md +101 -0
  7. package/dist/agent-src/commands/fix.md +5 -2
  8. package/dist/agent-src/contexts/execution/auto-dispatch-classification.md +65 -0
  9. package/dist/agent-src/contexts/execution/auto-orchestration-activation.md +68 -0
  10. package/dist/agent-src/contexts/execution/host-capability-manifest.md +68 -0
  11. package/dist/agent-src/contexts/execution/orchestration-benchmark-gate.md +62 -0
  12. package/dist/agent-src/contexts/execution/orchestration-telemetry.md +59 -0
  13. package/dist/agent-src/contexts/execution/roadmap-process-loop.md +8 -3
  14. package/dist/agent-src/contexts/execution/subagent-response-contract.md +56 -0
  15. package/dist/agent-src/contexts/execution/subagent-routing.md +57 -0
  16. package/dist/agent-src/contexts/execution/subagent-spawn-contract.md +54 -0
  17. package/dist/agent-src/contexts/execution/subagent-steering.md +71 -0
  18. package/dist/agent-src/contexts/execution/verify-budget.md +50 -0
  19. package/dist/agent-src/rules/delegation-policy.md +84 -0
  20. package/dist/agent-src/rules/design-fidelity.md +98 -0
  21. package/dist/agent-src/rules/domain-safety-pii.md +22 -0
  22. package/dist/agent-src/rules/legal-safety-floor.md +144 -0
  23. package/dist/agent-src/rules/lethal-trifecta-guard.md +25 -22
  24. package/dist/agent-src/scripts/archive_completed_roadmaps.ts +102 -15
  25. package/dist/agent-src/scripts/update_roadmap_progress.ts +52 -7
  26. package/dist/agent-src/skills/ai-council/SKILL.md +28 -1
  27. package/dist/agent-src/skills/contract-review/SKILL.md +124 -0
  28. package/dist/agent-src/skills/contract-review/evals/triggers.json +17 -0
  29. package/dist/agent-src/skills/dpa-review/SKILL.md +129 -0
  30. package/dist/agent-src/skills/dpa-review/evals/triggers.json +17 -0
  31. package/dist/agent-src/skills/laravel/SKILL.md +1 -0
  32. package/dist/agent-src/skills/legal-intake-triage/SKILL.md +127 -0
  33. package/dist/agent-src/skills/legal-intake-triage/evals/triggers.json +17 -0
  34. package/dist/agent-src/skills/legal-practice-profile/SKILL.md +100 -0
  35. package/dist/agent-src/skills/legal-practice-profile/evals/triggers.json +17 -0
  36. package/dist/agent-src/skills/nda-triage/SKILL.md +113 -0
  37. package/dist/agent-src/skills/nda-triage/evals/triggers.json +17 -0
  38. package/dist/agent-src/skills/reasoning-orchestrator/SKILL.md +36 -9
  39. package/dist/agent-src/skills/recursive-verification/SKILL.md +186 -0
  40. package/dist/agent-src/skills/roadmap-management/SKILL.md +17 -0
  41. package/dist/agent-src/skills/subagent-orchestration/SKILL.md +14 -0
  42. package/dist/agent-src/templates/agent-settings.md +64 -19
  43. package/dist/discovery/deprecation-report.md +1 -1
  44. package/dist/discovery/discovery-manifest.json +278 -23
  45. package/dist/discovery/discovery-manifest.json.sha256 +1 -1
  46. package/dist/discovery/discovery-manifest.summary.md +12 -4
  47. package/dist/discovery/orphan-report.md +1 -1
  48. package/dist/discovery/packs.json +50 -8
  49. package/dist/discovery/trust-report.md +7 -5
  50. package/dist/discovery/workspaces.json +34 -6
  51. package/dist/mcp/registry-manifest.json +3 -3
  52. package/dist/router.json +1 -1
  53. package/dist/server/schemas/settings.js +14 -0
  54. package/dist/server/schemas/settings.js.map +1 -1
  55. package/docs/architecture.md +4 -4
  56. package/docs/benchmark.md +46 -0
  57. package/docs/catalog.md +18 -6
  58. package/docs/command-flows.md +7 -1
  59. package/docs/contracts/ai-council-config.md +17 -10
  60. package/docs/contracts/audit-log-v1.md +7 -0
  61. package/docs/contracts/auto-orchestration-v1.md +70 -0
  62. package/docs/contracts/command-clusters.md +1 -1
  63. package/docs/contracts/discovery-manifest.schema.json +2 -2
  64. package/docs/decisions/ADR-013-discovery-frontmatter-contract.md +19 -0
  65. package/docs/decisions/ADR-020-global-only-consumer-scope.md +13 -6
  66. package/docs/decisions/ADR-049-configuration-trust-boundary.md +11 -1
  67. package/docs/decisions/ADR-093-ai-council-config-user-global.md +10 -4
  68. package/docs/decisions/ADR-104-ai-council-config-global-only.md +119 -0
  69. package/docs/decisions/ADR-105-automatic-subagent-orchestration.md +102 -0
  70. package/docs/decisions/ADR-106-recursive-verification-benchmark-gate.md +126 -0
  71. package/docs/decisions/ADR-107-legal-domain-pack-adoption.md +51 -0
  72. package/docs/decisions/ADR-108-open-source-forever-no-commercial-tier.md +46 -0
  73. package/docs/decisions/INDEX.md +5 -0
  74. package/docs/getting-started.md +2 -2
  75. package/docs/guidelines/agent-infra/domain-eval-anti-pattern.md +53 -0
  76. package/docs/guidelines/agent-infra/domain-pack-architecture.md +55 -0
  77. package/package.json +1 -1
  78. package/src/config/agent-settings.template.yml +72 -3
  79. package/src/config/discovery/packs.yml +13 -0
  80. package/src/config/discovery/workspaces.yml +7 -0
  81. package/src/scripts/_lib/auto_dispatch.ts +95 -0
  82. package/src/scripts/_lib/host_capability.ts +59 -0
  83. package/src/scripts/_lib/orchestration_gate.ts +98 -0
  84. package/src/scripts/_lib/subagent_bundle.ts +154 -0
  85. package/src/scripts/_lib/subagent_response.ts +82 -0
  86. package/src/scripts/_lib/subagent_routing.ts +81 -0
  87. package/src/scripts/_lib/subagent_spawn.ts +97 -0
  88. package/src/scripts/_lib/subagent_steering.ts +64 -0
  89. package/src/scripts/_lib/verify_budget.ts +54 -0
  90. package/src/scripts/ai_council/advisors.ts +4 -2
  91. package/src/scripts/ai_council/clients.ts +7 -1
  92. package/src/scripts/ai_council/config.ts +22 -17
  93. package/src/scripts/bench_ab_v2_run.ts +127 -0
  94. package/src/scripts/bench_ab_v2_stats.ts +39 -0
  95. package/src/scripts/check_council_config_location.ts +6 -5
  96. package/src/scripts/lint_discovery_vocabulary.ts +6 -0
  97. package/src/scripts/lint_framework_leakage_allowlist.json +21 -0
  98. package/src/scripts/lint_legal_pack.ts +139 -0
  99. package/src/scripts/probe_projection_fidelity.ts +7 -1
  100. package/src/scripts/rdp_gate_classify.ts +131 -0
  101. package/src/scripts/rdp_quality_eval.ts +437 -0
  102. package/src/scripts/schemas/agent-settings.schema.json +11 -0
  103. package/src/scripts/skill_linter.ts +3 -0
@@ -33,23 +33,30 @@ fallback during the v2.4 namespace transition). This is where a single
33
33
  developer enables members, pins models, and sets caps once — and the
34
34
  council then works in **every** project they open, with no per-project
35
35
  file to check in or accidentally commit. See
36
- [ADR-093](../decisions/ADR-093-ai-council-config-user-global.md).
36
+ [ADR-093](../decisions/ADR-093-ai-council-config-user-global.md) and
37
+ [ADR-104](../decisions/ADR-104-ai-council-config-global-only.md).
37
38
 
38
- `scripts/ai_council/config.py:resolve_config_path` resolves the active
39
- file with this precedence (first match wins):
39
+ **The council config is ALWAYS user-global. The project tree is NEVER
40
+ searched for it.** `scripts/ai_council/config.ts:resolve_config_path`
41
+ resolves the active file with this precedence (first match wins):
40
42
 
41
43
  1. **`$AI_COUNCIL_CONFIG`** — an explicit absolute path. Honoured even
42
44
  when the target is absent (so a typo surfaces as "create it here"
43
45
  rather than silently falling back). Primarily for tests / power users.
44
- 2. **Project-local** `<project_root>/agents/settings/.ai-council.yml` —
45
- only when a consumer project deliberately checks in its own council
46
- config. This **overrides** the user-global file for that project.
47
- 3. **User-global** `~/.event4u/agent-config/settings/.ai-council.yml` — the
46
+ This is an explicit path, not a project search.
47
+ 2. **User-global** `~/.event4u/agent-config/settings/.ai-council.yml` — the
48
48
  canonical default described above.
49
49
 
50
- When none exists, the loader reports the user-global path as the place to
51
- create it. `agents/templates/.ai-council.yml.example` ships the documented
52
- shape to copy from. The legacy `ai_council.*` block under
50
+ There is **no project-local lookup.** A `<project_root>/agents/settings/.ai-council.yml`
51
+ in any project (including this package's own tree) is ignored — the
52
+ council never reads it (ADR-104, superseding the project-local override
53
+ ADR-093 had kept). The absence of a council file *in a project* therefore
54
+ says **nothing** about whether the council is configured; only the
55
+ user-global file (or the `$AI_COUNCIL_CONFIG` override) decides that.
56
+
57
+ When neither exists, the loader reports the user-global path as the place
58
+ to create it. `agents/templates/.ai-council.yml.example` ships the
59
+ documented shape to copy from. The legacy `ai_council.*` block under
53
60
  `.agent-settings.yml` remains removed (Phase 0 Step 5); a one-line
54
61
  breadcrumb there points at this contract.
55
62
 
@@ -87,6 +87,13 @@ Single-line. The pretty-printed reference shape:
87
87
  Unknown trailing fields are forward-compat extensions; readers MUST
88
88
  NOT raise on them.
89
89
 
90
+ A line MAY carry an optional `orchestration` object when the run was
91
+ produced by the auto-dispatch orchestration layer. It is additive and
92
+ non-breaking — `schema_version` is unchanged, no existing field is
93
+ removed or renamed, and readers that do not understand it ignore it per
94
+ the forward-compat rule above. Its shape lives in
95
+ [`orchestration-telemetry.md`](../../src/agent-src/contexts/execution/orchestration-telemetry.md).
96
+
90
97
  ## Privacy floor
91
98
 
92
99
  Lines MUST NOT contain:
@@ -0,0 +1,70 @@
1
+ ---
2
+ stability: beta
3
+ keep-beta-until: 2026-09-23
4
+ ---
5
+
6
+ # Auto-Orchestration v1
7
+
8
+ **Purpose.** Pin the data shapes the automatic subagent-orchestration layer
9
+ depends on — the host-capability manifest, the spawn brief, and the
10
+ orchestration telemetry object — so producers and consumers agree without
11
+ re-deriving them. Behaviour (when to dispatch, how to route, how to verify)
12
+ lives in the context docs; this contract pins the **shapes**.
13
+
14
+ **Scope.** The three JSON shapes below + the activation precondition. Does not
15
+ define classification rules, routing policy, or the verification budget — those
16
+ are the cited context docs.
17
+
18
+ Last refreshed: 2026-06-23. Decided in
19
+ [ADR-105](../decisions/ADR-105-automatic-subagent-orchestration.md).
20
+
21
+ ## Host-capability manifest
22
+
23
+ Resolved once per session, cached. Safe default = all-false.
24
+
25
+ ```json
26
+ { "schema_version": 1, "subagent_spawn": false, "parallel_spawn": false, "status_polling": false, "separate_quota_pool": false }
27
+ ```
28
+
29
+ Full semantics: [`host-capability-manifest`](../../src/agent-src/contexts/execution/host-capability-manifest.md).
30
+
31
+ ## Spawn brief
32
+
33
+ Composed per delegated sub-task; knowledge is references only, capped.
34
+
35
+ ```json
36
+ { "task": "<sub-task>", "role_mode": "reviewer|null", "profile": "<id|null>", "personas": ["<id>"], "knowledge_refs": ["<id-or-path>"] }
37
+ ```
38
+
39
+ Full semantics: [`subagent-spawn-contract`](../../src/agent-src/contexts/execution/subagent-spawn-contract.md).
40
+
41
+ ## Orchestration telemetry
42
+
43
+ Optional `orchestration` object on an [`audit-log-v1`](audit-log-v1.md) line —
44
+ additive, non-breaking, counts + ids only.
45
+
46
+ ```json
47
+ { "task_size_estimate": 0, "spawn_count": 0, "tiers": [], "token_delta": 0, "wall_clock_ms": 0, "outcome": "DONE", "verify_mode": "deterministic" }
48
+ ```
49
+
50
+ Full semantics: [`orchestration-telemetry`](../../src/agent-src/contexts/execution/orchestration-telemetry.md).
51
+
52
+ ## Activation precondition
53
+
54
+ Auto-dispatch is attempted only when:
55
+
56
+ ```
57
+ subagents.enabled AND subagents.auto != off AND manifest.subagent_spawn AND task-is-delegable
58
+ ```
59
+
60
+ Any failing → in-session. Full gate:
61
+ [`auto-orchestration-activation`](../../src/agent-src/contexts/execution/auto-orchestration-activation.md).
62
+
63
+ ## Cross-references
64
+
65
+ - [ADR-105](../decisions/ADR-105-automatic-subagent-orchestration.md) — the decisions.
66
+ - [`subagent-routing`](../../src/agent-src/contexts/execution/subagent-routing.md) — model downshift + quota bonus.
67
+ - [`auto-dispatch-classification`](../../src/agent-src/contexts/execution/auto-dispatch-classification.md) — delegability rules.
68
+ - [`verify-budget`](../../src/agent-src/contexts/execution/verify-budget.md) — verification budget.
69
+ - [`subagent-steering`](../../src/agent-src/contexts/execution/subagent-steering.md) — guardrails + kill-switch.
70
+ - [`orchestration-benchmark-gate`](../../src/agent-src/contexts/execution/orchestration-benchmark-gate.md) — the default-flip gate.
@@ -28,7 +28,7 @@ column 1 of this table.
28
28
 
29
29
  | Cluster | Phase | Sub-commands | Replaces |
30
30
  |---|:-:|---|---|
31
- | `fix` | 1 | `ci` · `pr-comments` · `pr-bot-comments` · `pr-developer-comments` · `portability` · `refs` · `seeder` | `fix-ci` · `fix-pr-comments` · `fix-pr-bot-comments` · `fix-pr-developer-comments` · `fix-portability` · `fix-references` · `fix-seeder` |
31
+ | `fix` | 1 | `ci` · `pr-comments` · `pr-bot-comments` · `pr-developer-comments` · `portability` · `refs` · `seeder` · `comments` | `fix-ci` · `fix-pr-comments` · `fix-pr-bot-comments` · `fix-pr-developer-comments` · `fix-portability` · `fix-references` · `fix-seeder`; `comments` added 2026-06-22 — audits the **code comments** in the current branch's diff (simplify / shorten / remove), distinct from the PR-review-thread `pr-comments` sub |
32
32
  | `optimize` | 1 | `agents-dir` · `augmentignore` · `rtk` · `skills` | `optimize-augmentignore` · `optimize-rtk-filters` · `optimize-skills` · former `/optimize agents` and `/optimize agents-md` moved to the `/agents` file-family cluster 2026-05-09; `/agents prepare/audit/cleanup` collapsed into the single `/optimize agents-dir` (flags or wizard) per the agent-doc consolidation |
33
33
  | `feature` | 1 | `explore` · `plan` · `refactor` · `roadmap` · `dev` | `feature-explore` · `feature-plan` · `feature-refactor` · `feature-roadmap` · `feature-dev` |
34
34
  | `chat-history` | 2 | `show` · `import` · `learn` | `chat-history` (legacy status) — `resume` / `clear` / `checkpoint` removed in `road-to-chat-history-hook-only` (auto-adopt + structural hooks); `import` (verbatim cross-session render) and `learn` (project-improving learning extraction) added in the v4 stateless schema |
@@ -74,7 +74,7 @@
74
74
  },
75
75
  "workspace_id": {
76
76
  "type": "string",
77
- "enum": ["engineering", "product", "finance", "founder", "gtm", "ops", "small-business", "construction", "agent-config-maintainer"]
77
+ "enum": ["engineering", "product", "finance", "founder", "gtm", "ops", "small-business", "construction", "legal", "agent-config-maintainer"]
78
78
  },
79
79
  "pack_id": {
80
80
  "type": "string",
@@ -84,7 +84,7 @@
84
84
  "finance-basic", "finance-advanced",
85
85
  "gtm-sales", "gtm-marketing",
86
86
  "ops-people", "founder-strategy", "small-business", "construction", "ai-video", "ai-image", "fun", "meta", "git", "frontend-design", "brand",
87
- "memory", "analytics", "product-reasoning", "analysis-workbench"
87
+ "memory", "analytics", "product-reasoning", "analysis-workbench", "legal"
88
88
  ]
89
89
  },
90
90
  "lifecycle": {
@@ -93,6 +93,7 @@ install:
93
93
  | `ops` | Operations | Hiring, comp, perf, org design, runbooks. |
94
94
  | `small-business` | Small Business | Self-employed / SMB-shaped owner workflows. |
95
95
  | `construction` | Construction | Trade-business workflows (planning, quotes). |
96
+ | `legal` | Legal | In-house legal — contract/NDA/DPA review, privacy, legal triage (EU/DE scope). |
96
97
  | `agent-config-maintainer` | Maintainer | Skills/rules/commands that maintain *this* package. |
97
98
 
98
99
  Amendments to the workspace list require an ADR-013 amendment.
@@ -120,6 +121,7 @@ Amendments to the workspace list require an ADR-013 amendment.
120
121
  | `founder-strategy` | Vision, fundraising narrative, competitive moat. (Renamed from `founder` to honour the non-overlap rule against `profile.id: founder`.) |
121
122
  | `small-business` | SMB-shaped owner workflows. |
122
123
  | `construction` | Trade-business workflows. |
124
+ | `legal` | In-house legal — EU/DE-scoped contract/NDA/DPA review and legal triage; procedure-only, attorney-review draft output. |
123
125
  | `ai-video` | AI video pipeline (per ADR-011, the only heavyweight domain). |
124
126
  | `fun` | Non-essential social/fun workflows (prediction-pool tips, etc.). Optional under the `small-business` workspace; `experimental` trust. |
125
127
  | `meta` | Artefacts that maintain *this* package (`agent-config` itself). |
@@ -295,6 +297,23 @@ consistency governance that constrains UI). Mirrored in
295
297
  2026-06-13 (road-to-image-brand-typography Phase B). Additive, no rename;
296
298
  non-overlap with cost-profile and `profile.id` reservations holds.
297
299
 
300
+ ### 2026-06-24 — New `legal` workspace + `legal` pack
301
+
302
+ Added workspace id `legal` and pack id `legal` to the closed vocabularies
303
+ (in-house legal — EU/DE-scoped contract/NDA/DPA review and legal triage;
304
+ procedure-only, no default legal positions; every output a draft for attorney
305
+ review). Mirrored in
306
+ [`src/config/discovery/workspaces.yml`](../../src/config/discovery/workspaces.yml),
307
+ [`src/config/discovery/packs.yml`](../../src/config/discovery/packs.yml), and the
308
+ `ADR_WORKSPACES` + `ADR_PACKS` sets in
309
+ [`src/scripts/lint_discovery_vocabulary.ts`](../../src/scripts/lint_discovery_vocabulary.ts).
310
+ `workspaces: [legal]`, `domain: legal`, `size_class: medium`,
311
+ `trust_level_default: experimental`, `surface_tier: lab` (gated lab-tier until the
312
+ Gate-2 maintenance owner + external qualification is confirmed —
313
+ road-to-legal-pack Phase 0.2). Council-resolved across three rounds 2026-06-24
314
+ (road-to-legal-pack). Additive, no rename; non-overlap with cost-profile and
315
+ `profile.id` reservations holds.
316
+
298
317
  ## Cross-references
299
318
 
300
319
  - [ADR-007 — Agent Discovery Scopes](ADR-007-agent-discovery-scopes.md):
@@ -108,12 +108,19 @@ corrects this:
108
108
  - The global surface is **secrets** (provider keys, already global) plus the
109
109
  curated identity **whitelist** (`MERGEABLE_KEYS`) — not all of `personal.*`,
110
110
  not council config, not personas.
111
- - **Council configuration and personas stay project-local** (version-controlled).
112
- The `MERGEABLE_KEYS` whitelist is a **security trust boundary**: an untrusted
113
- project repo must not be able to escalate `ai_council` / arbitrary `personal.*`
114
- into user scope. Widening the whitelist now requires a threat model.
115
- - The key name is **`ai_council`** (canonical, in `agents/settings/.ai-council.yml`),
116
- never `agent_council`.
111
+ - **Council config is NOT on the `MERGEABLE_KEYS` whitelist.** _(Placement
112
+ amended: per [ADR-093](ADR-093-ai-council-config-user-global.md) →
113
+ [ADR-104](ADR-104-ai-council-config-global-only.md) the council config
114
+ is now **user-global** at `~/.event4u/agent-config/settings/.ai-council.yml`,
115
+ never project-local — but it is its own dedicated `.ai-council.yml`, not a
116
+ merged `.agent-settings.yml` key, so it stays off this whitelist.)_ Personas
117
+ stay project-local (version-controlled). The `MERGEABLE_KEYS` whitelist is a
118
+ **security trust boundary**: an untrusted project repo must not be able to
119
+ escalate arbitrary `personal.*` into user scope. Widening the whitelist now
120
+ requires a threat model.
121
+ - The council config key name is **`ai_council`** (canonical), never
122
+ `agent_council`. It lives in the user-global `.ai-council.yml` (ADR-104),
123
+ not under `.agent-settings.yml`.
117
124
 
118
125
  This amendment narrows ADR-020's wording; the global-only **consumer install**
119
126
  decision (distributed content writes only to `~/.event4u/agent-config/`) is
@@ -13,7 +13,17 @@ type: decision
13
13
 
14
14
  ## Status
15
15
 
16
- **Accepted** · 2026-06-03. Locks the AI-council convergence
16
+ **Accepted** · 2026-06-03. **Council-config *placement* superseded by
17
+ [ADR-093](ADR-093-ai-council-config-user-global.md) → [ADR-104](ADR-104-ai-council-config-global-only.md)**
18
+ (council config now lives user-global at
19
+ `~/.event4u/agent-config/settings/.ai-council.yml`, never project-local).
20
+ The **trust-boundary decision below still stands**: `ai_council` is not on
21
+ the user-global *settings merge whitelist* (`.agent-settings.yml` keys) —
22
+ the council reads its own dedicated `.ai-council.yml`, not a merged
23
+ settings key. Wherever this ADR says council config "lives project-local",
24
+ read "lives user-global per ADR-104".
25
+
26
+ Locks the AI-council convergence
17
27
  (anthropic/claude-sonnet-4-5 + openai/gpt-4o, design mode + peer-review,
18
28
  2026-06-03) on where the source of truth for personal preferences and AI-council
19
29
  configuration lives. Refines [`ADR-020`](ADR-020-global-only-consumer-scope.md)
@@ -4,7 +4,7 @@ status: accepted
4
4
  date: 2026-06-13
5
5
  decision: ai-council-config-user-global
6
6
  supersedes: —
7
- superseded_by: —
7
+ superseded_by: 104
8
8
  phase: ai-council-config-relocation
9
9
  type: structural
10
10
  ---
@@ -13,9 +13,15 @@ type: structural
13
13
 
14
14
  ## Status
15
15
 
16
- **Accepted** · 2026-06-13. Maintainer directive (standing, restated): the
17
- council is a per-developer facility and must be configured once, globally,
18
- not re-declared per project.
16
+ **Accepted** · 2026-06-13. **Partially superseded by
17
+ [ADR-104](ADR-104-ai-council-config-global-only.md)** (2026-06-22): the
18
+ user-global relocation stands, but the project-local override this ADR
19
+ *kept* (precedence rule 2 in § Decision) is removed — the council is now
20
+ **global-only** and never searches the project tree.
21
+
22
+ Maintainer directive (standing, restated): the council is a per-developer
23
+ facility and must be configured once, globally, not re-declared per
24
+ project.
19
25
 
20
26
  ## Context
21
27
 
@@ -0,0 +1,119 @@
1
+ ---
2
+ adr: 104
3
+ status: accepted
4
+ date: 2026-06-22
5
+ decision: ai-council-config-global-only
6
+ supersedes: 093
7
+ superseded_by: —
8
+ phase: ai-council-config-relocation
9
+ type: structural
10
+ ---
11
+
12
+ # ADR-104 — The AI-council config is global-only (drop the project-local override)
13
+
14
+ ## Status
15
+
16
+ **Accepted** · 2026-06-22. Maintainer directive (standing, restated and
17
+ sharpened): the council is configured **once, globally** — and the agent
18
+ must never search a project for council config, never infer "council not
19
+ configured" from a project's missing files.
20
+
21
+ Supersedes the project-local override that
22
+ [ADR-093](ADR-093-ai-council-config-user-global.md) deliberately kept.
23
+
24
+ ## Context
25
+
26
+ ADR-093 relocated the council config to the user-global namespace
27
+ (`~/.event4u/agent-config/settings/.ai-council.yml`) but **kept** a
28
+ project-local override as precedence rule 2:
29
+ `<project_root>/agents/settings/.ai-council.yml` would win over the
30
+ user-global file when present. ADR-093 also rejected the "global always
31
+ wins" alternative, reasoning it would break a consumer team's
32
+ deliberately-checked-in shared council config.
33
+
34
+ In practice that hedge produced a recurring, infuriating failure mode that
35
+ the loader's own correctness did *not* prevent — because the failure was
36
+ in the **agent's mental model**, not the resolver:
37
+
38
+ > *"Council war in diesem Projekt nicht konfiguriert (kein <!-- md-language-check: ignore -->
39
+ > `.agent-settings.yml`/`scripts/ai_council`), daher habe ich die eine <!-- md-language-check: ignore -->
40
+ > Architektur-Gabel selbst entschieden."* <!-- md-language-check: ignore -->
41
+
42
+ An agent working in a consumer project, asked to consult the council on an
43
+ architecture fork, looked **in the project** for council artefacts — the
44
+ package-internal `scripts/ai_council` directory and the long-removed
45
+ `.agent-settings.yml` `ai_council` block — found neither (they only exist
46
+ inside the agent-config package), and concluded the council was
47
+ unconfigured. It then decided a structural fork solo. The user's council
48
+ *was* configured — globally — and would have answered from any project.
49
+
50
+ The project-local override is the root of this confusion: as long as "the
51
+ project might carry its own council config" is a documented truth, the
52
+ agent treats the project tree as a place to look, and absence-in-project
53
+ reads as not-configured. The override's intended beneficiary (a consumer
54
+ team pinning a shared config in their repo) has never materialised and is
55
+ not worth the recurring solo-decision failure on real work.
56
+
57
+ ## Decision
58
+
59
+ **The council config is global-only.** `resolve_config_path` (in
60
+ `scripts/ai_council/config.ts`) resolves with this precedence, first match
61
+ wins:
62
+
63
+ 1. **`$AI_COUNCIL_CONFIG`** — an explicit absolute path (tests / power
64
+ users). Honoured even when absent. This is an explicit path, not a
65
+ project search.
66
+ 2. **User-global** `~/.event4u/agent-config/settings/.ai-council.yml`
67
+ (legacy `~/.config/agent-config/` read-fallback).
68
+
69
+ The project-local branch is **removed**. The loader never builds or stats
70
+ `<project_root>/agents/settings/.ai-council.yml`. `project_root` stays in
71
+ the signature for caller stability but is not consulted for resolution.
72
+
73
+ The corollary, binding on every agent-facing surface (the `ai-council`
74
+ skill, the `/council` command family, the config contract): **the absence
75
+ of a council file in a project says nothing about whether the council is
76
+ configured.** An agent must never claim "council not configured" from
77
+ missing project files (`.agent-settings.yml`, `scripts/ai_council`, a
78
+ project `.ai-council.yml`). The CLI/resolver is the single authority — it
79
+ reads the global file and works from every project, worktree, and CWD.
80
+
81
+ ## Consequences
82
+
83
+ - A user-global `.ai-council.yml` with `enabled: true` works from **every**
84
+ project, including consumer repos and fresh worktrees, with zero
85
+ per-project setup — exactly the "configure once" intent of ADR-093, now
86
+ without the hedge that undermined it.
87
+ - The "council not configured in this project" solo-decision failure mode
88
+ is structurally impossible: there is no project location to be absent.
89
+ - `council_cli.ts` and `cmd_doctor.ts` (`doctor council-cli`) inherit the
90
+ change automatically — both already route through `resolve_config_path`.
91
+ - A consumer team that genuinely wants a repo-pinned shared council config
92
+ uses `$AI_COUNCIL_CONFIG` (e.g. exported in their dev shell / CI) — an
93
+ explicit opt-in, never an implicit project-tree search.
94
+ - `check_council_config_location.ts` keeps guarding against
95
+ `.agent-settings.yml` council references; its docstring is updated to
96
+ drop the "project-local first" description.
97
+
98
+ ## Alternatives
99
+
100
+ - **Keep ADR-093 as-is (project-local override stays).** Rejected — this is
101
+ the exact configuration that produced the recurring failure; the loader
102
+ being correct did not save the agent's mental model.
103
+ - **Fix only the agent-facing docs, leave the override in the loader.**
104
+ Rejected — as long as a project-local lookup exists, "look in the
105
+ project" remains a documented truth and the absence-reads-as-unconfigured
106
+ confusion recurs. Removing the lookup makes the instruction unambiguous.
107
+ - **Add a project-local override behind an explicit opt-in flag.** Rejected
108
+ as unneeded complexity — `$AI_COUNCIL_CONFIG` already covers the rare
109
+ repo-pinned case explicitly.
110
+
111
+ ## References
112
+
113
+ - [ADR-093](ADR-093-ai-council-config-user-global.md) — the user-global
114
+ relocation this ADR sharpens to global-only.
115
+ - `docs/contracts/ai-council-config.md` § File location — precedence rules.
116
+ - `src/scripts/ai_council/config.ts` — `resolve_config_path`.
117
+ - `src/skills/ai-council/SKILL.md`, `src/domains/meta/council/default/command.md`
118
+ — agent-facing surfaces carrying the "never infer not-configured from
119
+ missing project files" corollary.
@@ -0,0 +1,102 @@
1
+ ---
2
+ adr: 105
3
+ status: accepted
4
+ date: 2026-06-23
5
+ decision: automatic-subagent-orchestration
6
+ supersedes: —
7
+ superseded_by: —
8
+ phase: auto-subagent-orchestration
9
+ type: structural
10
+ ---
11
+
12
+ # ADR-105 — Automatic subagent orchestration: activate-don't-fragment, prove before default-on
13
+
14
+ ## Status
15
+
16
+ **Accepted** · 2026-06-23. Resolved by a deep AI-council round
17
+ (claude-sonnet-4-5 + gpt-4o, design mode) plus host critical-evaluation, and
18
+ implemented by `road-to-auto-subagent-orchestration.md`.
19
+
20
+ ## Context
21
+
22
+ The package shipped three latent subagent surfaces — the
23
+ `subagent-orchestration` skill (7 modes), `/orchestrate` (YAML pipelines), and
24
+ the RDP `reasoning-orchestrator` ("dispatch by default") — all **opt-in**,
25
+ none firing automatically. The goal: make subagent use automatic and
26
+ settings-gated, so an orchestrating model delegates delegable sub-tasks to
27
+ cheaper / faster / quota-separate subagents, each configured for its task,
28
+ globally toggleable in `.agent-settings.yml`.
29
+
30
+ The user's stated default was **on**. The council pushed back hard: a "default
31
+ on" whose own design concedes it *may increase* token spend inverts risk in a
32
+ package whose canon includes token-efficiency as an Iron Law, and whose
33
+ multi-tool portability constraint means not every host even has a subagent
34
+ primitive.
35
+
36
+ ## Decision
37
+
38
+ 1. **Activate, don't fragment.** Auto-dispatch is a settings + host-manifest
39
+ gate over the **existing** `subagent-orchestration` skill and RDP
40
+ "dispatch by default" — not a new parallel rule. Smallest surface.
41
+ 2. **Conservative-until-proven shipped default.** The full toggle ships now
42
+ (`subagents.enabled`, `subagents.auto: off|ask|on`), but the **shipped**
43
+ default is `ask` on hosts whose capability manifest reports
44
+ `subagent_spawn: true`, `off` elsewhere. The default flips toward `on`
45
+ (host-gated) **only** behind a real benchmark proving a net token-or-time
46
+ win at held quality (Phase 6). `on` is the destination, reached by
47
+ evidence — the reconciliation of the user's goal with the council's
48
+ prove-first.
49
+ 3. **Quota arbitrage is a runtime-detected bonus, never load-bearing.** The
50
+ "separate quota pool" (e.g. a subscription's distinct Sonnet allowance) is a
51
+ `host-capability-manifest` flag; routing is identical (minus the bonus)
52
+ where unsupported. No `.md` names a vendor's billing rule.
53
+ 4. **Deterministic classification v1.** Delegability is decided by enumerated
54
+ structural signals (frontmatter `parallelizable:`, ordered-plan,
55
+ independent-slices, a size floor); ambiguity defaults to ask/no-op, never
56
+ speculative spawn. No per-turn LLM meta-call in v1. LLM classification is
57
+ deferred to v2+, gated on the benchmark.
58
+ 5. **Verification budget preserves the floors.** Trivial/read-only sub-tasks
59
+ verify deterministically; non-trivial mutating sub-tasks get a full
60
+ cross-model judge (the `subagent-orchestration` Iron Law). A required
61
+ verification recorded as `none` is a surfaced safety gap.
62
+ 6. **Instrumentation first; kill-switch + surfaced guardrails.** Orchestration
63
+ telemetry rides additively on `audit-log-v1`. The kill-switch is a
64
+ single settings flip (`enabled: false` / `auto: off`). Rollback thresholds
65
+ (token blowup, spawn-failure, verify-skip, override rate) are surfaced from
66
+ the audit log — there is no automatic cohort-disable (a config package runs
67
+ no daemon).
68
+ 7. **Graceful host degradation.** Where the manifest reports
69
+ `subagent_spawn: false`, the whole layer is a clean no-op (single-agent),
70
+ surfaced explicitly. `.md` artefacts stay project-agnostic.
71
+
72
+ ## Consequences
73
+
74
+ - Auto-dispatch is the default **where the host and settings allow it**, and a
75
+ no-op everywhere else. No safety floor is lifted.
76
+ - The user's "default on" is an evidence-gated milestone, not assumed — the
77
+ one decision left for the user is to authorise/run the Phase-6 benchmark and
78
+ approve the default flip.
79
+ - The implementation is mostly contexts + small pure helpers + a settings
80
+ block + two activated skills, keeping the diff minimal.
81
+
82
+ ## Alternatives considered
83
+
84
+ - **Default `on` immediately** (the literal ask) — rejected: inverts risk
85
+ before measurement, against the frugality canon.
86
+ - **New parallel auto-dispatch rule** — rejected: fragments a surface that
87
+ already exists; activation is the smaller change.
88
+ - **Quota arbitrage as a core motivation** — rejected: vendor-specific,
89
+ fragile, violates portability; demoted to a runtime bonus.
90
+ - **Council-strict default `off` forever** — rejected: forecloses the user's
91
+ goal; the benchmark gate is the middle path.
92
+
93
+ ## References
94
+
95
+ - The auto-subagent-orchestration roadmap (now archived) + the
96
+ full council Convergence / Host verdict.
97
+ - [`docs/contracts/auto-orchestration-v1.md`](../contracts/auto-orchestration-v1.md) — the manifest + spawn + telemetry contract.
98
+ - Context docs under `src/agent-src/contexts/execution/`:
99
+ `host-capability-manifest`, `orchestration-telemetry`,
100
+ `auto-orchestration-activation`, `auto-dispatch-classification`,
101
+ `subagent-routing`, `subagent-spawn-contract`, `verify-budget`,
102
+ `subagent-steering`, `orchestration-benchmark-gate`.
@@ -0,0 +1,126 @@
1
+ ---
2
+ adr: 106
3
+ status: accepted
4
+ date: 2026-06-23
5
+ decision: recursive-verification-benchmark-gate
6
+ supersedes: —
7
+ superseded_by: —
8
+ phase: recursive-verification · Phase 0
9
+ type: structural
10
+ ---
11
+
12
+ # ADR-106 — Recursive-verification benchmark gate: capability-OR-measured-novel-discipline, not capability-only
13
+
14
+ ## Status
15
+
16
+ Accepted (2026-06-23). Locks the Phase 0 gate definition for
17
+ [`road-to-recursive-verification.md`](../../agents/roadmaps/archive/road-to-recursive-verification.md)
18
+ before any live `bench:ab` spend.
19
+
20
+ ## Context
21
+
22
+ The `recursive-verification` skill (depth-bounded `attempt → critic verdict →
23
+ re-attempt`, default `off`) needs a benchmark gate that decides whether its
24
+ shipped default flips to `on`/`ask` for a given host. The roadmap's initial draft
25
+ proposed **capability-axis-first**: ship only on a capability-axis lift; a
26
+ discipline-axis-only lift does **not** pass, on the assumption that the package's
27
+ existing always-on rules already deliver the discipline lift, so recursion would
28
+ merely duplicate them at ~11× cost.
29
+
30
+ This gate definition was put to the AI council (manual transport disabled; live
31
+ `council run --depth deep`, 3 rounds; members **anthropic/claude-sonnet-4-5** +
32
+ **openai/gpt-4o**, 2026-06-23, actual cost $0.0762). Both members independently
33
+ converged that **capability-only is the wrong gate**, for a sound methodological
34
+ reason; one member (anthropic) also raised a misreading that the host rejected.
35
+
36
+ ### What the council got right (accepted)
37
+
38
+ - **The redundancy assumption is unmeasured.** The gate assumed recursion's
39
+ discipline lift is redundant with the existing rules *without measuring it*.
40
+ The fix is a **three-baseline** design and an explicit **marginal** lift:
41
+ - `D₀` = bare host (no rules, no recursion)
42
+ - `D₁` = rules only (always-on rules, no recursion)
43
+ - `D₂` = rules + recursion
44
+ - **novel discipline lift = `D₂ − D₁`** — recursion's contribution *over*
45
+ rules-only. Redundancy is now a measured fact, not an assumption.
46
+ - **Cheap human-preference pre-test first.** Before any expensive benchmark, show
47
+ ~10 `(attempt₀, attempt_final)` pairs to humans and ask "which would you pay
48
+ for?". If preference < 60 %, the discipline lift is economically irrelevant →
49
+ capability-only gate stands and the expensive discipline arm is skipped (~$15
50
+ to settle the whole dispute). This mirrors the package's cheap-probe-first,
51
+ measure-first culture.
52
+ - **Concrete cost ceiling, not "tolerable".** The original "at a tolerable cost"
53
+ is circular. Replace with a measurable ceiling (token multiplier / $-per-task).
54
+ - **Per-(host, family) cell**, not host-global — recursion may pass for a weak
55
+ host on one family and fail for a strong host with no headroom.
56
+
57
+ ### What the council got wrong (rejected by the host)
58
+
59
+ - anthropic framed the gate as a *"fatal flaw because the 0.333 → 1.000 lift is
60
+ already recursion."* This is a **misread** of `docs/benchmark.md`: that lift is
61
+ the *rules'* effect (vanilla → package), measured **without** recursion;
62
+ recursion's marginal lift is unmeasured (that is exactly what Phase 3 runs). The
63
+ valid extraction is the three-baseline design above, not "capability-first is
64
+ fatally wrong."
65
+ - A weighted composite metric `w_cap·Δcap + w_disc·Δdisc` (openai) is **rejected**:
66
+ the weights are precisely the unknown the gate exists to discover (anthropic's
67
+ own counter, which the host endorses).
68
+
69
+ ## Decision
70
+
71
+ The shipped default for `verification.recursive` flips to `on`/`ask` for a
72
+ **(host, family) cell** if and only if:
73
+
74
+ ```
75
+ capability_lift(host, family) significant (McNemar on pass-rate, or scorer
76
+ Wilcoxon p < 0.05, ≥6 discordant
77
+ pairs, effect ≥ 0.5)
78
+ OR
79
+ ( novel_discipline_lift = D₂ − D₁ > ε_disc (recursion over rules-only —
80
+ MEASURED, never assumed)
81
+ AND cost_per_task ≤ ceiling (concrete token-multiplier / $)
82
+ AND human_preference_rate > 0.6 )
83
+ ELSE off.
84
+ ```
85
+
86
+ **Cheap prerequisite (runs first, gates the rest):** the ~$15 human-preference
87
+ test. Preference < 60 % ⇒ capability-only gate stands; skip the discipline arm.
88
+
89
+ **The benchmark must report, per (host, family):** `pass_rate(D₀/D₂)`,
90
+ `discipline_score(D₀ / D₁ / D₂)`, `cost(D₂)/cost(D₀)`, and
91
+ `human_preference(recursion vs baseline)`. Without the `D₁` (rules-only) middle
92
+ term, redundancy cannot be detected; without human-preference, a discipline lift
93
+ cannot be validated as economically real.
94
+
95
+ The first measured cell is `(claude-haiku-4-5, scope-discipline)`; multi-family
96
+ expansion waits until data justifies it.
97
+
98
+ ## Consequences
99
+
100
+ - Phase 3 of the roadmap gains a **rules-only (`D₁`) arm** and a **Phase 3a-pre
101
+ human-preference test**; the gate language changes from "capability-first;
102
+ discipline-only ⇒ STOP" to the two-branch rule above.
103
+ - An honest-null is still first-class: capability flat **and** (human-preference
104
+ < 60 % OR `D₂ − D₁` ≤ ε OR cost over ceiling) ⇒ ship nothing, record the null.
105
+ - The default stays `off` until a cell passes; no global flip without its own cell.
106
+ - Slightly more measurement up front (three baselines + a human pre-test), bought
107
+ cheaply ($15 pre-test gates the expensive arm) — net a more honest gate.
108
+
109
+ ## Alternatives considered
110
+
111
+ - **Capability-only (original draft).** Rejected: assumes, without measuring,
112
+ that recursion's discipline lift is redundant with the rules.
113
+ - **Weighted composite metric.** Rejected: presupposes the weights the gate
114
+ exists to discover.
115
+ - **Holistic / qualitative gate (openai round 1).** Rejected: too vague to
116
+ operationalise into a ship/no-ship decision.
117
+
118
+ ## References
119
+
120
+ - [`road-to-recursive-verification.md`](../../agents/roadmaps/archive/road-to-recursive-verification.md)
121
+ - [`docs/benchmark.md`](../benchmark.md) — the existing wrapper-lift A/B evidence.
122
+ - Council round: anthropic/claude-sonnet-4-5 + openai/gpt-4o, 2026-06-23, deep
123
+ tier (3 rounds), $0.0762 actual.
124
+ - [`subagent-orchestration`](../../src/skills/subagent-orchestration/SKILL.md),
125
+ [`verify-budget`](../../src/agent-src/contexts/execution/verify-budget.md),
126
+ `orchestration-benchmark-gate` (`gateVerdict` / `resolveShippedDefault`).