@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
@@ -1,16 +1,17 @@
1
1
  /**
2
- * Read `commands.suggestion.*` from `.agent-settings.yml` into `Settings`.
2
+ * Read `commands.suggestion.blocklist` from `.agent-settings.yml` into `Settings`.
3
3
  *
4
4
  * Ported from the retired Python `src/scripts/command_suggester/settings.py`
5
5
  * (ADR-200 py2ts). Mirror of the chat-history pattern:
6
6
  *
7
- * - Default-permissive: a missing file or missing section returns
8
- * `Settings()` defaults (suggestion layer enabled). Only an explicit
9
- * `enabled: false` flips the master switch off.
7
+ * - The blocklist is the only suggestion key a project still sets. The
8
+ * master switch, floor, cooldown and option cap are engine constants in
9
+ * `Settings`: their keys were retired with those defaults as the fixed
10
+ * behavior, so a leftover value is warned about by the loader and never
11
+ * read here.
10
12
  * - Malformed YAML / unreadable file → defaults; the suggester degrades
11
13
  * silently rather than crashing the turn.
12
- * - Type-coerces with bounded fallbacks (floors clamped 0.0-1.0, ints
13
- * non-negative, blocklist forced to an array of strings).
14
+ * - The blocklist is forced to an array of non-empty strings.
14
15
  *
15
16
  * The Python module reads the YAML via the shared `agent_settings`
16
17
  * loader; this twin delegates to the ported `agent_settings.ts`.
@@ -61,54 +62,7 @@ function _read_section(path: string): Record<string, unknown> | null {
61
62
  }
62
63
 
63
64
  function _settings_from_raw(raw: Record<string, unknown>): Settings {
64
- return new Settings({
65
- enabled: _coerce_bool(raw.enabled, _DEFAULT.enabled),
66
- confidence_floor: _coerce_floor(raw.confidence_floor, _DEFAULT.confidence_floor),
67
- cooldown_seconds: _coerce_nonneg_int(raw.cooldown_seconds, _DEFAULT.cooldown_seconds),
68
- max_options: _coerce_nonneg_int(raw.max_options, _DEFAULT.max_options),
69
- blocklist: _coerce_str_tuple(raw.blocklist),
70
- });
71
- }
72
-
73
- function _coerce_bool(value: unknown, defaultValue: boolean): boolean {
74
- if (typeof value === 'boolean') {
75
- return value;
76
- }
77
- if (value === null || value === undefined) {
78
- return defaultValue;
79
- }
80
- if (typeof value === 'string') {
81
- const s = value.trim().toLowerCase();
82
- if (['true', 'yes', 'on', '1'].includes(s)) {
83
- return true;
84
- }
85
- if (['false', 'no', 'off', '0'].includes(s)) {
86
- return false;
87
- }
88
- }
89
- return defaultValue;
90
- }
91
-
92
- function _coerce_floor(value: unknown, defaultValue: number): number {
93
- const f = _pyFloat(value);
94
- if (f === null) {
95
- return defaultValue;
96
- }
97
- if (f < 0.0) {
98
- return 0.0;
99
- }
100
- if (f > 1.0) {
101
- return 1.0;
102
- }
103
- return f;
104
- }
105
-
106
- function _coerce_nonneg_int(value: unknown, defaultValue: number): number {
107
- const i = _pyInt(value);
108
- if (i === null) {
109
- return defaultValue;
110
- }
111
- return i >= 0 ? i : defaultValue;
65
+ return new Settings({ blocklist: _coerce_str_tuple(raw.blocklist) });
112
66
  }
113
67
 
114
68
  function _coerce_str_tuple(value: unknown): string[] {
@@ -127,60 +81,6 @@ function _coerce_str_tuple(value: unknown): string[] {
127
81
  return out;
128
82
  }
129
83
 
130
- /**
131
- * Mirror of Python `float(value)`, returning null where Python raises
132
- * `TypeError` / `ValueError` (the coercion catches those and falls
133
- * back to the default).
134
- */
135
- function _pyFloat(value: unknown): number | null {
136
- if (typeof value === 'boolean') {
137
- return value ? 1.0 : 0.0;
138
- }
139
- if (typeof value === 'number') {
140
- return value;
141
- }
142
- if (typeof value === 'string') {
143
- const s = value.trim();
144
- if (s === '') {
145
- return null;
146
- }
147
- const n = Number(s);
148
- return Number.isNaN(n) ? null : n;
149
- }
150
- return null;
151
- }
152
-
153
- /**
154
- * Mirror of Python `int(value)` for the YAML scalar types, returning
155
- * null where Python raises.
156
- *
157
- * - bool → 1 / 0.
158
- * - int → itself.
159
- * - float → truncated toward zero (Python `int(3.9) == 3`).
160
- * - string → `int(str, 10)` semantics: an optional sign + digits,
161
- * surrounding whitespace allowed; a float-shaped string raises in
162
- * Python, so it maps to null.
163
- */
164
- function _pyInt(value: unknown): number | null {
165
- if (typeof value === 'boolean') {
166
- return value ? 1 : 0;
167
- }
168
- if (typeof value === 'number') {
169
- if (Number.isNaN(value) || !Number.isFinite(value)) {
170
- return null;
171
- }
172
- return Math.trunc(value);
173
- }
174
- if (typeof value === 'string') {
175
- const s = value.trim();
176
- if (!/^[+-]?\d+$/.test(s)) {
177
- return null;
178
- }
179
- return parseInt(s, 10);
180
- }
181
- return null;
182
- }
183
-
184
84
  function _isPlainObject(value: unknown): value is Record<string, unknown> {
185
85
  return typeof value === 'object' && value !== null && !Array.isArray(value);
186
86
  }
@@ -98,11 +98,10 @@ export class Match {
98
98
  }
99
99
 
100
100
  /**
101
- * Runtime knobs read from `.agent-settings.yml`.
102
- *
103
- * Defaults match the "open decisions" leans in the roadmap.
104
- * Per-command frontmatter values override the global floor /
105
- * cooldown.
101
+ * Engine knobs. Only `blocklist` comes from `.agent-settings.yml`; the
102
+ * other four are fixed defaults (their settings keys were retired), still
103
+ * overridable by a caller that constructs `Settings` directly.
104
+ * Per-command frontmatter values override the floor / cooldown.
106
105
  *
107
106
  * Mirrors `@dataclass(frozen=True)`. The Python default `blocklist`
108
107
  * is an empty tuple; here it is a readonly string array, canonicalized
@@ -79,12 +79,44 @@ const TABLES = {
79
79
 
80
80
  export type TableName = keyof typeof TABLES;
81
81
 
82
+ /**
83
+ * The TWO labels a compiled table carries, and why one was not enough.
84
+ *
85
+ * `fingerprint` binds the file to its YAML SOURCE — it answers "is this
86
+ * compiled from the YAML as it stands". `body_fingerprint` binds the file to
87
+ * ITSELF: it is the fingerprint of the exact body bytes this writer emitted,
88
+ * and it answers "is the body a reader is about to serve the body that was
89
+ * compiled".
90
+ *
91
+ * road-to-blocking-severities 2.3. The source label alone left a real hole,
92
+ * and it is the one the roadmap measured: edit a cell of the compiled `table`
93
+ * and leave `fingerprint` alone, and it still equals the YAML's fingerprint,
94
+ * so the reader serves the edited body — and since both readers prefer the
95
+ * compiled form, the edited cell is what every host is told while the reviewed
96
+ * YAML beside it says something else.
97
+ *
98
+ * WHAT THIS DOES NOT CLAIM. Someone who edits the body can recompute this
99
+ * label as easily as the writer does; it is an integrity check against a
100
+ * PARTIAL edit — a hand edit, a bad merge, a truncated write — not a signature.
101
+ * That is the same honesty the source label already owed: neither resists an
102
+ * author, and resisting an author is what the tool-call deny (2.2) and the
103
+ * ratification record (2.1) are for. Three cheap mechanisms over one expensive
104
+ * one, each named for what it actually covers.
105
+ *
106
+ * The body text is `JSON.stringify` of the parsed document, which is exactly
107
+ * what lands in the file, so a reader recovers it by re-stringifying what it
108
+ * parsed. A test pins that round trip rather than assuming it.
109
+ */
82
110
  export function compile(yamlText: string, table: TableName = 'manifest'): string {
83
111
  const spec = TABLES[table];
84
112
  const doc = (spec.yamlVersion === undefined
85
113
  ? parseYaml(yamlText)
86
114
  : parseYaml(yamlText, { version: spec.yamlVersion })) as unknown;
87
- return JSON.stringify({ fingerprint: tableFingerprint(yamlText), [spec.key]: doc });
115
+ return JSON.stringify({
116
+ fingerprint: tableFingerprint(yamlText),
117
+ body_fingerprint: tableFingerprint(JSON.stringify(doc)),
118
+ [spec.key]: doc,
119
+ });
88
120
  }
89
121
 
90
122
  export function main(argv: readonly string[] = process.argv.slice(2)): number {
@@ -42,6 +42,7 @@ import {
42
42
  strip_source_prefix,
43
43
  } from './_lib/agent_src.js';
44
44
  import { rewriteProjectedBodyLinks } from './_lib/guidelines_lane.js';
45
+ import { render_windsurfrules, strip_frontmatter } from './_lib/windsurf_render.js';
45
46
  // Import-safety note: `project_thin_rules` guards its CLI entry
46
47
  // (`_isCliEntry()` before `process.exit(main())`), so importing it here is
47
48
  // side-effect-free. condense.ts is bundled into the installer, where a bare
@@ -49,7 +50,7 @@ import { rewriteProjectedBodyLinks } from './_lib/guidelines_lane.js';
49
50
  // bundled-CLI-entry-guard landmine. Verified before wiring, not assumed.
50
51
  import { build_thin } from './project_thin_rules.js';
51
52
  import { build_claude_hook_matrix } from './_lib/claude_settings_hooks.js';
52
- import { describeDroppedHosts, normalizeLeanProjectionMode, resolveLeanProjectionHosts, thinsHost,
53
+ import { describeDroppedHosts, resolveLeanProjection, thinsHost,
53
54
  writesThinFiles, type LeanProjectionHosts, type LeanProjectionMode } from './_lib/lean_projection_mode.js';
54
55
  import { is_claude_builtin_name } from './_lib/claude_builtin_names.js';
55
56
  import { project_settings_path, load_agent_settings } from './_lib/agent_settings.js';
@@ -461,16 +462,14 @@ function _read_projection_scope_dedup(): boolean {
461
462
 
462
463
 
463
464
  function _lean_projection_settings(): { mode: LeanProjectionMode; hosts: LeanProjectionHosts } {
464
- const data = load_agent_settings({ project_path: MODULE_STATE.SETTINGS_FILE });
465
- const lean = data['lean_projection'];
466
- const obj =
467
- typeof lean === 'object' && lean !== null && !Array.isArray(lean)
468
- ? (lean as Record<string, unknown>)
469
- : {};
470
- return {
471
- mode: normalizeLeanProjectionMode(obj['mode'] ?? ''),
472
- hosts: resolveLeanProjectionHosts(obj['hosts']),
473
- };
465
+ // Step 1.2 of `road-to-a-rule-carrier-that-works-outside-the-repo`: this is
466
+ // now the shared resolver rather than one of three private readers. The
467
+ // INPUT is unchanged — `MODULE_STATE.SETTINGS_FILE` is still the file, so
468
+ // the projector's answer is the answer it always gave — and only the code
469
+ // that interprets it is shared. That is risk 2 of the roadmap's register
470
+ // ("making the hook agree with the projector could also move the
471
+ // projector") discharged by construction instead of by a test alone.
472
+ return resolveLeanProjection({ settingsPath: MODULE_STATE.SETTINGS_FILE });
474
473
  }
475
474
 
476
475
  // --- hashing -----------------------------------------------------------------
@@ -778,15 +777,9 @@ function _filter_tool_dirs(mapping: Record<string, string>): Record<string, stri
778
777
  return out;
779
778
  }
780
779
 
781
- export function strip_frontmatter(content: string): string {
782
- if (content.startsWith('---')) {
783
- const end = content.indexOf('---', 3);
784
- if (end !== -1) {
785
- content = _lstripNewlines(content.slice(end + 3));
786
- }
787
- }
788
- return content;
789
- }
780
+ // Moved to `_lib/windsurf_render.ts` beside its one remaining caller here and
781
+ // the census that renders through it; re-exported so every importer's path holds.
782
+ export { strip_frontmatter };
790
783
 
791
784
  // ── Path rewriter (P1 of road-to-path-fixes.md) ───────────────────────────
792
785
  // Kept byte-identical to check_condensation.ts::_rewritePaths (the two MUST
@@ -1229,14 +1222,8 @@ export function generate_windsurfrules(): number {
1229
1222
  // on `.windsurf/rules`. Without this line removing the per-run filter regressed
1230
1223
  // it 13 → 113: the per-run filter had been covering it by accident.
1231
1224
  const rules = partition_rules_for_dir('.windsurf/rules', _scoped_rule_basenames());
1232
- const parts = ['# Auto-generated from dist/agent-src/rules/ — do not edit directly\n'];
1233
- for (const rule of rules) {
1234
- const p = path.join(MODULE_STATE.RULES_SOURCE, rule);
1235
- const content = strip_frontmatter(_readText(p));
1236
- parts.push(`---\n\n${_strip(content)}\n`);
1237
- }
1238
1225
  const output = path.join(MODULE_STATE.PROJECT_ROOT, '.windsurfrules');
1239
- _writeText(output, parts.join('\n') + '\n');
1226
+ _writeText(output, render_windsurfrules(MODULE_STATE.RULES_SOURCE, rules));
1240
1227
  info(` ✅ Generated .windsurfrules (${rules.length} rules)`);
1241
1228
  return rules.length;
1242
1229
  }
@@ -515,6 +515,107 @@ function legProjections(ctx: Ctx): string {
515
515
  return 'cursor + windsurf + claude projection trees present in global scope';
516
516
  }
517
517
 
518
+ // ── git-convention leg ─────────────────────────────────────────────
519
+ //
520
+ // A consumer project has neither `scripts-run` nor `node_modules`, so the only
521
+ // code an installed command can reach is the `agent-config` binary. `/pr:merge`
522
+ // reads the update strategy through `git:convention show`; this leg runs that
523
+ // verb from the packed install in a repository that commits a
524
+ // `.git-convention.yml` and pushes it to an `origin`, so the strategy resolves
525
+ // at a real target commit.
526
+
527
+ const GIT_CONVENTION_CARRIER = 'git:\n commit_format: ticket-conventional\n update_strategy: rebase\n';
528
+
529
+ /** The verdict on `git:convention show --json`; throws with the reason on any miss. */
530
+ export function checkGitConventionShow(status: number, stdout: string, stderr = ''): string {
531
+ if (status !== 0) throw new Error(`git:convention show exit ${status}: ${(stdout + stderr).slice(-400)}`);
532
+ let parsed: { keys?: Record<string, { value?: unknown; state?: unknown; source?: unknown }> };
533
+ try {
534
+ parsed = JSON.parse(stdout) as typeof parsed;
535
+ } catch {
536
+ throw new Error(`git:convention show --json printed output that is not JSON: ${stdout.slice(0, 200)}`);
537
+ }
538
+ const expected: Record<string, string> = { commit_format: 'ticket-conventional', update_strategy: 'rebase' };
539
+ for (const [key, value] of Object.entries(expected)) {
540
+ const r = parsed.keys?.[key];
541
+ const fromCarrier = typeof r?.source === 'string' && r.source.includes('.git-convention.yml');
542
+ if (r?.value !== value || r.state !== 'valid' || !fromCarrier) {
543
+ throw new Error(`git.${key} did not resolve from the committed carrier: ${JSON.stringify(r ?? null)}`);
544
+ }
545
+ }
546
+ return 'commit_format=ticket-conventional, update_strategy=rebase, both from the committed .git-convention.yml';
547
+ }
548
+
549
+ /**
550
+ * The verdict on `git:convention subject` from the packed install: a valid
551
+ * subject resolves (exit 0), and a ticket inside a compound scope is rejected
552
+ * (exit 1) under the committed `ticket-conventional`.
553
+ */
554
+ export function checkGitConventionSubject(
555
+ valid: { status: number; stdout: string; stderr?: string },
556
+ compound: { status: number; stdout: string; stderr?: string },
557
+ ): string {
558
+ if (valid.status !== 0) {
559
+ throw new Error(`git:convention subject rejected a valid subject, exit ${valid.status}: ${(valid.stdout + (valid.stderr ?? '')).slice(-400)}`);
560
+ }
561
+ if (compound.status !== 1 || !compound.stdout.includes('inside the scope')) {
562
+ throw new Error(`git:convention subject did not reject a ticket inside a compound scope, exit ${compound.status}: ${compound.stdout.slice(-400)}`);
563
+ }
564
+ return 'a valid subject resolves; a ticket inside a compound scope is rejected';
565
+ }
566
+
567
+ /**
568
+ * The verdict on `git:convention sync` from the packed install: the update
569
+ * `/pr:merge` § 2 runs. A current branch exits 0; a behind one is refused with
570
+ * exit 3 under the committed `rebase`, never merged.
571
+ */
572
+ export function checkGitConventionSync(
573
+ current: { status: number; stdout: string; stderr?: string },
574
+ behind: { status: number; stdout: string; stderr?: string },
575
+ ): string {
576
+ if (current.status !== 0) {
577
+ throw new Error(`git:convention sync did not pass a current branch, exit ${current.status}: ${(current.stdout + (current.stderr ?? '')).slice(-400)}`);
578
+ }
579
+ if (behind.status !== 3 || !behind.stdout.includes('git.update_strategy is `rebase`')) {
580
+ throw new Error(`git:convention sync did not refuse a behind branch under rebase, exit ${behind.status}: ${behind.stdout.slice(-400)}`);
581
+ }
582
+ return 'sync passes a current branch and refuses a behind one with exit 3';
583
+ }
584
+
585
+ function legGitConvention(ctx: Ctx): string {
586
+ const env = binEnv(ctx);
587
+ const remote = path.join(ctx.tmpRoot, 'git-convention-origin.git');
588
+ const repo = path.join(ctx.tmpRoot, 'git-convention-project');
589
+ const git = (cwd: string, ...args: string[]): void => {
590
+ const r = run('git', ['-c', 'user.name=matrix', '-c', 'user.email=matrix@example.com', '-c', 'commit.gpgsign=false', ...args], {
591
+ cwd,
592
+ env,
593
+ });
594
+ if (r.status !== 0) throw new Error(`git ${args[0] ?? ''} failed: ${r.stderr.slice(-300)}`);
595
+ };
596
+ git(ctx.tmpRoot, 'init', '-q', '--bare', '-b', 'main', remote);
597
+ git(ctx.tmpRoot, 'init', '-q', '-b', 'main', repo);
598
+ fs.writeFileSync(path.join(repo, '.git-convention.yml'), GIT_CONVENTION_CARRIER);
599
+ git(repo, 'add', '.git-convention.yml');
600
+ git(repo, 'commit', '-q', '-m', 'declare the git convention');
601
+ git(repo, 'remote', 'add', 'origin', remote);
602
+ git(repo, 'push', '-q', '-u', 'origin', 'main');
603
+ const r = run(ctx.bin, ['git:convention', 'show', '--json', '--base', 'origin/main'], { cwd: repo, env });
604
+ const shown = checkGitConventionShow(r.status, r.stdout, r.stderr);
605
+ const subject = (line: string) => run(ctx.bin, ['git:convention', 'subject'], { cwd: repo, env, input: `${line}\n` });
606
+ const subjects = checkGitConventionSubject(subject('DEV-1 feat(api): add x'), subject('DEV-1 feat(api,DEV-1): add x'));
607
+ const sync = () => run(ctx.bin, ['git:convention', 'sync', '--base', 'origin/main'], { cwd: repo, env });
608
+ git(repo, 'switch', '-q', '-c', 'feature');
609
+ const current = sync();
610
+ git(repo, 'switch', '-q', 'main');
611
+ fs.writeFileSync(path.join(repo, 'advance.txt'), 'advance\n');
612
+ git(repo, 'add', 'advance.txt');
613
+ git(repo, 'commit', '-q', '-m', 'advance main');
614
+ git(repo, 'push', '-q', 'origin', 'main');
615
+ git(repo, 'switch', '-q', 'feature');
616
+ return `${shown}; ${subjects}; ${checkGitConventionSync(current, sync())}`;
617
+ }
618
+
518
619
  function legUninstall(ctx: Ctx): string {
519
620
  const r = run(ctx.bin, ['uninstall', '--global', '--tools=claude-code,cursor,windsurf', '--force'], {
520
621
  cwd: ctx.projectDir,
@@ -570,6 +671,7 @@ const LEGS: Array<{ name: string; fn: (ctx: Ctx) => string | Promise<string> }>
570
671
  { name: 'hooks', fn: legHooks },
571
672
  { name: 'hook-lifecycle', fn: legHookLifecycle },
572
673
  { name: 'projections', fn: legProjections },
674
+ { name: 'git-convention', fn: legGitConvention },
573
675
  { name: 'uninstall', fn: legUninstall },
574
676
  { name: 'upgrade', fn: legUpgrade },
575
677
  ];
@@ -7,21 +7,25 @@
7
7
  * module exactly (snake_case kept deliberately — fidelity over TS idiom).
8
8
  *
9
9
  * Maintains a deterministic state file the rule body cites for the
10
- * freshness threshold, the 3-failure stop, and tool-loop detection. The
11
- * agent's job shrinks from "remember three counters" to "read this file
12
- * before responding".
10
+ * freshness threshold and the 3-failure stop. The agent's job shrinks from
11
+ * "remember counters" to "read this file before responding".
13
12
  *
14
13
  * Output: `agents/state/context-hygiene.json`
15
14
  * {
16
15
  * "tool_calls": <int>, // running PostToolUse count
17
- * "consecutive_same_tool": <int>, // includes the latest call
18
- * "last_tool": "<name>",
19
16
  * "tool_history": [..., last 5 names],
20
- * "loop_detected": <bool>, // ≥ 3 same tool in a row
21
17
  * "freshness_threshold": <int|null>, // 20/40/60 milestone hit
22
18
  * "checked_at": "<iso8601>"
23
19
  * }
24
20
  *
21
+ * No same-tool-repeat ("loop") field: a same-tool-name counter fires on
22
+ * ordinary, non-looping work (an enumerated sweep over distinct targets
23
+ * calls the same tool repeatedly by design — the rule's own text says
24
+ * "'similar parameters' is the load-bearing word"), reaches no model (its
25
+ * only emission was a verbose stderr line), and had two readers, one of
26
+ * which read a path nothing wrote. Removed rather than repaired —
27
+ * road-to-signals-that-mean-what-they-say D1.
28
+ *
25
29
  * Exit code is always 0.
26
30
  *
27
31
  * CLI:
@@ -33,8 +37,9 @@ import path from "node:path";
33
37
  import { fileURLToPath, pathToFileURL } from "node:url";
34
38
 
35
39
  // Re-use the shared atomic-write helper so concerns honour the single
36
- // `agents/runtime/state/.dispatcher.lock` discipline (hook-architecture-v1.md
37
- // § Concurrency, Phase 7.4).
40
+ // `agents/state/.dispatcher.lock` discipline (hook-architecture-v1.md,
41
+ // Concurrency, Phase 7.4) — the lock sits beside THIS hook's own target, not
42
+ // the fixed `agents/runtime/state/` path the discipline cites generally.
38
43
  import { atomic_write_json } from "./hooks/state_io.js";
39
44
  import { readHookStdin } from "./hooks/hook_stdin.js";
40
45
 
@@ -45,7 +50,6 @@ import { readHookStdin } from "./hooks/hook_stdin.js";
45
50
  export const STATE_DIR = path.join("agents", "state");
46
51
  export const STATE_FILE = path.join(STATE_DIR, "context-hygiene.json");
47
52
 
48
- export const LOOP_THRESHOLD = 3; // 3+ consecutive same-tool calls
49
53
  export const HISTORY_DEPTH = 5;
50
54
  export const FRESHNESS_MILESTONES = [20, 40, 60] as const;
51
55
 
@@ -56,10 +60,7 @@ type StateDict = Record<string, unknown>;
56
60
  function _empty_state(): StateDict {
57
61
  return {
58
62
  tool_calls: 0,
59
- consecutive_same_tool: 0,
60
- last_tool: null,
61
63
  tool_history: [],
62
- loop_detected: false,
63
64
  freshness_threshold: null,
64
65
  };
65
66
  }
@@ -134,14 +135,6 @@ function _update(state: StateDict, tool: string | null): StateDict {
134
135
  const curr_count = prev_count + 1;
135
136
  state["tool_calls"] = curr_count;
136
137
 
137
- const last = state["last_tool"];
138
- if (last === tool) {
139
- state["consecutive_same_tool"] = _asInt(state["consecutive_same_tool"]) + 1;
140
- } else {
141
- state["consecutive_same_tool"] = 1;
142
- }
143
- state["last_tool"] = tool;
144
-
145
138
  let hist = state["tool_history"];
146
139
  if (!Array.isArray(hist)) {
147
140
  hist = [];
@@ -149,8 +142,6 @@ function _update(state: StateDict, tool: string | null): StateDict {
149
142
  (hist as unknown[]).push(tool);
150
143
  state["tool_history"] = (hist as unknown[]).slice(-HISTORY_DEPTH);
151
144
 
152
- state["loop_detected"] = _asInt(state["consecutive_same_tool"]) >= LOOP_THRESHOLD;
153
-
154
145
  const ms = _milestone_hit(prev_count, curr_count);
155
146
  if (ms !== null) {
156
147
  state["freshness_threshold"] = ms;
@@ -211,7 +202,6 @@ export function run(
211
202
  if (verbose) {
212
203
  process.stderr.write(
213
204
  `context-hygiene-hook: tool_calls=${pyRepr(state["tool_calls"])} ` +
214
- `loop=${pyRepr(state["loop_detected"])} ` +
215
205
  `threshold=${pyRepr(state["freshness_threshold"])}\n`,
216
206
  );
217
207
  }
@@ -11,12 +11,23 @@
11
11
  // turn: `task cost:preflight` or `node scripts/cost/preflight.mjs`.
12
12
 
13
13
  import { spawnSync } from 'node:child_process';
14
+ import { fileURLToPath } from 'node:url';
15
+ import { dirname, join } from 'node:path';
14
16
 
15
17
  const QUIET = process.env.PREFLIGHT_QUIET === '1';
16
18
 
19
+ // budget.mjs is this file's SIBLING, so resolve it from here rather than from
20
+ // the working directory. A cwd-relative 'scripts/cost/budget.mjs' resolved to
21
+ // nothing in this tree (the scripts live under src/scripts/), spawnSync
22
+ // returned empty stdout, and empty stdout is read below as "no budget
23
+ // configured" — so the hard stop silently exited 0 on a spent budget from
24
+ // every working directory. Sibling resolution also survives the consumer
25
+ // install, where the pair lands under a different prefix together.
26
+ const BUDGET_SCRIPT = join(dirname(fileURLToPath(import.meta.url)), 'budget.mjs');
27
+
17
28
  function runBudgetCheck() {
18
29
  const env = { ...process.env, BUDGET_QUIET: '1' };
19
- const r = spawnSync('node', ['scripts/cost/budget.mjs', 'check'], { env, encoding: 'utf-8' });
30
+ const r = spawnSync('node', [BUDGET_SCRIPT, 'check'], { env, encoding: 'utf-8' });
20
31
  if (r.error) return { ok: false, fatal: true, msg: String(r.error) };
21
32
  const out = (r.stdout || '').trim();
22
33
  if (!out) return { ok: true, unbudgeted: true };
@@ -2127,7 +2127,7 @@ function _ljust(s: string, width: number): string {
2127
2127
 
2128
2128
  function _debate_refusal_cap(ai_cfg: Dict): number {
2129
2129
  const debate_block = (ai_cfg['debate'] as Dict) || {};
2130
- return _pyFloat(debate_block['max_cost_usd'] ?? 5.0, 5.0) || 0.0;
2130
+ return _pyFloat(debate_block['max_cost_usd'] ?? 0.0, 0.0) || 0.0; // 0 = no cap (ADR-279)
2131
2131
  }
2132
2132
 
2133
2133
  function _emit_shadow_slo_banner(): void {
@@ -2560,9 +2560,9 @@ function cmd_run(
2560
2560
 
2561
2561
  const cost_cfg = (ai_cfg['cost_budget'] as Dict) || {};
2562
2562
  const budget = new CostBudget({
2563
- max_input_tokens: _pyInt(cost_cfg['max_input_tokens'] ?? 50_000, 50_000),
2564
- max_output_tokens: _pyInt(cost_cfg['max_output_tokens'] ?? 20_000, 20_000),
2565
- max_calls: _pyInt(cost_cfg['max_calls'] ?? 10, 10),
2563
+ max_input_tokens: _pyInt(cost_cfg['max_input_tokens'] ?? 0, 0), // 0 = unbounded (ADR-279)
2564
+ max_output_tokens: _pyInt(cost_cfg['max_output_tokens'] ?? 0, 0), // 0 = unbounded (ADR-279)
2565
+ max_calls: _pyInt(cost_cfg['max_calls'] ?? 10, 10), // a call count, not money — kept
2566
2566
  max_total_usd: _pyFloat(cost_cfg['max_total_usd'] ?? 0.0, 0.0) || 0.0,
2567
2567
  // Rolling 24h cap. Unwired until now: the field existed on CostBudget and
2568
2568
  // gated the spend-ledger append, but no caller ever passed it, so the
@@ -3076,9 +3076,9 @@ function cmd_debate(
3076
3076
 
3077
3077
  const cost_cfg = (ai_cfg['cost_budget'] as Dict) || {};
3078
3078
  const budget = new CostBudget({
3079
- max_input_tokens: _pyInt(cost_cfg['max_input_tokens'] ?? 50_000, 50_000),
3080
- max_output_tokens: _pyInt(cost_cfg['max_output_tokens'] ?? 20_000, 20_000),
3081
- max_calls: _pyInt(cost_cfg['max_calls'] ?? 10, 10),
3079
+ max_input_tokens: _pyInt(cost_cfg['max_input_tokens'] ?? 0, 0), // 0 = unbounded (ADR-279)
3080
+ max_output_tokens: _pyInt(cost_cfg['max_output_tokens'] ?? 0, 0), // 0 = unbounded (ADR-279)
3081
+ max_calls: _pyInt(cost_cfg['max_calls'] ?? 10, 10), // a call count, not money — kept
3082
3082
  max_total_usd: _pyFloat(cost_cfg['max_total_usd'] ?? 0.0, 0.0) || 0.0,
3083
3083
  // Rolling 24h cap. Unwired until now: the field existed on CostBudget and
3084
3084
  // gated the spend-ledger append, but no caller ever passed it, so the
@@ -738,6 +738,29 @@ export const RETURN_ENVELOPE_POINTER =
738
738
  'write-to-disk-first rule: contexts/execution/subagent-response-contract.md. ' +
739
739
  'The findings table stays a file.';
740
740
 
741
+ /**
742
+ * Two-line header prepended, verbatim and at byte offset 0, to every
743
+ * `<slug>.review-input/roadmap.md` snapshot this dispatcher writes.
744
+ *
745
+ * Its NAMED job is `check_references`'s file-level skip marker
746
+ * (`check_references.ts` `FILE_SKIP_MARKER`): the snapshot sits under a
747
+ * tree that gate walks, while the LIVE roadmap layer is deliberately
748
+ * excluded from it — so a roadmap that legitimately quotes a nonexistent
749
+ * path (e.g. documenting a hallucinated council citation) would red CI
750
+ * through its own review snapshot.
751
+ *
752
+ * That is its only job. It used to carry a second, unnamed one — pushing the
753
+ * frontmatter fence off byte offset 0 kept `check_agent_artifact_location`
754
+ * from reading the snapshot as a misplaced roadmap. That gate now exempts the
755
+ * snapshot path by name (`isReviewInputRoadmapSnapshot`), so this header may
756
+ * change without that gate noticing. Tested in
757
+ * `check_agent_artifact_location.test.ts` (describe: "review-input snapshot
758
+ * convention").
759
+ */
760
+ export const REVIEW_INPUT_ROADMAP_HEADER =
761
+ '<!-- check-refs: skip -->\n' +
762
+ '<!-- verbatim roadmap snapshot for the R2 reviewer; the live roadmap layer is excluded from check_references, and a snapshot must not fail a gate its source is exempt from -->\n';
763
+
741
764
  function reviewerPrompt(args: {
742
765
  slug: string;
743
766
  headSha: string;
@@ -1288,19 +1311,9 @@ function runDispatch(args: Args): number {
1288
1311
 
1289
1312
  redactions += writeRedacted(path.join(inputDirAbs, 'diff.patch'), scopeDiffText, denyPatterns);
1290
1313
  if (roadmapText !== null) {
1291
- // The snapshot lands under agents/evidence/, which check_references
1292
- // walks, while the live roadmap layer is deliberately excluded from
1293
- // that gate — so a roadmap that legitimately quotes a nonexistent
1294
- // path (e.g. documenting a hallucinated council citation) would red
1295
- // CI through its own review snapshot. The header exemption keeps the
1296
- // snapshot verbatim below the marker; roadmap_hash binds the LIVE
1297
- // file and is unaffected. Found by the zcs-close CI run, 2026-08-09.
1298
- const snapshotHeader =
1299
- '<!-- check-refs: skip -->\n' +
1300
- '<!-- verbatim roadmap snapshot for the R2 reviewer; the live roadmap layer is excluded from check_references, and a snapshot must not fail a gate its source is exempt from -->\n';
1301
1314
  redactions += writeRedacted(
1302
1315
  path.join(inputDirAbs, 'roadmap.md'),
1303
- snapshotHeader + roadmapText,
1316
+ REVIEW_INPUT_ROADMAP_HEADER + roadmapText,
1304
1317
  denyPatterns,
1305
1318
  );
1306
1319
  }