@event4u/agent-config 9.27.0 → 9.29.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 (220) hide show
  1. package/.claude-plugin/marketplace.json +1 -1
  2. package/AGENTS.md +13 -12
  3. package/CHANGELOG.md +165 -0
  4. package/README.md +1 -1
  5. package/agents/templates/.ai-council.yml.example +55 -24
  6. package/dist/agent-src/commands/analyze/conformance.md +24 -0
  7. package/dist/agent-src/commands/cost/report.md +2 -2
  8. package/dist/agent-src/commands/team/adversarial.md +8 -7
  9. package/dist/agent-src/commands/team/delegate.md +13 -12
  10. package/dist/agent-src/commands/team/review.md +9 -8
  11. package/dist/agent-src/commands/team/status.md +9 -8
  12. package/dist/agent-src/commands/team.md +29 -19
  13. package/dist/agent-src/contexts/execution/auto-dispatch-classification.md +88 -2
  14. package/dist/agent-src/contexts/execution/auto-orchestration-activation.md +29 -21
  15. package/dist/agent-src/contexts/execution/host-capability-manifest.md +26 -15
  16. package/dist/agent-src/contexts/execution/orchestration-telemetry.md +28 -3
  17. package/dist/agent-src/contexts/execution/subagent-response-contract.md +54 -0
  18. package/dist/agent-src/contexts/execution/subagent-routing.md +13 -11
  19. package/dist/agent-src/contexts/execution/subagent-spawn-contract.md +25 -0
  20. package/dist/agent-src/contexts/execution/subagent-steering.md +6 -3
  21. package/dist/agent-src/rules/artifact-engagement-recording.md +4 -1
  22. package/dist/agent-src/rules/autonomous-execution.md +1 -1
  23. package/dist/agent-src/rules/brand-source-of-truth.md +33 -6
  24. package/dist/agent-src/rules/context-hygiene.md +3 -1
  25. package/dist/agent-src/rules/council-availability.md +93 -0
  26. package/dist/agent-src/rules/cross-source-consistency.md +3 -0
  27. package/dist/agent-src/rules/delegation-policy.md +38 -10
  28. package/dist/agent-src/rules/design-fidelity.md +3 -0
  29. package/dist/agent-src/rules/evaluator-independence.md +2 -1
  30. package/dist/agent-src/rules/external-code-graph-interop.md +2 -1
  31. package/dist/agent-src/rules/finance-safety-floor.md +1 -1
  32. package/dist/agent-src/rules/git-history-discipline.md +1 -1
  33. package/dist/agent-src/rules/history-discipline.md +3 -1
  34. package/dist/agent-src/rules/legal-safety-floor.md +1 -1
  35. package/dist/agent-src/rules/no-pr-progress-comments.md +3 -1
  36. package/dist/agent-src/rules/onboarding-gate.md +3 -1
  37. package/dist/agent-src/rules/roadmap-ci-steps-policy.md +4 -1
  38. package/dist/agent-src/rules/role-mode-adherence.md +1 -1
  39. package/dist/agent-src/rules/scale-discipline.md +3 -1
  40. package/dist/agent-src/rules/self-repair-loop.md +103 -0
  41. package/dist/agent-src/rules/session-canary.md +2 -1
  42. package/dist/agent-src/rules/settings-ask-protocol.md +8 -7
  43. package/dist/agent-src/rules/strategy-safety-floor.md +1 -1
  44. package/dist/agent-src/rules/token-budget-discipline.md +4 -2
  45. package/dist/agent-src/rules/tool-safety.md +5 -1
  46. package/dist/agent-src/skills/adversarial-review/SKILL.md +1 -1
  47. package/dist/agent-src/skills/analysis-autonomous-mode/SKILL.md +1 -1
  48. package/dist/agent-src/skills/forensics-report/SKILL.md +114 -0
  49. package/dist/agent-src/skills/forensics-report/evals/triggers.json +17 -0
  50. package/dist/agent-src/skills/performance-analysis/SKILL.md +1 -1
  51. package/dist/agent-src/skills/persona-improvement/SKILL.md +1 -1
  52. package/dist/agent-src/skills/premortem/SKILL.md +30 -1
  53. package/dist/agent-src/skills/project-analyzer/SKILL.md +1 -1
  54. package/dist/agent-src/skills/reasoning-orchestrator/SKILL.md +2 -1
  55. package/dist/agent-src/skills/security-audit/SKILL.md +1 -1
  56. package/dist/agent-src/skills/sequential-thinking/SKILL.md +1 -1
  57. package/dist/agent-src/skills/skill-improvement-pipeline/SKILL.md +1 -1
  58. package/dist/agent-src/skills/subagent-orchestration/SKILL.md +7 -5
  59. package/dist/agent-src/skills/subagent-orchestration/schemas/subagent-status.json +61 -3
  60. package/dist/agent-src/skills/test-case-discovery/SKILL.md +1 -1
  61. package/dist/agent-src/skills/universal-project-analysis/SKILL.md +1 -1
  62. package/dist/agent-src/templates/AGENTS.md +8 -12
  63. package/dist/agent-src/templates/agents/agent-project-settings.example.yml +1 -1
  64. package/dist/agent-src/templates/roadmaps.md +23 -0
  65. package/dist/cli/registry.js +7 -0
  66. package/dist/cli/registry.js.map +1 -1
  67. package/dist/cli-delegate/chunk-66OVWGB5.js +270 -0
  68. package/dist/cli-delegate/{chunk-HJ6DAJHR.js → chunk-LCFJIQ4J.js} +89 -7
  69. package/dist/cli-delegate/{chunk-VSYT7OHO.js → chunk-LVRYBKTI.js} +31 -2
  70. package/dist/cli-delegate/{chunk-DVRS2KVR.js → chunk-MMXA5GY7.js} +10 -17
  71. package/dist/cli-delegate/{chunk-WR6GTRHJ.js → chunk-MP3JT3IU.js} +3 -3
  72. package/dist/cli-delegate/{chunk-3KJIMFTB.js → chunk-NZ5N2XQL.js} +467 -305
  73. package/dist/cli-delegate/{chunk-AIIUU73N.js → chunk-OJM3MBJM.js} +1 -1
  74. package/dist/cli-delegate/{chunk-BCPIOAGV.js → chunk-RCIA67XN.js} +117 -96
  75. package/dist/cli-delegate/chunk-REKCMYOU.js +2991 -0
  76. package/dist/cli-delegate/cmd_analyze_session.js +1 -1
  77. package/dist/cli-delegate/cmd_brand_status.js +134 -0
  78. package/dist/cli-delegate/cmd_conformance.js +10 -47
  79. package/dist/cli-delegate/cmd_converge.js +3 -3
  80. package/dist/cli-delegate/cmd_doctor.js +10 -6
  81. package/dist/cli-delegate/cmd_explain.js +80 -330
  82. package/dist/cli-delegate/cmd_export.js +6 -6
  83. package/dist/cli-delegate/cmd_fleet.js +3 -3
  84. package/dist/cli-delegate/cmd_handoff.js +3 -3
  85. package/dist/cli-delegate/cmd_mcp_available.js +433 -0
  86. package/dist/cli-delegate/cmd_migrate.js +3 -3
  87. package/dist/cli-delegate/cmd_packs_active.js +153 -0
  88. package/dist/cli-delegate/cmd_preflight.js +1 -1
  89. package/dist/cli-delegate/cmd_prune.js +6 -6
  90. package/dist/cli-delegate/cmd_route_audit.js +8 -8
  91. package/dist/cli-delegate/cmd_route_explain.js +4 -4
  92. package/dist/cli-delegate/cmd_settings_get.js +266 -0
  93. package/dist/cli-delegate/cmd_settings_migrate.js +6 -6
  94. package/dist/cli-delegate/cmd_settings_set.js +8 -2968
  95. package/dist/cli-delegate/cmd_sync.js +6 -6
  96. package/dist/cli-delegate/cmd_uninstall.js +6 -6
  97. package/dist/cli-delegate/cmd_update.js +4 -4
  98. package/dist/cli-delegate/cmd_upgrade.js +4 -4
  99. package/dist/cli-delegate/cmd_validate.js +6 -6
  100. package/dist/cli-delegate/cmd_versions.js +4 -4
  101. package/dist/discovery/deprecation-report.md +1 -1
  102. package/dist/discovery/discovery-manifest.json +164 -55
  103. package/dist/discovery/discovery-manifest.json.sha256 +1 -1
  104. package/dist/discovery/discovery-manifest.summary.md +4 -3
  105. package/dist/discovery/orphan-report.md +1 -1
  106. package/dist/discovery/packs.json +44 -5
  107. package/dist/discovery/trust-report.md +11 -11
  108. package/dist/discovery/workspaces.json +16 -6
  109. package/dist/hooks/dispatch.js +9341 -6131
  110. package/dist/install/install.mjs +739 -524
  111. package/dist/mcp/registry-manifest.json +3 -3
  112. package/dist/mcp/server.json +2 -2
  113. package/dist/mcp/server.mjs +777 -281
  114. package/dist/router.json +1 -1
  115. package/dist/scripts/_lib/agent_settings.js +134 -15
  116. package/dist/scripts/_lib/agent_settings.js.map +1 -1
  117. package/dist/scripts/condense.js +147 -2
  118. package/dist/scripts/condense.js.map +1 -1
  119. package/dist/server/schemas/settings.js +6 -7
  120. package/dist/server/schemas/settings.js.map +1 -1
  121. package/dist/shared/settingsCarveOut.js +0 -9
  122. package/dist/shared/settingsCarveOut.js.map +1 -1
  123. package/dist/shared/settingsClasses.js +11 -9
  124. package/dist/shared/settingsClasses.js.map +1 -1
  125. package/dist/ui/assets/{index-DmR0mbk4.js → index-JDAF00bC.js} +2 -2
  126. package/dist/ui/assets/{index-DmR0mbk4.js.map → index-JDAF00bC.js.map} +1 -1
  127. package/dist/ui/index.html +1 -1
  128. package/docs/contracts/settings-classes.md +68 -17
  129. package/docs/guidelines/agent-infra/memory-access.md +14 -3
  130. package/package.json +1 -1
  131. package/src/agent-src/templates/AGENTS.md +8 -12
  132. package/src/config/agent-settings.template.yml +52 -66
  133. package/src/config/budgets.yml +29 -0
  134. package/src/config/discovery/packs.yml +11 -0
  135. package/src/config/discovery/workspaces.yml +1 -1
  136. package/src/config/evaluator-budgets.json +4 -4
  137. package/src/config/gate-coverage.yml +26 -0
  138. package/src/config/gate-violation-baselines.json +3 -3
  139. package/src/scripts/_cli/cmd_brand_status.ts +174 -0
  140. package/src/scripts/_cli/cmd_conformance.ts +14 -42
  141. package/src/scripts/_cli/cmd_doctor.ts +65 -48
  142. package/src/scripts/_cli/cmd_mcp_available.ts +266 -0
  143. package/src/scripts/_cli/cmd_packs_active.ts +225 -0
  144. package/src/scripts/_cli/cmd_settings_get.ts +324 -0
  145. package/src/scripts/_dispatch.bash +57 -0
  146. package/src/scripts/_lib/agent_settings.ts +140 -16
  147. package/src/scripts/_lib/auto_dispatch.corpus.test.ts +1 -1
  148. package/src/scripts/_lib/auto_dispatch.ts +23 -18
  149. package/src/scripts/_lib/capsule_trigger.ts +124 -0
  150. package/src/scripts/_lib/carrier_divergence.ts +135 -0
  151. package/src/scripts/_lib/host_capability.ts +144 -4
  152. package/src/scripts/_lib/judgment_ladder.ts +382 -0
  153. package/src/scripts/_lib/orchestration_gate.ts +8 -0
  154. package/src/scripts/_lib/orchestration_record.ts +37 -0
  155. package/src/scripts/_lib/orchestration_savings.ts +1 -1
  156. package/src/scripts/_lib/prompt_shape.ts +88 -0
  157. package/src/scripts/_lib/review_skipped_record.ts +102 -0
  158. package/src/scripts/_lib/rule_layer_overlap.ts +254 -0
  159. package/src/scripts/_lib/self_repair.ts +489 -0
  160. package/src/scripts/_lib/self_repair_store.ts +128 -0
  161. package/src/scripts/_lib/subagent_capsule.ts +182 -0
  162. package/src/scripts/_lib/subagent_response.ts +19 -0
  163. package/src/scripts/_lib/subagent_spawn.ts +13 -0
  164. package/src/scripts/_lib/subagent_steering.ts +9 -4
  165. package/src/scripts/_lib/tier_budget_routing.ts +6 -1
  166. package/src/scripts/_lib/transcript_entry.ts +80 -0
  167. package/src/scripts/_lib/worker_budget.ts +37 -2
  168. package/src/scripts/ai_council/clients.ts +76 -54
  169. package/src/scripts/ai_council/config.ts +94 -6
  170. package/src/scripts/ai_council/handoff.ts +113 -0
  171. package/src/scripts/ai_council/modes.ts +19 -4
  172. package/src/scripts/ai_council/orchestrator.ts +105 -0
  173. package/src/scripts/ai_council/quorum.ts +84 -0
  174. package/src/scripts/ai_council/session.ts +44 -0
  175. package/src/scripts/ai_council/transport_resolver.ts +127 -1
  176. package/src/scripts/ai_team/availability.ts +110 -0
  177. package/src/scripts/ai_team/config.ts +34 -14
  178. package/src/scripts/ai_team/team_dispatch.ts +71 -29
  179. package/src/scripts/bench_critic_protocol.ts +396 -0
  180. package/src/scripts/check_branch_freshness.ts +255 -0
  181. package/src/scripts/check_council_config_location.ts +125 -1
  182. package/src/scripts/check_detector_corpus.ts +202 -0
  183. package/src/scripts/check_hook_bundle_freshness.ts +4 -1
  184. package/src/scripts/check_standing_rule_delivery.ts +314 -0
  185. package/src/scripts/condense.ts +162 -2
  186. package/src/scripts/config/profiles.ts +13 -3
  187. package/src/scripts/conformance_scan.ts +272 -24
  188. package/src/scripts/council_availability_hook.ts +188 -0
  189. package/src/scripts/council_cli.ts +527 -32
  190. package/src/scripts/forensics_report.ts +333 -0
  191. package/src/scripts/hook_manifest.yaml +107 -26
  192. package/src/scripts/hooks/block_no_verify.ts +39 -2
  193. package/src/scripts/hooks/block_unauthorized_git.ts +156 -7
  194. package/src/scripts/hooks/concern_registry.ts +10 -0
  195. package/src/scripts/hooks/delegation_nudge_hook.ts +484 -0
  196. package/src/scripts/hooks/end_review_nudge_hook.ts +726 -0
  197. package/src/scripts/hooks/orchestration_record_hook.ts +342 -0
  198. package/src/scripts/install.ts +151 -0
  199. package/src/scripts/language_mirror_hook.ts +30 -37
  200. package/src/scripts/lint_discovery_vocabulary.ts +2 -0
  201. package/src/scripts/lint_never_silent.ts +276 -0
  202. package/src/scripts/lint_no_activation_gates.ts +271 -0
  203. package/src/scripts/measure_scope_dedup.ts +19 -13
  204. package/src/scripts/onboarding_gate_hook.ts +40 -1
  205. package/src/scripts/orchestration_record.ts +12 -1
  206. package/src/scripts/preamble_byte_census.ts +9 -20
  207. package/src/scripts/rebuild_hook_bundle.ts +177 -0
  208. package/src/scripts/release.ts +74 -2
  209. package/src/scripts/report_carrier_divergence.ts +364 -0
  210. package/src/scripts/report_skill_activation.ts +257 -0
  211. package/src/scripts/report_skill_obligation_violations.ts +579 -0
  212. package/src/scripts/routing_doctor.ts +95 -39
  213. package/src/scripts/score_skill_selection.ts +19 -5
  214. package/src/scripts/self_repair_cli.ts +470 -0
  215. package/src/scripts/self_repair_hook.ts +241 -0
  216. package/src/scripts/team_events_spike.ts +271 -0
  217. package/src/scripts/team_review_gate_hook.ts +31 -9
  218. package/src/server/schemas/settings.ts +10 -17
  219. package/src/shared/settingsCarveOut.ts +0 -10
  220. package/src/shared/settingsClasses.ts +11 -9
@@ -27,7 +27,7 @@
27
27
  document.documentElement.setAttribute('data-theme', theme);
28
28
  })();
29
29
  </script>
30
- <script type="module" crossorigin src="/assets/index-DmR0mbk4.js"></script>
30
+ <script type="module" crossorigin src="/assets/index-JDAF00bC.js"></script>
31
31
  <link rel="stylesheet" crossorigin href="/assets/index-jSfMW8_t.css">
32
32
  </head>
33
33
  <body>
@@ -78,14 +78,35 @@ AND THE ASK FIRES ONLY WHEN THE USER'S OWN REQUEST NEEDS THE SETTING —
78
78
  NEVER AT A MOMENT THE AGENT CHOSE.
79
79
  ```
80
80
 
81
- **Half one — the conservative default.** A sparse settings file means *absent =
82
- default*. If a B key shipped with the permissive value as its default, then
83
- "never asked" and "answered yes" would be indistinguishable, and the ask would
84
- be decoration on a decision already made in the user's name. Under this
85
- invariant an unanswered B key is always the safe value, and the ask is the only
86
- path to the permissive one. `lint_settings_classes` enforces this half
87
- mechanically: a B row whose template default is not `false` / `""` / `0` / `[]`
88
- / `null` / `{}` fails the build.
81
+ **Half one — the conservative default.** If a B key shipped with the permissive
82
+ value as its default, then "never asked" and "answered yes" would be
83
+ indistinguishable, and the ask would be decoration on a decision already made in
84
+ the user's name. Under this invariant an unanswered B key is always the safe
85
+ value, and the ask is the only path to the permissive one.
86
+ `lint_settings_classes` enforces this half mechanically: a B row whose template
87
+ default is not `false` / `""` / `0` / `[]` / `null` / `{}` fails the build.
88
+
89
+ > **There is no defaults layer, and this contract used to imply one.** The
90
+ > sentence here previously read *"a sparse settings file means absent =
91
+ > default"*. No code implements that: `_DEFAULTS` in
92
+ > `src/scripts/_lib/agent_settings.ts` is `{}`, so the merged settings contain
93
+ > exactly what some file set and nothing else. What makes half one hold is not a
94
+ > defaults layer but the **reader** — each reader supplies its own fallback, and
95
+ > the lint above guarantees the template value a reader is expected to mirror is
96
+ > the conservative one.
97
+ >
98
+ > That distinction is load-bearing rather than pedantic, because the two are not
99
+ > equivalent for every key. Nine keys are carved out in
100
+ > [`src/shared/settingsCarveOut.ts`](../../src/shared/settingsCarveOut.ts) where
101
+ > a reader deliberately resolves an absent key to something **other** than the
102
+ > template default — `quality.local_auto_run` is the sharp one: the template
103
+ > ships `false`, which ARMS a gate, and an absent key resolves to `true` at its
104
+ > reader, which disarms it. Under a literal "absent = default" reading that key
105
+ > would be safe, and it is not.
106
+ >
107
+ > `agent-config settings:get <key>` reports both facts — the value with the file
108
+ > that set it, and the carve-out warning when absent is not the default. Use it
109
+ > rather than reasoning from this contract about what an absent key does.
89
110
 
90
111
  **Half two — who picks the moment.** The council review below found the hole in
91
112
  half one: an agent free to choose *when* to ask can engineer consent. Asking
@@ -108,18 +129,51 @@ larger set; it is the set that passes both halves.
108
129
  | `personal.canary_name` | un-inferrable, and answering arms the session-degradation canary; one keypress to accept the prefill | `""` (canary dark) |
109
130
  | `memory.learn_on_session_end` | it turns on automatic memory writes at the end of every session — a standing write the user should authorise | `false` |
110
131
 
132
+ ## The one exception — `emergency.orchestration_halt`
133
+
134
+ The always-on-orchestration doctrine (subagents, council, team) deletes every
135
+ per-layer on/off setting: `subagents.enabled`, `subagents.auto`, and
136
+ `subagents.host_capabilities` are gone from the template, and the layer
137
+ activates on any capable host with an EMPTY settings file. One switch survives
138
+ that deletion on purpose, and it is not the same shape wearing a different
139
+ name.
140
+
141
+ ```
142
+ ON-BY-DEFAULT, NOT OFF-BY-DEFAULT. ABSENT OR false MEANS THE STACK RUNS.
143
+ ARMING THE HALT IS CEREMONY-FREE — INCIDENTS ARE URGENT.
144
+ DISARMING IT REQUIRES A NON-EMPTY orchestration_halt_justification.
145
+ INCIDENT-RESPONSE USE ONLY.
146
+ ```
147
+
148
+ **Enforcement, stated honestly (`enforced_by: none`).** The settings file is
149
+ hand-edited YAML — no machine sits on the write path, so the
150
+ justification-on-disarm rule and any per-transition telemetry are
151
+ MODEL-CARRIED conventions, not checked gates (the same honesty stance as
152
+ `security-sensitive-stop`). What IS checked: readers treat only strict
153
+ `true` as halted, and the `no-activation-gates` lint prevents the switch
154
+ from ever growing activation siblings. An agent editing this key follows
155
+ the convention; a human editing it is the owner exercising it.
156
+
157
+ The distinguishing test against "an activation gate under a new name": an
158
+ activation gate is symmetric — flipping it either way costs the same nothing,
159
+ and its purpose is to let a capability sit unused by default. This switch is
160
+ asymmetric by convention — cheap to arm during an incident, costed (a stated
161
+ reason) to disarm, never a silent preference. `subagents.downshift`, `subagents.quota_arbitrage`, and
162
+ `subagents.model_map` are unaffected by the deletion — they tune HOW a
163
+ dispatch runs, not WHETHER the layer exists, so they keep their own C rows.
164
+
111
165
  ## Counts
112
166
 
113
167
  | Class | Keys |
114
168
  |---|---|
115
169
  | A — preference | 27 |
116
170
  | B — consent | 3 |
117
- | C — guarded | 110 |
118
- | **Total** | **140** |
171
+ | C — guarded | 107 |
172
+ | **Total** | **137** |
119
173
 
120
174
  The total is every leaf in the template, where *leaf* means anything that is not
121
- a **non-empty** map. An empty map (`subagents.host_capabilities: {}`) is a real
122
- configurable value with a real default, so it is a leaf here — one row more than
175
+ a **non-empty** map. An empty map (like the former `subagents.host_capabilities: {}`) is a real
176
+ configurable value with a real default, so such keys count as leaves here — one row more than
123
177
  the template↔schema parity test walks, deliberately, because a key with no
124
178
  class is exactly what this contract exists to prevent.
125
179
 
@@ -208,27 +262,24 @@ Rows follow template order, so a diff against the template reads straight down.
208
262
  | `screenshots.forbid_terminal_capture` | C | `true` | kill-switch over the highest-leak capture path |
209
263
  | `screenshots.data_bearing_gate` | C | `"on"` | the human-confirmation gate over a published egress |
210
264
  | `code_style.docblocks` | A | `minimal` | code convention |
211
- | `subagents.enabled` | C | `true` | kill-switch for the whole subagent layer |
212
- | `subagents.auto` | C | `"on"` | dispatches work without asking |
213
265
  | `subagents.downshift` | C | `true` | routes to another model tier, which is spend and quality |
214
- | `subagents.budget_routing` | C | `ask` | the budget-aware routing gate |
215
266
  | `subagents.quota_arbitrage` | C | `true` | spends from a separate quota pool |
216
267
  | `subagents.model_map.lite` | C | `""` | names an external model endpoint |
217
268
  | `subagents.model_map.medium` | C | `""` | names an external model endpoint |
218
269
  | `subagents.model_map.high` | C | `""` | names an external model endpoint |
219
- | `subagents.host_capabilities` | C | `{}` | overrides the host capability manifest |
220
270
  | `subagents.implementer_model` | C | `""` | names an external model endpoint |
221
271
  | `subagents.judge_model` | C | `""` | names an external model endpoint |
222
272
  | `subagents.max_parallel` | C | `3` | parallelism cap, and therefore a spend rate |
223
273
  | `subagents.adversarial_council` | C | `"off"` | governs a paid verification step |
224
274
  | `worktrees.mode` | C | `ask` | standing permission for autonomous worktree creation |
225
- | `ai_team.enabled` | C | `false` | authorises paid external CLI calls |
226
275
  | `ai_team.model` | C | `auto` | names an external model |
227
276
  | `ai_team.allow_delegate` | C | `false` | grants an external tool write access to the repository |
228
277
  | `ai_team.max_calls_per_day` | C | `50` | quota cap on a shared budget |
229
278
  | `ai_team.suppress_setup_hint` | A | `false` | hint cosmetics |
230
279
  | `ai_team.review_gate.managed` | C | `false` | governs an upstream review gate |
231
280
  | `ai_team.review_gate.max_consecutive_blocks` | C | `3` | circuit-breaker threshold |
281
+ | `emergency.orchestration_halt` | C | `false` | the one audited incident switch over the always-on orchestration stack — see § The one exception above |
282
+ | `emergency.orchestration_halt_justification` | C | `""` | required non-empty before the halt may be lifted; an audit-trail field |
232
283
  | `onboarding.onboarded` | C | `false` | flipping it bypasses the onboarding gate |
233
284
  | `commands.auto_detect` | C | `enabled` | kill-switch for orchestrator auto-detection |
234
285
  | `commands.suggestion.enabled` | A | `true` | a convenience layer; governs no gate and no spend |
@@ -50,9 +50,20 @@ as provisional (best-effort, agent-written, not human-reviewed).
50
50
 
51
51
  **Sharing boundary.** Curated YAML (`agents/memory/<type>/*.yml`) is
52
52
  **committed** — it is the team-shared layer. Raw intake
53
- (`agents/memory/intake/*.jsonl`) is **gitignored, local scratch** — only
54
- entries promoted to curated get shared. `retrieve()` still reads local
55
- intake (low-confidence tier); it just never reaches the team repo unpromoted.
53
+ (`agents/memory/intake/*.jsonl`) is **gitignored, local scratch** in a
54
+ consumer project — only entries promoted to curated get shared. `retrieve()`
55
+ still reads local intake (low-confidence tier); it just never reaches the team
56
+ repo unpromoted.
57
+
58
+ > **Which repo you are in changes this one line.** In a **consumer project**
59
+ > intake is gitignored — the shipped block in `src/config/gitignore-block.txt`
60
+ > lists `/agents/memory/intake/`. In **this package's own repo** it is
61
+ > **tracked** and union-merged, because here intake is part of the corpus
62
+ > under test; `agents/memory/intake/README.md` says so ("Local + tracked").
63
+ > Both are correct in their own context, and the sentence above states the
64
+ > consumer one. Read unconditionally, it makes a maintainer treat tracked
65
+ > intake files as a mistake, and it makes a consumer who follows the
66
+ > directory's README commit raw signals by accident.
56
67
 
57
68
  ## The status helper
58
69
 
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@event4u/agent-config",
3
3
  "mcpName": "io.github.event4u-app/agent-config",
4
- "version": "9.27.0",
4
+ "version": "9.29.0",
5
5
  "description": "Governed skills, rules and commands for AI coding tools (Claude Code, Cursor, Windsurf, Copilot) — every claim machine-checked, including \"zero runtime daemon\".",
6
6
  "license": "MIT",
7
7
  "private": false,
@@ -1,11 +1,6 @@
1
1
  # {{project_name}}
2
2
 
3
- <!--
4
- Fill placeholders or run `/agents init`, then delete this
5
- comment. Iron Law — capability bullets, not path lists; paths rot.
6
- Tool stubs (`CLAUDE.md`, `GEMINI.md`, `.cursorrules`) link here.
7
- Anatomy + recipes: `.augment/contexts/contracts/agents-md-anatomy.md`.
8
- -->
3
+ <!-- Fill placeholders or run `/agents init`; delete after. Recipes: `.augment/contexts/contracts/agents-md-anatomy.md`. -->
9
4
 
10
5
  > {{project_description}}
11
6
 
@@ -13,16 +8,17 @@
13
8
 
14
9
  | Layer | Location | Edits |
15
10
  |---|---|---|
16
- | Installed package | `.augment/`, `dist/agent-src/` | hands-off — managed by `event4u/agent-config` |
17
- | Project layer | `agents/`, `agents/overrides/`, `.agent-settings.yml` | your customizations and config |
11
+ | Installed package | `.augment/`, `dist/agent-src/` | managed by `event4u/agent-config` |
12
+ | Project layer | `agents/`, `agents/overrides/`, `.agent-settings.yml` | your customizations |
18
13
 
19
14
  ## Pointers
20
15
 
21
- - **Filling out this AGENTS.md** — section templates, capability bullets, multi-agent entry flow, monorepo per-package layout: [`.augment/contexts/contracts/consumer-agents-md-guide.md`](.augment/contexts/contracts/consumer-agents-md-guide.md).
22
- - **Behavior rules (always active)** — [`.augment/rules/`](.augment/rules/). Kernel rules are **immutable** — never propose an edit; tighten-only via the override registry.
23
- - **Skills (on-demand expertise)** — domain skills surfaced by description; invoked when their trigger fires: [`.augment/skills/`](.augment/skills/).
24
- - **Commands (workflows)** — slash-commands the agent runs end-to-end (`/work`, `/implement-ticket`, `/commit`, `/create-pr`, …): [`.augment/commands/`](.augment/commands/).
16
+ - **Filling out this AGENTS.md** — section templates, capability bullets, multi-agent entry flow, monorepo layout: [`consumer-agents-md-guide`](.augment/contexts/contracts/consumer-agents-md-guide.md).
17
+ - **Behavior rules (always active)** — [`.augment/rules/`](.augment/rules/). Kernel rules are **immutable**; tighten only via the override registry.
18
+ - **Skills (on-demand expertise)** — domain skills surfaced by description, invoked on trigger match: [`.augment/skills/`](.augment/skills/).
19
+ - **Commands (workflows)** — slash-commands the agent runs end-to-end (`/work`, `/create-pr`, …): [`.augment/commands/`](.augment/commands/).
25
20
  - **Project-specific docs** — your own architecture notes, roadmaps, sessions, contexts: [`agents/`](agents/).
21
+ - **Delegation & review** — dispatch independent-slice tasks to subagents instead of serial work; in a team (host-flag gated) the lead coordinates, teammates implement; a mutating session ends after a neutral cross-model review: [`delegation-policy`](.augment/rules/delegation-policy.md).
26
22
 
27
23
  ## Emergency triage — read this when nothing else is reachable
28
24
 
@@ -231,7 +231,8 @@ cost:
231
231
  # separate tier cap — the global ceilings above still apply and the
232
232
  # budget-routing relation works purely off them. Set a value to cap one
233
233
  # tier (e.g. cheap: 10 keeps haiku-class delegation under $10/day-window
234
- # of the ledger). Consumed by subagents.budget_routing below.
234
+ # of the ledger). Informational since the budget_routing key was removed
235
+ # (always-on orchestration): routing is judgment-ladder-driven.
235
236
  per_tier:
236
237
  cheap: null
237
238
  medium: null
@@ -743,60 +744,27 @@ code_style:
743
744
 
744
745
  # --- Subagent orchestration ---
745
746
  #
746
- # Controls model selection, parallelism, and AUTOMATIC orchestration for
747
- # subagent-based workflows (/do-and-judge, /do-in-steps, /judge, and the
748
- # auto-dispatch layer). Empty values fall back to the runtime defaults
749
- # described in .augment/contexts/subagent-configuration.md and
747
+ # Always-on orchestration (road-to-always-on-orchestration Phase 1): the
748
+ # subagent layer carries no per-run on/off setting. `subagents.enabled`,
749
+ # `subagents.auto`, and `subagents.host_capabilities` were REMOVED — a fresh
750
+ # install with this section untouched still activates auto-dispatch on any
751
+ # host whose capability probe reports a subagent primitive. Capability is a
752
+ # fact resolved from the host (registry + a live environment probe), never a
753
+ # setting; the one surviving incident-only control is `emergency.
754
+ # orchestration_halt` below. A leftover `subagents.enabled` / `subagents.auto`
755
+ # / `subagents.host_capabilities` key from an older install is ignored (one
756
+ # deprecation-warning line on load, per-key, per run).
757
+ #
758
+ # What remains below tunes HOW a delegated sub-task runs, never WHETHER the
759
+ # layer exists. Empty values fall back to the runtime defaults described in
760
+ # .augment/contexts/subagent-configuration.md and
750
761
  # .augment/contexts/execution/auto-orchestration-activation.md.
751
762
  subagents:
752
- # Global master switch for the whole subagent layer.
753
- # true (default) = the layer is available; false = fully disabled, the
754
- # canonical kill-switch (no auto-dispatch, no model routing, in-session only).
755
- enabled: true
756
-
757
- # Automatic-dispatch mode: off | ask | on
758
- #
759
- # off = never auto-dispatch; subagents only via an explicit command.
760
- # ask = classify the task; when delegable, ask once before dispatching.
761
- # on = auto-dispatch delegable tasks without asking (surface the choice
762
- # in one line).
763
- #
764
- # SHIPPED default is `on` on hosts whose capability manifest reports
765
- # `subagent_spawn: true`, and `off` on hosts without a subagent primitive.
766
- # Auto-dispatch stays a no-op wherever the manifest reports
767
- # `subagent_spawn: false`, regardless of this value.
768
- #
769
- # The default was `ask` until 2026-07-09, when it was flipped to `on` after a
770
- # re-evaluation (agents/settings/contexts/orchestration-default-flip-verdict.md
771
- # § 2026-07-09; ADR-117). The flip rests on a bounded-downside argument, NOT a
772
- # passed benchmark: delegable slices are already cost-routed to the cheapest
773
- # capable tier, classification fires only on real structural signals (never
774
- # unstructured or tiny work), and every return is verified — so `on` cannot
775
- # delegate frontier-priced or speculative work. `resolveShippedDefault()`
776
- # remains the telemetry-driven DEMOTION gate: a measured regression demotes
777
- # back to `ask`.
778
- auto: "on"
779
-
780
763
  # Route delegable sub-tasks to the lowest-capable model tier (cost + speed
781
764
  # via model downshift). true (default) = downshift per declared model_tier;
782
765
  # false = every subagent runs on the session tier.
783
766
  downshift: true
784
767
 
785
- # Budget-aware cheap-request delegation (docs/contracts/budget-routing.md).
786
- # Picks the cheapest CLASSIFIER-ADEQUATE tier that has available budget
787
- # (cost.budgets.per_tier above); cheap exhausted but strong funded → strong
788
- # tier; everything exhausted → session model + notice. Work is never
789
- # blocked to save money, and the session model is never switched — routing
790
- # happens as delegation with a model override. DISTINCT from `downshift`
791
- # above: downshift is the quality/cost trade-off knob, budget_routing is
792
- # the resource-availability gate (council 2026-08-03).
793
- # ask = (default) first budget-motivated downshift of a session asks once
794
- # auto = apply the relation silently (telemetry line per routed request)
795
- # off = today's behavior; single-flip rollback — QUOTE it ("off") when
796
- # editing: bare off is YAML-1.1 boolean false (readers coerce, but
797
- # the quoted form is the unambiguous one, same as `auto: "on"`)
798
- budget_routing: ask
799
-
800
768
  # Prefer a separate-quota-pool model for delegable sub-tasks WHERE the host
801
769
  # manifest reports `separate_quota_pool: true` (e.g. a subscription whose
802
770
  # Sonnet allowance is distinct from Opus). Optional bonus only — behaviour is
@@ -811,12 +779,6 @@ subagents:
811
779
  medium: ""
812
780
  high: ""
813
781
 
814
- # Optional host-capability override (see
815
- # .augment/contexts/execution/host-capability-manifest.md). Any field set
816
- # here wins; any field omitted falls back to the all-false safe default.
817
- # Leave empty to let the agent resolve the manifest from host knowledge.
818
- host_capabilities: {}
819
-
820
782
  # Model for implementer subagents (empty = same tier as the session model)
821
783
  implementer_model: ""
822
784
 
@@ -878,17 +840,23 @@ worktrees:
878
840
 
879
841
  # --- AI Team (cross-model strong-pair review — /team family) ---
880
842
  #
881
- # Governs the default-off `/team` capability family: one strong external
882
- # model (via the codex CLI, subscription-authed) reviews inside the repo —
883
- # the depth complement to the council's breadth. Schema + validation
884
- # contract: `docs/contracts/ai-team-config.md`. The loader
885
- # (`src/scripts/ai_team/config.ts`) rejects unknown keys fail-closed.
843
+ # One strong external model (via the codex CLI, subscription-authed)
844
+ # reviews inside the repo — the depth complement to the council's breadth.
845
+ # Schema + validation contract: `docs/contracts/ai-team-config.md`. The
846
+ # loader (`src/scripts/ai_team/config.ts`) rejects unknown keys fail-closed.
847
+ #
848
+ # Always-on orchestration (road-to-always-on-orchestration Phase 1, Step
849
+ # 1.3): `/team` carries no per-run on/off setting — `enabled` was REMOVED.
850
+ # A fresh install with this section untouched still surfaces `/team` when
851
+ # the codex CLI resolves on $PATH AND some auth for it is detectable
852
+ # (subscription login, API key, key file, or env key); otherwise every
853
+ # invocation degrades with one clear "codex CLI not available" line
854
+ # instead of a silent enabled:false refusal. Verify with `agent-config
855
+ # doctor --check team`. The one surviving incident-only control is
856
+ # `emergency.orchestration_halt` below. A leftover `enabled` key from an
857
+ # older install is accepted and ignored (one deprecation-warning line on
858
+ # load, per run).
886
859
  ai_team:
887
- # Master switch. false (default) = /team commands are never suggested
888
- # and every invocation refuses with an enable pointer; true = the
889
- # family is live (individual gates below still apply).
890
- enabled: false
891
-
892
860
  # Model handed to the codex CLI. 'auto' (default) = pass NO --model
893
861
  # flag, the codex CLI's own default applies — this tracks the
894
862
  # subscription's current strongest model instead of pinning a stale
@@ -897,8 +865,9 @@ ai_team:
897
865
 
898
866
  # Second opt-in for the ONLY wrapper that delegates write access
899
867
  # (/team:delegate → the plugin's native-Codex worker). false (default)
900
- # = delegate refuses with an enable pointer even when ai_team.enabled
901
- # is true. Both keys must be true before delegation is reachable.
868
+ # = delegate refuses even when /team itself is available. Availability
869
+ # (codex CLI installed + authenticated) is necessary but not
870
+ # sufficient — this key must ALSO be true before delegation is reachable.
902
871
  allow_delegate: false
903
872
 
904
873
  # Per-day cap on team calls. Team calls count into the EXISTING
@@ -934,6 +903,23 @@ ai_team:
934
903
  # Positive integer.
935
904
  max_consecutive_blocks: 3
936
905
 
906
+ # --- Emergency orchestration halt (the one incident-only kill switch) ---
907
+ #
908
+ # NOT an activation gate — see docs/contracts/settings-classes.md § "The one
909
+ # exception". The always-on orchestration stack (subagents, council, team)
910
+ # has no per-layer on/off setting; this is the single audited switch that
911
+ # survives, for incident response only.
912
+ emergency:
913
+ # false (default) = the stack runs normally. Flipping this to true requires
914
+ # no ceremony — incidents are urgent. Flipping it back to false requires
915
+ # `orchestration_halt_justification` below to be a non-empty string; both
916
+ # transitions emit one telemetry line (enum/bool fields only).
917
+ orchestration_halt: false
918
+
919
+ # Required non-empty before `orchestration_halt` may return to false.
920
+ # Ignored while the halt is being armed (arming is ceremony-free).
921
+ orchestration_halt_justification: ""
922
+
937
923
  # --- Onboarding ---
938
924
  #
939
925
  # Tracks whether the initial setup flow (/onboard) has been completed
@@ -14,3 +14,32 @@ augment_workspace_guidelines:
14
14
  total_cap_chars: 64000
15
15
  warn_threshold: 0.85
16
16
  fail_threshold: 0.95
17
+
18
+ standing_rule_delivery:
19
+ # The rule bytes a Claude Code session actually receives, summed across BOTH
20
+ # layers the host loads (`~/.claude/rules/` and `<project>/.claude/rules/`) —
21
+ # gated by `check_standing_rule_delivery.ts`.
22
+ #
23
+ # Derivation, measured 2026-08-08 (exact BPE, cl100k_base, via
24
+ # `src/scripts/_lib/token_count.ts`) and recorded in
25
+ # `agents/evidence/analysis/standing-rule-delivery-topologies.md`:
26
+ #
27
+ # both layers loaded 176,354 tok ← the defect this gate catches
28
+ # global layer alone 101,247 tok
29
+ # project layer alone 75,107 tok
30
+ #
31
+ # So the useful band is 101,247 … 176,354: below it a complete single layer
32
+ # would fail, above it the doubled corpus would pass. 110,000 sits in that
33
+ # band with ~9% headroom over the larger single layer.
34
+ #
35
+ # This is NOT the coherence-followup's pre-registered ≤ 30k always-on figure.
36
+ # That one measures the always-HONOURED set, which a discipline profile trims;
37
+ # this measures the PROJECTED file set, which no profile trims
38
+ # (compile_router.ts:266-272 vs condense.ts:1092-1099). 101,247 → 30,000 needs
39
+ # `paths:` scoping plus the digest, not dedup.
40
+ total_cap_tokens: 110000
41
+ warn_threshold: 0.85
42
+ # Every raise needs a stated cause naming which rule added the tokens and why.
43
+ # `check_standing_rule_delivery` fails on an empty or placeholder reason, so a
44
+ # silent baseline bump is not available.
45
+ cap_raise_reason: 'initial cap — derived from the 2026-08-08 six-topology measurement (P0.3), never raised'
@@ -162,6 +162,17 @@
162
162
  size_class: small
163
163
  default_install: false
164
164
 
165
+ - id: forensics
166
+ label: Forensic Evidence
167
+ description: Machine-derived release evidence from git history alone — hotspot risk (change frequency x complexity) and change-coupling analyzers; deterministic, read-only, advisory to the release findings pipeline.
168
+ workspaces: [engineering]
169
+ requires: [engineering-base]
170
+ trust_level_default: experimental
171
+ surface_tier: lab
172
+ domain: engineering
173
+ size_class: small
174
+ default_install: false
175
+
165
176
  - id: python
166
177
  label: Python
167
178
  description: Python-language patterns.
@@ -13,7 +13,7 @@
13
13
  description: Code, tests, CI, reviews, architecture.
14
14
  example_roles: [Developer, CTO, Tech Lead]
15
15
  default_packs: [engineering-base, git]
16
- optional_packs: [php, laravel, symfony, javascript, typescript, react, nextjs, python, frontend-design, brand, analysis-workbench, scale-discipline, history-discipline]
16
+ optional_packs: [php, laravel, symfony, javascript, typescript, react, nextjs, python, frontend-design, brand, analysis-workbench, scale-discipline, history-discipline, forensics]
17
17
 
18
18
  - id: product
19
19
  label: Product
@@ -58,11 +58,11 @@
58
58
  "deterministic": false
59
59
  },
60
60
  "cli_help_command_count": {
61
- "max": 88,
62
- "last_measured": 88,
63
- "last_measured_at": "2026-08-07",
61
+ "max": 95,
62
+ "last_measured": 95,
63
+ "last_measured_at": "2026-08-08",
64
64
  "method": "registry enumeration — count of `{ name: '...', disposition` entries in src/cli/registry.ts (NOT --help prose parsing; methods historically disagreed 74 vs 76 vs 79)",
65
- "baseline_note": "80 → 81 on 2026-08-03 (release 9.15.0 gate). This RECORDS growth that already shipped through its own reviewed PR; it does not authorize new surface. The +1 is f02db54c2 (fix(cli): register routing:doctor in the CLI registry) — the command existed, only its registry entry was missing, and the registering PR did not move this budget. The gate did its job again: breach WARNS on main and BLOCKS on release, which is the conscious-decision point rather than a silently raised cap. Re-measured 2026-08-03 via the pinned method: 81. Headroom stays zero by design — the next registry addition must move this number in its own PR. 81 → 82 on 2026-08-04: the `handoff` subcommand (road-to-agent-handoff-resume Phase 4) registers in the same PR that adds the surface, per this record's own contract. Re-measured via the pinned method: 82. 82 → 84 on 2026-08-04: the `route:explain` + `route:audit` verbs (routing-correctness validation surface) register in the same PR that adds the surface. Re-measured via the pinned method: 84. 84 → 85 on 2026-08-05: the `settings:set` verb (road-to-zero-ceremony-settings Phase 2 — the one agent-reachable settings writer) registers in the same PR that adds the surface, per this record's own contract. Re-measured via the pinned method: 85. 85 → 86 on 2026-08-06: the `conformance:behavior` verb (road-to-agent-behavior-conformance Phase 5 — replays the local transcript store through the four mechanised conformance checks) registers in the same PR that adds the surface, per this record's own contract. Re-measured via the pinned method: 86. 86 → 88 on 2026-08-07: the `sessions:list` + `sessions:claim` verbs (road-to-parallel-session-coordination — the shell surface of the shared session register, needed because /roadmap:next is command markdown and can only reach the register through a shell call) register in the same PR that adds the surface, per this record's own contract. Re-measured via the pinned method: 88."
65
+ "baseline_note": "80 → 81 on 2026-08-03 (release 9.15.0 gate). This RECORDS growth that already shipped through its own reviewed PR; it does not authorize new surface. The +1 is f02db54c2 (fix(cli): register routing:doctor in the CLI registry) — the command existed, only its registry entry was missing, and the registering PR did not move this budget. The gate did its job again: breach WARNS on main and BLOCKS on release, which is the conscious-decision point rather than a silently raised cap. Re-measured 2026-08-03 via the pinned method: 81. Headroom stays zero by design — the next registry addition must move this number in its own PR. 81 → 82 on 2026-08-04: the `handoff` subcommand (road-to-agent-handoff-resume Phase 4) registers in the same PR that adds the surface, per this record's own contract. Re-measured via the pinned method: 82. 82 → 84 on 2026-08-04: the `route:explain` + `route:audit` verbs (routing-correctness validation surface) register in the same PR that adds the surface. Re-measured via the pinned method: 84. 84 → 85 on 2026-08-05: the `settings:set` verb (road-to-zero-ceremony-settings Phase 2 — the one agent-reachable settings writer) registers in the same PR that adds the surface, per this record's own contract. Re-measured via the pinned method: 85. 85 → 86 on 2026-08-06: the `conformance:behavior` verb (road-to-agent-behavior-conformance Phase 5 — replays the local transcript store through the four mechanised conformance checks) registers in the same PR that adds the surface, per this record's own contract. Re-measured via the pinned method: 86. 86 → 88 on 2026-08-07: the `sessions:list` + `sessions:claim` verbs (road-to-parallel-session-coordination — the shell surface of the shared session register, needed because /roadmap:next is command markdown and can only reach the register through a shell call) register in the same PR that adds the surface, per this record's own contract. Re-measured via the pinned method: 88. 88 → 89 on 2026-08-08: the `council:status` verb registers in the same PR that adds the surface, per this record's own contract. It exists because an agent in a consumer project announced \"kein Council konfiguriert (keine .agent-settings.yml)\" and substituted a weaker path while the council was configured user-globally the whole time — there was no verb that answered availability, so the only route was an inference from a filename, and the intuitive filename is the one location ADR-104 guarantees is never consulted. Re-measured via the pinned method: 89. 89 → 91 on 2026-08-08: the `self-repair:status` + `self-repair:release` verbs (the queued-defect reader and the single Hard-Floor-gated outward step of the self-repair loop — the loop is deliberately unable to publish unless a human runs the release command) register in the same PR that adds the surface, per this record's own contract. Landed alongside the +1 council:status move in the same branch. Re-measured via the pinned method: 91. 91 → 94 on 2026-08-08: the `packs:active`, `settings:get` and `mcp:available` verbs (road-to-capability-answerability Phase 2 — the three capability probes for the gaps that had none) register in the same PR that adds the surface, per this record's own contract. Each answers a question that was previously only inferable from a filename: which packs are active and from which file, what a setting resolves to and which file set it, and what is declared in mcp.json versus what can actually launch. 94 -> 95 in the same PR: `brand:status` (Phase 2.4 — brand-layer presence, which the rule depended on and no surface could answer). Re-measured twice via the pinned method on the unchanged tree: 95/95."
66
66
  },
67
67
  "mcp_public_tool_count": {
68
68
  "max": 19,
@@ -90,6 +90,32 @@
90
90
  # silently fall behind again (that omission is exactly how `check_site_links`
91
91
  # reported green over a stale build for weeks).
92
92
  #
93
+ # THAT BACKSTOP COVERS ONE OF THE TWO EMIT SHAPES — measured 2026-08-08 under
94
+ # round-6 Phase 4.1, and corrected here rather than left as a claim the file
95
+ # cannot support. The test's detector is a literal-source regex:
96
+ # `/(?:process\.(?:stdout|stderr)\.write|lines\.push)\(\s*`scanned: \$\{/`. A gate
97
+ # that emits through `_lib/scan_scope.ts` — `assertScanned()` / `reportScanned()`,
98
+ # which is the shape this repo tells a gate author to use — writes the line from
99
+ # inside the library, so its own source never matches and the test cannot see it.
100
+ # Live split: **1 unregistered gate emits the inline shape (`check_gate_coverage`
101
+ # itself), and 175 of 244 gate scripts emit through the helper.** So for the
102
+ # recommended shape the sentence above is false, and the list CAN fall behind.
103
+ #
104
+ # Not widened here, deliberately. Widening the regex to include the helper turns
105
+ # 175 gates into findings in one diff, and the paragraph below already states why
106
+ # that is not a one-line-per-gate job: their unit would have to be INVENTED, which
107
+ # is a per-gate judgement. `check_rule_projection_integrity` (conformance-round5
108
+ # Phase 1.1/1.2) is a worked example of the blocker — it emits 330 through
109
+ # `assertScanned`, but `agents/.agent-tools.yml` is `skip-worktree`-masked to
110
+ # `tools: []` on a maintainer checkout, so the same gate legitimately emits 0
111
+ # there. A real floor would red locally and a `min_scanned: 0` floor is the
112
+ # false-count shape this file rejects, and `unavailable_exit` cannot express it
113
+ # because the empty case must keep exiting 0 (it runs first in the pre-push
114
+ # `preflight` chain and blocking there is what PR #1211 repaired). It is therefore
115
+ # NOT registered, with the reason, rather than registered with a floor that cannot
116
+ # hold. Its ledger half is discharged: it adopts `_lib/gate_ledger.ts`, so
117
+ # `check_gate_completeness` already counts it as an adopter.
118
+ #
93
119
  # CANARY (road-to-gates-that-can-fail Phase 7)
94
120
  # --------------------------------------------
95
121
  # Coverage proves a gate READ something. It cannot prove the gate can still FAIL.
@@ -2,9 +2,9 @@
2
2
  "$comment": "Violation ratchet for gates whose dead scan root was repaired. A repair REVEALS pre-existing debt; it does not create it. Each entry records the count revealed at repair time — the gate fails only when its count RISES. Lowering a count is a normal commit; raising one is a defect. Entries expire: a baseline that has not dropped within 56 days of `landed` (or of `reaffirmed.date`) fails its gate, because a number that never moves is suppression with extra steps. Mechanism + rationale: src/scripts/_lib/gate_baseline.ts. Decision: AI council 2026-08-02, roadmap road-to-gates-that-can-fail blocker `dead-gate-finding-triage`.",
3
3
  "gates": {
4
4
  "check_no_new_legacy_path:hardcoded-scan-roots": {
5
- "count": 49,
6
- "landed": "2026-08-04",
7
- "note": "Lines under src/scripts/**/*.{ts,mts,mjs} that pass the retired `.agent-src.uncondensed` directory into `path.join(...)` — a filesystem path CONSTRUCTED against the tree ADR-051 abandoned, which is the exact shape of all 14 dead gates. Deliberately narrow so the number is signal, not noise: 236 raw mentions under src/scripts → 147 string-literal lines → 67 path-constructing lines when the pass was written, after exempting src/scripts/_lib/agent_src.ts (the shared resolver, whose job IS owning the constant — gates that route through it survived the move). Detectors holding the literal as data to match, strip, or print are not counted, and no prose, docs, tests or fixtures are read: that full-tree shape was measured at 44 files / 213 hits and rejected as the wrong lint (see the note in check_no_new_legacy_path.ts::find_offenders). Recorded at 58 rather than 67 because Phase 1's scan-root repairs were landing on this branch while the pass was being written and had already removed 9 — a baseline above the truth silently permits new violations. This count goes to ZERO as the remaining repairs land; every repair is a lowering commit. Lowered 56→51 by the road-to-renewal-foundation Phase 1 dead-root sweep (check_always_budget, check_portability, check_references, lint_framework_leakage, lint_agents_md). Lowered 51→49 by the gate-hardening adoption PR: skill_collision_clusters and skill_overlap were repointed at the live skills tree via the shared resolver — two gates that had been reading the retired container and scoring 0 of 288 skills."
5
+ "count": 48,
6
+ "landed": "2026-08-09",
7
+ "note": "Lines under src/scripts/**/*.{ts,mts,mjs} that pass the retired `.agent-src.uncondensed` directory into `path.join(...)` — a filesystem path CONSTRUCTED against the tree ADR-051 abandoned, which is the exact shape of all 14 dead gates. Deliberately narrow so the number is signal, not noise: 236 raw mentions under src/scripts → 147 string-literal lines → 67 path-constructing lines when the pass was written, after exempting src/scripts/_lib/agent_src.ts (the shared resolver, whose job IS owning the constant — gates that route through it survived the move). Detectors holding the literal as data to match, strip, or print are not counted, and no prose, docs, tests or fixtures are read: that full-tree shape was measured at 44 files / 213 hits and rejected as the wrong lint (see the note in check_no_new_legacy_path.ts::find_offenders). Recorded at 58 rather than 67 because Phase 1's scan-root repairs were landing on this branch while the pass was being written and had already removed 9 — a baseline above the truth silently permits new violations. This count goes to ZERO as the remaining repairs land; every repair is a lowering commit. Lowered 56→51 by the road-to-renewal-foundation Phase 1 dead-root sweep (check_always_budget, check_portability, check_references, lint_framework_leakage, lint_agents_md). Lowered 51→49 by the gate-hardening adoption PR: skill_collision_clusters and skill_overlap were repointed at the live skills tree via the shared resolver — two gates that had been reading the retired container and scoring 0 of 288 skills. Lowered 49→48 by road-to-rule-delivery-integrity P2.2: score_skill_selection was repointed at the live skills tree via the shared resolver. It is the same shape as the two gates lowered before it — a scorer reading the retired container and scoring 0 of 288 skills — and here the consequence was sharper than a dead gate: the roadmap's pre-registered selection-accuracy criteria would have been compared against a baseline of silent zeros."
8
8
  },
9
9
  "audit_user_type_axis": {
10
10
  "count": 1,