@event4u/agent-config 14.21.0 → 14.23.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 (235) 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 +164 -187
  5. package/CREDITS.md +37 -0
  6. package/README.md +1 -1
  7. package/dist/agent-src/commands/analyze/inbox.md +380 -5
  8. package/dist/agent-src/commands/analyze/repo.md +4 -2
  9. package/dist/agent-src/commands/pr/merge.md +47 -38
  10. package/dist/agent-src/commands/roadmap/next.md +8 -0
  11. package/dist/agent-src/contexts/communication/rules-auto/token-efficiency-mechanics.md +69 -0
  12. package/dist/agent-src/contexts/execution/auto-dispatch-classification.md +5 -5
  13. package/dist/agent-src/contexts/execution/autonomy-mechanics.md +12 -0
  14. package/dist/agent-src/rules/external-code-graph-interop.md +19 -14
  15. package/dist/agent-src/rules/notes-first-reasoning.md +36 -25
  16. package/dist/agent-src/rules/token-efficiency.md +26 -3
  17. package/dist/agent-src/scripts/_cli_entry.ts +51 -0
  18. package/dist/agent-src/scripts/archive_completed_roadmaps.ts +120 -27
  19. package/dist/agent-src/scripts/roadmap_gates.ts +4 -20
  20. package/dist/agent-src/scripts/roadmap_set_step.ts +5 -2
  21. package/dist/agent-src/scripts/stubs_due.ts +4 -18
  22. package/dist/agent-src/scripts/update_roadmap_progress.ts +7 -24
  23. package/dist/agent-src/skills/code-intelligence/SKILL.md +82 -1
  24. package/dist/agent-src/skills/git-workflow/references/push-closes-its-loop.md +9 -0
  25. package/dist/agent-src/skills/roadmap-writing/SKILL.md +17 -0
  26. package/dist/agent-src/skills/tailwind-engineer/SKILL.md +52 -2
  27. package/dist/agent-src/templates/agent-settings.md +0 -1
  28. package/dist/agent-src/templates/agents/agent-project-settings.example.yml +1 -1
  29. package/dist/cli/registry.js +1 -1
  30. package/dist/cli-delegate/_cli_entry.js +8 -0
  31. package/dist/cli-delegate/_lib/pin_resolver.js +170 -0
  32. package/dist/cli-delegate/archival_sweep.js +8 -0
  33. package/dist/cli-delegate/archive_completed_roadmaps.js +542 -0
  34. package/dist/cli-delegate/check_update_banner.js +923 -0
  35. package/dist/cli-delegate/{chunk-ZVBOHSVF.js → chunk-2KKXJW25.js} +23 -9
  36. package/dist/cli-delegate/chunk-5EK5WQN6.js +28 -0
  37. package/dist/cli-delegate/chunk-7XGD2OEU.js +96 -0
  38. package/dist/cli-delegate/chunk-DBH4AHDK.js +155 -0
  39. package/dist/cli-delegate/{chunk-4FS4WRXP.js → chunk-IAI3XL43.js} +15 -3
  40. package/dist/cli-delegate/chunk-JO25G5H7.js +20 -0
  41. package/dist/cli-delegate/{chunk-643Z7FIC.js → chunk-KCNTUSPI.js} +7 -1
  42. package/dist/cli-delegate/chunk-LTYVIY76.js +7961 -0
  43. package/dist/cli-delegate/chunk-QAJS5YWY.js +999 -0
  44. package/dist/cli-delegate/{chunk-YS6XTLEK.js → chunk-TYSY33MD.js} +56 -6
  45. package/dist/cli-delegate/chunk-ULET4BYS.js +328 -0
  46. package/dist/cli-delegate/chunk-YDQSHTD7.js +187 -0
  47. package/dist/cli-delegate/chunk-YWVXLR44.js +48 -0
  48. package/dist/cli-delegate/chunk-ZZQBUHFK.js +273 -0
  49. package/dist/cli-delegate/cmd_conformance.js +2 -2
  50. package/dist/cli-delegate/cmd_export.js +2 -2
  51. package/dist/cli-delegate/cmd_handoff.js +45 -13
  52. package/dist/cli-delegate/cmd_prune.js +2 -2
  53. package/dist/cli-delegate/cmd_session_recycle.js +4 -14
  54. package/dist/cli-delegate/cmd_settings_migrate.js +2 -2
  55. package/dist/cli-delegate/cmd_settings_set.js +1 -1
  56. package/dist/cli-delegate/cmd_sync.js +2 -2
  57. package/dist/cli-delegate/cmd_uninstall.js +2 -2
  58. package/dist/cli-delegate/cmd_validate.js +2 -2
  59. package/dist/cli-delegate/dashboard_mode.js +16 -0
  60. package/dist/cli-delegate/gate_budget.js +24 -0
  61. package/dist/cli-delegate/gate_execute.js +25 -0
  62. package/dist/cli-delegate/guarded_baseline.js +18 -0
  63. package/dist/cli-delegate/resume_probe.js +22 -0
  64. package/dist/cli-delegate/roadmap_gates.js +638 -0
  65. package/dist/cli-delegate/roadmap_set_step.js +173 -0
  66. package/dist/cli-delegate/stub_queue.js +47 -0
  67. package/dist/cli-delegate/stubs_due.js +38 -0
  68. package/dist/cli-delegate/ticket_bundles.js +59 -0
  69. package/dist/cli-delegate/update_roadmap_progress.js +60 -0
  70. package/dist/discovery/deprecation-report.md +1 -1
  71. package/dist/discovery/discovery-manifest.json +13 -13
  72. package/dist/discovery/discovery-manifest.json.sha256 +1 -1
  73. package/dist/discovery/discovery-manifest.summary.md +1 -1
  74. package/dist/discovery/dormancy-report.md +1 -1
  75. package/dist/discovery/orphan-report.md +1 -1
  76. package/dist/discovery/packs.json +2 -2
  77. package/dist/discovery/trust-report.md +1 -1
  78. package/dist/discovery/workspaces.json +2 -2
  79. package/dist/hooks/dispatch.js +1813 -946
  80. package/dist/install/claudeLayerCarriage.js +237 -0
  81. package/dist/install/claudePathsPlan.js +79 -0
  82. package/dist/install/hostLayerFingerprint.js +1 -1
  83. package/dist/install/install.mjs +21 -3
  84. package/dist/install/partitionEligibility.js +231 -117
  85. package/dist/install/ruleLayerPartition.js +10 -7
  86. package/dist/mcp/registry-manifest.json +2 -2
  87. package/dist/mcp/server.json +2 -2
  88. package/dist/mcp/server.mjs +10870 -7641
  89. package/dist/scripts/_lib/lean_projection_mode.js +108 -0
  90. package/dist/scripts/_lib/router_match.js +243 -0
  91. package/dist/scripts/_lib/rule_injection.js +216 -0
  92. package/dist/scripts/condense.js +52 -45
  93. package/dist/scripts/project_thin_rules.js +139 -19
  94. package/dist/server/schemas/settings.js +16 -3
  95. package/docs/MIGRATION.md +105 -1
  96. package/docs/contracts/settings-classes.md +40 -8
  97. package/docs/guidelines/agent-infra/minimal-safe-diff-mechanics.md +73 -0
  98. package/docs/guidelines/agent-infra/notes-horizon-mechanics.md +90 -0
  99. package/llms.txt +1 -1
  100. package/package.json +7 -4
  101. package/src/agent-src/scripts/_cli_entry.ts +51 -0
  102. package/src/agent-src/scripts/archive_completed_roadmaps.ts +120 -27
  103. package/src/agent-src/scripts/roadmap_gates.ts +4 -20
  104. package/src/agent-src/scripts/roadmap_set_step.ts +5 -2
  105. package/src/agent-src/scripts/stubs_due.ts +4 -18
  106. package/src/agent-src/scripts/update_roadmap_progress.ts +7 -24
  107. package/src/config/agent-settings.template.yml +47 -1
  108. package/src/config/continuity-surface.json +516 -0
  109. package/src/config/estate-count-budget.json +1 -1
  110. package/src/config/evaluator-budgets.json +4 -4
  111. package/src/config/gate-coverage.yml +29 -8
  112. package/src/config/gate-violation-baselines.json +8 -8
  113. package/src/config/gitignore-block.txt +19 -0
  114. package/src/config/hook-token-budget.json +7 -6
  115. package/src/config/host-injection-effect.json +73 -0
  116. package/src/config/packed-binary-manifest.json +33 -0
  117. package/src/config/preamble-payload-budget.json +112 -105
  118. package/src/config/publish-surface.json +4 -2
  119. package/src/config/routing-coverage-seed.json +9 -2
  120. package/src/install/claudeLayerCarriage.ts +273 -0
  121. package/src/install/claudePathsPlan.ts +76 -0
  122. package/src/install/hostLayerFingerprint.ts +1 -1
  123. package/src/install/partitionEligibility.ts +261 -127
  124. package/src/install/ruleLayerPartition.ts +19 -23
  125. package/src/scripts/_cli/cmd_session_recycle.ts +2 -25
  126. package/src/scripts/_cli/handoff_sessions.ts +14 -44
  127. package/src/scripts/_dispatch.bash +77 -27
  128. package/src/scripts/_lib/auto_dispatch.ts +2 -2
  129. package/src/scripts/_lib/catalogue_layer_parity.ts +146 -0
  130. package/src/scripts/_lib/continuity_slot.ts +295 -0
  131. package/src/scripts/_lib/continuity_surface.ts +296 -0
  132. package/src/scripts/_lib/continuity_writer.ts +253 -0
  133. package/src/scripts/_lib/corpus_manifest.ts +26 -9
  134. package/src/scripts/_lib/hook_settings.ts +86 -1
  135. package/src/scripts/_lib/injection_effect.ts +151 -0
  136. package/src/scripts/_lib/layer_overlap_notice.ts +50 -6
  137. package/src/scripts/_lib/lean_projection_mode.ts +127 -0
  138. package/src/scripts/_lib/packed_binary_predicate.ts +262 -0
  139. package/src/scripts/_lib/pin_resolver.ts +13 -0
  140. package/src/scripts/_lib/recycle_envelope_paths.ts +109 -21
  141. package/src/scripts/_lib/regression_neighbourhood.ts +159 -22
  142. package/src/scripts/_lib/retired_status.ts +74 -0
  143. package/src/scripts/_lib/session_eol.ts +44 -0
  144. package/src/scripts/_lib/session_index_trust.ts +346 -0
  145. package/src/scripts/_lib/skill_catalogue.ts +156 -21
  146. package/src/scripts/_lib/standing_bound_ratchet.ts +154 -0
  147. package/src/scripts/_lib/subagent_capsule.ts +117 -8
  148. package/src/scripts/_lib/vendored_grammar_upstream.ts +280 -0
  149. package/src/scripts/ai_council/api_transport.ts +5 -0
  150. package/src/scripts/ai_council/deliberation_metrics.ts +353 -0
  151. package/src/scripts/ai_council/prompts.ts +9 -0
  152. package/src/scripts/ai_council/synthesis_disagreement.ts +206 -0
  153. package/src/scripts/audit_mcp_tools.ts +69 -25
  154. package/src/scripts/build_mcp_catalog.ts +24 -1
  155. package/src/scripts/capture_skill_catalogue.ts +24 -11
  156. package/src/scripts/check_candidate_lines.ts +499 -0
  157. package/src/scripts/check_continuity_surface.ts +475 -0
  158. package/src/scripts/check_dependency_floors.ts +13 -6
  159. package/src/scripts/check_estate_count.ts +40 -79
  160. package/src/scripts/check_host_tree_parity.ts +291 -0
  161. package/src/scripts/check_pack_size.ts +262 -23
  162. package/src/scripts/check_preamble_payload_budget.ts +136 -7
  163. package/src/scripts/check_roadmap_trackable.ts +19 -16
  164. package/src/scripts/check_rule_layer_partition.ts +54 -34
  165. package/src/scripts/check_rule_projection_integrity.ts +102 -2
  166. package/src/scripts/check_single_delivery.ts +97 -31
  167. package/src/scripts/check_update_banner.ts +13 -0
  168. package/src/scripts/ci_settle.ts +205 -5
  169. package/src/scripts/code_graph/build.ts +217 -15
  170. package/src/scripts/code_graph/cli.ts +334 -15
  171. package/src/scripts/code_graph/detect.ts +38 -0
  172. package/src/scripts/code_graph/extract.ts +11 -0
  173. package/src/scripts/code_graph/grammar_probe.ts +43 -0
  174. package/src/scripts/code_graph/loader.ts +88 -14
  175. package/src/scripts/code_graph/query.ts +144 -11
  176. package/src/scripts/code_graph/resolution_tiers.ts +238 -0
  177. package/src/scripts/code_graph/sqlite_store.ts +262 -6
  178. package/src/scripts/code_graph/types.ts +117 -3
  179. package/src/scripts/code_graph/validate.ts +26 -1
  180. package/src/scripts/code_graph/verbs.ts +590 -0
  181. package/src/scripts/condense.ts +54 -42
  182. package/src/scripts/corpus_manifest.ts +5 -5
  183. package/src/scripts/council_cli.ts +11 -12
  184. package/src/scripts/count_intent_disagreement.ts +426 -0
  185. package/src/scripts/handoff_context_hook.ts +118 -1
  186. package/src/scripts/hook_effect_doctor.ts +82 -1
  187. package/src/scripts/hook_manifest.json +1 -1
  188. package/src/scripts/hook_manifest.yaml +87 -12
  189. package/src/scripts/hooks/block_speaking_inbox_dir.ts +182 -16
  190. package/src/scripts/hooks/chain_nudge_hook.ts +282 -0
  191. package/src/scripts/hooks/code_graph_context_hook.ts +201 -0
  192. package/src/scripts/hooks/concern_registry.ts +4 -2
  193. package/src/scripts/hooks/host_semantics.ts +1 -1
  194. package/src/scripts/hooks/orchestration_record_hook.ts +2 -2
  195. package/src/scripts/hooks/push_settle_hook.ts +3 -2
  196. package/src/scripts/hooks/rule_inject_hook.ts +108 -21
  197. package/src/scripts/hooks/session_eol_hook.ts +120 -2
  198. package/src/scripts/hooks/skill_route_hook.ts +11 -4
  199. package/src/scripts/hot_context_hook.ts +62 -7
  200. package/src/scripts/inbox_source_census.ts +322 -0
  201. package/src/scripts/install-hooks.sh +82 -0
  202. package/src/scripts/{lint_carrier_integrity.ts → lint_deferral_integrity.ts} +60 -214
  203. package/src/scripts/lint_plan_risk_register.ts +13 -17
  204. package/src/scripts/lint_roadmap_blockers.ts +164 -1
  205. package/src/scripts/mcp_server/consumer_tool_catalog.json +152 -2
  206. package/src/scripts/mcp_server/graph_tools.ts +294 -0
  207. package/src/scripts/mcp_server/path_util.ts +31 -0
  208. package/src/scripts/mcp_server/suggest_skill.ts +72 -0
  209. package/src/scripts/mcp_server/tool_catalog_source.ts +7 -1
  210. package/src/scripts/mcp_server/tools.ts +5 -69
  211. package/src/scripts/media/lib/adapter-contract.md +7 -2
  212. package/src/scripts/media/lib/fixtures/flux/asset-0001.png +0 -0
  213. package/src/scripts/media/lib/fixtures/gemini-image/asset-0001.png +0 -0
  214. package/src/scripts/media/lib/fixtures/ideogram/asset-0001.png +0 -0
  215. package/src/scripts/model_rule_injection.ts +61 -4
  216. package/src/scripts/project_thin_rules.ts +149 -16
  217. package/src/scripts/rdp_candidates_delta.ts +276 -0
  218. package/src/scripts/rdp_quality_eval.ts +217 -19
  219. package/src/scripts/release_mix_taxonomy.json +3 -2
  220. package/src/scripts/report_host_injection_effect.ts +189 -0
  221. package/src/scripts/report_layer_overlap.ts +41 -0
  222. package/src/scripts/report_skill_menu_census.ts +341 -0
  223. package/src/scripts/report_standing_payload_by_host.ts +650 -0
  224. package/src/scripts/schemas/agent-settings.schema.json +7 -1
  225. package/src/scripts/session_memory_index.ts +81 -8
  226. package/src/scripts/skill_tools/score_skill_relevance.ts +70 -6
  227. package/src/scripts/skill_tools/suggest_skill_for_task.ts +37 -3
  228. package/src/server/schemas/settings.ts +23 -4
  229. package/src/vendor/grammars/README.md +86 -0
  230. package/src/vendor/grammars/tree-sitter-javascript.wasm +0 -0
  231. package/src/vendor/grammars/tree-sitter-php.wasm +0 -0
  232. package/src/vendor/grammars/tree-sitter-typescript.wasm +0 -0
  233. package/src/scripts/_lib/carrier_status.ts +0 -118
  234. package/src/scripts/_lib/estate_carrier_cases.ts +0 -72
  235. package/src/scripts/hooks/code_graph_nudge_hook.ts +0 -191
@@ -0,0 +1,516 @@
1
+ {
2
+ "$comment": "Behavioural continuity-surface inventory. See src/scripts/_lib/continuity_surface.ts for the contract and src/scripts/check_continuity_surface.ts for the gate. Rows are validated against the tree on every run: every `locus` must resolve, and every persisted-state leaf under agents/runtime/state/ that any source file names must appear here with a disposition. Retiring a surface means DELETING its row \u2014 that is what makes a retirement measured rather than claimed.",
3
+ "axis_contract": {
4
+ "public_continuity_commands": "A public CLI verb or slash command that a normal user must invoke for continuity to happen. An optional affordance is excluded WITH its reason, never silently.",
5
+ "session_resume_pickers": "An interactive surface that asks a human to choose which prior session to resume.",
6
+ "persistent_continuity_artefacts": "Persisted state written for later session recovery, verification, or context restoration \u2014 whether or not it is labelled continuity. Corpus discovered behaviourally from agents/runtime/state/, never from the word.",
7
+ "continuity_schemas": "A distinct schema definition for a record a successor session reads to restore state.",
8
+ "normal_path_manual_actions": "A manual step a normal user must take on the normal path for continuity to work."
9
+ },
10
+ "targets": {
11
+ "public_continuity_commands": 0,
12
+ "session_resume_pickers": 0,
13
+ "persistent_continuity_artefacts": 1,
14
+ "continuity_schemas": 1,
15
+ "normal_path_manual_actions": 0
16
+ },
17
+ "rows": [
18
+ {
19
+ "id": "schema:capsule",
20
+ "axis": "continuity_schemas",
21
+ "disposition": "counted",
22
+ "locus": "src/scripts/_lib/subagent_capsule.ts:112",
23
+ "reason": "The one continuity-record schema: version 4, variant-discriminated, accepting v3 and v4. A recorded lock governs it \u2014 one schema, variant-discriminated, no new format, adding fields or variants but never repurposing or removing one. This is the surviving `1`."
24
+ },
25
+ {
26
+ "id": "schema:context-observation",
27
+ "axis": "continuity_schemas",
28
+ "disposition": "excluded",
29
+ "locus": "src/scripts/_lib/context_observation.ts:55",
30
+ "reason": "A recorded probe of external context (the fingerprint a checkpoint may carry). An input to a record, never a record."
31
+ },
32
+ {
33
+ "id": "schema:run-checkpoint",
34
+ "axis": "continuity_schemas",
35
+ "disposition": "excluded",
36
+ "locus": "src/scripts/_lib/run_checkpoint.ts:45",
37
+ "reason": "Run-integrity evidence, excluded on the same recorded D2 ruling that excludes the `checkpoints/` artefact: different key (run id), different consumer (`run:supervise`), different failure semantics (an integrity alarm, not a degraded resume)."
38
+ },
39
+ {
40
+ "id": "schema:session-eol-state",
41
+ "axis": "continuity_schemas",
42
+ "disposition": "excluded",
43
+ "locus": "src/scripts/_lib/session_eol.ts:55",
44
+ "reason": "The writer`s own bookkeeping, not a record a successor reads. It holds counters and advisory stamps used across Stops within one session; nothing restores a session from it."
45
+ },
46
+ {
47
+ "id": "manual:run-session-recycle-before-clear",
48
+ "axis": "normal_path_manual_actions",
49
+ "disposition": "counted",
50
+ "locus": "src/scripts/hooks/session_eol_hook.ts:258",
51
+ "reason": "The advisory the stop slot injects past the recycle threshold instructs a human to run `agent-config session:recycle`, wait for the absolute path it prints, and only then `/clear`. That is a manual action on the normal path, and it exists precisely because no automatic writer does. It is what step 3.1 removes the need for."
52
+ },
53
+ {
54
+ "id": ".dispatcher",
55
+ "axis": "persistent_continuity_artefacts",
56
+ "disposition": "excluded",
57
+ "locus": "src/scripts/hooks/cline-dispatcher.sh:77",
58
+ "reason": "The cline dispatcher marker file. Host wiring, not session state."
59
+ },
60
+ {
61
+ "id": ".dispatcher.lock",
62
+ "axis": "persistent_continuity_artefacts",
63
+ "disposition": "excluded",
64
+ "locus": "src/scripts/context_hygiene_hook.ts:36",
65
+ "reason": "A concurrency lock for the dispatcher. Held within one invocation."
66
+ },
67
+ {
68
+ "id": "ai-video-telemetry.jsonl",
69
+ "axis": "persistent_continuity_artefacts",
70
+ "disposition": "excluded",
71
+ "locus": "src/scripts/media/lib/telemetry.sh:7",
72
+ "reason": "Media-pipeline telemetry. A different subsystem entirely."
73
+ },
74
+ {
75
+ "id": "audit",
76
+ "axis": "persistent_continuity_artefacts",
77
+ "disposition": "excluded",
78
+ "locus": "src/scripts/_lib/activation_receipt_producer.ts:322",
79
+ "reason": "The append-only orchestration audit log. Telemetry and cost reporting; no restore path reads it."
80
+ },
81
+ {
82
+ "id": "chain-nudge.json",
83
+ "axis": "persistent_continuity_artefacts",
84
+ "disposition": "excluded",
85
+ "locus": "src/scripts/hooks/chain_nudge_hook.ts:190",
86
+ "reason": "Once-per-session nudge latch."
87
+ },
88
+ {
89
+ "id": "checkpoints",
90
+ "axis": "persistent_continuity_artefacts",
91
+ "disposition": "excluded",
92
+ "locus": "src/scripts/_lib/headless_invocation.ts:48",
93
+ "reason": "Run-integrity evidence, not conversational state. THE KEEP/RETIRE QUESTION IS ANSWERED HERE, IN WRITING, and the answer is KEEP \u2014 which is what roadmap step 4.1's third verify clause asks for, recorded at the point where the count is computed rather than in a document nobody opens. The AI council of 2026-09-07 (D2) ruled it: a run checkpoint is keyed by RUN id, consumed by `run:supervise` and `latestCheckpointFor`, and a disagreement there is an integrity alarm; a continuity record is keyed by SESSION, consumed by resume, and a gap there is a degraded resume. Different lifecycle, consumer, key and failure semantics, so one concern owning both would be \"a lifecycle subsystem wearing a continuity name\". Excluded from the continuity axis on that ruling \u2014 and this is the exclusion the same council named as the gaming vector for position 3, which is exactly why it is printed on every run instead of living inside a predicate."
94
+ },
95
+ {
96
+ "id": "code-graph-context.json",
97
+ "axis": "persistent_continuity_artefacts",
98
+ "disposition": "excluded",
99
+ "locus": "src/scripts/hooks/code_graph_context_hook.ts:90",
100
+ "reason": "Code-intelligence context state for the code-graph hook. A derived cache over the source tree, rebuildable from it, and read within the session that wrote it \u2014 it restores no conversation and no run."
101
+ },
102
+ {
103
+ "id": "code-graph-refresh.lock",
104
+ "axis": "persistent_continuity_artefacts",
105
+ "disposition": "excluded",
106
+ "reason": "A concurrency lock guarding the code-graph refresh so two checkouts do not rebuild the index at once. Held for the duration of one refresh; it carries no state anyone reads afterwards.",
107
+ "locus": "src/scripts/install-hooks.sh:634"
108
+ },
109
+ {
110
+ "id": "code-graph-v1.json",
111
+ "axis": "persistent_continuity_artefacts",
112
+ "disposition": "excluded",
113
+ "locus": "src/scripts/code_graph/cli.ts:28",
114
+ "reason": "A derived code-intelligence index. A cache of the source tree, rebuildable from it, and never session state."
115
+ },
116
+ {
117
+ "id": "config-weakening.json",
118
+ "axis": "persistent_continuity_artefacts",
119
+ "disposition": "excluded",
120
+ "locus": "src/scripts/hooks/block_config_weakening.ts:211",
121
+ "reason": "Per-session allowlist-growth counters for the config-weakening guard."
122
+ },
123
+ {
124
+ "id": "context-fill.json",
125
+ "axis": "persistent_continuity_artefacts",
126
+ "disposition": "counted",
127
+ "locus": "src/scripts/hooks/session_eol_hook.ts:31",
128
+ "reason": "Machine-readable fill level plus threshold state, overwritten every Stop. Written for later verification of whether the session crossed the recycle threshold. AUTHORISED FOR RETIREMENT and NOT RETIRED \u2014 the authorisation (AI council 2026-09-08 D1, resting on producer/no-consumer evidence) was obtained on incomplete facts. There is no consumer in code, but `agents/roadmaps/later/road-to-cost-parity-2-state-aware-dispatch.md` is a live parked roadmap whose open steps 1.1 and 1.4c read this file as a planned input, and 1.4c is specifically about bounding its staleness. The same council's own qualification anticipated this: \"no consumer in the tree\" proves no in-repository consumer, and a planned consumer inside the tree is a stronger objection than an external one because it is checkable. Retiring it is a decision for that roadmap's owner, not a side effect of this one. Blocker: `context-fill-retirement-has-a-parked-consumer`."
129
+ },
130
+ {
131
+ "id": "context-hygiene.json",
132
+ "axis": "persistent_continuity_artefacts",
133
+ "disposition": "excluded",
134
+ "locus": "src/scripts/_cli/cmd_analyze_session.ts:15",
135
+ "reason": "Turn and loop counters for the context-hygiene carrier. Read within a session to decide whether to warn; never read by a successor."
136
+ },
137
+ {
138
+ "id": "council-probes.json",
139
+ "axis": "persistent_continuity_artefacts",
140
+ "disposition": "excluded",
141
+ "locus": "src/scripts/ai_council/probe_store.ts:52",
142
+ "reason": "Council seat availability probe cache. Provider state."
143
+ },
144
+ {
145
+ "id": "decisions",
146
+ "axis": "persistent_continuity_artefacts",
147
+ "disposition": "excluded",
148
+ "locus": "src/scripts/_dispatch.bash:1302",
149
+ "reason": "Decision memos written during a run and rendered by `run:supervise`. A record of what was decided, not state a successor resumes from."
150
+ },
151
+ {
152
+ "id": "design-pass-hook.json",
153
+ "axis": "persistent_continuity_artefacts",
154
+ "disposition": "excluded",
155
+ "locus": "src/scripts/hooks/design_pass_hook.ts:66",
156
+ "reason": "Design-pass hook latch."
157
+ },
158
+ {
159
+ "id": "design-slop-hook.json",
160
+ "axis": "persistent_continuity_artefacts",
161
+ "disposition": "excluded",
162
+ "locus": "src/scripts/hooks/design_slop_hook.ts:18",
163
+ "reason": "Design-slop hook latch."
164
+ },
165
+ {
166
+ "id": "discovery-graph-v1.json",
167
+ "axis": "persistent_continuity_artefacts",
168
+ "disposition": "excluded",
169
+ "locus": "src/scripts/complexity_report.ts:223",
170
+ "reason": "A derived artefact-relation cache. Rebuildable from the tree."
171
+ },
172
+ {
173
+ "id": "dispatch-issues.jsonl",
174
+ "axis": "persistent_continuity_artefacts",
175
+ "disposition": "excluded",
176
+ "locus": "src/scripts/hooks/dispatch_issues.ts:12",
177
+ "reason": "Dispatcher self-diagnostics. Read by `hooks_doctor`."
178
+ },
179
+ {
180
+ "id": "edit-shape",
181
+ "axis": "persistent_continuity_artefacts",
182
+ "disposition": "excluded",
183
+ "locus": "src/scripts/hooks/edit_shape_hook.ts:46",
184
+ "reason": "Edit-shape hook per-file state, scoped to one session."
185
+ },
186
+ {
187
+ "id": "end-review-nudge",
188
+ "axis": "persistent_continuity_artefacts",
189
+ "disposition": "excluded",
190
+ "locus": "src/scripts/hooks/end_review_nudge_hook.ts:138",
191
+ "reason": "Once-per-session nudge latch."
192
+ },
193
+ {
194
+ "id": "gate-budget-ledger.jsonl",
195
+ "axis": "persistent_continuity_artefacts",
196
+ "disposition": "excluded",
197
+ "locus": "src/server/schemas/settings.ts:208",
198
+ "reason": "Gate-budget accounting. CI cost bookkeeping."
199
+ },
200
+ {
201
+ "id": "handoff-context.md",
202
+ "axis": "persistent_continuity_artefacts",
203
+ "disposition": "counted",
204
+ "locus": "src/scripts/_cli/cmd_handoff.ts:9",
205
+ "reason": "A second, prose-shaped session handoff written by `agent-config handoff` and injected once at the next `session_start`. Same job as the record, different format and different lifecycle \u2014 a competing mental model, which is what the count exists to expose."
206
+ },
207
+ {
208
+ "id": "hot-context.md",
209
+ "axis": "persistent_continuity_artefacts",
210
+ "disposition": "counted",
211
+ "locus": "src/scripts/hot_context_hook.ts:11",
212
+ "reason": "A working-memory cache rebuilt on stop/session_end/pre_compact and restored at session_start. Persisted state written for context restoration, so the behavioural rule counts it whatever it is called."
213
+ },
214
+ {
215
+ "id": "injection-census.jsonl",
216
+ "axis": "persistent_continuity_artefacts",
217
+ "disposition": "excluded",
218
+ "locus": "src/scripts/bench_hook_injection.ts:42",
219
+ "reason": "Hook-injection benchmark output. Measurement, not state."
220
+ },
221
+ {
222
+ "id": "injection-turn",
223
+ "axis": "persistent_continuity_artefacts",
224
+ "disposition": "excluded",
225
+ "locus": "src/scripts/hooks/injection_budget.ts:349",
226
+ "reason": "Per-turn injection budget accounting. Lives and dies inside one turn."
227
+ },
228
+ {
229
+ "id": "interruptions.jsonl",
230
+ "axis": "persistent_continuity_artefacts",
231
+ "disposition": "excluded",
232
+ "locus": "src/scripts/hooks/interruption_ledger_hook.ts:6",
233
+ "reason": "An interruption ledger for reporting. Analysis input, never a restore source."
234
+ },
235
+ {
236
+ "id": "memory-index-v1.sqlite3",
237
+ "axis": "persistent_continuity_artefacts",
238
+ "disposition": "excluded",
239
+ "locus": "src/scripts/_lib/memory_fts_index.ts:36",
240
+ "reason": "The memory full-text index. A derived cache over `agents/memory/`, rebuildable, and not session state."
241
+ },
242
+ {
243
+ "id": "onboarding-gate.json",
244
+ "axis": "persistent_continuity_artefacts",
245
+ "disposition": "excluded",
246
+ "locus": "src/scripts/onboarding_gate_hook.ts:13",
247
+ "reason": "Onboarding latch. Same class as the disclosure latch."
248
+ },
249
+ {
250
+ "id": "probe-throttle",
251
+ "axis": "persistent_continuity_artefacts",
252
+ "disposition": "excluded",
253
+ "locus": "src/scripts/hooks/probe_throttle.ts:9",
254
+ "reason": "Generic probe throttling stamps."
255
+ },
256
+ {
257
+ "id": "quota-parked",
258
+ "axis": "persistent_continuity_artefacts",
259
+ "disposition": "excluded",
260
+ "locus": "src/scripts/_lib/quota_parked.ts:38",
261
+ "reason": "Council seat quota parking. Provider state, unrelated to session recovery."
262
+ },
263
+ {
264
+ "id": "recycle-envelope.json",
265
+ "axis": "persistent_continuity_artefacts",
266
+ "disposition": "counted",
267
+ "locus": "src/scripts/_cli/cmd_session_recycle.ts:9",
268
+ "reason": "The continuity record itself: written by `session:recycle`, resolved per session by `resolveContinuityRecord`, consumed once at `session_start` by the handoff-context concern. This is the artefact the whole roadmap is collapsing the others INTO \u2014 the surviving `1`."
269
+ },
270
+ {
271
+ "id": "render",
272
+ "axis": "persistent_continuity_artefacts",
273
+ "disposition": "excluded",
274
+ "locus": "src/scripts/_dispatch.bash:77",
275
+ "reason": "Scratch render output for the UI surfaces."
276
+ },
277
+ {
278
+ "id": "reread-guard",
279
+ "axis": "persistent_continuity_artefacts",
280
+ "disposition": "excluded",
281
+ "locus": "src/scripts/hooks/reread_guard_hook.ts:21",
282
+ "reason": "Per-file re-read guard stamps, scoped to one session and never restored into another."
283
+ },
284
+ {
285
+ "id": "review-axis",
286
+ "axis": "persistent_continuity_artefacts",
287
+ "disposition": "excluded",
288
+ "locus": "src/scripts/review_axis_report.ts:209",
289
+ "reason": "Review-axis report state. Analysis output."
290
+ },
291
+ {
292
+ "id": "routing-telemetry.jsonl",
293
+ "axis": "persistent_continuity_artefacts",
294
+ "disposition": "excluded",
295
+ "locus": "src/scripts/_cli/cmd_route_audit.ts:48",
296
+ "reason": "Router match telemetry for `route:audit`. Opt-in measurement."
297
+ },
298
+ {
299
+ "id": "rule-inject",
300
+ "axis": "persistent_continuity_artefacts",
301
+ "disposition": "excluded",
302
+ "locus": "src/scripts/hooks/rule_inject_hook.ts:124",
303
+ "reason": "Rule-injection dedupe state, scoped to one session."
304
+ },
305
+ {
306
+ "id": "rule-trips.json",
307
+ "axis": "persistent_continuity_artefacts",
308
+ "disposition": "excluded",
309
+ "locus": "src/scripts/_cli/cmd_route_audit.ts:17",
310
+ "reason": "Rule-trip counters for `route:audit`. Measurement."
311
+ },
312
+ {
313
+ "id": "run-continuation.jsonl",
314
+ "axis": "persistent_continuity_artefacts",
315
+ "disposition": "excluded",
316
+ "locus": "src/scripts/hooks/run_continuation_hook.ts:41",
317
+ "reason": "An append-only event ledger for the stop-slot continuation gate. It records what the gate decided, and nothing reads it to restore a session."
318
+ },
319
+ {
320
+ "id": "session-eol",
321
+ "axis": "persistent_continuity_artefacts",
322
+ "disposition": "counted",
323
+ "locus": "src/scripts/_cli/handoff_sessions.ts:102",
324
+ "reason": "Per-session end-of-life counters plus the advisory stamps. Persisted for VERIFICATION across Stops (the \"advised, but no envelope exists\" counter-check) and read by `handoff_sessions.ts` to populate the resume picker, so it is in scope under the behavioural rule even though it restores nothing itself."
325
+ },
326
+ {
327
+ "id": "skill-tiers.json",
328
+ "axis": "persistent_continuity_artefacts",
329
+ "disposition": "excluded",
330
+ "locus": "src/scripts/_lib/mcp_bridge.ts:319",
331
+ "reason": "Computed skill tiers. A derived cache over `src/skills/`."
332
+ },
333
+ {
334
+ "id": "source-first-gate.json",
335
+ "axis": "persistent_continuity_artefacts",
336
+ "disposition": "excluded",
337
+ "locus": "src/scripts/hooks/source_first_gate_hook.ts:95",
338
+ "reason": "Source-first gate latch state."
339
+ },
340
+ {
341
+ "id": "source-first-gate.jsonl",
342
+ "axis": "persistent_continuity_artefacts",
343
+ "disposition": "excluded",
344
+ "locus": "src/scripts/hooks/source_first_gate_hook.ts:93",
345
+ "reason": "Source-first gate event ledger."
346
+ },
347
+ {
348
+ "id": "subagent-ledger",
349
+ "axis": "persistent_continuity_artefacts",
350
+ "disposition": "excluded",
351
+ "locus": "src/scripts/_lib/host_capability.ts:219",
352
+ "reason": "Subagent return envelopes. Worker-generation lifecycle, explicitly a different subject from main-session continuity \u2014 the parent roadmap named the two-envelope vocabulary collision and kept them distinct."
353
+ },
354
+ {
355
+ "id": "suggestion-latch.json",
356
+ "axis": "persistent_continuity_artefacts",
357
+ "disposition": "excluded",
358
+ "locus": "src/scripts/hooks/suggestion_capture_hook.ts:58",
359
+ "reason": "Once-per-session suggestion latch."
360
+ },
361
+ {
362
+ "id": "supervise-relaunches.json",
363
+ "axis": "persistent_continuity_artefacts",
364
+ "disposition": "excluded",
365
+ "locus": "src/scripts/interruption_report.ts:264",
366
+ "reason": "Relaunch counters for the supervisor. Run-lifecycle bookkeeping under the run-integrity exclusion above."
367
+ },
368
+ {
369
+ "id": "surface-probe.json",
370
+ "axis": "persistent_continuity_artefacts",
371
+ "disposition": "excluded",
372
+ "locus": "src/scripts/surface_probe_hook.ts:15",
373
+ "reason": "Surface-probe throttle state."
374
+ },
375
+ {
376
+ "id": "team-review-gate.json",
377
+ "axis": "persistent_continuity_artefacts",
378
+ "disposition": "excluded",
379
+ "locus": "src/scripts/ai_team/review_gate.ts:102",
380
+ "reason": "Team review-gate latch, consumed within the session that set it."
381
+ },
382
+ {
383
+ "id": "telemetry-disclosure.json",
384
+ "axis": "persistent_continuity_artefacts",
385
+ "disposition": "excluded",
386
+ "locus": "src/scripts/telemetry_disclosure_hook.ts:26",
387
+ "reason": "A once-per-project disclosure latch. It records that a notice was shown, which is consent bookkeeping rather than context."
388
+ },
389
+ {
390
+ "id": "test-results.json",
391
+ "axis": "persistent_continuity_artefacts",
392
+ "disposition": "excluded",
393
+ "locus": "src/scripts/_lib/test_red_state.ts:2",
394
+ "reason": "Last test-run red state, read by the verification gates within a run."
395
+ },
396
+ {
397
+ "id": "tool-result-census.jsonl",
398
+ "axis": "persistent_continuity_artefacts",
399
+ "disposition": "excluded",
400
+ "locus": "src/scripts/hooks/tool_result_bytes_hook.ts:92",
401
+ "reason": "Tool-result byte census. Measurement output."
402
+ },
403
+ {
404
+ "id": "turn-end-gate",
405
+ "axis": "persistent_continuity_artefacts",
406
+ "disposition": "excluded",
407
+ "locus": "src/scripts/_lib/turn_end_refusals.ts:73",
408
+ "reason": "Refusal records for the turn-end quality gate. Consumed by the gate and by `hooks_doctor`, not by a successor session."
409
+ },
410
+ {
411
+ "id": "ui-audit.json",
412
+ "axis": "persistent_continuity_artefacts",
413
+ "disposition": "excluded",
414
+ "locus": "src/scripts/_dispatch.bash:74",
415
+ "reason": "UI audit output. Analysis result."
416
+ },
417
+ {
418
+ "id": "ui-route-nudge.json",
419
+ "axis": "persistent_continuity_artefacts",
420
+ "disposition": "excluded",
421
+ "locus": "src/scripts/hooks/ui_route_nudge_hook.ts:174",
422
+ "reason": "Once-per-session nudge latch."
423
+ },
424
+ {
425
+ "id": "unattended-budget.json",
426
+ "axis": "persistent_continuity_artefacts",
427
+ "disposition": "excluded",
428
+ "locus": "src/scripts/_lib/unattended_guard.ts:45",
429
+ "reason": "Unattended-run budget accounting."
430
+ },
431
+ {
432
+ "id": "unattended-jobs.json",
433
+ "axis": "persistent_continuity_artefacts",
434
+ "disposition": "excluded",
435
+ "locus": "src/scripts/_lib/unattended_guard.ts:46",
436
+ "reason": "Unattended job records."
437
+ },
438
+ {
439
+ "id": "verify-before-complete.json",
440
+ "axis": "persistent_continuity_artefacts",
441
+ "disposition": "excluded",
442
+ "locus": "src/scripts/_lib/envelope_grounding.ts:130",
443
+ "reason": "Verification-gate state, consumed within the run that wrote it."
444
+ },
445
+ {
446
+ "id": "work",
447
+ "axis": "persistent_continuity_artefacts",
448
+ "disposition": "excluded",
449
+ "locus": "src/scripts/explain_run.ts:725",
450
+ "reason": "Work-engine decision traces under `work/<id>/`. Per-run explainability output consumed by `explain_run`, not a restore source."
451
+ },
452
+ {
453
+ "id": "x.json",
454
+ "axis": "persistent_continuity_artefacts",
455
+ "disposition": "excluded",
456
+ "locus": "src/scripts/check_prefix_stable_mutation.ts:268",
457
+ "reason": "Not a surface: a string literal inside `check_prefix_stable_mutation`s own fixture, which the discovery walk sees because it scans source text. Listed rather than filtered out, because a filter is where a real leaf would eventually hide."
458
+ },
459
+ {
460
+ "id": "verb:chat-history:checkpoint",
461
+ "axis": "public_continuity_commands",
462
+ "disposition": "excluded",
463
+ "locus": "src/cli/registry.ts:113",
464
+ "reason": "Also capture, and out of scope on the same ground. What step 4.1b targets is the colliding NAME, not the capability: the verb dispatches to `chat_history.ts hook-append --event phase` and has four live producers in generated git hooks."
465
+ },
466
+ {
467
+ "id": "verb:chat-history:hook",
468
+ "axis": "public_continuity_commands",
469
+ "disposition": "excluded",
470
+ "locus": "src/cli/registry.ts:112",
471
+ "reason": "Chat-history CAPTURE, which the parent roadmap places out of scope by decision: it is the only cross-host transcript source and has no substitute on hosts with no native transcript."
472
+ },
473
+ {
474
+ "id": "verb:handoff",
475
+ "axis": "public_continuity_commands",
476
+ "disposition": "excluded",
477
+ "locus": "src/cli/registry.ts:62",
478
+ "reason": "An OPTIONAL affordance, not a required step. The parent roadmap`s blocker resolution of 2026-09-06 explicitly preserved `handoff` and `/agent-handoff` as the surviving verb and command, and its goal states the target as \"no continuity-specific command is REQUIRED\" rather than none existing. Excluded on that wording \u2014 and the tension is recorded rather than hidden: read as a bare count of existing public commands, the parent`s target of 0 is unreachable while its own resolution keeps this verb alive."
479
+ },
480
+ {
481
+ "id": "verb:session:recycle",
482
+ "axis": "public_continuity_commands",
483
+ "disposition": "counted",
484
+ "locus": "src/cli/registry.ts:73",
485
+ "reason": "REQUIRED on the normal path today: it is the only writer of the continuity record in the tree, so continuity does not happen unless a human runs it. That is what makes it a continuity command rather than an affordance, and it is on the owner-authorised retirement set of 2026-09-06."
486
+ },
487
+ {
488
+ "id": "command:chat-history",
489
+ "axis": "session_resume_pickers",
490
+ "disposition": "excluded",
491
+ "locus": "src/domains/meta/chat-history/command.md:3",
492
+ "reason": "The orchestrator shell that routes to the import picker; it presents no picker of its own. Counting both would double-count one surface. It is retired together with the picker it routes to, so the row disappears with it."
493
+ },
494
+ {
495
+ "id": "picker:agent-handoff",
496
+ "axis": "session_resume_pickers",
497
+ "disposition": "counted",
498
+ "locus": "src/domains/meta/agent-handoff/command.md:41",
499
+ "reason": "A numbered-options block asking a human which prior session to resume. It is a picker by construction, and the parent`s target of 0 pickers is in tension with its preservation of this command \u2014 recorded here so the tension is visible in the count rather than argued away."
500
+ },
501
+ {
502
+ "id": "picker:chat-history-import",
503
+ "axis": "session_resume_pickers",
504
+ "disposition": "counted",
505
+ "locus": "src/domains/meta/chat-history/import/command.md:77",
506
+ "reason": "A numbered-table session picker plus a resume offer \u2014 a second, competing answer to \"which prior session do I continue from\". On the owner-authorised retirement set of 2026-09-06."
507
+ },
508
+ {
509
+ "id": "session-index-latch",
510
+ "axis": "persistent_continuity_artefacts",
511
+ "disposition": "excluded",
512
+ "locus": "src/scripts/_lib/session_index_trust.ts:251",
513
+ "reason": "A duplicate-suppression latch, not a record. It holds one file per session under agents/runtime/state/session-index-latch/ whose entire content is a claim timestamp, and nothing reads it to restore anything — a successor session that finds it learns only that THIS session already received the memory index, which is the opposite of resumable state. It exists because `session_start` can fire more than once for one session (resume, host reconnect, compaction boundary on some hosts) and two injections double a fixed cost while presenting two corpora as one session memory. Excluded on the same reasoning as schema:session-eol-state: the writer own bookkeeping, not a record a successor reads. Deleting the directory costs a session nothing but a possible second injection."
514
+ }
515
+ ]
516
+ }
@@ -7,7 +7,7 @@
7
7
  "review_by": "2027-08-18",
8
8
  "metric": {
9
9
  "basis": "src/scripts/check_estate_count.ts. The live side uses collect() from update_roadmap_progress — the same parser the dashboard is generated from, imported rather than re-implemented. The floor side runs the SAME functions over a scratch copy of the base ref's agents/roadmaps/, materialised by _lib/base_tree.ts (git ls-tree + git cat-file --batch; `git archive` cannot be used here because .gitattributes carries `/agents export-ignore` and would yield an empty, silently-zero tree). SKILL METRICS (added 2026-08-24): _lib/skill_estate.ts walks src/skills/*/SKILL.md under the SAME root, so the floor side measures the base ref's own skill tree with the same function. That needs a SECOND materialised subtree — materialiseSubtree takes one prefix — and the two are independent on purpose: a base ref with no src/skills (an old tag, a shallow clone) drops the skill metrics and leaves the roadmap metrics ratcheting.",
10
- "active_roadmaps": "roadmap candidates at the top level of agents/roadmaps/ that are not drafts, as collect() counts them, PLUS the ones collect() drops for declaring status: carrier. NO LONGER EQUAL TO THE DASHBOARD HEADER'S 'N open roadmaps', and the divergence is deliberate: with carriers excluded, flipping one roadmap's frontmatter to status: carrier measured active_roadmaps 3 -> 2 with the gate printing 'estate within its ratchet', because a count below the floor is a drawdown and free. The floor is measured at the base ref, so that flip lowers the next change's floor permanently, the file cannot be flipped back without paying, and any roadmap can be laundered out of the count by adding one word. A reclassification is not a disposal, so the metric counts the file on both sides and a flip changes nothing. Same reasoning later_roadmaps and open_blockers already carry: estate all the same, and a number that falls on a relocation prints free tightening over a burial. Both directions hold - deleting a carrier is still a shrink that earns no offset (classifyDiff), and adding one is growth that takes the estate_growth_exempt claim path like any other new roadmap. Drafts stay excluded on both sides, unchanged.",
10
+ "active_roadmaps": "roadmap candidates at the top level of agents/roadmaps/ that are not drafts, as collect() counts them. EQUAL to the dashboard header's 'N open roadmaps'. It used to add back the candidates collect() dropped for declaring status: carrier, so that FLIPPING a roadmap to that status was count-neutral: the flip measured 3 -> 2 with the gate printing 'estate within its ratchet', because a count below the floor is a drawdown and free; the floor is measured at the base ref, so the lowered number became the next floor and any roadmap could be laundered out of the count by adding one word. ADR-262 (2026-09-08) deleted status: carrier, so there is no flip to neutralise, no add-back, and no divergence from the header left. Drafts stay excluded on both sides, unchanged, and a draft flip has the same laundering shape — it is tolerated because a draft may be deleted freely, which is the property the deleted status did not have.",
11
11
  "later_roadmaps": "roadmap-shaped *.md files under agents/roadmaps/later/ — the same is_roadmap_candidate name filter the active side uses, so later/README.md is not counted. Counted from the filesystem because parked roadmaps sit outside collect()'s corpus by design; they are estate all the same, and a drawdown that moved everything into later/ and called the number down would be the burial T1's quality anchor exists to prevent.",
12
12
  "open_blockers": "blockers whose Status does not start with `resolved`, summed over the active and later corpora.",
13
13
  "floor": "the same three metrics measured at the base ref (origin/main, else the merge commit's first parent). No base ref resolves -> no floor -> the gate FAILS rather than skipping: a shrink-only gate with no floor passes every possible tree. `--base <ref>` is the explicit escape.",
@@ -65,11 +65,11 @@
65
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. 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 → 107 on 2026-08-23: the `roadmap:context` verb (road-to-roadmap-situational-awareness — 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. 107 → 108 on 2026-08-26: the `roadmap:set-step` verb (road-to-skill-ecosystem-runtime-enforcement Phase 6 — the single sanctioned writer of a checkbox glyph) registers in the same PR that adds the surface, per this record's own contract. It exists because the glyph is written today by whatever edits the file, and a concurrent writer destroys work SILENTLY: the loser of an overwrite receives no error. The verb carries an advisory lock, a line-anchored edit that cannot span entries even in principle, a step-count invariant asserted against the LIVE pre-write file rather than an in-memory snapshot, and a post-write survival check. Re-measured via the pinned method (registry enumeration) on the unchanged tree: 108. 108 → 109 on 2026-08-26: the `stubs:due` verb (road-to-inbox-harvest-2026-08-f-owner-decision-queue step 2.1 — the read-only reader over `agents/roadmaps/stubs/` frontmatter) registers in the same PR that adds the surface, per this record's own contract. It exists because step 1.2 backfills a `review_by:` date into 77 parked files, and an AI council (2026-08-26, 2/2) made the ordering a RULE rather than a preference: dates without a reader are strictly worse than no dates, because a stale date certifies attention nobody paid. The verb is read-only by construction — it authors nothing under `agents/roadmaps/stubs/`, so `check_no_stub_inventory_table` stays green and unmodified, and `roadmap:progress` consumes only its two COUNTS for the dashboard header (two integers, no rows, nothing for the deleted index tables to grow back from). Re-measured via the pinned method (registry enumeration) on the unchanged tree: 109. 109 → 110 on 2026-09-03: the `hooks:effect` verb (road-to-wired-instruments Phase 1.1 — the CLI entry for `hook_effect_doctor`) registers in the same PR that adds the surface, per this record's own contract. It exists because the probe and its five-state vocabulary were built, tested and reachable from nothing: `grep -rn 'hook_effect_doctor|hook_effect_probe' src Taskfile.yml .github` returned only the two modules themselves, and a closed roadmap recorded the wiring as landed at `src/scripts/hooks_doctor.ts:88`, a line that is the closing brace of a filesystem helper in a file with zero references to the probe. Deliberately NOT merged into `hooks:doctor`: that verb reads the MANIFEST (what is declared) and this one reads what happened (what took effect), and the probe's own header names merging them as the thing to avoid — a declaration report and an execution report are different instruments, and merging them makes the cheap one expensive. Read-only apart from a scratch root it removes in a `finally`. Re-measured via the pinned method (registry enumeration) on the unchanged tree: 110."
66
66
  },
67
67
  "mcp_public_tool_count": {
68
- "max": 20,
69
- "last_measured": 20,
70
- "last_measured_at": "2026-08-17",
68
+ "max": 25,
69
+ "last_measured": 25,
70
+ "last_measured_at": "2026-09-09",
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 → 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. 20 → 25 on 2026-09-09 (release 14.23.0 gate). The +5 are `graph_impact`, `graph_tests_for`, `graph_dead`, `graph_query` and `graph_path` — 9452f29b4 (feat(mcp): five graph tools, the pinned install hint, and the skill description; road-to-a-graph-that-is-shipped Phase 4.1), which is on main. They are the agent-facing readers of the code graph: the roadmap Risk-Register rank 1 is \"the install grows and the graph is still unread\", and an agent that has to shell out to reach a verb will not, so the tools ARE the mitigation rather than a convenience. Same shape as every entry above — this RECORDS growth that already shipped through its own reviewed PR; it does not authorize new surface. The registering PR did not move this budget, so the gate did its job again: the breach warned on main and BLOCKED on the release ref, which is the conscious-decision point rather than a silently raised cap. The move is +25%, over the 10% creep rule, and that is the intended reading: five tools in one commit is a surface decision, not creep. Re-measured three times via the pinned method on a freshly built dist/mcp/server.mjs: 25/25/25, the returned name set differing from the 20-tool set by exactly the five graph_* entries. Headroom stays zero by design — the next tool that leaves STUB_TOOLS must move this number in its own PR."
73
73
  }
74
74
  }
75
75
  }