@event4u/agent-config 9.13.0 → 9.15.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 (280) hide show
  1. package/.claude-plugin/marketplace.json +1 -1
  2. package/CHANGELOG.md +113 -67
  3. package/README.md +9 -1
  4. package/dist/agent-src/commands/agents/audit.md +7 -7
  5. package/dist/agent-src/commands/agents/optimize.md +1 -1
  6. package/dist/agent-src/commands/analyze/reference-repo.md +1 -1
  7. package/dist/agent-src/commands/chat-history.md +1 -0
  8. package/dist/agent-src/commands/context.md +1 -0
  9. package/dist/agent-src/commands/council.md +1 -1
  10. package/dist/agent-src/commands/ghostwriter.md +1 -1
  11. package/dist/agent-src/commands/memory.md +2 -1
  12. package/dist/agent-src/commands/module.md +1 -0
  13. package/dist/agent-src/commands/optimize/agents-dir.md +1 -1
  14. package/dist/agent-src/commands/optimize/deep.md +150 -0
  15. package/dist/agent-src/commands/optimize/skills.md +5 -5
  16. package/dist/agent-src/commands/optimize.md +12 -6
  17. package/dist/agent-src/commands/override.md +1 -0
  18. package/dist/agent-src/commands/prediction-pool.md +4 -4
  19. package/dist/agent-src/commands/research/deep.md +1 -1
  20. package/dist/agent-src/commands/roadmap.md +2 -1
  21. package/dist/agent-src/commands/rule-compliance-audit.md +1 -1
  22. package/dist/agent-src/commands/tdd.md +1 -0
  23. package/dist/agent-src/commands/tests.md +1 -0
  24. package/dist/agent-src/commands/upstream-contribute.md +5 -5
  25. package/dist/agent-src/commands/video/from-script.md +1 -1
  26. package/dist/agent-src/commands/video/from-song.md +1 -1
  27. package/dist/agent-src/commands/video/scene.md +1 -1
  28. package/dist/agent-src/commands/video/stitch.md +1 -1
  29. package/dist/agent-src/commands/video/storyboard.md +1 -1
  30. package/dist/agent-src/commands/worktree/create.md +2 -1
  31. package/dist/agent-src/contexts/augment-infrastructure.md +1 -1
  32. package/dist/agent-src/contexts/contracts/artifact-engagement-flow.md +5 -5
  33. package/dist/agent-src/contexts/contracts/command-suggestion-flow.md +3 -3
  34. package/dist/agent-src/contexts/contracts/emergency-triage-block.md +2 -2
  35. package/dist/agent-src/contexts/execution/roadmap-process-loop.md +4 -3
  36. package/dist/agent-src/contexts/execution/subagent-routing.md +19 -0
  37. package/dist/agent-src/contexts/override-system.md +1 -1
  38. package/dist/agent-src/ghostwriter/fictional-fixture-v1.md +1 -1
  39. package/dist/agent-src/rules/augment-edit-discipline.md +1 -1
  40. package/dist/agent-src/rules/autonomous-execution.md +2 -1
  41. package/dist/agent-src/rules/brand-consistency.md +1 -0
  42. package/dist/agent-src/rules/brand-source-of-truth.md +1 -0
  43. package/dist/agent-src/rules/code-comment-discipline.md +2 -0
  44. package/dist/agent-src/rules/communication-through-line.md +1 -0
  45. package/dist/agent-src/rules/content-quoting-floor.md +1 -0
  46. package/dist/agent-src/rules/cross-source-consistency.md +0 -1
  47. package/dist/agent-src/rules/downstream-changes.md +1 -0
  48. package/dist/agent-src/rules/external-code-graph-interop.md +1 -0
  49. package/dist/agent-src/rules/external-reference-deep-dive.md +1 -0
  50. package/dist/agent-src/rules/fast-path-marker-visibility.md +1 -0
  51. package/dist/agent-src/rules/finance-safety-floor.md +0 -1
  52. package/dist/agent-src/rules/icon-consistency.md +1 -0
  53. package/dist/agent-src/rules/image-likeness-and-rights.md +1 -0
  54. package/dist/agent-src/rules/improve-before-implement.md +1 -1
  55. package/dist/agent-src/rules/invite-challenge.md +1 -0
  56. package/dist/agent-src/rules/lethal-trifecta-guard.md +1 -0
  57. package/dist/agent-src/rules/low-impact-corpus-privacy-floor.md +1 -0
  58. package/dist/agent-src/rules/markdown-safe-codeblocks.md +1 -0
  59. package/dist/agent-src/rules/media-governance-routing.md +4 -3
  60. package/dist/agent-src/rules/media-sync-ground-truth.md +1 -0
  61. package/dist/agent-src/rules/no-attribution-footers.md +1 -0
  62. package/dist/agent-src/rules/no-decorative-emojis-in-git-surfaces.md +1 -0
  63. package/dist/agent-src/rules/no-pr-progress-comments.md +1 -0
  64. package/dist/agent-src/rules/onboarding-gate.md +1 -0
  65. package/dist/agent-src/rules/output-discipline.md +1 -0
  66. package/dist/agent-src/rules/prefer-enums-over-literals.md +1 -0
  67. package/dist/agent-src/rules/preservation-guard.md +1 -0
  68. package/dist/agent-src/rules/question-not-instruction.md +1 -0
  69. package/dist/agent-src/rules/roadmap-ci-steps-policy.md +1 -0
  70. package/dist/agent-src/rules/role-mode-adherence.md +1 -0
  71. package/dist/agent-src/rules/runtime-safety.md +1 -0
  72. package/dist/agent-src/rules/security-sensitive-stop.md +1 -0
  73. package/dist/agent-src/rules/session-canary.md +9 -2
  74. package/dist/agent-src/rules/source-confidentiality.md +1 -0
  75. package/dist/agent-src/rules/source-of-truth.md +1 -0
  76. package/dist/agent-src/rules/spreadsheet-source-quality.md +1 -0
  77. package/dist/agent-src/rules/think-before-action.md +1 -0
  78. package/dist/agent-src/rules/token-budget-discipline.md +1 -0
  79. package/dist/agent-src/rules/token-efficiency.md +1 -0
  80. package/dist/agent-src/rules/token-optimizer-maintenance.md +5 -5
  81. package/dist/agent-src/rules/tool-safety.md +1 -0
  82. package/dist/agent-src/rules/untrusted-input-defense.md +2 -0
  83. package/dist/agent-src/rules/user-interaction.md +1 -0
  84. package/dist/agent-src/rules/user-interrupt-priority.md +1 -0
  85. package/dist/agent-src/skills/adr-create/SKILL.md +1 -1
  86. package/dist/agent-src/skills/check-refs/SKILL.md +1 -1
  87. package/dist/agent-src/skills/competitive-positioning/SKILL.md +1 -1
  88. package/dist/agent-src/skills/condense-memory/SKILL.md +1 -1
  89. package/dist/agent-src/skills/context-authoring/SKILL.md +1 -1
  90. package/dist/agent-src/skills/copilot-agents-optimization/SKILL.md +1 -1
  91. package/dist/agent-src/skills/description-assist/SKILL.md +1 -1
  92. package/dist/agent-src/skills/github-ci/SKILL.md +1 -0
  93. package/dist/agent-src/skills/guideline-writing/SKILL.md +1 -1
  94. package/dist/agent-src/skills/lint-skills/SKILL.md +1 -1
  95. package/dist/agent-src/skills/readme-reviewer/SKILL.md +1 -1
  96. package/dist/agent-src/skills/roadmap-management/SKILL.md +8 -1
  97. package/dist/agent-src/skills/roadmap-writing/SKILL.md +1 -1
  98. package/dist/agent-src/skills/skill-improvement-pipeline/SKILL.md +1 -1
  99. package/dist/agent-src/skills/skill-writing/SKILL.md +4 -4
  100. package/dist/agent-src/skills/token-optimizer/SKILL.md +4 -4
  101. package/dist/agent-src/skills/upstream-contribute/SKILL.md +6 -6
  102. package/dist/agent-src/skills/using-git-worktrees/SKILL.md +25 -0
  103. package/dist/agent-src/templates/AGENTS.md +1 -1
  104. package/dist/agent-src/templates/agents/agent-project-settings.example.yml +1 -1
  105. package/dist/agent-src/templates/command.md +1 -1
  106. package/dist/agent-src/templates/copilot-instructions.md +3 -3
  107. package/dist/agent-src/templates/rule.md +2 -2
  108. package/dist/agent-src/templates/scripts/work_engine/orchestration.ts +1 -1
  109. package/dist/agent-src/templates/skill-archive-note.md +5 -5
  110. package/dist/agent-src/templates/skill.md +1 -1
  111. package/dist/cli/agent-config.js +66 -19
  112. package/dist/cli/agent-config.js.map +1 -1
  113. package/dist/cli/main.js +9 -4
  114. package/dist/cli/main.js.map +1 -1
  115. package/dist/cli/python/workspace_drive.js +2 -0
  116. package/dist/cli/python/workspace_drive.js.map +1 -1
  117. package/dist/cli/python/workspace_drive_health.js +2 -0
  118. package/dist/cli/python/workspace_drive_health.js.map +1 -1
  119. package/dist/cli/python/workspace_hosts.js +2 -0
  120. package/dist/cli/python/workspace_hosts.js.map +1 -1
  121. package/dist/cli/python/workspace_sessions.js +2 -0
  122. package/dist/cli/python/workspace_sessions.js.map +1 -1
  123. package/dist/cli/registry.js +1 -0
  124. package/dist/cli/registry.js.map +1 -1
  125. package/dist/cli-delegate/{chunk-A3HJ6NTI.js → chunk-63WSP6YZ.js} +2 -1
  126. package/dist/cli-delegate/{chunk-EJYIGZ3T.js → chunk-BKO2AZ7Z.js} +1 -1
  127. package/dist/cli-delegate/{chunk-QFKQLQ7X.js → chunk-H574KOUH.js} +340 -462
  128. package/dist/cli-delegate/chunk-NXFWFAYV.js +339 -0
  129. package/dist/cli-delegate/{chunk-TEGJU2JX.js → chunk-ZXXJLL5K.js} +2 -2
  130. package/dist/cli-delegate/cmd_conformance.js +29 -23
  131. package/dist/cli-delegate/cmd_doctor.js +3 -3
  132. package/dist/cli-delegate/cmd_export.js +4 -4
  133. package/dist/cli-delegate/cmd_preflight.js +2 -2
  134. package/dist/cli-delegate/cmd_prune.js +4 -4
  135. package/dist/cli-delegate/cmd_settings_migrate.js +4 -4
  136. package/dist/cli-delegate/cmd_sync.js +4 -4
  137. package/dist/cli-delegate/cmd_uninstall.js +4 -4
  138. package/dist/cli-delegate/cmd_validate.js +4 -4
  139. package/dist/discovery/deprecation-report.md +1 -1
  140. package/dist/discovery/discovery-manifest.json +163 -103
  141. package/dist/discovery/discovery-manifest.json.sha256 +1 -1
  142. package/dist/discovery/discovery-manifest.summary.md +3 -3
  143. package/dist/discovery/orphan-report.md +1 -1
  144. package/dist/discovery/packs.json +6 -5
  145. package/dist/discovery/trust-report.md +3 -3
  146. package/dist/discovery/workspaces.json +5 -4
  147. package/dist/hooks/dispatch.js +729 -430
  148. package/dist/install/install.mjs +700 -625
  149. package/dist/install/rule_scope.js +18 -2
  150. package/dist/install/rule_scope.js.map +1 -1
  151. package/dist/mcp/registry-manifest.json +3 -3
  152. package/dist/mcp/server.json +2 -2
  153. package/dist/mcp/server.mjs +564 -424
  154. package/dist/router.json +1 -1
  155. package/dist/scripts/_lib/claude_settings_hooks.js +30 -5
  156. package/dist/scripts/_lib/claude_settings_hooks.js.map +1 -1
  157. package/dist/scripts/_lib/scoped_projection.js +223 -0
  158. package/dist/scripts/_lib/scoped_projection.js.map +1 -0
  159. package/dist/scripts/_lib/surface_tiers.js +125 -0
  160. package/dist/scripts/_lib/surface_tiers.js.map +1 -0
  161. package/dist/scripts/_lib/token_count.js +166 -0
  162. package/dist/scripts/_lib/token_count.js.map +1 -0
  163. package/dist/scripts/_lib/trigger_eval_floors.js +8 -0
  164. package/dist/scripts/_lib/trigger_eval_floors.js.map +1 -1
  165. package/dist/scripts/condense.js +139 -9
  166. package/dist/scripts/condense.js.map +1 -1
  167. package/dist/scripts/project_thin_rules.js +450 -0
  168. package/dist/scripts/project_thin_rules.js.map +1 -0
  169. package/dist/server/routes/workspace.js +2 -0
  170. package/dist/server/routes/workspace.js.map +1 -1
  171. package/dist/server/schemas/settings.js +9 -3
  172. package/dist/server/schemas/settings.js.map +1 -1
  173. package/dist/ui/assets/index-DJY_vQVn.js +40 -0
  174. package/dist/ui/assets/index-DJY_vQVn.js.map +1 -0
  175. package/dist/ui/index.html +1 -1
  176. package/docs/guidelines/agent-infra/roadmap-progress-mechanics.md +1 -1
  177. package/package.json +11 -11
  178. package/src/agent-src/templates/AGENTS.md +1 -1
  179. package/src/agent-src/templates/scripts/work_engine/orchestration.ts +1 -1
  180. package/src/config/agent-settings.template.yml +59 -11
  181. package/src/config/ci-local-parity.yml +8 -0
  182. package/src/config/discovery/unassigned-artefacts.yml +23 -25
  183. package/src/config/evaluator-budgets.json +35 -5
  184. package/src/config/gate-coverage.yml +147 -0
  185. package/src/config/gate-violation-baselines.json +25 -0
  186. package/src/install/rule_scope.ts +27 -2
  187. package/src/scripts/_cli/cmd_conformance.ts +13 -24
  188. package/src/scripts/_dispatch.bash +10 -0
  189. package/src/scripts/_lib/claude_settings_hooks.ts +30 -4
  190. package/src/scripts/_lib/exec_evidence.ts +5 -0
  191. package/src/scripts/_lib/gate_baseline.ts +213 -0
  192. package/src/scripts/_lib/scoped_projection.ts +262 -0
  193. package/src/scripts/_lib/tier_budget_routing.ts +234 -0
  194. package/src/scripts/_lib/tool_adapter_registry.ts +8 -1
  195. package/src/scripts/_lib/trigger_eval_floors.ts +9 -0
  196. package/src/scripts/_lib/trigger_routers.ts +17 -5
  197. package/src/scripts/adr/regenerate_index.ts +4 -3
  198. package/src/scripts/ai-video/lib/parse-blueprint.sh +1 -1
  199. package/src/scripts/ai_council/compile_corpus.ts +1 -1
  200. package/src/scripts/audit_cloud_compatibility.ts +37 -2
  201. package/src/scripts/audit_initial_context.ts +53 -19
  202. package/src/scripts/audit_likelihood.ts +31 -2
  203. package/src/scripts/audit_user_type_axis.ts +58 -11
  204. package/src/scripts/bench_hook_latency.ts +172 -41
  205. package/src/scripts/build_mcp_catalog.ts +12 -1
  206. package/src/scripts/check_always_budget.ts +122 -11
  207. package/src/scripts/check_artefact_count_messaging.ts +128 -15
  208. package/src/scripts/check_augment_description_cap.ts +24 -3
  209. package/src/scripts/check_ci_strict_superset.ts +150 -0
  210. package/src/scripts/check_cluster_patterns.ts +100 -0
  211. package/src/scripts/check_consumer_scope_flip.ts +26 -4
  212. package/src/scripts/check_evaluator_budgets.ts +198 -19
  213. package/src/scripts/check_gate_coverage.ts +337 -1
  214. package/src/scripts/check_generator_output_coverage.ts +2 -1
  215. package/src/scripts/check_iron_law_prominence.ts +1 -1
  216. package/src/scripts/check_kernel_rule_bundle.ts +1 -1
  217. package/src/scripts/check_no_new_legacy_path.ts +167 -3
  218. package/src/scripts/check_pack_size.ts +18 -4
  219. package/src/scripts/check_portability.ts +37 -7
  220. package/src/scripts/check_references.ts +19 -3
  221. package/src/scripts/check_release_pr_shape.ts +13 -0
  222. package/src/scripts/check_token_regression.ts +9 -2
  223. package/src/scripts/condense.ts +155 -12
  224. package/src/scripts/cost/budget.mjs +63 -2
  225. package/src/scripts/count_scoped_projection.ts +104 -0
  226. package/src/scripts/evaluator_umbrella.sh +34 -1
  227. package/src/scripts/generate_capability_matrix.ts +8 -0
  228. package/src/scripts/generate_router_coverage_from_matrix.ts +155 -0
  229. package/src/scripts/hook_manifest.yaml +17 -3
  230. package/src/scripts/hooks/block_config_weakening.ts +337 -0
  231. package/src/scripts/hooks/concern_registry.ts +2 -0
  232. package/src/scripts/hooks/probe_throttle.ts +75 -0
  233. package/src/scripts/install-hooks.sh +24 -2
  234. package/src/scripts/install.ts +15 -92
  235. package/src/scripts/lint_agents_md.ts +9 -3
  236. package/src/scripts/lint_archived_skills.ts +1 -1
  237. package/src/scripts/lint_artefact_frontmatter.ts +185 -37
  238. package/src/scripts/lint_command_routing.ts +21 -52
  239. package/src/scripts/lint_command_verbs.ts +47 -28
  240. package/src/scripts/lint_context_spine_usage.ts +38 -12
  241. package/src/scripts/lint_framework_leakage.ts +25 -6
  242. package/src/scripts/lint_handoffs.ts +49 -2
  243. package/src/scripts/lint_media_policy_linkage.ts +62 -30
  244. package/src/scripts/lint_namespace.ts +92 -7
  245. package/src/scripts/lint_new_skill_gate.ts +39 -31
  246. package/src/scripts/lint_originality_shingles.ts +7 -1
  247. package/src/scripts/lint_override_kernel_guard.ts +21 -3
  248. package/src/scripts/lint_pack_boundaries.ts +461 -91
  249. package/src/scripts/lint_pack_dependencies.ts +24 -57
  250. package/src/scripts/lint_persona_governance.ts +1 -1
  251. package/src/scripts/lint_role_experiences.ts +34 -5
  252. package/src/scripts/lint_trigger_precision.ts +142 -0
  253. package/src/scripts/mcp_server/consumer_tool_catalog.json +12 -201
  254. package/src/scripts/mcp_server/tools.ts +1 -1
  255. package/src/scripts/prepack-check.mjs +40 -1
  256. package/src/scripts/prepack_router_targets.d.mts +7 -0
  257. package/src/scripts/prepack_router_targets.mjs +93 -0
  258. package/src/scripts/print_required_checks.ts +72 -18
  259. package/src/scripts/profile_staleness_hook.ts +12 -0
  260. package/src/scripts/record_evaluator_measurements.mjs +105 -0
  261. package/src/scripts/recruit_preflight.sh +1 -1
  262. package/src/scripts/release.ts +105 -1
  263. package/src/scripts/router_target_paths.d.mts +4 -0
  264. package/src/scripts/router_target_paths.mjs +69 -0
  265. package/src/scripts/router_telemetry.ts +52 -1
  266. package/src/scripts/routing_doctor.ts +485 -0
  267. package/src/scripts/rule_trigger_eval.ts +403 -0
  268. package/src/scripts/schemas/rule.schema.json +5 -1
  269. package/src/scripts/session_canary_hook.ts +96 -5
  270. package/src/scripts/skill_linter.ts +90 -42
  271. package/src/scripts/smoke/skills.sh +1 -1
  272. package/src/scripts/sweep_dead_scan_roots.ts +356 -10
  273. package/src/scripts/trigger_coverage.ts +13 -2
  274. package/src/scripts/update_counts.ts +91 -12
  275. package/src/scripts/validate_telegraph_carveouts.ts +1 -1
  276. package/src/scripts/wrapper_freshness_hook.ts +14 -0
  277. package/src/server/schemas/settings.ts +19 -5
  278. package/dist/cli-delegate/chunk-TJIAM5FW.js +0 -133
  279. package/dist/ui/assets/index-BpSQt5vm.js +0 -40
  280. package/dist/ui/assets/index-BpSQt5vm.js.map +0 -1
@@ -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-BpSQt5vm.js"></script>
30
+ <script type="module" crossorigin src="/assets/index-DJY_vQVn.js"></script>
31
31
  <link rel="stylesheet" crossorigin href="/assets/index-jSfMW8_t.css">
32
32
  </head>
33
33
  <body>
@@ -218,7 +218,7 @@ Keep aligned with the dashboard counter in `scripts/update_roadmap_progress.ts`
218
218
 
219
219
  `[~]` is **not** an "in-progress" indicator. Mid-reply work-in-flight has no checkbox change until the step lands; that's a normal `[ ] → [x]` transition.
220
220
 
221
- **Dashboard regen cadence — opt-in batching.** The checkbox flip is non-batchable. The **subprocess regen** (`./agent-config roadmap:progress`) is batchable per `roadmap.dashboard_regen_cadence` in `.agent-settings.yml` (`per_step` default · `every_5_steps` · `phase_boundary`). Run end, phase boundary, and any file-shape touch (rename / phase add / archive — Iron Law 1) always force an immediate regen regardless of cadence.
221
+ **Dashboard regen cadence — opt-in batching.** The checkbox flip is non-batchable. The **subprocess regen** (`./agent-config roadmap:progress`) is batchable per `roadmap.dashboard_regen_cadence` in `.agent-settings.yml` (`every_5_steps` default · `per_step` · `phase_boundary`). Run end, phase boundary, and any file-shape touch (rename / phase add / archive — Iron Law 1) always force an immediate regen regardless of cadence.
222
222
 
223
223
  **Blockers follow the same cadence as checkboxes.** Clearing a `## Blockers` entry (per `templates/roadmaps.md` rule 20) flips its `Status: resolved` and regenerates the dashboard in the same reply — Iron Law 1's "same response" obligation applies to blocker resolution exactly as it applies to a checkbox flip.
224
224
 
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.13.0",
4
+ "version": "9.15.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,
@@ -87,20 +87,20 @@
87
87
  "provenance": true
88
88
  },
89
89
  "devDependencies": {
90
- "@inquirer/prompts": "^7.10.1",
91
- "@playwright/test": "^1.60.0",
92
- "@preact/preset-vite": "^2.10.5",
90
+ "@inquirer/prompts": "^8.5.2",
91
+ "@playwright/test": "^1.62.1",
92
+ "@preact/preset-vite": "^2.10.6",
93
93
  "@testing-library/preact": "^3.2.4",
94
94
  "@types/js-yaml": "^4.0.9",
95
- "@types/node": "^20.19.41",
96
- "@typescript-eslint/eslint-plugin": "^8.59.4",
95
+ "@types/node": "^26.1.2",
96
+ "@typescript-eslint/eslint-plugin": "^8.65.0",
97
97
  "@typescript-eslint/parser": "^8.59.4",
98
98
  "eslint": "^9.39.4",
99
- "happy-dom": "^20.9.0",
99
+ "happy-dom": "^20.11.1",
100
100
  "js-tiktoken": "^1.0.21",
101
101
  "publint": "^0.3.22",
102
102
  "tree-sitter-wasms": "0.1.13",
103
- "tsx": "^4.22.3",
103
+ "tsx": "^4.23.1",
104
104
  "typescript": "^5.9.3",
105
105
  "vite": "^5.4.21",
106
106
  "vitest": "^2.1.9",
@@ -108,11 +108,11 @@
108
108
  },
109
109
  "dependencies": {
110
110
  "@fastify/static": "^10.1.2",
111
- "@modelcontextprotocol/sdk": "^1.29.0",
112
- "@preact/signals": "^2.9.0",
111
+ "@modelcontextprotocol/sdk": "^1.30.0",
112
+ "@preact/signals": "^2.10.0",
113
113
  "commander": "^12.1.0",
114
114
  "execa": "^9.5.0",
115
- "fastify": "^5.8.0",
115
+ "fastify": "^5.11.0",
116
116
  "js-yaml": "^4.1.0",
117
117
  "open": "^10.2.0",
118
118
  "preact": "^10.29.0",
@@ -30,5 +30,5 @@
30
30
  2. **What language?** — Project-specific; agents mirror the user's language at runtime.
31
31
  3. **Where do I edit agent-config?** — Do not edit `.augment/` or `dist/agent-src/` here; they are installed artifacts. Project edits live in `agents/` and project source.
32
32
  4. **Lint / test / sync entry point?** — Project-specific (see project README); agent-config reinstalls via `composer update event4u/agent-config` or `npm update @event4u/agent-config`.
33
- 5. **Where do the always-active rules live?** — `dist/agent-src/rules/` (kernel = 9 Iron-Law rules; tier-1 / tier-2 routed via `dist/agent-src/router.json`).
33
+ 5. **Where do the always-active rules live?** — `dist/agent-src/rules/` (kernel = 9 Iron-Law rules; tier-1 / tier-2 routed via `dist/router.json`).
34
34
  6. **Per-module agent docs?** — If `modules.enabled: true`, each module under `modules.root_paths` may carry its own `{agent_folder}/` (default `agents/`). See `module-management` skill.
@@ -104,7 +104,7 @@ interface DispatchHookModule {
104
104
  * reachable both when this module runs from the consumer projection
105
105
  * (`dist/agent-src/templates/scripts/work_engine/`) and from the
106
106
  * source-of-truth tree
107
- * (`packages/<pack>/.agent-src.uncondensed/templates/scripts/work_engine/`).
107
+ * (`src/agent-src/templates/scripts/work_engine/`).
108
108
  * Loaded by dynamic `import()` to avoid namespace collisions with test
109
109
  * modules named `hooks` (the TS analogue of the Python importlib-by-path
110
110
  * approach).
@@ -83,6 +83,25 @@ projection:
83
83
  # a non-kernel rule also needs a `packs:` intersection to project — e.g.
84
84
  # deselecting `frontend-design` removes ui-audit-gate + design-fidelity.
85
85
  # Empty = inactive, same as rule_workspaces.
86
+ #
87
+ # `rule_packs: auto` derives the id list from the ACTIVE-PACK set — the same
88
+ # set the skill/command prune uses — instead of hand-typing ids that would
89
+ # need re-typing whenever a pack is added. It exists because a domain safety
90
+ # floor whose own body says "auto-activates when pack-X is installed" ships
91
+ # today into installs that have no pack-X, where it guards nothing. Measured
92
+ # on this repo (2026-08-02): `auto` drops 8 rules / 8,110 GPT tok — the six
93
+ # domain floors plus provider-lifecycle-discipline and
94
+ # spreadsheet-source-quality. `history-discipline` and `scale-discipline`
95
+ # correctly SURVIVE (their packs are engineering-workspace packs).
96
+ #
97
+ # The DEFAULT stays `[]`. Flipping it to `auto` changes what a consumer
98
+ # install receives and therefore inherits the same human release gate the
99
+ # workspace axis carries (2026-07-13,
100
+ # agents/settings/contexts/consumer-scoping-audit-2026-07-07.md) — that
101
+ # audit's "unsure → ship it" ruling was about the maintainer-vs-consumer
102
+ # WORKSPACE question, not about a pack condition the rule declares itself,
103
+ # but the gate applies to the flip either way. Do not set this from
104
+ # automation.
86
105
  rule_packs: []
87
106
 
88
107
  # --- Discipline profile (successor knob, opt-in until the evidence gates pass) ---
@@ -207,6 +226,16 @@ cost:
207
226
  weekly: 0
208
227
  # Monthly USD ceiling (rolling 30d). 0 / null = no monthly budget.
209
228
  monthly: 0
229
+ # Per-model-tier USD ceilings for budget-aware cheap-request delegation
230
+ # (docs/contracts/budget-routing.md; council 2026-08-03). null = no
231
+ # separate tier cap — the global ceilings above still apply and the
232
+ # budget-routing relation works purely off them. Set a value to cap one
233
+ # tier (e.g. cheap: 10 keeps haiku-class delegation under $10/day-window
234
+ # of the ledger). Consumed by subagents.budget_routing below.
235
+ per_tier:
236
+ cheap: null
237
+ medium: null
238
+ strong: null
210
239
  # Enforcement mode at the HARD_STOP tier (100% utilization):
211
240
  # advisory = dashboards and `cost:check` show the breach; agent
212
241
  # keeps working. Default. Safe for greenfield projects.
@@ -256,7 +285,11 @@ personal:
256
285
  # greeting silently disappears, the context window is degrading and it is
257
286
  # time for a fresh conversation. Also keeps the reply-close markers alive
258
287
  # (ONE end-summary; PR URL as the literal last line).
259
- # Empty = feature off. See rules/session-canary.md.
288
+ # Personal concern, resolved user-globally: empty here falls back to the
289
+ # user-global settings' personal.canary_name and then to identity.name in
290
+ # the wizard's settings/.agent-user.yml — set this key only to OVERRIDE
291
+ # the global name per project. No name on any layer = feature off.
292
+ # See rules/session-canary.md.
260
293
  canary_name: ""
261
294
 
262
295
  # Prefix PR comment replies with a bot icon 🤖 (true, false)
@@ -458,14 +491,14 @@ roadmap:
458
491
  # of the run, at every phase boundary, and at run end — this knob
459
492
  # only affects the inter-step beat.
460
493
  #
461
- # per_step = legacy default: regen after every checkbox flip.
462
- # Safest for crash recovery; highest subprocess
463
- # overhead. Use when a session may be killed
464
- # mid-roadmap and a fresh dashboard must always
465
- # reflect the last-saved step.
466
- # every_5_steps = batch flips, regen every 5 closed steps + at
467
- # every phase boundary. Balanced cost/freshness
468
- # for runs of 20–100 steps.
494
+ # per_step = regen after every checkbox flip. Safest for
495
+ # crash recovery; highest subprocess overhead.
496
+ # Use when a session may be killed mid-roadmap
497
+ # and a fresh dashboard must always reflect the
498
+ # last-saved step.
499
+ # every_5_steps = default: batch flips, regen every 5 closed
500
+ # steps + at every phase boundary. Balanced
501
+ # cost/freshness for runs of 20–100 steps.
469
502
  # phase_boundary = regen only at phase boundaries + run end.
470
503
  # Cheapest for long roadmaps (100+ steps).
471
504
  # The checkbox flip itself is still inline per
@@ -474,8 +507,10 @@ roadmap:
474
507
  # `process-step` ignores this knob (single-step runs always regen
475
508
  # at the end of the step). The Iron Law 1 mandate to regen on any
476
509
  # file-shape touch (rename / phase add / archive) still fires
477
- # immediately regardless of this setting.
478
- dashboard_regen_cadence: per_step
510
+ # immediately regardless of this setting — so the dashboard is never
511
+ # stale across a rename, a phase add, or an archive, whatever the
512
+ # inter-step beat is.
513
+ dashboard_regen_cadence: every_5_steps
479
514
 
480
515
  # Visible-horizon framing in roadmap authoring (integer weeks, default 0).
481
516
  # 0 = off (default). Time-boxed plate / horizon framing is forbidden:
@@ -679,6 +714,19 @@ subagents:
679
714
  # false = every subagent runs on the session tier.
680
715
  downshift: true
681
716
 
717
+ # Budget-aware cheap-request delegation (docs/contracts/budget-routing.md).
718
+ # Picks the cheapest CLASSIFIER-ADEQUATE tier that has available budget
719
+ # (cost.budgets.per_tier above); cheap exhausted but strong funded → strong
720
+ # tier; everything exhausted → session model + notice. Work is never
721
+ # blocked to save money, and the session model is never switched — routing
722
+ # happens as delegation with a model override. DISTINCT from `downshift`
723
+ # above: downshift is the quality/cost trade-off knob, budget_routing is
724
+ # the resource-availability gate (council 2026-08-03).
725
+ # ask = (default) first budget-motivated downshift of a session asks once
726
+ # auto = apply the relation silently (telemetry line per routed request)
727
+ # off = today's behavior; single-flip rollback
728
+ budget_routing: ask
729
+
682
730
  # Prefer a separate-quota-pool model for delegable sub-tasks WHERE the host
683
731
  # manifest reports `separate_quota_pool: true` (e.g. a subscription whose
684
732
  # Sonnet allowance is distinct from Opus). Optional bonus only — behaviour is
@@ -66,7 +66,15 @@ pre_push_budget_seconds: 25
66
66
  # artifact needs something only CI builds (site, tarball, bundle)
67
67
  # benchmark it is a measurement, timing-sensitive or paid
68
68
  # matrix needs an OS or Node version this machine is not
69
+ # resolver not a gate at all — a helper a workflow step calls to compute
70
+ # something (a diff base, a scope); it decides and blocks nothing
69
71
  ci_only:
72
+ - id: check_evaluator_budgets
73
+ class: benchmark
74
+ reason: "asserts against a measurements JSON that only the nightly evaluator-umbrella run produces — with no artifact there is nothing local to compare against"
75
+ - id: resolve_lint_scope
76
+ class: resolver
77
+ reason: "not a gate — the diff-base resolver skill-lint.yml shell steps call so they scope from the same source as `skill_linter --changed`; it decides nothing and blocks nothing"
70
78
  - id: adoption_snapshot
71
79
  class: network
72
80
  reason: "live api.npmjs.org + api.github.com calls, reads GITHUB_TOKEN"
@@ -18,21 +18,21 @@
18
18
  # /skill-management, /override:create, etc. They carry no runtime
19
19
  # frontmatter on purpose: the consuming command fills it in. Quarantined
20
20
  # from the discovery manifest so strict mode stays clean.
21
- - path: .agent-src.uncondensed/templates/AGENTS.md
21
+ - path: src/agent-src/templates/AGENTS.md
22
22
  reason: scaffold template for new project AGENTS.md; placeholders filled by /agents init
23
- - path: .agent-src.uncondensed/templates/agent-settings.md
23
+ - path: src/agent-src/templates/agent-settings.md
24
24
  reason: scaffold for project .agent-settings.yml
25
- - path: .agent-src.uncondensed/templates/command.md
25
+ - path: src/agent-src/templates/command.md
26
26
  reason: scaffold for new slash-command authoring
27
27
  - path: src/agent-src/templates/tickets.md
28
28
  reason: scaffold template for ticket-bundle tickets (ADR-101); carries no runtime frontmatter — emit-tickets fills it in per ticket
29
- - path: .agent-src.uncondensed/templates/contexts.md
29
+ - path: src/agent-src/templates/contexts.md
30
30
  reason: scaffold index for project contexts/
31
- - path: .agent-src.uncondensed/templates/contexts/auth-model.md
31
+ - path: src/agent-src/templates/contexts/auth-model.md
32
32
  reason: scaffold for project auth-model context
33
- - path: .agent-src.uncondensed/templates/contexts/data-sensitivity.md
33
+ - path: src/agent-src/templates/contexts/data-sensitivity.md
34
34
  reason: scaffold for project data-sensitivity context
35
- - path: .agent-src.uncondensed/templates/contexts/deployment-order.md
35
+ - path: src/agent-src/templates/contexts/deployment-order.md
36
36
  reason: scaffold for project deployment-order context
37
37
  - path: src/agent-src/templates/contexts/knowledge-card.md
38
38
  reason: fill-in skeleton for committed knowledge cards (evidence-first structure discovery / ADR-098); frontmatter is the example shape a filled card carries, not a runtime artefact
@@ -40,37 +40,35 @@
40
40
  reason: convention doc for the typed agents/knowledge/ page directories (road-to-knowledge-system); documents the optional page frontmatter shape, carries none itself
41
41
  - path: src/agent-src/templates/contexts/lesson-card.md
42
42
  reason: fill-in skeleton for Class-C learned lessons (Evidence v2 project-intelligence); frontmatter is the example shape a filled lesson carries, not a runtime artefact
43
- - path: .agent-src.uncondensed/templates/contexts/observability.md
43
+ - path: src/agent-src/templates/contexts/observability.md
44
44
  reason: scaffold for project observability context
45
- - path: .agent-src.uncondensed/templates/contexts/tenant-boundaries.md
45
+ - path: src/agent-src/templates/contexts/tenant-boundaries.md
46
46
  reason: scaffold for project tenant-boundaries context
47
- - path: .agent-src.uncondensed/templates/copilot-instructions.md
47
+ - path: src/agent-src/templates/copilot-instructions.md
48
48
  reason: scaffold for project copilot-instructions.md
49
- - path: .agent-src.uncondensed/templates/features.md
49
+ - path: src/agent-src/templates/features.md
50
50
  reason: scaffold for project features.md catalogue
51
- - path: .agent-src.uncondensed/templates/overrides/command.md
51
+ - path: src/agent-src/templates/overrides/command.md
52
52
  reason: scaffold for project override of a shared command
53
- - path: .agent-src.uncondensed/templates/overrides/guideline.md
53
+ - path: src/agent-src/templates/overrides/guideline.md
54
54
  reason: scaffold for project override of a shared guideline
55
- - path: .agent-src.uncondensed/templates/overrides/rule.md
55
+ - path: src/agent-src/templates/overrides/rule.md
56
56
  reason: scaffold for project override of a shared rule
57
- - path: .agent-src.uncondensed/templates/overrides/skill.md
57
+ - path: src/agent-src/templates/overrides/skill.md
58
58
  reason: scaffold for project override of a shared skill
59
- - path: .agent-src.uncondensed/templates/overrides/template.md
59
+ - path: src/agent-src/templates/overrides/template.md
60
60
  reason: scaffold-of-scaffold for new override types
61
- - path: .agent-src.uncondensed/templates/persona.md
61
+ - path: src/agent-src/templates/persona.md
62
62
  reason: scaffold for new persona authoring
63
- - path: .agent-src.uncondensed/templates/roadmaps.md
63
+ - path: src/agent-src/templates/roadmaps.md
64
64
  reason: scaffold for new roadmap authoring
65
- - path: .agent-src.uncondensed/templates/rule.md
65
+ - path: src/agent-src/templates/rule.md
66
66
  reason: scaffold for new rule authoring
67
- - path: .agent-src.uncondensed/templates/scripts/.pytest_cache/README.md
68
- reason: pytest cache artefact, not an agent-config artefact
69
- - path: .agent-src.uncondensed/templates/scripts/README.md
67
+ - path: src/agent-src/templates/scripts/README.md
70
68
  reason: scaffold README for project scripts/
71
- - path: .agent-src.uncondensed/templates/skill-archive-note.md
69
+ - path: src/agent-src/templates/skill-archive-note.md
72
70
  reason: scaffold for archive-note generation
73
- - path: .agent-src.uncondensed/templates/skill.md
71
+ - path: src/agent-src/templates/skill.md
74
72
  reason: scaffold for new SKILL.md authoring
75
- - path: .agent-src.uncondensed/README.md
73
+ - path: src/agent-src/README.md
76
74
  reason: package-root orientation; carries no artefact frontmatter — follows package core
@@ -4,43 +4,73 @@
4
4
  "owner": "maintainer",
5
5
  "review_by": "2027-07-27",
6
6
  "regression_pct": 10,
7
+ "posture": {
8
+ "on_release": "fail",
9
+ "on_main_and_prs": "warn",
10
+ "on_local": "fail",
11
+ "always_blocking": ["a metric with no measurement supplied"],
12
+ "rationale": "road-to-gates-that-can-fail Phase 5. A hard fail on main turns every legitimate command addition into a blocked merge, which is how budgets get quietly raised with a cushion instead of consciously — so budget / regression / drift findings are ADVISORY on main, the nightly and ordinary PRs, and BLOCKING on a release ref. Not a weakening: before the Phase-4 path triggers, this gate ran on release PRs and the nightly only, so the surfaces that now warn never saw it at all. A LOCAL run (no CI env) is strict, because a maintainer running it by hand — including release.ts — wants the strict answer and blocks nobody. A metric with NO measurement is always blocking in either posture: that is a broken harness reporting green on nothing. Implemented in src/scripts/check_evaluator_budgets.ts::detectPosture; override with --posture warn|fail.",
13
+ "delivery": "This posture IS the nightly-visibility route (council 2026-08-02, blocker nightly-visibility-owner), not a second mechanism beside it: the nightly publishes measurement_record below, a later run re-measures and compares, and the contradiction warns on main / fails on release. No notification channel, no auto-managed issue — a one-maintainer channel producing routine noise gets muted, and a muted channel reproduces the original failure."
14
+ },
15
+ "measurement_record": {
16
+ "path": "agents/evidence/metrics/evaluator-measurements.json",
17
+ "written_by": "src/scripts/evaluator_umbrella.sh (UMBRELLA_RECORD=1 — the nightly sets it)",
18
+ "compared_by": "src/scripts/check_evaluator_budgets.ts --recorded",
19
+ "note": "Only entries WITHOUT `deterministic: false` participate in the drift comparison. The council's recorded objection was that a non-deterministic comparison produces noise and gets ignored; determinism is therefore a precondition, verified per metric, not an assumption."
20
+ },
21
+ "remeasurement_2026_08_02": {
22
+ "verified_against_a_fresh_run": {
23
+ "cli_help_command_count": "80 — three consecutive runs of the pinned method on an unchanged tree returned 80/80/80. Matches last_measured; deterministic confirmed.",
24
+ "mcp_public_tool_count": "19 — two consecutive tools/list runs on a freshly built dist/mcp/server.mjs returned 19/19. Matches last_measured; deterministic confirmed."
25
+ },
26
+ "not_re_measured": "unpacked_size_mb, node_modules_mb, runtime_dep_count, cli_version_cold_ms, mcp_boot_to_initialize_ms. All five require the packed-tarball harness (npm pack of a fully built tree, then a clean `npm install --omit=dev <tarball>` into a scratch project) that evaluator_umbrella.sh runs in CI. They were NOT re-measured in this pass and their values remain the 2026-07-27 acceptance numbers — stated rather than invented. The next nightly writes the real numbers into measurement_record, and the drift check then reports any contradiction with last_measured on the PR that carries it."
27
+ },
7
28
  "budgets": {
8
29
  "unpacked_size_mb": {
9
30
  "max": 28,
10
31
  "last_measured": 26.05,
32
+ "last_measured_at": "2026-07-27",
11
33
  "method": "npm pack --json → dist.unpackedSize / 1e6 — includes the Phase-1 precompiled bundles (dist/hooks/dispatch.js + dist/mcp/server.mjs, ~2.1 MB) that bought the 23x hook-latency win and the tsx removal, plus dist/cli-delegate/ (~1.40 MB, ADR-204) which finished that removal for the consumer command surface. This gate is the ONLY size trip-wire on those bundles by design: a dedicated per-bundle budget key would need its own measurement wired into evaluator_umbrella.sh, and an unwired key fails check_evaluator_budgets with 'no measurement supplied' instead of guarding anything. ADR-204 projected 27.45 against max 28 without packing — the next real measurement here is the confirming one, and headroom is thin"
12
34
  },
13
35
  "node_modules_mb": {
14
36
  "max": 140,
15
37
  "last_measured": 127,
38
+ "last_measured_at": "2026-07-27",
16
39
  "method": "du -sm node_modules after `npm install --omit=dev <tarball>` in a clean project"
17
40
  },
18
41
  "runtime_dep_count": {
19
42
  "max": 200,
20
43
  "last_measured": 187,
44
+ "last_measured_at": "2026-07-27",
21
45
  "method": "package-lock.json packages count (minus root) of the clean --omit=dev install"
22
46
  },
23
47
  "cli_version_cold_ms": {
24
48
  "max": 1500,
25
49
  "last_measured": 370,
50
+ "last_measured_at": "2026-07-27",
26
51
  "method": "wall-clock of the FIRST `agent-config --version` after install (cold fs cache run counts)",
27
- "regression_pct": 200
52
+ "regression_pct": 200,
53
+ "deterministic": false
28
54
  },
29
55
  "mcp_boot_to_initialize_ms": {
30
56
  "max": 2000,
31
57
  "last_measured": 264,
58
+ "last_measured_at": "2026-07-27",
32
59
  "method": "initialize request piped to `node dist/mcp/server.mjs`, wall-clock to response",
33
- "regression_pct": 200
60
+ "regression_pct": 200,
61
+ "deterministic": false
34
62
  },
35
63
  "cli_help_command_count": {
36
- "max": 80,
37
- "last_measured": 80,
64
+ "max": 81,
65
+ "last_measured": 81,
66
+ "last_measured_at": "2026-08-03",
38
67
  "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)",
39
- "baseline_note": "79 → 80 on 2026-07-29 (9.9.0). This RECORDS growth that already shipped through its own reviewed PRs; it does not authorize new surface. Net +6 registry entries since the 9.8.0 tag (7 added — code-graph, knowledge, analytics, memory:get, memory:learn, rtk:detect, dispatch:hook; 1 removed — the old dispatch:hook entry), and the frozen 79 was never re-measured after them. The gate did its job: it made the drift visible at release time rather than letting it accrue silently. Next addition breaches again by design."
68
+ "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."
40
69
  },
41
70
  "mcp_public_tool_count": {
42
71
  "max": 19,
43
72
  "last_measured": 19,
73
+ "last_measured_at": "2026-08-02",
44
74
  "method": "tools/list length on the stdio server (post-ADR-132: implemented tools only)"
45
75
  }
46
76
  }
@@ -38,6 +38,51 @@
38
38
  # pending = not yet emitting `scanned:`. The guard REPORTS these
39
39
  # rather than skipping silently: its own partial coverage must be
40
40
  # visible, or it repeats the sin it exists to catch.
41
+ # canary optional mutation recipe (Phase 7) — see CANARY below
42
+ #
43
+ # COVERAGE — THE HONEST DENOMINATOR (measured 2026-08-02)
44
+ # ------------------------------------------------------
45
+ # 211 `lint_*` / `check_*` / `audit_*` scripts live under `src/scripts/`.
46
+ # **8 of them emit the machine-readable `scanned: <N>` line under their
47
+ # CI-identical argv, and all 8 are listed below.** The manifest is therefore
48
+ # complete with respect to its own contract, and covers ~4 % of the gate
49
+ # population.
50
+ #
51
+ # The other ~203 are NOT covered, for one reason: rule 1. They print their count
52
+ # in prose ("111 file(s) scanned", "0 declarer(s)") or not at all, and a guard
53
+ # that parses prose is the fragile thing being replaced. Padding this list with
54
+ # them would manufacture exactly the false green the file exists to prevent.
55
+ #
56
+ # Closing the gap is one line per gate, not a new mechanism: a gate that already
57
+ # computes its count for `_lib/scan_scope.assertScanned` need only also write
58
+ # `scanned: <N>`. Seven gates are one line away today — they call `assertScanned`
59
+ # / `assertWatchlistResolves` with a real count in hand: `audit_skill_overlap`,
60
+ # `check_iron_law_prominence`, `check_safety_floor_untouched`, `lint_handoffs`,
61
+ # `lint_namespace`, `lint_artefact_frontmatter`, `skill_linter` (listed).
62
+ # `tests/scripts/check_gate_coverage.test.ts` fails the build the moment a gate
63
+ # starts emitting the line without being registered here, so the list cannot
64
+ # silently fall behind again (that omission is exactly how `check_site_links`
65
+ # reported green over a stale build for weeks).
66
+ #
67
+ # CANARY (road-to-gates-that-can-fail Phase 7)
68
+ # --------------------------------------------
69
+ # Coverage proves a gate READ something. It cannot prove the gate can still FAIL.
70
+ # An optional `canary:` block declares one revertible violation for the gate:
71
+ #
72
+ # canary:
73
+ # class: defect class planted (gate-surface classes, not the review-side
74
+ # five; the shared contract is cadence + sealing + never-ships)
75
+ # path: repo-relative file to CREATE (must not already exist)
76
+ # content: the planted body
77
+ #
78
+ # `--canary` plants it, runs the gate with the same CI-identical argv, records
79
+ # red/green, and deletes the plant in a `finally`. Create-only is deliberate: an
80
+ # in-place edit would need byte-exact restoration of a tracked file, and a canary
81
+ # that can corrupt the tree violates the never-ships rule it inherits. The
82
+ # consequence is a real gap — a gate whose only possible violation is a
83
+ # modification of an existing tracked artefact (`check_condensation`, whose
84
+ # contract is `dist == rewrite(src)`; `check_ci_local_parity`, whose corpus is
85
+ # workflow files) carries no recipe and is reported UNPROVEN, never green.
41
86
  gates:
42
87
  - id: check_condensation
43
88
  argv: []
@@ -50,6 +95,16 @@ gates:
50
95
  min_scanned: 80
51
96
  corpus: "auto-type rules carrying a description (98 at baseline)"
52
97
  status: enforced
98
+ canary:
99
+ class: oversized-artifact
100
+ path: src/rules/zz-canary-probe.md
101
+ content: |
102
+ ---
103
+ type: auto
104
+ description: "zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz"
105
+ ---
106
+
107
+ Planted canary: a 180-char auto-rule description, 30 over the cap.
53
108
  note: >
54
109
  Retargeted 2026-07-29 from the ADR-051-emptied tree (0 -> 98). It printed
55
110
  "All 0 auto-rule descriptions" and exited 0 in CI. Retargeting surfaced 16
@@ -64,6 +119,18 @@ gates:
64
119
  min_scanned: 180
65
120
  corpus: "md files inspected for a load_context block: src/rules + src/agent-src/contexts + agents/settings/contexts (231 at baseline, 17 declarers)"
66
121
  status: enforced
122
+ canary:
123
+ class: dead-target
124
+ path: src/rules/zz-canary-probe.md
125
+ content: |
126
+ ---
127
+ type: auto
128
+ description: "Planted canary rule declaring a load_context target that does not exist."
129
+ load_context:
130
+ - contexts/zz-canary-target-does-not-exist.md
131
+ ---
132
+
133
+ Planted canary: a declared context target with nothing behind it.
67
134
  note: >
68
135
  Retargeted 2026-07-29 from the ADR-051-emptied tree: 0 -> 231 files, and it
69
136
  immediately found a real violation the blindness had hidden
@@ -80,6 +147,11 @@ gates:
80
147
  min_scanned: 380
81
148
  corpus: "skills + rules under artefact_roots() (429 at baseline)"
82
149
  status: enforced
150
+ canary:
151
+ class: malformed-frontmatter
152
+ path: src/skills/zz-canary-probe/SKILL.md
153
+ content: |
154
+ Planted canary: a SKILL.md with no frontmatter block at all.
83
155
  note: >
84
156
  NOT blind — the manifest's regression case for rule 2. The sweep's bare
85
157
  probe made it look blind; `--all` scans 429. Enforced precisely so that
@@ -91,6 +163,17 @@ gates:
91
163
  min_scanned: 700
92
164
  corpus: "stable artefacts across src/{rules,skills,agent-src/*} + docs/ + agents/settings/contexts (872 at baseline)"
93
165
  status: enforced
166
+ canary:
167
+ class: stale-reference
168
+ path: src/rules/zz-canary-probe.md
169
+ content: |
170
+ ---
171
+ type: auto
172
+ description: "Planted canary rule linking a stable artefact into the transient roadmap tree."
173
+ ---
174
+
175
+ See [the plan](../../agents/roadmaps/road-to-nowhere.md) — the exact
176
+ stable-to-transient link this gate exists to reject.
94
177
  note: >
95
178
  Retargeted 2026-07-29 from the ADR-051-emptied tree. It had been enforcing the
96
179
  no-roadmap-references rule for docs/ only while the rule + skill layer went
@@ -102,10 +185,30 @@ gates:
102
185
  min_scanned: 900
103
186
  corpus: "reference corpus: src/{rules,skills,agent-src/commands,agent-src/contexts,domains} + agents/roadmaps (1170 at baseline)"
104
187
  status: enforced
188
+ canary:
189
+ class: orphan-artifact
190
+ path: src/agent-src/contexts/zz-canary-probe.md
191
+ content: |
192
+ # Planted canary: a context nothing in the reference corpus points at.
105
193
  note: >
106
194
  Retargeted 2026-07-29. An empty reference corpus makes every "unreferenced
107
195
  context" verdict vacuous, which is how the dead root stayed invisible.
108
196
 
197
+ - id: check_ci_local_parity
198
+ argv: ["--quiet"]
199
+ min_scanned: 380
200
+ corpus: "CI + local gate invocations parsed from .github/workflows + taskfiles (443 at baseline)"
201
+ status: enforced
202
+ note: >
203
+ Registered 2026-08-02. It already emitted the contract line on every path,
204
+ including the failing one — it was simply never listed, the same omission
205
+ that let check_site_links report green over a stale build. Found by the
206
+ registry-completeness test rather than by another sweep, which is the point
207
+ of adding that test. NO CANARY RECIPE: its corpus is the workflow and
208
+ taskfile set, so the only plantable violation is a new file under
209
+ .github/workflows — a surface the canary must not write to. Reported
210
+ UNPROVEN by --canary, never green.
211
+
109
212
  - id: check_site_links
110
213
  argv: []
111
214
  min_scanned: 20
@@ -125,3 +228,47 @@ gates:
125
228
  shards — is NOT listed here because it was deleted rather than repaired
126
229
  (skill_linter --all already covers all 429 artefacts in 0.5s).
127
230
 
231
+
232
+ # ── Registered 2026-08-02 (road-to-renewal-foundation Phase 1) ───────────
233
+ # All three were repaired in the same change from scanning a root ADR-051
234
+ # deleted. Each exited 0 the whole time it was blind, which is why the
235
+ # registration matters more than the repair: the repair fixes today, the
236
+ # floor is what makes the next path migration LOUD instead of silent.
237
+ # The roadmap step asked for `assertScanned` to be made mandatory across all
238
+ # corpus gates; this manifest is the stronger form of the same guarantee —
239
+ # `assertScanned` can only distinguish 0 from 1, while a floor also catches
240
+ # the 1566 → 3 collapse that a `> 0` check reports as healthy.
241
+
242
+ - id: check_portability
243
+ argv: []
244
+ min_scanned: 1200
245
+ corpus: "all .md under src/ + dist/agent-src/ plus the shipped root files (1,566 at baseline)"
246
+ status: enforced
247
+ note: >
248
+ SCAN_DIRS named the retired authoring root, so the entire src/ tree —
249
+ more than half the corpus — was skipped and an identifier authored there
250
+ was caught only once a condense run projected it into dist/agent-src/.
251
+
252
+ - id: check_references
253
+ argv: []
254
+ min_scanned: 800
255
+ corpus: ".md under the scanned roots plus memory YAML (1,043 at baseline)"
256
+ status: enforced
257
+ note: >
258
+ src/ was absent from every reference-resolution candidate list, so a link
259
+ resolvable only under the source of truth was reported BROKEN. The
260
+ failure direction was false-positive rather than false-green, but the
261
+ cause was the same dead root.
262
+
263
+ - id: lint_framework_leakage
264
+ argv: []
265
+ min_scanned: 350
266
+ corpus: "skills / rules / commands .md (431 at baseline)"
267
+ status: enforced
268
+ note: >
269
+ Its human summary prints "N hits across M files", where M is files WITH
270
+ HITS — 0 on a clean run. Reading that as coverage is precisely how a
271
+ blind gate looks healthy, so this gate now emits a separate `scanned:`
272
+ count. Its inventory-file exemption was also dead: it compared against
273
+ the retired root AND against 'dist/agent-src' as a single path segment,
274
+ which a '/'-split can never yield.
@@ -0,0 +1,25 @@
1
+ {
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
+ "gates": {
4
+ "check_no_new_legacy_path:hardcoded-scan-roots": {
5
+ "count": 51,
6
+ "landed": "2026-08-02",
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)."
8
+ },
9
+ "audit_user_type_axis": {
10
+ "count": 1,
11
+ "landed": "2026-08-02",
12
+ "note": "One orphan user-type value: `legal`. Five legal-review-prep skills (contract-review, dpa-review, nda-triage, legal-intake-triage, legal-practice-profile) declare `recommended_for_user_types: [legal]`, but there is no `user-types/legal.yml` — the pack shipped an axis value with no user-type definition behind it, and the dead scan root hid it (the audit reported used=0 orphans=0 while reading zero skills; it now reads 288 and reports used=8). Clearing this entry is a product call, not a copy edit: either author `user-types/legal.yml` (tagline, recommended packs, install-path hint) or drop `legal` from those five skills. Not decided here because both options change shipped pack behaviour."
13
+ },
14
+ "lint_handoffs": {
15
+ "count": 18,
16
+ "landed": "2026-08-02",
17
+ "note": "All 18 are `handoff_tier_mismatch`: a senior-tier skill links to a peer whose frontmatter carries no `tier` (reported as tier='unset') — e.g. build-buy-partner → adr-create, customer-research → po-discovery, gated-reach → threat-modeling. This is a tier-metadata backfill backlog on the LINKED-TO skills, not a broken link. The one genuinely dangling link revealed by the same repair (competitive-positioning → a non-existent ../analyze-reference-repo/SKILL.md; it is a command, not a skill) was FIXED in the repairing commit rather than baselined. Clearing this entry means backfilling `tier` on the linked-to skills, or deciding that `tier: unset` on a link target is not a violation and narrowing the rule."
18
+ },
19
+ "lint_pack_boundaries": {
20
+ "count": 337,
21
+ "landed": "2026-08-02",
22
+ "note": "Markdown links between source artefacts that cross a pack boundary the source pack's `requires` graph does not reach — revealed when the scan root moved off the deleted packages/ tree to the live corpus (0 -> 753 artefacts scanned). 82 distinct pack pairs across 131 source files; largest single class is engineering-base -> meta (73), skills in a consumer-installable pack citing this package's own maintenance skills. Each is a link that dangles for a consumer who installs the source pack without the target's. Judged real drift rather than an over-strict gate because it is long-tailed — top bucket 22%, no single systematic cause — unlike the lint_artefact_frontmatter case, where one required shape had 0-of-288 adoption. Fix per finding: add the edge to packs.yml requires, retarget the link, or move the artefact."
23
+ }
24
+ }
25
+ }