@event4u/agent-config 14.10.0 → 14.11.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 (399) hide show
  1. package/.augment-plugin/marketplace.json +3 -3
  2. package/.augment-plugin/plugin.json +1 -1
  3. package/.claude-plugin/marketplace.json +1 -1
  4. package/CHANGELOG.md +335 -0
  5. package/README.md +1 -1
  6. package/dist/agent-src/commands/design.md +88 -0
  7. package/dist/agent-src/commands/project/analyze.md +47 -0
  8. package/dist/agent-src/commands/review/changes.md +67 -6
  9. package/dist/agent-src/commands/roadmap/create.md +49 -0
  10. package/dist/agent-src/commands/roadmap/next.md +27 -11
  11. package/dist/agent-src/commands/roadmap/process-full.md +14 -0
  12. package/dist/agent-src/commands/video/from-script.md +60 -3
  13. package/dist/agent-src/commands/video/stitch.md +14 -0
  14. package/dist/agent-src/contexts/communication/rules-auto/guidelines-mechanics.md +1 -0
  15. package/dist/agent-src/contexts/execution/roadmap-process-loop.md +154 -2
  16. package/dist/agent-src/rules/active-remediation.md +3 -3
  17. package/dist/agent-src/rules/code-provenance.md +2 -2
  18. package/dist/agent-src/rules/context-hygiene.md +13 -33
  19. package/dist/agent-src/rules/council-availability.md +2 -2
  20. package/dist/agent-src/rules/decision-revisit-gate.md +3 -1
  21. package/dist/agent-src/rules/design-fidelity.md +18 -0
  22. package/dist/agent-src/rules/design-review-after-ui-write.md +2 -2
  23. package/dist/agent-src/rules/evaluator-independence.md +56 -44
  24. package/dist/agent-src/rules/fix-what-you-see.md +9 -1
  25. package/dist/agent-src/rules/framework-neutrality-in-generic-skills.md +1 -1
  26. package/dist/agent-src/rules/minimal-safe-diff.md +14 -20
  27. package/dist/agent-src/rules/missing-skill-recovery.md +13 -1
  28. package/dist/agent-src/rules/playbook-precedence.md +105 -0
  29. package/dist/agent-src/rules/recurring-criticism.md +3 -1
  30. package/dist/agent-src/rules/roadmap-progress-sync.md +14 -13
  31. package/dist/agent-src/rules/scale-discipline.md +24 -0
  32. package/dist/agent-src/rules/security-sensitive-stop.md +2 -2
  33. package/dist/agent-src/rules/settings-ask-protocol.md +2 -2
  34. package/dist/agent-src/rules/ui-audit-gate.md +27 -15
  35. package/dist/agent-src/rules/untrusted-input-defense.md +2 -2
  36. package/dist/agent-src/skills/accessibility-auditor/SKILL.md +19 -0
  37. package/dist/agent-src/skills/adr-create/SKILL.md +7 -0
  38. package/dist/agent-src/skills/agents-md-thin-root/SKILL.md +33 -0
  39. package/dist/agent-src/skills/ai-council/references/advanced-modes.md +17 -3
  40. package/dist/agent-src/skills/ai-council/references/output-and-synthesis.md +31 -0
  41. package/dist/agent-src/skills/ai-council/references/procedure.md +19 -0
  42. package/dist/agent-src/skills/alerting-doctrine/SKILL.md +225 -0
  43. package/dist/agent-src/skills/alerting-doctrine/evals/triggers.json +17 -0
  44. package/dist/agent-src/skills/authz-review/SKILL.md +0 -1
  45. package/dist/agent-src/skills/blast-radius-analyzer/SKILL.md +32 -0
  46. package/dist/agent-src/skills/brand/SKILL.md +3 -0
  47. package/dist/agent-src/skills/brand-asset-generation/SKILL.md +3 -0
  48. package/dist/agent-src/skills/brand-audit/SKILL.md +3 -0
  49. package/dist/agent-src/skills/brand-identity/SKILL.md +3 -0
  50. package/dist/agent-src/skills/brand-strategy/SKILL.md +3 -0
  51. package/dist/agent-src/skills/brand-to-tokens/SKILL.md +3 -0
  52. package/dist/agent-src/skills/check-refs/SKILL.md +3 -0
  53. package/dist/agent-src/skills/code-review/SKILL.md +11 -0
  54. package/dist/agent-src/skills/command-routing/SKILL.md +6 -0
  55. package/dist/agent-src/skills/condense-memory/SKILL.md +3 -0
  56. package/dist/agent-src/skills/context-authoring/SKILL.md +1 -1
  57. package/dist/agent-src/skills/conventional-commits-writing/SKILL.md +3 -0
  58. package/dist/agent-src/skills/copilot-agents-optimization/SKILL.md +10 -0
  59. package/dist/agent-src/skills/corpus-grounding/SKILL.md +3 -0
  60. package/dist/agent-src/skills/design-intelligence/SKILL.md +3 -0
  61. package/dist/agent-src/skills/design-intelligence/data/landing.csv +36 -35
  62. package/dist/agent-src/skills/design-intelligence/data/stacks/threejs.csv +1 -0
  63. package/dist/agent-src/skills/design-review/SKILL.md +79 -1
  64. package/dist/agent-src/skills/design-review/references/verification-automation.md +41 -0
  65. package/dist/agent-src/skills/design-system-capture/SKILL.md +35 -40
  66. package/dist/agent-src/skills/design-system-capture/references/import-procedure.md +50 -0
  67. package/dist/agent-src/skills/design-tokens/SKILL.md +3 -0
  68. package/dist/agent-src/skills/design-variations/SKILL.md +3 -0
  69. package/dist/agent-src/skills/developer-like-execution/SKILL.md +3 -0
  70. package/dist/agent-src/skills/estimate-ticket/SKILL.md +3 -0
  71. package/dist/agent-src/skills/existing-ui-audit/SKILL.md +20 -3
  72. package/dist/agent-src/skills/fe-design/SKILL.md +74 -41
  73. package/dist/agent-src/skills/fe-design/evals/triggers.json +65 -53
  74. package/dist/agent-src/skills/fe-design/references/craft-floor.md +52 -0
  75. package/dist/agent-src/skills/fe-design/references/source-led-port.md +36 -0
  76. package/dist/agent-src/skills/file-editor/SKILL.md +5 -0
  77. package/dist/agent-src/skills/finishing-a-development-branch/SKILL.md +2 -2
  78. package/dist/agent-src/skills/git-workflow/SKILL.md +3 -0
  79. package/dist/agent-src/skills/html-deck/SKILL.md +3 -0
  80. package/dist/agent-src/skills/iconography/SKILL.md +3 -0
  81. package/dist/agent-src/skills/image-editing/SKILL.md +3 -0
  82. package/dist/agent-src/skills/image-generation/SKILL.md +3 -0
  83. package/dist/agent-src/skills/image-provider-routing/SKILL.md +3 -0
  84. package/dist/agent-src/skills/incident-commander/SKILL.md +10 -0
  85. package/dist/agent-src/skills/js-library-packaging/SKILL.md +173 -0
  86. package/dist/agent-src/skills/js-library-packaging/evals/triggers.json +17 -0
  87. package/dist/agent-src/skills/js-library-packaging/scripts/check_package_surface.ts +270 -0
  88. package/dist/agent-src/skills/laravel-migration/SKILL.md +3 -0
  89. package/dist/agent-src/skills/learning-to-rule-or-skill/SKILL.md +3 -0
  90. package/dist/agent-src/skills/lint-skills/SKILL.md +3 -0
  91. package/dist/agent-src/skills/llm-provider-knowledge/SKILL.md +3 -0
  92. package/dist/agent-src/skills/logging-monitoring/SKILL.md +234 -51
  93. package/dist/agent-src/skills/logo-generation/SKILL.md +3 -0
  94. package/dist/agent-src/skills/md-language-check/SKILL.md +3 -0
  95. package/dist/agent-src/skills/monorepo-workspace/SKILL.md +149 -0
  96. package/dist/agent-src/skills/monorepo-workspace/evals/triggers.json +17 -0
  97. package/dist/agent-src/skills/motion-choreographer/SKILL.md +6 -0
  98. package/dist/agent-src/skills/multi-tenancy/SKILL.md +4 -0
  99. package/dist/agent-src/skills/operational-readiness/SKILL.md +184 -0
  100. package/dist/agent-src/skills/operational-readiness/evals/triggers.json +17 -0
  101. package/dist/agent-src/skills/override-management/SKILL.md +3 -0
  102. package/dist/agent-src/skills/persona-improvement/SKILL.md +3 -0
  103. package/dist/agent-src/skills/pest-testing/SKILL.md +3 -0
  104. package/dist/agent-src/skills/playbook-authoring/SKILL.md +162 -0
  105. package/dist/agent-src/skills/playwright-testing/SKILL.md +3 -0
  106. package/dist/agent-src/skills/privacy-review/SKILL.md +3 -0
  107. package/dist/agent-src/skills/prompt-engineering-image/SKILL.md +3 -0
  108. package/dist/agent-src/skills/quality-tools/SKILL.md +5 -0
  109. package/dist/agent-src/skills/react-shadcn-ui/SKILL.md +52 -21
  110. package/dist/agent-src/skills/readme-reviewer/SKILL.md +3 -0
  111. package/dist/agent-src/skills/readme-writing/SKILL.md +3 -0
  112. package/dist/agent-src/skills/readme-writing-package/SKILL.md +3 -0
  113. package/dist/agent-src/skills/receiving-code-review/SKILL.md +2 -2
  114. package/dist/agent-src/skills/refine-prompt/SKILL.md +3 -0
  115. package/dist/agent-src/skills/refine-ticket/SKILL.md +3 -0
  116. package/dist/agent-src/skills/requesting-code-review/SKILL.md +2 -2
  117. package/dist/agent-src/skills/review-routing/SKILL.md +2 -2
  118. package/dist/agent-src/skills/roadmap-writing/SKILL.md +23 -41
  119. package/dist/agent-src/skills/roadmap-writing/references/follow-up-roadmap-shape.md +47 -0
  120. package/dist/agent-src/skills/rtk-output-filtering/SKILL.md +22 -6
  121. package/dist/agent-src/skills/runway-cognition/SKILL.md +3 -0
  122. package/dist/agent-src/skills/scene-expander/scene-blueprint.schema.yaml +26 -0
  123. package/dist/agent-src/skills/secrets-management/SKILL.md +4 -0
  124. package/dist/agent-src/skills/server-hardening/SKILL.md +159 -0
  125. package/dist/agent-src/skills/server-hardening/evals/triggers.json +17 -0
  126. package/dist/agent-src/skills/skill-improvement-pipeline/SKILL.md +3 -0
  127. package/dist/agent-src/skills/skill-management/SKILL.md +3 -0
  128. package/dist/agent-src/skills/skill-reviewer/SKILL.md +3 -0
  129. package/dist/agent-src/skills/skill-writing/SKILL.md +6 -0
  130. package/dist/agent-src/skills/spreadsheet-authoring/SKILL.md +3 -0
  131. package/dist/agent-src/skills/storybook-workshop/SKILL.md +194 -0
  132. package/dist/agent-src/skills/storybook-workshop/evals/triggers.json +17 -0
  133. package/dist/agent-src/skills/storybook-workshop/scripts/story_contrast_floor.ts +134 -0
  134. package/dist/agent-src/skills/subagent-orchestration/SKILL.md +1 -1
  135. package/dist/agent-src/skills/subagent-orchestration/prompts/README.md +25 -0
  136. package/dist/agent-src/skills/supply-chain-intake/SKILL.md +12 -0
  137. package/dist/agent-src/skills/systematic-debugging/SKILL.md +1 -1
  138. package/dist/agent-src/skills/terraform/SKILL.md +3 -0
  139. package/dist/agent-src/skills/test-driven-development/SKILL.md +1 -1
  140. package/dist/agent-src/skills/threat-modeling/SKILL.md +0 -3
  141. package/dist/agent-src/skills/token-optimizer/SKILL.md +3 -0
  142. package/dist/agent-src/skills/typography-system/SKILL.md +3 -0
  143. package/dist/agent-src/skills/ui-component-architect/SKILL.md +9 -1
  144. package/dist/agent-src/skills/upstream-contribute/SKILL.md +3 -0
  145. package/dist/agent-src/skills/validate-feature-fit/SKILL.md +3 -0
  146. package/dist/agent-src/skills/verify-completion-evidence/SKILL.md +2 -2
  147. package/dist/agent-src/skills/wireframe/SKILL.md +3 -0
  148. package/dist/agent-src/skills/wireframe/references/story-beat-ledger.schema.json +115 -0
  149. package/dist/agent-src/skills/workspace-link/SKILL.md +131 -0
  150. package/dist/agent-src/skills/workspace-link/evals/triggers.json +17 -0
  151. package/dist/agent-src/templates/agents/agent-project-settings.example.yml +1 -1
  152. package/dist/agent-src/templates/playbook.md +75 -0
  153. package/dist/agent-src/templates/roadmaps.md +37 -0
  154. package/dist/agent-src/templates/scripts/check_playbook_invokes.ts +231 -0
  155. package/dist/agent-src/templates/scripts/work_engine/directives/ui/apply.ts +24 -0
  156. package/dist/agent-src/templates/scripts/work_engine/directives/ui/polish.ts +2 -0
  157. package/dist/agent-src/templates/scripts/work_engine/directives/ui/review.ts +216 -0
  158. package/dist/agent-src/templates/scripts/work_engine/directives/ui/scaffold.ts +159 -0
  159. package/dist/agent-src/templates/scripts/work_engine/directives/ui/stack_bundles.ts +73 -4
  160. package/dist/agent-src/templates/scripts/work_engine/stack/detect.ts +325 -40
  161. package/dist/cli/commands/uiAudit.js +221 -0
  162. package/dist/cli/commands/uiAudit.js.map +1 -0
  163. package/dist/cli/commands/uiRender.js +206 -0
  164. package/dist/cli/commands/uiRender.js.map +1 -0
  165. package/dist/cli/main.js +22 -1
  166. package/dist/cli/main.js.map +1 -1
  167. package/dist/cli/mcp/content.js +64 -1
  168. package/dist/cli/mcp/content.js.map +1 -1
  169. package/dist/cli/mcp/dispatch.js +175 -10
  170. package/dist/cli/mcp/dispatch.js.map +1 -1
  171. package/dist/cli/registry.js +3 -0
  172. package/dist/cli/registry.js.map +1 -1
  173. package/dist/cli-delegate/{chunk-H4VIVD4C.js → chunk-236PNQZK.js} +413 -391
  174. package/dist/cli-delegate/{chunk-G23AT6GD.js → chunk-DMSZHXZS.js} +57 -1
  175. package/dist/cli-delegate/{chunk-77GR3VD4.js → chunk-FF7WAFMR.js} +58 -3
  176. package/dist/cli-delegate/{chunk-PLSG6UL5.js → chunk-K4FFODTS.js} +341 -204
  177. package/dist/cli-delegate/{chunk-YM4GZDJG.js → chunk-L43NCYPB.js} +5 -0
  178. package/dist/cli-delegate/{chunk-B2ERU2VA.js → chunk-WOKWX5PL.js} +1 -1
  179. package/dist/cli-delegate/cmd_brand_status.js +8 -6
  180. package/dist/cli-delegate/cmd_conformance.js +3 -3
  181. package/dist/cli-delegate/cmd_doctor.js +3 -3
  182. package/dist/cli-delegate/cmd_export.js +4 -4
  183. package/dist/cli-delegate/cmd_handoff.js +1 -1
  184. package/dist/cli-delegate/cmd_preflight.js +2 -2
  185. package/dist/cli-delegate/cmd_prune.js +4 -4
  186. package/dist/cli-delegate/cmd_session_recycle.js +70 -9
  187. package/dist/cli-delegate/cmd_settings_migrate.js +4 -4
  188. package/dist/cli-delegate/cmd_settings_set.js +1 -1
  189. package/dist/cli-delegate/cmd_sync.js +4 -4
  190. package/dist/cli-delegate/cmd_uninstall.js +4 -4
  191. package/dist/cli-delegate/cmd_validate.js +4 -4
  192. package/dist/discovery/deprecation-report.md +1 -1
  193. package/dist/discovery/discovery-manifest.json +359 -124
  194. package/dist/discovery/discovery-manifest.json.sha256 +1 -1
  195. package/dist/discovery/discovery-manifest.summary.md +4 -4
  196. package/dist/discovery/dormancy-report.md +1 -1
  197. package/dist/discovery/orphan-report.md +1 -1
  198. package/dist/discovery/packs.json +18 -8
  199. package/dist/discovery/trust-report.md +3 -3
  200. package/dist/discovery/workspaces.json +16 -6
  201. package/dist/hooks/dispatch.js +2337 -1436
  202. package/dist/install/install.mjs +795 -708
  203. package/dist/mcp/registry-manifest.json +3 -3
  204. package/dist/mcp/server.json +2 -2
  205. package/dist/mcp/server.mjs +1685 -1250
  206. package/dist/router.json +1 -1
  207. package/dist/scripts/_lib/lean_projection_mode.js +40 -0
  208. package/dist/scripts/_lib/lean_projection_mode.js.map +1 -0
  209. package/dist/scripts/_lib/scoped_projection.js +84 -0
  210. package/dist/scripts/_lib/scoped_projection.js.map +1 -1
  211. package/dist/scripts/_lib/ui_surface.js +89 -0
  212. package/dist/scripts/_lib/ui_surface.js.map +1 -0
  213. package/dist/scripts/condense.js +6 -10
  214. package/dist/scripts/condense.js.map +1 -1
  215. package/dist/scripts/project_thin_rules.js +40 -2
  216. package/dist/scripts/project_thin_rules.js.map +1 -1
  217. package/dist/server/schemas/settings.js +3 -0
  218. package/dist/server/schemas/settings.js.map +1 -1
  219. package/dist/shared/skillRanking.js +159 -0
  220. package/dist/shared/skillRanking.js.map +1 -0
  221. package/docs/contracts/provider-lifecycle.md +47 -18
  222. package/docs/contracts/settings-classes.md +14 -4
  223. package/docs/guidelines/agent-infra/context-hygiene-mechanics.md +49 -0
  224. package/docs/guidelines/agent-infra/evaluator-independence-mechanics.md +92 -0
  225. package/docs/guidelines/agent-infra/minimal-safe-diff-mechanics.md +45 -1
  226. package/docs/guidelines/agent-infra/roadmap-deferred-resolution-provenance.md +54 -0
  227. package/docs/guidelines/design-antipatterns.md +4 -2
  228. package/docs/guidelines/design-asset-discipline.md +38 -0
  229. package/docs/guidelines/design-fidelity-mechanics.md +45 -29
  230. package/docs/guidelines/design-handover-extraction.md +35 -5
  231. package/docs/guidelines/design-modes.md +41 -1
  232. package/docs/guidelines/monorepo-antipatterns.md +141 -0
  233. package/llms.txt +50 -39
  234. package/package.json +1 -1
  235. package/src/agent-src/templates/scripts/check_playbook_invokes.ts +231 -0
  236. package/src/agent-src/templates/scripts/work_engine/directives/ui/apply.ts +24 -0
  237. package/src/agent-src/templates/scripts/work_engine/directives/ui/polish.ts +2 -0
  238. package/src/agent-src/templates/scripts/work_engine/directives/ui/review.ts +216 -0
  239. package/src/agent-src/templates/scripts/work_engine/directives/ui/scaffold.ts +159 -0
  240. package/src/agent-src/templates/scripts/work_engine/directives/ui/stack_bundles.ts +73 -4
  241. package/src/agent-src/templates/scripts/work_engine/stack/detect.ts +325 -40
  242. package/src/config/agent-settings.template.yml +28 -0
  243. package/src/config/assurance-capability-registry.json +223 -0
  244. package/src/config/assurance-threshold-budget.json +65 -0
  245. package/src/config/ci-local-parity.yml +14 -0
  246. package/src/config/discovery/unassigned-artefacts.yml +2 -0
  247. package/src/config/dispatch-economy-metrics.json +4 -2
  248. package/src/config/evaluator-budgets.json +14 -14
  249. package/src/config/gate-coverage.yml +207 -8
  250. package/src/config/gate-violation-baselines.json +76 -72
  251. package/src/config/hook-latency-budget.json +1 -0
  252. package/src/config/hook-token-budget.json +137 -125
  253. package/src/config/pack-size-budget.json +4 -2
  254. package/src/config/quorum-attendance-budget.json +12 -4
  255. package/src/config/rule-activation-census.json +7 -3
  256. package/src/config/rule-enforcement-baseline.json +0 -1
  257. package/src/config/rule-stub-ceilings.json +112 -91
  258. package/src/scripts/_cli/cmd_doctor.ts +15 -16
  259. package/src/scripts/_cli/doctor_install_mode.ts +49 -0
  260. package/src/scripts/_cli/doctor_overrides.ts +154 -0
  261. package/src/scripts/_dispatch.bash +17 -0
  262. package/src/scripts/_lib/as_of.ts +412 -0
  263. package/src/scripts/_lib/exec_evidence.ts +7 -0
  264. package/src/scripts/_lib/hook_settings.ts +33 -0
  265. package/src/scripts/_lib/host_listing_model.ts +192 -0
  266. package/src/scripts/_lib/lean_projection_mode.ts +44 -0
  267. package/src/scripts/_lib/mcp_bridge.ts +199 -0
  268. package/src/scripts/_lib/review_independence.ts +62 -10
  269. package/src/scripts/_lib/rule_injection.ts +239 -0
  270. package/src/scripts/_lib/run_checkpoint.ts +54 -1
  271. package/src/scripts/_lib/scoped_projection.ts +96 -0
  272. package/src/scripts/_lib/session_register.ts +44 -2
  273. package/src/scripts/_lib/skill_catalogue.ts +38 -2
  274. package/src/scripts/_lib/transcript_reads.ts +207 -0
  275. package/src/scripts/_lib/ui_authority.test.ts +251 -0
  276. package/src/scripts/_lib/ui_authority.ts +343 -0
  277. package/src/scripts/ai-video/adapters/fal.sh +8 -3
  278. package/src/scripts/ai-video/adapters/gemini-veo.sh +10 -0
  279. package/src/scripts/ai-video/adapters/higgsfield.sh +10 -2
  280. package/src/scripts/ai-video/adapters/kling.sh +10 -0
  281. package/src/scripts/ai-video/adapters/sora.sh +10 -0
  282. package/src/scripts/ai-video/lib/calibrate-cost.sh +145 -0
  283. package/src/scripts/ai-video/lib/model-capabilities/README.md +53 -7
  284. package/src/scripts/ai-video/lib/model-capabilities/comfyui.json +15 -3
  285. package/src/scripts/ai-video/lib/model-capabilities/fal.json +36 -6
  286. package/src/scripts/ai-video/lib/model-capabilities/gemini-veo.json +23 -0
  287. package/src/scripts/ai-video/lib/model-capabilities/higgsfield.json +23 -0
  288. package/src/scripts/ai-video/lib/model-capabilities/kling.json +23 -0
  289. package/src/scripts/ai-video/lib/model-capabilities/musetalk.json +8 -2
  290. package/src/scripts/ai-video/lib/model-capabilities/replicate.json +36 -6
  291. package/src/scripts/ai-video/lib/model-capabilities/sora.json +45 -0
  292. package/src/scripts/ai-video/lib/model-capabilities/syncso.json +8 -2
  293. package/src/scripts/ai-video/lib/parse-blueprint.sh +52 -5
  294. package/src/scripts/ai-video/lib/resume-scan.sh +92 -3
  295. package/src/scripts/ai-video/lib/seam-plan.sh +212 -0
  296. package/src/scripts/ai-video/smoke-trace.sh +450 -2
  297. package/src/scripts/ai-video/stitch.sh +191 -10
  298. package/src/scripts/ai-video/test-pipeline.sh +84 -6
  299. package/src/scripts/ai_council/cli_agency_bounds.ts +139 -0
  300. package/src/scripts/ai_council/cli_least_agency_canary.ts +347 -0
  301. package/src/scripts/ai_council/clients.ts +3 -2
  302. package/src/scripts/ai_council/consensus.ts +63 -6
  303. package/src/scripts/ai_council/events_log.ts +46 -1
  304. package/src/scripts/ai_council/orchestrator.ts +103 -108
  305. package/src/scripts/ai_council/orchestrator_results.ts +166 -0
  306. package/src/scripts/ai_council/prompts.ts +12 -5
  307. package/src/scripts/ai_council/quorum.ts +82 -1
  308. package/src/scripts/ai_council/quorum_wiring.ts +82 -5
  309. package/src/scripts/ai_council/stance_tally.ts +22 -0
  310. package/src/scripts/bench_hook_latency.ts +62 -0
  311. package/src/scripts/build_proof.ts +12 -1
  312. package/src/scripts/capture_skill_catalogue.ts +21 -0
  313. package/src/scripts/check_always_budget.ts +2 -1
  314. package/src/scripts/check_augmentignore.ts +2 -1
  315. package/src/scripts/check_beta_review_markers.ts +2 -1
  316. package/src/scripts/check_composite_arming.ts +364 -0
  317. package/src/scripts/check_corpus_staleness.ts +2 -1
  318. package/src/scripts/check_council_pin_staleness.ts +3 -1
  319. package/src/scripts/check_enforcement_coverage.ts +116 -3
  320. package/src/scripts/check_enforcement_denominator.ts +365 -0
  321. package/src/scripts/check_gate_coverage.ts +2 -1
  322. package/src/scripts/check_hook_bundle_freshness.ts +13 -1
  323. package/src/scripts/check_knowledge_cards.ts +2 -1
  324. package/src/scripts/check_knowledge_pages.ts +3 -2
  325. package/src/scripts/check_memory.ts +2 -1
  326. package/src/scripts/check_no_automerge_key.ts +287 -0
  327. package/src/scripts/check_pack_conformance_fixture.ts +565 -0
  328. package/src/scripts/check_proposal.ts +2 -1
  329. package/src/scripts/check_reach_staleness.ts +2 -1
  330. package/src/scripts/check_release_adjacent_health.ts +2 -1
  331. package/src/scripts/check_release_pr_shape.ts +5 -0
  332. package/src/scripts/check_review_schema.ts +34 -1
  333. package/src/scripts/check_roadmap_trackable.ts +48 -3
  334. package/src/scripts/check_source_size_budget.ts +2 -1
  335. package/src/scripts/check_standing_payload_delta.ts +505 -0
  336. package/src/scripts/check_trigger_evals.ts +2 -1
  337. package/src/scripts/classify_change_risk.ts +281 -0
  338. package/src/scripts/compute_skill_tiers.ts +186 -0
  339. package/src/scripts/condense.ts +8 -13
  340. package/src/scripts/council_attendance_metrics.ts +183 -0
  341. package/src/scripts/council_cli.ts +10 -8
  342. package/src/scripts/council_parse_rate.ts +116 -0
  343. package/src/scripts/derive_playbooks.ts +406 -0
  344. package/src/scripts/design_slop_rules.test.ts +7 -0
  345. package/src/scripts/design_slop_rules.ts +56 -2
  346. package/src/scripts/dispatch_r2_reviewer.ts +16 -0
  347. package/src/scripts/frontend_corpus_hash.ts +116 -0
  348. package/src/scripts/grade_target_readiness.ts +478 -0
  349. package/src/scripts/hook_manifest.json +1 -1
  350. package/src/scripts/hook_manifest.yaml +97 -16
  351. package/src/scripts/hooks/concern_registry.ts +4 -0
  352. package/src/scripts/hooks/design_pass_hook.ts +356 -0
  353. package/src/scripts/hooks/rtk_wrap_hook.ts +30 -7
  354. package/src/scripts/hooks/rule_inject_hook.ts +318 -0
  355. package/src/scripts/hot_context_hook.ts +74 -7
  356. package/src/scripts/install.ts +40 -89
  357. package/src/scripts/lint_adapter_tier.ts +663 -0
  358. package/src/scripts/lint_archived_skills.ts +93 -0
  359. package/src/scripts/lint_budget_ownership.ts +2 -1
  360. package/src/scripts/lint_deterministic_time.ts +470 -0
  361. package/src/scripts/lint_framework_leakage.ts +5 -0
  362. package/src/scripts/lint_handoffs.ts +525 -1
  363. package/src/scripts/lint_judge_prompt_expectation.ts +155 -0
  364. package/src/scripts/lint_marketplace.ts +88 -0
  365. package/src/scripts/lint_media_policy_linkage.ts +140 -1
  366. package/src/scripts/lint_one_off_age.ts +6 -1
  367. package/src/scripts/lint_override_kernel_guard.ts +87 -5
  368. package/src/scripts/lint_roadmap_complexity.ts +56 -0
  369. package/src/scripts/lint_rule_enforcement_declaration.ts +24 -7
  370. package/src/scripts/lint_rule_norm_pin.ts +321 -0
  371. package/src/scripts/lint_spawn_payload.ts +42 -5
  372. package/src/scripts/lint_symptom_intake.ts +2 -1
  373. package/src/scripts/mcp_parity_smoke.ts +30 -4
  374. package/src/scripts/mcp_render.ts +66 -1
  375. package/src/scripts/mcp_tool_fingerprint.ts +241 -0
  376. package/src/scripts/measure_risk_class_drift.ts +140 -0
  377. package/src/scripts/measure_skill_ranker_baseline.ts +212 -0
  378. package/src/scripts/media/lib/adapter-common.sh +211 -1
  379. package/src/scripts/media/lib/adapter-contract.md +74 -6
  380. package/src/scripts/model_rule_injection.ts +907 -0
  381. package/src/scripts/project_thin_rules.ts +45 -2
  382. package/src/scripts/release.ts +66 -860
  383. package/src/scripts/release_drill.ts +59 -3
  384. package/src/scripts/release_env.ts +298 -0
  385. package/src/scripts/release_publication.ts +720 -0
  386. package/src/scripts/roadmap_context.ts +778 -0
  387. package/src/scripts/schemas/fidelity-measurement-sheet.schema.json +169 -0
  388. package/src/scripts/schemas/rule.schema.json +24 -2
  389. package/src/scripts/schemas/skill.schema.json +39 -0
  390. package/src/scripts/schemas/ui-authority.schema.json +114 -0
  391. package/src/scripts/session_register_hook.ts +29 -3
  392. package/src/scripts/sessions_cli.ts +67 -3
  393. package/src/scripts/skill_tools/score_skill_relevance.ts +36 -53
  394. package/src/scripts/token_sink_report.ts +239 -0
  395. package/src/scripts/trigger_coverage.ts +122 -3
  396. package/src/scripts/update_counts.ts +7 -3
  397. package/src/scripts/validate_frontmatter.ts +66 -0
  398. package/src/server/schemas/settings.ts +5 -0
  399. package/src/shared/skillRanking.ts +183 -0
@@ -0,0 +1,223 @@
1
+ {
2
+ "_comment": "Assurance capability registry — the ONE canonical answer to 'which assurance capability does which surface own, and what is its state'. Phase 0.1 / 0.2 / 0.3 of road-to-agentic-engineering-assurance, and the artefact its blocker `sibling-roadmap-dispositions` resolves against. THIS IS NOT A SECOND GRADER. Exactly one grader exists in this tree — src/scripts/grade_target_readiness.ts — and every capability whose state can be read off a target repository declares the dimension id of that grader which produces it, in `projection`. A capability with `projection: null` is one no shipped probe reads; its state is `unknown` or it is a process obligation owned by a skill, and either way nothing here grades it. TWO AXES, DECLARED PER ENTRY, because conflating them was a real defect in the umbrella roadmap's own premise: `axis: target` is a property of the user's repository that AC is installed into, which is what grade_target_readiness measures; `axis: self` is a property of THIS package's own tests and reviews, which is what the three sibling roadmaps measured. The umbrella's Phase 4 asked to 'consume the sibling dispositions' for capabilities it had also listed as target-repository capabilities — those are different questions with different answers, so the axis is a required field rather than a note. STATE VOCABULARY is exactly four values and is closed: available | missing | degraded | unknown. `unknown` means nobody measured; `missing` means measured absent; `degraded` means present with a named limitation that is recorded in `limitations`. There is no fifth state and adding one is a contract change, not an entry edit.",
3
+ "schema_version": 1,
4
+ "owner": "maintainer",
5
+ "review_by": "2027-08-23",
6
+ "registered_at": "2026-08-23",
7
+ "grader": {
8
+ "path": "src/scripts/grade_target_readiness.ts",
9
+ "dimensions": 10,
10
+ "knockouts": ["test-presence", "static-analysis", "security-supply-chain", "ci-enforcement"],
11
+ "note": "Grades 0 Absent / 1 Present / 2 Enforced-in-CI / 3 Independent-and-diff-scoped, verdict `min` over the four knockouts, printed as `L<n> — bound by <dimension>`. Emits no aggregate figure — a test greps its own output for `%` and `/100`. `null` is 'this tool cannot tell' and is NOT a zero; on a knockout it binds at L0 with its reason printed."
12
+ },
13
+ "state_vocabulary": ["available", "missing", "degraded", "unknown"],
14
+ "capabilities": {
15
+ "unit-test": {
16
+ "axis": "target",
17
+ "owner_surface": "src/scripts/grade_target_readiness.ts",
18
+ "projection": "test-presence",
19
+ "state": "available",
20
+ "rationale": "A test-runner config (vitest/jest/phpunit/pest/pytest) is probed and the 1 → 2 distinction is whether CI blocks on it.",
21
+ "evidence": "tests/scripts/grade_target_readiness.test.ts — presence asserted in tests/fixtures/target-repos/full, absence in ci-absent",
22
+ "revisit_if": "the probe stops distinguishing a present runner from an absent one on the committed fixtures"
23
+ },
24
+ "integration-test": {
25
+ "axis": "target",
26
+ "owner_surface": "src/scripts/grade_target_readiness.ts",
27
+ "projection": "test-presence",
28
+ "state": "unknown",
29
+ "rationale": "No shipped probe separates integration tests from unit tests; both collapse into the test-presence dimension. Recorded as unknown rather than folded into unit-test, because 'we cannot tell them apart' is not 'they are both present'.",
30
+ "evidence": "src/scripts/grade_target_readiness.ts — the test-presence probe reads runner configs only; no directory or marker convention distinguishes the two",
31
+ "revisit_if": "a probe lands that reads a test-suite split (a runner project/suite config, or a conventional directory) on the committed fixtures"
32
+ },
33
+ "e2e-test": {
34
+ "axis": "target",
35
+ "owner_surface": "none",
36
+ "projection": null,
37
+ "state": "unknown",
38
+ "rationale": "No probe exists. `playwright` and `cypress` return zero occurrences in the grader.",
39
+ "evidence": "grep -oiE 'playwright|cypress' src/scripts/grade_target_readiness.ts → no match, 2026-08-23",
40
+ "revisit_if": "an e2e probe ships with fixture coverage for presence AND absence"
41
+ },
42
+ "behavior-spec": {
43
+ "axis": "target",
44
+ "owner_surface": "src/scripts/grade_target_readiness.ts",
45
+ "projection": "behaviour-contract",
46
+ "state": "available",
47
+ "rationale": "AGENTS.md / openapi.yaml / CONTRACT.md presence is probed as the repository's declared behavioural contract.",
48
+ "evidence": "tests/scripts/grade_target_readiness.test.ts — graded > 0 in the full fixture, 0 in the python fixture",
49
+ "revisit_if": "the contract probe is widened to a form whose absence the fixtures no longer distinguish"
50
+ },
51
+ "test-red-evidence": {
52
+ "axis": "self",
53
+ "owner_surface": "src/skills/test-driven-development/SKILL.md",
54
+ "projection": null,
55
+ "state": "available",
56
+ "rationale": "A process obligation, not a repository artefact: an observed failing test is a fact about a run, and no repository scan can recover it. Owned by the TDD skill's RED → GREEN → REFACTOR cycle, which this roadmap explicitly does not duplicate.",
57
+ "evidence": "src/skills/test-driven-development/SKILL.md:140 — 'Each case from the list then gets its own RED → GREEN cycle'",
58
+ "revisit_if": "a durable RED-run identifier is emitted somewhere a later reader can check, at which point this becomes projectable"
59
+ },
60
+ "mutation-sensitivity": {
61
+ "axis": "target",
62
+ "owner_surface": "src/scripts/grade_target_readiness.ts",
63
+ "projection": "test-strength",
64
+ "state": "degraded",
65
+ "limitations": [
66
+ "detection only — the grader reads stryker/infection/mutmut config presence and never runs a mutation pass",
67
+ "no universal min-MSI constant exists here and none may be added (AC-8)",
68
+ "a tool-assisted rig for THIS package was refused on measured grounds by the sibling roadmap"
69
+ ],
70
+ "rationale": "Config presence is detected; sensitivity is never measured by this tree. For AC's own suite the manual control-inversion probe in testing-anti-patterns is the substitute, and it is a named substitute rather than a silent one.",
71
+ "evidence": "src/skills/testing-anti-patterns/SKILL.md:185 — 'No mutation-testing rig required: comment the control out, run that one spec, put it back.' · agents/roadmaps/archive/road-to-test-independence-and-mutation-evidence.md — rig REFUSED (measured), 10 hand probes in minutes",
72
+ "revisit_if": "a mutation adapter ships that runs a changed-surface pass and reports survivors and timeouts separately"
73
+ },
74
+ "property-test": {
75
+ "axis": "target",
76
+ "owner_surface": "src/scripts/grade_target_readiness.ts",
77
+ "projection": "test-strength",
78
+ "state": "available",
79
+ "rationale": "fast-check and Hypothesis are probed as property-based libraries.",
80
+ "evidence": "src/scripts/grade_target_readiness.ts — 'fast-check' and 'hypothesis' tokens present; asserted > 0 in the full fixture",
81
+ "revisit_if": "the probe stops distinguishing a present property library from an absent one"
82
+ },
83
+ "static-analysis": {
84
+ "axis": "target",
85
+ "owner_surface": "src/scripts/grade_target_readiness.ts",
86
+ "projection": "static-analysis",
87
+ "state": "degraded",
88
+ "limitations": [
89
+ "PHP and JS/TS only — on a Python-primary target the dimension is `not detectable`, never 0, and binds at L0 because it is a knockout",
90
+ "quality-tools ships no Python mode body"
91
+ ],
92
+ "rationale": "The limitation is recorded rather than rounded up: a 0 would claim the target lacks static analysis, and a Python target may well run mypy while the tool cannot tell.",
93
+ "evidence": "src/skills/quality-tools/SKILL.md:33-36 — PHP and JS/TS mode rows only; grep -ci python → 0 · tests/scripts/grade_target_readiness.test.ts:118-119 — toBeNull() with a paired not.toBe(0)",
94
+ "revisit_if": "a Python mode body lands in quality-tools/references/ and the grader probes it"
95
+ },
96
+ "type-check": {
97
+ "axis": "target",
98
+ "owner_surface": "src/scripts/grade_target_readiness.ts",
99
+ "projection": "static-analysis",
100
+ "state": "degraded",
101
+ "limitations": [
102
+ "not separable from static-analysis — tsconfig.json, phpstan.neon and psalm.xml all feed one dimension",
103
+ "inherits the Python not-detectable limitation"
104
+ ],
105
+ "rationale": "Folded into static-analysis by the shipped grader. Recorded as its own capability with a shared projection rather than deleted, because the policy vocabulary distinguishes them even though the probe does not.",
106
+ "evidence": "src/scripts/grade_target_readiness.ts — tsconfig / phpstan / psalm tokens all under the static-analysis dimension",
107
+ "revisit_if": "a probe separates type checking from lint/static analysis on the committed fixtures"
108
+ },
109
+ "architecture-constraint": {
110
+ "axis": "target",
111
+ "owner_surface": "src/scripts/grade_target_readiness.ts",
112
+ "projection": "architecture-gates",
113
+ "state": "available",
114
+ "rationale": ".dependency-cruiser.* and deptrac.yaml are probed; non-knockout.",
115
+ "evidence": "src/scripts/grade_target_readiness.ts — 'dependency-cruiser' and 'deptrac' tokens; asserted > 0 in the full fixture and 0 in python",
116
+ "revisit_if": "the probe stops distinguishing presence from absence on the fixtures"
117
+ },
118
+ "dependency-audit": {
119
+ "axis": "target",
120
+ "owner_surface": "src/scripts/grade_target_readiness.ts",
121
+ "projection": "security-supply-chain",
122
+ "state": "available",
123
+ "rationale": "Lockfile presence plus a blocking audit step in CI; the 1 → 2 distinction is whether the audit job can fail the build.",
124
+ "evidence": "tests/scripts/grade_target_readiness.test.ts — the full fixture reports 'lockfile; SAST config; audit runs in CI' at grade 2, ci-absent reports 'no blocking audit step' at grade 1",
125
+ "revisit_if": "the CI-blocking heuristic is replaced by per-job YAML attribution and the coarse reading changes a fixture grade"
126
+ },
127
+ "secret-scan": {
128
+ "axis": "target",
129
+ "owner_surface": "none",
130
+ "projection": null,
131
+ "state": "unknown",
132
+ "rationale": "No probe exists. gitleaks, trufflehog and detect-secrets return zero occurrences in the grader. Distinct from this package's own secret hygiene, which is a different axis and separately owned.",
133
+ "evidence": "grep -oiE 'gitleaks|trufflehog|detect-secrets' src/scripts/grade_target_readiness.ts → no match, 2026-08-23",
134
+ "revisit_if": "a secret-scan probe ships with fixture coverage for presence AND absence"
135
+ },
136
+ "security-scan": {
137
+ "axis": "target",
138
+ "owner_surface": "src/scripts/grade_target_readiness.ts",
139
+ "projection": "security-supply-chain",
140
+ "state": "available",
141
+ "rationale": "Semgrep and bandit configs are probed under the security-supply-chain knockout.",
142
+ "evidence": "src/scripts/grade_target_readiness.ts — 'semgrep' and 'bandit' tokens; the python fixture reports 'no SAST config'",
143
+ "revisit_if": "the SAST probe stops distinguishing presence from absence on the fixtures"
144
+ },
145
+ "runtime-probe": {
146
+ "axis": "target",
147
+ "owner_surface": "agents/roadmaps/stubs/road-to-target-project-bootstrap-enforce.md",
148
+ "projection": "runtime-verification",
149
+ "state": "unknown",
150
+ "rationale": "Out of scope by design, and the grader says so in its own output rather than grading a 0. Cut with a stated reason by the sibling roadmap: runtime verification needs a deploy platform this package does not own.",
151
+ "evidence": "src/scripts/grade_target_readiness.ts:270 — notDetectable: 'needs a deploy platform this tool does not own' · agents/roadmaps/archive/road-to-target-project-assurance-readiness.md — 'Runtime verification (canary/flags/rollback) | Needs a deploy platform AC does not own; stubbed, not planned.'",
152
+ "revisit_if": "this package gains a deploy or runtime surface it owns, at which point the dimension stops being not-detectable"
153
+ },
154
+ "visual-regression": {
155
+ "axis": "target",
156
+ "owner_surface": "none",
157
+ "projection": null,
158
+ "state": "unknown",
159
+ "rationale": "No probe exists. percy and chromatic return zero occurrences in the grader.",
160
+ "evidence": "grep -oiE 'percy|chromatic' src/scripts/grade_target_readiness.ts → no match, 2026-08-23",
161
+ "revisit_if": "a visual-regression probe ships with fixture coverage for presence AND absence"
162
+ },
163
+ "independent-test-author": {
164
+ "axis": "self",
165
+ "owner_surface": "agents/roadmaps/archive/road-to-test-independence-and-mutation-evidence.md",
166
+ "projection": null,
167
+ "state": "unknown",
168
+ "rationale": "AI council 2026-08-23, 2/2 convergent, pick (1a). The sibling's pre-registered outcome is `unmeasurable-here` — the third pre-registered state, explicitly NOT a null and NOT a refutation: the measurement did not run because the run lacked a subagent dispatch primitive. `unknown` is exactly 'nobody measured' in this vocabulary. It must never be read back as evidence against spec-first authorship, and policy may not select it until the measurement runs.",
169
+ "evidence": "agents/evidence/analysis/test-independence-unmeasurable.md · agents/roadmaps/archive/road-to-test-independence-and-mutation-evidence.md — the 'Sibling disposition' table written for this blocker to consume",
170
+ "shipped_mechanism": "a `test_authorship` envelope field, default `unknown`",
171
+ "revisit_if": "a subagent dispatch primitive ships AND the sibling's pre-registered corpus, grader and threshold are re-run — the pre-registration fixed them in advance so a later run re-runs rather than redesigns"
172
+ },
173
+ "independent-review": {
174
+ "axis": "self",
175
+ "owner_surface": "agents/roadmaps/archive/road-to-review-independence.md",
176
+ "projection": null,
177
+ "state": "degraded",
178
+ "limitations": [
179
+ "single-member: one reviewer, one model family",
180
+ "derived independence pair is `provisional` / `single-pass`",
181
+ "src/scripts/self_review_gate.ts:471 hardcodes independenceFields(['anthropic'])",
182
+ "check_review_schema reports `scanned: 1` in this repository today — a corpus of one, which cannot be distinguished from a conforming corpus"
183
+ ],
184
+ "rationale": "AI council 2026-08-23, 2/2 convergent, pick (2b). The fresh-context dispatcher shipped and routes the default review path, so the capability is real; the family axis one member cannot supply is a named limitation, so it is degraded rather than available. Recording it degraded is what keeps P8's floor checkable: a same-context review is never presentable as an independent one.",
185
+ "evidence": "src/scripts/dispatch_r2_reviewer.ts — emits independence: single-member / fresh · agents/roadmaps/archive/road-to-review-independence.md — blocker second-ci-provider-key resolved option (b)",
186
+ "revisit_if": "self_review_gate.ts stops hardcoding a single provider AND either multi-family routing is measured or single-family parity is measured"
187
+ },
188
+ "requirement-trace": {
189
+ "axis": "self",
190
+ "owner_surface": "src/scripts/check_requirements_trace.ts",
191
+ "projection": null,
192
+ "state": "degraded",
193
+ "limitations": [
194
+ "adoption is 1 of 25 active roadmaps, and the single declarer is the mechanism's own roadmap",
195
+ "enforcement is parked under two fired falsifiers",
196
+ "demonstrated value is not evaluable — no documented sample exists"
197
+ ],
198
+ "falsifiers": {
199
+ "no_opportunity": "fired",
200
+ "no_adoption": "fired",
201
+ "poor_resolution": "not_fired",
202
+ "no_demonstrated_value": "not_evaluable"
203
+ },
204
+ "rationale": "AI council 2026-08-23, 2/2 convergent, pick (3b). The schema ships and resolves deterministically, so the mechanism works; but two of four pre-registered falsifiers have FIRED and enforcement is parked under them, so `available` would launder a parked outcome into a positive one — which is precisely the failure the blocker's `If you do nothing` names. A traceability capability that cannot demonstrate value over the corpus it was built to serve is degraded in delivered capability even when its code is defect-free.",
205
+ "evidence": "agents/roadmaps/archive/road-to-requirements-traceability-minimal.md — Phase 2 disposition, live reading 3 rows / 3 linked / 0 unlinked / 0 unresolved over 25 active roadmaps with 1 declaring · src/config/requirements-trace-budget.json — shrink-only ratchet at all-zero",
206
+ "revisit_if": "adoption reaches >= 3 eligible active roadmaps, OR >= 1 non-maintainer-prompted roadmap adopts the fields, OR the `no_demonstrated_value` falsifier transitions from not_evaluable to a measured state"
207
+ },
208
+ "evidence-binding": {
209
+ "axis": "both",
210
+ "owner_surface": "agents/roadmaps/stubs/road-to-target-project-evidence-contract.md",
211
+ "projection": "evidence-traceability",
212
+ "state": "degraded",
213
+ "limitations": [
214
+ "per-dimension evidence strings exist on the target axis and are now asserted, but there is no aggregate per-change evidence record",
215
+ "verify-completion-evidence produces prose — json, schema and machine return 0 occurrences in that skill",
216
+ "the aggregate schema is transferred, not built"
217
+ ],
218
+ "rationale": "The target axis binds every graded dimension to an evidence string, and that invariant is now pinned by a spec rather than merely true. The aggregate per-change record the umbrella's Phase 4.5 and Phase 6 describe is a transferred successor, so the capability is partially present and its gap is named.",
219
+ "evidence": "tests/scripts/grade_target_readiness.test.ts — the '1.3 evidence binding' block; sabotage-probed both ways · src/skills/verify-completion-evidence/SKILL.md — 0 occurrences of json/schema/machine",
220
+ "revisit_if": "the evidence-contract stub is promoted and an aggregate per-change record ships"
221
+ }
222
+ }
223
+ }
@@ -0,0 +1,65 @@
1
+ {
2
+ "_comment": "PRE-REGISTRATION (resolution of `blocker: assurance-enforcement-thresholds` on agents/roadmaps/road-to-agentic-engineering-assurance.md). This file commits to a CLOSED four-dimension measurement framework and establishes that no new blocking assurance policy may be adopted while its applicable thresholds are null. The `registered_at` date is the pre-registration CUTOFF: any blocking assurance policy proposed after it is governed by these thresholds even while they remain null, and may not adopt blocking enforcement until the applicable ones are set. Each threshold is explicitly `null` — not absent — with a `set_when` clause naming the specific measurement run that will produce it, so 'committed' means 'present in a falsifiable state' rather than 'populated with a number'. That distinction is what resolves the contradiction in the blocker's own text, which asked in one line for 'a number and the measurement that produced it' and five lines later said 'the numbers stay unset until the corpus exists'. NO NUMBER IN THIS FILE WAS INVENTED. No benchmark corpus exists in this tree, so no measurement could have produced one, and a provisional number in a src/config/ file is read by later readers as derived — which is the failure this repository treats as worse than an honest gap. An enforcement gate is PROMISED, NOT SHIPPED: committing untested CI automation with nothing to test it against is how an argument-parser defect is discovered on the critical path, and there is no proposed blocking assurance policy in the tree today for it to run against. It is implemented when the first policy proposal arrives or Phase 8.5 begins, whichever comes first. The dimension set is closed: a fifth dimension requires schema_version 2 and re-registration. Decided by AI council 2026-08-23, 2/2 quorum (anthropic/claude-sonnet-4-5 + openai/gpt-4o), convergent on option (a). The convergence is summarised here rather than linked: both members picked (a), both rejected provisional numbers as 'dressed as derivation', and the two clauses that make the four nulls safe — dimension_applicability keyed to observable policy characteristics, and the safety-floor exemption — came from the final round rather than from the blocker's own text.",
3
+ "schema_version": 1,
4
+ "owner": "maintainer",
5
+ "review_by": "2027-08-23",
6
+ "registered_at": "2026-08-23",
7
+ "review_by_note": "A calendar date, because every other budget config in src/config/ carries one and the gates read that shape. The council's preferred form — '90 days after the frozen benchmark corpus commit, or 2027-12-31, whichever is earlier' — is not a date and would not parse; the corpus-indexed condition it expresses is carried in `revisit_if` instead, which is where the council itself also put it.",
8
+ "threshold_setting_procedure": "A threshold may be set only after the measurement named in its `set_when` clause completes. If set from empirical data, that dimension's `_comment` must cite the percentile or delta and the run that produced it (e.g. 'P95 from ablation run 2026-04-12'). If set as a safety floor independent of any empirical distribution (e.g. false_verified_rate 0.0 for a zero-tolerance property), the `_comment` must state 'safety floor' and name the invariant (e.g. 'no credential in a commit message may pass verification'). A threshold citing neither an empirical derivation nor a named safety invariant is rejected on review. This specifies what must be true of a number, not who chairs the meeting that sets it: the blocker's `owner: maintainer` field assigns the VALUES to the maintainer, not the governance process.",
9
+ "dimension_applicability": {
10
+ "_comment": "Dimensions govern a policy by its OBSERVABLE characteristics, never by what its author claims about it. Without this section the four nulls together would form a universal 'no blocking policy may be adopted' constant — functionally a universal minimum threshold of infinity, which is exactly the vanity constant AC-8 forbids under another name. With it, a policy that asserts no empirical claim and no safety property is ungoverned and may be adopted without waiting for an ablation.",
11
+ "false_verified_rate": "Governs any policy that gates `done` — a false green would let a defective change through.",
12
+ "defect_catch_uplift": "Governs any policy whose own documentation uses `catch`, `detect`, `find` or `prevent` in reference to a defect class.",
13
+ "cost_budget": "Governs any policy that adds a gate step or invokes an external service.",
14
+ "false_positive_burden": "Governs any policy that can return red on a change.",
15
+ "safety_floor_exemption": "A policy asserting a hard safety property (e.g. 'no AWS key in any commit') is governed by false_verified_rate but NOT by defect_catch_uplift: it claims a red line, not a higher catch rate. Such a policy's `_comment` must state 'safety floor' and name the invariant. This is the AC-11 escape hatch — a hard safety property may block without an empirical uplift claim."
16
+ },
17
+ "dimensions": {
18
+ "false_verified_rate": {
19
+ "description": "Proportion of changes the harness reports verified that contain a defect, or violate a safety property the policy is supposed to catch.",
20
+ "threshold": null,
21
+ "measurement": null,
22
+ "set_when": "A frozen benchmark corpus exists (Phase 8.1) AND the false-confidence metric is instrumented (Phase 8.2) AND an ablation comparing assurance-on against assurance-off has completed (Phase 8.4).",
23
+ "blocks_enforcement": true,
24
+ "unit": "proportion (0.0-1.0)",
25
+ "direction": "lower_is_better",
26
+ "_comment": null
27
+ },
28
+ "defect_catch_uplift": {
29
+ "description": "Incremental defects caught with the assurance mechanism active, minus the baseline without it.",
30
+ "threshold": null,
31
+ "measurement": null,
32
+ "set_when": "A frozen benchmark corpus exists (Phase 8.1) AND an ablation comparing assurance-on against assurance-off has completed (Phase 8.4). The measurement is the delta in defect-catch count between the two arms.",
33
+ "blocks_enforcement": true,
34
+ "unit": "count_delta (integer, may be negative)",
35
+ "direction": "higher_is_better",
36
+ "_comment": null
37
+ },
38
+ "cost_budget": {
39
+ "description": "Wall-clock time and token cost per gated change.",
40
+ "threshold": null,
41
+ "measurement": null,
42
+ "set_when": "A frozen benchmark corpus exists (Phase 8.1) AND a cost/latency measurement run has completed (Phase 8.3). Note: cost is measurable independently of ablation completion, so this threshold can be set before the other three.",
43
+ "blocks_enforcement": true,
44
+ "unit": "composite: {p50_seconds, p50_tokens, p95_seconds, p95_tokens}",
45
+ "direction": "lower_is_better",
46
+ "_comment": null
47
+ },
48
+ "false_positive_burden": {
49
+ "description": "Reds raised by the mechanism that a maintainer overrides as not-a-defect.",
50
+ "threshold": null,
51
+ "measurement": null,
52
+ "set_when": "A frozen benchmark corpus exists (Phase 8.1) AND an ablation has completed (Phase 8.4) AND human labelling of flagged changes as true- or false-positive is complete. That last input is NOT a named Phase 8 step and is the same class of unobtainable input as the sibling roadmap's `blocker: b-human-risk-corpus`.",
53
+ "blocks_enforcement": true,
54
+ "unit": "count_per_100_changes (float)",
55
+ "direction": "lower_is_better",
56
+ "_comment": null
57
+ }
58
+ },
59
+ "revisit_if": [
60
+ "Any dimension's threshold is still null 90 days after the frozen benchmark corpus is committed.",
61
+ "A proposed blocking policy's observable characteristics map to no dimension under `dimension_applicability`.",
62
+ "Empirical data shows the four-dimension set is incomplete — a failure mode orthogonal to all four emerges.",
63
+ "The promised enforcement gate is removed or bypassed without bumping schema_version and re-registering."
64
+ ]
65
+ }
@@ -101,6 +101,20 @@ pre_push_budget_seconds: 25
101
101
  # resolver not a gate at all — a helper a workflow step calls to compute
102
102
  # something (a diff base, a scope); it decides and blocks nothing
103
103
  ci_only:
104
+ # road-to-target-project-assurance-readiness steps 0.3 and 3.1. Both run in the
105
+ # NIGHTLY risk-class-drift workflow, and neither belongs in a local gate chain:
106
+ # `measure_risk_class_drift` APPENDS to a ledger, so putting it in `task ci` would
107
+ # make every local run write a row and the drift series would measure how often
108
+ # contributors ran the gate rather than what the tree looks like. Its classifier
109
+ # self-test is the half that IS worth running locally, and it is reachable —
110
+ # `classify_change_risk --self-test` — but the workflow invokes it as a step of
111
+ # its own rather than through the aggregate, which is what this checker sees.
112
+ - id: classify_change_risk
113
+ class: benchmark
114
+ reason: "invoked as the nightly drift workflow's self-test step; the classifier itself gates nothing and its `--self-test` is runnable locally on demand (`./scripts-run src/scripts/classify_change_risk --self-test`)"
115
+ - id: measure_risk_class_drift
116
+ class: benchmark
117
+ reason: "appends one row per run to agents/evidence/risk-classifier-drift.jsonl — in a local chain it would make the drift series a count of local gate runs rather than a measurement of merged changes; the standing metric is nightly by design (step 3.1 forbids a per-change trigger)"
104
118
  - id: check_release_surface_equality
105
119
  class: release
106
120
  reason: "shells out to `gh pr diff <n>` for a live release PR — there is no PR body to compare the CHANGELOG against on a local checkout"
@@ -28,6 +28,8 @@
28
28
  reason: scaffold template for ticket-bundle tickets (ADR-101); carries no runtime frontmatter — emit-tickets fills it in per ticket
29
29
  - path: src/agent-src/templates/contexts.md
30
30
  reason: scaffold index for project contexts/
31
+ - path: src/agent-src/templates/playbook.md
32
+ reason: scaffold for a Playbook context (ADR-244); its frontmatter is the PLAYBOOK'''s (task/scope/grade/invokes) and is shown in a fence, so the file itself carries none
31
33
  - path: src/agent-src/templates/contexts/auth-model.md
32
34
  reason: scaffold for project auth-model context
33
35
  - path: src/agent-src/templates/contexts/data-sensitivity.md
@@ -40,7 +40,7 @@
40
40
  "status": "armed-awaiting-projection: Phase 3.1-3.3 are data-window-gated (>= 2 weeks of rules_used); this criterion binds the moment a projection ships"
41
41
  },
42
42
  "ask_economy": {
43
- "definition": "Rung-0.5 substitution and adoption (roadmap Phase 4.4): substitution = ask-routed lines / (ask-routed + rung-1 spawn lines); adoption = ask lines with dispatch_outcome DONE / all ask lines; escalation = the caller\u0027s follow-up SPAWN lines carrying route_taken=subagent + escalated=true + origin=dispatch-economy-2026 (the ask line itself cannot know it was insufficient).",
43
+ "definition": "Rung-0.5 substitution and adoption (roadmap Phase 4.4): substitution = ask-routed lines / (ask-routed + rung-1 spawn lines); adoption = ask lines with dispatch_outcome DONE / all ask lines; escalation = the caller's follow-up SPAWN lines carrying route_taken=subagent + escalated=true + origin=dispatch-economy-2026 (the ask line itself cannot know it was insufficient).",
44
44
  "source": "Audit-log orchestration lines with route_taken='ask' (written by src/scripts/ask_transport.ts, origin tag dispatch-economy-2026).",
45
45
  "thresholds": {
46
46
  "escalation_kill": 0.3,
@@ -53,7 +53,9 @@
53
53
  "thresholds": {
54
54
  "low_quota_signal": 0.2,
55
55
  "_low_quota": "a sustained median quota below 0.2 over the review window is the cut-line evidence Phase 3.1 requires (>= 2 weeks of data) and the retriever gate's demand signal"
56
- }
56
+ },
57
+ "classification": "pre-intervention-impossible",
58
+ "classification_note": "Classified 2026-08-23 by road-to-trigger-delivered-rule-bodies step 0.8, which requires exactly one of miswired / pre-intervention-impossible / stale before anything is changed. NOT miswired: the report path works and 755 orchestration lines in agents/runtime/state/audit/2026-08.jsonl carry both fields, null on every one, because orchestration_record.ts:146-147 reads them from --rules-carried / --rules-used CLI flags that no caller anywhere passes. NOT stale: the question it asks is exactly the one a delivery mode makes answerable. IMPOSSIBLE: `rules_used` is 'rules the worker actually applied/cited' (contexts/execution/orchestration-telemetry.md:68), a model self-report, and under an eager projection there is no runtime consumer of rule bodies to instrument -- nothing can distinguish a rule that was applied from one that was merely present. The metric is left registered rather than deleted so this reasoning stays attached to it, and it no longer gates anything: later/road-to-deferred-rule-retriever condition (c) now reads the trigger-MATCH rate (rules_matched / rules_carried, produced by src/scripts/model_rule_injection), which is an event the delivery concern performs rather than a claim the model makes. The match rate is explicitly NOT relabelled as usage: matched-and-delivered is not applied-and-followed, and calling it usage would make the retriever's own demand gate self-fulfilling. Evidence: agents/evidence/analysis/trigger-delivery-baseline.md section 7."
57
59
  }
58
60
  },
59
61
  "honest_null_consequence": "If the re-measured floor on the post-9.29 tree is materially smaller than the cache-economy baseline (roadmap step 1.4), phases 3-5 of road-to-token-economy-dispatch downgrade to blockers citing the null, and the null is published in docs/benchmark.md. A metric nobody re-runs by review_by is treated as the latency file's fossilization failure: the report command below is the re-verification procedure.",
@@ -1,5 +1,5 @@
1
1
  {
2
- "_comment": "Outside-in evaluator budgets (road-to-credible-install Phase 6). VALUES ARE FROZEN FROM MEASURED ACCEPTANCE NUMBERS of Phases 0-3 (2026-07-27, packed tarball @ 9.8.0 tree, --omit=dev consumer install), never invented. The umbrella harness (src/scripts/evaluator_umbrella.sh) measures the packed artifact and check_evaluator_budgets.ts enforces: absolute budget AND >regression_pct growth vs last_measured fails even under budget. Owner + review date are lint-enforced (lint_budget_ownership). Timing metrics carry a per-entry regression_pct override (200) — wall-clock noise would flap a 10% creep rule; their absolute max is the binding gate. Sizes/counts keep the tight 10% creep.",
2
+ "_comment": "Outside-in evaluator budgets (road-to-credible-install Phase 6). VALUES ARE FROZEN FROM MEASURED ACCEPTANCE NUMBERS of Phases 0-3 (2026-07-27, packed tarball @ 9.8.0 tree, --omit=dev consumer install), never invented. The umbrella harness (src/scripts/evaluator_umbrella.sh) measures the packed artifact and check_evaluator_budgets.ts enforces: absolute budget AND >regression_pct growth vs last_measured fails even under budget. Owner + review date are lint-enforced (lint_budget_ownership). Timing metrics carry a per-entry regression_pct override (200) \u2014 wall-clock noise would flap a 10% creep rule; their absolute max is the binding gate. Sizes/counts keep the tight 10% creep.",
3
3
  "schema_version": 1,
4
4
  "owner": "maintainer",
5
5
  "review_by": "2027-07-27",
@@ -11,23 +11,23 @@
11
11
  "always_blocking": [
12
12
  "a metric with no measurement supplied"
13
13
  ],
14
- "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.",
15
- "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
+ "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 \u2014 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 \u2014 including release.ts \u2014 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.",
15
+ "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 \u2014 a one-maintainer channel producing routine noise gets muted, and a muted channel reproduces the original failure."
16
16
  },
17
17
  "measurement_record": {
18
18
  "path": "agents/evidence/metrics/evaluator-measurements.json",
19
- "written_by": "src/scripts/evaluator_umbrella.sh (UMBRELLA_RECORD=1 — the nightly sets it)",
19
+ "written_by": "src/scripts/evaluator_umbrella.sh (UMBRELLA_RECORD=1 \u2014 the nightly sets it)",
20
20
  "compared_by": "src/scripts/check_evaluator_budgets.ts --recorded",
21
21
  "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."
22
22
  },
23
23
  "remeasurement_2026_08_02": {
24
24
  "verified_against_a_fresh_run": {
25
- "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.",
26
- "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
+ "cli_help_command_count": "80 \u2014 three consecutive runs of the pinned method on an unchanged tree returned 80/80/80. Matches last_measured; deterministic confirmed.",
26
+ "mcp_public_tool_count": "19 \u2014 two consecutive tools/list runs on a freshly built dist/mcp/server.mjs returned 19/19. Matches last_measured; deterministic confirmed."
27
27
  },
28
- "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."
28
+ "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 \u2014 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."
29
29
  },
30
- "removed_2026_08_04": "unpacked_size_mb (max 28) — removed by maintainer decision at the 9.17.0 release: the gate turned every legitimate payload addition into a blocked release (measured 28.22 vs max 28 with all functional gates green), and the maintainer judged tarball size not worth gating. evaluator_umbrella.sh still MEASURES and records unpacked_size_mb as evidence; only the budget enforcement is gone. ADR-204 review_trigger (a) fired and was resolved this way.",
30
+ "removed_2026_08_04": "unpacked_size_mb (max 28) \u2014 removed by maintainer decision at the 9.17.0 release: the gate turned every legitimate payload addition into a blocked release (measured 28.22 vs max 28 with all functional gates green), and the maintainer judged tarball size not worth gating. evaluator_umbrella.sh still MEASURES and records unpacked_size_mb as evidence; only the budget enforcement is gone. ADR-204 review_trigger (a) fired and was resolved this way.",
31
31
  "budgets": {
32
32
  "node_modules_mb": {
33
33
  "max": 140,
@@ -58,18 +58,18 @@
58
58
  "deterministic": false
59
59
  },
60
60
  "cli_help_command_count": {
61
- "max": 104,
62
- "last_measured": 104,
63
- "last_measured_at": "2026-08-22",
64
- "method": "registry enumeration — count of `{ name: '...', disposition` entries in src/cli/registry.ts (NOT --help prose parsing; methods historically disagreed 74 vs 76 vs 79)",
65
- "baseline_note": "80 → 81 on 2026-08-03 (release 9.15.0 gate). This RECORDS growth that already shipped through its own reviewed PR; it does not authorize new surface. The +1 is f02db54c2 (fix(cli): register routing:doctor in the CLI registry) — the command existed, only its registry entry was missing, and the registering PR did not move this budget. The gate did its job again: breach WARNS on main and BLOCKS on release, which is the conscious-decision point rather than a silently raised cap. Re-measured 2026-08-03 via the pinned method: 81. Headroom stays zero by design — the next registry addition must move this number in its own PR. 81 → 82 on 2026-08-04: the `handoff` subcommand (road-to-agent-handoff-resume Phase 4) registers in the same PR that adds the surface, per this record's own contract. Re-measured via the pinned method: 82. 82 → 84 on 2026-08-04: the `route:explain` + `route:audit` verbs (routing-correctness validation surface) register in the same PR that adds the surface. Re-measured via the pinned method: 84. 84 → 85 on 2026-08-05: the `settings:set` verb (road-to-zero-ceremony-settings Phase 2 — the one agent-reachable settings writer) registers in the same PR that adds the surface, per this record's own contract. Re-measured via the pinned method: 85. 85 → 86 on 2026-08-06: the `conformance:behavior` verb (road-to-agent-behavior-conformance Phase 5 — replays the local transcript store through the four mechanised conformance checks) registers in the same PR that adds the surface, per this record's own contract. Re-measured via the pinned method: 86. 86 → 88 on 2026-08-07: the `sessions:list` + `sessions:claim` verbs (road-to-parallel-session-coordination — the shell surface of the shared session register, needed because /roadmap:next is command markdown and can only reach the register through a shell call) register in the same PR that adds the surface, per this record's own contract. Re-measured via the pinned method: 88. 88 → 89 on 2026-08-08: the `council:status` verb registers in the same PR that adds the surface, per this record's own contract. It exists because an agent in a consumer project announced \"kein Council konfiguriert (keine .agent-settings.yml)\" and substituted a weaker path while the council was configured user-globally the whole time — there was no verb that answered availability, so the only route was an inference from a filename, and the intuitive filename is the one location ADR-104 guarantees is never consulted. Re-measured via the pinned method: 89. 89 → 91 on 2026-08-08: the `self-repair:status` + `self-repair:release` verbs (the queued-defect reader and the single Hard-Floor-gated outward step of the self-repair loop — the loop is deliberately unable to publish unless a human runs the release command) register in the same PR that adds the surface, per this record's own contract. Landed alongside the +1 council:status move in the same branch. Re-measured via the pinned method: 91. 91 → 94 on 2026-08-08: the `packs:active`, `settings:get` and `mcp:available` verbs (road-to-capability-answerability Phase 2 — the three capability probes for the gaps that had none) register in the same PR that adds the surface, per this record's own contract. Each answers a question that was previously only inferable from a filename: which packs are active and from which file, what a setting resolves to and which file set it, and what is declared in mcp.json versus what can actually launch. 94 -> 95 in the same PR: `brand:status` (Phase 2.4 — brand-layer presence, which the rule depended on and no surface could answer). Re-measured twice via the pinned method on the unchanged tree: 95/95. 95 → 96 on 2026-08-10: the `session:recycle` verb (road-to-token-economy-recycling Phase 2.2 — the deterministic producer of the main-session recycle envelope; the recycle advisory names this exact verb, so it must exist as a shell surface) registers in the same PR that adds the surface, per this record's own contract. Re-measured via the pinned method: 96. 96 -> 97 on 2026-08-10: the `gates` verb registers in the same PR that adds the surface, per this record's own contract. It exists because the blocker fields the dashboard already parses (Owner, What to do, Resolved when — CI-enforced by lint_roadmap_blockers) had no owner-filtered reader: the dashboard counts the open blockers across a 600-line file and links each to a per-roadmap anchor, so \"which of these are mine\" was a manual read of every anchor. The same inference-from-a-filename shape as the council:status entry above, one layer up. This branch and the session:recycle branch each measured 96 independently and landed on the same number for different verbs; the merge makes it 97, re-measured twice via the pinned method on the merged tree: 97/97. 97 -> 98 on 2026-08-15: the `workspace:doctor` verb (road-to-inbox-harvest-2026-08-c-workspace-identity Phase 3 — the read-only report over the new `workspaceIdentity()` resolver) registers in the same PR that adds the surface, per this record's own contract. It exists for the same inference-from-a-filename shape as the council:status and gates entries above, one layer down: the tree answered \"where am I\" in eight ad-hoc places across six files, and the 12.0.0 span shipped the same worktree misclassification twice, so no verb could be asked which checkout is the main one. Read-only by construction — the roadmap's Non-goals put worktree disposal out of scope and its Risk 3 names \"the pressure read becomes a disposal path by accident\" as the failure to design against, so the command carries no --fix and no --prune. Re-measured twice via the pinned method on the unchanged tree: 98/98. 98 -> 99 on 2026-08-17: the `council:quota` verb (road-to-council-quota-accounting-truth Phase 2) registers in the same PR that adds the surface, per this record's own contract. Exactly the inference-from-a-filename shape as the council:status entry above, one layer down: `cmd_quota` had existed in council_cli.ts and been reachable only via `scripts-run`, so the documented recovery path for an exhausted shared counter -- read the usage, reset one provider -- did not resolve through `agent-config`, and an operator debugging a quota failure met `unknown command`. The verb is read-only apart from the pre-existing `--reset <provider>`, which already required `--confirm`. Re-measured twice via the pinned method on the unchanged tree: 99/99. 99 -> 100 on 2026-08-19: the `decision:memo` verb (road-to-long-horizon-execution Phase 2.2, sequencing UOTL Phase 4.3 -- the decision-memo channel) registers in the same PR that adds the surface, per this record's own contract. It exists because the question ladder gained a rung between \"halt and ask\" and \"decide silently\": a resolution the run makes without contacting the operator is only legitimate if it is reviewable afterwards, and there was no surface that wrote such a record with a fixed shape. Write-and-list only, local-only (agents/runtime/ is gitignored), and it gates nothing -- the locked decision classes are refused at the config schema, never in the ledger. 100 -> 101 in the same PR: `run:supervise` (Phase 3.1 -- the out-of-process watcher for runs whose session died with open steps left). It is the operator-facing half of session continuity: nothing anywhere had the job of noticing that a claimed run stopped moving, so a roadmap 40% done and a roadmap finished looked identical from outside the dead session. Report-only by default and it NEVER merges, pushes or closes -- the auto-merge the reference design carries is a named rejection in the roadmap's harvest section, not an unbuilt feature. Re-measured twice via the pinned method on the unchanged tree: 101/101. 101 → 102 on 2026-08-22: the `adr:effective` verb (road-to-evidence-based-adr-governance step 2.2 — the effective-state projection over one decision record) registers in the same PR that adds the surface, per this record's own contract. It exists because current truth about an ADR was only reconstructable from linear prose: an agent had to read the body, then every amendment, and decide for itself which clauses still stand. The verb reports status, the Decision verbatim, clauses the record's own amendments superseded, active amendments, the three descriptive axes and the review-trigger state. It AUTHORIZES NOTHING — Phase 2 of that roadmap is titled \"surfacing only; no authority\" and its AC-7 forbids any authority consequence, so the verb reports an absent axis as absent (`— (no provenance axis)`, `— (ungraded)`, `absent → evidence`) and an unresolvable trigger as `indeterminate` rather than inferring one. Re-measured twice via the pinned method on the unchanged tree: 102/102. 102 → 104 on 2026-08-22: the `council:grant-billing` + `council:revoke-billing` verbs (road-to-billing-cliff-gate Phase 2 — the run-scoped billing grant that lets `ai_council.fallback.api_on_quota: 'ask'` be answered once per run instead of once per seat) register in the same PR that adds the surface, per this record's own contract. The two are a pair by construction rather than by convenience: a grant that can be issued and not revoked would outlive its run, which is the failure the run-scoped TTL exists to prevent. Re-measured via the pinned method: 104."
61
+ "max": 107,
62
+ "last_measured": 107,
63
+ "last_measured_at": "2026-08-23",
64
+ "method": "registry enumeration \u2014 count of `{ name: '...', disposition` entries in src/cli/registry.ts (NOT --help prose parsing; methods historically disagreed 74 vs 76 vs 79)",
65
+ "baseline_note": "80 \u2192 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) \u2014 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 \u2014 the next registry addition must move this number in its own PR. 81 \u2192 82 on 2026-08-04: the `handoff` subcommand (road-to-agent-handoff-resume Phase 4) registers in the same PR that adds the surface, per this record's own contract. Re-measured via the pinned method: 82. 82 \u2192 84 on 2026-08-04: the `route:explain` + `route:audit` verbs (routing-correctness validation surface) register in the same PR that adds the surface. Re-measured via the pinned method: 84. 84 \u2192 85 on 2026-08-05: the `settings:set` verb (road-to-zero-ceremony-settings Phase 2 \u2014 the one agent-reachable settings writer) registers in the same PR that adds the surface, per this record's own contract. Re-measured via the pinned method: 85. 85 \u2192 86 on 2026-08-06: the `conformance:behavior` verb (road-to-agent-behavior-conformance Phase 5 \u2014 replays the local transcript store through the four mechanised conformance checks) registers in the same PR that adds the surface, per this record's own contract. Re-measured via the pinned method: 86. 86 \u2192 88 on 2026-08-07: the `sessions:list` + `sessions:claim` verbs (road-to-parallel-session-coordination \u2014 the shell surface of the shared session register, needed because /roadmap:next is command markdown and can only reach the register through a shell call) register in the same PR that adds the surface, per this record's own contract. Re-measured via the pinned method: 88. 88 \u2192 89 on 2026-08-08: the `council:status` verb registers in the same PR that adds the surface, per this record's own contract. It exists because an agent in a consumer project announced \"kein Council konfiguriert (keine .agent-settings.yml)\" and substituted a weaker path while the council was configured user-globally the whole time \u2014 there was no verb that answered availability, so the only route was an inference from a filename, and the intuitive filename is the one location ADR-104 guarantees is never consulted. Re-measured via the pinned method: 89. 89 \u2192 91 on 2026-08-08: the `self-repair:status` + `self-repair:release` verbs (the queued-defect reader and the single Hard-Floor-gated outward step of the self-repair loop \u2014 the loop is deliberately unable to publish unless a human runs the release command) register in the same PR that adds the surface, per this record's own contract. Landed alongside the +1 council:status move in the same branch. Re-measured via the pinned method: 91. 91 \u2192 94 on 2026-08-08: the `packs:active`, `settings:get` and `mcp:available` verbs (road-to-capability-answerability Phase 2 \u2014 the three capability probes for the gaps that had none) register in the same PR that adds the surface, per this record's own contract. Each answers a question that was previously only inferable from a filename: which packs are active and from which file, what a setting resolves to and which file set it, and what is declared in mcp.json versus what can actually launch. 94 -> 95 in the same PR: `brand:status` (Phase 2.4 \u2014 brand-layer presence, which the rule depended on and no surface could answer). Re-measured twice via the pinned method on the unchanged tree: 95/95. 95 \u2192 96 on 2026-08-10: the `session:recycle` verb (road-to-token-economy-recycling Phase 2.2 \u2014 the deterministic producer of the main-session recycle envelope; the recycle advisory names this exact verb, so it must exist as a shell surface) registers in the same PR that adds the surface, per this record's own contract. Re-measured via the pinned method: 96. 96 -> 97 on 2026-08-10: the `gates` verb registers in the same PR that adds the surface, per this record's own contract. It exists because the blocker fields the dashboard already parses (Owner, What to do, Resolved when \u2014 CI-enforced by lint_roadmap_blockers) had no owner-filtered reader: the dashboard counts the open blockers across a 600-line file and links each to a per-roadmap anchor, so \"which of these are mine\" was a manual read of every anchor. The same inference-from-a-filename shape as the council:status entry above, one layer up. This branch and the session:recycle branch each measured 96 independently and landed on the same number for different verbs; the merge makes it 97, re-measured twice via the pinned method on the merged tree: 97/97. 97 -> 98 on 2026-08-15: the `workspace:doctor` verb (road-to-inbox-harvest-2026-08-c-workspace-identity Phase 3 \u2014 the read-only report over the new `workspaceIdentity()` resolver) registers in the same PR that adds the surface, per this record's own contract. It exists for the same inference-from-a-filename shape as the council:status and gates entries above, one layer down: the tree answered \"where am I\" in eight ad-hoc places across six files, and the 12.0.0 span shipped the same worktree misclassification twice, so no verb could be asked which checkout is the main one. Read-only by construction \u2014 the roadmap's Non-goals put worktree disposal out of scope and its Risk 3 names \"the pressure read becomes a disposal path by accident\" as the failure to design against, so the command carries no --fix and no --prune. Re-measured twice via the pinned method on the unchanged tree: 98/98. 98 -> 99 on 2026-08-17: the `council:quota` verb (road-to-council-quota-accounting-truth Phase 2) registers in the same PR that adds the surface, per this record's own contract. Exactly the inference-from-a-filename shape as the council:status entry above, one layer down: `cmd_quota` had existed in council_cli.ts and been reachable only via `scripts-run`, so the documented recovery path for an exhausted shared counter -- read the usage, reset one provider -- did not resolve through `agent-config`, and an operator debugging a quota failure met `unknown command`. The verb is read-only apart from the pre-existing `--reset <provider>`, which already required `--confirm`. Re-measured twice via the pinned method on the unchanged tree: 99/99. 99 -> 100 on 2026-08-19: the `decision:memo` verb (road-to-long-horizon-execution Phase 2.2, sequencing UOTL Phase 4.3 -- the decision-memo channel) registers in the same PR that adds the surface, per this record's own contract. It exists because the question ladder gained a rung between \"halt and ask\" and \"decide silently\": a resolution the run makes without contacting the operator is only legitimate if it is reviewable afterwards, and there was no surface that wrote such a record with a fixed shape. Write-and-list only, local-only (agents/runtime/ is gitignored), and it gates nothing -- the locked decision classes are refused at the config schema, never in the ledger. 100 -> 101 in the same PR: `run:supervise` (Phase 3.1 -- the out-of-process watcher for runs whose session died with open steps left). It is the operator-facing half of session continuity: nothing anywhere had the job of noticing that a claimed run stopped moving, so a roadmap 40% done and a roadmap finished looked identical from outside the dead session. Report-only by default and it NEVER merges, pushes or closes -- the auto-merge the reference design carries is a named rejection in the roadmap's harvest section, not an unbuilt feature. Re-measured twice via the pinned method on the unchanged tree: 101/101. 101 \u2192 102 on 2026-08-22: the `adr:effective` verb (road-to-evidence-based-adr-governance step 2.2 \u2014 the effective-state projection over one decision record) registers in the same PR that adds the surface, per this record's own contract. It exists because current truth about an ADR was only reconstructable from linear prose: an agent had to read the body, then every amendment, and decide for itself which clauses still stand. The verb reports status, the Decision verbatim, clauses the record's own amendments superseded, active amendments, the three descriptive axes and the review-trigger state. It AUTHORIZES NOTHING \u2014 Phase 2 of that roadmap is titled \"surfacing only; no authority\" and its AC-7 forbids any authority consequence, so the verb reports an absent axis as absent (`\u2014 (no provenance axis)`, `\u2014 (ungraded)`, `absent \u2192 evidence`) and an unresolvable trigger as `indeterminate` rather than inferring one. Re-measured twice via the pinned method on the unchanged tree: 102/102. 102 \u2192 104 on 2026-08-22: the `council:grant-billing` + `council:revoke-billing` verbs (road-to-billing-cliff-gate Phase 2 \u2014 the run-scoped billing grant that lets `ai_council.fallback.api_on_quota: 'ask'` be answered once per run instead of once per seat) register in the same PR that adds the surface, per this record's own contract. The two are a pair by construction rather than by convenience: a grant that can be issued and not revoked would outlive its run, which is the failure the run-scoped TTL exists to prevent. Re-measured via the pinned method: 104. 104 -> 106 on 2026-08-23: the `ui:audit` + `ui:render` verbs (road-to-frontend-power E2.1 and E3.1 -- the two Class-A commands that give the frontend obligations an artefact a gate can read and a render a verdict can cite) register in the same PR that adds the surface, per this record's own contract. The two are a pair by construction rather than by convenience: `ui-audit-gate`'s enforced_by moved from `none` to a carrier in the same change, and that carrier reports `verification: degraded` whenever the render artefact is absent -- so an audit verb without a render verb would ship a gate that can never reach `verified`. Both are Class A under ADR-124: they terminate, their whole state is a rebuildable directory under agents/runtime/state/, and ui:render closes chromium in a `finally` on every path with no --serve, watch or cache for a resident browser to hide in. Re-measured via the pinned method on the unchanged tree: 106. 106 \u2192 107 on 2026-08-23: the `roadmap:context` verb (road-to-roadmap-situational-awareness \u2014 the single live probe that answers what else is in flight before a roadmap is picked) registers in the same PR that adds the surface, per this record's own contract. Its branch measured 105 against a base of 104 and this branch measured 106 against the same base for `ui:audit` + `ui:render`; the merge makes it 107, re-measured on the merged tree via the pinned method (registry enumeration): 107."
66
66
  },
67
67
  "mcp_public_tool_count": {
68
68
  "max": 20,
69
69
  "last_measured": 20,
70
70
  "last_measured_at": "2026-08-17",
71
71
  "method": "tools/list length on the stdio server (post-ADR-132: implemented tools only)",
72
- "baseline_note": "19 → 20 on 2026-08-17 (release 13.0.0 gate). The +1 is 866bd9861 (feat(mcp): recover what the host dropped — real ranker tool + a route to it, road-to-inbox-harvest-2026-08-d-runtime-skill-routing Phase 4): `suggest_skill_for_task` was promoted from a discovery STUB to a real ALLOWLIST entry and removed from STUB_TOOLS. Worth stating precisely, because the consumer-visible NAME did not grow — the stub already published that name and its `task` + `limit` input schema, which the promotion carried over verbatim. What grew is the count of tools tools/list actually returns, which is exactly what this metric measures post-ADR-132: implemented tools only. Same shape as the cli_help_command_count history above — this RECORDS growth that already shipped through its own reviewed PR (866bd9861 is on main), it does not authorize new surface. The registering PR did not move this budget, so the gate did its job: the breach warned on main and blocked on the release ref, which is the conscious-decision point rather than a silently raised cap. Re-measured twice via the pinned method on a freshly built dist/mcp/server.mjs: 20/20. Headroom stays zero by design — the next tool that leaves STUB_TOOLS must move this number in its own PR."
72
+ "baseline_note": "19 \u2192 20 on 2026-08-17 (release 13.0.0 gate). The +1 is 866bd9861 (feat(mcp): recover what the host dropped \u2014 real ranker tool + a route to it, road-to-inbox-harvest-2026-08-d-runtime-skill-routing Phase 4): `suggest_skill_for_task` was promoted from a discovery STUB to a real ALLOWLIST entry and removed from STUB_TOOLS. Worth stating precisely, because the consumer-visible NAME did not grow \u2014 the stub already published that name and its `task` + `limit` input schema, which the promotion carried over verbatim. What grew is the count of tools tools/list actually returns, which is exactly what this metric measures post-ADR-132: implemented tools only. Same shape as the cli_help_command_count history above \u2014 this RECORDS growth that already shipped through its own reviewed PR (866bd9861 is on main), it does not authorize new surface. The registering PR did not move this budget, so the gate did its job: the breach warned on main and blocked on the release ref, which is the conscious-decision point rather than a silently raised cap. Re-measured twice via the pinned method on a freshly built dist/mcp/server.mjs: 20/20. Headroom stays zero by design \u2014 the next tool that leaves STUB_TOOLS must move this number in its own PR."
73
73
  }
74
74
  }
75
75
  }