@event4u/agent-config 16.1.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 (467) 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 +98 -257
  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 +5 -5
  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/commands/work.md +4 -0
  23. package/dist/agent-src/contexts/authority/decision-revisit-gate-enforcement.md +43 -0
  24. package/dist/agent-src/contexts/communication/rules-auto/design-fidelity-enforcement.md +24 -0
  25. package/dist/agent-src/contexts/execution/auto-dispatch-classification.md +6 -6
  26. package/dist/agent-src/contexts/execution/autonomy-mechanics.md +4 -8
  27. package/dist/agent-src/contexts/execution/roadmap-process-loop.md +32 -2
  28. package/dist/agent-src/contexts/execution/session-canary-enforcement-history.md +67 -0
  29. package/dist/agent-src/contexts/execution/toolchain-resolver.md +101 -7
  30. package/dist/agent-src/rules/active-remediation.md +1 -1
  31. package/dist/agent-src/rules/autonomous-execution.md +1 -0
  32. package/dist/agent-src/rules/broken-access-control.md +1 -0
  33. package/dist/agent-src/rules/command-suggestion-policy.md +1 -0
  34. package/dist/agent-src/rules/context-hygiene.md +1 -1
  35. package/dist/agent-src/rules/decision-revisit-gate.md +16 -33
  36. package/dist/agent-src/rules/design-fidelity.md +13 -16
  37. package/dist/agent-src/rules/doc-screenshot-hygiene.md +1 -0
  38. package/dist/agent-src/rules/domain-safety-disclaimer.md +1 -0
  39. package/dist/agent-src/rules/domain-safety-pii.md +1 -0
  40. package/dist/agent-src/rules/domain-safety-retention.md +1 -0
  41. package/dist/agent-src/rules/engineering-safety-floor.md +1 -0
  42. package/dist/agent-src/rules/evaluator-independence.md +3 -2
  43. package/dist/agent-src/rules/fast-path-marker-visibility.md +1 -0
  44. package/dist/agent-src/rules/finance-safety-floor.md +1 -0
  45. package/dist/agent-src/rules/git-history-discipline.md +1 -0
  46. package/dist/agent-src/rules/image-likeness-and-rights.md +1 -0
  47. package/dist/agent-src/rules/legal-safety-floor.md +3 -2
  48. package/dist/agent-src/rules/lethal-trifecta-guard.md +1 -0
  49. package/dist/agent-src/rules/low-impact-corpus-privacy-floor.md +1 -0
  50. package/dist/agent-src/rules/media-governance-routing.md +14 -17
  51. package/dist/agent-src/rules/persona-governance.md +2 -2
  52. package/dist/agent-src/rules/provider-lifecycle-discipline.md +1 -1
  53. package/dist/agent-src/rules/question-not-instruction.md +1 -0
  54. package/dist/agent-src/rules/roadmap-progress-sync.md +1 -1
  55. package/dist/agent-src/rules/runtime-safety.md +1 -0
  56. package/dist/agent-src/rules/secret-vcs-guard.md +1 -0
  57. package/dist/agent-src/rules/security-sensitive-stop.md +3 -2
  58. package/dist/agent-src/rules/session-canary.md +8 -62
  59. package/dist/agent-src/rules/settings-ask-protocol.md +1 -0
  60. package/dist/agent-src/rules/source-confidentiality.md +1 -0
  61. package/dist/agent-src/rules/strategy-safety-floor.md +1 -0
  62. package/dist/agent-src/rules/tool-safety.md +1 -0
  63. package/dist/agent-src/rules/ui-audit-gate.md +1 -2
  64. package/dist/agent-src/rules/untrusted-input-defense.md +1 -0
  65. package/dist/agent-src/rules/user-interrupt-priority.md +1 -0
  66. package/dist/agent-src/scripts/archive_completed_roadmaps.ts +115 -20
  67. package/dist/agent-src/scripts/deferral_carry.ts +339 -0
  68. package/dist/agent-src/scripts/update_roadmap_progress.ts +4 -1
  69. package/dist/agent-src/skills/accessibility-auditor/data/aria-patterns.csv +1 -1
  70. package/dist/agent-src/skills/accessibility-auditor/data/manifest.json +2 -2
  71. package/dist/agent-src/skills/api-design/data/manifest.json +2 -2
  72. package/dist/agent-src/skills/api-testing/SKILL.md +17 -0
  73. package/dist/agent-src/skills/code-intelligence/SKILL.md +14 -2
  74. package/dist/agent-src/skills/design-review/SKILL.md +30 -4
  75. package/dist/agent-src/skills/design-review/references/verification-automation.md +32 -0
  76. package/dist/agent-src/skills/design-system-capture/references/import-procedure.md +1 -1
  77. package/dist/agent-src/skills/existing-ui-audit/SKILL.md +18 -3
  78. package/dist/agent-src/skills/existing-ui-audit/references/component-taxonomy-detection.md +56 -0
  79. package/dist/agent-src/skills/fe-design/SKILL.md +1 -1
  80. package/dist/agent-src/skills/iconography/SKILL.md +1 -1
  81. package/dist/agent-src/skills/js-library-packaging/SKILL.md +2 -2
  82. package/dist/agent-src/skills/markitdown/SKILL.md +4 -0
  83. package/dist/agent-src/skills/monorepo-workspace/SKILL.md +1 -1
  84. package/dist/agent-src/skills/playwright-testing/SKILL.md +30 -6
  85. package/dist/agent-src/skills/quality-tools/SKILL.md +11 -1
  86. package/dist/agent-src/skills/quality-tools/references/go-tools.md +76 -0
  87. package/dist/agent-src/skills/quality-tools/references/python-tools.md +104 -0
  88. package/dist/agent-src/skills/review-routing/SKILL.md +2 -2
  89. package/dist/agent-src/skills/skill-improvement-pipeline/SKILL.md +1 -1
  90. package/dist/agent-src/skills/storybook-workshop/SKILL.md +3 -3
  91. package/dist/agent-src/skills/tailwind-engineer/SKILL.md +1 -1
  92. package/dist/agent-src/skills/test-case-discovery/SKILL.md +7 -0
  93. package/dist/agent-src/skills/test-driven-development/SKILL.md +17 -0
  94. package/dist/agent-src/skills/test-performance/SKILL.md +19 -1
  95. package/dist/agent-src/skills/ui-component-architect/SKILL.md +25 -2
  96. package/dist/agent-src/templates/agents/agent-project-settings.example.yml +1 -1
  97. package/dist/agent-src/templates/roadmaps.md +30 -0
  98. package/dist/agent-src/templates/scripts/work_engine/directives/ui/app_spec.ts +10 -4
  99. package/dist/agent-src/templates/scripts/work_engine/directives/ui/apply.ts +302 -21
  100. package/dist/agent-src/templates/scripts/work_engine/directives/ui/audit.ts +22 -3
  101. package/dist/agent-src/templates/scripts/work_engine/directives/ui/scaffold.ts +6 -1
  102. package/dist/agent-src/templates/scripts/work_engine/stack/runner.ts +774 -109
  103. package/dist/agent-src/templates/scripts/work_engine/state.ts +57 -7
  104. package/dist/agent-src/templates/scripts/work_engine/taxonomy/detect.ts +500 -0
  105. package/dist/agent-src/templates/scripts/work_engine/taxonomy/place.ts +183 -0
  106. package/dist/cli/python/knowledge_ingest.js +1 -1
  107. package/dist/cli/python/workspace_drive.js +1 -1
  108. package/dist/cli/registry.js +1 -1
  109. package/dist/cli-delegate/archive_completed_roadmaps.js +92 -12
  110. package/dist/cli-delegate/check_update_banner.js +12 -1
  111. package/dist/cli-delegate/chunk-523HCFYO.js +90 -0
  112. package/dist/cli-delegate/{chunk-M2DPGFZ4.js → chunk-6V6TA25H.js} +22 -152
  113. package/dist/cli-delegate/chunk-7IQE3D5S.js +191 -0
  114. package/dist/cli-delegate/{chunk-6KFEC3G7.js → chunk-CQWX336L.js} +1 -1
  115. package/dist/cli-delegate/chunk-DEIV7XP7.js +108 -0
  116. package/dist/cli-delegate/chunk-EEHDXSYD.js +2040 -0
  117. package/dist/cli-delegate/{chunk-P6ZHP5W2.js → chunk-GKE7ZVFA.js} +4 -4
  118. package/dist/cli-delegate/chunk-JQOM7TTM.js +1201 -0
  119. package/dist/cli-delegate/{chunk-UNCRJBT3.js → chunk-JQVYKIZA.js} +41 -0
  120. package/dist/cli-delegate/{chunk-FC75PGJE.js → chunk-JY2I2DXV.js} +12 -1
  121. package/dist/cli-delegate/chunk-KB5FZ655.js +208 -0
  122. package/dist/cli-delegate/{chunk-YUM5KURG.js → chunk-KR6EM23A.js} +235 -1455
  123. package/dist/cli-delegate/{chunk-LTYVIY76.js → chunk-LIYTLH6O.js} +1 -1
  124. package/dist/cli-delegate/chunk-NQ7WT43P.js +2729 -0
  125. package/dist/cli-delegate/chunk-NXEILF2K.js +2160 -0
  126. package/dist/cli-delegate/{chunk-5R7HOLAF.js → chunk-NYX3L2PZ.js} +1 -1
  127. package/dist/cli-delegate/{chunk-4E2W63DA.js → chunk-OKJUIAPS.js} +62 -1
  128. package/dist/cli-delegate/{chunk-QAJS5YWY.js → chunk-PHD7OOLE.js} +2 -1
  129. package/dist/cli-delegate/{chunk-RGNIWTEA.js → chunk-QLDHIPWR.js} +1 -1
  130. package/dist/cli-delegate/{chunk-HDVVGPQW.js → chunk-RQNNW7IF.js} +1405 -567
  131. package/dist/cli-delegate/{chunk-S3VFXMTM.js → chunk-S4UMZNES.js} +1 -1
  132. package/dist/cli-delegate/{chunk-6KM6ORRY.js → chunk-S4YWNRKO.js} +24 -8
  133. package/dist/cli-delegate/{chunk-GJCBB2UG.js → chunk-TRI6DQZ6.js} +3054 -325
  134. package/dist/cli-delegate/chunk-ULQRUR23.js +208 -0
  135. package/dist/cli-delegate/{chunk-NUHLI2RX.js → chunk-YCU3TIXH.js} +2 -0
  136. package/dist/cli-delegate/chunk-ZBZV2G5R.js +210 -0
  137. package/dist/cli-delegate/{chunk-WGXTVKCQ.js → chunk-ZUZKZYCN.js} +5 -3
  138. package/dist/cli-delegate/cmd_analyze_session.js +1 -1
  139. package/dist/cli-delegate/cmd_brand_status.js +1 -1
  140. package/dist/cli-delegate/cmd_conformance.js +1862 -809
  141. package/dist/cli-delegate/cmd_doctor.js +13 -6
  142. package/dist/cli-delegate/cmd_doctor_neighbours.js +23 -0
  143. package/dist/cli-delegate/cmd_explain.js +5 -5
  144. package/dist/cli-delegate/cmd_export.js +11 -8
  145. package/dist/cli-delegate/cmd_fleet.js +3 -3
  146. package/dist/cli-delegate/cmd_handoff.js +10 -7
  147. package/dist/cli-delegate/cmd_mcp_available.js +1 -1
  148. package/dist/cli-delegate/cmd_memory_get.js +3 -1
  149. package/dist/cli-delegate/cmd_migrate.js +2 -2
  150. package/dist/cli-delegate/cmd_packs_active.js +3 -3
  151. package/dist/cli-delegate/cmd_preflight.js +6 -6
  152. package/dist/cli-delegate/cmd_prune.js +11 -8
  153. package/dist/cli-delegate/cmd_refresh.js +2 -1
  154. package/dist/cli-delegate/cmd_route_audit.js +8 -6
  155. package/dist/cli-delegate/cmd_route_explain.js +4 -4
  156. package/dist/cli-delegate/cmd_session_recycle.js +4 -3
  157. package/dist/cli-delegate/cmd_settings_get.js +1 -1
  158. package/dist/cli-delegate/cmd_settings_migrate.js +11 -8
  159. package/dist/cli-delegate/cmd_settings_set.js +4 -4
  160. package/dist/cli-delegate/cmd_sync.js +11 -8
  161. package/dist/cli-delegate/cmd_uninstall.js +11 -8
  162. package/dist/cli-delegate/cmd_update.js +1 -1
  163. package/dist/cli-delegate/cmd_upgrade.js +3 -2
  164. package/dist/cli-delegate/cmd_validate.js +11 -8
  165. package/dist/cli-delegate/cmd_versions.js +1 -1
  166. package/dist/cli-delegate/deferral_carry.js +16 -0
  167. package/dist/cli-delegate/gate_execute.js +2 -2
  168. package/dist/cli-delegate/roadmap_gates.js +5 -5
  169. package/dist/cli-delegate/update_roadmap_progress.js +1 -1
  170. package/dist/discovery/deprecation-report.md +1 -1
  171. package/dist/discovery/discovery-manifest.json +132 -80
  172. package/dist/discovery/discovery-manifest.json.sha256 +1 -1
  173. package/dist/discovery/discovery-manifest.summary.md +3 -3
  174. package/dist/discovery/dormancy-report.md +1 -1
  175. package/dist/discovery/orphan-report.md +1 -1
  176. package/dist/discovery/packs.json +7 -5
  177. package/dist/discovery/trust-report.md +2 -2
  178. package/dist/discovery/workspaces.json +6 -4
  179. package/dist/hooks/dispatch.js +7972 -5186
  180. package/dist/hooks/dispatch.sha256 +1 -0
  181. package/dist/install/claudePathsPlan.js +47 -6
  182. package/dist/install/claudeRuleRewrite.js +7 -0
  183. package/dist/install/emit_host_rules_cli.js +39 -36
  184. package/dist/install/globalRuleScope.js +87 -0
  185. package/dist/install/host_rule_ownership.js +160 -0
  186. package/dist/install/install.mjs +2226 -1055
  187. package/dist/install/installThinLayer.js +261 -0
  188. package/dist/install/installedRuleLinks.js +176 -0
  189. package/dist/install/wizard-plan.js +24 -0
  190. package/dist/mcp/registry-manifest.json +3 -3
  191. package/dist/mcp/server.json +2 -2
  192. package/dist/mcp/server.mjs +40913 -34865
  193. package/dist/scripts/_lib/agent_settings.js +11 -0
  194. package/dist/scripts/_lib/claude_settings_hooks.js +10 -8
  195. package/dist/scripts/_lib/installed_layer.js +378 -0
  196. package/dist/scripts/_lib/lean_projection_mode.js +218 -15
  197. package/dist/scripts/_lib/rule_consequence_class.js +45 -0
  198. package/dist/scripts/_lib/rule_injection.js +67 -10
  199. package/dist/scripts/_lib/rule_law_section.js +122 -0
  200. package/dist/scripts/_lib/thin_rules.js +458 -0
  201. package/dist/scripts/_lib/windsurf_render.js +60 -0
  202. package/dist/scripts/condense.js +14 -26
  203. package/dist/scripts/project_thin_rules.js +14 -294
  204. package/dist/server/schemas/settings.js +29 -0
  205. package/dist/shared/skillRanking.js +74 -13
  206. package/dist/ui/assets/index-Cwq4d0hX.js +23 -0
  207. package/dist/ui/assets/index-Cyjy8bWO.css +1 -0
  208. package/dist/ui/index.html +2 -2
  209. package/docs/contracts/settings-classes.md +10 -6
  210. package/package.json +4 -4
  211. package/src/agent-src/scripts/archive_completed_roadmaps.ts +115 -20
  212. package/src/agent-src/scripts/deferral_carry.ts +339 -0
  213. package/src/agent-src/scripts/update_roadmap_progress.ts +4 -1
  214. package/src/agent-src/templates/scripts/work_engine/directives/ui/app_spec.ts +10 -4
  215. package/src/agent-src/templates/scripts/work_engine/directives/ui/apply.ts +302 -21
  216. package/src/agent-src/templates/scripts/work_engine/directives/ui/audit.ts +22 -3
  217. package/src/agent-src/templates/scripts/work_engine/directives/ui/scaffold.ts +6 -1
  218. package/src/agent-src/templates/scripts/work_engine/stack/runner.ts +774 -109
  219. package/src/agent-src/templates/scripts/work_engine/state.ts +57 -7
  220. package/src/agent-src/templates/scripts/work_engine/taxonomy/detect.ts +500 -0
  221. package/src/agent-src/templates/scripts/work_engine/taxonomy/place.ts +183 -0
  222. package/src/config/agent-settings.template.yml +91 -22
  223. package/src/config/ci-local-parity.yml +18 -0
  224. package/src/config/continuity-surface.json +9 -2
  225. package/src/config/evaluator-budgets.json +4 -4
  226. package/src/config/gate-coverage.yml +327 -3
  227. package/src/config/gate-violation-baselines.json +21 -9
  228. package/src/config/hook-bundle-budget.json +25 -0
  229. package/src/config/hook-latency-budget.json +21 -0
  230. package/src/config/hook-token-budget.json +8 -3
  231. package/src/config/host-instruction-limits.json +33 -0
  232. package/src/config/metric-registry.yml +114 -0
  233. package/src/config/placeholder-drift-budget.json +10 -0
  234. package/src/config/routing-coverage-seed.json +38 -3
  235. package/src/config/rule-activation-census.json +7 -3
  236. package/src/config/rule-consequence-class.json +161 -0
  237. package/src/config/rule-law-ceilings.json +99 -0
  238. package/src/install/claudePathsPlan.ts +46 -4
  239. package/src/install/claudeRuleRewrite.ts +10 -1
  240. package/src/install/emit_host_rules_cli.ts +43 -34
  241. package/src/install/globalRuleScope.ts +109 -0
  242. package/src/install/host_rule_ownership.ts +170 -0
  243. package/src/install/installThinLayer.ts +312 -0
  244. package/src/install/installedRuleLinks.ts +220 -0
  245. package/src/install/wizard-plan.ts +24 -0
  246. package/src/scripts/_cli/cmd_doctor.ts +28 -90
  247. package/src/scripts/_cli/cmd_doctor_neighbours.ts +293 -0
  248. package/src/scripts/_cli/doctor_execution.ts +100 -17
  249. package/src/scripts/_cli/doctor_network_posture.ts +226 -0
  250. package/src/scripts/_dispatch.bash +16 -2
  251. package/src/scripts/_lib/agent_settings.ts +11 -0
  252. package/src/scripts/_lib/body_portable.ts +102 -0
  253. package/src/scripts/_lib/cc_transcript.ts +132 -1
  254. package/src/scripts/_lib/claude_settings_hooks.ts +10 -8
  255. package/src/scripts/_lib/concern_sla_window.ts +200 -0
  256. package/src/scripts/_lib/estate_offsets.ts +241 -0
  257. package/src/scripts/_lib/exemption_shape.ts +143 -0
  258. package/src/scripts/_lib/fnv.ts +23 -0
  259. package/src/scripts/_lib/foreign_scan.ts +106 -0
  260. package/src/scripts/_lib/forge_protection.ts +114 -0
  261. package/src/scripts/_lib/forge_reader.ts +558 -0
  262. package/src/scripts/_lib/gitignore_block.ts +314 -0
  263. package/src/scripts/_lib/global_deploy_inventory.ts +32 -0
  264. package/src/scripts/_lib/graph_feeder_record.ts +214 -0
  265. package/src/scripts/_lib/hook_settings.ts +73 -0
  266. package/src/scripts/_lib/host_capability.ts +40 -19
  267. package/src/scripts/_lib/host_env_write.ts +111 -0
  268. package/src/scripts/_lib/host_hook_merge.ts +165 -0
  269. package/src/scripts/_lib/installed_layer.ts +538 -0
  270. package/src/scripts/_lib/json_merge.ts +82 -0
  271. package/src/scripts/_lib/json_pointers.ts +93 -11
  272. package/src/scripts/_lib/lean_projection_mode.ts +275 -15
  273. package/src/scripts/_lib/llm_proposer_transport.ts +14 -4
  274. package/src/scripts/_lib/machine_wake.ts +16 -3
  275. package/src/scripts/_lib/neighbour_census.ts +760 -0
  276. package/src/scripts/_lib/neighbour_scan.ts +122 -0
  277. package/src/scripts/_lib/neighbour_tool_use.ts +189 -0
  278. package/src/scripts/_lib/obligations.ts +119 -8
  279. package/src/scripts/_lib/probe_inputs.ts +271 -0
  280. package/src/scripts/_lib/prompt_shape.ts +46 -0
  281. package/src/scripts/_lib/read_surface_scan.ts +322 -0
  282. package/src/scripts/_lib/release_highlights.ts +2 -1
  283. package/src/scripts/_lib/release_migration_gate.ts +19 -3
  284. package/src/scripts/_lib/reserved_name_sweep.ts +73 -0
  285. package/src/scripts/_lib/retrieval_sanitize.ts +77 -16
  286. package/src/scripts/_lib/review_coverage.ts +134 -0
  287. package/src/scripts/_lib/rule_consequence_class.ts +71 -0
  288. package/src/scripts/_lib/rule_injection.ts +130 -10
  289. package/src/scripts/_lib/rule_law_section.ts +147 -0
  290. package/src/scripts/_lib/rule_layer_overlap.ts +58 -0
  291. package/src/scripts/_lib/shell_write_shapes.ts +108 -0
  292. package/src/scripts/_lib/skill_origin.ts +254 -0
  293. package/src/scripts/_lib/structural_hiding.ts +622 -0
  294. package/src/scripts/_lib/structured_ask.ts +64 -21
  295. package/src/scripts/_lib/thin_rules.ts +540 -0
  296. package/src/scripts/_lib/touched_file_quality.ts +434 -0
  297. package/src/scripts/_lib/turn_end_refusals.ts +600 -4
  298. package/src/scripts/_lib/turn_end_transcript.ts +216 -0
  299. package/src/scripts/_lib/verification_command.ts +324 -0
  300. package/src/scripts/_lib/verification_evidence.ts +647 -0
  301. package/src/scripts/_lib/verify_clause.ts +280 -0
  302. package/src/scripts/_lib/windsurf_render.ts +63 -0
  303. package/src/scripts/ai_council/cli_call_budget.ts +13 -5
  304. package/src/scripts/ai_council/clients.ts +26 -57
  305. package/src/scripts/ai_council/config.ts +1 -1
  306. package/src/scripts/ai_council/vendor_defaults.ts +45 -0
  307. package/src/scripts/ai_team/team_dispatch.ts +4 -0
  308. package/src/scripts/audit_skill_overlap.ts +261 -0
  309. package/src/scripts/before_complete_hook.ts +573 -25
  310. package/src/scripts/bench_hook_latency.ts +412 -5
  311. package/src/scripts/bench_touched_file_quality.ts +238 -0
  312. package/src/scripts/cache_realization_report.ts +61 -1
  313. package/src/scripts/check_argument_hint.ts +287 -0
  314. package/src/scripts/check_claims.ts +125 -1
  315. package/src/scripts/check_enforcement_coverage.ts +38 -9
  316. package/src/scripts/check_enforcement_matrix.ts +621 -22
  317. package/src/scripts/check_estate_count.ts +130 -153
  318. package/src/scripts/check_finding_dispositions.ts +138 -7
  319. package/src/scripts/check_generator_sync.ts +71 -0
  320. package/src/scripts/check_hook_bundle_composition.ts +370 -0
  321. package/src/scripts/check_host_docs_digest.ts +786 -0
  322. package/src/scripts/check_host_format_column.ts +559 -0
  323. package/src/scripts/check_input_references.ts +228 -0
  324. package/src/scripts/check_inputs_parity.ts +235 -0
  325. package/src/scripts/check_kernel_edit_ratified.ts +89 -9
  326. package/src/scripts/check_kill_switch_table.ts +294 -0
  327. package/src/scripts/check_memory.ts +7 -1
  328. package/src/scripts/check_placeholder_drift.ts +221 -0
  329. package/src/scripts/check_read_surface_coverage.ts +515 -0
  330. package/src/scripts/check_release_highlights.ts +10 -0
  331. package/src/scripts/check_release_holds.ts +2 -1
  332. package/src/scripts/check_release_pr_shape.ts +38 -15
  333. package/src/scripts/check_routing_coverage.ts +378 -11
  334. package/src/scripts/check_standing_rule_delivery.ts +33 -13
  335. package/src/scripts/check_static_parity.ts +17 -0
  336. package/src/scripts/check_verify_expectation_delta.ts +521 -0
  337. package/src/scripts/ci_settle.ts +145 -19
  338. package/src/scripts/closure_scan.ts +115 -1
  339. package/src/scripts/code_graph/detect.ts +127 -7
  340. package/src/scripts/code_graph/foreign.ts +194 -0
  341. package/src/scripts/code_graph/query.ts +217 -4
  342. package/src/scripts/code_graph/types.ts +26 -2
  343. package/src/scripts/code_graph/validate.ts +3 -1
  344. package/src/scripts/code_graph/verbs.ts +103 -0
  345. package/src/scripts/compile_hook_manifest.ts +90 -14
  346. package/src/scripts/condense.ts +14 -27
  347. package/src/scripts/estate_exemption_shape.ts +202 -0
  348. package/src/scripts/external_sources_denylist.json +29 -4
  349. package/src/scripts/generate_host_cost_table.ts +1 -1
  350. package/src/scripts/hook_manifest.json +1 -1
  351. package/src/scripts/hook_manifest.yaml +192 -14
  352. package/src/scripts/hooks/block_config_weakening.ts +294 -4
  353. package/src/scripts/hooks/block_kernel_rule_writes.ts +9 -78
  354. package/src/scripts/hooks/block_plumbing_writes.ts +342 -0
  355. package/src/scripts/hooks/bundle_integrity.ts +291 -0
  356. package/src/scripts/hooks/chain_nudge_hook.ts +1 -2
  357. package/src/scripts/hooks/code_graph_context_hook.ts +253 -25
  358. package/src/scripts/hooks/comment_discipline_hook.ts +1 -3
  359. package/src/scripts/hooks/concern_failure_policy.ts +280 -0
  360. package/src/scripts/hooks/concern_registry.ts +2 -0
  361. package/src/scripts/hooks/concern_timings.ts +94 -0
  362. package/src/scripts/hooks/delegation_nudge_hook.ts +1 -2
  363. package/src/scripts/hooks/design_pass_hook.ts +100 -9
  364. package/src/scripts/hooks/design_slop_hook.ts +1 -2
  365. package/src/scripts/hooks/dispatch_hook.ts +77 -71
  366. package/src/scripts/hooks/edit_shape_hook.ts +1 -2
  367. package/src/scripts/hooks/end_review_nudge_hook.ts +1 -1
  368. package/src/scripts/hooks/evidence_independence.ts +1 -2
  369. package/src/scripts/hooks/exit_codes.ts +129 -0
  370. package/src/scripts/hooks/host_lowering.json +1 -0
  371. package/src/scripts/hooks/host_lowering.ts +146 -3
  372. package/src/scripts/hooks/host_lowering.yaml +262 -46
  373. package/src/scripts/hooks/host_semantics.ts +30 -2
  374. package/src/scripts/hooks/injection_budget.ts +9 -2
  375. package/src/scripts/hooks/interruption_ledger_hook.ts +1 -2
  376. package/src/scripts/hooks/journal_record_hook.ts +1 -2
  377. package/src/scripts/hooks/memory_recall_hook.ts +1 -2
  378. package/src/scripts/hooks/obligation_settle_hook.ts +151 -5
  379. package/src/scripts/hooks/one_question_per_ask_hook.ts +43 -6
  380. package/src/scripts/hooks/orchestration_record_hook.ts +1 -2
  381. package/src/scripts/hooks/payload_stub.ts +10 -1
  382. package/src/scripts/hooks/permission_gate.ts +1 -2
  383. package/src/scripts/hooks/push_settle_hook.ts +1 -3
  384. package/src/scripts/hooks/replay_hook.ts +2 -1
  385. package/src/scripts/hooks/reread_guard_hook.ts +1 -2
  386. package/src/scripts/hooks/review_baseline_hook.ts +1 -2
  387. package/src/scripts/hooks/rtk_wrap_hook.ts +1 -2
  388. package/src/scripts/hooks/rule_inject_hook.ts +765 -68
  389. package/src/scripts/hooks/run_continuation_hook.ts +13 -15
  390. package/src/scripts/hooks/skill_route_hook.ts +1 -2
  391. package/src/scripts/hooks/source_first_gate_hook.ts +1 -2
  392. package/src/scripts/hooks/spawn_guard_shadow_hook.ts +1 -2
  393. package/src/scripts/hooks/subagent_ledger_hook.ts +1 -2
  394. package/src/scripts/hooks/suggestion_capture_hook.ts +1 -1
  395. package/src/scripts/hooks/table_fingerprint.ts +70 -0
  396. package/src/scripts/hooks/telemetry_flush_hook.ts +1 -2
  397. package/src/scripts/hooks/telemetry_usage_hook.ts +65 -10
  398. package/src/scripts/hooks/tool_result_bytes_hook.ts +93 -9
  399. package/src/scripts/hooks/turn_end_gate_hook.ts +421 -324
  400. package/src/scripts/hooks/ui_route_nudge_hook.ts +1 -2
  401. package/src/scripts/hooks_status.ts +112 -0
  402. package/src/scripts/injection_scan_hook.ts +7 -0
  403. package/src/scripts/install.ts +75 -189
  404. package/src/scripts/installed_layer_report.ts +103 -0
  405. package/src/scripts/language_mirror_hook.ts +15 -6
  406. package/src/scripts/learning_sidecar.ts +119 -8
  407. package/src/scripts/lint_deny_text.ts +419 -0
  408. package/src/scripts/lint_exit_codes.ts +262 -0
  409. package/src/scripts/lint_hook_manifest.ts +108 -0
  410. package/src/scripts/lint_major_migration_sections.ts +156 -26
  411. package/src/scripts/lint_pack_boundaries.ts +63 -5
  412. package/src/scripts/lint_roadmap_blockers.ts +78 -12
  413. package/src/scripts/lint_rule_law_section.ts +517 -0
  414. package/src/scripts/lint_skill_descriptions.ts +1 -1
  415. package/src/scripts/lint_skill_scripts_readonly.ts +1 -1
  416. package/src/scripts/lint_workflow_security.ts +161 -5
  417. package/src/scripts/mcp_server/consumer_tool_catalog.json +53 -0
  418. package/src/scripts/mcp_server/graph_tools.ts +72 -3
  419. package/src/scripts/mcp_server/prompts.ts +142 -1
  420. package/src/scripts/measure_routing_signal.ts +54 -16
  421. package/src/scripts/measure_skill_ranker_baseline.ts +515 -53
  422. package/src/scripts/measure_turn_end_gate.ts +193 -0
  423. package/src/scripts/memory_learn_hook.ts +91 -6
  424. package/src/scripts/memory_lookup.ts +1 -1
  425. package/src/scripts/model_rule_injection.ts +52 -5
  426. package/src/scripts/prepack-check.mjs +53 -0
  427. package/src/scripts/project_thin_rules.ts +34 -327
  428. package/src/scripts/release_publication.ts +13 -1
  429. package/src/scripts/report_evidence_temperature.ts +657 -0
  430. package/src/scripts/report_installed_rule_links.ts +157 -0
  431. package/src/scripts/report_invocation_surface.ts +383 -0
  432. package/src/scripts/report_label_agreement.ts +233 -0
  433. package/src/scripts/report_obligation_carriers.ts +699 -0
  434. package/src/scripts/report_obligation_mechanism.ts +230 -0
  435. package/src/scripts/report_obligation_writer_split.ts +236 -0
  436. package/src/scripts/report_single_token_triggers.ts +277 -0
  437. package/src/scripts/report_skill_menu_census.ts +208 -0
  438. package/src/scripts/report_skill_ranker_confusion.ts +442 -0
  439. package/src/scripts/report_standing_payload_by_host.ts +188 -15
  440. package/src/scripts/report_verification_record_coverage.ts +306 -0
  441. package/src/scripts/roadmap_verify_share.ts +213 -0
  442. package/src/scripts/rule_activation_census.ts +5 -2
  443. package/src/scripts/rule_trigger_eval.ts +9 -9
  444. package/src/scripts/schemas/command.schema.json +44 -0
  445. package/src/scripts/schemas/review-findings.schema.json +7 -2
  446. package/src/scripts/schemas/rule.schema.json +5 -0
  447. package/src/scripts/schemas/skill.schema.json +44 -0
  448. package/src/scripts/self_review_gate.ts +421 -17
  449. package/src/scripts/semantic_parity_census.ts +314 -0
  450. package/src/scripts/session_eol_report.ts +54 -1
  451. package/src/scripts/skill_tools/score_skill_relevance.ts +290 -25
  452. package/src/scripts/sweep_dead_scan_roots.ts +1 -1
  453. package/src/scripts/sweep_skill_ranker_signals.ts +129 -0
  454. package/src/scripts/sync_gitignore.ts +29 -235
  455. package/src/scripts/trigger_eval_grandfather.json +0 -7
  456. package/src/scripts/trigger_eval_rotation.ts +122 -27
  457. package/src/scripts/ui_conformance_probe.ts +156 -4
  458. package/src/scripts/update_prices.ts +85 -3
  459. package/src/scripts/write_bundle_digest.mjs +74 -0
  460. package/src/server/schemas/settings.ts +41 -0
  461. package/src/shared/skillRanking.ts +117 -11
  462. package/src/templates/consumer-settings/ONBOARDING.md +1 -0
  463. package/dist/cli-delegate/chunk-FXYUYU4N.js +0 -4416
  464. package/dist/cli-delegate/chunk-QJWAUMJW.js +0 -1072
  465. package/dist/cli-delegate/chunk-YDPILCOL.js +0 -152
  466. package/dist/ui/assets/index-DH1xc62v.js +0 -29
  467. package/dist/ui/assets/index-jSfMW8_t.css +0 -1
@@ -0,0 +1,183 @@
1
+ /**
2
+ * Placing a new component inside the taxonomy a project already chose.
3
+ *
4
+ * Leaf module — no intra-`work_engine` imports beyond its sibling detector's
5
+ * `NO_TAXONOMY` constant. That one import does pull `node:fs` in transitively;
6
+ * "stdlib-free" was the old wording here and it was simply wrong. Public API names stay snake_case to
7
+ * mirror the sibling detectors 1:1, per ADR-200.
8
+ *
9
+ * The contract, and the reason it is this small: placement reads the RECORDED
10
+ * tier list by name and conforms to whatever it holds. There is no table of
11
+ * tier names here, no ordering, no per-tier rule, and no numeric budget keyed
12
+ * to a tier — a component is placed when the brief names a tier the project
13
+ * has, and is reported as a gap when it does not. Anything richer would be the
14
+ * compiled-in taxonomy this suite refused to hard-code, arriving as an
15
+ * implementation detail rather than as a decision.
16
+ *
17
+ * That is also why an unplaceable component is never quietly put somewhere
18
+ * else. Choosing a tier for it would need exactly the per-tier rule the line
19
+ * above rules out, so the honest output is a named gap the author resolves.
20
+ *
21
+ * With {@link NO_TAXONOMY} recorded — the value for a project that evidences
22
+ * no taxonomy — every plan comes back empty and {@link conformance_lines}
23
+ * returns nothing, so the authoring step's output is byte-identical to what it
24
+ * was before this module existed. Holding to the project's own structures is
25
+ * the standing rule; a project that organises its components some other way
26
+ * must not be able to tell that this module shipped.
27
+ */
28
+ import { NO_TAXONOMY } from './detect.js';
29
+
30
+ /** A component the design brief asks for. */
31
+ export interface ComponentRequest {
32
+ /** The component's name, as the brief writes it. */
33
+ name?: unknown;
34
+ /** The granularity tier the brief assigns it, when it assigns one. */
35
+ tier?: unknown;
36
+ }
37
+
38
+ /** Where one component lands, or why it could not be placed. */
39
+ export interface PlacementPlan {
40
+ /** The component's name as read from the brief. */
41
+ name: string;
42
+ /** The project's own tier name it was matched to, or `null`. */
43
+ tier: string | null;
44
+ /** The directory it belongs in, or `null` when unplaced. */
45
+ directory: string | null;
46
+ /** Why it could not be placed, or `null` when it was. */
47
+ gap: string | null;
48
+ }
49
+
50
+ /** Component root used when the audit recorded none. */
51
+ /**
52
+ * Gap reported when a taxonomy is recorded without the root it lives under.
53
+ *
54
+ * Guessing `src/components` here is the same failure as placing a component in
55
+ * a tier the project does not have, at the other end of the path: a project
56
+ * rooted at `app/components` or `resources/js/components` — both of which the
57
+ * detector searches — would have been handed a directory that does not exist,
58
+ * with no gap and no warning. This module exists so nothing is placed
59
+ * somewhere the project did not choose, so it says so instead.
60
+ */
61
+ export const MISSING_ROOT_GAP =
62
+ 'the audit recorded a taxonomy but no `component_root`, so there is no ' +
63
+ 'directory to place into — re-run the audit, or record the root by hand';
64
+
65
+ /**
66
+ * Plan where each requested component belongs under a recorded taxonomy.
67
+ *
68
+ * @param taxonomy The recorded `state.ui_audit.component_taxonomy` value —
69
+ * the project's own tiers joined with `/`, or {@link NO_TAXONOMY}.
70
+ * @param component_root The recorded component root, relative to the project.
71
+ * @param components The components the design brief asks for.
72
+ */
73
+ export function plan_component_placement(
74
+ taxonomy: string,
75
+ component_root: string,
76
+ components: ReadonlyArray<ComponentRequest>,
77
+ ): PlacementPlan[] {
78
+ const tiers = read_tiers(taxonomy);
79
+ const root = _trim_slashes(component_root);
80
+ return components.map((component) => {
81
+ const name = _text(component.name) || '(unnamed)';
82
+ if (tiers.length === 0) {
83
+ return { name, tier: null, directory: null, gap: null };
84
+ }
85
+ if (root === '') {
86
+ return { name, tier: null, directory: null, gap: `\`${name}\` — ${MISSING_ROOT_GAP}` };
87
+ }
88
+ const hint = _text(component.tier);
89
+ if (hint === '') {
90
+ return {
91
+ name,
92
+ tier: null,
93
+ directory: null,
94
+ gap:
95
+ `\`${name}\` names no granularity tier, and the project's ` +
96
+ `taxonomy \`${taxonomy}\` carries no rule that assigns one ` +
97
+ '— left unplaced for the author to decide',
98
+ };
99
+ }
100
+ const matched = tiers.find((tier) => _normalise(tier) === _normalise(hint));
101
+ if (matched === undefined) {
102
+ return {
103
+ name,
104
+ tier: null,
105
+ directory: null,
106
+ gap:
107
+ `\`${name}\` declares tier \`${hint}\`, which the project's ` +
108
+ `taxonomy \`${taxonomy}\` does not contain — left unplaced ` +
109
+ 'rather than moved somewhere the project did not choose',
110
+ };
111
+ }
112
+ return { name, tier: matched, directory: `${root}/${matched}`, gap: null };
113
+ });
114
+ }
115
+
116
+ /**
117
+ * Split a recorded taxonomy value into the project's own tier names.
118
+ *
119
+ * **The sentinel comparison is case-insensitive, and that is not politeness.**
120
+ * This field is written by an agent following `existing-ui-audit` § 1b, so
121
+ * `'None'` is reachable, and an exact comparison let it through as a
122
+ * one-element tier list: a project with no taxonomy then got a "conforming to
123
+ * `None`" banner and a conformance gap per component — precisely the output
124
+ * AC-2 forbids. It is the one guard standing between a no-taxonomy project and
125
+ * a changed authoring step, so it refuses every spelling of the sentinel.
126
+ */
127
+ export function read_tiers(taxonomy: string): string[] {
128
+ const value = _text(taxonomy);
129
+ if (value === '' || value.toLowerCase() === NO_TAXONOMY) {
130
+ return [];
131
+ }
132
+ return value
133
+ .split('/')
134
+ .map((part) => part.trim())
135
+ .filter((part) => part !== '');
136
+ }
137
+
138
+ /**
139
+ * Render the lines the authoring step says out loud.
140
+ *
141
+ * Empty for {@link NO_TAXONOMY}, which is what keeps a no-taxonomy project's
142
+ * output unchanged.
143
+ */
144
+ export function conformance_lines(
145
+ taxonomy: string,
146
+ component_root: string,
147
+ plans: ReadonlyArray<PlacementPlan>,
148
+ ): string[] {
149
+ if (read_tiers(taxonomy).length === 0) {
150
+ return [];
151
+ }
152
+ const root = _trim_slashes(component_root);
153
+ const under = root === '' ? 'an unrecorded component root' : `\`${root}/\``;
154
+ const lines: string[] = [
155
+ `> Conforming to the project's own component taxonomy ` +
156
+ `\`${taxonomy}\` under ${under} — detected, not imposed. ` +
157
+ 'A component that fits no tier is reported, never relocated.',
158
+ ];
159
+ for (const plan of plans) {
160
+ if (plan.gap === null && plan.directory !== null) {
161
+ lines.push(
162
+ `> - \`${plan.name}\` → \`${plan.directory}/\` (tier \`${plan.tier}\`)`,
163
+ );
164
+ } else if (plan.gap !== null) {
165
+ lines.push(`> - conformance gap: ${plan.gap}`);
166
+ }
167
+ }
168
+ return lines;
169
+ }
170
+
171
+ /** Lower-case and drop a trailing plural `s`, so `Molecule` matches `molecules`. */
172
+ function _normalise(name: string): string {
173
+ const lower = name.trim().toLowerCase();
174
+ return lower.endsWith('s') && lower.length > 2 ? lower.slice(0, -1) : lower;
175
+ }
176
+
177
+ function _text(value: unknown): string {
178
+ return typeof value === 'string' ? value.trim() : '';
179
+ }
180
+
181
+ function _trim_slashes(value: unknown): string {
182
+ return _text(value).replace(/^\/+|\/+$/gu, '');
183
+ }
@@ -1,4 +1,4 @@
1
- #!/usr/bin/env -S node --import tsx
1
+ #!/usr/bin/env tsx
2
2
  /**
3
3
  * Local knowledge ingestion — file walk, redaction, chunking, manifest.
4
4
  *
@@ -1,4 +1,4 @@
1
- #!/usr/bin/env -S node --import tsx
1
+ #!/usr/bin/env tsx
2
2
  // Drive-loop era frozen per ADR-206 (2026-08-03): governing ADRs 068/070-084 are
3
3
  // superseded — subsystem is beta-internal, bugfix-only; no new capability work.
4
4
  /**
@@ -94,7 +94,7 @@ export const REGISTRY = [
94
94
  { name: 'memory:hash', disposition: 'delegate', synopsis: 'Hash a memory entry (YAML or JSON stdin).' },
95
95
  { name: 'memory:check', disposition: 'delegate', synopsis: 'Validate memory YAML schema + staleness.' },
96
96
  { name: 'memory:check-proposal', disposition: 'delegate', synopsis: 'Run the admission gate on a memory proposal.' },
97
- { name: 'memory:learn', disposition: 'delegate', synopsis: 'Aggregate memory intake signals into the local learning sidecar (read-only; --write to emit).' },
97
+ { name: 'memory:learn', disposition: 'delegate', synopsis: 'Aggregate memory intake signals into the local learning sidecar (read-only; --write to emit, --format status for the one-screen view).' },
98
98
  { name: 'analytics', disposition: 'delegate', synopsis: 'Local-only workspace analytics: emit|show|prune|migrate (never leaves the machine).' },
99
99
  { name: 'knowledge', disposition: 'delegate', synopsis: 'Global knowledge-card store: list|show|trace|forget|promote|validate|lead-check|purge.' },
100
100
  { name: 'proposal:check', disposition: 'delegate', synopsis: 'Validate a learning/skill/rule proposal markdown.' },
@@ -1,10 +1,16 @@
1
1
  #!/usr/bin/env tsx
2
2
  import { createRequire as __acCreateRequire } from 'node:module'; const require = globalThis.require ?? __acCreateRequire(import.meta.url);
3
+ import {
4
+ BLOCK_END_RE,
5
+ DEFERRED_RESOLUTION_RE,
6
+ DEFERRED_STEP_RE,
7
+ planCarry
8
+ } from "./chunk-7IQE3D5S.js";
3
9
  import {
4
10
  blocker_is_resolved,
5
11
  collect,
6
12
  parse_blockers
7
- } from "./chunk-QAJS5YWY.js";
13
+ } from "./chunk-PHD7OOLE.js";
8
14
  import "./chunk-ULET4BYS.js";
9
15
  import {
10
16
  isCliEntry
@@ -199,9 +205,6 @@ function _fs_grep_files(root, needle) {
199
205
  walk(root);
200
206
  return hits;
201
207
  }
202
- var DEFERRED_RESOLUTION_RE = /<!--\s*deferred-resolution:\s*(carried-to|merged-into)\s*=\s*([A-Za-z0-9._-]+)\s*-->/;
203
- var DEFERRED_STEP_RE = /^[ \t]*[-*][ \t]+\[~\][ \t]*(.*)$/;
204
- var BLOCK_END_RE = /^[ \t]*[-*][ \t]+\[[ xX~-]\]|^#{1,6}[ \t]/;
205
208
  function _escapeRe(v) {
206
209
  return v.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
207
210
  }
@@ -292,6 +295,7 @@ function deferralProblems(root, rel, text, alsoArchiving = /* @__PURE__ */ new S
292
295
  }
293
296
  function archive_completed(root, opts) {
294
297
  const { changed_only, base, dry_run } = opts;
298
+ const carry = opts.carry ?? true;
295
299
  const roadmap_root = path.join(root, "agents", "roadmaps");
296
300
  if (!_isDir(roadmap_root)) {
297
301
  return [];
@@ -308,8 +312,10 @@ function archive_completed(root, opts) {
308
312
  collect(roadmap_root).filter((s2) => s2.open_ === 0).map((s2) => s2.rel.replace(/\.md$/, ""))
309
313
  );
310
314
  const archived = [];
315
+ const only = opts.only ? opts.only.replace(/^.*\//, "").replace(/\.md$/, "") + ".md" : null;
311
316
  for (const stats of collect(roadmap_root)) {
312
- const roadmapText = fs.readFileSync(path.join(roadmap_root, stats.rel), "utf-8");
317
+ if (only !== null && stats.rel !== only) continue;
318
+ let roadmapText = fs.readFileSync(path.join(roadmap_root, stats.rel), "utf-8");
313
319
  const guarded = parseGuardedBaselines(roadmapText);
314
320
  if (guarded.length > 0) {
315
321
  process.stderr.write(
@@ -325,11 +331,41 @@ function archive_completed(root, opts) {
325
331
  if (stats.open_ !== 0) {
326
332
  continue;
327
333
  }
334
+ const old_rel = `agents/roadmaps/${stats.rel}`;
335
+ let open_blockers = stats.open_blockers.map((b) => b.id);
328
336
  if (stats.deferred !== 0) {
329
337
  const abs = path.join(roadmap_root, stats.rel);
330
338
  const others = new Set(sweepSet);
331
339
  others.delete(stats.rel.replace(/\.md$/, ""));
332
- const problems = deferralProblems(root, stats.rel, fs.readFileSync(abs, "utf-8"), others);
340
+ const inScope = !changed_only || touched.has(old_rel);
341
+ const bare = parseDeferredItems(roadmapText).some((d) => d.kind === null);
342
+ if (carry && inScope && bare) {
343
+ const outcome = planCarry(root, stats.rel, roadmapText, open_blockers, _today(), opts.owner_decision ?? "ask");
344
+ if ("refused" in outcome) {
345
+ process.stderr.write(` \u26A0\uFE0F ${stats.rel}: deferrals not carried \u2014 ${outcome.refused}.
346
+ `);
347
+ } else if (outcome.plan.ownerBlockers.length > 0 && !outcome.plan.parked) {
348
+ process.stdout.write(_ownerDecisionBlock(stats.rel, outcome.plan));
349
+ continue;
350
+ } else {
351
+ const { plan } = outcome;
352
+ process.stdout.write(
353
+ ` \u21AA ${stats.rel}: carried ${plan.carried} deferred step(s)` + (plan.movedBlockers.length > 0 ? ` and blocker(s) ${plan.movedBlockers.join(", ")}` : "") + ` \u2192 ${plan.destRel}
354
+ `
355
+ );
356
+ if (dry_run) {
357
+ archived.push({ roadmap: old_rel, archived_to: `agents/roadmaps/archive/${stats.rel}`, refs_migrated: [] });
358
+ continue;
359
+ }
360
+ fs.mkdirSync(path.dirname(path.join(root, plan.destRel)), { recursive: true });
361
+ fs.writeFileSync(path.join(root, plan.destRel), plan.destText, "utf-8");
362
+ fs.writeFileSync(abs, plan.sourceText, "utf-8");
363
+ _run(["git", "add", "--", plan.destRel, old_rel], root);
364
+ roadmapText = plan.sourceText;
365
+ open_blockers = open_blockers.filter((id) => !plan.movedBlockers.includes(id));
366
+ }
367
+ }
368
+ const problems = deferralProblems(root, stats.rel, roadmapText, others);
333
369
  if (problems.length > 0) {
334
370
  process.stderr.write(
335
371
  ` \u26A0\uFE0F ${stats.rel}: ${problems.length} unresolved deferral(s) \u2014 not archived.
@@ -340,16 +376,14 @@ function archive_completed(root, opts) {
340
376
  continue;
341
377
  }
342
378
  }
343
- const open_blockers = stats.open_blockers;
344
379
  if (open_blockers.length > 0) {
345
- const ids = open_blockers.map((b) => b.id).join(", ");
380
+ const ids = open_blockers.join(", ");
346
381
  process.stderr.write(
347
382
  ` \u26A0\uFE0F ${stats.rel}: all steps closed but ${open_blockers.length} blocker(s) still open (${ids}) \u2014 not archived. Resolve them, or record the decision, then re-run the sweep.
348
383
  `
349
384
  );
350
385
  continue;
351
386
  }
352
- const old_rel = `agents/roadmaps/${stats.rel}`;
353
387
  if (changed_only && !touched.has(old_rel)) {
354
388
  continue;
355
389
  }
@@ -383,6 +417,29 @@ function archive_completed(root, opts) {
383
417
  }
384
418
  return archived;
385
419
  }
420
+ function _ownerDecisionBlock(rel, plan) {
421
+ const ids = plan.ownerBlockers.join(", ");
422
+ const park = `agents/roadmaps/later/${plan.destSlug}.md`;
423
+ const step = plan.firstStep.split("\n").map((l) => ` ${l}`).join("\n");
424
+ const record = {
425
+ roadmap: `agents/roadmaps/${rel}`,
426
+ owner_blockers: plan.ownerBlockers,
427
+ deferred_steps: plan.carried,
428
+ park_to: park,
429
+ archive_command: `./agent-config roadmap:archive --all --owner-decision later --only ${rel}`,
430
+ first_step: plan.firstStep
431
+ };
432
+ return ` \u2753 ${rel}: ${plan.carried} deferred step(s) wait on owner blocker(s) ${ids} \u2014 not archived; the owner decides:
433
+ 1. Archive it \u2014 the steps and their blockers park in ${park}
434
+ (${record.archive_command})
435
+ 2. Work them step by step, starting with:
436
+ ${step}
437
+ OWNER-DECISION ${JSON.stringify(record)}
438
+ `;
439
+ }
440
+ function _today() {
441
+ return (/* @__PURE__ */ new Date()).toISOString().slice(0, 10);
442
+ }
386
443
  function _isDir(p) {
387
444
  try {
388
445
  return fs.statSync(p).isDirectory();
@@ -443,13 +500,16 @@ function _runTwin(root, script) {
443
500
  }
444
501
  var _PROG = "archive_completed_roadmaps.py";
445
502
  function _usage() {
446
- return `usage: ${_PROG} [-h] [--all] [--base BASE] [--dry-run] [--repo-root REPO_ROOT]
503
+ return `usage: ${_PROG} [-h] [--all] [--base BASE] [--dry-run] [--no-carry] [--owner-decision later] [--only ROADMAP] [--repo-root REPO_ROOT]
447
504
  `;
448
505
  }
449
506
  function _parseArgs(argv) {
450
507
  let all = false;
451
508
  let base = "origin/main";
452
509
  let dry_run = false;
510
+ let carry = true;
511
+ let owner_decision = "ask";
512
+ let only = null;
453
513
  let repo_root = null;
454
514
  const emitError = (msg) => {
455
515
  process.stderr.write(_usage());
@@ -469,6 +529,23 @@ function _parseArgs(argv) {
469
529
  } else if (tok === "--dry-run") {
470
530
  dry_run = true;
471
531
  i += 1;
532
+ } else if (tok === "--no-carry") {
533
+ carry = false;
534
+ i += 1;
535
+ } else if (tok === "--only" || tok.startsWith("--only=")) {
536
+ const val = tok.includes("=") ? tok.slice(tok.indexOf("=") + 1) : argv[i + 1];
537
+ if (val === void 0 || val === "") {
538
+ emitError("argument --only: expected one argument");
539
+ }
540
+ only = val;
541
+ i += tok.includes("=") ? 1 : 2;
542
+ } else if (tok === "--owner-decision" || tok.startsWith("--owner-decision=")) {
543
+ const val = tok.includes("=") ? tok.slice(tok.indexOf("=") + 1) : argv[i + 1];
544
+ if (val !== "later" && val !== "ask") {
545
+ emitError("argument --owner-decision: expected 'later' or 'ask'");
546
+ }
547
+ owner_decision = val;
548
+ i += tok.includes("=") ? 1 : 2;
472
549
  } else if (tok === "--base") {
473
550
  const val = argv[i + 1];
474
551
  if (val === void 0) {
@@ -493,7 +570,7 @@ function _parseArgs(argv) {
493
570
  emitError(`unrecognized arguments: ${tok}`);
494
571
  }
495
572
  }
496
- return { all, base, dry_run, repo_root };
573
+ return { all, base, dry_run, carry, owner_decision, only, repo_root };
497
574
  }
498
575
  function main(argv) {
499
576
  const ns = _parseArgs(argv ?? process.argv.slice(2));
@@ -501,7 +578,10 @@ function main(argv) {
501
578
  const archived = archive_completed(root, {
502
579
  changed_only: !ns.all,
503
580
  base: ns.base,
504
- dry_run: ns.dry_run
581
+ dry_run: ns.dry_run,
582
+ carry: ns.carry,
583
+ owner_decision: ns.owner_decision,
584
+ only: ns.only
505
585
  });
506
586
  if (archived.length === 0) {
507
587
  process.stdout.write(" \u2139\uFE0F No completed roadmaps to archive.\n");
@@ -267,7 +267,18 @@ var MERGEABLE_KEYS = [
267
267
  // be followed. Class C, so a user still sets it by hand or through the
268
268
  // GUI; whitelisting decides only whether the value SURVIVES the merge
269
269
  // (ADR-271, road-to-design-intent-conformance 2.3).
270
- "design.fidelity_mode"
270
+ "design.fidelity_mode",
271
+ // `lean_projection.*` is a per-MACHINE setting and the install it governs is
272
+ // a user-scope one: the layer being thinned is `~/.claude/rules`, which
273
+ // belongs to the machine and not to any checkout. Without these two rows a
274
+ // consumer who wrote the opt-in into the user-global file got no error, no
275
+ // warning and no effect — the same silent-filter defect the two entries
276
+ // above repair, reaching a third key, and unsatisfiable-by-construction on
277
+ // an ADR-020 global-only install, where no project layer exists to carry it.
278
+ // Whitelisting decides only whether a value SURVIVES the merge: it sets
279
+ // nothing, and `installerThinsHost` still refuses a template-only value.
280
+ "lean_projection.mode",
281
+ "lean_projection.hosts"
271
282
  ];
272
283
  var TEMPLATE_RELATIVE = path2.join("src", "config", "agent-settings.template.yml");
273
284
  var _PACKAGE_ROOT = path2.resolve(path2.dirname(fileURLToPath(import.meta.url)), "..", "..", "..");
@@ -0,0 +1,90 @@
1
+ import { createRequire as __acCreateRequire } from 'node:module'; const require = globalThis.require ?? __acCreateRequire(import.meta.url);
2
+
3
+ // src/install/plan.ts
4
+ import { createHash } from "node:crypto";
5
+ import { readFileSync, readdirSync, statSync } from "node:fs";
6
+ import { join, relative, resolve } from "node:path";
7
+ function sha256File(path) {
8
+ try {
9
+ const data = readFileSync(path);
10
+ return createHash("sha256").update(data).digest("hex");
11
+ } catch {
12
+ return null;
13
+ }
14
+ }
15
+ function fileEntry(path, kind, options) {
16
+ return {
17
+ path,
18
+ kind,
19
+ sha256: options.hashContent ? sha256File(path) : null
20
+ };
21
+ }
22
+ function walkSourceTree(dir) {
23
+ const out = [];
24
+ walkInto(dir, out);
25
+ return out;
26
+ }
27
+ function walkInto(dir, out) {
28
+ let entries;
29
+ try {
30
+ entries = readdirSync(dir).sort();
31
+ } catch {
32
+ return;
33
+ }
34
+ for (const name of entries) {
35
+ const full = join(dir, name);
36
+ let isDir;
37
+ try {
38
+ isDir = statSync(full).isDirectory();
39
+ } catch {
40
+ continue;
41
+ }
42
+ if (isDir) {
43
+ walkInto(full, out);
44
+ } else {
45
+ out.push(full);
46
+ }
47
+ }
48
+ }
49
+ function buildInstallPlan(inputs) {
50
+ const filesByTool = {};
51
+ for (const source of inputs.sources) {
52
+ const bucket = filesByTool[source.toolId] ?? [];
53
+ let files = walkSourceTree(source.srcDir);
54
+ if (source.fileFilter !== void 0) {
55
+ files = files.filter(source.fileFilter);
56
+ }
57
+ for (const srcFile of files) {
58
+ const rel = relative(source.srcDir, srcFile);
59
+ const destPath = resolve(source.destDir, rel);
60
+ bucket.push(
61
+ fileEntry(srcFile, source.kind, {
62
+ hashContent: source.kind !== "bridge"
63
+ })
64
+ );
65
+ bucket[bucket.length - 1] = {
66
+ ...bucket[bucket.length - 1],
67
+ path: destPath
68
+ };
69
+ }
70
+ filesByTool[source.toolId] = bucket;
71
+ }
72
+ for (const source of inputs.sources) {
73
+ if (!(source.toolId in filesByTool)) {
74
+ filesByTool[source.toolId] = [];
75
+ }
76
+ }
77
+ return {
78
+ version: 2,
79
+ target: inputs.target,
80
+ root: inputs.root,
81
+ filesByTool,
82
+ mergedKeysByTool: {},
83
+ policy: inputs.policy
84
+ };
85
+ }
86
+
87
+ export {
88
+ sha256File,
89
+ buildInstallPlan
90
+ };