@event4u/agent-config 16.2.0 → 16.3.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 (332) 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 +89 -237
  5. package/README.md +14 -12
  6. package/dist/agent-src/commands/analyze/inbox.md +1 -1
  7. package/dist/agent-src/commands/analyze/roadmap-repos.md +1 -1
  8. package/dist/agent-src/commands/bug/fix.md +17 -2
  9. package/dist/agent-src/commands/feature/plan.md +1 -1
  10. package/dist/agent-src/commands/feature/roadmap.md +1 -1
  11. package/dist/agent-src/commands/fix/ci.md +1 -1
  12. package/dist/agent-src/commands/implement-ticket.md +1 -1
  13. package/dist/agent-src/commands/jira-ticket.md +1 -1
  14. package/dist/agent-src/commands/roadmap/create.md +1 -1
  15. package/dist/agent-src/commands/roadmap/materialize.md +1 -1
  16. package/dist/agent-src/commands/roadmap/process-full.md +4 -4
  17. package/dist/agent-src/commands/roadmap/resolve-blockers.md +361 -0
  18. package/dist/agent-src/commands/roadmap/triage-parked.md +325 -0
  19. package/dist/agent-src/commands/roadmap.md +18 -4
  20. package/dist/agent-src/commands/tests/create.md +17 -3
  21. package/dist/agent-src/commands/tests/execute.md +22 -5
  22. package/dist/agent-src/contexts/authority/decision-revisit-gate-enforcement.md +43 -0
  23. package/dist/agent-src/contexts/communication/rules-auto/design-fidelity-enforcement.md +24 -0
  24. package/dist/agent-src/contexts/execution/auto-dispatch-classification.md +6 -6
  25. package/dist/agent-src/contexts/execution/roadmap-process-loop.md +32 -2
  26. package/dist/agent-src/contexts/execution/session-canary-enforcement-history.md +67 -0
  27. package/dist/agent-src/contexts/execution/toolchain-resolver.md +101 -7
  28. package/dist/agent-src/rules/active-remediation.md +1 -1
  29. package/dist/agent-src/rules/autonomous-execution.md +1 -0
  30. package/dist/agent-src/rules/broken-access-control.md +1 -0
  31. package/dist/agent-src/rules/command-suggestion-policy.md +1 -0
  32. package/dist/agent-src/rules/context-hygiene.md +1 -1
  33. package/dist/agent-src/rules/decision-revisit-gate.md +16 -33
  34. package/dist/agent-src/rules/design-fidelity.md +13 -16
  35. package/dist/agent-src/rules/doc-screenshot-hygiene.md +1 -0
  36. package/dist/agent-src/rules/domain-safety-disclaimer.md +1 -0
  37. package/dist/agent-src/rules/domain-safety-pii.md +1 -0
  38. package/dist/agent-src/rules/domain-safety-retention.md +1 -0
  39. package/dist/agent-src/rules/engineering-safety-floor.md +1 -0
  40. package/dist/agent-src/rules/evaluator-independence.md +3 -2
  41. package/dist/agent-src/rules/fast-path-marker-visibility.md +1 -0
  42. package/dist/agent-src/rules/finance-safety-floor.md +1 -0
  43. package/dist/agent-src/rules/git-history-discipline.md +1 -0
  44. package/dist/agent-src/rules/image-likeness-and-rights.md +1 -0
  45. package/dist/agent-src/rules/legal-safety-floor.md +3 -2
  46. package/dist/agent-src/rules/lethal-trifecta-guard.md +1 -0
  47. package/dist/agent-src/rules/low-impact-corpus-privacy-floor.md +1 -0
  48. package/dist/agent-src/rules/media-governance-routing.md +14 -17
  49. package/dist/agent-src/rules/persona-governance.md +2 -2
  50. package/dist/agent-src/rules/provider-lifecycle-discipline.md +1 -1
  51. package/dist/agent-src/rules/question-not-instruction.md +1 -0
  52. package/dist/agent-src/rules/roadmap-progress-sync.md +1 -1
  53. package/dist/agent-src/rules/runtime-safety.md +1 -0
  54. package/dist/agent-src/rules/secret-vcs-guard.md +1 -0
  55. package/dist/agent-src/rules/security-sensitive-stop.md +3 -2
  56. package/dist/agent-src/rules/session-canary.md +8 -62
  57. package/dist/agent-src/rules/settings-ask-protocol.md +1 -0
  58. package/dist/agent-src/rules/source-confidentiality.md +1 -0
  59. package/dist/agent-src/rules/strategy-safety-floor.md +1 -0
  60. package/dist/agent-src/rules/tool-safety.md +1 -0
  61. package/dist/agent-src/rules/untrusted-input-defense.md +1 -0
  62. package/dist/agent-src/rules/user-interrupt-priority.md +1 -0
  63. package/dist/agent-src/scripts/archive_completed_roadmaps.ts +115 -20
  64. package/dist/agent-src/scripts/deferral_carry.ts +339 -0
  65. package/dist/agent-src/scripts/update_roadmap_progress.ts +4 -1
  66. package/dist/agent-src/skills/api-design/data/manifest.json +2 -2
  67. package/dist/agent-src/skills/api-testing/SKILL.md +17 -0
  68. package/dist/agent-src/skills/code-intelligence/SKILL.md +14 -2
  69. package/dist/agent-src/skills/design-system-capture/references/import-procedure.md +1 -1
  70. package/dist/agent-src/skills/existing-ui-audit/SKILL.md +2 -2
  71. package/dist/agent-src/skills/fe-design/SKILL.md +1 -1
  72. package/dist/agent-src/skills/iconography/SKILL.md +1 -1
  73. package/dist/agent-src/skills/js-library-packaging/SKILL.md +2 -2
  74. package/dist/agent-src/skills/monorepo-workspace/SKILL.md +1 -1
  75. package/dist/agent-src/skills/quality-tools/SKILL.md +11 -1
  76. package/dist/agent-src/skills/quality-tools/references/go-tools.md +76 -0
  77. package/dist/agent-src/skills/quality-tools/references/python-tools.md +104 -0
  78. package/dist/agent-src/skills/review-routing/SKILL.md +2 -2
  79. package/dist/agent-src/skills/skill-improvement-pipeline/SKILL.md +1 -1
  80. package/dist/agent-src/skills/storybook-workshop/SKILL.md +3 -3
  81. package/dist/agent-src/skills/tailwind-engineer/SKILL.md +1 -1
  82. package/dist/agent-src/skills/test-case-discovery/SKILL.md +7 -0
  83. package/dist/agent-src/skills/test-driven-development/SKILL.md +17 -0
  84. package/dist/agent-src/skills/test-performance/SKILL.md +19 -1
  85. package/dist/agent-src/skills/ui-component-architect/SKILL.md +2 -2
  86. package/dist/agent-src/templates/agents/agent-project-settings.example.yml +1 -1
  87. package/dist/agent-src/templates/scripts/work_engine/directives/ui/apply.ts +48 -6
  88. package/dist/agent-src/templates/scripts/work_engine/stack/runner.ts +774 -109
  89. package/dist/cli/registry.js +1 -1
  90. package/dist/cli-delegate/archive_completed_roadmaps.js +92 -12
  91. package/dist/cli-delegate/check_update_banner.js +12 -1
  92. package/dist/cli-delegate/chunk-523HCFYO.js +90 -0
  93. package/dist/cli-delegate/{chunk-M2DPGFZ4.js → chunk-6V6TA25H.js} +22 -152
  94. package/dist/cli-delegate/chunk-7IQE3D5S.js +191 -0
  95. package/dist/cli-delegate/{chunk-6KFEC3G7.js → chunk-CQWX336L.js} +1 -1
  96. package/dist/cli-delegate/chunk-DEIV7XP7.js +108 -0
  97. package/dist/cli-delegate/chunk-EEHDXSYD.js +2040 -0
  98. package/dist/cli-delegate/{chunk-P6ZHP5W2.js → chunk-GKE7ZVFA.js} +4 -4
  99. package/dist/cli-delegate/chunk-JQOM7TTM.js +1201 -0
  100. package/dist/cli-delegate/{chunk-IGD6ERX6.js → chunk-JQVYKIZA.js} +10 -0
  101. package/dist/cli-delegate/{chunk-FC75PGJE.js → chunk-JY2I2DXV.js} +12 -1
  102. package/dist/cli-delegate/chunk-KB5FZ655.js +208 -0
  103. package/dist/cli-delegate/{chunk-7RQP4UDH.js → chunk-KR6EM23A.js} +235 -1455
  104. package/dist/cli-delegate/{chunk-LTYVIY76.js → chunk-LIYTLH6O.js} +1 -1
  105. package/dist/cli-delegate/{chunk-YJ72UIAK.js → chunk-NQ7WT43P.js} +1186 -244
  106. package/dist/cli-delegate/chunk-NXEILF2K.js +2160 -0
  107. package/dist/cli-delegate/{chunk-5R7HOLAF.js → chunk-NYX3L2PZ.js} +1 -1
  108. package/dist/cli-delegate/{chunk-4E2W63DA.js → chunk-OKJUIAPS.js} +62 -1
  109. package/dist/cli-delegate/{chunk-QAJS5YWY.js → chunk-PHD7OOLE.js} +2 -1
  110. package/dist/cli-delegate/{chunk-RGNIWTEA.js → chunk-QLDHIPWR.js} +1 -1
  111. package/dist/cli-delegate/{chunk-7XGBX6ZH.js → chunk-RQNNW7IF.js} +1314 -560
  112. package/dist/cli-delegate/{chunk-4XFP2Y3E.js → chunk-S4UMZNES.js} +1 -1
  113. package/dist/cli-delegate/{chunk-6KM6ORRY.js → chunk-S4YWNRKO.js} +24 -8
  114. package/dist/cli-delegate/{chunk-FP36SWJD.js → chunk-TRI6DQZ6.js} +2781 -340
  115. package/dist/cli-delegate/chunk-ULQRUR23.js +208 -0
  116. package/dist/cli-delegate/{chunk-NUHLI2RX.js → chunk-YCU3TIXH.js} +2 -0
  117. package/dist/cli-delegate/chunk-ZBZV2G5R.js +210 -0
  118. package/dist/cli-delegate/{chunk-WGXTVKCQ.js → chunk-ZUZKZYCN.js} +5 -3
  119. package/dist/cli-delegate/cmd_analyze_session.js +1 -1
  120. package/dist/cli-delegate/cmd_brand_status.js +1 -1
  121. package/dist/cli-delegate/cmd_conformance.js +1167 -234
  122. package/dist/cli-delegate/cmd_doctor.js +13 -6
  123. package/dist/cli-delegate/cmd_doctor_neighbours.js +23 -0
  124. package/dist/cli-delegate/cmd_explain.js +5 -5
  125. package/dist/cli-delegate/cmd_export.js +11 -8
  126. package/dist/cli-delegate/cmd_fleet.js +3 -3
  127. package/dist/cli-delegate/cmd_handoff.js +10 -7
  128. package/dist/cli-delegate/cmd_mcp_available.js +1 -1
  129. package/dist/cli-delegate/cmd_memory_get.js +3 -1
  130. package/dist/cli-delegate/cmd_migrate.js +2 -2
  131. package/dist/cli-delegate/cmd_packs_active.js +3 -3
  132. package/dist/cli-delegate/cmd_preflight.js +6 -6
  133. package/dist/cli-delegate/cmd_prune.js +11 -8
  134. package/dist/cli-delegate/cmd_refresh.js +2 -1
  135. package/dist/cli-delegate/cmd_route_audit.js +8 -6
  136. package/dist/cli-delegate/cmd_route_explain.js +4 -4
  137. package/dist/cli-delegate/cmd_session_recycle.js +4 -3
  138. package/dist/cli-delegate/cmd_settings_get.js +1 -1
  139. package/dist/cli-delegate/cmd_settings_migrate.js +11 -8
  140. package/dist/cli-delegate/cmd_settings_set.js +4 -4
  141. package/dist/cli-delegate/cmd_sync.js +11 -8
  142. package/dist/cli-delegate/cmd_uninstall.js +11 -8
  143. package/dist/cli-delegate/cmd_update.js +1 -1
  144. package/dist/cli-delegate/cmd_upgrade.js +3 -2
  145. package/dist/cli-delegate/cmd_validate.js +11 -8
  146. package/dist/cli-delegate/cmd_versions.js +1 -1
  147. package/dist/cli-delegate/deferral_carry.js +16 -0
  148. package/dist/cli-delegate/gate_execute.js +2 -2
  149. package/dist/cli-delegate/roadmap_gates.js +5 -5
  150. package/dist/cli-delegate/update_roadmap_progress.js +1 -1
  151. package/dist/discovery/deprecation-report.md +1 -1
  152. package/dist/discovery/discovery-manifest.json +127 -75
  153. package/dist/discovery/discovery-manifest.json.sha256 +1 -1
  154. package/dist/discovery/discovery-manifest.summary.md +3 -3
  155. package/dist/discovery/dormancy-report.md +1 -1
  156. package/dist/discovery/orphan-report.md +1 -1
  157. package/dist/discovery/packs.json +7 -5
  158. package/dist/discovery/trust-report.md +2 -2
  159. package/dist/discovery/workspaces.json +6 -4
  160. package/dist/hooks/dispatch.js +5357 -6656
  161. package/dist/hooks/dispatch.sha256 +1 -1
  162. package/dist/install/claudePathsPlan.js +47 -6
  163. package/dist/install/claudeRuleRewrite.js +7 -0
  164. package/dist/install/emit_host_rules_cli.js +39 -36
  165. package/dist/install/globalRuleScope.js +87 -0
  166. package/dist/install/host_rule_ownership.js +160 -0
  167. package/dist/install/install.mjs +2080 -1024
  168. package/dist/install/installThinLayer.js +261 -0
  169. package/dist/install/installedRuleLinks.js +176 -0
  170. package/dist/install/wizard-plan.js +24 -0
  171. package/dist/mcp/registry-manifest.json +3 -3
  172. package/dist/mcp/server.json +2 -2
  173. package/dist/mcp/server.mjs +31965 -27154
  174. package/dist/scripts/_lib/agent_settings.js +11 -0
  175. package/dist/scripts/_lib/claude_settings_hooks.js +10 -8
  176. package/dist/scripts/_lib/installed_layer.js +378 -0
  177. package/dist/scripts/_lib/lean_projection_mode.js +218 -15
  178. package/dist/scripts/_lib/rule_consequence_class.js +45 -0
  179. package/dist/scripts/_lib/rule_injection.js +67 -10
  180. package/dist/scripts/_lib/rule_law_section.js +122 -0
  181. package/dist/scripts/_lib/thin_rules.js +458 -0
  182. package/dist/scripts/_lib/windsurf_render.js +60 -0
  183. package/dist/scripts/condense.js +14 -26
  184. package/dist/scripts/project_thin_rules.js +14 -294
  185. package/dist/server/schemas/settings.js +6 -0
  186. package/dist/shared/skillRanking.js +74 -13
  187. package/docs/contracts/settings-classes.md +7 -5
  188. package/package.json +1 -1
  189. package/src/agent-src/scripts/archive_completed_roadmaps.ts +115 -20
  190. package/src/agent-src/scripts/deferral_carry.ts +339 -0
  191. package/src/agent-src/scripts/update_roadmap_progress.ts +4 -1
  192. package/src/agent-src/templates/scripts/work_engine/directives/ui/apply.ts +48 -6
  193. package/src/agent-src/templates/scripts/work_engine/stack/runner.ts +774 -109
  194. package/src/config/agent-settings.template.yml +62 -22
  195. package/src/config/continuity-surface.json +7 -0
  196. package/src/config/evaluator-budgets.json +4 -4
  197. package/src/config/gate-coverage.yml +96 -3
  198. package/src/config/gate-violation-baselines.json +17 -9
  199. package/src/config/hook-bundle-budget.json +25 -0
  200. package/src/config/hook-token-budget.json +6 -1
  201. package/src/config/host-instruction-limits.json +33 -0
  202. package/src/config/routing-coverage-seed.json +24 -3
  203. package/src/config/rule-activation-census.json +7 -3
  204. package/src/config/rule-consequence-class.json +161 -0
  205. package/src/config/rule-law-ceilings.json +99 -0
  206. package/src/install/claudePathsPlan.ts +46 -4
  207. package/src/install/claudeRuleRewrite.ts +10 -1
  208. package/src/install/emit_host_rules_cli.ts +43 -34
  209. package/src/install/globalRuleScope.ts +109 -0
  210. package/src/install/host_rule_ownership.ts +170 -0
  211. package/src/install/installThinLayer.ts +312 -0
  212. package/src/install/installedRuleLinks.ts +220 -0
  213. package/src/install/wizard-plan.ts +24 -0
  214. package/src/scripts/_cli/cmd_doctor.ts +23 -71
  215. package/src/scripts/_cli/cmd_doctor_neighbours.ts +293 -0
  216. package/src/scripts/_dispatch.bash +16 -2
  217. package/src/scripts/_lib/agent_settings.ts +11 -0
  218. package/src/scripts/_lib/claude_settings_hooks.ts +10 -8
  219. package/src/scripts/_lib/estate_offsets.ts +241 -0
  220. package/src/scripts/_lib/exemption_shape.ts +143 -0
  221. package/src/scripts/_lib/fnv.ts +23 -0
  222. package/src/scripts/_lib/foreign_scan.ts +106 -0
  223. package/src/scripts/_lib/gitignore_block.ts +314 -0
  224. package/src/scripts/_lib/global_deploy_inventory.ts +32 -0
  225. package/src/scripts/_lib/graph_feeder_record.ts +214 -0
  226. package/src/scripts/_lib/hook_settings.ts +73 -0
  227. package/src/scripts/_lib/host_capability.ts +40 -19
  228. package/src/scripts/_lib/host_hook_merge.ts +165 -0
  229. package/src/scripts/_lib/installed_layer.ts +538 -0
  230. package/src/scripts/_lib/json_merge.ts +82 -0
  231. package/src/scripts/_lib/json_pointers.ts +93 -11
  232. package/src/scripts/_lib/lean_projection_mode.ts +275 -15
  233. package/src/scripts/_lib/machine_wake.ts +16 -3
  234. package/src/scripts/_lib/neighbour_census.ts +760 -0
  235. package/src/scripts/_lib/neighbour_scan.ts +122 -0
  236. package/src/scripts/_lib/neighbour_tool_use.ts +189 -0
  237. package/src/scripts/_lib/prompt_shape.ts +46 -0
  238. package/src/scripts/_lib/release_migration_gate.ts +19 -3
  239. package/src/scripts/_lib/reserved_name_sweep.ts +73 -0
  240. package/src/scripts/_lib/review_coverage.ts +134 -0
  241. package/src/scripts/_lib/rule_consequence_class.ts +71 -0
  242. package/src/scripts/_lib/rule_injection.ts +130 -10
  243. package/src/scripts/_lib/rule_law_section.ts +147 -0
  244. package/src/scripts/_lib/rule_layer_overlap.ts +58 -0
  245. package/src/scripts/_lib/skill_origin.ts +254 -0
  246. package/src/scripts/_lib/structured_ask.ts +64 -21
  247. package/src/scripts/_lib/thin_rules.ts +540 -0
  248. package/src/scripts/_lib/touched_file_quality.ts +434 -0
  249. package/src/scripts/_lib/turn_end_refusals.ts +77 -2
  250. package/src/scripts/_lib/windsurf_render.ts +63 -0
  251. package/src/scripts/ai_council/cli_call_budget.ts +13 -5
  252. package/src/scripts/ai_council/clients.ts +26 -57
  253. package/src/scripts/ai_council/config.ts +1 -1
  254. package/src/scripts/ai_council/vendor_defaults.ts +45 -0
  255. package/src/scripts/audit_skill_overlap.ts +261 -0
  256. package/src/scripts/before_complete_hook.ts +243 -12
  257. package/src/scripts/bench_touched_file_quality.ts +238 -0
  258. package/src/scripts/check_enforcement_matrix.ts +377 -20
  259. package/src/scripts/check_estate_count.ts +130 -153
  260. package/src/scripts/check_finding_dispositions.ts +116 -4
  261. package/src/scripts/check_hook_bundle_composition.ts +370 -0
  262. package/src/scripts/check_kernel_edit_ratified.ts +49 -11
  263. package/src/scripts/check_memory.ts +7 -1
  264. package/src/scripts/check_release_highlights.ts +10 -0
  265. package/src/scripts/check_release_pr_shape.ts +38 -15
  266. package/src/scripts/check_standing_rule_delivery.ts +33 -13
  267. package/src/scripts/check_verify_expectation_delta.ts +521 -0
  268. package/src/scripts/code_graph/detect.ts +127 -7
  269. package/src/scripts/code_graph/foreign.ts +194 -0
  270. package/src/scripts/code_graph/query.ts +217 -4
  271. package/src/scripts/code_graph/types.ts +26 -2
  272. package/src/scripts/code_graph/validate.ts +3 -1
  273. package/src/scripts/code_graph/verbs.ts +103 -0
  274. package/src/scripts/compile_hook_manifest.ts +33 -1
  275. package/src/scripts/condense.ts +14 -27
  276. package/src/scripts/estate_exemption_shape.ts +202 -0
  277. package/src/scripts/generate_host_cost_table.ts +1 -1
  278. package/src/scripts/hook_manifest.json +1 -1
  279. package/src/scripts/hook_manifest.yaml +150 -9
  280. package/src/scripts/hooks/block_config_weakening.ts +67 -2
  281. package/src/scripts/hooks/block_plumbing_writes.ts +29 -1
  282. package/src/scripts/hooks/code_graph_context_hook.ts +252 -23
  283. package/src/scripts/hooks/concern_failure_policy.ts +280 -0
  284. package/src/scripts/hooks/dispatch_hook.ts +52 -52
  285. package/src/scripts/hooks/exit_codes.ts +2 -1
  286. package/src/scripts/hooks/host_lowering.json +1 -1
  287. package/src/scripts/hooks/host_lowering.ts +19 -1
  288. package/src/scripts/hooks/one_question_per_ask_hook.ts +41 -25
  289. package/src/scripts/hooks/payload_stub.ts +10 -1
  290. package/src/scripts/hooks/rule_inject_hook.ts +757 -63
  291. package/src/scripts/hooks/table_fingerprint.ts +21 -0
  292. package/src/scripts/hooks/telemetry_usage_hook.ts +64 -8
  293. package/src/scripts/hooks/turn_end_gate_hook.ts +84 -0
  294. package/src/scripts/hooks_status.ts +112 -0
  295. package/src/scripts/injection_scan_hook.ts +7 -0
  296. package/src/scripts/install.ts +72 -185
  297. package/src/scripts/installed_layer_report.ts +103 -0
  298. package/src/scripts/language_mirror_hook.ts +15 -6
  299. package/src/scripts/learning_sidecar.ts +119 -8
  300. package/src/scripts/lint_hook_manifest.ts +53 -0
  301. package/src/scripts/lint_major_migration_sections.ts +156 -26
  302. package/src/scripts/lint_pack_boundaries.ts +63 -5
  303. package/src/scripts/lint_rule_law_section.ts +517 -0
  304. package/src/scripts/lint_workflow_security.ts +161 -5
  305. package/src/scripts/mcp_server/consumer_tool_catalog.json +53 -0
  306. package/src/scripts/mcp_server/graph_tools.ts +72 -3
  307. package/src/scripts/measure_routing_signal.ts +54 -16
  308. package/src/scripts/measure_skill_ranker_baseline.ts +216 -8
  309. package/src/scripts/memory_learn_hook.ts +91 -6
  310. package/src/scripts/model_rule_injection.ts +52 -5
  311. package/src/scripts/project_thin_rules.ts +34 -327
  312. package/src/scripts/report_evidence_temperature.ts +657 -0
  313. package/src/scripts/report_installed_rule_links.ts +157 -0
  314. package/src/scripts/report_label_agreement.ts +233 -0
  315. package/src/scripts/report_obligation_mechanism.ts +230 -0
  316. package/src/scripts/report_single_token_triggers.ts +277 -0
  317. package/src/scripts/report_skill_ranker_confusion.ts +442 -0
  318. package/src/scripts/report_standing_payload_by_host.ts +188 -15
  319. package/src/scripts/report_verification_record_coverage.ts +306 -0
  320. package/src/scripts/rule_activation_census.ts +5 -2
  321. package/src/scripts/rule_trigger_eval.ts +9 -9
  322. package/src/scripts/schemas/review-findings.schema.json +3 -2
  323. package/src/scripts/schemas/rule.schema.json +5 -0
  324. package/src/scripts/self_review_gate.ts +62 -7
  325. package/src/scripts/skill_tools/score_skill_relevance.ts +290 -25
  326. package/src/scripts/sweep_skill_ranker_signals.ts +129 -0
  327. package/src/scripts/sync_gitignore.ts +29 -235
  328. package/src/scripts/trigger_eval_grandfather.json +0 -5
  329. package/src/server/schemas/settings.ts +10 -0
  330. package/src/shared/skillRanking.ts +117 -11
  331. package/dist/cli-delegate/chunk-JNMVLWLR.js +0 -4457
  332. package/dist/cli-delegate/chunk-YDPILCOL.js +0 -152
@@ -5,14 +5,13 @@ pack: engineering-base
5
5
  visibility: internal
6
6
  sub: fix
7
7
  cluster: bug
8
- skills: [bug-analyzer, pest-testing]
8
+ skills: [bug-analyzer, test-case-discovery]
9
9
  description: Plan and implement a bug fix — based on investigation, with quality checks and test verification
10
10
  argument-hint: "[bug-description]"
11
11
  council_depth: deep
12
12
  suggestion:
13
13
  eligible: false
14
14
  rationale: "Cluster sub-command — reached via its cluster head's routing or its explicit /cluster:sub name; not independently suggested (surface-consolidation)."
15
- framework: laravel
16
15
  workspaces:
17
16
  - agent-config-maintainer
18
17
  packs:
@@ -104,6 +103,22 @@ Show results and fix any issues.
104
103
 
105
104
  ### 5. Tests
106
105
 
106
+ Resolve the test framework via the
107
+ [`toolchain-resolver`](../../contexts/execution/toolchain-resolver.md) before
108
+ writing anything — write the regression test in the framework the project
109
+ actually uses, never a hard-coded one.
110
+
111
+ **The resolver is the only stack authority, and `skills:` deliberately names
112
+ no single-stack skill.** This command's 195 lines of body mention no framework
113
+ at all, so the `pest-testing` binding and the `framework: laravel` marker it
114
+ used to carry made a Python or Go repository load PHP testing guidance for a
115
+ command that never asks for it. The load is **resolver-conditional**: once the
116
+ runner is named, load the skill for THAT runner if one exists —
117
+ `pest-testing` for pest, `laravel` for `php artisan test`,
118
+ `playwright-testing` for playwright. Unconditional became conditional; it did
119
+ not become nothing. Same contract as `/tests create` and `/tests execute`,
120
+ which were de-bound first.
121
+
107
122
  Check for existing tests that cover the affected code:
108
123
 
109
124
  ```
@@ -402,7 +402,7 @@ Declared by `produces_roadmap: true` in the frontmatter and enforced by
402
402
  `lint_roadmap_producers`: a producer that does not end here reds CI.
403
403
 
404
404
  Read `planning.closure_pass` (missing = `true`). When active, run
405
- [`/challenge-me closure`](../../../meta/challenge-me/closure/command.md) on the
405
+ `/challenge-me closure` on the
406
406
  roadmap this command just produced, before handing back:
407
407
 
408
408
  ```bash
@@ -252,7 +252,7 @@ Declared by `produces_roadmap: true` in the frontmatter and enforced by
252
252
  `lint_roadmap_producers`: a producer that does not end here reds CI.
253
253
 
254
254
  Read `planning.closure_pass` (missing = `true`). When active, run
255
- [`/challenge-me closure`](../../../meta/challenge-me/closure/command.md) on the
255
+ `/challenge-me closure` on the
256
256
  roadmap this command just produced, before handing back:
257
257
 
258
258
  ```bash
@@ -102,7 +102,7 @@ branch** — that is what makes the deliverable remote. Then:
102
102
  push against a moved base is rejected — both cost a round trip that this one
103
103
  call prevents.
104
104
  3. Push. The instruction named it; do not raise a separate ask
105
- ([`/create-pr` § 4d item 5](../../../git/pr/create/command.md)).
105
+ (`/create-pr` § 4d item 5).
106
106
  4. Re-verify remotely: `./scripts-run src/scripts/check_pr_ci_current`, then
107
107
  settle the check set on the new head. Report the *remote* verdict, never the
108
108
  local one.
@@ -213,7 +213,7 @@ Declared by `produces_roadmap: true` in the frontmatter and enforced by
213
213
  `lint_roadmap_producers`: a producer that does not end here reds CI.
214
214
 
215
215
  Read `planning.closure_pass` (missing = `true`). When active, run
216
- [`/challenge-me closure`](../../meta/challenge-me/closure/command.md) on the
216
+ `/challenge-me closure` on the
217
217
  roadmap this command just produced, before handing back:
218
218
 
219
219
  ```bash
@@ -95,7 +95,7 @@ Declared by `produces_roadmap: true` in the frontmatter and enforced by
95
95
  `lint_roadmap_producers`: a producer that does not end here reds CI.
96
96
 
97
97
  Read `planning.closure_pass` (missing = `true`). When active, run
98
- [`/challenge-me closure`](../../meta/challenge-me/closure/command.md) on the
98
+ `/challenge-me closure` on the
99
99
  roadmap this command just produced, before handing back:
100
100
 
101
101
  ```bash
@@ -417,7 +417,7 @@ Declared by `produces_roadmap: true` in the frontmatter and enforced by
417
417
  `lint_roadmap_producers`: a producer that does not end here reds CI.
418
418
 
419
419
  Read `planning.closure_pass` (missing = `true`). When active, run
420
- [`/challenge-me closure`](../../../meta/challenge-me/closure/command.md) on the
420
+ `/challenge-me closure` on the
421
421
  roadmap this command just produced, before handing back:
422
422
 
423
423
  ```bash
@@ -83,7 +83,7 @@ Declared by `produces_roadmap: true` in the frontmatter and enforced by
83
83
  `lint_roadmap_producers`: a producer that does not end here reds CI.
84
84
 
85
85
  Read `planning.closure_pass` (missing = `true`). When active, run
86
- [`/challenge-me closure`](../../../meta/challenge-me/closure/command.md) on the
86
+ `/challenge-me closure` on the
87
87
  roadmap this command just produced, before handing back:
88
88
 
89
89
  ```bash
@@ -145,7 +145,7 @@ the loop continues to the next one.
145
145
  ### Delivery — every run, flag or not
146
146
 
147
147
  On outcome `complete`, open the PR as today, then run
148
- [`/pr:merge <N> --no-merge`](../../../git/pr/merge/command.md) on it: sync the
148
+ `/pr:merge <N> --no-merge` on it: sync the
149
149
  base in, resolve conflicts by that command's four enumerated classes, drive the
150
150
  required checks green on the pushed head. **This is unconditional** — a bare
151
151
  `/roadmap:process-full` delivers a mergeable PR, not merely an open one, and
@@ -269,7 +269,7 @@ stops the run):
269
269
  5. **Test / quality red** that cannot be cleared within the N=3 budget.
270
270
  6. **RETIRED 2026-09-13** by `road-to-adversarial-verification-and-long-runs`
271
271
  5.2. This read *a merge conflict outside the four enumerated classes of
272
- [`/pr:merge` § 3](../../../git/pr/merge/command.md)*. That section now ROUTES
272
+ `/pr:merge` § 3*. That section now ROUTES
273
273
  an unenumerated conflict — understand both intents, inspect recency and
274
274
  authorship, preserve both where compatible, independent review, council or
275
275
  team, and the owner **only** for a product-semantic incompatibility — so
@@ -298,7 +298,7 @@ roadmap:
298
298
 
299
299
  **And the conditions that end the loop without ending a roadmap:**
300
300
  estate-queue exhaustion (always), a
301
- [`/pr:merge` § 8](../../../git/pr/merge/command.md) kill switch (always — that
301
+ `/pr:merge` § 8 kill switch (always — that
302
302
  section arms its checks during **preparation**, not only before a merge, which
303
303
  is what keeps them reachable while the merge step is gated), and
304
304
  authorization-window expiry — which is **unreachable in this command**,
@@ -322,7 +322,7 @@ FORBIDDEN NON-HALT REASONS — NEVER STOP THE RUN FOR ANY OF THESE:
322
322
  · "a PR must be opened" / "a GitHub setting must change"
323
323
  · "CI must be re-run" / "the merge base needs updating" / "there are
324
324
  conflicts" — resolving these IS the work, and since 2026-09-13 that holds
325
- for an UNENUMERATED conflict too: [`/pr:merge` § 3](../../../git/pr/merge/command.md)
325
+ for an UNENUMERATED conflict too: `/pr:merge` § 3
326
326
  routes it (understand both intents → recency and authorship → preserve both
327
327
  where compatible → independent review → council or team → the owner only for
328
328
  a product-semantic incompatibility) instead of stopping. The prohibition that
@@ -0,0 +1,361 @@
1
+ ---
2
+ model_tier: high
3
+ name: roadmap-resolve-blockers
4
+ pack: product-basic
5
+ visibility: internal
6
+ cluster: roadmap
7
+ sub: resolve-blockers
8
+ skills: [roadmap-management, ai-council, decision-review, roadmap-writing]
9
+ description: Check every open roadmap blocker, close what the tree already settled, decide the rest in the AI council, and ask the owner only for real residue — one question at a time.
10
+ argument-hint: "[<roadmap> | <blocker-id> | all] [--no-council] [--check-only]"
11
+ suggestion:
12
+ eligible: false
13
+ rationale: "Cluster sub-command — reached via its cluster head's routing or its explicit /roadmap:resolve-blockers name; not independently suggested (surface-consolidation)."
14
+ workspaces:
15
+ - agent-config-maintainer
16
+ packs:
17
+ - meta
18
+ ---
19
+
20
+ # /roadmap:resolve-blockers
21
+
22
+ Blocker sub of the [`/roadmap`](../roadmap.md) cluster. A `### blocker:` entry
23
+ records the world at the moment it was written, and nothing re-reads it: its
24
+ `Status:` word goes stale while the condition it waits on comes true, and a
25
+ decision an agent or the council could take sits in a file waiting for the one
26
+ reader whose attention does not scale. This command walks every open blocker,
27
+ closes the ones the tree already settled, decides the ones the council owns, and
28
+ reaches the owner only for what genuinely needs them — one question per turn,
29
+ with a recommendation, so answering costs one keystroke.
30
+
31
+ ## The Iron Law
32
+
33
+ ```
34
+ A BLOCKER'S STATUS IS A CLAIM ABOUT THE PAST. EXECUTE ITS `Resolved when`
35
+ AS A CHECK BEFORE TREATING IT AS OPEN.
36
+ RESOLVE AT THE LOWEST RUNG THAT OWNS THE DECISION: EVIDENCE → RECORDED RULE →
37
+ EXECUTION → AGENT → INDEPENDENT SESSION → COUNCIL → OWNER.
38
+ THE OWNER IS THE LAST RUNG, NEVER THE FIRST, AND NEVER FOR A TECHNICAL DECISION.
39
+ NEVER PASS `--confirm` OR BUY METERED COUNCIL SPEND WITHOUT THE OWNER'S YES.
40
+ THE OWNER IS ASKED ONE QUESTION PER TURN, WITH OPTIONS AND ONE RECOMMENDATION,
41
+ AND THE ANSWER IS WRITTEN DOWN BEFORE THE NEXT QUESTION IS PUT.
42
+ NEVER HAND BACK A FILED QUESTION OR A COUNT OF OPEN QUESTIONS.
43
+ A BLOCKER IS CLOSED ONLY BY `- **Status:** resolved` — AND ONLY WITH EVIDENCE.
44
+ NO RUNG LIFTS A HARD FLOOR OR AN OWNER-RESERVED INVARIANT.
45
+ ```
46
+
47
+ ## Argument
48
+
49
+ | Given | Scope |
50
+ |---|---|
51
+ | a roadmap path | that roadmap's open blockers |
52
+ | a blocker id | that one blocker |
53
+ | `all` or nothing | every open blocker in the active roadmaps |
54
+ | `stubs` | the open blockers in `agents/roadmaps/stubs/` |
55
+
56
+ `--check-only` stops after Phase 2 — conditions executed and reported, nothing
57
+ written. `--no-council` stops each decision at the agent rung and presents the
58
+ council-owned ones as proposals instead of running the council.
59
+
60
+ The dashboard parser skips `stubs/`, so `stubs` is read by grep instead
61
+ (`grep -n '^### blocker:' agents/roadmaps/stubs/*.md`, then each entry's five
62
+ fields) — and only on request, because a stub records a decision still to take,
63
+ not a plan in flight. `later/`, `archive/` and `skipped/` are out of scope — their blockers are history
64
+ or are re-checked by [`/roadmap:triage-parked`](triage-parked.md).
65
+
66
+ ## Where the work happens
67
+
68
+ The checked-out branch, like every `/roadmap` sub. A worktree, a branch, a commit
69
+ or a PR only on an explicit ask ([`scope-control`](../../rules/scope-control.md)
70
+ § Git operations, [`commit-policy`](../../rules/commit-policy.md)).
71
+
72
+ ## Instructions
73
+
74
+ ### 1. Inventory — from the parser, never by reading files
75
+
76
+ ```bash
77
+ agent-config gates --all --json
78
+ ```
79
+
80
+ It is the dashboard's own parser (`collect()`), so the set is exactly what the
81
+ dashboard counts. Per blocker it gives `id`, `roadmap`, `owner`, `class`,
82
+ `blocks`, `unblocksSteps`, `todo` and `resolvedWhen`. The class says who may act:
83
+ `0` deterministic and free (a `Run:` command) · `1` billable but reversible (a
84
+ `Run:` command inside the gate budget) · `2` council-decidable · `3` human-only —
85
+ and `3` is also the **absent-field default**, so most `3`s were never classified
86
+ at all. Re-classifying a technical `3` to `2` is a legitimate outcome of this
87
+ run, recorded on the entry (`Class: 2 — council-decidable. Corrected from 3 on
88
+ YYYY-MM-DD`), written as the bold field `- **Class:** 2 — …` the lint reads.
89
+ Read each entry's `- **Ownership:**` too: `product-owned`, `business-owned` and
90
+ `destructive-owned` are locked to the owner whatever the class says.
91
+
92
+ `unblocksSteps` is the open-step count of the whole roadmap the blocker sits in,
93
+ the same number for every blocker of that roadmap. Order by the steps a blocker
94
+ actually holds — `grep -c '<!-- blocked-by: <id>' <roadmap>` — and break ties by
95
+ `unblocksSteps`.
96
+
97
+ Show the inventory as one table before any write:
98
+
99
+ | # | blocker | roadmap | owner | class | unblocks | rung expected |
100
+
101
+ ### 2. Check — execute every `Resolved when`, cheapest limb first
102
+
103
+ A status word records the past; the condition records what would end the wait.
104
+ Run it as a command:
105
+
106
+ ```bash
107
+ gh pr view <n> --json state,mergedAt # "PR X merged"
108
+ git log --oneline origin/main -- <path> # "<file> landed on main"
109
+ ls docs/decisions/ADR-NNN-*.md # "the ADR exists / names (a) or (b)"
110
+ grep -n '<key>' <file> # "<key> is present"
111
+ ```
112
+
113
+ Verdict per blocker: `met` · `unmet` · `undecidable` (the condition names no
114
+ check — itself a finding, fixed in Phase 4 by rewriting `Resolved when` into one).
115
+
116
+ **A spend or quota blocker is checked against the live meter**, never the text:
117
+ `agent-config council:status` and `council_cli quota` show what is actually left.
118
+ A blocker that cites an exhausted budget the meter does not show is `met`.
119
+
120
+ **Read what the condition measures, not only whether it returns.** A condition
121
+ that keys on a value that never occurs is `met` never, whatever the world does;
122
+ that is a defect in the blocker and becomes a decision (Phase 3), not a wait.
123
+
124
+ `--check-only` ends here: the table with a verdict column.
125
+
126
+ ### 3. Resolve — one rung at a time, stopping at the first that can
127
+
128
+ The ladder is the one [`/challenge-me:closure`](../challenge-me/closure.md)
129
+ uses, with one blocker-specific rung added (execution):
130
+
131
+ 1. **Evidence** — the condition is `met`. Close it (Phase 4). No question exists.
132
+ 2. **A recorded rule** — an ADR, contract, `## Decisions` row or earlier council
133
+ verdict already answers the question the blocker asks. An ADR is evaluated
134
+ before it is cited — `./scripts-run src/scripts/adr_cite_check <ADR-NNN>`
135
+ (status, supersession, review trigger) — and a superseded or triggered one
136
+ closes nothing ([`decision-revisit-gate`](../../rules/decision-revisit-gate.md)).
137
+ 3. **Execution** — a class-0 blocker is a command whose output is the unblock.
138
+ `agent-config gates --execute <id>` echoes the exact string; the run needs
139
+ `--confirm`, and **`--confirm` is the owner's consent, not the agent's** — the
140
+ `Run:` field is shell read out of a file. Collect every class-0 and in-budget
141
+ class-1 command of the run and put them to the owner as **one** question
142
+ (§ Asking the owner): the literal commands, *run all* · *run selected* ·
143
+ *leave them*. Only on that answer does the agent pass `--confirm`. Class 1
144
+ outside the gate budget is a spend question for the owner.
145
+ 4. **The agent** — `deterministic` and `reversible-technical` choices inside
146
+ stated conventions. Pick it, write why.
147
+ 5. **An independent session** — the first rung for `contested-technical`: a
148
+ second instance with no stake in the first answer.
149
+ 6. **The council** — `critical-technical` decisions, process decisions the agent
150
+ should not take alone, and every reopening of a recorded decision
151
+ (`decision-revisit-gate` sends those council-first). See § Running the
152
+ council. Where no council is available, the **team** rung (`ai_team`) takes
153
+ its place.
154
+ 7. **The owner** — **only** `product-owned`, `business-owned` and
155
+ `destructive-owned` decisions, and the transitions `decision-revisit-gate`
156
+ reserves (lowering a safety floor, an irreversible or external commitment,
157
+ spend above a delegated threshold). A technical decision never reaches here
158
+ by being hard. One exception, from the ownership contract: a
159
+ `critical-technical` question with a single provider present degrades to
160
+ **owner-confirm of the agent's proposal**, never to one model reviewing
161
+ itself. See § Asking the owner.
162
+
163
+ `spend-exhaustion` leaves the ladder: it **pauses and reports** (§ Running the
164
+ council), it is not a question.
165
+
166
+ `Owner: user` on a blocker is **not** a reason to skip rungs 1–5. It records who
167
+ was expected to answer when the blocker was written; the ladder decides who
168
+ actually must. A blocker whose question the council can settle is settled there,
169
+ and its owner is told the outcome, not asked.
170
+
171
+ Things a blocker can wait on that **no rung can buy** — a real external party, a
172
+ calendar soak, a measurement campaign that needs sessions that have not happened,
173
+ a published release — stay open. For those the work is to make the wait
174
+ checkable: rewrite `Resolved when` into a command and, where it helps, add a
175
+ date. Never invent a decision to make one go away.
176
+
177
+ ### Running the council
178
+
179
+ Council availability is the resolver's answer, never the project tree's:
180
+
181
+ ```bash
182
+ agent-config council:status
183
+ ```
184
+
185
+ 1. **Batch the questions.** All council-owned blockers of a run go into **one**
186
+ question file under `agents/runtime/council/questions/` — one numbered
187
+ section per blocker, each carrying the blocker's five fields, the Phase-2
188
+ evidence and the candidate options. One run, not one per blocker.
189
+ 2. **Write the question neutrally** — scope, evidence, options. No
190
+ recommendation and no expected verdict, in either direction: the council is
191
+ judging a decision the agent would otherwise take, so the agent's lean stays
192
+ out of the prompt ([`evaluator-independence`](../../rules/evaluator-independence.md)),
193
+ and the prompt is kept with the verdict.
194
+ 3. **Estimate, then run.** The positional is a **file path**, never the question
195
+ text:
196
+
197
+ ```bash
198
+ ./scripts-run src/scripts/council_cli estimate <q.md>
199
+ ./scripts-run src/scripts/council_cli run <q.md> \
200
+ --output agents/runtime/council/responses/<name> \
201
+ --confirm --invocation agent
202
+ ```
203
+
204
+ In a fresh worktree, copy `agents/runtime/state/council-probes.json` from a
205
+ checkout that has run a council first — without it every seat reads as
206
+ unavailable. `--output` must sit under `agents/runtime/council/responses/`;
207
+ any other directory is refused. A failed run still spends quota, so never
208
+ re-run an unchanged question.
209
+
210
+ **Exhausted quota is `spend-exhaustion`: pause and report** — which questions
211
+ needed the council, the quota reading, `estimate --mode-override api`'s cost,
212
+ and what proceeds without it. Turning plan quota into metered spend is the
213
+ operator's decision, never one this command infers
214
+ (`docs/contracts/ai-council-config.md` § `fallback.api_on_quota`). Where the
215
+ owner has said yes to the metered rung, `agent-config council:grant-billing
216
+ <run_id>` records that yes for one run, and only then does
217
+ `--mode-override api` run.
218
+ 4. **Read the verdict honestly.** 2/2 agreeing → decided. 1/2 present is a
219
+ single-seat reading (`DEGRADED`), never a convergence: accept it for a
220
+ `reversible-technical` or `contested-technical` question and say so; for a
221
+ `critical-technical` one it degrades to owner-confirm of the proposal.
222
+ A split usually names a disputed **fact** — measure it. A second council
223
+ round is legitimate only when its input changed (the measurement, or a
224
+ proposal narrowed to what a refusal named); it is recorded as a new round,
225
+ and both verdicts are reported. Re-asking an unchanged question with a
226
+ different wording, or dropping scope until the answer turns, is verdict
227
+ shopping (`evaluator-independence` items 2 and 4). A split that survives the
228
+ measurement goes to the owner, with both positions as the options.
229
+ 5. **Record it inline.** `agents/runtime/council/` is gitignored and pruned, so a
230
+ roadmap never cites that path (`check_council_references`). The record is a
231
+ `## Decisions` row plus the blocker's status line carrying date, members,
232
+ verdict and cost.
233
+
234
+ ### Asking the owner — one question, one keystroke
235
+
236
+ ```
237
+ ONE QUESTION PER TURN. THE MOST UNBLOCKING ONE FIRST.
238
+ EVERY QUESTION IS ANSWERABLE WITH ONE NUMBER.
239
+ THE ANSWER IS RECORDED AND APPLIED BEFORE THE NEXT QUESTION IS PUT.
240
+ ```
241
+
242
+ Before the first question, one short line says how many owner questions the run
243
+ has left after the council (`3 decisions need you — here is the first`), so the
244
+ owner knows the length of the queue. Then, per question:
245
+
246
+ - **Context in two sentences** — what is blocked and what it unblocks.
247
+ - **What the council said**, if it ran: verdict or the split.
248
+ - **What exactly you do**, if the answer needs an act only the owner can
249
+ perform — a repository setting, a ruleset toggle, a credential, a tag: the
250
+ literal step (the page, the field, the command), so nothing has to be looked
251
+ up or asked back.
252
+ - **Numbered options**, each naming what changes if picked — the blocker's own
253
+ options where it has them, the council's otherwise; the last option is always
254
+ *leave it open*.
255
+ - **One recommendation line** directly under the options
256
+ ([`user-interaction`](../../rules/user-interaction.md)).
257
+
258
+ The answer is written into the roadmap (Phase 4) and the dependent step
259
+ unblocked **before** the next question appears. A *later* or *skip* answer moves
260
+ to the next question; the blocker stays open and is not re-asked in this run
261
+ ([`scope-control`](../../rules/scope-control.md) § Decline = silence).
262
+
263
+ `agent-config gates --reply` gives the `Blocked:` / `Do:` / `Done when:` lines
264
+ of the top user-owned blocker across the whole tree — raw material for a
265
+ question, not the question: it carries no options, no recommendation and no
266
+ council verdict, and it may name a blocker this run already classified
267
+ differently.
268
+
269
+ ### 4. Write — close, record, unblock
270
+
271
+ Per resolved blocker:
272
+
273
+ 1. **Status line** — already written by `gates --execute --confirm` for an
274
+ executed blocker (leave it, add only the Decisions row); otherwise
275
+ `- **Status:** resolved YYYY-MM-DD — <decision, one line>
276
+ (<rung>: <evidence | ADR-NNN | council YYYY-MM-DD, <members>, <verdict>, $<cost> | owner>)`.
277
+ `resolved` must be the first word: it is the only closing token
278
+ `lint_roadmap_blockers`, the dashboard and the estate count accept.
279
+ 2. **`## Decisions` row** in the same roadmap —
280
+ `| ID | ownership | resolved by | decision | evidence | revisit if |` —
281
+ `ownership` one of the eight classes (`deterministic`,
282
+ `reversible-technical`, `contested-technical`, `critical-technical`,
283
+ `product-owned`, `business-owned`, `destructive-owned`, `spend-exhaustion`),
284
+ `resolved by` one of `evidence` (also the recorded-rule and execution rungs),
285
+ `agent`, `independent:<session or model>`, `council:<date-slug>`,
286
+ `team:<record>`, `owner`;
287
+ then `./scripts-run src/scripts/lint_decision_classes`.
288
+ 3. **Unblock the steps** — remove each `<!-- blocked-by: <id> -->` annotation the
289
+ blocker held. The work itself is not started here.
290
+ 4. **A blocker that stays open** gets its `Resolved when` rewritten into a check
291
+ when Phase 2 found it `undecidable`, its `What to do` updated with what this
292
+ run learned, and a `- **Recommendation:**` and an `- **If you do nothing:**`
293
+ line where it lacks them. An owner question that was asked this run flips its
294
+ `blocked-by:` annotations from `asked: no — …` to `asked: yes`.
295
+
296
+ Then regenerate and lint what changed:
297
+
298
+ ```bash
299
+ ./agent-config roadmap:progress --no-archive
300
+ ./scripts-run src/scripts/lint_roadmap_blockers
301
+ ./scripts-run src/scripts/check_estate_count
302
+ ```
303
+
304
+ A run that closes blockers lowers `open_blockers`; that is the drawdown the
305
+ estate gate wants and needs no claim; when `lint_roadmap_blockers` then reports
306
+ its decidability baseline as loose, lower it in the same change. A roadmap whose last blocker closed while
307
+ it has no open step is now archivable — name it in the output;
308
+ `./agent-config roadmap:progress` without the flag sweeps it. A decision whose
309
+ **implementation** touches governance surfaces (`src/config/gate-coverage.yml`,
310
+ workflows, kernel rules) needs its ratification artifact in that later change;
311
+ deciding it here does not. A run that **adds** a blocker (splitting
312
+ one, or recording a newly found external wait) grows it and needs an
313
+ `estate_growth_exempt: <reason>` line added to that roadmap's frontmatter in the
314
+ same change.
315
+
316
+ ## Output
317
+
318
+ 1. The inventory table with the Phase-2 verdict and the rung that closed each.
319
+ 2. Per closed blocker: one line — what decided it and where it is recorded.
320
+ 3. The council run(s): question count, members present, verdict per question,
321
+ cost.
322
+ 4. **The ledger** — the run's completeness check:
323
+
324
+ ```
325
+ blockers N in scope
326
+ closed by evidence n · by recorded rule n · by execution n · by agent n · by council n · by owner n
327
+ open waiting on external n · owner said later n · undecidable → rewritten n
328
+ steps N unblocked across M roadmaps
329
+ ```
330
+
331
+ Every blocker in scope appears in exactly one bucket.
332
+ 5. Roadmaps that became archivable because their last blocker closed.
333
+ 6. If owner questions remain: the queue length and the **first question** — never
334
+ the list.
335
+
336
+ ## Honest enforcement — `instruction-only`
337
+
338
+ `lint_roadmap_blockers` checks a blocker's shape and the closing token; nothing
339
+ checks that a `Resolved when` was executed rather than read, that a council
340
+ verdict was reported at its real quorum, or that an owner question was the
341
+ council's to answer. The ledger and the inline council record are the control.
342
+
343
+ ## Do NOT
344
+
345
+ - Mark a blocker resolved because its status is old, or because a sibling PR
346
+ looks related. The condition, executed, is the only evidence.
347
+ - Ask the owner what the tree, a recorded decision or the council can answer —
348
+ *"Owner: user"* in the file is not a reason.
349
+ - Ask more than one question per turn, or hand back *"four decisions are open in
350
+ file X"*.
351
+ - Run the council once per blocker, or re-run an unchanged question after a
352
+ failure.
353
+ - Pass `--confirm` or switch to metered council spend without the owner's yes.
354
+ - Cite `agents/runtime/council/` from a roadmap.
355
+ - Execute the work a resolved blocker unblocks — this command authorizes
356
+ deciding and recording, not doing ([`scope-control`](../../rules/scope-control.md)
357
+ § Authoring vs. implementation). `/roadmap:next` or `/roadmap:process-full`
358
+ picks the work up.
359
+ - Lift a Hard Floor ([`non-destructive-by-default`](../../rules/non-destructive-by-default.md))
360
+ through any rung — a council verdict authorizes no deploy, push, deletion or
361
+ spend beyond the standing budget.