@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
@@ -0,0 +1,325 @@
1
+ ---
2
+ model_tier: high
3
+ name: roadmap-triage-parked
4
+ pack: product-basic
5
+ visibility: internal
6
+ cluster: roadmap
7
+ sub: triage-parked
8
+ skills: [roadmap-management, roadmap-writing, decision-review, agent-docs-writing]
9
+ description: Drain later/ and skipped/ — verify each parked roadmap against the current tree, run its resume condition, then promote, absorb, archive, or re-park it with a fresh reason.
10
+ argument-hint: "[<file> | later | skipped | all] [--batch <n>] [--triage-only]"
11
+ suggestion:
12
+ eligible: false
13
+ rationale: "Cluster sub-command — reached via its cluster head's routing or its explicit /roadmap:triage-parked name; not independently suggested (surface-consolidation)."
14
+ workspaces:
15
+ - agent-config-maintainer
16
+ packs:
17
+ - meta
18
+ ---
19
+
20
+ # /roadmap:triage-parked
21
+
22
+ Drain sub of the [`/roadmap`](../roadmap.md) cluster. `later/` and `skipped/`
23
+ are excluded from the dashboard and from every `/roadmap:process-*` run, so
24
+ nothing ever looks at them again unless asked. A parked roadmap is a **frozen
25
+ claim about a tree that has since moved**: its resume condition may have fired
26
+ weeks ago, its open steps may have shipped under another roadmap, its skip
27
+ reason may no longer hold. This command re-reads them against the current tree
28
+ and gives every file a decision, so the two folders shrink instead of rotting.
29
+
30
+ It is the [`/analyze:inbox`](../analyze/inbox.md) discipline applied to the
31
+ roadmap estate's own back room: verify every claim, prefer "already shipped" as
32
+ the most valuable finding, and never let a file leave the run without a named
33
+ disposition.
34
+
35
+ ## The Iron Law
36
+
37
+ ```
38
+ A PARKED ROADMAP IS A CLAIM, NOT A FACT. VERIFY ITS OPEN STEPS AND EXECUTE ITS
39
+ RESUME CONDITION AGAINST THE CURRENT TREE BEFORE DECIDING ANYTHING.
40
+ "ALREADY SHIPPED" IS THE MOST VALUABLE FINDING — MARK IT [x] WITH A file:line.
41
+ EVERY FILE IN SCOPE LEAVES THE RUN WITH EXACTLY ONE OF FIVE DISPOSITIONS.
42
+ RE-PARKING WITHOUT A REFRESHED, CHECKABLE REASON IS NOT A DISPOSITION.
43
+ NEVER DELETE A ROADMAP. NEVER DROP AN OPEN OR DEFERRED STEP SILENTLY.
44
+ NEVER WRITE [-] — CANCELLING A STEP IS OWNER-RESERVED. "OBSOLETE" IS A
45
+ FINDING THE OWNER RULES ON, NOT A CANCELLATION THE AGENT APPLIES.
46
+ AN OWNER-RESERVED BLOCKER STAYS OWNER-RESERVED — PROMOTION NEVER LIFTS IT.
47
+ REVIVING A skipped/ ROADMAP REOPENS A RECORDED DECISION — COUNCIL FIRST.
48
+ ```
49
+
50
+ ## Argument
51
+
52
+ | Given | Scope |
53
+ |---|---|
54
+ | a file path | that roadmap only |
55
+ | `later` | every roadmap in `agents/roadmaps/later/` |
56
+ | `skipped` | every roadmap in `agents/roadmaps/skipped/` |
57
+ | `all` or nothing | both folders |
58
+
59
+ `README.md` is never in scope. `--batch <n>` caps the deep pass (default **15**
60
+ files per run); the cheap inventory in Phase 1 always covers the whole scope.
61
+ `--triage-only` stops after Phase 2 — the table, no edits.
62
+
63
+ > The batch default of 15 is a **stated default, not a measured optimum**.
64
+ > *Revisit-if:* a run reports files past the cap that the inventory had already
65
+ > classified as trivial (too low), or a run's verification column filling with
66
+ > `unverifiable` towards its end (too high — reading degraded).
67
+
68
+ ## Where the work happens
69
+
70
+ Runs in the checked-out branch, like `/analyze:inbox`. Its output is roadmap
71
+ edits and `git mv`s — no generated tree, nothing to isolate. A worktree, a
72
+ branch, a commit or a PR only on an explicit ask
73
+ ([`scope-control`](../../rules/scope-control.md) § Git operations,
74
+ [`commit-policy`](../../rules/commit-policy.md)).
75
+
76
+ ## Instructions
77
+
78
+ ### 1. Live screen and inventory — cheap, every file in scope
79
+
80
+ Read live state first, never the dashboard or an earlier screen:
81
+
82
+ ```bash
83
+ agent-config roadmap:context
84
+ ```
85
+
86
+ Then one row per file, from commands, not from reading:
87
+
88
+ | file | folder | `[x]` | `[ ]` | `[~]` | `[-]` | parked since | resume condition | blockers | skip reason |
89
+
90
+ - **Checkbox counts** — `grep -cE '^\s*[-*] \[x\]'` and siblings, per marker.
91
+ A grep also counts boxes inside fenced code blocks; where a count looks off,
92
+ trust the dashboard parser (`collect()` in the progress generator) over it.
93
+ - **Parked since** — the date the file first appeared in its folder:
94
+ `git log --diff-filter=A --format=%ad --date=short -- <path> | tail -1`.
95
+ Age is a finding: a file parked eleven days ago and one parked two hundred
96
+ days ago are not the same decision.
97
+ - **Resume condition** — the `entry_condition:` mapping (`what` / `when` /
98
+ `who`) or a `Blocked until` / `Resume when` line, quoted verbatim. Absent on a
99
+ `later/` file is itself a defect, recorded in the row.
100
+ - **Blockers** — every `### blocker: <slug>` with its `Status:` and
101
+ `Resolved when`.
102
+ - **Skip reason** — for `skipped/`, the top-of-file reason or
103
+ `> Superseded by …` pointer, quoted.
104
+
105
+ A table with fewer rows than the scope has files is the first finding of the run.
106
+
107
+ ### 2. Triage — first-impression disposition, all files
108
+
109
+ Add a `candidate` column to the inventory. Most files settle here cheaply:
110
+
111
+ - **Zero open, zero deferred** (`[ ]` = 0, `[~]` = 0) → `archive` candidate. The
112
+ file is finished or fully cancelled and only its folder is wrong.
113
+ - **Superseded pointer resolves** to a roadmap that exists in `archive/` or the
114
+ active tree → `archive` candidate, with the pointer as its reason.
115
+ - **Resume condition names a PR, an ADR, a file, or a merged branch** → it is
116
+ mechanically checkable; Phase 3 runs it first.
117
+ - **Resume condition names only an owner decision or a calendar date** → read
118
+ the decision record (`agents/roadmaps/` `## Decisions` tables, ADRs) and the
119
+ date; a past date with no recorded decision is a `re-park` or an escalation,
120
+ never a silent pass.
121
+
122
+ Show the table before any edit. `--triage-only` ends the run here.
123
+
124
+ ### 3. Verify — the load-bearing phase, up to `--batch` files
125
+
126
+ Order the deep pass: mechanically-checkable resume conditions first, then
127
+ `later/` by age (oldest first), then `skipped/`. Delegate when more than ~4 files
128
+ survive — one subagent per file, told to verify against the tree and **write no
129
+ repo files**; their return is a reading, re-checked against the file before any
130
+ edit ([`delegation-policy`](../../rules/delegation-policy.md)).
131
+
132
+ Per file, three checks:
133
+
134
+ **3a. Execute the resume condition and every blocker's `Resolved when` as a
135
+ check** — never trust a `Status:` word, which records the past:
136
+
137
+ ```bash
138
+ gh pr view <n> --json state,mergedAt # "PR X merged"
139
+ ls docs/decisions/ADR-NNN-*.md # "the ADR exists"
140
+ git log --oneline origin/main -- <path> # "<file> landed on main"
141
+ grep -n '<key>' <file> # "<key> exists"
142
+ ```
143
+
144
+ Verdict per condition: `met` · `unmet` · `unverifiable` (with the one line why).
145
+
146
+ **3b. Verify every open `[ ]` and deferred `[~]` step against the current tree**,
147
+ with a `file:line` or command output for what was checked:
148
+
149
+ `already-shipped` · `still-needed` · `obsolete` (the target it acts on no longer
150
+ exists or was superseded) · `unverifiable`
151
+
152
+ Search wide: an open step in a parked roadmap was frequently shipped by a
153
+ *different* roadmap. `grep` the step's named file, flag, key or command across
154
+ `src/`, `docs/`, and `agents/roadmaps/archive/` before calling it `still-needed`.
155
+
156
+ **3c. Re-test the parking reason itself.** For `later/`: is the gate the file
157
+ names still the real gate, or has the blocking work moved (a dependency now
158
+ merged, a decision now recorded, a benchmark now runnable)? For `skipped/`: does
159
+ the skip reason still hold — is the superseding roadmap real, is the rejected
160
+ scope still rejected, or has a later inbox round or decision asked for this
161
+ again ([`recurring-criticism`](../../rules/recurring-criticism.md) owns a repeat)?
162
+
163
+ ### 4. Decide — exactly one disposition per file
164
+
165
+ | Disposition | When | What it writes |
166
+ |---|---|---|
167
+ | **promote** | resume condition `met` or no longer a gate, and ≥ 1 step `still-needed` that an agent can execute now — for a `skipped/` file, only after the council ruled the rejection no longer holds (below) | `git mv` to `agents/roadmaps/`, steps adapted to the current tree (below), the active-tree shape (below), a `> Promoted from <folder>/ on YYYY-MM-DD: <condition met + evidence>` line under the title |
168
+ | **absorb** | the surviving steps belong to an active roadmap already covering the area | the steps copied into that roadmap as a new phase or step block, each tagged `<!-- from: <parked-slug> -->`; the target's Risk Register `reviewed:` re-stamped (a new phase is a substantial change); then the parked file is **archived** with a pointer to where its items went |
169
+ | **archive** | every open/deferred step is `already-shipped` or absorbed, and no blocker is still open — or the file is finished and only misfiled | shipped steps flipped to `[x]` with `<!-- shipped: <file:line or PR> -->`, `status: archived`, `git mv` to `archive/`, a `> Archived from <folder>/ on YYYY-MM-DD by /roadmap:triage-parked: <reason>` line |
170
+ | **re-park** | the gate is real and still `unmet` | stays in place; the resume condition rewritten as a **checkable** `entry_condition:` mapping (`what` / `when` / `who`), a `review_by: YYYY-MM-DD` in the frontmatter, a `> Last triaged: YYYY-MM-DD — <verdict of 3a>` line, shipped steps still flipped to `[x]` |
171
+ | **owner-decision** | the only thing between the file and a disposition is a decision an agent may not take — any step judged `obsolete` (cancelling it is `[-]`, owner-reserved), or a gate in the [`decision-revisit-gate`](../../rules/decision-revisit-gate.md) owner-reserved set | stays in place; the question written onto the file with the candidate dispositions, and the item put to the owner (Output 1) |
172
+
173
+ **Adapting a promoted or absorbed step to the current tree** is the point of the
174
+ command, not a nicety. Rewrite each `still-needed` step so it would execute
175
+ against today's tree — renamed paths, moved scripts, changed commands, current
176
+ gate names — and tag it `<!-- adapted: <what changed> -->` so a reader can tell
177
+ an update from a transcription. A step that cannot be made executable becomes a
178
+ `[ ]` investigation step stating what is unknown, never the stale wording.
179
+
180
+ **The active-tree shape a promoted file must have.** `later/` and `skipped/` are
181
+ exempt from the gates that read the active tree; a promoted file is not. Before
182
+ it lands at the top level it carries at least one `## Phase` heading with a
183
+ checkbox step under each (`check_roadmap_trackable`), a `## Risk Register` with a
184
+ current `reviewed:` date (`lint_plan_risk_register`), and it passes
185
+ `lint_roadmap_family_cap`, `lint_roadmap_complexity` and `lint_roadmap_ci_steps`.
186
+ Set `status: ready` only when all of that is written. A file whose plan needs
187
+ more rework than that is promoted as `status: draft` — off the dashboard and the
188
+ risk-register gate until the owner flips it.
189
+
190
+ **Constraints that come with the folder, not with the decision:**
191
+
192
+ - **Reviving a `skipped/` file reopens a recorded rejection.** It goes to the
193
+ council first per [`decision-revisit-gate`](../../rules/decision-revisit-gate.md)
194
+ (mechanism-match, then the five steps), and to the owner when the transition
195
+ lands in the owner-reserved set. 3c's evidence is the input; the verdict is
196
+ recorded on the file before the `git mv`.
197
+ - **`skipped/` → `archive/` is legitimate here** once 3c confirms the file holds
198
+ nothing to resume. This widens `archive/` from "work happened" to "nothing left
199
+ to do here", deliberately: the folder that must stay small is the one nobody
200
+ reads, and the `> Archived from skipped/` line carries the original skip reason
201
+ forward verbatim, so the rejection stays on record.
202
+ - **Deferred `[~]` steps never follow a file into `archive/` silently** —
203
+ [`roadmap-progress-sync`](../../rules/roadmap-progress-sync.md) Iron Law 3
204
+ applies unchanged. Each one is `already-shipped` (flip to `[x]`), or absorbed /
205
+ carried, and then annotated in the source step as
206
+ `<!-- deferred-resolution: merged-into=<slug> -->` or
207
+ `<!-- deferred-resolution: carried-to=<slug> -->` (a carried-to target also
208
+ carries `parent_roadmap: <source-slug>`). A bare `[~]` in `archive/` reds
209
+ `lint_deferral_integrity`.
210
+ - **Blockers resolve before their file moves.** A blocker whose `Resolved when`
211
+ ran `met` in 3a gets `- **Status:** resolved` — the only closing token
212
+ `lint_roadmap_blockers` and the estate count accept. A file with a blocker
213
+ still open is not archived; it is promoted with the blocker, re-parked, or put
214
+ to the owner.
215
+ - **Promotion never lifts a blocker.** A promoted roadmap keeps every blocker
216
+ whose `Resolved when` is still `unmet`, and a blocker marked owner-reserved
217
+ stays so; the file is active because *some* step is executable now, not
218
+ because the gate went away.
219
+ - **Promote only what is executable now.** If every surviving step is gated,
220
+ the answer is `re-park`, however old the file is — the
221
+ [Active vs. Later test](../../skills/roadmap-management/references/archival.md)
222
+ is unchanged.
223
+
224
+ ### 5. Apply — the mechanics that red CI if skipped
225
+
226
+ In this order, after all decisions of the batch are taken:
227
+
228
+ 1. `git mv` each moved file and fix its own outgoing relative links:
229
+ `later/` or `skipped/` → top level removes exactly one `../` from each;
230
+ `later/` or `skipped/` → `archive/` changes none. Migrate inbound references
231
+ to the new path (`grep -rn '<slug>' agents/ docs/ src/`).
232
+ 2. Frontmatter: a file leaving `later/` must not keep `status: later` —
233
+ `lint_roadmap_later_disposition` reads the word, not the folder. Archived →
234
+ `status: archived`; promoted → `status: ready` or `draft` (step 4).
235
+ 3. **Estate ratchet — a promotion is an addition.** `check_estate_count` reads a
236
+ `later/x.md` → `x.md` move as a new active roadmap on both halves, and only a
237
+ move of an *active top-level* roadmap out of the tree offsets it — archiving
238
+ a parked file lowers `later_roadmaps`, never `active_roadmaps`. So each
239
+ promoted file needs its own `estate_offset_exempt: <reason>` written in this
240
+ change; the reason must name the disposition rejected instead (archive, park,
241
+ merge — `_lib/exemption_shape.ts`), e.g. *"promoted from later/: resume
242
+ condition met (PR #N); not re-parked because …; not merged because …"*. Many
243
+ parked files already carry an old `estate_offset_exempt` — **replace** it,
244
+ never inherit a reason written for a different event. The gate reads
245
+ `<base>...HEAD`, so it sees only committed changes: run it after the change is
246
+ committed, and read its `this change +N active / -M disposed, K exempt` line,
247
+ where `K` must equal `N`.
248
+
249
+ ```bash
250
+ ./scripts-run src/scripts/check_estate_count
251
+ ```
252
+ 4. Regenerate: `./agent-config roadmap:progress --no-archive` (dashboard — the
253
+ flag keeps it from sweeping unrelated finished roadmaps into this change) and
254
+ `./scripts-run src/scripts/build_archive_index` (archive index — nothing else
255
+ in the archival path regenerates it).
256
+ 5. Run the lints that read what moved: `lint_roadmap_later_disposition`,
257
+ `lint_roadmap_blockers`, `lint_deferral_integrity`, `check_no_roadmap_refs`,
258
+ `check_estate_count`, and — for every promoted or absorbing file —
259
+ `check_roadmap_trackable`, `lint_plan_risk_register`,
260
+ `lint_roadmap_family_cap`, `lint_roadmap_complexity`, `lint_roadmap_ci_steps`.
261
+ Draining `later/` loosens ratchets: when `lint_roadmap_later_disposition`
262
+ reports a baseline as loose, lower it in the same change. A drop below a
263
+ `min_scanned` floor in `src/config/gate-coverage.yml` is the corpus shrinking,
264
+ not a regression — lower the floor with the evidence in its note.
265
+
266
+ ### 6. Close the run
267
+
268
+ Re-read every edited file once against the decision table (pass 3 of the
269
+ inbox discipline): each `[x]` flip carries its evidence, each promoted step its
270
+ `adapted` tag, each archived file its reason line. A disposition the file does
271
+ not carry is not applied.
272
+
273
+ ## Output
274
+
275
+ 1. **Owner decisions required**, if any — at the top: the list of every pending
276
+ item (file, question, candidate dispositions), then **one** numbered-options
277
+ question for the most blocking item; the rest are asked one per turn after
278
+ it is answered ([`user-interaction`](../../rules/user-interaction.md),
279
+ [`ask-when-uncertain`](../../rules/ask-when-uncertain.md)). Each question is
280
+ also written onto its file, so the next run finds it posed.
281
+ 2. The inventory table (every file in scope) with the `candidate` column.
282
+ 3. Per deep-checked file: resume-condition verdicts, the step verification table,
283
+ the disposition and what was written.
284
+ 4. **The disposition ledger — the run's completeness check:**
285
+
286
+ ```
287
+ scope N files (later: L, skipped: S) · deep-checked: D · deferred to next batch: R
288
+ promote n → <paths>
289
+ absorb n → <parked> → <target roadmap>
290
+ archive n → <paths>
291
+ re-park n → <paths, with the refreshed condition>
292
+ owner n → <paths>
293
+ steps N verified → already-shipped / still-needed / obsolete / unverifiable
294
+ folders later/: before → after · skipped/: before → after
295
+ ```
296
+
297
+ Deep-checked files must sum to their dispositions. Files past the batch cap
298
+ are named in `deferred to next batch`, never silently absent.
299
+ 5. One closing summary: how many files left each folder, how many steps were
300
+ prevented by `already-shipped`, and which gate the run is waiting on next.
301
+
302
+ ## Honest enforcement — `instruction-only`
303
+
304
+ No gate checks that a resume condition was executed rather than read, or that an
305
+ `already-shipped` flip was verified. The ledger is the control: it carries
306
+ numbers and `file:line` evidence a reviewer can challenge after the fact. The
307
+ folder-placement and estate gates named in step 5 catch a malformed **move**;
308
+ they cannot see a wrong **decision**.
309
+
310
+ ## Do NOT
311
+
312
+ - Promote a roadmap because it is old. Age is evidence that the parking reason
313
+ went unchecked, not evidence that it stopped holding.
314
+ - Archive a file with `still-needed` steps that were neither absorbed nor
315
+ carried into a follow-up.
316
+ - Write `[-]` to make a file archivable. An obsolete step is a finding put to
317
+ the owner; the agent never cancels one.
318
+ - Re-park with the same prose condition. If it could not be checked this run, it
319
+ will not be checked next run either — rewrite it as an `entry_condition:`.
320
+ - Execute a promoted roadmap in the same run — triage authorizes moving and
321
+ rewriting plans, not doing their work
322
+ ([`scope-control`](../../rules/scope-control.md) § Authoring vs. implementation).
323
+ `/roadmap:next` or `/roadmap:process-full` picks it up afterwards.
324
+ - Resolve an owner-reserved gate into an accurate paragraph. Past the decision
325
+ the agent cannot take, the output is the escalation block.
@@ -2,13 +2,13 @@
2
2
  model_tier: medium
3
3
  name: roadmap
4
4
  disable-model-invocation: true
5
- argument-hint: "[create|ai-council|process-step|process-phase|process-full|next] [args]"
5
+ argument-hint: "[create|ai-council|process-step|process-phase|process-full|next|triage-parked|resolve-blockers] [args]"
6
6
  pack: product-basic
7
- intent: "Roadmap dispatcher — create, process-step, process-phase, process-full, next, ai-council"
8
- routes_to: [roadmap-create, roadmap-ai-council, roadmap-materialize, roadmap-process-step, roadmap-process-phase, roadmap-process-full, roadmap-next]
7
+ intent: "Roadmap dispatcher — create, process-step, process-phase, process-full, next, triage-parked, resolve-blockers, ai-council"
8
+ routes_to: [roadmap-create, roadmap-ai-council, roadmap-materialize, roadmap-process-step, roadmap-process-phase, roadmap-process-full, roadmap-next, roadmap-triage-parked, roadmap-resolve-blockers]
9
9
  replaces: []
10
10
  visibility: advanced
11
- description: Roadmap orchestrator — routes to create (authoring), process-step / process-phase / process-full (autonomous execution), and next (pick a roadmap and ship it).
11
+ description: Roadmap orchestrator — create (authoring), process-step / -phase / -full (execution), next (pick and ship), triage-parked (later/, skipped/), resolve-blockers.
12
12
  cluster: roadmap
13
13
  type: orchestrator
14
14
  suggestion:
@@ -40,6 +40,8 @@ paused for confirmation before every step) was removed —
40
40
  | `/roadmap:process-phase` (**default execution scope**) | `commands/roadmap/process-phase.md` | Autonomously process every open step in the current phase |
41
41
  | `/roadmap:process-full` | `commands/roadmap/process-full.md` | Autonomously process every open step across every phase; `--all` iterates the whole active estate, `--worktree` isolates the workspace |
42
42
  | `/roadmap:next` | `commands/roadmap/next.md` | Screen for the next executable roadmap, then carry it to a reviewable PR (selection + `process-full` + delivery) |
43
+ | `/roadmap:triage-parked` | `commands/roadmap/triage-parked.md` | Re-check every roadmap in `later/` and `skipped/` against the current tree; promote, absorb, archive, or re-park each one |
44
+ | `/roadmap:resolve-blockers` | `commands/roadmap/resolve-blockers.md` | Check every open blocker, close what the tree settled, decide the rest in the AI council, ask the owner one question at a time |
43
45
 
44
46
  Sub-command names match the locked contract in
45
47
  [`docs/contracts/command-clusters.md`](../docs/contracts/command-clusters.md).
@@ -71,6 +73,8 @@ each only binds a scope delta.
71
73
  > 4. process-phase — process the current phase (default)
72
74
  > 5. process-full — process every open step across every phase
73
75
  > 6. next — pick the next executable roadmap and ship it to a PR
76
+ > 7. triage-parked — drain later/ and skipped/ against the current tree
77
+ > 8. resolve-blockers — check and resolve open roadmap blockers, council first
74
78
 
75
79
  ## Rules
76
80
 
@@ -91,3 +95,13 @@ each only binds a scope delta.
91
95
  [`/roadmap:next`](roadmap/next.md), which is the only sub that
92
96
  screens and selects. The three `process-*` subs never choose across
93
97
  roadmaps.
98
+ - **Parked-estate intents** (*"go through later/ and skipped/"*, *"geh die
99
+ geparkten Roadmaps durch"*, *"which parked roadmaps are unblocked now?"*) route
100
+ to [`/roadmap:triage-parked`](roadmap/triage-parked.md) — the only sub that
101
+ reads `later/` and `skipped/`. It moves and rewrites plans; it never executes
102
+ one.
103
+ - **Blocker intents** (*"resolve the blockers"*, *"lös die Blocker auf"*,
104
+ *"which blockers still need me?"*) route to
105
+ [`/roadmap:resolve-blockers`](roadmap/resolve-blockers.md) — council first,
106
+ the owner one question at a time. It decides and records; it never executes
107
+ the unblocked work.
@@ -5,7 +5,7 @@ pack: engineering-base
5
5
  visibility: internal
6
6
  cluster: tests
7
7
  sub: create
8
- skills: [test-case-discovery, pest-testing, quality-tools]
8
+ skills: [test-case-discovery, quality-tools]
9
9
  description: Write meaningful tests for the current branch — stack-adaptive (pest / phpunit / vitest / jest / pytest / …)
10
10
  suggestion:
11
11
  eligible: false
@@ -27,7 +27,18 @@ tests in the framework the project actually uses, never a hard-coded one:
27
27
 
28
28
  - **PHP** → Pest (`pestphp/pest`) or PHPUnit.
29
29
  - **JS/TS** → Vitest or Jest. **Python** → pytest. **Go** → `testing`.
30
- **Rust** → `#[test]`.
30
+ **Rust** → `#[test]`. **Ruby** → RSpec. **JVM** → JUnit.
31
+ **.NET** → `dotnet test`.
32
+
33
+ **The resolver is the only stack authority, and `skills:` deliberately names
34
+ no single-stack skill.** Binding `pest-testing` unconditionally made a
35
+ React-only repository load PHP testing guidance before it reached the sentence
36
+ above telling it not to, and a static list cannot express a per-repository
37
+ answer. So the frontmatter keeps only stack-neutral skills and the load is
38
+ **resolver-conditional**: once step 1 has named the runner, load the skill for
39
+ THAT runner if one exists — `pest-testing` for pest, `laravel` for
40
+ `php artisan test`, `playwright-testing` for playwright. Unconditional became
41
+ conditional; it did not become nothing.
31
42
 
32
43
  Then read the existing tests under the project's test directory to match
33
44
  the style and conventions already in use (assertion shape, naming, fixtures).
@@ -95,7 +106,10 @@ funnel per changed behavior — enumerate first, write second:
95
106
 
96
107
  ### 7. Verify
97
108
 
98
- - Run the tests locally in the PHP container to make sure they pass.
109
+ - Run the tests locally with the command step 1 resolved — the same runner the
110
+ tests were written for. Reach for a container only when the resolved stack
111
+ calls for one, exactly as `/tests execute` branches on the resolved tool
112
+ before reaching for Docker.
99
113
  - If a test fails, fix it — don't just delete it.
100
114
 
101
115
  ### Rules
@@ -5,7 +5,7 @@ pack: engineering-base
5
5
  visibility: internal
6
6
  cluster: tests
7
7
  sub: execute
8
- skills: [pest-testing, quality-tools]
8
+ skills: [quality-tools]
9
9
  description: Run the project's test suite — stack-adaptive (pest / phpunit / vitest / jest / pytest / …)
10
10
  argument-hint: "[file | filter] [--include-e2e] [--include-slow] [--php]"
11
11
  suggestion:
@@ -31,6 +31,19 @@ returns the runner(s) to invoke per ecosystem:
31
31
  phpunit (`vendor/bin/phpunit`).
32
32
  - **JS/TS** → vitest (`npx vitest run`) or jest (`npx jest`).
33
33
  - **Python** → pytest. **Go** → `go test ./...`. **Rust** → `cargo test`.
34
+ - **Ruby** → rspec (`bundle exec rspec`). **JVM** → junit (`./gradlew test`,
35
+ `./mvnw test`). **.NET** → `dotnet test`.
36
+
37
+ **The resolver is the only stack authority, and `skills:` deliberately names
38
+ no single-stack skill.** The frontmatter used to bind `pest-testing` unconditionally, which
39
+ contradicted the sentence directly above it: a React-only repository was handed
40
+ PHP testing guidance before it read the instruction not to hard-code a stack.
41
+ A static list cannot express a per-repository answer, so the frontmatter keeps
42
+ only the stack-neutral `quality-tools` and the load is
43
+ **resolver-conditional**: once step 1 has named the runner, load the skill for
44
+ THAT runner if one exists — `pest-testing` for pest, `laravel` for
45
+ `php artisan test`, `playwright-testing` for playwright (selected under
46
+ `--include-e2e`). Unconditional became conditional; it did not become nothing.
34
47
 
35
48
  **Wrappers win.** When a `Makefile`/`Taskfile.yml` `test:` target or a
36
49
  `package.json` `test` script exists, the resolver returns the wrapper
@@ -52,11 +65,15 @@ ask interactively, or emit `ambiguous_routing` in CI.
52
65
  `vendor/bin/phpunit`) → run **inside the PHP Docker container**
53
66
  (`docker compose exec -T <service> ...`); detect the service from
54
67
  `docker-compose.yml` / `compose.yaml` (see `rules/docker-commands.md`).
55
- - **Direct JS/Python/Go/Rust tool** → run on the host (or the relevant
56
- container when the project containerises it).
68
+ - **Every other direct tool** — JS, Python, Go, Rust, Ruby
69
+ (`bundle exec rspec`, or bare `rspec` with no Gemfile), JVM
70
+ (`./gradlew test` / `./mvnw test`), .NET (`dotnet test`) → run on the host,
71
+ or in the relevant container when the project containerises it. PHP is the
72
+ only ecosystem with a standing container rule.
57
73
  - If the user named a specific file or filter, pass it through the
58
- resolved runner's native flag (`--filter=…` / a path for pest/phpunit,
59
- a path/`-t` for vitest/jest, a node-id for pytest).
74
+ resolved runner's native flag: `--filter=…` or a path for pest/phpunit, a
75
+ path or `-t` for vitest/jest, a node-id for pytest, `-e`/a path for rspec,
76
+ `--tests`/`-Dtest=` for gradle/maven, `--filter` for `dotnet test`.
60
77
  - No specific test requested → run the resolved fast suite.
61
78
 
62
79
  ### 3. Analyze results
@@ -0,0 +1,43 @@
1
+ # Decision Revisit Gate — Enforcement Reach
2
+
3
+ Loaded by [`decision-revisit-gate`](../../rules/decision-revisit-gate.md).
4
+ The honest-enforcement record moved out of the rule verbatim: why the gate
5
+ ships `instruction-only`, and the two reach limits a consumer install has.
6
+
7
+ ## Honest enforcement — `instruction-only`
8
+
9
+ `adr_cite_check` is deterministic where it runs, and nothing makes it run. No
10
+ gate can observe an agent citing a decision it never opened, so step 2 above is
11
+ model-carried — the same honesty boundary
12
+ [`security-sensitive-stop`](security-sensitive-stop.md) and
13
+ [`active-remediation`](active-remediation.md) state for their own obligations.
14
+
15
+ Two reach limits, named rather than implied. The tool lives in this repository's
16
+ `src/scripts/` and is **not** exposed as an `agent-config` verb, so a consumer
17
+ install performs step 2 by hand; wiring the verb touches six further surfaces
18
+ plus the curated `dist/agent-src/scripts/` list and is deliberately out of this
19
+ change. And `docs/decisions/` is projected into no agent-visible tree at all —
20
+ the agent sees ADR *numbers* cited across rules and skills, almost never ADR
21
+ *text*. Until that changes, "evaluate before citing" means opening the file.
22
+
23
+ `docs/contracts/` is unprojected on the same terms (`dist/agent-src/` carries no
24
+ `docs/`), so the burden table this rule points at is maintainer-reachable only.
25
+ That is why the reserved-set table above stays here rather than becoming a
26
+ pointer: a consumer install receives these lines and not the contract.
27
+
28
+ ## Why the council is the default venue — the measurement
29
+
30
+ The old "offers the user a
31
+ path" wording made every lock an owner interrupt; measured across 26 days of
32
+ transcripts, the agent reported a lock and waited while the owner voided the
33
+ decision retroactively — twice with the lock report timestamped **before** the
34
+ override demand. The ordering was the defect; the permission was never missing.
35
+
36
+ ## Why the five steps are inlined rather than only routed
37
+
38
+ The five are stated here, not only behind a route, because the route was
39
+ measurably unreachable: `decision-review` ships `install.default: false` in the
40
+ non-default `analysis-workbench` pack, so a pack-legal install received the
41
+ obligation and not the procedure. `routes_to` now names two always-on skills;
42
+ the backward-audit depth in
43
+ `decision-review` stays optional.
@@ -0,0 +1,24 @@
1
+ # Design Fidelity — Enforcement Reach
2
+
3
+ Loaded by [`design-fidelity`](../../../rules/design-fidelity.md). The
4
+ honest-enforcement record moved out of the rule verbatim.
5
+
6
+ ## Honest enforcement — `instruction-only`
7
+
8
+ Nothing records a fidelity comparison. The estate's two design linters measure
9
+ generic AI-aesthetic tells (`lint_design_slop`) and accessibility
10
+ (`lint_design_quality`); neither opens the handover, so nothing can tell a
11
+ proven 1:1 from an asserted one. The proof clause in the Iron Law is therefore
12
+ model-carried, and the committed matrix
13
+ ([`design-review`](../skills/design-review/SKILL.md) § Fidelity proof) is the
14
+ control — a reviewer can open it, which is more than any gate here does.
15
+
16
+ ## Routing — why each trigger class is shaped as it is
17
+
18
+ Every class carries its own near-miss row in `ROUTING_MATRIX`
19
+ ([`design_fidelity_routing.test.ts`](../../tests/scripts/design_fidelity_routing.test.ts)),
20
+ and the row must test the direction the NEW trigger opens, not one that was
21
+ already closed — apply that before writing a trigger, not after. Why each class
22
+ is shaped as it is, why `*.html` and a bare builder host are refused, and the
23
+ worked example behind the direction rule:
24
+ [`design-fidelity-routing`](../../../guidelines/design-fidelity-routing.md).
@@ -224,7 +224,7 @@ NEVER A SILENTLY DEGRADED ANSWER. NO LLM CLASSIFIER FALLBACK (CUT C3).
224
224
 
225
225
  | Task pattern | Lookup class | Primitive |
226
226
  |---|---|---|
227
- | "where is X defined" / "confirm X's definition location" | `definition` | capped `rg` (definition-shaped patterns, `--max-count`); `code_graph query` only as an opportunistic accelerant when an index is present + fresh + `hooks.code_graph.enabled: true` |
227
+ | "where is X defined" / "confirm X's definition location" | `definition` | capped `rg` (definition-shaped patterns, `--max-count`); `code_graph query` only as an opportunistic accelerant when an index is present + fresh (`hooks.code_graph.enabled` gates nothing — it is inert) |
228
228
  | "who calls / imports X" / "confirm call sites" | `references` | capped `rg` (reference-shaped patterns); same optional `code_graph affected` accelerant clause |
229
229
  | "does string Y exist" / "probe candidate strings" | `string-existence` | FTS one-shot (`memory_lookup` for the knowledge corpus) or capped `rg -n --max-count` for the codebase |
230
230
  | "run report Z" / "run check_*" | `report-run` | direct script run, wrapped per the **measured** rtk allowlist (`internal/bench/rtk-savings/RESULTS.md` — wrap only the ~55%-savings class) |
@@ -232,11 +232,11 @@ NEVER A SILENTLY DEGRADED ANSWER. NO LLM CLASSIFIER FALLBACK (CUT C3).
232
232
  **Why rg-first** (council 2026-07-28, 2 rounds): the pre-registered benchmark
233
233
  behind the `code-graph-retrieval-null` claim (`docs/CLAIMS.md`) measured
234
234
  native-graph recall 0.365 vs grep 0.797 on graph-shaped questions — an
235
- indexing gap that kept `code_graph.enabled` false BY DEFAULT until that flag
236
- was retired (2026-09-07) — not permanently: the 2026-08-15 withdrawal retracted
237
- that, and the figures predate the 2026-08-22 extractor repair. The accelerant
238
- clause above is that bound's escape hatch, reached only when a caller passes a
239
- usable graph, which no production caller yet does.
235
+ indexing gap that kept `code_graph.enabled` false BY DEFAULT until the hook it
236
+ gated was replaced (2026-09-07), leaving the key inert and still registered —
237
+ not permanently: the figures predate the 2026-08-22 extractor repair. The
238
+ accelerant clause above is that bound's escape hatch, reached only when a
239
+ caller passes a usable graph, which no production caller yet does.
240
240
 
241
241
  **Escalation, not degradation:** a primitive that returns nothing (index miss,
242
242
  pattern too ambiguous, report script absent) — **or an unusable result**
@@ -1056,8 +1056,38 @@ execution either way.
1056
1056
 
1057
1057
  ### 6a. Deferred-resolution gate — Iron Law 3
1058
1058
 
1059
- Before any `git mv` to `archive/`, count `[~]` items in the closing
1060
- roadmap. If `count_deferred > 0`, archival is **blocked** per
1059
+ **Default: the sweep resolves it.** `archive_completed_roadmaps --all` carries
1060
+ every bare `[~]` step, plus every open blocker such a step names, into a
1061
+ `<slug>-carried` follow-up created in the same change (`deferral_carry.ts`),
1062
+ annotates the parent `carried-to=<slug>`, and archives — the "carry item +
1063
+ blocker" council row below, executed deterministically, so a finished
1064
+ `/roadmap:process-full` run ends archived instead of parked at 100 %. The
1065
+ manual flow below applies only to what the sweep refuses: an open blocker no
1066
+ deferred step names, a hand-written annotation that fails validation, or a run
1067
+ with `--no-carry`.
1068
+
1069
+ **Owner-dependent blockers stop the carry.** When a carried step names a blocker
1070
+ whose `Owner:` is the human (`maintainer` / `user` / `owner`, or any value that is
1071
+ not `implementer` / `council` / `agent` / `ai`), the sweep writes nothing and
1072
+ prints a `❓` block plus one `OWNER-DECISION {json}` line. Put that decision to
1073
+ the owner as ONE numbered-options question, never resolve it yourself:
1074
+
1075
+ 1. **Archive it** — run the printed `archive_command` (`… --owner-decision later --only <roadmap>`):
1076
+ the parent archives, the steps and their blockers park in
1077
+ `later/<slug>-carried.md`.
1078
+ 2. **Step by step** — show the FIRST step (`first_step`, verbatim) with its
1079
+ blocker's question, in the same message, so the owner can answer it or push
1080
+ it to later in one reply. An answer → do the step, flip it, show the next
1081
+ one. "Later" → leave that step `[~]` and show the next one. When no step is
1082
+ left to show, run that `archive_command`: what is still
1083
+ deferred parks, the parent archives.
1084
+
1085
+ A **subagent** never answers this and never passes `--owner-decision` itself: it
1086
+ stops and returns the `OWNER-DECISION` line verbatim, and the orchestrator puts
1087
+ it to the owner. A non-interactive run ends on the question, not on a report.
1088
+
1089
+ Before any `git mv` to `archive/` the sweep refused, count `[~]` items in the
1090
+ closing roadmap. If `count_deferred > 0`, archival is **blocked** per
1061
1091
  [`roadmap-progress-sync § Iron Law 3`](../../rules/roadmap-progress-sync.md).
1062
1092
  The loop MUST:
1063
1093