@event4u/agent-config 14.6.0 → 14.8.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 (258) hide show
  1. package/.claude-plugin/marketplace.json +1 -1
  2. package/CHANGELOG.md +255 -145
  3. package/README.md +1 -1
  4. package/dist/agent-src/commands/analyze/inbox.md +264 -10
  5. package/dist/agent-src/commands/analyze.md +1 -1
  6. package/dist/agent-src/commands/evals/git-pr-merge.json +13 -0
  7. package/dist/agent-src/commands/evals/roadmap.json +17 -1
  8. package/dist/agent-src/commands/pr/create.md +14 -2
  9. package/dist/agent-src/commands/pr/merge.md +379 -0
  10. package/dist/agent-src/commands/roadmap/process-full.md +272 -32
  11. package/dist/agent-src/commands/roadmap.md +1 -1
  12. package/dist/agent-src/contexts/execution/auto-dispatch-classification.md +46 -36
  13. package/dist/agent-src/contexts/execution/autonomy-mechanics.md +37 -2
  14. package/dist/agent-src/contexts/execution/roadmap-execution-contract.md +95 -2
  15. package/dist/agent-src/contexts/execution/roadmap-process-loop.md +289 -106
  16. package/dist/agent-src/rules/artifact-drafting-protocol.md +5 -1
  17. package/dist/agent-src/rules/context-hygiene.md +2 -0
  18. package/dist/agent-src/rules/decision-revisit-gate.md +67 -32
  19. package/dist/agent-src/rules/fix-what-you-see.md +108 -0
  20. package/dist/agent-src/rules/no-roadmap-references.md +0 -5
  21. package/dist/agent-src/rules/recurring-criticism.md +110 -0
  22. package/dist/agent-src/rules/roadmap-progress-sync.md +20 -1
  23. package/dist/agent-src/rules/rule-type-governance.md +0 -2
  24. package/dist/agent-src/rules/self-repair-loop.md +17 -0
  25. package/dist/agent-src/rules/skill-quality.md +0 -2
  26. package/dist/agent-src/rules/source-confidentiality.md +37 -7
  27. package/dist/agent-src/scripts/archival_sweep.ts +117 -0
  28. package/dist/agent-src/scripts/archive_completed_roadmaps.ts +26 -7
  29. package/dist/agent-src/scripts/dashboard_mode.ts +212 -0
  30. package/dist/agent-src/scripts/gate_budget.ts +282 -0
  31. package/dist/agent-src/scripts/gate_execute.ts +72 -31
  32. package/dist/agent-src/scripts/roadmap_gates.ts +74 -3
  33. package/dist/agent-src/scripts/update_roadmap_progress.ts +296 -53
  34. package/dist/agent-src/skills/adr-create/SKILL.md +124 -5
  35. package/dist/agent-src/skills/ai-council/SKILL.md +48 -807
  36. package/dist/agent-src/skills/ai-council/references/advanced-modes.md +320 -0
  37. package/dist/agent-src/skills/ai-council/references/cost-and-redaction.md +99 -0
  38. package/dist/agent-src/skills/ai-council/references/execution-modes.md +162 -0
  39. package/dist/agent-src/skills/ai-council/references/output-and-synthesis.md +125 -0
  40. package/dist/agent-src/skills/ai-council/references/procedure.md +143 -0
  41. package/dist/agent-src/skills/decision-record/SKILL.md +61 -3
  42. package/dist/agent-src/skills/decision-review/SKILL.md +65 -0
  43. package/dist/agent-src/skills/merge-conflicts/SKILL.md +26 -0
  44. package/dist/agent-src/skills/quality-tools/SKILL.md +34 -326
  45. package/dist/agent-src/skills/quality-tools/references/js-ts-tools.md +113 -0
  46. package/dist/agent-src/skills/quality-tools/references/php-tools.md +222 -0
  47. package/dist/agent-src/skills/roadmap-management/SKILL.md +15 -409
  48. package/dist/agent-src/skills/roadmap-management/references/archival.md +226 -0
  49. package/dist/agent-src/skills/roadmap-management/references/authoring.md +107 -0
  50. package/dist/agent-src/skills/roadmap-management/references/dashboard.md +47 -0
  51. package/dist/agent-src/skills/roadmap-management/references/lifecycle.md +58 -0
  52. package/dist/agent-src/skills/security/SKILL.md +8 -0
  53. package/dist/agent-src/skills/security-audit/SKILL.md +12 -1
  54. package/dist/agent-src/skills/skill-writing/SKILL.md +34 -570
  55. package/dist/agent-src/skills/skill-writing/references/procedure.md +275 -0
  56. package/dist/agent-src/skills/skill-writing/references/read-only-scripts.md +18 -0
  57. package/dist/agent-src/skills/skill-writing/references/section-patterns.md +298 -0
  58. package/dist/agent-src/templates/agents/agent-project-settings.example.yml +1 -1
  59. package/dist/agent-src/templates/roadmaps.md +65 -4
  60. package/dist/agent-src/templates/scripts/telemetry/flush_sender.mjs +163 -0
  61. package/dist/agent-src/templates/scripts/telemetry/remote.ts +160 -7
  62. package/dist/agent-src/templates/scripts/telemetry/transport.ts +169 -0
  63. package/dist/cli/registry.js +2 -1
  64. package/dist/cli/registry.js.map +1 -1
  65. package/dist/cli-delegate/chunk-2GNWGMAL.js +172 -0
  66. package/dist/cli-delegate/{chunk-P6LQDIWK.js → chunk-7PRE6ZV2.js} +338 -0
  67. package/dist/cli-delegate/{chunk-BKO2AZ7Z.js → chunk-B2ERU2VA.js} +1 -1
  68. package/dist/cli-delegate/chunk-E4XIZDIB.js +402 -0
  69. package/dist/cli-delegate/{chunk-3UCJWMMP.js → chunk-EEJUMCDZ.js} +16 -16
  70. package/dist/cli-delegate/{chunk-NXFWFAYV.js → chunk-G23AT6GD.js} +1 -0
  71. package/dist/cli-delegate/{chunk-XURJ4AQC.js → chunk-H4VIVD4C.js} +385 -284
  72. package/dist/cli-delegate/chunk-I3EIN2YG.js +36 -0
  73. package/dist/cli-delegate/{chunk-RLN73PR5.js → chunk-LPPWO5CE.js} +12 -8
  74. package/dist/cli-delegate/chunk-MWRD5YOH.js +100 -0
  75. package/dist/cli-delegate/{chunk-UEZ7D35A.js → chunk-N7CDDGI3.js} +4 -23
  76. package/dist/cli-delegate/{chunk-63WSP6YZ.js → chunk-PMEKGDED.js} +74 -167
  77. package/dist/cli-delegate/{chunk-GRRPEPRN.js → chunk-T7L2QK3K.js} +24 -5
  78. package/dist/cli-delegate/{chunk-EVTY7ISR.js → chunk-YM4GZDJG.js} +9 -1
  79. package/dist/cli-delegate/cmd_adr_effective.js +1162 -0
  80. package/dist/cli-delegate/cmd_conformance.js +466 -716
  81. package/dist/cli-delegate/cmd_converge.js +3 -3
  82. package/dist/cli-delegate/cmd_doctor.js +10 -10
  83. package/dist/cli-delegate/cmd_explain.js +1 -1
  84. package/dist/cli-delegate/cmd_export.js +10 -9
  85. package/dist/cli-delegate/cmd_handoff.js +10 -9
  86. package/dist/cli-delegate/cmd_memory_get.js +2 -1
  87. package/dist/cli-delegate/cmd_migrate.js +2 -2
  88. package/dist/cli-delegate/cmd_packs_active.js +1 -1
  89. package/dist/cli-delegate/cmd_preflight.js +5 -5
  90. package/dist/cli-delegate/cmd_prune.js +11 -10
  91. package/dist/cli-delegate/cmd_route_audit.js +6 -5
  92. package/dist/cli-delegate/cmd_route_explain.js +3 -3
  93. package/dist/cli-delegate/cmd_session_recycle.js +840 -30
  94. package/dist/cli-delegate/cmd_settings_get.js +3 -3
  95. package/dist/cli-delegate/cmd_settings_migrate.js +10 -9
  96. package/dist/cli-delegate/cmd_settings_set.js +1 -1
  97. package/dist/cli-delegate/cmd_sync.js +11 -10
  98. package/dist/cli-delegate/cmd_uninstall.js +13 -11
  99. package/dist/cli-delegate/cmd_update.js +4 -4
  100. package/dist/cli-delegate/cmd_upgrade.js +4 -4
  101. package/dist/cli-delegate/cmd_validate.js +11 -10
  102. package/dist/cli-delegate/cmd_versions.js +3 -3
  103. package/dist/discovery/deprecation-report.md +1 -1
  104. package/dist/discovery/discovery-manifest.json +111 -37
  105. package/dist/discovery/discovery-manifest.json.sha256 +1 -1
  106. package/dist/discovery/discovery-manifest.summary.md +5 -5
  107. package/dist/discovery/dormancy-report.md +1 -1
  108. package/dist/discovery/orphan-report.md +1 -1
  109. package/dist/discovery/packs.json +15 -12
  110. package/dist/discovery/trust-report.md +3 -3
  111. package/dist/discovery/workspaces.json +11 -8
  112. package/dist/hooks/dispatch.js +3165 -2192
  113. package/dist/install/claudePathsPlan.js +187 -0
  114. package/dist/install/claudePathsPlan.js.map +1 -0
  115. package/dist/install/globalRuleLayers.js +169 -0
  116. package/dist/install/globalRuleLayers.js.map +1 -0
  117. package/dist/install/hostLayerFingerprint.js +136 -0
  118. package/dist/install/hostLayerFingerprint.js.map +1 -0
  119. package/dist/install/install.mjs +553 -425
  120. package/dist/install/partitionEligibility.js +432 -0
  121. package/dist/install/partitionEligibility.js.map +1 -0
  122. package/dist/install/ruleLayerPartition.js +157 -0
  123. package/dist/install/ruleLayerPartition.js.map +1 -0
  124. package/dist/mcp/registry-manifest.json +3 -3
  125. package/dist/mcp/server.json +2 -2
  126. package/dist/mcp/server.mjs +1863 -1234
  127. package/dist/router.json +1 -1
  128. package/dist/scripts/_lib/agent_src.js +41 -0
  129. package/dist/scripts/_lib/agent_src.js.map +1 -1
  130. package/dist/scripts/_lib/install_layout.js +83 -0
  131. package/dist/scripts/_lib/install_layout.js.map +1 -0
  132. package/dist/scripts/_lib/installed_lock.js +444 -0
  133. package/dist/scripts/_lib/installed_lock.js.map +1 -0
  134. package/dist/scripts/_lib/prune_empty_dirs.js +85 -0
  135. package/dist/scripts/_lib/prune_empty_dirs.js.map +1 -0
  136. package/dist/scripts/condense.js +63 -251
  137. package/dist/scripts/condense.js.map +1 -1
  138. package/dist/server/schemas/settings.js +4 -0
  139. package/dist/server/schemas/settings.js.map +1 -1
  140. package/docs/contracts/settings-classes.md +12 -6
  141. package/docs/guidelines/agent-infra/agent-interaction-and-decision-quality.md +8 -3
  142. package/docs/guidelines/agent-infra/artifact-drafting-protocol-mechanics.md +45 -1
  143. package/docs/guidelines/agent-infra/context-hygiene-mechanics.md +26 -0
  144. package/docs/guidelines/agent-infra/false-green.md +47 -1
  145. package/docs/guidelines/agent-infra/memory-access.md +17 -0
  146. package/docs/guidelines/agent-infra/recurring-criticism-mechanics.md +96 -0
  147. package/package.json +1 -1
  148. package/src/agent-src/scripts/archival_sweep.ts +117 -0
  149. package/src/agent-src/scripts/archive_completed_roadmaps.ts +26 -7
  150. package/src/agent-src/scripts/dashboard_mode.ts +212 -0
  151. package/src/agent-src/scripts/gate_budget.ts +282 -0
  152. package/src/agent-src/scripts/gate_execute.ts +72 -31
  153. package/src/agent-src/scripts/roadmap_gates.ts +74 -3
  154. package/src/agent-src/scripts/update_roadmap_progress.ts +296 -53
  155. package/src/agent-src/templates/scripts/telemetry/flush_sender.mjs +163 -0
  156. package/src/agent-src/templates/scripts/telemetry/remote.ts +160 -7
  157. package/src/agent-src/templates/scripts/telemetry/transport.ts +169 -0
  158. package/src/config/agent-settings.template.yml +27 -2
  159. package/src/config/ci-local-parity.yml +39 -0
  160. package/src/config/estate-count-budget.json +612 -3
  161. package/src/config/evaluator-budgets.json +3 -3
  162. package/src/config/gate-coverage.yml +220 -12
  163. package/src/config/gate-violation-baselines.json +73 -63
  164. package/src/config/gitignore-block.txt +15 -2
  165. package/src/config/hook-latency-budget.json +5 -0
  166. package/src/config/rule-activation-census.json +14 -6
  167. package/src/config/rule-stub-ceilings.json +34 -7
  168. package/src/install/claudePathsPlan.ts +196 -0
  169. package/src/install/globalRuleLayers.ts +197 -0
  170. package/src/install/hostLayerFingerprint.ts +145 -0
  171. package/src/install/partitionEligibility.ts +502 -0
  172. package/src/install/ruleLayerPartition.ts +212 -0
  173. package/src/scripts/_cli/cmd_adr_effective.ts +484 -0
  174. package/src/scripts/_cli/cmd_session_recycle.ts +9 -1
  175. package/src/scripts/_dispatch.bash +17 -1
  176. package/src/scripts/_lib/ac_heading.ts +30 -0
  177. package/src/scripts/_lib/adr_frontmatter.test.ts +365 -0
  178. package/src/scripts/_lib/adr_frontmatter.ts +459 -0
  179. package/src/scripts/_lib/agent_src.ts +42 -0
  180. package/src/scripts/_lib/bench_ab_pinned_repo.ts +162 -0
  181. package/src/scripts/_lib/bench_ab_workspace.ts +10 -1
  182. package/src/scripts/_lib/envelope_grounding.ts +49 -9
  183. package/src/scripts/_lib/installed_lock.ts +50 -5
  184. package/src/scripts/_lib/layer_overlap_notice.ts +11 -2
  185. package/src/scripts/_lib/md_section.ts +129 -0
  186. package/src/scripts/_lib/prune_empty_dirs.ts +80 -0
  187. package/src/scripts/_lib/scope_guard.sh +26 -3
  188. package/src/scripts/_lib/self_repair.ts +19 -0
  189. package/src/scripts/_lib/self_repair_class_b.ts +171 -0
  190. package/src/scripts/adr/evidence_census.ts +899 -0
  191. package/src/scripts/adr/regenerate_index.ts +12 -32
  192. package/src/scripts/adr_cite_check.ts +540 -39
  193. package/src/scripts/ai_council/cli_help.ts +55 -0
  194. package/src/scripts/audit_adr_coverage.ts +103 -17
  195. package/src/scripts/before_complete_hook.ts +153 -28
  196. package/src/scripts/bench_ab_v2_complexity.ts +27 -7
  197. package/src/scripts/bench_hook_latency.ts +204 -0
  198. package/src/scripts/build_archive_index.ts +34 -0
  199. package/src/scripts/check_adr_frontmatter.ts +574 -39
  200. package/src/scripts/check_hook_bundle_content.ts +219 -0
  201. package/src/scripts/check_new_adr_evidence.ts +529 -0
  202. package/src/scripts/check_references.ts +78 -0
  203. package/src/scripts/check_release_published.ts +32 -11
  204. package/src/scripts/check_rule_layer_partition.ts +531 -0
  205. package/src/scripts/check_single_delivery.ts +194 -17
  206. package/src/scripts/check_standing_rule_delivery.ts +8 -2
  207. package/src/scripts/ci_settle.ts +170 -0
  208. package/src/scripts/condense.ts +79 -259
  209. package/src/scripts/council_cli.ts +3 -3
  210. package/src/scripts/dispatch_r2_reviewer.ts +6 -14
  211. package/src/scripts/external_sources_denylist.json +4 -1
  212. package/src/scripts/hook_manifest.json +1 -1
  213. package/src/scripts/hook_manifest.yaml +77 -14
  214. package/src/scripts/hooks/block_no_verify.ts +61 -10
  215. package/src/scripts/hooks/block_unauthorized_git.ts +21 -1
  216. package/src/scripts/hooks/concern_registry.ts +4 -0
  217. package/src/scripts/hooks/dispatch_hook.ts +154 -187
  218. package/src/scripts/hooks/dispatch_issues.ts +38 -19
  219. package/src/scripts/hooks/fallback_yaml.ts +66 -0
  220. package/src/scripts/hooks/host_semantics.ts +21 -0
  221. package/src/scripts/hooks/injection_budget.ts +13 -3
  222. package/src/scripts/hooks/py_json_dumps.ts +103 -0
  223. package/src/scripts/hooks/rtk_wrap_hook.ts +8 -3
  224. package/src/scripts/hooks/run_continuation_hook.ts +8 -5
  225. package/src/scripts/hooks/ship_diff_volume_hook.ts +81 -15
  226. package/src/scripts/hooks/source_first_gate_hook.ts +464 -0
  227. package/src/scripts/hooks/state_io.ts +870 -21
  228. package/src/scripts/hooks/stdin_failure_policy.ts +96 -0
  229. package/src/scripts/hooks/subagent_ledger_hook.ts +44 -15
  230. package/src/scripts/hooks/telemetry_flush_hook.ts +139 -0
  231. package/src/scripts/hooks/telemetry_self_repair.ts +128 -0
  232. package/src/scripts/hooks/telemetry_usage_hook.ts +22 -4
  233. package/src/scripts/hooks/turn_end_gate_hook.ts +81 -15
  234. package/src/scripts/injection_scan_hook.ts +137 -5
  235. package/src/scripts/install.ts +16 -11
  236. package/src/scripts/language_mirror_hook.ts +561 -25
  237. package/src/scripts/lint_framework_leakage_allowlist.json +2 -2
  238. package/src/scripts/lint_hook_manifest.ts +49 -0
  239. package/src/scripts/lint_plan_risk_register.ts +4 -3
  240. package/src/scripts/lint_provenance_vocabulary.ts +472 -4
  241. package/src/scripts/lint_skill_router_head.ts +4 -4
  242. package/src/scripts/mcp_server/tools.ts +2 -2
  243. package/src/scripts/new_roadmap.ts +136 -0
  244. package/src/scripts/pack_mcp_content.ts +20 -5
  245. package/src/scripts/release.ts +37 -38
  246. package/src/scripts/report_layer_overlap.ts +6 -0
  247. package/src/scripts/routing_doctor.ts +5 -1
  248. package/src/scripts/self_repair_hook.ts +37 -5
  249. package/src/scripts/session_register_hook.ts +11 -0
  250. package/src/scripts/skill_usage_collect.ts +11 -1
  251. package/src/scripts/skill_usage_report.ts +278 -8
  252. package/src/scripts/sync_pr_branch.ts +170 -20
  253. package/src/server/schemas/settings.ts +8 -0
  254. package/dist/cli-delegate/chunk-EJITJBJX.js +0 -172
  255. package/dist/cli-delegate/chunk-PZWRPRWP.js +0 -38
  256. package/dist/cli-delegate/{chunk-PPQO4NGR.js → chunk-6RJA2F5A.js} +3 -3
  257. package/dist/cli-delegate/{chunk-RYNADUFG.js → chunk-LWTYTX6F.js} +0 -0
  258. package/dist/cli-delegate/{chunk-FBKL6JWT.js → chunk-MMSGVZKV.js} +3 -3
@@ -58,11 +58,11 @@
58
58
  "deterministic": false
59
59
  },
60
60
  "cli_help_command_count": {
61
- "max": 101,
62
- "last_measured": 101,
61
+ "max": 102,
62
+ "last_measured": 102,
63
63
  "last_measured_at": "2026-08-19",
64
64
  "method": "registry enumeration — count of `{ name: '...', disposition` entries in src/cli/registry.ts (NOT --help prose parsing; methods historically disagreed 74 vs 76 vs 79)",
65
- "baseline_note": "80 → 81 on 2026-08-03 (release 9.15.0 gate). This RECORDS growth that already shipped through its own reviewed PR; it does not authorize new surface. The +1 is f02db54c2 (fix(cli): register routing:doctor in the CLI registry) — the command existed, only its registry entry was missing, and the registering PR did not move this budget. The gate did its job again: breach WARNS on main and BLOCKS on release, which is the conscious-decision point rather than a silently raised cap. Re-measured 2026-08-03 via the pinned method: 81. Headroom stays zero by design — the next registry addition must move this number in its own PR. 81 → 82 on 2026-08-04: the `handoff` subcommand (road-to-agent-handoff-resume Phase 4) registers in the same PR that adds the surface, per this record's own contract. Re-measured via the pinned method: 82. 82 → 84 on 2026-08-04: the `route:explain` + `route:audit` verbs (routing-correctness validation surface) register in the same PR that adds the surface. Re-measured via the pinned method: 84. 84 → 85 on 2026-08-05: the `settings:set` verb (road-to-zero-ceremony-settings Phase 2 — the one agent-reachable settings writer) registers in the same PR that adds the surface, per this record's own contract. Re-measured via the pinned method: 85. 85 → 86 on 2026-08-06: the `conformance:behavior` verb (road-to-agent-behavior-conformance Phase 5 — replays the local transcript store through the four mechanised conformance checks) registers in the same PR that adds the surface, per this record's own contract. Re-measured via the pinned method: 86. 86 → 88 on 2026-08-07: the `sessions:list` + `sessions:claim` verbs (road-to-parallel-session-coordination — the shell surface of the shared session register, needed because /roadmap:next is command markdown and can only reach the register through a shell call) register in the same PR that adds the surface, per this record's own contract. Re-measured via the pinned method: 88. 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."
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."
66
66
  },
67
67
  "mcp_public_tool_count": {
68
68
  "max": 20,
@@ -42,16 +42,53 @@
42
42
  #
43
43
  # COVERAGE — THE HONEST DENOMINATOR (re-measured 2026-08-18)
44
44
  # ----------------------------------------------------------
45
- # 267 `lint_*` / `check_*` / `audit_*` scripts live under `src/scripts/`
46
- # (the count is computed, not asserted — `check_gate_coverage.count_gate_scripts`).
47
- # **42 of them emit the machine-readable `scanned: <N>` line under their
48
- # CI-identical argv, and 41 of those 42 are listed below.** The manifest is
45
+ # 269 `lint_*` / `check_*` / `audit_*` scripts live under `src/scripts/`
46
+ # (the count is computed, not asserted — `check_gate_coverage.count_gate_scripts`,
47
+ # re-run 2026-08-21 and it returns 269).
48
+ # **45 of them emit the machine-readable `scanned: <N>` line under their
49
+ # CI-identical argv, and 42 of those 45 are listed below.** The manifest is
49
50
  # therefore complete with respect to its own contract for every gate that can
50
- # carry a floor, and covers ~15 % of the population.
51
+ # carry a floor, and covers ~16 % of the population.
51
52
  #
52
- # The one emitter deliberately NOT listed is `lint_evidence_artifacts`, for the
53
- # same reason `check_rule_projection_integrity` is not (see the paragraph
54
- # below): it is diff-scoped, so it legitimately emits `scanned: 0` on any
53
+ # Both halves were RE-DERIVED on 2026-08-21, not incremented, and the previous
54
+ # reading was off by one in a way worth recording: it said "42 … and 41 of those
55
+ # 42 are listed" while the file carried 42 rows AND named one deliberately
56
+ # unlisted emitter (`lint_evidence_artifacts`, below). Those three facts cannot
57
+ # all hold — 42 listed rows plus 1 unlisted emitter is 43 emitters, not 42. It
58
+ # is the same drift this section documents three times: an entry was added and
59
+ # the prose was adjusted by one instead of recounted.
60
+ #
61
+ # The derivation now, so the next reader can check it rather than trust it:
62
+ # `grep -c '^ - id:'` returns 42 (computable, and computed); every listed row
63
+ # is an emitter, because a row that did not emit could carry no floor and the
64
+ # guard would report it `failing`; THREE emitters are deliberately unlisted —
65
+ # `lint_evidence_artifacts` (below), `adr_cite_check` and
66
+ # `check_new_adr_evidence` (each in the block where its row would have sat);
67
+ # 42 + 3 = 45. The population figure comes from the function, and it stays 269
68
+ # because `check_new_adr_evidence` matches the population prefix whether or not
69
+ # it carries a row here.
70
+ #
71
+ # `adr/evidence_census` emits a `scanned:` line too and is NOT in either number:
72
+ # it carries no `lint|check|audit` prefix, so `count_gate_scripts()` never sees
73
+ # it. Named because the omission looks like a fourth miscount and is not one —
74
+ # an emitter outside the population cannot be an unlisted emitter within it.
75
+ #
76
+ # Corrected in completion review, and it is the third time this paragraph has
77
+ # been off by one — which is the argument for computing it rather than
78
+ # adjusting it. The previous reading said 43 listed and self-invited a `grep`
79
+ # that returns 42, so the check it offered refuted the sentence containing it.
80
+ # The cause each time is the same: a row was added or removed and the prose
81
+ # was incremented instead of recounted.
82
+ #
83
+ # A shape-grep over `src/scripts/` (`reportScanned(` or a literal `scanned: ${`)
84
+ # returns 63 files. That is a DIFFERENT population — any file carrying an emit
85
+ # shape, including gates that emit only in a non-CI mode — so it is not a
86
+ # recount of this sentence and must not be substituted for one.
87
+ #
88
+ # Three emitters are deliberately NOT listed, all for one reason. The first is
89
+ # `lint_evidence_artifacts`, for the same reason `check_rule_projection_integrity`
90
+ # is not (see the paragraph below): it is diff-scoped, so it legitimately emits
91
+ # `scanned: 0` on any
55
92
  # branch that adds no evidence artifact, and `min_scanned: 0` is the
56
93
  # false-count shape this file rejects. Its ledger half IS discharged — it
57
94
  # adopts `_lib/gate_ledger.ts` and `_lib/scan_scope.ts`, so
@@ -182,6 +219,28 @@ gates:
182
219
  the Taskfile parse degrades and the population silently collapses —
183
220
  cannot pass.
184
221
 
222
+ - id: check_rule_layer_partition
223
+ argv: []
224
+ min_scanned: 0
225
+ corpus: "the five project rule directories that receive a projected tree (.claude/rules, .cursor/rules, .clinerules, .windsurf/rules, .augment/rules)"
226
+ status: enforced
227
+ note: >
228
+ `min_scanned: 0` is the honest floor and not the false-count shape this file
229
+ rejects elsewhere. This gate compares a project rule directory against its
230
+ host's GLOBAL layer, and on a fresh CI checkout neither side exists — the
231
+ project trees are gitignored and no CI leg installs at user scope. So the
232
+ population is legitimately zero there, exactly as it is for the diff-scoped
233
+ gates the header paragraph carves out.
234
+ What keeps a zero from reading as a pass is inside the gate rather than in
235
+ this floor: with nothing compared it prints "nothing compared — N skipped.
236
+ This is not a pass" instead of a success line, and every skip names the host
237
+ and the unreadable path. Teeth land on a working checkout, where `task
238
+ preflight` runs it against real global layers.
239
+ It never reports a duplicate for a host whose global layer cannot be read: a
240
+ project copy is the only carrier when the global one is absent, so demanding
241
+ its removal on unread evidence would delete the rule from that host —
242
+ the failure `partitionEligibility`'s fail-safe ordering exists to prevent.
243
+
185
244
  - id: check_rule_activation_census
186
245
  argv: []
187
246
  min_scanned: 100
@@ -555,14 +614,62 @@ gates:
555
614
 
556
615
  - id: lint_plan_risk_register
557
616
  argv: []
558
- min_scanned: 12
559
- corpus: "ready roadmap files under agents/roadmaps/ top level (19 at baseline: 14 grandfathered + 4 draft-exempt + 1 carrying a live register)"
617
+ min_scanned: 1
618
+ corpus: "ready roadmap files under agents/roadmaps/ top level (6 as of 2026-08-21; 19 at the original baseline: 14 grandfathered + 4 draft-exempt + 1 carrying a live register)"
560
619
  status: enforced
561
620
  note: >
562
621
  Gate R1 (docs/contracts/plan-review-gates.md § 1). The count is READY
563
622
  FILES INSPECTED incl. grandfathered/draft-exempt ones — exemptions are
564
- reported, never silently skipped, so a collapse below the floor means
565
- the roadmaps root moved, not that the corpus went clean.
623
+ reported, never silently skipped.
624
+
625
+ Lowered 12 → 5 on 2026-08-21, and the SHAPE of the change matters more
626
+ than the number. The previous note asserted that "a collapse below the
627
+ floor means the roadmaps root moved, not that the corpus went clean."
628
+ That premise is falsified: archiving roadmaps at zero open and zero
629
+ deferred steps dropped the top-level count from 12 to 10 with the root
630
+ untouched — the corpus really did go cleaner, which is what
631
+ road-to-estate-drawdown exists to achieve. A floor pinned to the exact
632
+ corpus size fails on the drawdown succeeding, which is the wrong thing
633
+ to detect.
634
+
635
+ So the replacement is deliberately NOT today's count. Re-pinning at 10
636
+ would repeat the defect one archival later and force this note to be
637
+ rewritten every time a roadmap closes. 5 sits structurally below any
638
+ plausible active set while still catching the two failures this floor is
639
+ for: the roadmaps root moving, and the scanner silently reading nothing.
640
+ It is not a target for how many roadmaps ought to exist.
641
+
642
+ Count reconciliation, since two numbers move in this change and they
643
+ count different populations: this gate counts READY files at the top
644
+ level of agents/roadmaps/ (12 → 10 here), while
645
+ estate-count-budget.json::active_roadmaps counts NON-DRAFT candidates as
646
+ collect() sees them (11 → 10). The gap is the draft-status file each
647
+ population treats differently; neither number is derivable from the
648
+ other.
649
+
650
+ Revisit-if the active set is deliberately grown past ~15, at which point
651
+ 5 is uninformatively low, or if a drop is ever traced to a scanner
652
+ defect rather than to archival — either falsifies the number, not the
653
+ obligation.
654
+
655
+ Lowered again 10 → 5 on 2026-08-21, during the PR drain that produced the
656
+ paragraph above. 10 was measured against 12 and the drain had already
657
+ taken the corpus to 11 — one file of headroom, so the next archival would
658
+ have reddened CI for the exact reason this entry says is the wrong thing to
659
+ detect. 5 keeps the root-moved / scanner-blind signal (both scan 0) and
660
+ stops the number from needing a commit per archived roadmap.
661
+
662
+ Lowered again 5 → 1, and this time the SHAPE changed rather than the
663
+ number. 5 was picked to have headroom and did not: the drain took the
664
+ corpus to 6, so a review provoked the red by archiving one roadmap. The
665
+ lesson is that no absolute floor survives here — this gate's sibling
666
+ `check_estate_count` forbids growth, so the corpus can only shrink and any
667
+ floor above 0 is met eventually. 1 is the smallest value that still
668
+ distinguishes "the scanner read something" from "the root moved or the
669
+ scope is dead", which is the only thing this field was ever asked to
670
+ detect. Revisit-if the gate gains a way to express "non-empty" directly,
671
+ or if a drop to 0 is ever traced to a scanner defect rather than to an
672
+ empty corpus.
566
673
 
567
674
  - id: check_estate_count
568
675
  argv: []
@@ -695,6 +802,18 @@ gates:
695
802
  note: >
696
803
  Emits on stderr, not stdout: `--format json` owns this gate's stdout and a
697
804
  count written there would corrupt the payload. The guard reads both streams.
805
+ Corpus boundary, decided 2026-08-20 (council, `leave-unscanned`): `src/skills`
806
+ is deliberately OUT of this gate's corpus. Pointed at it the gate reports 13
807
+ findings (11 `buried_iron_law`, 2 `deep_iron_law`) that nobody currently sees.
808
+ Extending the corpus was declined on three grounds — the gate has no warn
809
+ level, so a staged extension would mean adding a warning mode to an enforced
810
+ blocking gate; the reverted `lint_skill_top_position` attempt showed two gates
811
+ defining one construct incompatibly, and the disputed `deep_iron_law` class is
812
+ still live in those 13; and the premise for scanning skills at all
813
+ (post-compaction truncation keeps the file start) is unverified, the tree's one
814
+ measured truncation fact being ENTRY-level. Re-opening this needs a measured
815
+ reason plus the reported-and-baselined ratchet, not a path added to `argv`.
816
+ See `agents/roadmaps/archive/road-to-context-fidelity.md` § Phase 3.
698
817
 
699
818
  - id: check_cli_registry_budget_sync
700
819
  argv: []
@@ -955,3 +1074,92 @@ gates:
955
1074
  # an already-listed file that GREW while the file COUNT stayed at one. That
956
1075
  # last case is what pins the metric as excess lines rather than a file count;
957
1076
  # a count-based ratchet passes it, and this gate must not.
1077
+
1078
+ # check_new_adr_evidence is DELIBERATELY NOT REGISTERED here, following this
1079
+ # file's own two precedents rather than breaking them.
1080
+ #
1081
+ # It is diff-scoped: its corpus is the set of decision records ADDED on the
1082
+ # branch (`git diff --diff-filter=A` over `docs/decisions/ADR-*.md` and
1083
+ # `docs/adrs/<area>/NNNN-*.md`), so ZERO is the honest reading on almost every
1084
+ # run and any floor above 0 reds every branch that adds no ADR. A
1085
+ # `min_scanned: 0` row is the false-count shape this file's header rejects in
1086
+ # as many words, and `lint_evidence_artifacts` and
1087
+ # `check_rule_projection_integrity` both hit this exact wall and resolved it by
1088
+ # staying unregistered. A row was written first and then withdrawn: the
1089
+ # argument for it was that a registered gate at least runs under CI-identical
1090
+ # argv, and that is real but it is not worth being the one instance that
1091
+ # introduces the shape two neighbours were excluded to avoid. Three precedents
1092
+ # agreeing is a convention; two agreeing and one defecting is drift.
1093
+ #
1094
+ # It is NOT unwatched. `task check-new-adr-evidence` and the
1095
+ # `New accepted ADRs disclose their evidence` step in rule-backstops.yml both
1096
+ # run it, so a broken gate fails there.
1097
+ #
1098
+ # And it is NOT unproven, which is the part a floor could never have supplied.
1099
+ # This gate's normal reading is zero added records — precisely the state where
1100
+ # a working gate and a completely broken one emit identical output
1101
+ # (`scanned: 0`, green), so no floor separates them at any value. `--self-test`
1102
+ # does: seven cases, four rejecting, each building a throwaway repo and driving
1103
+ # the real CLI with `--base <sha>`, including the case an `authority_basis:
1104
+ # owner_intent` escape must NOT buy (that field governs authority, never
1105
+ # disclosure). Sabotage-verified — with the `## Evidence` check removed the
1106
+ # self-test exits 1 and names the two cases that stopped firing.
1107
+ #
1108
+ # What is LOST, stated rather than implied: no minimum scan is held against
1109
+ # this gate by this manifest, so a change that silently narrowed its path
1110
+ # regexes to nothing would pass here. The self-test is what catches that, and
1111
+ # it is a test rather than a manifest floor — it runs when someone runs it.
1112
+
1113
+ # adr/evidence_census is DELIBERATELY NOT REGISTERED here either, for the
1114
+ # same structural reason and with a different cost.
1115
+ #
1116
+ # `matchesGatePattern` classifies on a name PREFIX
1117
+ # (`lint|check|audit|skill|verify_`) and `evidence_census.ts` carries neither,
1118
+ # so a row here would red `gate_population.test.ts` exactly as the
1119
+ # `adr_cite_check` row did. The block below weighs the three fixes for that
1120
+ # case and they apply unchanged: widening the pattern, renaming the script, or
1121
+ # inverting the classification to be manifest-driven.
1122
+ #
1123
+ # What is DIFFERENT, and better than the adr_cite_check case: the census is not
1124
+ # unwatched. `task check-adr-evidence-census` regenerates it to a temp path and
1125
+ # diffs against the committed artifact, wired in the `ci` chain and as the
1126
+ # `ADR evidence census up to date` step in rule-backstops.yml, so a corpus that
1127
+ # drifted from the artifact fails there instead of here. The census emits a
1128
+ # `scanned:` line and adopts the ledger, so what is lost is only the MINIMUM
1129
+ # SCAN FLOOR — a change that narrowed its corpus to zero AND regenerated the
1130
+ # artifact to match would pass both. Stated rather than implied, because the
1131
+ # drift check is a byte-comparison and byte-agreement on an empty corpus is
1132
+ # still agreement. Closing it properly is the same rename, in the same change
1133
+ # that renames adr_cite_check.
1134
+
1135
+ # adr_cite_check is DELIBERATELY NOT REGISTERED here, and the reason is a
1136
+ # disagreement between two gates over the same file rather than an oversight.
1137
+ #
1138
+ # The script is gate-shaped by behaviour: it emits one `scanned:` line, adopts
1139
+ # the ledger, asserts its scan scope, and runs in CI as `ADR citations resolve`
1140
+ # (rule-backstops.yml) plus `task check-adr-citations`. So it certifies
1141
+ # something and can lie about it, which is this manifest's own criterion.
1142
+ #
1143
+ # But `gate_population.matchesGatePattern` classifies structurally, on a NAME
1144
+ # PREFIX (`lint|check|audit|skill|verify_`), and `adr_cite_check.ts` carries
1145
+ # `check` as a suffix. Registering it made `gate_population.test.ts` red:
1146
+ # "manifest lists adr_cite_check, population does not". The two gates read the
1147
+ # same file and disagree.
1148
+ #
1149
+ # Three fixes were weighed and each was worse than the gap:
1150
+ # - widening the pattern to a `_check$` suffix pulls in four unrelated
1151
+ # scripts (bench_drift_check, worktree_cleanup_check, update_check,
1152
+ # cmd_settings_check), forcing them into the ledger contract and reddening
1153
+ # the completeness ratchet for work nobody asked for;
1154
+ # - renaming the script to `check_adr_citations.ts` is the convention-conform
1155
+ # answer and touches 26 files, including archived review artefacts and a
1156
+ # committed diff.patch that must not be rewritten;
1157
+ # - manifest-driven classification is explicitly rejected by
1158
+ # gate_population.ts's own header (a new gate lands before anyone
1159
+ # registers it, so that inverts the real dependency).
1160
+ #
1161
+ # So the row is dropped and the floor is unregistered. What is LOST is stated
1162
+ # rather than implied: the gate runs, but nothing holds it to a minimum scan,
1163
+ # so a future change that silently narrowed its corpus to zero would pass. The
1164
+ # honest close is the rename, in its own change, where 26 files of churn are
1165
+ # the subject rather than a side effect.