@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.
- package/.claude-plugin/marketplace.json +1 -1
- package/AGENTS.md +13 -12
- package/CHANGELOG.md +165 -0
- package/README.md +1 -1
- package/agents/templates/.ai-council.yml.example +55 -24
- package/dist/agent-src/commands/analyze/conformance.md +24 -0
- package/dist/agent-src/commands/cost/report.md +2 -2
- package/dist/agent-src/commands/team/adversarial.md +8 -7
- package/dist/agent-src/commands/team/delegate.md +13 -12
- package/dist/agent-src/commands/team/review.md +9 -8
- package/dist/agent-src/commands/team/status.md +9 -8
- package/dist/agent-src/commands/team.md +29 -19
- package/dist/agent-src/contexts/execution/auto-dispatch-classification.md +88 -2
- package/dist/agent-src/contexts/execution/auto-orchestration-activation.md +29 -21
- package/dist/agent-src/contexts/execution/host-capability-manifest.md +26 -15
- package/dist/agent-src/contexts/execution/orchestration-telemetry.md +28 -3
- package/dist/agent-src/contexts/execution/subagent-response-contract.md +54 -0
- package/dist/agent-src/contexts/execution/subagent-routing.md +13 -11
- package/dist/agent-src/contexts/execution/subagent-spawn-contract.md +25 -0
- package/dist/agent-src/contexts/execution/subagent-steering.md +6 -3
- package/dist/agent-src/rules/artifact-engagement-recording.md +4 -1
- package/dist/agent-src/rules/autonomous-execution.md +1 -1
- package/dist/agent-src/rules/brand-source-of-truth.md +33 -6
- package/dist/agent-src/rules/context-hygiene.md +3 -1
- package/dist/agent-src/rules/council-availability.md +93 -0
- package/dist/agent-src/rules/cross-source-consistency.md +3 -0
- package/dist/agent-src/rules/delegation-policy.md +38 -10
- package/dist/agent-src/rules/design-fidelity.md +3 -0
- package/dist/agent-src/rules/evaluator-independence.md +2 -1
- package/dist/agent-src/rules/external-code-graph-interop.md +2 -1
- package/dist/agent-src/rules/finance-safety-floor.md +1 -1
- package/dist/agent-src/rules/git-history-discipline.md +1 -1
- package/dist/agent-src/rules/history-discipline.md +3 -1
- package/dist/agent-src/rules/legal-safety-floor.md +1 -1
- package/dist/agent-src/rules/no-pr-progress-comments.md +3 -1
- package/dist/agent-src/rules/onboarding-gate.md +3 -1
- package/dist/agent-src/rules/roadmap-ci-steps-policy.md +4 -1
- package/dist/agent-src/rules/role-mode-adherence.md +1 -1
- package/dist/agent-src/rules/scale-discipline.md +3 -1
- package/dist/agent-src/rules/self-repair-loop.md +103 -0
- package/dist/agent-src/rules/session-canary.md +2 -1
- package/dist/agent-src/rules/settings-ask-protocol.md +8 -7
- package/dist/agent-src/rules/strategy-safety-floor.md +1 -1
- package/dist/agent-src/rules/token-budget-discipline.md +4 -2
- package/dist/agent-src/rules/tool-safety.md +5 -1
- package/dist/agent-src/skills/adversarial-review/SKILL.md +1 -1
- package/dist/agent-src/skills/analysis-autonomous-mode/SKILL.md +1 -1
- package/dist/agent-src/skills/forensics-report/SKILL.md +114 -0
- package/dist/agent-src/skills/forensics-report/evals/triggers.json +17 -0
- package/dist/agent-src/skills/performance-analysis/SKILL.md +1 -1
- package/dist/agent-src/skills/persona-improvement/SKILL.md +1 -1
- package/dist/agent-src/skills/premortem/SKILL.md +30 -1
- package/dist/agent-src/skills/project-analyzer/SKILL.md +1 -1
- package/dist/agent-src/skills/reasoning-orchestrator/SKILL.md +2 -1
- package/dist/agent-src/skills/security-audit/SKILL.md +1 -1
- package/dist/agent-src/skills/sequential-thinking/SKILL.md +1 -1
- package/dist/agent-src/skills/skill-improvement-pipeline/SKILL.md +1 -1
- package/dist/agent-src/skills/subagent-orchestration/SKILL.md +7 -5
- package/dist/agent-src/skills/subagent-orchestration/schemas/subagent-status.json +61 -3
- package/dist/agent-src/skills/test-case-discovery/SKILL.md +1 -1
- package/dist/agent-src/skills/universal-project-analysis/SKILL.md +1 -1
- package/dist/agent-src/templates/AGENTS.md +8 -12
- package/dist/agent-src/templates/agents/agent-project-settings.example.yml +1 -1
- package/dist/agent-src/templates/roadmaps.md +23 -0
- package/dist/cli/registry.js +7 -0
- package/dist/cli/registry.js.map +1 -1
- package/dist/cli-delegate/chunk-66OVWGB5.js +270 -0
- package/dist/cli-delegate/{chunk-HJ6DAJHR.js → chunk-LCFJIQ4J.js} +89 -7
- package/dist/cli-delegate/{chunk-VSYT7OHO.js → chunk-LVRYBKTI.js} +31 -2
- package/dist/cli-delegate/{chunk-DVRS2KVR.js → chunk-MMXA5GY7.js} +10 -17
- package/dist/cli-delegate/{chunk-WR6GTRHJ.js → chunk-MP3JT3IU.js} +3 -3
- package/dist/cli-delegate/{chunk-3KJIMFTB.js → chunk-NZ5N2XQL.js} +467 -305
- package/dist/cli-delegate/{chunk-AIIUU73N.js → chunk-OJM3MBJM.js} +1 -1
- package/dist/cli-delegate/{chunk-BCPIOAGV.js → chunk-RCIA67XN.js} +117 -96
- package/dist/cli-delegate/chunk-REKCMYOU.js +2991 -0
- package/dist/cli-delegate/cmd_analyze_session.js +1 -1
- package/dist/cli-delegate/cmd_brand_status.js +134 -0
- package/dist/cli-delegate/cmd_conformance.js +10 -47
- package/dist/cli-delegate/cmd_converge.js +3 -3
- package/dist/cli-delegate/cmd_doctor.js +10 -6
- package/dist/cli-delegate/cmd_explain.js +80 -330
- package/dist/cli-delegate/cmd_export.js +6 -6
- package/dist/cli-delegate/cmd_fleet.js +3 -3
- package/dist/cli-delegate/cmd_handoff.js +3 -3
- package/dist/cli-delegate/cmd_mcp_available.js +433 -0
- package/dist/cli-delegate/cmd_migrate.js +3 -3
- package/dist/cli-delegate/cmd_packs_active.js +153 -0
- package/dist/cli-delegate/cmd_preflight.js +1 -1
- package/dist/cli-delegate/cmd_prune.js +6 -6
- package/dist/cli-delegate/cmd_route_audit.js +8 -8
- package/dist/cli-delegate/cmd_route_explain.js +4 -4
- package/dist/cli-delegate/cmd_settings_get.js +266 -0
- package/dist/cli-delegate/cmd_settings_migrate.js +6 -6
- package/dist/cli-delegate/cmd_settings_set.js +8 -2968
- package/dist/cli-delegate/cmd_sync.js +6 -6
- package/dist/cli-delegate/cmd_uninstall.js +6 -6
- package/dist/cli-delegate/cmd_update.js +4 -4
- package/dist/cli-delegate/cmd_upgrade.js +4 -4
- package/dist/cli-delegate/cmd_validate.js +6 -6
- package/dist/cli-delegate/cmd_versions.js +4 -4
- package/dist/discovery/deprecation-report.md +1 -1
- package/dist/discovery/discovery-manifest.json +164 -55
- package/dist/discovery/discovery-manifest.json.sha256 +1 -1
- package/dist/discovery/discovery-manifest.summary.md +4 -3
- package/dist/discovery/orphan-report.md +1 -1
- package/dist/discovery/packs.json +44 -5
- package/dist/discovery/trust-report.md +11 -11
- package/dist/discovery/workspaces.json +16 -6
- package/dist/hooks/dispatch.js +9341 -6131
- package/dist/install/install.mjs +739 -524
- package/dist/mcp/registry-manifest.json +3 -3
- package/dist/mcp/server.json +2 -2
- package/dist/mcp/server.mjs +777 -281
- package/dist/router.json +1 -1
- package/dist/scripts/_lib/agent_settings.js +134 -15
- package/dist/scripts/_lib/agent_settings.js.map +1 -1
- package/dist/scripts/condense.js +147 -2
- package/dist/scripts/condense.js.map +1 -1
- package/dist/server/schemas/settings.js +6 -7
- package/dist/server/schemas/settings.js.map +1 -1
- package/dist/shared/settingsCarveOut.js +0 -9
- package/dist/shared/settingsCarveOut.js.map +1 -1
- package/dist/shared/settingsClasses.js +11 -9
- package/dist/shared/settingsClasses.js.map +1 -1
- package/dist/ui/assets/{index-DmR0mbk4.js → index-JDAF00bC.js} +2 -2
- package/dist/ui/assets/{index-DmR0mbk4.js.map → index-JDAF00bC.js.map} +1 -1
- package/dist/ui/index.html +1 -1
- package/docs/contracts/settings-classes.md +68 -17
- package/docs/guidelines/agent-infra/memory-access.md +14 -3
- package/package.json +1 -1
- package/src/agent-src/templates/AGENTS.md +8 -12
- package/src/config/agent-settings.template.yml +52 -66
- package/src/config/budgets.yml +29 -0
- package/src/config/discovery/packs.yml +11 -0
- package/src/config/discovery/workspaces.yml +1 -1
- package/src/config/evaluator-budgets.json +4 -4
- package/src/config/gate-coverage.yml +26 -0
- package/src/config/gate-violation-baselines.json +3 -3
- package/src/scripts/_cli/cmd_brand_status.ts +174 -0
- package/src/scripts/_cli/cmd_conformance.ts +14 -42
- package/src/scripts/_cli/cmd_doctor.ts +65 -48
- package/src/scripts/_cli/cmd_mcp_available.ts +266 -0
- package/src/scripts/_cli/cmd_packs_active.ts +225 -0
- package/src/scripts/_cli/cmd_settings_get.ts +324 -0
- package/src/scripts/_dispatch.bash +57 -0
- package/src/scripts/_lib/agent_settings.ts +140 -16
- package/src/scripts/_lib/auto_dispatch.corpus.test.ts +1 -1
- package/src/scripts/_lib/auto_dispatch.ts +23 -18
- package/src/scripts/_lib/capsule_trigger.ts +124 -0
- package/src/scripts/_lib/carrier_divergence.ts +135 -0
- package/src/scripts/_lib/host_capability.ts +144 -4
- package/src/scripts/_lib/judgment_ladder.ts +382 -0
- package/src/scripts/_lib/orchestration_gate.ts +8 -0
- package/src/scripts/_lib/orchestration_record.ts +37 -0
- package/src/scripts/_lib/orchestration_savings.ts +1 -1
- package/src/scripts/_lib/prompt_shape.ts +88 -0
- package/src/scripts/_lib/review_skipped_record.ts +102 -0
- package/src/scripts/_lib/rule_layer_overlap.ts +254 -0
- package/src/scripts/_lib/self_repair.ts +489 -0
- package/src/scripts/_lib/self_repair_store.ts +128 -0
- package/src/scripts/_lib/subagent_capsule.ts +182 -0
- package/src/scripts/_lib/subagent_response.ts +19 -0
- package/src/scripts/_lib/subagent_spawn.ts +13 -0
- package/src/scripts/_lib/subagent_steering.ts +9 -4
- package/src/scripts/_lib/tier_budget_routing.ts +6 -1
- package/src/scripts/_lib/transcript_entry.ts +80 -0
- package/src/scripts/_lib/worker_budget.ts +37 -2
- package/src/scripts/ai_council/clients.ts +76 -54
- package/src/scripts/ai_council/config.ts +94 -6
- package/src/scripts/ai_council/handoff.ts +113 -0
- package/src/scripts/ai_council/modes.ts +19 -4
- package/src/scripts/ai_council/orchestrator.ts +105 -0
- package/src/scripts/ai_council/quorum.ts +84 -0
- package/src/scripts/ai_council/session.ts +44 -0
- package/src/scripts/ai_council/transport_resolver.ts +127 -1
- package/src/scripts/ai_team/availability.ts +110 -0
- package/src/scripts/ai_team/config.ts +34 -14
- package/src/scripts/ai_team/team_dispatch.ts +71 -29
- package/src/scripts/bench_critic_protocol.ts +396 -0
- package/src/scripts/check_branch_freshness.ts +255 -0
- package/src/scripts/check_council_config_location.ts +125 -1
- package/src/scripts/check_detector_corpus.ts +202 -0
- package/src/scripts/check_hook_bundle_freshness.ts +4 -1
- package/src/scripts/check_standing_rule_delivery.ts +314 -0
- package/src/scripts/condense.ts +162 -2
- package/src/scripts/config/profiles.ts +13 -3
- package/src/scripts/conformance_scan.ts +272 -24
- package/src/scripts/council_availability_hook.ts +188 -0
- package/src/scripts/council_cli.ts +527 -32
- package/src/scripts/forensics_report.ts +333 -0
- package/src/scripts/hook_manifest.yaml +107 -26
- package/src/scripts/hooks/block_no_verify.ts +39 -2
- package/src/scripts/hooks/block_unauthorized_git.ts +156 -7
- package/src/scripts/hooks/concern_registry.ts +10 -0
- package/src/scripts/hooks/delegation_nudge_hook.ts +484 -0
- package/src/scripts/hooks/end_review_nudge_hook.ts +726 -0
- package/src/scripts/hooks/orchestration_record_hook.ts +342 -0
- package/src/scripts/install.ts +151 -0
- package/src/scripts/language_mirror_hook.ts +30 -37
- package/src/scripts/lint_discovery_vocabulary.ts +2 -0
- package/src/scripts/lint_never_silent.ts +276 -0
- package/src/scripts/lint_no_activation_gates.ts +271 -0
- package/src/scripts/measure_scope_dedup.ts +19 -13
- package/src/scripts/onboarding_gate_hook.ts +40 -1
- package/src/scripts/orchestration_record.ts +12 -1
- package/src/scripts/preamble_byte_census.ts +9 -20
- package/src/scripts/rebuild_hook_bundle.ts +177 -0
- package/src/scripts/release.ts +74 -2
- package/src/scripts/report_carrier_divergence.ts +364 -0
- package/src/scripts/report_skill_activation.ts +257 -0
- package/src/scripts/report_skill_obligation_violations.ts +579 -0
- package/src/scripts/routing_doctor.ts +95 -39
- package/src/scripts/score_skill_selection.ts +19 -5
- package/src/scripts/self_repair_cli.ts +470 -0
- package/src/scripts/self_repair_hook.ts +241 -0
- package/src/scripts/team_events_spike.ts +271 -0
- package/src/scripts/team_review_gate_hook.ts +31 -9
- package/src/server/schemas/settings.ts +10 -17
- package/src/shared/settingsCarveOut.ts +0 -10
- package/src/shared/settingsClasses.ts +11 -9
package/dist/ui/index.html
CHANGED
|
@@ -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-
|
|
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.**
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
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 |
|
|
118
|
-
| **Total** | **
|
|
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
|
|
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**
|
|
54
|
-
entries promoted to curated get shared. `retrieve()`
|
|
55
|
-
intake (low-confidence tier); it just never reaches the team
|
|
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.
|
|
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/` |
|
|
17
|
-
| Project layer | `agents/`, `agents/overrides/`, `.agent-settings.yml` | your customizations
|
|
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
|
|
22
|
-
- **Behavior rules (always active)** — [`.augment/rules/`](.augment/rules/). Kernel rules are **immutable
|
|
23
|
-
- **Skills (on-demand expertise)** — domain skills surfaced by description
|
|
24
|
-
- **Commands (workflows)** — slash-commands the agent runs end-to-end (`/work`, `/
|
|
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).
|
|
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
|
-
#
|
|
747
|
-
# subagent
|
|
748
|
-
# auto
|
|
749
|
-
#
|
|
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
|
-
#
|
|
882
|
-
#
|
|
883
|
-
#
|
|
884
|
-
#
|
|
885
|
-
#
|
|
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
|
|
901
|
-
#
|
|
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
|
package/src/config/budgets.yml
CHANGED
|
@@ -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":
|
|
62
|
-
"last_measured":
|
|
63
|
-
"last_measured_at": "2026-08-
|
|
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":
|
|
6
|
-
"landed": "2026-08-
|
|
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,
|