@event4u/agent-config 16.2.0 → 16.4.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 (651) 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 +337 -234
  5. package/README.md +15 -13
  6. package/agents/templates/.ai-council.yml.example +26 -8
  7. package/dist/agent-src/commands/analyze/inbox.md +11 -8
  8. package/dist/agent-src/commands/analyze/roadmap-repos.md +1 -1
  9. package/dist/agent-src/commands/bug/fix.md +17 -2
  10. package/dist/agent-src/commands/bug/investigate.md +1 -1
  11. package/dist/agent-src/commands/commit/in-chunks.md +40 -31
  12. package/dist/agent-src/commands/commit.md +72 -33
  13. package/dist/agent-src/commands/condense.md +2 -8
  14. package/dist/agent-src/commands/council/debate.md +11 -7
  15. package/dist/agent-src/commands/council/default.md +10 -9
  16. package/dist/agent-src/commands/council.md +1 -1
  17. package/dist/agent-src/commands/estimate-ticket.md +1 -1
  18. package/dist/agent-src/commands/feature/explore.md +3 -3
  19. package/dist/agent-src/commands/feature/plan.md +2 -2
  20. package/dist/agent-src/commands/feature/roadmap.md +1 -1
  21. package/dist/agent-src/commands/fix/ci.md +18 -4
  22. package/dist/agent-src/commands/fix/commit-messages.md +48 -23
  23. package/dist/agent-src/commands/fix/pr-comments.md +3 -6
  24. package/dist/agent-src/commands/implement-ticket.md +4 -4
  25. package/dist/agent-src/commands/jira-ticket.md +1 -1
  26. package/dist/agent-src/commands/memory/add.md +4 -16
  27. package/dist/agent-src/commands/memory/load.md +5 -6
  28. package/dist/agent-src/commands/memory/promote.md +3 -16
  29. package/dist/agent-src/commands/mission/upgrade.md +3 -2
  30. package/dist/agent-src/commands/optimize/agents-dir.md +2 -2
  31. package/dist/agent-src/commands/optimize/deep.md +4 -2
  32. package/dist/agent-src/commands/optimize/rtk.md +4 -26
  33. package/dist/agent-src/commands/pr/create/description-only.md +18 -15
  34. package/dist/agent-src/commands/pr/create.md +42 -34
  35. package/dist/agent-src/commands/pr/merge.md +136 -9
  36. package/dist/agent-src/commands/prepare-for-review.md +13 -11
  37. package/dist/agent-src/commands/project/analyze.md +7 -35
  38. package/dist/agent-src/commands/refine-ticket.md +1 -1
  39. package/dist/agent-src/commands/review/changes.md +14 -19
  40. package/dist/agent-src/commands/roadmap/create.md +1 -1
  41. package/dist/agent-src/commands/roadmap/materialize.md +1 -1
  42. package/dist/agent-src/commands/roadmap/next.md +10 -1
  43. package/dist/agent-src/commands/roadmap/process-full.md +56 -42
  44. package/dist/agent-src/commands/roadmap/resolve-blockers.md +411 -0
  45. package/dist/agent-src/commands/roadmap/triage-parked.md +325 -0
  46. package/dist/agent-src/commands/roadmap.md +18 -4
  47. package/dist/agent-src/commands/tests/create.md +17 -3
  48. package/dist/agent-src/commands/tests/execute.md +22 -5
  49. package/dist/agent-src/commands/worktree/create.md +7 -3
  50. package/dist/agent-src/commands/worktree/verify.md +2 -1
  51. package/dist/agent-src/contexts/authority/decision-revisit-gate-enforcement.md +43 -0
  52. package/dist/agent-src/contexts/communication/rules-auto/design-fidelity-enforcement.md +24 -0
  53. package/dist/agent-src/contexts/communication/rules-auto/think-before-action-mechanics.md +5 -3
  54. package/dist/agent-src/contexts/communication/rules-auto/token-efficiency-mechanics.md +7 -9
  55. package/dist/agent-src/contexts/contracts/command-suggestion-flow.md +8 -6
  56. package/dist/agent-src/contexts/contracts/frugality-charter.md +8 -5
  57. package/dist/agent-src/contexts/execution/auto-dispatch-classification.md +7 -7
  58. package/dist/agent-src/contexts/execution/auto-orchestration-activation.md +0 -1
  59. package/dist/agent-src/contexts/execution/evidence-discipline.md +2 -2
  60. package/dist/agent-src/contexts/execution/non-interactive-contract.md +5 -8
  61. package/dist/agent-src/contexts/execution/rdp-gate.md +4 -4
  62. package/dist/agent-src/contexts/execution/roadmap-execution-contract.md +9 -8
  63. package/dist/agent-src/contexts/execution/roadmap-process-loop.md +99 -54
  64. package/dist/agent-src/contexts/execution/session-canary-enforcement-history.md +67 -0
  65. package/dist/agent-src/contexts/execution/subagent-routing.md +8 -8
  66. package/dist/agent-src/contexts/execution/subagent-steering.md +6 -4
  67. package/dist/agent-src/contexts/execution/terminal-states.md +2 -2
  68. package/dist/agent-src/contexts/execution/toolchain-resolver.md +95 -7
  69. package/dist/agent-src/contexts/subagent-configuration.md +1 -1
  70. package/dist/agent-src/guidelines/agent-infra/active-remediation-mechanics.md +39 -0
  71. package/dist/agent-src/guidelines/agent-infra/context-hygiene-mechanics.md +1 -1
  72. package/dist/agent-src/guidelines/agent-infra/cross-source-consistency-mechanics.md +8 -10
  73. package/dist/agent-src/guidelines/agent-infra/frontier-reasoning-operating-profile.md +3 -2
  74. package/dist/agent-src/guidelines/agent-infra/layered-settings.md +13 -1
  75. package/dist/agent-src/guidelines/agent-infra/roadmap-progress-mechanics.md +1 -1
  76. package/dist/agent-src/guidelines/agent-infra/self-improvement-pipeline.md +10 -3
  77. package/dist/agent-src/guidelines/agent-infra/size-and-scope.md +36 -0
  78. package/dist/agent-src/guidelines/php/git.md +15 -2
  79. package/dist/agent-src/rules/active-remediation.md +1 -2
  80. package/dist/agent-src/rules/analysis-skill-routing.md +0 -1
  81. package/dist/agent-src/rules/architecture.md +0 -1
  82. package/dist/agent-src/rules/artifact-drafting-protocol.md +0 -1
  83. package/dist/agent-src/rules/artifact-engagement-recording.md +0 -1
  84. package/dist/agent-src/rules/augment-edit-discipline.md +0 -1
  85. package/dist/agent-src/rules/autonomous-execution.md +1 -1
  86. package/dist/agent-src/rules/brand-consistency.md +0 -1
  87. package/dist/agent-src/rules/brand-source-of-truth.md +0 -1
  88. package/dist/agent-src/rules/broken-access-control.md +1 -1
  89. package/dist/agent-src/rules/cli-output-handling.md +0 -1
  90. package/dist/agent-src/rules/code-comment-discipline.md +0 -1
  91. package/dist/agent-src/rules/code-provenance.md +0 -1
  92. package/dist/agent-src/rules/command-suggestion-policy.md +1 -1
  93. package/dist/agent-src/rules/commit-conventions.md +1 -2
  94. package/dist/agent-src/rules/communication-through-line.md +1 -2
  95. package/dist/agent-src/rules/content-quoting-floor.md +1 -2
  96. package/dist/agent-src/rules/context-hygiene.md +6 -6
  97. package/dist/agent-src/rules/copilot-routing.md +1 -2
  98. package/dist/agent-src/rules/council-availability.md +4 -4
  99. package/dist/agent-src/rules/cross-source-consistency.md +4 -6
  100. package/dist/agent-src/rules/decision-revisit-gate.md +17 -35
  101. package/dist/agent-src/rules/delegation-policy.md +2 -3
  102. package/dist/agent-src/rules/design-fidelity.md +12 -16
  103. package/dist/agent-src/rules/design-review-after-ui-write.md +3 -3
  104. package/dist/agent-src/rules/devcontainer-routing.md +1 -2
  105. package/dist/agent-src/rules/doc-screenshot-hygiene.md +1 -1
  106. package/dist/agent-src/rules/docker-commands.md +0 -1
  107. package/dist/agent-src/rules/domain-adoption-policy.md +0 -1
  108. package/dist/agent-src/rules/domain-safety-disclaimer.md +1 -1
  109. package/dist/agent-src/rules/domain-safety-pii.md +1 -1
  110. package/dist/agent-src/rules/domain-safety-retention.md +1 -1
  111. package/dist/agent-src/rules/downstream-changes.md +0 -1
  112. package/dist/agent-src/rules/engineering-safety-floor.md +1 -1
  113. package/dist/agent-src/rules/evaluator-independence.md +3 -2
  114. package/dist/agent-src/rules/external-code-graph-interop.md +0 -1
  115. package/dist/agent-src/rules/external-reference-deep-dive.md +0 -1
  116. package/dist/agent-src/rules/fast-path-marker-visibility.md +2 -2
  117. package/dist/agent-src/rules/finance-safety-floor.md +1 -1
  118. package/dist/agent-src/rules/fix-what-you-see.md +6 -32
  119. package/dist/agent-src/rules/framework-neutrality-in-generic-skills.md +0 -1
  120. package/dist/agent-src/rules/git-history-discipline.md +2 -2
  121. package/dist/agent-src/rules/guidelines.md +0 -1
  122. package/dist/agent-src/rules/history-discipline.md +0 -1
  123. package/dist/agent-src/rules/icon-consistency.md +0 -1
  124. package/dist/agent-src/rules/image-likeness-and-rights.md +1 -1
  125. package/dist/agent-src/rules/improve-before-implement.md +0 -1
  126. package/dist/agent-src/rules/invite-challenge.md +0 -1
  127. package/dist/agent-src/rules/laravel-routing.md +1 -2
  128. package/dist/agent-src/rules/laravel-translations.md +0 -1
  129. package/dist/agent-src/rules/legal-safety-floor.md +3 -3
  130. package/dist/agent-src/rules/lethal-trifecta-guard.md +1 -1
  131. package/dist/agent-src/rules/linked-projects-onboarding-gate.md +0 -1
  132. package/dist/agent-src/rules/low-impact-corpus-privacy-floor.md +1 -1
  133. package/dist/agent-src/rules/markdown-safe-codeblocks.md +0 -1
  134. package/dist/agent-src/rules/media-governance-routing.md +13 -17
  135. package/dist/agent-src/rules/media-sync-ground-truth.md +0 -1
  136. package/dist/agent-src/rules/minimal-safe-diff.md +0 -1
  137. package/dist/agent-src/rules/missing-skill-recovery.md +0 -1
  138. package/dist/agent-src/rules/missing-tool-handling.md +0 -1
  139. package/dist/agent-src/rules/model-recommendation.md +0 -1
  140. package/dist/agent-src/rules/neighbour-precedence.md +64 -0
  141. package/dist/agent-src/rules/no-attribution-footers.md +0 -1
  142. package/dist/agent-src/rules/no-decorative-emojis-in-git-surfaces.md +0 -1
  143. package/dist/agent-src/rules/no-pr-progress-comments.md +0 -1
  144. package/dist/agent-src/rules/no-roadmap-references.md +0 -1
  145. package/dist/agent-src/rules/notes-first-reasoning.md +0 -1
  146. package/dist/agent-src/rules/onboarding-gate.md +0 -1
  147. package/dist/agent-src/rules/output-discipline.md +0 -1
  148. package/dist/agent-src/rules/package-ci-checks.md +0 -1
  149. package/dist/agent-src/rules/persona-governance.md +4 -5
  150. package/dist/agent-src/rules/php-coding.md +0 -1
  151. package/dist/agent-src/rules/prefer-enums-over-literals.md +0 -1
  152. package/dist/agent-src/rules/preservation-guard.md +0 -1
  153. package/dist/agent-src/rules/provider-lifecycle-discipline.md +3 -4
  154. package/dist/agent-src/rules/question-not-instruction.md +1 -1
  155. package/dist/agent-src/rules/reviewer-awareness.md +0 -1
  156. package/dist/agent-src/rules/roadmap-ci-steps-policy.md +0 -1
  157. package/dist/agent-src/rules/roadmap-progress-sync.md +4 -7
  158. package/dist/agent-src/rules/role-mode-adherence.md +0 -1
  159. package/dist/agent-src/rules/rule-type-governance.md +0 -1
  160. package/dist/agent-src/rules/runtime-safety.md +1 -1
  161. package/dist/agent-src/rules/scale-discipline.md +0 -1
  162. package/dist/agent-src/rules/secret-vcs-guard.md +1 -1
  163. package/dist/agent-src/rules/security-sensitive-stop.md +3 -3
  164. package/dist/agent-src/rules/self-repair-loop.md +0 -1
  165. package/dist/agent-src/rules/senior-engineering-discipline.md +0 -1
  166. package/dist/agent-src/rules/session-canary.md +7 -62
  167. package/dist/agent-src/rules/settings-ask-protocol.md +6 -6
  168. package/dist/agent-src/rules/size-enforcement.md +0 -1
  169. package/dist/agent-src/rules/skill-improvement-trigger.md +2 -3
  170. package/dist/agent-src/rules/skill-quality.md +0 -1
  171. package/dist/agent-src/rules/slash-command-routing-policy.md +0 -1
  172. package/dist/agent-src/rules/source-confidentiality.md +1 -1
  173. package/dist/agent-src/rules/source-discovery-gate.md +0 -1
  174. package/dist/agent-src/rules/source-of-truth.md +0 -1
  175. package/dist/agent-src/rules/spreadsheet-source-quality.md +1 -2
  176. package/dist/agent-src/rules/strategy-safety-floor.md +1 -1
  177. package/dist/agent-src/rules/symfony-routing.md +1 -2
  178. package/dist/agent-src/rules/think-before-action.md +0 -1
  179. package/dist/agent-src/rules/token-budget-discipline.md +12 -46
  180. package/dist/agent-src/rules/token-efficiency.md +0 -1
  181. package/dist/agent-src/rules/token-optimizer-maintenance.md +0 -1
  182. package/dist/agent-src/rules/tool-safety.md +1 -1
  183. package/dist/agent-src/rules/ui-audit-gate.md +1 -2
  184. package/dist/agent-src/rules/untrusted-input-defense.md +1 -1
  185. package/dist/agent-src/rules/upstream-proposal.md +0 -1
  186. package/dist/agent-src/rules/user-interaction.md +0 -1
  187. package/dist/agent-src/rules/user-interrupt-priority.md +1 -1
  188. package/dist/agent-src/scripts/archive_completed_roadmaps.ts +115 -20
  189. package/dist/agent-src/scripts/deferral_carry.ts +339 -0
  190. package/dist/agent-src/scripts/gate_budget.ts +47 -23
  191. package/dist/agent-src/scripts/gate_execute.ts +12 -4
  192. package/dist/agent-src/scripts/update_roadmap_progress.ts +4 -1
  193. package/dist/agent-src/skills/ai-council/SKILL.md +7 -4
  194. package/dist/agent-src/skills/ai-council/references/cost-and-redaction.md +21 -11
  195. package/dist/agent-src/skills/ai-council/references/procedure.md +12 -6
  196. package/dist/agent-src/skills/analysis-autonomous-mode/SKILL.md +1 -1
  197. package/dist/agent-src/skills/api-design/data/manifest.json +2 -2
  198. package/dist/agent-src/skills/api-testing/SKILL.md +17 -0
  199. package/dist/agent-src/skills/bug-analyzer/SKILL.md +1 -1
  200. package/dist/agent-src/skills/code-intelligence/SKILL.md +14 -2
  201. package/dist/agent-src/skills/command-routing/SKILL.md +3 -4
  202. package/dist/agent-src/skills/conventional-commits-writing/SKILL.md +127 -139
  203. package/dist/agent-src/skills/corpus-grounding/ATTRIBUTION.md +39 -0
  204. package/dist/agent-src/skills/corpus-grounding/SKILL.md +8 -2
  205. package/dist/agent-src/skills/database/data/manifest.json +2 -2
  206. package/dist/agent-src/skills/database/data/query-tuning.csv +13 -13
  207. package/dist/agent-src/skills/design-system-capture/SKILL.md +0 -3
  208. package/dist/agent-src/skills/design-system-capture/references/import-procedure.md +1 -1
  209. package/dist/agent-src/skills/estimate-ticket/SKILL.md +1 -1
  210. package/dist/agent-src/skills/existing-ui-audit/SKILL.md +2 -2
  211. package/dist/agent-src/skills/fe-design/SKILL.md +1 -1
  212. package/dist/agent-src/skills/feature-planning/SKILL.md +1 -1
  213. package/dist/agent-src/skills/git-workflow/SKILL.md +44 -44
  214. package/dist/agent-src/skills/git-workflow/references/branch-update.md +312 -0
  215. package/dist/agent-src/skills/git-workflow/references/commit-subject.md +205 -0
  216. package/dist/agent-src/skills/iconography/SKILL.md +1 -1
  217. package/dist/agent-src/skills/jira-integration/SKILL.md +3 -3
  218. package/dist/agent-src/skills/js-library-packaging/SKILL.md +2 -2
  219. package/dist/agent-src/skills/merge-conflicts/SKILL.md +10 -4
  220. package/dist/agent-src/skills/monorepo-workspace/SKILL.md +1 -1
  221. package/dist/agent-src/skills/po-discovery/SKILL.md +1 -1
  222. package/dist/agent-src/skills/quality-tools/SKILL.md +11 -1
  223. package/dist/agent-src/skills/quality-tools/references/go-tools.md +76 -0
  224. package/dist/agent-src/skills/quality-tools/references/python-tools.md +104 -0
  225. package/dist/agent-src/skills/refine-ticket/SKILL.md +4 -4
  226. package/dist/agent-src/skills/review-routing/SKILL.md +2 -2
  227. package/dist/agent-src/skills/roadmap-writing/SKILL.md +2 -2
  228. package/dist/agent-src/skills/skill-improvement-pipeline/SKILL.md +5 -3
  229. package/dist/agent-src/skills/source-discovery/SKILL.md +1 -1
  230. package/dist/agent-src/skills/storybook-workshop/SKILL.md +3 -3
  231. package/dist/agent-src/skills/tailwind-engineer/SKILL.md +4 -2
  232. package/dist/agent-src/skills/test-case-discovery/SKILL.md +7 -0
  233. package/dist/agent-src/skills/test-driven-development/SKILL.md +17 -0
  234. package/dist/agent-src/skills/test-performance/SKILL.md +19 -1
  235. package/dist/agent-src/skills/testing-anti-patterns/SKILL.md +1 -1
  236. package/dist/agent-src/skills/ui-component-architect/SKILL.md +2 -2
  237. package/dist/agent-src/skills/using-git-worktrees/SKILL.md +1 -1
  238. package/dist/agent-src/skills/verify-repair-loop/SKILL.md +2 -2
  239. package/dist/agent-src/templates/AGENTS.md +1 -1
  240. package/dist/agent-src/templates/agent-settings.md +46 -129
  241. package/dist/agent-src/templates/agents/agent-project-settings.example.yml +3 -3
  242. package/dist/agent-src/templates/command.md +2 -2
  243. package/dist/agent-src/templates/roadmaps.md +6 -1
  244. package/dist/agent-src/templates/scripts/work_engine/_lib/agent_settings.ts +0 -6
  245. package/dist/agent-src/templates/scripts/work_engine/directives/backend/_self_fix.ts +11 -7
  246. package/dist/agent-src/templates/scripts/work_engine/directives/ui/apply.ts +48 -6
  247. package/dist/agent-src/templates/scripts/work_engine/hooks/builtin/decision_trace.ts +3 -2
  248. package/dist/agent-src/templates/scripts/work_engine/hooks/builtin/memory_visibility.ts +2 -1
  249. package/dist/agent-src/templates/scripts/work_engine/hooks/settings.ts +0 -6
  250. package/dist/agent-src/templates/scripts/work_engine/scoring/decision_engine.ts +9 -12
  251. package/dist/agent-src/templates/scripts/work_engine/scoring/memory_visibility.ts +2 -1
  252. package/dist/agent-src/templates/scripts/work_engine/stack/runner.ts +774 -109
  253. package/dist/agent-src/templates/skill.md +1 -1
  254. package/dist/cli/registry.js +2 -1
  255. package/dist/cli-delegate/archive_completed_roadmaps.js +92 -12
  256. package/dist/cli-delegate/check_update_banner.js +207 -120
  257. package/dist/cli-delegate/chunk-523HCFYO.js +90 -0
  258. package/dist/cli-delegate/{chunk-FP36SWJD.js → chunk-5GPULQBE.js} +2797 -338
  259. package/dist/cli-delegate/{chunk-IGD6ERX6.js → chunk-6SRJTYJS.js} +42 -176
  260. package/dist/cli-delegate/chunk-6V5FMA3P.js +186 -0
  261. package/dist/cli-delegate/{chunk-M2DPGFZ4.js → chunk-6V6TA25H.js} +22 -152
  262. package/dist/cli-delegate/chunk-6YQC2HLF.js +415 -0
  263. package/dist/cli-delegate/{chunk-E4XIZDIB.js → chunk-7HKRE54K.js} +1 -64
  264. package/dist/cli-delegate/chunk-7IQE3D5S.js +191 -0
  265. package/dist/cli-delegate/{chunk-YJ72UIAK.js → chunk-AED2VQGM.js} +1245 -249
  266. package/dist/cli-delegate/{chunk-7HQ52DHU.js → chunk-AL3RZ22D.js} +1 -1
  267. package/dist/cli-delegate/chunk-DEIV7XP7.js +108 -0
  268. package/dist/cli-delegate/{chunk-DBH4AHDK.js → chunk-ED7KCMLB.js} +9 -11
  269. package/dist/cli-delegate/chunk-F3QDG2GT.js +2569 -0
  270. package/dist/cli-delegate/{chunk-6KFEC3G7.js → chunk-G5VVIZRC.js} +3 -3
  271. package/dist/cli-delegate/{chunk-FC75PGJE.js → chunk-H76PHZBI.js} +149 -61
  272. package/dist/cli-delegate/chunk-IAYTIIQW.js +67 -0
  273. package/dist/cli-delegate/chunk-JQOM7TTM.js +1201 -0
  274. package/dist/cli-delegate/chunk-KB5FZ655.js +208 -0
  275. package/dist/cli-delegate/{chunk-7RQP4UDH.js → chunk-KR6EM23A.js} +235 -1455
  276. package/dist/cli-delegate/{chunk-LTYVIY76.js → chunk-KXXWJTDO.js} +6 -11
  277. package/dist/cli-delegate/{chunk-T7L2QK3K.js → chunk-LQOCRFWT.js} +1 -1
  278. package/dist/cli-delegate/{chunk-6KM6ORRY.js → chunk-MDPPKQCQ.js} +58 -9
  279. package/dist/cli-delegate/{chunk-4XFP2Y3E.js → chunk-MSUL5NYP.js} +5 -5
  280. package/dist/cli-delegate/chunk-OAFSJBHH.js +272 -0
  281. package/dist/cli-delegate/{chunk-4E2W63DA.js → chunk-OKJUIAPS.js} +62 -1
  282. package/dist/cli-delegate/{chunk-QAJS5YWY.js → chunk-PHD7OOLE.js} +2 -1
  283. package/dist/cli-delegate/{chunk-P6ZHP5W2.js → chunk-PWX7CKMD.js} +4 -4
  284. package/dist/cli-delegate/{chunk-NDJLNC6Q.js → chunk-T6BP34WI.js} +1 -0
  285. package/dist/cli-delegate/{chunk-7XGBX6ZH.js → chunk-T7XSJSUQ.js} +1144 -589
  286. package/dist/cli-delegate/chunk-ULQRUR23.js +208 -0
  287. package/dist/cli-delegate/chunk-WQWXGIWB.js +1779 -0
  288. package/dist/cli-delegate/{chunk-RGNIWTEA.js → chunk-XQTPXKFA.js} +1 -1
  289. package/dist/cli-delegate/{chunk-NUHLI2RX.js → chunk-YCU3TIXH.js} +2 -0
  290. package/dist/cli-delegate/chunk-ZBZV2G5R.js +210 -0
  291. package/dist/cli-delegate/{chunk-WGXTVKCQ.js → chunk-ZUZKZYCN.js} +5 -3
  292. package/dist/cli-delegate/cmd_analyze_session.js +223 -43
  293. package/dist/cli-delegate/cmd_brand_status.js +3 -2
  294. package/dist/cli-delegate/cmd_conformance.js +1252 -249
  295. package/dist/cli-delegate/cmd_converge.js +3 -3
  296. package/dist/cli-delegate/cmd_doctor.js +19 -9
  297. package/dist/cli-delegate/cmd_doctor_neighbours.js +30 -0
  298. package/dist/cli-delegate/cmd_explain.js +45 -21
  299. package/dist/cli-delegate/cmd_export.js +13 -10
  300. package/dist/cli-delegate/cmd_fleet.js +3 -3
  301. package/dist/cli-delegate/cmd_git_convention.js +1851 -0
  302. package/dist/cli-delegate/cmd_handoff.js +44 -22
  303. package/dist/cli-delegate/cmd_mcp_available.js +3 -2
  304. package/dist/cli-delegate/cmd_memory_get.js +3 -1
  305. package/dist/cli-delegate/cmd_migrate.js +3 -3
  306. package/dist/cli-delegate/cmd_packs_active.js +5 -4
  307. package/dist/cli-delegate/cmd_preflight.js +6 -6
  308. package/dist/cli-delegate/cmd_prune.js +14 -11
  309. package/dist/cli-delegate/cmd_refresh.js +2 -1
  310. package/dist/cli-delegate/cmd_route_audit.js +10 -8
  311. package/dist/cli-delegate/cmd_route_explain.js +4 -4
  312. package/dist/cli-delegate/cmd_session_recycle.js +10 -7
  313. package/dist/cli-delegate/cmd_settings_check.js +54 -7
  314. package/dist/cli-delegate/cmd_settings_get.js +18 -8
  315. package/dist/cli-delegate/cmd_settings_migrate.js +13 -10
  316. package/dist/cli-delegate/cmd_settings_set.js +4 -4
  317. package/dist/cli-delegate/cmd_sync.js +14 -11
  318. package/dist/cli-delegate/cmd_uninstall.js +15 -12
  319. package/dist/cli-delegate/cmd_update.js +7 -7
  320. package/dist/cli-delegate/cmd_upgrade.js +9 -8
  321. package/dist/cli-delegate/cmd_validate.js +15 -12
  322. package/dist/cli-delegate/cmd_versions.js +5 -5
  323. package/dist/cli-delegate/deferral_carry.js +16 -0
  324. package/dist/cli-delegate/gate_budget.js +1 -1
  325. package/dist/cli-delegate/gate_execute.js +3 -3
  326. package/dist/cli-delegate/roadmap_gates.js +6 -6
  327. package/dist/cli-delegate/update_roadmap_progress.js +1 -1
  328. package/dist/discovery/deprecation-report.md +1 -1
  329. package/dist/discovery/discovery-manifest.json +232 -141
  330. package/dist/discovery/discovery-manifest.json.sha256 +1 -1
  331. package/dist/discovery/discovery-manifest.summary.md +3 -3
  332. package/dist/discovery/dormancy-report.md +1 -1
  333. package/dist/discovery/orphan-report.md +1 -1
  334. package/dist/discovery/packs.json +26 -9
  335. package/dist/discovery/trust-report.md +3 -3
  336. package/dist/discovery/workspaces.json +7 -4
  337. package/dist/hooks/dispatch.js +5655 -6623
  338. package/dist/hooks/dispatch.sha256 +1 -1
  339. package/dist/install/claudePathsPlan.js +47 -6
  340. package/dist/install/claudeRuleRewrite.js +7 -0
  341. package/dist/install/emit_host_rules_cli.js +39 -36
  342. package/dist/install/globalRuleScope.js +87 -0
  343. package/dist/install/host_rule_ownership.js +160 -0
  344. package/dist/install/install.mjs +2336 -1249
  345. package/dist/install/installThinLayer.js +289 -0
  346. package/dist/install/installedRuleLinks.js +262 -0
  347. package/dist/install/wizard-plan.js +24 -0
  348. package/dist/mcp/awesome-mcp-servers.row.md +1 -1
  349. package/dist/mcp/mcp-cloudflare-catalogue.json +2 -2
  350. package/dist/mcp/registry-manifest.json +5 -5
  351. package/dist/mcp/server.json +2 -2
  352. package/dist/mcp/server.mjs +36504 -30986
  353. package/dist/router.json +1 -1
  354. package/dist/scripts/_lib/agent_settings.js +26 -120
  355. package/dist/scripts/_lib/claude_settings_hooks.js +10 -8
  356. package/dist/scripts/_lib/compile_time_toggles.js +12 -21
  357. package/dist/scripts/_lib/git_convention.js +232 -0
  358. package/dist/scripts/_lib/global_deploy_inventory.js +730 -0
  359. package/dist/scripts/_lib/installed_layer.js +704 -0
  360. package/dist/scripts/_lib/lean_projection_mode.js +218 -15
  361. package/dist/scripts/_lib/package_root.js +68 -0
  362. package/dist/scripts/_lib/rule_consequence_class.js +45 -0
  363. package/dist/scripts/_lib/rule_injection.js +67 -10
  364. package/dist/scripts/_lib/rule_law_section.js +122 -0
  365. package/dist/scripts/_lib/settings_removed_keys.js +168 -0
  366. package/dist/scripts/_lib/thin_rules.js +535 -0
  367. package/dist/scripts/_lib/windsurf_render.js +60 -0
  368. package/dist/scripts/condense.js +14 -26
  369. package/dist/scripts/project_thin_rules.js +14 -294
  370. package/dist/server/app.js +2 -1
  371. package/dist/server/gitKeysGate.js +105 -0
  372. package/dist/server/routes/settings.js +67 -8
  373. package/dist/server/routes/wizard.js +4 -0
  374. package/dist/server/schemas/settings.js +29 -81
  375. package/dist/shared/skillRanking.js +103 -16
  376. package/dist/ui/assets/{index-Cwq4d0hX.js → index-C3djEJah.js} +2 -2
  377. package/dist/ui/index.html +1 -1
  378. package/docs/MIGRATION.md +72 -1
  379. package/docs/contracts/settings-classes.md +39 -67
  380. package/docs/guidelines/agent-infra/active-remediation-mechanics.md +39 -0
  381. package/docs/guidelines/agent-infra/context-hygiene-mechanics.md +1 -1
  382. package/docs/guidelines/agent-infra/cross-source-consistency-mechanics.md +8 -10
  383. package/docs/guidelines/agent-infra/frontier-reasoning-operating-profile.md +3 -2
  384. package/docs/guidelines/agent-infra/layered-settings.md +13 -1
  385. package/docs/guidelines/agent-infra/roadmap-progress-mechanics.md +1 -1
  386. package/docs/guidelines/agent-infra/self-improvement-pipeline.md +10 -3
  387. package/docs/guidelines/agent-infra/size-and-scope.md +36 -0
  388. package/docs/guidelines/php/git.md +15 -2
  389. package/package.json +1 -1
  390. package/src/agent-src/scripts/archive_completed_roadmaps.ts +115 -20
  391. package/src/agent-src/scripts/deferral_carry.ts +339 -0
  392. package/src/agent-src/scripts/gate_budget.ts +47 -23
  393. package/src/agent-src/scripts/gate_execute.ts +12 -4
  394. package/src/agent-src/scripts/update_roadmap_progress.ts +4 -1
  395. package/src/agent-src/templates/AGENTS.md +1 -1
  396. package/src/agent-src/templates/scripts/work_engine/_lib/agent_settings.ts +0 -6
  397. package/src/agent-src/templates/scripts/work_engine/directives/backend/_self_fix.ts +11 -7
  398. package/src/agent-src/templates/scripts/work_engine/directives/ui/apply.ts +48 -6
  399. package/src/agent-src/templates/scripts/work_engine/hooks/builtin/decision_trace.ts +3 -2
  400. package/src/agent-src/templates/scripts/work_engine/hooks/builtin/memory_visibility.ts +2 -1
  401. package/src/agent-src/templates/scripts/work_engine/hooks/settings.ts +0 -6
  402. package/src/agent-src/templates/scripts/work_engine/scoring/decision_engine.ts +9 -12
  403. package/src/agent-src/templates/scripts/work_engine/scoring/memory_visibility.ts +2 -1
  404. package/src/agent-src/templates/scripts/work_engine/stack/runner.ts +774 -109
  405. package/src/config/agent-settings.template.yml +141 -334
  406. package/src/config/agents-paths.yml +16 -0
  407. package/src/config/assurance-capability-registry.json +7 -3
  408. package/src/config/ci-local-parity.yml +3 -0
  409. package/src/config/continuity-surface.json +10 -3
  410. package/src/config/discovery/packs.yml +17 -1
  411. package/src/config/evaluator-budgets.json +23 -10
  412. package/src/config/gate-coverage.yml +138 -3
  413. package/src/config/gate-violation-baselines.json +64 -16
  414. package/src/config/gitignore-block.txt +19 -0
  415. package/src/config/hook-bundle-budget.json +25 -0
  416. package/src/config/hook-token-budget.json +6 -1
  417. package/src/config/host-instruction-limits.json +33 -0
  418. package/src/config/release-gate-locality.yml +2 -1
  419. package/src/config/routing-coverage-seed.json +67 -4
  420. package/src/config/rule-activation-census.json +7 -3
  421. package/src/config/rule-consequence-class.json +161 -0
  422. package/src/config/rule-law-ceilings.json +105 -0
  423. package/src/config/rule-obligations.json +833 -0
  424. package/src/install/claudePathsPlan.ts +46 -4
  425. package/src/install/claudeRuleRewrite.ts +10 -1
  426. package/src/install/emit_host_rules_cli.ts +43 -34
  427. package/src/install/globalRuleScope.ts +109 -0
  428. package/src/install/host_rule_ownership.ts +170 -0
  429. package/src/install/installThinLayer.ts +378 -0
  430. package/src/install/installedRuleLinks.ts +308 -0
  431. package/src/install/wizard-plan.ts +24 -0
  432. package/src/scripts/_cli/cmd_analyze_session.ts +9 -15
  433. package/src/scripts/_cli/cmd_conformance.ts +13 -2
  434. package/src/scripts/_cli/cmd_doctor.ts +33 -81
  435. package/src/scripts/_cli/cmd_doctor_neighbours.ts +426 -0
  436. package/src/scripts/_cli/cmd_explain.ts +72 -14
  437. package/src/scripts/_cli/cmd_git_convention.ts +637 -0
  438. package/src/scripts/_cli/cmd_settings_check.ts +66 -8
  439. package/src/scripts/_cli/cmd_settings_get.ts +18 -3
  440. package/src/scripts/_cli/doctor_execution.ts +72 -1
  441. package/src/scripts/_dispatch.bash +53 -4
  442. package/src/scripts/_lib/agent_settings.ts +26 -124
  443. package/src/scripts/_lib/blocked_by_marker.ts +1 -1
  444. package/src/scripts/_lib/claude_settings_hooks.ts +10 -8
  445. package/src/scripts/_lib/compile_time_toggles.ts +12 -21
  446. package/src/scripts/_lib/dispatch_import_closure.ts +163 -0
  447. package/src/scripts/_lib/estate_offsets.ts +241 -0
  448. package/src/scripts/_lib/exemption_shape.ts +143 -0
  449. package/src/scripts/_lib/fnv.ts +23 -0
  450. package/src/scripts/_lib/foreign_scan.ts +106 -0
  451. package/src/scripts/_lib/git_base_ref.ts +92 -0
  452. package/src/scripts/_lib/git_convention.ts +291 -0
  453. package/src/scripts/_lib/git_convention_carrier.ts +389 -0
  454. package/src/scripts/_lib/git_convention_grammar.ts +246 -0
  455. package/src/scripts/_lib/git_convention_measure.ts +344 -0
  456. package/src/scripts/_lib/gitignore_block.ts +314 -0
  457. package/src/scripts/_lib/global_deploy_inventory.ts +106 -0
  458. package/src/scripts/_lib/graph_feeder_record.ts +437 -0
  459. package/src/scripts/_lib/hook_settings.ts +73 -0
  460. package/src/scripts/_lib/host_capability.ts +40 -19
  461. package/src/scripts/_lib/host_hook_merge.ts +165 -0
  462. package/src/scripts/_lib/installed_layer.ts +963 -0
  463. package/src/scripts/_lib/json_merge.ts +82 -0
  464. package/src/scripts/_lib/json_pointers.ts +93 -11
  465. package/src/scripts/_lib/knowledge_global.ts +14 -1
  466. package/src/scripts/_lib/lean_projection_mode.ts +275 -15
  467. package/src/scripts/_lib/machine_wake.ts +16 -3
  468. package/src/scripts/_lib/module_reach.ts +456 -0
  469. package/src/scripts/_lib/neighbour_census.ts +760 -0
  470. package/src/scripts/_lib/neighbour_contradictions.ts +236 -0
  471. package/src/scripts/_lib/neighbour_scan.ts +122 -0
  472. package/src/scripts/_lib/neighbour_tool_use.ts +187 -0
  473. package/src/scripts/_lib/prompt_shape.ts +46 -0
  474. package/src/scripts/_lib/ratification_artifact.ts +220 -1
  475. package/src/scripts/_lib/ratification_subject.ts +92 -0
  476. package/src/scripts/_lib/release_findings_ingest.ts +15 -7
  477. package/src/scripts/_lib/release_highlights.ts +5 -0
  478. package/src/scripts/_lib/release_migration_gate.ts +19 -3
  479. package/src/scripts/_lib/reserved_name_sweep.ts +73 -0
  480. package/src/scripts/_lib/review_coverage.ts +134 -0
  481. package/src/scripts/_lib/rule_consequence_class.ts +71 -0
  482. package/src/scripts/_lib/rule_injection.ts +130 -10
  483. package/src/scripts/_lib/rule_law_section.ts +147 -0
  484. package/src/scripts/_lib/rule_layer_overlap.ts +58 -0
  485. package/src/scripts/_lib/rule_obligations.ts +205 -0
  486. package/src/scripts/_lib/self_repair.ts +1 -1
  487. package/src/scripts/_lib/settings_removed_keys.ts +173 -0
  488. package/src/scripts/_lib/skill_origin.ts +254 -0
  489. package/src/scripts/_lib/structured_ask.ts +64 -21
  490. package/src/scripts/_lib/test_red_state.ts +5 -0
  491. package/src/scripts/_lib/thin_rules.ts +620 -0
  492. package/src/scripts/_lib/touched_file_quality.ts +570 -0
  493. package/src/scripts/_lib/turn_end_refusals.ts +77 -2
  494. package/src/scripts/_lib/windsurf_render.ts +63 -0
  495. package/src/scripts/_lib/worker_budget.ts +1 -1
  496. package/src/scripts/adr/regenerate_index.ts +16 -1
  497. package/src/scripts/ai_council/cli_call_budget.ts +13 -5
  498. package/src/scripts/ai_council/clients.ts +26 -57
  499. package/src/scripts/ai_council/config.ts +8 -8
  500. package/src/scripts/ai_council/modification_review.ts +100 -0
  501. package/src/scripts/ai_council/modification_review_questions.ts +90 -0
  502. package/src/scripts/ai_council/orchestrator.ts +5 -5
  503. package/src/scripts/ai_council/spend_gate.ts +18 -7
  504. package/src/scripts/ai_council/vendor_defaults.ts +45 -0
  505. package/src/scripts/ai_team/config.ts +11 -16
  506. package/src/scripts/audit_skill_overlap.ts +261 -0
  507. package/src/scripts/audit_user_type_axis.ts +20 -8
  508. package/src/scripts/before_complete_hook.ts +243 -12
  509. package/src/scripts/bench_ab_clone.ts +1 -2
  510. package/src/scripts/bench_concern_spawn_path.ts +129 -0
  511. package/src/scripts/bench_graph_feeder_latency.ts +584 -0
  512. package/src/scripts/bench_touched_file_quality.ts +238 -0
  513. package/src/scripts/check_agent_artifact_location.ts +36 -0
  514. package/src/scripts/check_branch_freshness.ts +147 -24
  515. package/src/scripts/check_enforcement_coverage.ts +130 -0
  516. package/src/scripts/check_enforcement_matrix.ts +377 -20
  517. package/src/scripts/check_estate_count.ts +130 -153
  518. package/src/scripts/check_evaluator_budgets.ts +4 -0
  519. package/src/scripts/check_finding_dispositions.ts +196 -21
  520. package/src/scripts/check_gate_coverage.ts +4 -3
  521. package/src/scripts/check_gate_reachability.ts +48 -1
  522. package/src/scripts/check_generator_sync.ts +48 -0
  523. package/src/scripts/check_hook_bundle_composition.ts +477 -0
  524. package/src/scripts/check_kernel_edit_ratified.ts +132 -14
  525. package/src/scripts/check_memory.ts +7 -1
  526. package/src/scripts/check_pack_size.ts +1 -1
  527. package/src/scripts/check_release_highlights.ts +10 -0
  528. package/src/scripts/check_release_manifest_content.ts +189 -0
  529. package/src/scripts/check_release_pr_shape.ts +38 -15
  530. package/src/scripts/check_standing_rule_delivery.ts +129 -13
  531. package/src/scripts/check_suppression_hygiene.ts +2 -5
  532. package/src/scripts/check_verify_expectation_delta.ts +521 -0
  533. package/src/scripts/ci_settle.ts +42 -5
  534. package/src/scripts/classify_merge_risk.ts +320 -0
  535. package/src/scripts/closure_scan.ts +91 -1
  536. package/src/scripts/code_graph/detect.ts +127 -7
  537. package/src/scripts/code_graph/foreign.ts +194 -0
  538. package/src/scripts/code_graph/query.ts +217 -4
  539. package/src/scripts/code_graph/types.ts +26 -2
  540. package/src/scripts/code_graph/validate.ts +3 -1
  541. package/src/scripts/code_graph/verbs.ts +103 -0
  542. package/src/scripts/command_suggester/settings.ts +8 -108
  543. package/src/scripts/command_suggester/types.ts +4 -5
  544. package/src/scripts/compile_hook_manifest.ts +33 -1
  545. package/src/scripts/condense.ts +14 -27
  546. package/src/scripts/consumer_matrix.ts +102 -0
  547. package/src/scripts/context_hygiene_hook.ts +13 -23
  548. package/src/scripts/cost/preflight.mjs +12 -1
  549. package/src/scripts/council_cli.ts +7 -7
  550. package/src/scripts/dispatch_r2_reviewer.ts +24 -11
  551. package/src/scripts/estate_exemption_shape.ts +202 -0
  552. package/src/scripts/explain_run.ts +8 -13
  553. package/src/scripts/generate_git_convention_grammar.ts +127 -0
  554. package/src/scripts/generate_host_cost_table.ts +21 -4
  555. package/src/scripts/handoff_context_hook.ts +86 -37
  556. package/src/scripts/hook_manifest.json +1 -1
  557. package/src/scripts/hook_manifest.yaml +175 -15
  558. package/src/scripts/hooks/block_config_weakening.ts +115 -7
  559. package/src/scripts/hooks/block_plumbing_writes.ts +37 -5
  560. package/src/scripts/hooks/code_graph_context_hook.ts +252 -23
  561. package/src/scripts/hooks/concern_failure_policy.ts +280 -0
  562. package/src/scripts/hooks/concern_registry.ts +2 -0
  563. package/src/scripts/hooks/delegation_nudge_hook.ts +2 -3
  564. package/src/scripts/hooks/dispatch_hook.ts +52 -52
  565. package/src/scripts/hooks/evidence_independence.ts +12 -4
  566. package/src/scripts/hooks/exit_codes.ts +2 -1
  567. package/src/scripts/hooks/host_lowering.json +1 -1
  568. package/src/scripts/hooks/host_lowering.ts +19 -1
  569. package/src/scripts/hooks/mcp_usage_observation_hook.ts +121 -0
  570. package/src/scripts/hooks/one_question_per_ask_hook.ts +41 -25
  571. package/src/scripts/hooks/payload_stub.ts +10 -1
  572. package/src/scripts/hooks/push_settle_hook.ts +4 -3
  573. package/src/scripts/hooks/rule_inject_hook.ts +795 -60
  574. package/src/scripts/hooks/state_io.ts +8 -4
  575. package/src/scripts/hooks/table_fingerprint.ts +21 -0
  576. package/src/scripts/hooks/telemetry_usage_hook.ts +24 -7
  577. package/src/scripts/hooks/turn_end_gate_hook.ts +85 -0
  578. package/src/scripts/hooks_status.ts +112 -0
  579. package/src/scripts/injection_scan_hook.ts +7 -0
  580. package/src/scripts/install-hooks.sh +42 -14
  581. package/src/scripts/install.ts +78 -215
  582. package/src/scripts/installed_layer_report.ts +103 -0
  583. package/src/scripts/language_mirror_hook.ts +15 -6
  584. package/src/scripts/learning_sidecar.ts +119 -8
  585. package/src/scripts/lint_blocker_citations.ts +198 -0
  586. package/src/scripts/lint_evidence_artifacts.ts +9 -0
  587. package/src/scripts/lint_hook_concern_budget.ts +10 -21
  588. package/src/scripts/lint_hook_manifest.ts +53 -0
  589. package/src/scripts/lint_major_migration_sections.ts +156 -26
  590. package/src/scripts/lint_pack_boundaries.ts +465 -29
  591. package/src/scripts/lint_roadmap_blockers.ts +282 -29
  592. package/src/scripts/lint_roadmap_complexity.ts +4 -2
  593. package/src/scripts/lint_rule_law_section.ts +647 -0
  594. package/src/scripts/lint_rule_skill_pack_reach.ts +17 -0
  595. package/src/scripts/lint_settings_classes.ts +1 -1
  596. package/src/scripts/lint_ticked_unmet_criteria.ts +165 -0
  597. package/src/scripts/lint_workflow_security.ts +173 -6
  598. package/src/scripts/mcp_server/consumer_tool_catalog.json +53 -0
  599. package/src/scripts/mcp_server/graph_tools.ts +72 -3
  600. package/src/scripts/measure_routing_signal.ts +54 -16
  601. package/src/scripts/measure_skill_ranker_baseline.ts +221 -8
  602. package/src/scripts/memory_learn_hook.ts +91 -6
  603. package/src/scripts/model_rule_injection.ts +55 -8
  604. package/src/scripts/onboarding_gate_hook.ts +7 -6
  605. package/src/scripts/print_required_checks.ts +15 -3
  606. package/src/scripts/probe_host_compliance.ts +33 -5
  607. package/src/scripts/probe_turnaround.ts +183 -3
  608. package/src/scripts/project_thin_rules.ts +34 -327
  609. package/src/scripts/ratification_header.ts +77 -0
  610. package/src/scripts/refusal_envelope.ts +138 -0
  611. package/src/scripts/release_publication.ts +29 -3
  612. package/src/scripts/report_dispatch_import_closure.ts +76 -0
  613. package/src/scripts/report_evidence_temperature.ts +657 -0
  614. package/src/scripts/report_installed_rule_links.ts +274 -0
  615. package/src/scripts/report_label_agreement.ts +233 -0
  616. package/src/scripts/report_module_reach.ts +212 -0
  617. package/src/scripts/report_obligation_mechanism.ts +228 -0
  618. package/src/scripts/report_parked_blockers.ts +222 -0
  619. package/src/scripts/report_required_checks_drift.ts +196 -0
  620. package/src/scripts/report_single_token_triggers.ts +277 -0
  621. package/src/scripts/report_skill_ranker_confusion.ts +543 -0
  622. package/src/scripts/report_standing_payload_by_host.ts +188 -15
  623. package/src/scripts/report_verification_record_coverage.ts +306 -0
  624. package/src/scripts/routing_doctor.ts +2 -2
  625. package/src/scripts/rule_activation_census.ts +5 -2
  626. package/src/scripts/rule_trigger_eval.ts +9 -9
  627. package/src/scripts/schemas/agent-settings.schema.json +17 -31
  628. package/src/scripts/schemas/command.schema.json +1 -1
  629. package/src/scripts/schemas/review-findings.schema.json +3 -2
  630. package/src/scripts/schemas/rule.schema.json +5 -0
  631. package/src/scripts/schemas/skill.schema.json +1 -1
  632. package/src/scripts/self_review_gate.ts +101 -9
  633. package/src/scripts/skill_tools/score_skill_relevance.ts +314 -40
  634. package/src/scripts/sweep_skill_ranker_signals.ts +129 -0
  635. package/src/scripts/sync_gitignore.ts +29 -235
  636. package/src/scripts/sync_pr_branch.ts +403 -132
  637. package/src/scripts/trigger_eval_grandfather.json +0 -21
  638. package/src/server/schemas/settings.ts +42 -176
  639. package/src/shared/skillRanking.ts +169 -14
  640. package/dist/cli-delegate/chunk-5R7HOLAF.js +0 -99
  641. package/dist/cli-delegate/chunk-JNMVLWLR.js +0 -4457
  642. package/dist/cli-delegate/chunk-YDPILCOL.js +0 -152
  643. package/src/scripts/_lib/config_chain.ts +0 -477
  644. package/src/scripts/_lib/conformance_report.ts +0 -403
  645. package/src/scripts/_lib/eval_discrimination.ts +0 -95
  646. package/src/scripts/_lib/evaluator_promotion.ts +0 -225
  647. package/src/scripts/_lib/file_slicer.ts +0 -117
  648. package/src/scripts/_lib/legacy_boundary_map.ts +0 -228
  649. package/src/scripts/_lib/minimality_tiebreak.ts +0 -168
  650. package/src/scripts/_lib/overbuild_lens_contract.ts +0 -196
  651. package/src/scripts/_lib/role_split.ts +0 -338
@@ -0,0 +1,426 @@
1
+ /**
2
+ * `agent-config doctor neighbours` — render the neighbour census.
3
+ *
4
+ * A separate entry point rather than another branch inside `cmd_doctor.ts`,
5
+ * which sits 2,000 lines above the source-size ceiling: a verb this size does
6
+ * not belong in a file that already cannot grow. The census itself is
7
+ * `_lib/neighbour_census.ts`; everything here is presentation and the one
8
+ * summary line the full `doctor` run links to.
9
+ *
10
+ * Refuses nothing. No label here removes, blocks, or rewrites a neighbour's
11
+ * artifact — a label is a report, never a gate.
12
+ *
13
+ * It is no longer read-ONLY, and the two writes are named rather than implied.
14
+ * Both land under `agents/reports/` and both are caches of this run's own
15
+ * findings: `neighbour-scan.json`, the shape-scan verdicts the ranker reads on
16
+ * the hook path, and `neighbour-overlap.json`, the cross-root pairs keyed by the
17
+ * census digest. Nothing outside that directory is touched, and a failed write
18
+ * is not a failed census.
19
+ *
20
+ * `--contradictions` (step 2.2) writes neither cache. It forms candidate pairs
21
+ * and hands them to ONE council seat, whose question and transcript land under
22
+ * gitignored `agents/runtime/council/`; with no council configured it prints
23
+ * `n/a` and asks nobody.
24
+ */
25
+
26
+ import { spawnSync } from 'node:child_process';
27
+ import * as fs from 'node:fs';
28
+ import * as path from 'node:path';
29
+ import { fileURLToPath, pathToFileURL } from 'node:url';
30
+
31
+ import * as YAML from 'yaml';
32
+
33
+ import {
34
+ census,
35
+ fileDigest,
36
+ gatedEventsFrom,
37
+ scanCachePath,
38
+ type NeighbourCensus,
39
+ } from '../_lib/neighbour_census.js';
40
+ import { scanNeighbourBody, writeScanCache } from '../_lib/neighbour_scan.js';
41
+ import {
42
+ RANK_NEIGHBOUR_ALWAYS_ON,
43
+ RANK_NEIGHBOUR_SKILL,
44
+ RANK_PROJECT,
45
+ collisionPair,
46
+ extractInstructions,
47
+ modalityPairs,
48
+ parseVerdicts,
49
+ renderReview,
50
+ reviewRows,
51
+ seatPrompt,
52
+ type CandidatePair,
53
+ type InstructionSource,
54
+ type ReviewRow,
55
+ } from '../_lib/neighbour_contradictions.js';
56
+ import { resolveAvailability } from '../council_availability_hook.js';
57
+ import { resolvePackageRoot } from '../_lib/package_root.js';
58
+ import {
59
+ OVERLAP_THRESHOLD,
60
+ CROSS_CACHE_NAME,
61
+ cachedCrossRootPairs,
62
+ crossRootOverlapMap,
63
+ } from '../audit_skill_overlap.js';
64
+
65
+ interface ManifestShape {
66
+ concerns?: Record<string, { effect?: string }>;
67
+ platforms?: Record<string, Record<string, unknown>>;
68
+ native_event_aliases?: Record<string, Record<string, string>>;
69
+ }
70
+
71
+ /** Read the hook manifest for the events a `permission` concern of ours sits on. */
72
+ function gatedEvents(packageRoot: string): Set<string> {
73
+ try {
74
+ // A missing or unreadable manifest yields an empty gate set, which
75
+ // downgrades `degraded` to `coordinated` rather than inventing a gate
76
+ // that is not there.
77
+ const file = path.join(packageRoot, 'src', 'scripts', 'hook_manifest.yaml');
78
+ const doc = YAML.parse(fs.readFileSync(file, 'utf-8')) as ManifestShape;
79
+ return gatedEventsFrom(doc, doc.native_event_aliases ?? {});
80
+ } catch {
81
+ return new Set<string>();
82
+ }
83
+ }
84
+
85
+ /** This package's own skill names, for the `shadowed` warning. */
86
+ function ourSkillNames(packageRoot: string): Set<string> {
87
+ try {
88
+ return new Set(
89
+ fs
90
+ .readdirSync(path.join(packageRoot, 'src', 'skills'), { withFileTypes: true })
91
+ .filter((e) => e.isDirectory())
92
+ .map((e) => e.name),
93
+ );
94
+ } catch {
95
+ return new Set<string>();
96
+ }
97
+ }
98
+
99
+ /**
100
+ * The census, in two passes, and the second one is not an accident.
101
+ *
102
+ * The cross-root overlap can only be computed over the neighbour skills the
103
+ * census FOUND — the unclaimed entries of two roots that also hold claimed ones,
104
+ * since `agent-config install` writes this package's own skills into
105
+ * `~/.claude/skills`. Pairing whole roots instead would compare our installed
106
+ * copies against our own source tree and publish the install as an overlap. So
107
+ * pass one finds them, the overlap runs over exactly those files, and pass two
108
+ * labels them.
109
+ *
110
+ * The shape scan is memoized across both passes, so the four linters run once
111
+ * per neighbour body rather than twice. The scan verdicts are then WRITTEN to
112
+ * the cache the ranker reads on the hook path — this verb is the only producer,
113
+ * which is why its absence reads there as `no-scan-record` rather than as a pass.
114
+ */
115
+ export function runCensus(
116
+ projectRoot: string,
117
+ packageRoot: string,
118
+ homeRoot?: string,
119
+ ): NeighbourCensus {
120
+ const scanned = new Map<string, string | null>();
121
+ const scan = (p: string): string | null => {
122
+ const hit = scanned.get(p);
123
+ if (hit !== undefined) return hit;
124
+ const kind = scanNeighbourBody(p).kind;
125
+ scanned.set(p, kind);
126
+ return kind;
127
+ };
128
+ const base = {
129
+ gatedEvents: gatedEvents(packageRoot),
130
+ templatesRoot: path.join(packageRoot, 'src', 'agent-src', 'templates'),
131
+ ourSkillNames: ourSkillNames(packageRoot),
132
+ packageRoot,
133
+ scan,
134
+ ...(homeRoot === undefined ? {} : { homeRoot }),
135
+ };
136
+ const first = census(projectRoot, base);
137
+ const ourRoot = path.join(packageRoot, 'src', 'skills');
138
+ let overlaps = new Map<string, { names: string[]; similarity: number }>();
139
+ if (first.skills.length > 0 && fs.existsSync(ourRoot)) {
140
+ try {
141
+ const { pairs } = cachedCrossRootPairs(
142
+ first.skills.map((s) => s.source),
143
+ ourRoot,
144
+ path.join(projectRoot, 'agents', 'reports', CROSS_CACHE_NAME),
145
+ OVERLAP_THRESHOLD,
146
+ );
147
+ overlaps = crossRootOverlapMap(pairs);
148
+ } catch {
149
+ // An overlap pass that cannot run leaves every entry unlabelled by
150
+ // it, which reads as `unclassified` — the absence of a signal — and
151
+ // never as a claim that the pair is disjoint.
152
+ }
153
+ }
154
+ const full = census(projectRoot, { ...base, overlaps });
155
+ writeScanCache(
156
+ scanCachePath(projectRoot),
157
+ // `fileDigest`, not the census's own `digest`: the ranker re-digests the
158
+ // file bytes it is about to index, and a cache written under a different
159
+ // digest function would read as `digest-changed` on every prompt.
160
+ full.skills.map((s) => ({
161
+ qualified: s.qualified,
162
+ digest: fileDigest(s.source) ?? '',
163
+ unscanned: s.unscanned,
164
+ })),
165
+ );
166
+ return full;
167
+ }
168
+
169
+ /**
170
+ * Candidate pairs for `--contradictions` (step 2.2), READ-ONLY.
171
+ *
172
+ * Calls `census()` directly rather than `runCensus()`, because the latter
173
+ * writes the scan and overlap caches and this mode promises to change no file.
174
+ * The shape scan still runs, and a refused neighbour body contributes no line.
175
+ */
176
+ export function contradictionCandidates(
177
+ projectRoot: string,
178
+ packageRoot: string,
179
+ homeRoot?: string,
180
+ ): CandidatePair[] {
181
+ const ours = ourSkillNames(packageRoot);
182
+ const c = census(projectRoot, {
183
+ gatedEvents: gatedEvents(packageRoot),
184
+ templatesRoot: path.join(packageRoot, 'src', 'agent-src', 'templates'),
185
+ ourSkillNames: ours,
186
+ packageRoot,
187
+ scan: (p) => scanNeighbourBody(p).kind,
188
+ ...(homeRoot === undefined ? {} : { homeRoot }),
189
+ });
190
+ const sources: InstructionSource[] = [];
191
+ for (const name of ['CLAUDE.md', 'AGENTS.md']) {
192
+ const file = path.join(projectRoot, name);
193
+ if (fs.existsSync(file)) sources.push({ label: name, file, rank: RANK_PROJECT });
194
+ }
195
+ for (const r of c.rule_files) {
196
+ if (scanNeighbourBody(r.source).kind === null) {
197
+ sources.push({ label: r.id, file: r.source, rank: RANK_NEIGHBOUR_ALWAYS_ON });
198
+ }
199
+ }
200
+ for (const s of c.skills) {
201
+ if (s.unscanned === null) sources.push({ label: s.qualified, file: s.source, rank: RANK_NEIGHBOUR_SKILL });
202
+ }
203
+ const pairs = modalityPairs(sources.flatMap((src) => extractInstructions(src)));
204
+ for (const s of c.skills) {
205
+ const name = s.qualified.split(':').slice(1).join(':') || s.qualified;
206
+ if (ours.has(name)) pairs.push(collisionPair(s.qualified, name));
207
+ }
208
+ return pairs;
209
+ }
210
+
211
+ /** One council seat, run through the council CLI; `null` when it cannot answer. */
212
+ export type Seat = (prompt: string) => string | null;
213
+
214
+ function councilSeat(projectRoot: string): Seat {
215
+ return (prompt) => {
216
+ const stamp = new Date().toISOString().replace(/[:.]/gu, '-');
217
+ const q = path.join(projectRoot, 'agents', 'runtime', 'council', 'questions', `neighbour-contradictions-${stamp}.md`);
218
+ const out = path.join(projectRoot, 'agents', 'runtime', 'council', 'responses', `neighbour-contradictions-${stamp}.md`);
219
+ try {
220
+ fs.mkdirSync(path.dirname(q), { recursive: true });
221
+ fs.writeFileSync(q, prompt, 'utf-8');
222
+ const args = ['council', 'run', q, '--single', '--prompt-mode', 'analysis', '--output', out, '--confirm', '--invocation', 'user_explicit'];
223
+ const res = spawnSync('agent-config', args, { cwd: projectRoot, encoding: 'utf-8' });
224
+ if (res.status !== 0) return null;
225
+ const doc = JSON.parse(fs.readFileSync(out, 'utf-8')) as { responses?: { text?: string }[] };
226
+ return doc.responses?.map((r) => r.text ?? '').join('\n') ?? null;
227
+ } catch {
228
+ return null;
229
+ }
230
+ };
231
+ }
232
+
233
+ /**
234
+ * `--contradictions`: a verdict table, or `n/a` when no council is configured.
235
+ *
236
+ * Report-only — it edits nothing and gates nothing. The council transcript the
237
+ * seat writes lands under gitignored `agents/runtime/council/`; no tracked file
238
+ * changes.
239
+ */
240
+ export function runContradictions(
241
+ projectRoot: string,
242
+ packageRoot: string,
243
+ opts: { homeRoot?: string; seat?: Seat; configured?: boolean } = {},
244
+ ): { lines: string[]; rows: ReviewRow[] | null } {
245
+ const configured =
246
+ opts.configured ?? resolveAvailability(projectRoot, process.env)?.configured ?? false;
247
+ const pairs = contradictionCandidates(projectRoot, packageRoot, opts.homeRoot);
248
+ if (!configured) {
249
+ return {
250
+ lines: [` contradictions: n/a — no council configured (${pairs.length} candidate pair(s) formed, none reviewed)`],
251
+ rows: null,
252
+ };
253
+ }
254
+ if (pairs.length === 0) return { lines: renderReview([]), rows: [] };
255
+ let rubric = '';
256
+ for (const rel of [['dist', 'agent-src', 'rules'], ['src', 'rules']]) {
257
+ try {
258
+ rubric = fs.readFileSync(path.join(packageRoot, ...rel, 'neighbour-precedence.md'), 'utf-8');
259
+ break;
260
+ } catch {
261
+ // Try the next layout.
262
+ }
263
+ }
264
+ const answer = (opts.seat ?? councilSeat(projectRoot))(seatPrompt(pairs, rubric));
265
+ if (answer === null) {
266
+ return { lines: [` contradictions: n/a — the council seat did not answer (${pairs.length} candidate pair(s) formed)`], rows: null };
267
+ }
268
+ const rows = reviewRows(pairs, parseVerdicts(answer, pairs.length));
269
+ return { lines: renderReview(rows), rows };
270
+ }
271
+
272
+ /** The one line the full `doctor` run prints, linking to this verb. */
273
+ export function summaryLine(c: NeighbourCensus): string {
274
+ const counts = [
275
+ `${c.hook_groups.length} hook group(s)`,
276
+ `${c.skills.length} skill(s)`,
277
+ `${c.commands.length} command(s)`,
278
+ `${c.agents.length} agent(s)`,
279
+ `${c.mcp_servers.length} mcp server(s)`,
280
+ `${c.rule_files.length} rule file(s)`,
281
+ `${c.instruction_sections.length} instruction section(s)`,
282
+ ].join(', ');
283
+ const labels = c.hosts.map((h) => `${h.host}=${h.label}`).join(' ');
284
+ return ` 🏘️ neighbours: ${counts}${labels === '' ? '' : ` · ${labels}`} (run \`doctor neighbours\` for the census)`;
285
+ }
286
+
287
+ export function renderText(c: NeighbourCensus): string[] {
288
+ const out: string[] = [];
289
+ out.push(` 📍 project_root: ${c.project_root}`);
290
+ out.push('');
291
+ for (const h of c.hosts) {
292
+ out.push(` ${h.host}: ${h.label} — ${h.label_reason}`);
293
+ for (const e of h.hook_groups) {
294
+ const matcher = e.matcher === null ? '' : ` matcher=${e.matcher}`;
295
+ const timeout = e.timeout === null ? '' : ` timeout=${e.timeout}`;
296
+ out.push(` ${e.event}: ${e.command_head}${matcher}${timeout} effect=${e.effect}`);
297
+ }
298
+ }
299
+ const section = (title: string, rows: ReadonlyArray<{ id: string }>): void => {
300
+ if (rows.length === 0) return;
301
+ out.push('');
302
+ out.push(` ${title} (${rows.length})`);
303
+ for (const r of rows) out.push(` ${r.id}`);
304
+ };
305
+ if (c.skills.length > 0) {
306
+ out.push('');
307
+ out.push(` skills (${c.skills.length})`);
308
+ for (const s of c.skills) {
309
+ const also = s.also.length === 0 ? '' : ` also: ${s.also.join(', ')}`;
310
+ const why = s.unscanned === null ? '' : ` unscanned: ${s.unscanned}`;
311
+ out.push(` ${s.qualified} compat: ${s.compat}${also}${why}`);
312
+ }
313
+ }
314
+ section('commands', c.commands);
315
+ section('agents', c.agents);
316
+ if (c.mcp_servers.length > 0) {
317
+ out.push('');
318
+ out.push(` mcp servers (${c.mcp_servers.length})`);
319
+ for (const m of c.mcp_servers) {
320
+ // `used` and `advertised` are printed side by side so the reader
321
+ // never takes the first for a coverage ratio: the denominator is
322
+ // not missing by accident, it is not obtainable without launching
323
+ // the neighbour's process, which this census does not do.
324
+ out.push(
325
+ ` ${m.id} tools used (${m.tools_window_days}d): ${m.tools_used_30d}` +
326
+ ` advertised: ${m.tools_advertised}`,
327
+ );
328
+ }
329
+ }
330
+ section('rule files', c.rule_files);
331
+ section('instruction sections', c.instruction_sections);
332
+ if (c.warnings.length > 0) {
333
+ out.push('');
334
+ for (const w of c.warnings) out.push(` ⚠️ ${w.kind}: ${w.detail}`);
335
+ }
336
+ out.push('');
337
+ out.push(
338
+ ' The host owns load order. This census says what is there and what each entry would do;',
339
+ );
340
+ out.push(' it cannot say what ran first, and no label here refuses anything.');
341
+ return out;
342
+ }
343
+
344
+ export function main(argv: readonly string[] = process.argv.slice(2)): number {
345
+ let json = false;
346
+ let contradictions = false;
347
+ let root = process.cwd();
348
+ let home: string | undefined;
349
+ for (let i = 0; i < argv.length; i += 1) {
350
+ if (argv[i] === '--json') json = true;
351
+ else if (argv[i] === '--contradictions') contradictions = true;
352
+ else if (argv[i] === '--project') {
353
+ root = argv[i + 1] ?? root;
354
+ i += 1;
355
+ } else if (argv[i] === '--home') {
356
+ // Fixture-only: the user-scope half of the census is real `$HOME`
357
+ // in production, and a test must be able to plant one.
358
+ home = argv[i + 1];
359
+ i += 1;
360
+ } else if (argv[i] === 'neighbours') {
361
+ continue;
362
+ } else {
363
+ process.stderr.write(`doctor neighbours: unknown argument: ${argv[i]}\n`);
364
+ return 2;
365
+ }
366
+ }
367
+ if (contradictions) {
368
+ const r = runContradictions(path.resolve(root), resolvePackageRoot(import.meta.url), home === undefined ? {} : { homeRoot: home });
369
+ if (json) process.stdout.write(`${JSON.stringify({ contradictions: r.rows })}\n`);
370
+ else for (const line of r.lines) process.stdout.write(`${line}\n`);
371
+ return 0;
372
+ }
373
+ const c = runCensus(path.resolve(root), resolvePackageRoot(import.meta.url), home);
374
+ if (json) {
375
+ // Compact, not pretty-printed: this is the machine contract, and the
376
+ // gate that reads it matches on adjacency rather than on indentation.
377
+ process.stdout.write(`${JSON.stringify(c)}\n`);
378
+ } else {
379
+ for (const line of renderText(c)) process.stdout.write(`${line}\n`);
380
+ }
381
+ return 0;
382
+ }
383
+
384
+ /**
385
+ * Same entry guard the sibling CLIs use — including the delegate branch, which
386
+ * an earlier version of this file left out and which the delegate smoke test
387
+ * caught: `no bundle is a silent no-op` reported `cmd_doctor_neighbours.js (no
388
+ * output, exit 0)`, the exact shape the paragraph below describes.
389
+ *
390
+ * Inside the cli-delegate bundle `--splitting` moves this module's body into a
391
+ * shared chunk, so the URL comparison weighs the CHUNK against `argv[1]` and
392
+ * never matches. `agent-config doctor` shipped that way once already — a
393
+ * diagnostic reporting success while saying nothing. The invoked file name is
394
+ * the reliable signal there; a miss falls THROUGH to the realpath comparison
395
+ * rather than returning false, so a symlinked or renamed invocation still
396
+ * resolves. Inlined into the installer / hook / MCP bundle instead, it must
397
+ * never auto-run, which is why one "am I bundled" flag cannot answer "may I
398
+ * run" and both flags are read.
399
+ */
400
+ declare const __AGENT_CONFIG_BUNDLE__: boolean | undefined;
401
+ declare const __AGENT_CONFIG_CLI_DELEGATE__: boolean | undefined;
402
+
403
+ function _isCliEntry(): boolean {
404
+ const bundled = typeof __AGENT_CONFIG_BUNDLE__ !== 'undefined' && __AGENT_CONFIG_BUNDLE__;
405
+ const cliDelegate =
406
+ typeof __AGENT_CONFIG_CLI_DELEGATE__ !== 'undefined' && __AGENT_CONFIG_CLI_DELEGATE__;
407
+ if (bundled && !cliDelegate) return false;
408
+ if (process.argv[1] === undefined) return false;
409
+ if (cliDelegate && path.basename(process.argv[1], '.js') === 'cmd_doctor_neighbours') {
410
+ return true;
411
+ }
412
+ const argvUrl = pathToFileURL(path.resolve(process.argv[1])).href;
413
+ if (import.meta.url === argvUrl) return true;
414
+ try {
415
+ return (
416
+ fs.realpathSync(fileURLToPath(import.meta.url)) ===
417
+ fs.realpathSync(path.resolve(process.argv[1]))
418
+ );
419
+ } catch {
420
+ return false;
421
+ }
422
+ }
423
+
424
+ if (_isCliEntry()) {
425
+ process.exit(main());
426
+ }
@@ -310,13 +310,32 @@ function _explain_config(project_root: string, as_json: boolean): number {
310
310
  }
311
311
  const knobs = resolved_preset.knobs as Dict;
312
312
  const cost = isPlainObject(knobs['cost']) ? (knobs['cost'] as Dict) : {};
313
- if (Object.keys(cost).length > 0) {
314
- print(
315
- ` cost caps: daily $${fmt(cost['daily_max_usd'])} · ` +
316
- `weekly $${fmt(cost['weekly_max_usd'])} · ` +
317
- `monthly $${fmt(cost['monthly_max_usd'])}`,
318
- );
313
+ const mcp = isPlainObject(knobs['mcp']) ? (knobs['mcp'] as Dict) : {};
314
+ if (Object.keys(cost).length > 0 || Object.keys(mcp).length > 0) {
315
+ // These are preset FIGURES, not caps. No reader compares spend with
316
+ // any of them: `presets.ts` maps the preset to an environment name and
317
+ // nothing else reads these keys. Calling them "cost caps" told a
318
+ // reader they bounded something, which is why the label says what they
319
+ // are — ADR-279 removed the ceilings nobody set, and a figure nobody
320
+ // enforces is the same error one layer up.
321
+ print(' preset cost figures (shown, NOT enforced — nothing compares spend with these):');
322
+ if (Object.keys(cost).length > 0) {
323
+ print(
324
+ ` preset: daily $${fmt(cost['daily_max_usd'])} · ` +
325
+ `weekly $${fmt(cost['weekly_max_usd'])} · ` +
326
+ `monthly $${fmt(cost['monthly_max_usd'])}`,
327
+ );
328
+ }
329
+ if (Object.keys(mcp).length > 0) {
330
+ print(
331
+ ` mcp: per-call $${fmt(mcp['per_call_max_usd'])} · ` +
332
+ `per-session $${fmt(mcp['per_session_max_usd'])}`,
333
+ );
334
+ }
319
335
  }
336
+ // The figures that DO bound, beside the ones that do not, so the
337
+ // difference is visible in one screen rather than inferred.
338
+ printConfiguredBudgets(print, settings);
320
339
  const autonomy = isPlainObject(knobs['autonomy']) ? (knobs['autonomy'] as Dict) : {};
321
340
  if (Object.keys(autonomy).length > 0) {
322
341
  print(` autonomy: default=${fmt(autonomy['default'])}`);
@@ -324,6 +343,52 @@ function _explain_config(project_root: string, as_json: boolean): number {
324
343
  return 0;
325
344
  }
326
345
 
346
+ /**
347
+ * Print the `cost.budgets` windows that actually bound, and their mode.
348
+ *
349
+ * Separate from the preset figures above because the two look alike and mean
350
+ * opposite things: a preset figure is printed and never read, while a
351
+ * configured budget is what `scripts/cost/budget.mjs` compares spend against
352
+ * and what `cost.enforcement: hard-stop` can refuse on. Printing them in one
353
+ * screen is the point of step 3.5 — a reader who sees only one of the two
354
+ * cannot tell which kind they are looking at.
355
+ *
356
+ * Takes the SAME resolved `settings` the profile/preset lines above already
357
+ * used (`_explain_config`'s `_load_user_settings(project_root)`), rather than
358
+ * an independent `load_agent_settings({ cwd: project_root })` call — tried and
359
+ * reverted: that second call enables the full project-root-to-cwd cascade
360
+ * (merged with the user-global layer), a DIFFERENT resolution view from the
361
+ * single project file the profile/preset lines read and from what the actual
362
+ * enforcing path (`scripts/cost/budget.mjs`, a plain CWD-relative single-file
363
+ * read with no cascade) compares spend against. Two independent reads of the
364
+ * same nominal setting can diverge; one shared value cannot.
365
+ *
366
+ * `0` and absent both mean unbounded (ADR-279), and the line says so rather
367
+ * than printing a bare zero that reads like a cap of nothing.
368
+ */
369
+ export function printConfiguredBudgets(print: (s?: string) => void, settings: unknown): void {
370
+ const cost = isPlainObject(settings) && isPlainObject((settings as Dict)['cost'])
371
+ ? ((settings as Dict)['cost'] as Dict)
372
+ : {};
373
+ const budgets = isPlainObject(cost['budgets']) ? (cost['budgets'] as Dict) : {};
374
+ const win = (k: string): string => {
375
+ const v = budgets[k];
376
+ return typeof v === 'number' && v > 0 ? `$${String(v)}` : 'unset';
377
+ };
378
+ const mode = typeof cost['enforcement'] === 'string' ? cost['enforcement'] : 'advisory';
379
+ const anySet = ['daily', 'weekly', 'monthly'].some((k) => win(k) !== 'unset');
380
+ print(
381
+ ` configured cost.budgets (ENFORCED by the cost preflight when mode is hard-stop):`,
382
+ );
383
+ print(
384
+ ` windows: daily ${win('daily')} · weekly ${win('weekly')} · ` +
385
+ `monthly ${win('monthly')} (mode: ${mode})`,
386
+ );
387
+ if (!anySet) {
388
+ print(' no window is set, so no ceiling on money applies (ADR-279).');
389
+ }
390
+ }
391
+
327
392
  /** Python `dict.get(k)` → value or None; renders as `str(value)` / `None`. */
328
393
  function fmt(value: unknown): string {
329
394
  if (value === null || value === undefined) return 'None';
@@ -487,13 +552,6 @@ function _explain_last(
487
552
  as_json: boolean,
488
553
  quiet: boolean,
489
554
  ): number {
490
- const settings = _load_user_settings(project_root);
491
- const explain_raw = settings['explain'];
492
- const explain_cfg = isPlainObject(explain_raw) ? (explain_raw as Dict) : {};
493
- if (explain_cfg['enable_last'] === false) {
494
- print('explain last disabled by settings (explain.enable_last)');
495
- return 0;
496
- }
497
555
  const target_state = state_file || path.join(project_root, '.work-state.json');
498
556
  let trace: Dict;
499
557
  try {
@@ -568,7 +626,7 @@ options:
568
626
  --quiet suppress the trailing tip footer
569
627
 
570
628
  exit codes:
571
- 0 trace rendered, or disabled by settings (explain.enable_last)
629
+ 0 trace rendered
572
630
  1 no recent run found (state file missing or unreadable)
573
631
  2 invocation error (bad project root, bad --state-file path)
574
632
  `;