@event4u/agent-config 9.27.0 → 9.28.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 (138) hide show
  1. package/.claude-plugin/marketplace.json +1 -1
  2. package/AGENTS.md +12 -11
  3. package/CHANGELOG.md +99 -0
  4. package/README.md +1 -1
  5. package/dist/agent-src/commands/analyze/conformance.md +24 -0
  6. package/dist/agent-src/contexts/execution/orchestration-telemetry.md +10 -3
  7. package/dist/agent-src/rules/artifact-engagement-recording.md +4 -1
  8. package/dist/agent-src/rules/autonomous-execution.md +1 -1
  9. package/dist/agent-src/rules/brand-source-of-truth.md +33 -6
  10. package/dist/agent-src/rules/context-hygiene.md +3 -1
  11. package/dist/agent-src/rules/council-availability.md +93 -0
  12. package/dist/agent-src/rules/cross-source-consistency.md +3 -0
  13. package/dist/agent-src/rules/delegation-policy.md +29 -5
  14. package/dist/agent-src/rules/design-fidelity.md +3 -0
  15. package/dist/agent-src/rules/evaluator-independence.md +2 -1
  16. package/dist/agent-src/rules/external-code-graph-interop.md +2 -1
  17. package/dist/agent-src/rules/finance-safety-floor.md +1 -1
  18. package/dist/agent-src/rules/git-history-discipline.md +1 -1
  19. package/dist/agent-src/rules/history-discipline.md +3 -1
  20. package/dist/agent-src/rules/legal-safety-floor.md +1 -1
  21. package/dist/agent-src/rules/no-pr-progress-comments.md +3 -1
  22. package/dist/agent-src/rules/onboarding-gate.md +3 -1
  23. package/dist/agent-src/rules/roadmap-ci-steps-policy.md +4 -1
  24. package/dist/agent-src/rules/role-mode-adherence.md +1 -1
  25. package/dist/agent-src/rules/scale-discipline.md +3 -1
  26. package/dist/agent-src/rules/self-repair-loop.md +103 -0
  27. package/dist/agent-src/rules/session-canary.md +2 -1
  28. package/dist/agent-src/rules/strategy-safety-floor.md +1 -1
  29. package/dist/agent-src/rules/token-budget-discipline.md +3 -1
  30. package/dist/agent-src/rules/tool-safety.md +5 -1
  31. package/dist/agent-src/skills/adversarial-review/SKILL.md +1 -1
  32. package/dist/agent-src/skills/analysis-autonomous-mode/SKILL.md +1 -1
  33. package/dist/agent-src/skills/performance-analysis/SKILL.md +1 -1
  34. package/dist/agent-src/skills/persona-improvement/SKILL.md +1 -1
  35. package/dist/agent-src/skills/project-analyzer/SKILL.md +1 -1
  36. package/dist/agent-src/skills/security-audit/SKILL.md +1 -1
  37. package/dist/agent-src/skills/sequential-thinking/SKILL.md +1 -1
  38. package/dist/agent-src/skills/skill-improvement-pipeline/SKILL.md +1 -1
  39. package/dist/agent-src/skills/universal-project-analysis/SKILL.md +1 -1
  40. package/dist/agent-src/templates/AGENTS.md +6 -10
  41. package/dist/agent-src/templates/agents/agent-project-settings.example.yml +1 -1
  42. package/dist/cli/registry.js +7 -0
  43. package/dist/cli/registry.js.map +1 -1
  44. package/dist/cli-delegate/chunk-22GCIJ2O.js +270 -0
  45. package/dist/cli-delegate/{chunk-BCPIOAGV.js → chunk-2BE5I2MN.js} +8 -8
  46. package/dist/cli-delegate/{chunk-AIIUU73N.js → chunk-7OMQCH4V.js} +1 -1
  47. package/dist/cli-delegate/{chunk-HJ6DAJHR.js → chunk-GB2FSUEE.js} +57 -7
  48. package/dist/cli-delegate/{chunk-WR6GTRHJ.js → chunk-JXARCGVN.js} +3 -3
  49. package/dist/cli-delegate/{chunk-3KJIMFTB.js → chunk-PQSAQKHW.js} +466 -304
  50. package/dist/cli-delegate/chunk-REKCMYOU.js +2991 -0
  51. package/dist/cli-delegate/cmd_analyze_session.js +1 -1
  52. package/dist/cli-delegate/cmd_brand_status.js +134 -0
  53. package/dist/cli-delegate/cmd_conformance.js +7 -7
  54. package/dist/cli-delegate/cmd_converge.js +3 -3
  55. package/dist/cli-delegate/cmd_doctor.js +4 -4
  56. package/dist/cli-delegate/cmd_explain.js +80 -330
  57. package/dist/cli-delegate/cmd_export.js +5 -5
  58. package/dist/cli-delegate/cmd_fleet.js +3 -3
  59. package/dist/cli-delegate/cmd_handoff.js +2 -2
  60. package/dist/cli-delegate/cmd_mcp_available.js +433 -0
  61. package/dist/cli-delegate/cmd_migrate.js +3 -3
  62. package/dist/cli-delegate/cmd_packs_active.js +153 -0
  63. package/dist/cli-delegate/cmd_preflight.js +1 -1
  64. package/dist/cli-delegate/cmd_prune.js +5 -5
  65. package/dist/cli-delegate/cmd_route_audit.js +8 -8
  66. package/dist/cli-delegate/cmd_route_explain.js +4 -4
  67. package/dist/cli-delegate/cmd_settings_get.js +272 -0
  68. package/dist/cli-delegate/cmd_settings_migrate.js +5 -5
  69. package/dist/cli-delegate/cmd_settings_set.js +7 -2967
  70. package/dist/cli-delegate/cmd_sync.js +5 -5
  71. package/dist/cli-delegate/cmd_uninstall.js +5 -5
  72. package/dist/cli-delegate/cmd_update.js +4 -4
  73. package/dist/cli-delegate/cmd_upgrade.js +4 -4
  74. package/dist/cli-delegate/cmd_validate.js +5 -5
  75. package/dist/cli-delegate/cmd_versions.js +4 -4
  76. package/dist/discovery/deprecation-report.md +1 -1
  77. package/dist/discovery/discovery-manifest.json +100 -40
  78. package/dist/discovery/discovery-manifest.json.sha256 +1 -1
  79. package/dist/discovery/discovery-manifest.summary.md +3 -3
  80. package/dist/discovery/orphan-report.md +1 -1
  81. package/dist/discovery/packs.json +7 -5
  82. package/dist/discovery/trust-report.md +11 -11
  83. package/dist/discovery/workspaces.json +6 -4
  84. package/dist/hooks/dispatch.js +9004 -6132
  85. package/dist/install/install.mjs +697 -507
  86. package/dist/mcp/registry-manifest.json +3 -3
  87. package/dist/mcp/server.json +2 -2
  88. package/dist/mcp/server.mjs +127 -20
  89. package/dist/router.json +1 -1
  90. package/dist/scripts/_lib/agent_settings.js +80 -15
  91. package/dist/scripts/_lib/agent_settings.js.map +1 -1
  92. package/docs/contracts/settings-classes.md +29 -8
  93. package/docs/guidelines/agent-infra/memory-access.md +14 -3
  94. package/package.json +1 -1
  95. package/src/agent-src/templates/AGENTS.md +6 -10
  96. package/src/config/budgets.yml +29 -0
  97. package/src/config/evaluator-budgets.json +4 -4
  98. package/src/config/gate-coverage.yml +26 -0
  99. package/src/scripts/_cli/cmd_brand_status.ts +174 -0
  100. package/src/scripts/_cli/cmd_mcp_available.ts +266 -0
  101. package/src/scripts/_cli/cmd_packs_active.ts +225 -0
  102. package/src/scripts/_cli/cmd_settings_get.ts +324 -0
  103. package/src/scripts/_dispatch.bash +57 -0
  104. package/src/scripts/_lib/agent_settings.ts +82 -16
  105. package/src/scripts/_lib/carrier_divergence.ts +135 -0
  106. package/src/scripts/_lib/host_capability.ts +84 -1
  107. package/src/scripts/_lib/prompt_shape.ts +88 -0
  108. package/src/scripts/_lib/review_skipped_record.ts +102 -0
  109. package/src/scripts/_lib/rule_layer_overlap.ts +254 -0
  110. package/src/scripts/_lib/self_repair.ts +342 -0
  111. package/src/scripts/_lib/self_repair_store.ts +100 -0
  112. package/src/scripts/_lib/transcript_entry.ts +80 -0
  113. package/src/scripts/check_branch_freshness.ts +255 -0
  114. package/src/scripts/check_council_config_location.ts +125 -1
  115. package/src/scripts/check_standing_rule_delivery.ts +314 -0
  116. package/src/scripts/config/profiles.ts +13 -3
  117. package/src/scripts/conformance_scan.ts +272 -24
  118. package/src/scripts/council_availability_hook.ts +188 -0
  119. package/src/scripts/council_cli.ts +126 -7
  120. package/src/scripts/hook_manifest.yaml +107 -26
  121. package/src/scripts/hooks/block_no_verify.ts +39 -2
  122. package/src/scripts/hooks/block_unauthorized_git.ts +156 -7
  123. package/src/scripts/hooks/concern_registry.ts +10 -0
  124. package/src/scripts/hooks/delegation_nudge_hook.ts +450 -0
  125. package/src/scripts/hooks/end_review_nudge_hook.ts +726 -0
  126. package/src/scripts/hooks/orchestration_record_hook.ts +342 -0
  127. package/src/scripts/install.ts +151 -0
  128. package/src/scripts/language_mirror_hook.ts +30 -37
  129. package/src/scripts/measure_scope_dedup.ts +19 -13
  130. package/src/scripts/onboarding_gate_hook.ts +40 -1
  131. package/src/scripts/orchestration_record.ts +4 -1
  132. package/src/scripts/preamble_byte_census.ts +9 -20
  133. package/src/scripts/report_carrier_divergence.ts +364 -0
  134. package/src/scripts/report_skill_activation.ts +257 -0
  135. package/src/scripts/report_skill_obligation_violations.ts +579 -0
  136. package/src/scripts/routing_doctor.ts +77 -6
  137. package/src/scripts/self_repair_cli.ts +240 -0
  138. package/src/scripts/self_repair_hook.ts +241 -0
@@ -6,7 +6,7 @@
6
6
  },
7
7
  "metadata": {
8
8
  "description": "Bootstrap shim for the event4u agent-config suite. This plugin ships ONLY the dispatcher hooks plus one install-pointer skill — ALL content (skills, rules, commands) is installed via `npx -y @event4u/agent-config init`, which writes the file projection AND registers the same hooks in ~/.claude/settings.json. DEPRECATED as a content channel; kept so the marketplace listing stays discoverable and existing installs keep working hooks.",
9
- "version": "9.27.0",
9
+ "version": "9.28.0",
10
10
  "keywords": [
11
11
  "agent-config",
12
12
  "skills",
package/AGENTS.md CHANGED
@@ -4,30 +4,31 @@
4
4
 
5
5
  ## Source of truth
6
6
 
7
- Edit `src/` only (`src/skills`, `src/rules`, `src/agent-src/`). Generated trees regenerate from `task sync` + `task generate-tools`; never hand-edit.
7
+ Edit `src/` only (`skills`, `rules`, `agent-src`). `task sync` + `task generate-tools` regenerate the rest; never hand-edit.
8
8
 
9
9
  ## Working on this repo
10
10
 
11
11
  ```bash
12
- task sync # regenerate dist/agent-src/, .augment/
13
- task generate-tools # regenerate .claude/, .cursor/, .clinerules/, .windsurfrules
14
- task ci # full pipeline — green before PR
15
- # maintainer: AGENT_CONFIG_DEV_MODE=1 opens --scope=project (docs/maintainers/dev-mode.md)
12
+ task sync # dist/agent-src/, .augment/
13
+ task generate-tools # .claude/, .cursor/, .clinerules/, .windsurfrules
14
+ task ci # full pipeline, green before PR
15
+ # maintainer: AGENT_CONFIG_DEV_MODE=1 -> --scope=project (docs/maintainers/dev-mode.md)
16
16
  ```
17
17
 
18
18
  ## Pointers
19
19
 
20
20
  - **Self-orientation**: [`package-self-orientation`](docs/contracts/package-self-orientation.md).
21
- - **System map (maintainers)**: [`system-map`](docs/maintainers/system-map.md) — the one-page how-it-fits-together.
22
- - **Kernel + Router** — 9 Iron-Law rules, tier-1/2 routing: [`kernel-membership`](docs/contracts/kernel-membership.md) + [`rule-router`](docs/contracts/rule-router.md).
23
- - **Trust & Safety** — enum, HRR banner, floors: [`trust-and-safety`](docs/contracts/trust-and-safety.md) + [`ADR-018`](docs/decisions/ADR-018-trust-and-safety-layer.md).
21
+ - **System map (maintainers)**: [`system-map`](docs/maintainers/system-map.md) — one-page overview.
22
+ - **Kernel + Router** — 9 Iron-Law rules + routing: [`kernel-membership`](docs/contracts/kernel-membership.md) + [`rule-router`](docs/contracts/rule-router.md).
23
+ - **Trust & Safety** — enum + floors: [`trust-and-safety`](docs/contracts/trust-and-safety.md) + [`ADR-018`](docs/decisions/ADR-018-trust-and-safety-layer.md).
24
24
  - **Content pipelines** (A→D): [`docs/architecture.md`](docs/architecture.md).
25
25
  - **Editing this repo**: [`source-of-truth`](src/rules/source-of-truth.md) + [`agents-md-thin-root`](src/skills/agents-md-thin-root/SKILL.md).
26
26
  - **Consumer story** — `npx` + `scripts/install.sh`: [`README.md`](README.md).
27
- - **Personas** — 34 lenses (5 core + 24 specialists + 5 advisors): [`docs/personas.md`](docs/personas.md).
28
- - **Discovery** — workspaces/packs: [`ADR-013`](docs/decisions/ADR-013-discovery-frontmatter-contract.md) + [`customization`](docs/customization.md#workspaces--packs-discovery).
29
- - **Root & `agents/` layout** — `src/` = source ([`ADR-050`](docs/decisions/ADR-050-workspace-vs-package-root-boundary.md)); `agents/` contract: [`agents-layout`](docs/contracts/agents-layout.md).
27
+ - **Personas** — 34 lenses (core + specialists + advisors): [`docs/personas.md`](docs/personas.md).
28
+ - **Discovery** — workspaces/packs: [`ADR-013`](docs/decisions/ADR-013-discovery-frontmatter-contract.md) + [`customization`](docs/customization.md).
29
+ - **Root & `agents/` layout** — `src/` = source ([`ADR-050`](docs/decisions/ADR-050-workspace-vs-package-root-boundary.md)); contract: [`agents-layout`](docs/contracts/agents-layout.md).
30
30
  - **Security** — [`SECURITY.md`](SECURITY.md); [`docs/threat-model.md`](docs/threat-model.md).
31
+ - **Delegate & review**: subagents take independent-slice work, not serial; no mutating session ends without neutral review — [`delegation-policy`](dist/agent-src/rules/delegation-policy.md).
31
32
 
32
33
  ## Emergency triage — when nothing else is reachable
33
34
 
package/CHANGELOG.md CHANGED
@@ -312,6 +312,105 @@ Entry-shape contract: [`docs/contracts/CHANGELOG-conventions.md`](docs/contracts
312
312
  > that forces a new era split (`# Era: 9.28.x`, etc.) — see
313
313
  > [`docs/contracts/CHANGELOG-conventions.md § Era splits`](docs/contracts/CHANGELOG-conventions.md).
314
314
 
315
+ ## [9.28.0](https://github.com/event4u-app/agent-config/compare/9.27.0...9.28.0) (2026-08-09)
316
+
317
+ ### Release highlights
318
+
319
+ <!-- Curated head: fill before merge, keep it under 10 lines, and leave `_none_` where it is genuinely the answer. The generated log below is unchanged. -->
320
+ - **Behaviour changes:** _auto-derived, rewrite before merge:_ rule/schema diffs, breaking commits or removed public surface in 63825ba, 9cd21cb, ae6f30e, 3d684ef, 909235c, 103a22b +2 more.
321
+ - **Default changes + migration:** _none_
322
+ - **Security and correctness:** _none_
323
+ - **Honest nulls:** _auto-derived, rewrite before merge:_ commits carrying an honest-null marker in 2837fb7.
324
+ - **Known limitations:** _none_
325
+
326
+ ### Features
327
+
328
+ * **hooks:** register the three orchestrator-discipline concerns ([b170fbc](https://github.com/event4u-app/agent-config/commit/b170fbc9c8a90bdb69ba97929a8c13b08c90ccb3))
329
+ * **hooks:** advisory end-review-nudge concern on stop ([3d2c1a0](https://github.com/event4u-app/agent-config/commit/3d2c1a0bc1087960d634e1d489867da78069ed8c))
330
+ * **hooks:** conditional delegation-nudge concern on user_prompt_submit ([761b793](https://github.com/event4u-app/agent-config/commit/761b793ad2e9a9371ade2272848e2d7aa856faae))
331
+ * **hooks:** deterministic orchestration-record concern on post_tool_use ([36e24c9](https://github.com/event4u-app/agent-config/commit/36e24c936e8e05281220574fbe9e924bd787c152))
332
+ * **host-capability:** committed registry for known hosts ([04e31f7](https://github.com/event4u-app/agent-config/commit/04e31f7c6274815db376fd545869f4bb80a3d225))
333
+ * **cli:** four capability probes for the gaps that had none ([909235c](https://github.com/event4u-app/agent-config/commit/909235ce713beaafec0dc0560ae21d47fca3df2e))
334
+ * **scripts:** measure the rule tokens a session actually receives ([406f986](https://github.com/event4u-app/agent-config/commit/406f98647fe3fca8a25cfa8f7a2e447f787bd5a6))
335
+ * **install:** refuse to create a silently doubled rule corpus ([9f2608f](https://github.com/event4u-app/agent-config/commit/9f2608f8da62ccf4ba2873845e4117b61cb91280))
336
+ * **rules:** detect when the rule corpus is delivered twice ([d9b6618](https://github.com/event4u-app/agent-config/commit/d9b6618c96f1cc0a328ac5e677ef16eb340b0c84))
337
+ * **scripts:** SK-2 loaded-but-violated, and the 3-of-110 coverage that is the finding ([2837fb7](https://github.com/event4u-app/agent-config/commit/2837fb7c1f44b303f97a6eb61c497679f36020ae))
338
+ * **conformance:** delivered rule payload by carrier, and the forward rate series ([78c19fd](https://github.com/event4u-app/agent-config/commit/78c19fdb1af6c02e81802da33f2e593e2599b9e1))
339
+ * **scripts:** name the rules the two carriers deliver differently ([cc6c8fb](https://github.com/event4u-app/agent-config/commit/cc6c8fbd307e4dc65ee4716208cd50084b32cf36))
340
+ * **wiring:** bind the self-repair concern and register its two CLI verbs ([a619cfc](https://github.com/event4u-app/agent-config/commit/a619cfc982965fb77a5c02f8480108be80661c92))
341
+ * **rules:** the self-repair loop as an always-loaded obligation ([cb8d560](https://github.com/event4u-app/agent-config/commit/cb8d56076ac09b351a565216b98a68789acd5e60))
342
+ * **self-repair:** detect agent defects and queue them as fixable records ([76b95ec](https://github.com/event4u-app/agent-config/commit/76b95ec7a524d482f333b701015f0a490cc4907d))
343
+ * **gate:** fail when no always-loaded rule carries the council user-global fact ([a56f28b](https://github.com/event4u-app/agent-config/commit/a56f28bf436c24b8f803711fa546ba713412c5c3))
344
+ * **rules:** carry the council user-global fact on the always-loaded surface ([36a0e4c](https://github.com/event4u-app/agent-config/commit/36a0e4cc6af6e83a47d120718a0fed7b5abb13cb))
345
+ * **gates:** refuse a push from a branch behind its base, asked of the remote ([bbdac53](https://github.com/event4u-app/agent-config/commit/bbdac539f5f3f2c8e86113f2a6a3a184a253a239))
346
+ * **report:** skill-activation census — the unmeasurable half, measured ([5719fd0](https://github.com/event4u-app/agent-config/commit/5719fd09e723bc7988fc0e90719c46d8a5f222f1))
347
+
348
+ ### Bug Fixes
349
+
350
+ * **routing-doctor:** report whether the platform was observed or assumed ([2c176b2](https://github.com/event4u-app/agent-config/commit/2c176b212021bc05421233cb724677d4a1e44697))
351
+ * **routing-doctor:** resolve host capabilities through the committed registry ([9875177](https://github.com/event4u-app/agent-config/commit/9875177b73b65810eaae9e2c1a8f2c66c8648da3))
352
+ * **hooks:** harden transcript read, full session key, mutation-measure flag ([c908bbf](https://github.com/event4u-app/agent-config/commit/c908bbf41c944a9564dfd0efc9198472693a7f36))
353
+ * **ci:** ADR frontmatter and three consumer paths the reference gate read as repo paths ([9cd21cb](https://github.com/event4u-app/agent-config/commit/9cd21cb4182c205205b49f352c0a1745e11ff33e))
354
+ * **build:** rebuild the install bundle for the settings-cascade change ([dbcb658](https://github.com/event4u-app/agent-config/commit/dbcb658c51a31b7af028f0d745db4d23b3b5bf35))
355
+ * **settings:** four adjacent path defects that made the intuitive file wrong ([ae6f30e](https://github.com/event4u-app/agent-config/commit/ae6f30ee29c3e79bff20501adbfd394489de53df))
356
+ * **build:** rebuild the committed install bundle for the install.ts change ([0d362ce](https://github.com/event4u-app/agent-config/commit/0d362ce2242debe7fffc798e457fcad02a0e6426))
357
+ * **roadmap:** conform the Risk Register to the R1 gate grammar ([8a4f388](https://github.com/event4u-app/agent-config/commit/8a4f388c67d5351bbea7c76faf631dbd40a5aa29))
358
+ * **roadmap:** inline the council provenance instead of linking a path that rots ([5268154](https://github.com/event4u-app/agent-config/commit/5268154d686717d7ff64deb059c78779607c27b6))
359
+ * **skills:** lead nine descriptions with what they do, not with the guard ([bee0a72](https://github.com/event4u-app/agent-config/commit/bee0a72f90c97c67b57a949ac3c0d85756ad4db8))
360
+ * **scripts:** repair the round-2 review findings, incl. a second inverted polarity ([6ab06f7](https://github.com/event4u-app/agent-config/commit/6ab06f759c02774f02f37dd5b85aaf6009da44d4))
361
+ * **scripts:** repair all 14 R2 completion-review findings ([0ee1275](https://github.com/event4u-app/agent-config/commit/0ee1275af82ae1dfbe1f0e6eaa48337e71905aa1))
362
+ * **rules:** condense both new rules and re-anchor the token baseline ([103a22b](https://github.com/event4u-app/agent-config/commit/103a22b10c8830e87bf28ab0dddebf02d6354f85))
363
+ * **tests:** name the retired container by role, not by its dead literal path ([d7147ce](https://github.com/event4u-app/agent-config/commit/d7147ce2f4940c7095c94c91e731243a6c0ee495))
364
+ * **cli:** list council:status in usage(), the trunk was red without it ([1ca2ad0](https://github.com/event4u-app/agent-config/commit/1ca2ad00648533595d1d48794fd551c6e4e437d6))
365
+ * **tests:** two suites left directories in the tracked tree, and a third gate read them ([df70f14](https://github.com/event4u-app/agent-config/commit/df70f1436a325d0da2167f86ea464ee4ea074556))
366
+ * **council:** the refusal messages named the wrong config file ([62c6872](https://github.com/event4u-app/agent-config/commit/62c6872fe4647bc057835466414268cbf6da6971))
367
+ * **council:** stop the agent inferring council availability from a project file ([45f46b5](https://github.com/event4u-app/agent-config/commit/45f46b521ec4cb16a6d3d22c8a0db3009a68ea84))
368
+ * **conformance:** one trigger definition, and the count it was hiding ([8e131b4](https://github.com/event4u-app/agent-config/commit/8e131b41371a25255193702a23fd5820490db415))
369
+ * **hooks:** block what bash runs, not what the splitter finds readable ([bbc9b11](https://github.com/event4u-app/agent-config/commit/bbc9b11a949e2b6aad074fa11723d75609423b23))
370
+
371
+ ### Documentation
372
+
373
+ * **review:** re-bind the R2 findings scope after the main merge ([8c85ea0](https://github.com/event4u-app/agent-config/commit/8c85ea05c707c0a379d3f8caf7c8c53d09df05fe))
374
+ * **review:** re-bind the R2 findings after the fix pass ([6728b67](https://github.com/event4u-app/agent-config/commit/6728b679853a9c4aea691d8348d060a4c892469d))
375
+ * **contexts:** carry the three open orchestrator-carrier decisions forward ([3c17c11](https://github.com/event4u-app/agent-config/commit/3c17c11f7246b0f2eb95e3e5904e9b43c0270b07))
376
+ * **review:** R2 completion-review findings for the closeout branch ([8217034](https://github.com/event4u-app/agent-config/commit/82170344f6fef8457c22ce125aa5adf51801a9fb))
377
+ * **roadmap:** close orchestrator-discipline-carriers on measured evidence ([e01b6f2](https://github.com/event4u-app/agent-config/commit/e01b6f284affa9bab5ec323e1c9c415962366fb7))
378
+ * **roadmap:** post-merge council pass, fd47df62 disposition, calibration biases ([ed8710d](https://github.com/event4u-app/agent-config/commit/ed8710d47bab07b4e428eac8f18b5560315d204e))
379
+ * **hooks:** correct stale cowork binding claim in delegation-nudge header ([d2f6e99](https://github.com/event4u-app/agent-config/commit/d2f6e99bf1a0ac11d0365f7854cab9177ff6692f))
380
+ * **roadmap:** orchestrator-discipline-carriers - measured defect, council pass, honest exits ([9a1798c](https://github.com/event4u-app/agent-config/commit/9a1798c6692f4c99c8cfcd418dbd2a9b1178b9cc))
381
+ * state the delegation and end-review obligations where sessions read ([63825ba](https://github.com/event4u-app/agent-config/commit/63825ba757524bbded04cf58e787585b4e3699e9))
382
+ * **rules:** make the capability answers reachable without knowing they exist ([3d684ef](https://github.com/event4u-app/agent-config/commit/3d684ef1403541fb707ec2a47026320dc734ae82))
383
+ * **roadmap:** the delivery-integrity roadmap, its council pass, and where it halts ([cd33314](https://github.com/event4u-app/agent-config/commit/cd333144c3a6636dd4209aa3c24e22b12484de77))
384
+ * **evidence:** three measurements behind the delivery findings ([cdf5b3f](https://github.com/event4u-app/agent-config/commit/cdf5b3f45165d374148ff87a3ba3240216c0d167))
385
+ * **contracts:** the router is compile-time, and no host reads it at runtime ([b1fdc72](https://github.com/event4u-app/agent-config/commit/b1fdc72a152d9d8250e713d8b5b8b482e3bd1acf))
386
+ * **roadmaps:** record what the two review rounds cost and the contract step I got wrong ([1e51900](https://github.com/event4u-app/agent-config/commit/1e51900fb143eb939bd8917d982ce76ff9fe6252))
387
+ * **reviews:** commit the binding completion-review artefact, re-bound to the shipping scope ([82e5909](https://github.com/event4u-app/agent-config/commit/82e5909e6ea5289b5f856f6343d38408e653b84b))
388
+ * **roadmaps:** close round 6 phases 3-4, and record the premises that came out false ([dc9b6b0](https://github.com/event4u-app/agent-config/commit/dc9b6b0a68ae3df99b1eee37d65bfc54edfd2d18))
389
+ * **gates:** the unregistered-emitter backstop covers one of the two emit shapes ([a032f0c](https://github.com/event4u-app/agent-config/commit/a032f0ccc2aceabf15ea92e1fcc86aa439d76e5f))
390
+ * **memory:** say which repo the intake sharing-boundary line describes ([466bdfc](https://github.com/event4u-app/agent-config/commit/466bdfcd050e58c47bef38a29fe7f24be59ffb51))
391
+ * **roadmap:** twelve places the agent must guess whether a capability exists ([9453c16](https://github.com/event4u-app/agent-config/commit/9453c162fd78f31f257eaea4dd5db68ff4513056))
392
+ * **roadmap:** the census, round 5 accounting, and a criterion that contradicted its own cancelled step ([3bac223](https://github.com/event4u-app/agent-config/commit/3bac22325f16287511c0f8dc3345a798cb0d47f6))
393
+ * **archive:** file superseded substrate-adoption roadmap ([f435453](https://github.com/event4u-app/agent-config/commit/f435453d3faa882a657b21475f467b13b332831e))
394
+ * **roadmap:** record the third #1208 defect, found by PR #1211 not by the review ([25d2d12](https://github.com/event4u-app/agent-config/commit/25d2d12e6f1c7ea56e7e99ba3fffd294638c3be5))
395
+ * **roadmap:** fold the challenge pass and four council verdicts into round 6 ([01f3286](https://github.com/event4u-app/agent-config/commit/01f3286d91ee34d155a175ce687679181602f838))
396
+
397
+ ### Refactoring
398
+
399
+ * **scripts:** one definition of the cross-carrier rule comparison ([0a22a90](https://github.com/event4u-app/agent-config/commit/0a22a901fc95ed13e28afc44ce9f84fba9c7c5e2))
400
+
401
+ ### Chores
402
+
403
+ * **tests:** drop dead subprocess scaffolding the changed-files lint surfaced ([2f786b9](https://github.com/event4u-app/agent-config/commit/2f786b91c31724561761a9489d118c3ccb50c7a6))
404
+ * **index:** regenerate index and catalog for the nine rewritten descriptions ([593330f](https://github.com/event4u-app/agent-config/commit/593330ff34e60711b40562b38e8eb880b45cc6c8))
405
+ * **tasks:** register the two new advisory reports as named tasks ([033732c](https://github.com/event4u-app/agent-config/commit/033732c56499f081ae614eed37a3fe43657bc01f))
406
+ * **generated:** reproject the council-availability rule after the probe rewrite ([9bac533](https://github.com/event4u-app/agent-config/commit/9bac533be54adad9f1d5bbe4b3965cbcf3c010eb))
407
+ * **generated:** counts, index, catalog, router, proof for the self-repair rule ([83e81ae](https://github.com/event4u-app/agent-config/commit/83e81ae48dc463d17f82edd89edd821f8b7fdb35))
408
+ * **generated:** router_rules count 108 -> 109 for the new routed rule ([bf00135](https://github.com/event4u-app/agent-config/commit/bf00135202a3ac84814a0324947dbecc57172bfd))
409
+ * **generated:** regenerate index, catalog, and router for the new rule ([188c434](https://github.com/event4u-app/agent-config/commit/188c4346428c7754b434bc86c4c3dfa8c8b203ee))
410
+ * **budgets:** record the 88 to 89 CLI verb move for council:status ([fa7404b](https://github.com/event4u-app/agent-config/commit/fa7404bf9483d241cd5d245cbc872cfd5406d851))
411
+
412
+ Tests: 12141 (+391 since 9.27.0)
413
+
315
414
  ## [9.27.0](https://github.com/event4u-app/agent-config/compare/9.26.0...9.27.0) (2026-08-07)
316
415
 
317
416
  ### Release highlights
package/README.md CHANGED
@@ -4,7 +4,7 @@
4
4
 
5
5
  [![Smoke](https://github.com/event4u-app/agent-config/actions/workflows/smoke.yml/badge.svg)](https://github.com/event4u-app/agent-config/actions/workflows/smoke.yml) [![Public install smoke (3 OS × 2 Node)](https://github.com/event4u-app/agent-config/actions/workflows/smoke-public-install.yml/badge.svg)](https://github.com/event4u-app/agent-config/actions/workflows/smoke-public-install.yml) [![npm](https://img.shields.io/npm/v/@event4u/agent-config?style=flat-square&label=npm&color=orange)](https://www.npmjs.com/package/@event4u/agent-config) [![agent-config MCP server](https://glama.ai/mcp/servers/event4u-app/agent-config/badges/score.svg)](https://glama.ai/mcp/servers/event4u-app/agent-config) [![MCP Toplist](https://mcptoplist.com/badge/glama%2Fevent4u-app%2Fagent-config.svg)](https://mcptoplist.com/server/glama%2Fevent4u-app%2Fagent-config)
6
6
 
7
- [![Skills](https://img.shields.io/badge/Skills-288-orange?style=flat-square)](dist/agent-src/skills/) [![Rules](https://img.shields.io/badge/Rules-114-orange?style=flat-square)](dist/agent-src/rules/) [![Commands](https://img.shields.io/badge/Commands-196-orange?style=flat-square)](dist/agent-src/commands/) [![Guidelines](https://img.shields.io/badge/Guidelines-104-orange?style=flat-square)](docs/guidelines/) [![Personas](https://img.shields.io/badge/Personas-29-orange?style=flat-square)](dist/agent-src/personas/) [![Advisors](https://img.shields.io/badge/Advisors-5-orange?style=flat-square)](dist/agent-src/personas/advisors/)
7
+ [![Skills](https://img.shields.io/badge/Skills-288-orange?style=flat-square)](dist/agent-src/skills/) [![Rules](https://img.shields.io/badge/Rules-116-orange?style=flat-square)](dist/agent-src/rules/) [![Commands](https://img.shields.io/badge/Commands-196-orange?style=flat-square)](dist/agent-src/commands/) [![Guidelines](https://img.shields.io/badge/Guidelines-104-orange?style=flat-square)](docs/guidelines/) [![Personas](https://img.shields.io/badge/Personas-29-orange?style=flat-square)](dist/agent-src/personas/) [![Advisors](https://img.shields.io/badge/Advisors-5-orange?style=flat-square)](dist/agent-src/personas/advisors/)
8
8
 
9
9
  **Try it in 30 seconds** — drop one read-only subagent into any repo and watch it gate "done": `@production-validator check this branch is actually done`. No wizard, no lock-in, nothing else installed — the [30-second wedge ↓](#quickstart) is the whole first step. Start at the proof, not the catalog: **[event4u-app.github.io/agent-config/proof/](https://event4u-app.github.io/agent-config/proof/)**.
10
10
 
@@ -82,6 +82,30 @@ is exactly why it is trustworthy and exactly why it is not sufficient.
82
82
 
83
83
  `--scan-only` stops here.
84
84
 
85
+ The report also carries the **delivered rule payload** split by carrier (project
86
+ projection vs machine-global install, chars/4) and the store's **language-pin
87
+ rate** against the 9.1-39.2 % band M5 observed — round-6 Phase 4.3/4.5. Two
88
+ readings of that block, both deliberate:
89
+
90
+ - The payload is measured from the carriers **as they stand at scan time**, never
91
+ per session. A transcript records no system or tools field and the carriers
92
+ change under the sessions, so a per-session figure would be a fabrication.
93
+ - The band verdict is withheld below 1 978 assistant turns — the smallest corpus
94
+ the band was derived from — so it reports on behaviour rather than on corpus
95
+ size.
96
+
97
+ ```bash
98
+ agent-config conformance:behavior --record # append to the default series
99
+ agent-config conformance:behavior --record <path> # or a path you choose
100
+ ```
101
+
102
+ `--record` is the forward capture: one line per run into the gitignored
103
+ `agents/runtime/state/conformance-rates.jsonl`, keyed by a **digest** of the
104
+ store path rather than the path itself (the real slug carries a real name and
105
+ often a customer identifier). The record has no field able to hold a path, a
106
+ prompt, or a session id. Without it the project-identity variable cannot be
107
+ recovered later, which is why cancelling the volume test required adding it.
108
+
85
109
  ### 2 — Read the transcripts (subagent fan-out)
86
110
 
87
111
  The scan cannot see a rule that has no gate: an ask handed over as a trailing
@@ -150,9 +150,16 @@ conformant audit-log-v1 line from the counts you already have:
150
150
  [--first-pass-success true|false] [--escalated true|false]
151
151
  ```
152
152
 
153
- A capture **hook** is the wrong tool here: the PostToolUse payload carries no
154
- subagent token usage — only the orchestrator sees it (via the run result) — and
155
- a hook would reverse the 2026-06-30 no-hook decision. Reader:
153
+ A capture **hook** is now the primary path where the host has a
154
+ `post_tool_use` slot: the 2026-08-07 transcript backfill measured that
155
+ SYNCHRONOUS dispatch results DO carry `resolvedModel` / `totalTokens` /
156
+ `usage` — the 2026-06-30 "payload carries no usage" premise held only for
157
+ async dispatches, which stay metrics-absent. The `orchestration-record`
158
+ concern (`src/scripts/hooks/orchestration_record_hook.ts`, registered in
159
+ `hook_manifest.yaml`) emits the line deterministically on every Agent/Task
160
+ completion; measured model-carried capture before it existed was 1 of 370
161
+ dispatches (0.27 %). The CLI above stays for hosts without the slot and for
162
+ orchestrator-side records the hook cannot see. Reader:
156
163
  `src/scripts/orchestration_savings_report.ts`.
157
164
 
158
165
  **`token_delta` sourcing priority:**
@@ -23,7 +23,10 @@ obligation_frequency: "per-task"
23
23
 
24
24
  **Iron Law.** After a `/implement-ticket` or `/work` phase-step, emit one
25
25
  `telemetry:record` call with consulted + applied ids when telemetry is
26
- enabled. Default-off; opt-in via `.agent-settings.yml`. Zero overhead when
26
+ enabled. Default-off; opt-in via `.agent-settings.yml` — which is the **project
27
+ layer of a cascade that starts user-global**, so never read a value or its
28
+ absence from that file alone; `agent-config settings:get <key>` reports the
29
+ value and the file it actually came from. Zero overhead when
27
30
  disabled. Recording contract + privacy floor:
28
31
  [`contexts/contracts/artifact-engagement-flow.md`](../contexts/contracts/artifact-engagement-flow.md).
29
32
 
@@ -67,7 +67,7 @@ ALLOWLIST > 20 ENTRIES IN ONE SESSION = THE LINTER IS WRONG.
67
67
  STOP. PROPOSE LINTER REDESIGN OR REMOVAL. DO NOT EXPAND THE ALLOWLIST FURTHER.
68
68
  ```
69
69
 
70
- Crossing 20 entries counts as the 3rd validation-target failure — fix the tool shape, not the list. Enforced at tool-call time by the `block-config-weakening` PreToolUse guard (`src/scripts/hooks/block_config_weakening.ts`): it counts allowlist entries added per session, warns from 5, and blocks past 20. Baselines and budget thresholds warn only — a rising count there may be a legitimate ratchet reset, which the edit alone cannot distinguish. Verify with the narrowest tool that proves the target green (a single `curl` / Playwright spec for HTTP/UI, the test runner with a `--filter`, an `xdebug` step-through) — never a meta-pipeline as per-iteration probe. Failed-attempt detail, suppression-sweep equivalents, probe-efficiency detail, and adaptive effort & stop (RDP): [`autonomy-mechanics § Validation-loop budget`](../contexts/execution/autonomy-mechanics.md).
70
+ Crossing 20 entries counts as the 3rd validation-target failure — fix the tool shape, not the list. Enforced at tool-call time by the `block-config-weakening` PreToolUse guard (`src/scripts/hooks/block_config_weakening.ts`) **on the three hosts that have a `pre_tool_use` slot at all** — augment, claude, cowork: it counts allowlist entries added per session, warns from 5, and blocks past 20. On cursor, cline, windsurf, gemini and copilot the guard has nowhere to bind, so there the cap is model-carried and "enforced at tool-call time" is not a claim this rule can make. Run `agent-config hooks:status` to see which slots are bound on the host you are actually on — the sibling rules `git-history-discipline` and `evaluator-independence` qualify the identical slot, and an unqualified claim here would read as a guarantee the manifest does not give. Baselines and budget thresholds warn only — a rising count there may be a legitimate ratchet reset, which the edit alone cannot distinguish. Verify with the narrowest tool that proves the target green (a single `curl` / Playwright spec for HTTP/UI, the test runner with a `--filter`, an `xdebug` step-through) — never a meta-pipeline as per-iteration probe. Failed-attempt detail, suppression-sweep equivalents, probe-efficiency detail, and adaptive effort & stop (RDP): [`autonomy-mechanics § Validation-loop budget`](../contexts/execution/autonomy-mechanics.md).
71
71
 
72
72
  Body migrated to `contexts/execution/autonomy-mechanics.md` (per P4 of `road-to-kernel-and-router.md`) — opt-in detection summary, task-scope shapes table, N=3 mechanics, allowlist-antipattern detail, probe efficiency, adaptive effort (RDP).
73
73
  Trigger-set above activates this routing on demand, independent of the discipline profile (ADR-110).
@@ -29,7 +29,7 @@ obligation_frequency: "per-edit"
29
29
  A precedence rule plus its validation gate (merged from the former
30
30
  `brand-consistency` rule, 2026-08-04 — the pair shared triggers and one
31
31
  subject). When a consumer already has a brand — registered tokens
32
- (`.tokens.json`), a voice profile, a brand guide — that brand is authoritative
32
+ (`tokens.json`), a voice profile, a brand guide — that brand is authoritative
33
33
  for the run. The curated `brand` corpus (archetypes, colour psychology, type
34
34
  principles) is a **gap-filler**, never an override.
35
35
 
@@ -55,10 +55,32 @@ OR A VOICE RULE. A VALUE THAT TRACES TO NEITHER IS OFF-BRAND.
55
55
  NEVER SHIP AN ASSET THE ACTIVE BRAND CANNOT ACCOUNT FOR.
56
56
  ```
57
57
 
58
+ ## Where the brand actually lives — and how to check
59
+
60
+ ```
61
+ NEVER INFER BRAND PRESENCE FROM A FILENAME. RUN `agent-config brand:status`.
62
+ THE FILE IS `tokens.json`, NEVER `.tokens.json` — A DOT-PREFIXED FILE IS READ BY NOTHING.
63
+ ```
64
+
65
+ The resolver searches exactly four paths under the project root, in this order,
66
+ first hit wins (`BRAND_TOKEN_PATHS`, the UI scaffold directive):
67
+
68
+ 1. `tokens.json`
69
+ 2. `assets/tokens.json`
70
+ 3. `resources/tokens.json`
71
+ 4. `agents/settings/brand/tokens.json` <!-- ref-ignore -->
72
+
73
+ `agent-config brand:status` reports which one holds a file, or that none does —
74
+ and separately flags a dot-prefixed `.tokens.json`, which is the file a reader
75
+ of this rule's earlier wording would plausibly have created and which nothing
76
+ reads. Absent is a real answer: it means the greenfield branch below, not a
77
+ misconfiguration.
78
+
58
79
  ## Precedence order
59
80
 
60
- 1. **Consumer brand profile** — registered `.tokens.json`, voice profile, brand
61
- guide, or a confirmed `brand-strategy` / `brand-identity` constraint set.
81
+ 1. **Consumer brand profile** — a registered `tokens.json` at one of the four
82
+ paths above, a voice profile, a brand guide, or a confirmed `brand-strategy`
83
+ / `brand-identity` constraint set.
62
84
  2. **This run's confirmed decisions** — selections the human signed off this session.
63
85
  3. **The brand corpus** — archetype / colour / type / messaging defaults, used
64
86
  only where 1 and 2 are silent, and always surfaced as corpus-sourced.
@@ -66,7 +88,7 @@ NEVER SHIP AN ASSET THE ACTIVE BRAND CANNOT ACCOUNT FOR.
66
88
  ## What the gate covers
67
89
 
68
90
  - **Colour / type / spacing** in generated UI or assets that is not one of the
69
- active brand tokens (from `state.ui_design` or the consumer's `.tokens.json`).
91
+ active brand tokens (from `state.ui_design` or the consumer's `tokens.json`).
70
92
  A raw hex / font / px value with no token behind it is off-brand.
71
93
  - **Copy and microcopy** whose register contradicts the active voice profile
72
94
  (e.g. playful copy under an authoritative `Ruler` voice).
@@ -79,7 +101,7 @@ NEVER SHIP AN ASSET THE ACTIVE BRAND CANNOT ACCOUNT FOR.
79
101
  - **Precedence half:** any brand decision while a consumer brand profile is
80
102
  present — to keep the corpus from quietly replacing a value the brand already
81
103
  defines.
82
- - **Gate half:** a brand layer is active for the run (a `.tokens.json` /
104
+ - **Gate half:** a brand layer is active for the run (a `tokens.json` /
83
105
  `state.ui_design` brand profile or a confirmed `brand-strategy` /
84
106
  `brand-identity` constraint set) AND a UI / copy / asset is being emitted or
85
107
  reviewed.
@@ -114,6 +136,11 @@ for the full Brand-mode vs Product-mode discriminator.
114
136
  - [`brand-consistency`](brand-consistency.md) — pointer stub; its body lives here since the 2026-08-04 merge.
115
137
  - [`brand`](../skills/brand/SKILL.md) — the gap-fill corpus this rule subordinates to consumer brand.
116
138
  - [`brand-identity`](../skills/brand-identity/SKILL.md) — defines the tokens the gate validates against.
117
- - [`brand-to-tokens`](../skills/brand-to-tokens/SKILL.md) — emits the DTCG `.tokens.json` source of truth.
139
+ - [`brand-to-tokens`](../skills/brand-to-tokens/SKILL.md) — emits the DTCG token
140
+ source of truth. **Known contradiction, recorded not resolved:** that skill's
141
+ prose says to author `.tokens.json` while the only resolver in the tree reads
142
+ `tokens.json`, so a consumer following it literally produces a file nothing
143
+ loads. The authoring name is a consumer-visible decision and is not changed
144
+ here; `brand:status` surfaces the mismatch at the moment it matters.
118
145
  - [`design-intelligence`](../skills/design-intelligence/SKILL.md) — the "audit findings outrank corpus" precedent the gate mirrors.
119
146
  - [`docs/guidelines/design-modes.md`](../docs/guidelines/design-modes.md) — brand vs product register discriminator and routing.
@@ -19,7 +19,9 @@ obligation_frequency: "per-turn"
19
19
  # Context Hygiene
20
20
 
21
21
  > **Enforced by:** [`scripts/context_hygiene_hook.ts`](../../scripts/context_hygiene_hook.ts)
22
- > on Augment + Claude Code (`PostToolUse`). The hook maintains
22
+ > on Augment + Claude Code (`PostToolUse`). Run `agent-config hooks:status` to
23
+ > see whether that slot is actually bound on the host you are on — this line is
24
+ > a statement about the manifest, not about your install. The hook maintains
23
25
  > `agents/state/context-hygiene.json` (tool-call count, loop signal,
24
26
  > freshness milestones at 20/40/60); the prose below is the spec the
25
27
  > hook implements and the agent-side fallback.
@@ -0,0 +1,93 @@
1
+ ---
2
+ type: "auto"
3
+ tier: "2a"
4
+ description: "Council availability is decided by the CLI resolver, never by the project tree — .agent-settings.yml is not the council config"
5
+ triggers:
6
+ - keyword: "council"
7
+ - keyword: "ai council"
8
+ - keyword: "ai-council"
9
+ - keyword: "council:status"
10
+ - keyword: "second opinion"
11
+ - phrase: "cross-check with another model"
12
+ self_contained: true
13
+ workspaces: [agent-config-maintainer, construction, engineering, finance, founder, gtm, legal-review-prep, ops, product, small-business]
14
+ packs: [meta]
15
+ enforced_by:
16
+ - "none"
17
+ # obligation: line 27
18
+ obligation_frequency: "per-task"
19
+ ---
20
+
21
+ # Council Availability Is CLI-Decided
22
+
23
+ The council config is user-global (ADR-104): configured once per developer, live
24
+ in every project, worktree and CWD — including consumer repos carrying none of
25
+ this package's internals. Nothing in the project tree switches it on or off.
26
+
27
+ ## The Iron Law
28
+
29
+ ```
30
+ COUNCIL AVAILABILITY IS DECIDED BY THE CLI RESOLVER — NEVER BY THE PROJECT TREE.
31
+ RUN THE FREE `council:status` PROBE BEFORE CLAIMING THE COUNCIL IS UNAVAILABLE.
32
+ NEVER INFER "NOT CONFIGURED" FROM A MISSING `.agent-settings.yml`, A MISSING
33
+ `scripts/ai_council`, OR A MISSING PROJECT-LOCAL COUNCIL FILE — NONE OF THEM
34
+ CARRY COUNCIL ENABLEMENT.
35
+ NEVER COPY THE USER-GLOBAL CONFIG INTO THE PROJECT TREE TO "MAKE IT WORK".
36
+ NEVER PRESENT A SUBAGENT FAN-OUT AS A COUNCIL.
37
+ ```
38
+
39
+ ## The probe
40
+
41
+ ```bash
42
+ agent-config council:status # no API call, no spend, any directory
43
+ ```
44
+
45
+ Prints `CONFIGURED` / `NOT CONFIGURED`, the resolved path, the layer that
46
+ resolved it, and the member count. In this package's own checkout:
47
+ `./scripts-run src/scripts/council_cli status`.
48
+
49
+ ## What says nothing about availability
50
+
51
+ A missing `.agent-settings.yml` (it never carried enablement — the block was
52
+ removed in ADR-093), a missing `scripts/ai_council/` (package-internal, absent
53
+ from every consumer), a missing project-local council file (the resolver ignores
54
+ `project_root` entirely), and invisible API keys (they live under
55
+ `~/.event4u/agent-config/`). The one real location is
56
+ `~/.event4u/agent-config/settings/.ai-council.yml`; the only escape is
57
+ `$AI_COUNCIL_CONFIG`, an explicit absolute path — still not a project search.
58
+
59
+ ## Why this rule exists
60
+
61
+ The council switch is **not** in `.agent-settings.yml`, though roughly twenty
62
+ rules train the reflex of reading that file to learn whether a feature is on.
63
+ The exception lived only in [`ai-council`](../skills/ai-council/SKILL.md),
64
+ a skill body that reaches context only on activation, so five consumer sessions
65
+ inspected the tree, announced "council not configured", and substituted a
66
+ subagent fan-out while two members were configured the whole time. One copied
67
+ the user-global config into the repo to "make it work".
68
+
69
+ ## If the probe really says unavailable
70
+
71
+ State the resolver's own message and stop. A subagent fan-out is a legitimate
72
+ substitute **only when named as such** — never as "the council". Same honesty
73
+ boundary as [`evaluator-independence`](evaluator-independence.md).
74
+
75
+ ## When NOT to fire
76
+
77
+ Availability is already settled this session, or the question is about council
78
+ *content* (findings, synthesis) rather than availability.
79
+
80
+ ## Enforcement
81
+
82
+ `enforced_by: none` — no gate reads a chat claim. Deterministic instead:
83
+ `check_council_config_location` fails the build when a council surface ties the
84
+ config to `.agent-settings.yml`, which never carried it, or to a project-tree
85
+ path, and its §4 fails when no always-loaded rule carries this fact at all.
86
+
87
+ ## See also
88
+
89
+ - [`ai-council`](../skills/ai-council/SKILL.md) — the full invocation procedure.
90
+ - [`direct-answers`](direct-answers.md) Iron Law 2 — a live-state fact is never
91
+ asserted from inspection when an authoritative resolver exists.
92
+ - [`self-repair-loop`](self-repair-loop.md) — catches the claim when it is made
93
+ anyway.
@@ -61,6 +61,9 @@ OBVIOUS-TO-THE-AGENT ≠ IN-SCOPE.
61
61
  a ticket/spec that carries a second source (an attachment, a code reality, or an
62
62
  internal contradiction), gated by `consistency.cross_source` in
63
63
  `.agent-settings.yml` (`on` default · `auto` = high-confidence only · `off` = inert).
64
+ That file is the project layer of a cascade that starts user-global — never read
65
+ the setting or its absence from it alone; `agent-config settings:get
66
+ consistency.cross_source` reports the value and the file it came from.
64
67
 
65
68
  **Does NOT fire** on a single clear source with no second source to compare
66
69
  against (that is plain vagueness — it belongs to `ask-when-uncertain`), on
@@ -77,11 +77,35 @@ primitive → run in-session (clean no-op).
77
77
  ordered slice never dispatches before its declared parent's return is
78
78
  verified. Both per
79
79
  [`subagent-steering`](../contexts/execution/subagent-steering.md).
80
- 6. **Record** telemetry after each dispatch — run `orchestration_record`
81
- (one validated line: spawn_count, token_delta + provenance, tier, task_class)
82
- per [`orchestration-telemetry`](../contexts/execution/orchestration-telemetry.md)
83
- § Emit. This is the agent-behavioral capture the savings report reads;
84
- skipping it leaves the value-of-orchestration question unmeasured.
80
+ 6. **Record** telemetry after each dispatch — on hook-capable hosts the
81
+ `orchestration-record` concern (`post_tool_use`) emits the line
82
+ deterministically for every Agent/Task completion; on hosts without the
83
+ slot, run `orchestration_record` yourself (one validated line: spawn_count,
84
+ token_delta + provenance, tier, task_class) per
85
+ [`orchestration-telemetry`](../contexts/execution/orchestration-telemetry.md)
86
+ § Emit. Measured before the hook existed: 1 of 370 dispatches captured —
87
+ the model-carried path alone leaves the value question unmeasured.
88
+
89
+ ## Carriers — how this rule reaches a session (and what stays model-carried)
90
+
91
+ No host runs the tier-2 rule router, so this file's triggers alone never load
92
+ it. The obligation travels on three carriers instead: the always-loaded
93
+ AGENTS.md line (delegate-by-default + end-review), the `delegation-nudge`
94
+ concern on `user_prompt_submit` (runs `classifyTask` on cheap prompt signals
95
+ and injects a one-line verdict ONLY when the classifier says
96
+ `do-in-parallel`/`do-in-steps` — silence otherwise; delivery on
97
+ `user_prompt_submit` is end-to-end verified), and the `end-review-nudge`
98
+ concern on `stop` (ONE `review_skipped` telemetry line per mutating
99
+ no-review session — verified; its advisory line reaches the dispatcher
100
+ output, but host-side forwarding of stop-slot context to the model is
101
+ unverified, so the model-facing end-review carrier is the AGENTS.md line
102
+ plus this telemetry). The
103
+ capability gate itself resolves from the committed host registry in
104
+ `src/scripts/_lib/host_capability.ts` (settings override wins). What stays
105
+ model-carried, honestly: the decomposition itself, the per-return
106
+ verification, and every dispatch on hosts without hook slots. The nudges are
107
+ advisory by design — whether they change behaviour is measured by the
108
+ telemetry, not assumed.
85
109
 
86
110
  ## Scope — does NOT
87
111
 
@@ -72,6 +72,9 @@ decisions already made — treat it like brand tokens, not like inspiration.
72
72
  ## Strictness — set by `design.fidelity_mode`
73
73
 
74
74
  Read `design.fidelity_mode` from `.agent-settings.yml`. Missing → `strict`.
75
+ That file is the project layer of a cascade that starts user-global, so "missing"
76
+ means missing from **every** layer — `agent-config settings:get
77
+ design.fidelity_mode` reports the value and the file it came from.
75
78
 
76
79
  | Mode | Behaviour |
77
80
  |---|---|
@@ -99,7 +99,8 @@ id; with no ledger yet, the counter falls back to session scope. And the slot
99
99
  itself is not universal: `pre_tool_use` exists on **three** hosts — augment,
100
100
  claude, cowork. On cursor, cline, windsurf, gemini and copilot this guard has
101
101
  nowhere to bind, so items 1 and 4 join 2 and 3 as model-carried there. The
102
- frequency join in `check_enforcement_coverage.ts` reports exactly that set.
102
+ frequency join in `check_enforcement_coverage.ts` reports exactly that set, and
103
+ `agent-config hooks:status` answers it for the host you are on right now.
103
104
 
104
105
  Items 2 and 3 — an honestly chosen scope, and recording the prompt with the
105
106
  verdict — are **not** enforced by anything. A narrowed scope is not decidable
@@ -70,7 +70,8 @@ AND the repo contains a detectable index:
70
70
  routing skill: `agent-config code-graph detect|query|affected|path` over the
71
71
  native engine or a consumer-shipped index, grep as the stated fallback. On
72
72
  hook-capable hosts the PreToolUse `code-graph` nudge surfaces this once per
73
- session; on instruction-file hosts this rule is the surface.
73
+ session; on instruction-file hosts this rule is the surface. Which of the two
74
+ you are on is `agent-config hooks:status`, not a guess from the host name.
74
75
  - [`discovery_graph`](../scripts/discovery_graph.ts) — this suite's OWN artefact
75
76
  relation-graph (`affected`/`explain`); the external code-graph is the
76
77
  *source-code* analogue this rule defers to for code questions.
@@ -41,7 +41,7 @@ obligation_frequency: "per-task"
41
41
 
42
42
  # Finance Safety Floor
43
43
 
44
- Domain safety floor for finance-pack artefacts (cash, runway, valuation, scenario, unit economics, forecasting). Auto-activates when `pack-finance-basic` or `pack-finance-advanced` is installed.
44
+ Domain safety floor for finance-pack artefacts (cash, runway, valuation, scenario, unit economics, forecasting). Auto-activates when `pack-finance-basic` or `pack-finance-advanced` is installed — `agent-config packs:active` says whether it is, and names the degraded case where zero packs load and this floor cannot activate at all.
45
45
 
46
46
  ## Iron Law — no final investment recommendation
47
47
 
@@ -84,4 +84,4 @@ Trigger-set above activates this routing on demand, independent of the disciplin
84
84
  - [`commit-policy`](commit-policy.md) — commits are the user's call; rewriting them is a stronger version of the same restriction.
85
85
  - [`token-efficiency`](token-efficiency.md) — Iron Law on burning the user's tokens for cosmetic gain.
86
86
  - [`skill:git-workflow`](../skills/git-workflow/SKILL.md) — Safe Squash-After-Push protocol and Divergent-State Recovery decision tree.
87
- - `git … --no-verify` / `core.hooksPath` overrides — deterministically blocked by the `block-no-verify` PreToolUse guard (`src/scripts/hooks/block_no_verify.ts`, registered in `hook_manifest.yaml`) **on the three hosts that have a `pre_tool_use` slot at all** — augment, claude, cowork. On cursor, cline, windsurf, gemini and copilot the guard has nowhere to bind, so on those hosts the Iron Laws above are model-carried and "deterministically blocked" is not a claim this rule can make. Surfaced by the frequency join in `check_enforcement_coverage.ts`, which reports the per-commit obligation as uncovered on exactly those platforms.
87
+ - `git … --no-verify` / `core.hooksPath` overrides — deterministically blocked by the `block-no-verify` PreToolUse guard (`src/scripts/hooks/block_no_verify.ts`, registered in `hook_manifest.yaml`) **on the three hosts that have a `pre_tool_use` slot at all** — augment, claude, cowork. On cursor, cline, windsurf, gemini and copilot the guard has nowhere to bind, so on those hosts the Iron Laws above are model-carried and "deterministically blocked" is not a claim this rule can make. Surfaced by the frequency join in `check_enforcement_coverage.ts`, which reports the per-commit obligation as uncovered on exactly those platforms. To check the host you are on rather than trusting this sentence, run `agent-config hooks:status`.
@@ -26,7 +26,9 @@ obligation_frequency: "per-edit"
26
26
  # History Discipline
27
27
 
28
28
  Pack floor for the `history-discipline` pack (default-off; auto-activates
29
- when the pack is installed). Agents get history wrong in both directions:
29
+ when the pack is installed — `agent-config packs:active` says whether it is,
30
+ and names the degraded case where zero packs load and this floor cannot
31
+ activate at all). Agents get history wrong in both directions:
30
32
  missing entirely on data that needs it, or over-built as event sourcing
31
33
  where a row-level log suffices — and audit tables that themselves grow
32
34
  without bound.
@@ -39,7 +39,7 @@ obligation_frequency: "per-task"
39
39
 
40
40
  # Legal Safety Floor
41
41
 
42
- Domain safety floor for the `legal-review-prep` pack (contract/NDA/DPA review, legal triage). Auto-activates when `pack-legal-review-prep` is installed. Sibling to `finance-safety-floor` / `strategy-safety-floor`. Every output is a **draft to PREPARE for attorney review**, never legal advice. Operating mechanics migrated to [`legal-practice-profile § Legal safety floor`](../skills/legal-practice-profile/SKILL.md) (per P4 of `road-to-kernel-and-router`) — the Iron Laws below stay here.
42
+ Domain safety floor for the `legal-review-prep` pack (contract/NDA/DPA review, legal triage). Auto-activates when `pack-legal-review-prep` is installed — `agent-config packs:active` says whether it is, and names the degraded case where zero packs load and this floor cannot activate at all. Sibling to `finance-safety-floor` / `strategy-safety-floor`. Every output is a **draft to PREPARE for attorney review**, never legal advice. Operating mechanics migrated to [`legal-practice-profile § Legal safety floor`](../skills/legal-practice-profile/SKILL.md) (per P4 of `road-to-kernel-and-router`) — the Iron Laws below stay here.
43
43
 
44
44
  ## Iron Law — no final legal call
45
45
 
@@ -25,7 +25,9 @@ EXCEPTION: USER-INVOKED FLOWS ALWAYS RUN.
25
25
  EXCEPTION: USER EXPLICITLY ASKED FOR IT THIS TURN.
26
26
  ```
27
27
 
28
- Reading `.agent-settings.yml`:
28
+ Reading `.agent-settings.yml` — the project layer of a cascade that starts
29
+ user-global, so "not set" means not set on any layer; `agent-config settings:get
30
+ personal.pr_progress_comments` reports the value and the file it came from:
29
31
 
30
32
  - Missing key / not set → treat as `false`.
31
33
  - `personal.pr_progress_comments: false` (default) → gate fires.
@@ -18,7 +18,9 @@ obligation_frequency: "per-session"
18
18
  # Onboarding Gate
19
19
 
20
20
  **Iron Law.** First turn of a project: if `onboarding.onboarded` is
21
- false in `.agent-settings.yml`, instruct the developer to run
21
+ false in `.agent-settings.yml` — the project layer of a cascade that starts
22
+ user-global, so check it with `agent-config settings:get onboarding.onboarded`
23
+ rather than by opening one file — instruct the developer to run
22
24
  `agent-config setup` in their terminal before executing any other
23
25
  request. The wizard writes `onboarding.onboarded: true` on `Finish`,
24
26
  which silences this rule for subsequent turns.
@@ -45,7 +45,10 @@ AND EXECUTION MUST SKIP THEM INLINE WITH [-] AND A REASON.
45
45
  ```
46
46
 
47
47
  When autonomous local-CI runs are disabled in `.agent-settings.yml`
48
- (`quality.local_auto_run: false` — the shipped template default), every
48
+ (`quality.local_auto_run: false` — the shipped template default; that file is the
49
+ project layer of a cascade that starts user-global, and this key is one where an
50
+ ABSENT value resolves to `true` at its reader and therefore DISABLES this gate —
51
+ `agent-config settings:get quality.local_auto_run` reports both facts), every
49
52
  full-pipeline gate run during roadmap work is wasted wall-clock and
50
53
  tokens — the remote CI on the PR is the authoritative gate. Roadmaps must
51
54
  neither schedule nor execute those gates locally. New CI gates and