@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,63 @@
1
+ /**
2
+ * The windsurf single-file surface, rendered — one renderer, two callers.
3
+ *
4
+ * `road-to-a-hook-bundle-with-one-yaml-reader` 3.1. `condense.generate_windsurfrules`
5
+ * WRITES `.windsurfrules`; the standing-payload census needs the same bytes to
6
+ * report windsurf's figure without reading that file, because it is an untracked
7
+ * generated projection and reading it published a number that tracked when the
8
+ * checkout last ran `task generate-tools` rather than anything about the tree.
9
+ *
10
+ * Both callers share THIS function. A second renderer living in the census would
11
+ * have measured a file nobody receives, which is Risk 3 of that roadmap.
12
+ *
13
+ * WHY A SEPARATE MODULE rather than an export from `condense.ts`: that file sits
14
+ * 1,228 lines over the 1,500-line cap `check_source_size_budget` ratchets, so
15
+ * every line added there is a new violation. Splitting the renderer out moves
16
+ * `condense.ts` DOWN. The file is small on purpose and carries only what the
17
+ * render needs.
18
+ *
19
+ * `strip_frontmatter` moved here with it — it is the render's one non-trivial
20
+ * dependency, it has exactly one caller left inside `condense.ts`, and leaving it
21
+ * behind would have meant either an import cycle or a second copy.
22
+ * `condense.ts` re-exports it, so `src/install/emit_host_rules_cli.ts` and every
23
+ * other importer keeps its path.
24
+ */
25
+ import * as fs from 'node:fs';
26
+ import * as path from 'node:path';
27
+
28
+ /** Python `str.lstrip("\n")` — strip only leading newlines. Mirrors `condense._lstripNewlines`. */
29
+ function lstripNewlines(s: string): string {
30
+ return s.replace(/^\n+/, '');
31
+ }
32
+
33
+ /** Python `str.strip()` with no args — strip leading/trailing Unicode whitespace. Mirrors `condense._strip`. */
34
+ function strip(s: string): string {
35
+ return s.replace(/^\s+/u, '').replace(/\s+$/u, '');
36
+ }
37
+
38
+ /** Drop a leading `---` frontmatter block, if the content opens with one. */
39
+ export function strip_frontmatter(content: string): string {
40
+ if (content.startsWith('---')) {
41
+ const end = content.indexOf('---', 3);
42
+ if (end !== -1) {
43
+ content = lstripNewlines(content.slice(end + 3));
44
+ }
45
+ }
46
+ return content;
47
+ }
48
+
49
+ /**
50
+ * The exact bytes `generate_windsurfrules` writes, for a given rule set.
51
+ *
52
+ * `rulesSource` is a parameter rather than `condense.MODULE_STATE.RULES_SOURCE`
53
+ * so a caller can render a tree it names — the census renders the projection
54
+ * source directly, with no module state to set up.
55
+ */
56
+ export function render_windsurfrules(rulesSource: string, rules: readonly string[]): string {
57
+ const parts = ['# Auto-generated from dist/agent-src/rules/ — do not edit directly\n'];
58
+ for (const rule of rules) {
59
+ const content = strip_frontmatter(fs.readFileSync(path.join(rulesSource, rule), 'utf-8'));
60
+ parts.push(`---\n\n${strip(content)}\n`);
61
+ }
62
+ return parts.join('\n') + '\n';
63
+ }
@@ -9,7 +9,7 @@
9
9
  * error on the wrong rung, not diligence.
10
10
  *
11
11
  * Composes with — replaces nothing:
12
- * - the N=3 validation-loop budget (`autonomous-execution`),
12
+ * - the `execution.fix_loop_max` validation-loop budget (`autonomous-execution`),
13
13
  * - the ADR-109 / `subagent-response-contract` body + 4-status envelope
14
14
  * (`subagent-steering`): the partial result rides as the body of a
15
15
  * `BLOCKED` envelope with `budget_hit: true` as the escalation flag.
@@ -187,11 +187,26 @@ export function scan(d: string): [Row[], Row[], string[]] {
187
187
  * A scope with no refs renders as `—`: a qualifier on nothing is not a
188
188
  * supersession, and printing the prose alone would read as one.
189
189
  */
190
+ /**
191
+ * Escape a `|` for safety inside a Markdown table cell. The free-text scope
192
+ * fields this feeds (`supersedes_scope` / `superseded_scope`) routinely quote
193
+ * a table row from the record they describe — and a quoted row has its own
194
+ * `|` column separators, verbatim, in the frontmatter prose. Unescaped, that
195
+ * splits the generated row into extra columns rather than rendering the quote
196
+ * (found live in ADR-230's and ADR-279's own rows, both quoting the same
197
+ * table cell from ADR-230 § Decision). `refs` itself is never escaped: it is
198
+ * always an `ADR-NNN` token list this generator produces or validates, never
199
+ * free text.
200
+ */
201
+ function escapeCell(text: string): string {
202
+ return text.replaceAll('|', '\\|');
203
+ }
204
+
190
205
  export function supersessionCell(refs: string | undefined, scope: string | undefined): string {
191
206
  const r = (refs ?? '').trim();
192
207
  if (r === '' || r === '—') return '—';
193
208
  const s = (scope ?? '').trim();
194
- return s === '' || s === '—' ? r : `${r} (${s})`;
209
+ return s === '' || s === '—' ? r : `${r} (${escapeCell(s)})`;
195
210
  }
196
211
 
197
212
  /** Mirror `row(r)`. */
@@ -29,15 +29,23 @@ import * as path from 'node:path';
29
29
  export const CLI_CALLS_ATTRIBUTION_SUFFIX = '.attribution.json';
30
30
 
31
31
  /**
32
- * Who booked a call. Enumerated because the consumer set is closed: exactly two
33
- * files in the tree construct a `CliClient`.
32
+ * Who booked a call. Enumerated because the consumer set is closed: exactly
33
+ * three files in the tree construct a `CliClient`.
34
34
  *
35
- * `unknown` is a FINDING when it appears — it means a third booking path exists
36
- * that this enumeration does not know about. That is how the test suite was
37
- * caught spending the operator's live budget.
35
+ * `unknown` is a FINDING when it appears — it means a booking path exists that
36
+ * this enumeration does not know about. That is how the test suite was caught
37
+ * spending the operator's live budget.
38
38
  */
39
39
  export const CLI_CONSUMER_COUNCIL = 'council';
40
40
  export const CLI_CONSUMER_TEAM = 'team';
41
+ /**
42
+ * The dogfooded self-review gate. Third because `self_review_gate.ts` is
43
+ * CLI-first since this constant was added: the subscription transport is tried
44
+ * before the API one, so a local or self-hosted run books here rather than
45
+ * spending API credit. A hosted CI runner has no vendor CLI on PATH and falls
46
+ * through to the API transport, which books nothing against this counter.
47
+ */
48
+ export const CLI_CONSUMER_SELF_REVIEW = 'self-review';
41
49
  export const CLI_CONSUMER_UNKNOWN = 'unknown';
42
50
 
43
51
  /**
@@ -88,6 +88,7 @@ import * as user_global_paths from '../_lib/user_global_paths.js';
88
88
  import { jsonDumpsIndent2 as _jsonDumpsIndent2 } from './_py_json.js';
89
89
  import * as budget from './cli_call_budget.js';
90
90
  import { appendEvent } from './events_log.js';
91
+ import { OPENAI_CLI_VENDOR_DEFAULT } from './vendor_defaults.js';
91
92
 
92
93
  export const ANTHROPIC_KEY_FILENAME = 'anthropic.key';
93
94
  export const OPENAI_KEY_FILENAME = 'openai.key';
@@ -124,23 +125,12 @@ export const DEFAULT_PERPLEXITY_MODEL = 'sonar-pro';
124
125
  // divergence is a one-line change, not a hunt through inline literals.
125
126
  // (`xai` / `perplexity` CLI reuse their API constants: their CLIs are
126
127
  // community wrappers around the same paid API, so the values do not diverge.)
127
- /**
128
- * Sentinel: let the codex CLI pick its own model, by omitting `--model`.
129
- *
130
- * This is not a placeholder for a value nobody looked up. Measured
131
- * 2026-08-15 against `codex exec --json` on a ChatGPT-account (subscription)
132
- * transport, every explicitly named candidate was refused with
133
- * `400 invalid_request_error: The '<model>' model is not supported when using
134
- * Codex with a ChatGPT account.` — `gpt-4o`, `gpt-5` (this constant's previous
135
- * value) and `gpt-5.1-codex` alike. Omitting the flag answered normally.
136
- *
137
- * So the only value known to work on this transport is "whatever the CLI
138
- * chooses", and pinning ANY name here would re-break the seat the next time
139
- * the vendor rotates its lineup. The label is carried into records as-is so a
140
- * reader can see that no model was pinned, rather than a name being implied
141
- * that nobody verified.
142
- */
143
- export const OPENAI_CLI_VENDOR_DEFAULT = 'codex-default';
128
+ // `OPENAI_CLI_VENDOR_DEFAULT` lives in `vendor_defaults.ts`, re-exported here
129
+ // so every existing importer keeps resolving. It moved because `config.ts`
130
+ // wanted that one string and was charged this whole module for it in the
131
+ // composed hook bundle — 51,523 bytes on every dispatch; the reasoning and the
132
+ // measurement are in that file's header.
133
+ export { OPENAI_CLI_VENDOR_DEFAULT } from './vendor_defaults.js';
144
134
 
145
135
  /**
146
136
  * Models MEASURED to be refused by the codex subscription transport, with the
@@ -1011,6 +1001,7 @@ export const CLI_CALLS_FILENAME = 'cli-calls.json';
1011
1001
  export {
1012
1002
  CLI_CALLS_ATTRIBUTION_SUFFIX,
1013
1003
  CLI_CONSUMER_COUNCIL,
1004
+ CLI_CONSUMER_SELF_REVIEW,
1014
1005
  CLI_CONSUMER_TEAM,
1015
1006
  CLI_CONSUMER_UNKNOWN,
1016
1007
  QUOTA_SOURCE_LOCAL_BUDGET,
@@ -1678,16 +1669,22 @@ export function _foldSystemPrompt(system_prompt: string, user_prompt: string): s
1678
1669
  export class AnthropicCliClient extends CliClient {
1679
1670
  override subscription_label = 'claude-pro';
1680
1671
 
1672
+ // `...opts` rather than a field list, in all five CLI subclasses, and the
1673
+ // spread IS the fix rather than a tidy. Each of these constructors used to
1674
+ // name six option fields explicitly and forward those — so when
1675
+ // `CliClientOptions` grew a seventh, `consumer`, every subclass silently
1676
+ // dropped it. Both construction sites passed it, `CliClient` read
1677
+ // `opts.consumer ?? CLI_CONSUMER_UNKNOWN`, and the sidecar recorded
1678
+ // `unknown` for every CLI call ever booked: measured 2026-10-05 as
1679
+ // `{"anthropic":{"unknown":2},"openai":{"unknown":2}}` after a council
1680
+ // round. A field list can forget a field. A spread cannot, so the eighth
1681
+ // option needs no edit here and cannot repeat this.
1682
+ //
1683
+ // `model` stays explicit because it is the one field each subclass
1684
+ // overrides with its own pinned default; everything else passes through.
1681
1685
  constructor(opts: CliClientOptions = {}) {
1682
1686
  super(
1683
- {
1684
- model: opts.model ?? DEFAULT_ANTHROPIC_CLI_MODEL,
1685
- binary: opts.binary,
1686
- timeout_seconds: opts.timeout_seconds,
1687
- max_calls_per_day: opts.max_calls_per_day,
1688
- warn_at: opts.warn_at,
1689
- cli_calls_path: opts.cli_calls_path,
1690
- },
1687
+ { ...opts, model: opts.model ?? DEFAULT_ANTHROPIC_CLI_MODEL },
1691
1688
  { name: 'anthropic', default_binary: 'claude' },
1692
1689
  );
1693
1690
  }
@@ -1817,14 +1814,7 @@ export class OpenAICliClient extends CliClient {
1817
1814
 
1818
1815
  constructor(opts: CliClientOptions = {}) {
1819
1816
  super(
1820
- {
1821
- model: opts.model ?? DEFAULT_OPENAI_CLI_MODEL,
1822
- binary: opts.binary,
1823
- timeout_seconds: opts.timeout_seconds,
1824
- max_calls_per_day: opts.max_calls_per_day,
1825
- warn_at: opts.warn_at,
1826
- cli_calls_path: opts.cli_calls_path,
1827
- },
1817
+ { ...opts, model: opts.model ?? DEFAULT_OPENAI_CLI_MODEL },
1828
1818
  { name: 'openai', default_binary: 'codex' },
1829
1819
  );
1830
1820
  }
@@ -2064,14 +2054,7 @@ export class GeminiCliClient extends CliClient {
2064
2054
 
2065
2055
  constructor(opts: CliClientOptions = {}) {
2066
2056
  super(
2067
- {
2068
- model: opts.model ?? DEFAULT_GEMINI_CLI_MODEL,
2069
- binary: opts.binary,
2070
- timeout_seconds: opts.timeout_seconds,
2071
- max_calls_per_day: opts.max_calls_per_day,
2072
- warn_at: opts.warn_at,
2073
- cli_calls_path: opts.cli_calls_path,
2074
- },
2057
+ { ...opts, model: opts.model ?? DEFAULT_GEMINI_CLI_MODEL },
2075
2058
  { name: 'gemini', default_binary: 'gemini' },
2076
2059
  );
2077
2060
  }
@@ -2217,14 +2200,7 @@ export class XAICliClient extends CliClient {
2217
2200
 
2218
2201
  constructor(opts: CliClientOptions = {}) {
2219
2202
  super(
2220
- {
2221
- model: opts.model ?? DEFAULT_XAI_MODEL,
2222
- binary: opts.binary,
2223
- timeout_seconds: opts.timeout_seconds,
2224
- max_calls_per_day: opts.max_calls_per_day,
2225
- warn_at: opts.warn_at,
2226
- cli_calls_path: opts.cli_calls_path,
2227
- },
2203
+ { ...opts, model: opts.model ?? DEFAULT_XAI_MODEL },
2228
2204
  { name: 'xai', default_binary: 'grok' },
2229
2205
  );
2230
2206
  }
@@ -2289,14 +2265,7 @@ export class PerplexityCliClient extends CliClient {
2289
2265
 
2290
2266
  constructor(opts: CliClientOptions = {}) {
2291
2267
  super(
2292
- {
2293
- model: opts.model ?? DEFAULT_PERPLEXITY_MODEL,
2294
- binary: opts.binary,
2295
- timeout_seconds: opts.timeout_seconds,
2296
- max_calls_per_day: opts.max_calls_per_day,
2297
- warn_at: opts.warn_at,
2298
- cli_calls_path: opts.cli_calls_path,
2299
- },
2268
+ { ...opts, model: opts.model ?? DEFAULT_PERPLEXITY_MODEL },
2300
2269
  { name: 'perplexity', default_binary: 'perplexity' },
2301
2270
  );
2302
2271
  }
@@ -82,7 +82,7 @@ import * as budget from './cli_call_budget.js';
82
82
  // `import type` and is erased at build, so there is no runtime cycle today.
83
83
  // Converting it to a value import — or adding any other runtime import from
84
84
  // quorum into config — creates a real ESM cycle in the loader's init path.
85
- import { OPENAI_CLI_VENDOR_DEFAULT } from './clients.js';
85
+ import { OPENAI_CLI_VENDOR_DEFAULT } from './vendor_defaults.js';
86
86
  import { parseSeatFields, type PolicyExclusion } from './seat_policy.js';
87
87
  import type { ContentClass } from './content_ceiling.js';
88
88
  import { SOLO_FLOOR_MIN_PRESENT } from './quorum.js';
@@ -291,8 +291,8 @@ export interface CostBudgetConfig {
291
291
  readonly max_output_tokens: number;
292
292
  readonly max_calls: number;
293
293
  readonly max_total_usd: number;
294
- /** Rolling 24h cap. 0 disables it — and disabling it also disables the spend
295
- * ledger, since the orchestrator only appends an entry while a cap is live. */
294
+ /** Rolling 24h cap. 0 disables it. The spend ledger is written either way
295
+ * (ADR-279); this value decides only whether the total is compared. */
296
296
  readonly daily_limit_usd: number;
297
297
  }
298
298
 
@@ -1020,7 +1020,7 @@ function _build_debate(d: Dict): DebateConfig {
1020
1020
  if (!_isDict(d)) {
1021
1021
  throw new CouncilConfigError('`debate` must be a mapping.');
1022
1022
  }
1023
- const cap = _pyFloat(_get(d, 'max_cost_usd', 5.0));
1023
+ const cap = _pyFloat(_get(d, 'max_cost_usd', 0.0)); // 0 = no refusal cap (ADR-279)
1024
1024
  if (cap < 0) {
1025
1025
  throw new CouncilConfigError(
1026
1026
  `debate.max_cost_usd must be >= 0 (got ${_pyRepr(_f(cap))}; ` +
@@ -1671,10 +1671,10 @@ function _build_cost_budget(d: Dict): CostBudgetConfig {
1671
1671
  throw new CouncilConfigError('`cost_budget` must be a mapping.');
1672
1672
  }
1673
1673
  const cb: CostBudgetConfig = {
1674
- max_input_tokens: _pyInt(_get(d, 'max_input_tokens', 500_000)),
1675
- max_output_tokens: _pyInt(_get(d, 'max_output_tokens', 200_000)),
1676
- max_calls: _pyInt(_get(d, 'max_calls', 50)),
1677
- max_total_usd: _pyFloat(_get(d, 'max_total_usd', 20.0)),
1674
+ max_input_tokens: _pyInt(_get(d, 'max_input_tokens', 0)), // 0 = unbounded (ADR-279)
1675
+ max_output_tokens: _pyInt(_get(d, 'max_output_tokens', 0)), // 0 = unbounded (ADR-279)
1676
+ max_calls: _pyInt(_get(d, 'max_calls', 50)), // fan-out, not money — kept
1677
+ max_total_usd: _pyFloat(_get(d, 'max_total_usd', 0.0)), // 0 = unbounded (ADR-279)
1678
1678
  daily_limit_usd: _pyFloat(_get(d, 'daily_limit_usd', 0.0)),
1679
1679
  };
1680
1680
  const fields: Array<[keyof CostBudgetConfig, boolean]> = [
@@ -0,0 +1,100 @@
1
+ /**
2
+ * modification_review — the review verb for a diff whose bundle contains a
3
+ * gated path: how a seat closes, and how the record's verdict follows.
4
+ *
5
+ * `road-to-self-modification-that-a-council-must-pass` steps 3.2 and 3.3.
6
+ *
7
+ * WHY THE EXISTING STANCE PARSER AND NOT A NEW ONE. Seats already close on a
8
+ * `STANCE: … | CONFIDENCE: … | DEALBREAKER: …` line, and `stance_tally` already
9
+ * parses it — including the two cosmetic defects it forgives. A second grammar
10
+ * for the same closing line would be a second thing to keep in step with the
11
+ * prompt, and the first time they diverged a seat's verdict would be read by
12
+ * one and dropped by the other.
13
+ *
14
+ * WHAT IS DELIBERATELY NOT USED. Not the option tally, and not the synthesis
15
+ * verdict line. Both answer which OPTION wins a deliberation; this review asks
16
+ * whether each SEAT passed a change, which is a different question over the
17
+ * same replies. Nor is the diff lens's own closing line asked for — a lens is
18
+ * not a seat.
19
+ *
20
+ * WHY A VERB OF ITS OWN HERE RATHER THAN AN `agent-config` COMMAND. The CLI
21
+ * help-count budget is at its maximum (`cli_help_command_count` in
22
+ * `src/config/evaluator-budgets.json`), so a new top-level verb would spend a
23
+ * ratchet this change has no claim on. It dispatches inside `council_cli`.
24
+ */
25
+
26
+ import { parse_stance_line } from './stance_tally.js';
27
+
28
+ /**
29
+ * The closed vocabulary a seat may close on. Open it and a grep for a passing
30
+ * verdict starts reading words nobody adjudicated — the failure
31
+ * `ratification-artifact.md` names for its own `verdict` field.
32
+ */
33
+ export const MODIFICATION_VERDICT_LABELS = [
34
+ 'ratified',
35
+ 'confirmed-non-expanding',
36
+ 'refused',
37
+ ] as const;
38
+
39
+ export type ModificationVerdictLabel = (typeof MODIFICATION_VERDICT_LABELS)[number];
40
+
41
+ /** The record's verdict: a seat label, or the one value no seat may utter. */
42
+ export type ModificationVerdict = ModificationVerdictLabel | 'non-convergent';
43
+
44
+ /**
45
+ * Read ONE seat's reply. Returns its label when the seat concluded, `null`
46
+ * otherwise — a missing line, an abstention, or any other label.
47
+ *
48
+ * `null` is never inferred from surrounding prose: a seat that writes
49
+ * "I would call this ratified" has not closed on a stance line, and reading it
50
+ * as a conclusion is how a review starts reporting verdicts nobody gave.
51
+ */
52
+ export function seatConclusion(text: string): ModificationVerdictLabel | null {
53
+ const line = parse_stance_line(text);
54
+ if (line === null) return null;
55
+ const label = line.label.trim().toLowerCase();
56
+ return (MODIFICATION_VERDICT_LABELS as readonly string[]).includes(label)
57
+ ? (label as ModificationVerdictLabel)
58
+ : null;
59
+ }
60
+
61
+ /**
62
+ * Read every seat, keeping the non-concluding ones present and `null` rather
63
+ * than dropping them. A dropped seat is indistinguishable from a seat that was
64
+ * never asked, and the quorum rule below has to tell those apart.
65
+ */
66
+ export function readSeatConclusions(
67
+ replies: Readonly<Record<string, string>>,
68
+ ): Record<string, ModificationVerdictLabel | null> {
69
+ const out: Record<string, ModificationVerdictLabel | null> = {};
70
+ for (const [seat, text] of Object.entries(replies)) {
71
+ out[seat] = seatConclusion(text);
72
+ }
73
+ return out;
74
+ }
75
+
76
+ /**
77
+ * Derive the record's verdict. ONE rule, and the ORDER is the rule:
78
+ *
79
+ * 1. any concluding seat on `refused` → `refused`
80
+ * 2. concluding providers < required → `non-convergent`
81
+ * 3. any concluding seat on `ratified` → `ratified`
82
+ * 4. otherwise (all concluded, all non-expanding) → `confirmed-non-expanding`
83
+ *
84
+ * Step 1 precedes step 2 on purpose. A single refusing seat is a refusal even
85
+ * when it is the only seat that concluded: letting the quorum rule fire first
86
+ * would turn "one reviewer said no" into "not enough reviewers answered", which
87
+ * reads as a retryable condition rather than as the objection it is.
88
+ */
89
+ export function deriveModificationVerdict(
90
+ seats: Readonly<Record<string, ModificationVerdictLabel | null>>,
91
+ requiredProviders: number,
92
+ ): ModificationVerdict {
93
+ const concluded = Object.values(seats).filter(
94
+ (v): v is ModificationVerdictLabel => v !== null,
95
+ );
96
+ if (concluded.includes('refused')) return 'refused';
97
+ if (concluded.length < requiredProviders) return 'non-convergent';
98
+ if (concluded.includes('ratified')) return 'ratified';
99
+ return 'confirmed-non-expanding';
100
+ }
@@ -0,0 +1,90 @@
1
+ /**
2
+ * modification_review_questions — the fixed set a modification review asks
3
+ * every seat, one by one.
4
+ *
5
+ * `road-to-self-modification-that-a-council-must-pass` step 3.1. The owner's
6
+ * directive of 2026-10-05 is that self-modification is a goal, confirmed by a
7
+ * council that "always questions critically and checks what the modification
8
+ * does". A council that is merely ASKED for an opinion produces an opinion; a
9
+ * council handed a fixed list answers the same nine things about every change,
10
+ * and a reader can tell which one a seat skipped.
11
+ *
12
+ * WHY A CONSTANT RATHER THAN PROSE IN A PROMPT. The list is the review's
13
+ * contract, so it is quoted in `docs/contracts/ratification-artifact.md` and
14
+ * read from here by whatever renders the prompt. One definition, two readers —
15
+ * the alternative is a prompt and a contract that drift apart silently, which
16
+ * is the drift this package's own gates exist to catch.
17
+ *
18
+ * WHERE THE TREE ALREADY WORDS A QUESTION, THAT WORDING IS USED rather than
19
+ * paraphrased. Two do: `evaluator-independence`'s weakening clause and the
20
+ * synthesis prompt's kill-switch criteria. A paraphrase would be a second,
21
+ * slightly different standard for the same thing — and each carries a `source`
22
+ * so a reader can check the borrow rather than take it.
23
+ */
24
+
25
+ /** One question, addressable on its own so a skipped answer is visible. */
26
+ export interface ModificationReviewQuestion {
27
+ /** Stable id; the record's body keys each seat's answer by it. */
28
+ readonly id: string;
29
+ /** The question as asked, verbatim. */
30
+ readonly text: string;
31
+ /** Where the wording came from, when it was taken rather than written. */
32
+ readonly source?: string;
33
+ }
34
+
35
+ /**
36
+ * The nine, in the order step 3.1 enumerates them. Order is part of the
37
+ * contract: a seat answering one by one answers them in this sequence, so a
38
+ * record can be read against the list without matching prose to intent.
39
+ */
40
+ export const MODIFICATION_REVIEW_QUESTIONS: readonly ModificationReviewQuestion[] = [
41
+ {
42
+ id: 'behaviour-change',
43
+ text: 'What behaviour changes, including what follows from it that the diff does not state?',
44
+ },
45
+ {
46
+ id: 'boundary-direction',
47
+ text: 'Which authority or safety boundary becomes wider or narrower, and in which direction?',
48
+ },
49
+ {
50
+ id: 'weakens-its-own-judge',
51
+ text:
52
+ 'Does the change weaken anything that judges it — a test, a gate, a threshold, this review? ' +
53
+ 'The standard is quoted rather than paraphrased: the implementer never silently ' +
54
+ 'weakens an assertion, deletes, skips or xfails a failing test, lowers a threshold, ' +
55
+ 'or changes fixture semantics to fit the code. Does this change do any of those?',
56
+ source: 'src/rules/evaluator-independence.md § Tests are evaluators',
57
+ },
58
+ {
59
+ id: 'route-around',
60
+ text: 'Is another host or projection left as a way around the control this change touches?',
61
+ },
62
+ {
63
+ id: 'undo',
64
+ text: 'Can it be undone, and how — by whom, with what authority, and against which revision?',
65
+ },
66
+ {
67
+ id: 'falsifier',
68
+ text:
69
+ 'What observation would show the claimed benefit to be false, and what rollback / ' +
70
+ 'kill-switch criteria does the change omit?',
71
+ source: 'src/scripts/ai_council/prompts.ts (DESIGN_MODE, ROADMAP_MODE)',
72
+ },
73
+ {
74
+ id: 'smaller-change',
75
+ text: 'Would a smaller change do, and what does the larger one buy that the smaller one does not?',
76
+ },
77
+ {
78
+ id: 'instruction-weight',
79
+ text: 'What does it add to standing instruction weight that every later session pays?',
80
+ },
81
+ {
82
+ id: 'untrusted-steering',
83
+ text: 'Could untrusted content steer the path this change opens, and what bounds it if so?',
84
+ },
85
+ ];
86
+
87
+ /** The list as a seat sees it: numbered, in order, nothing dropped. */
88
+ export function renderModificationReviewQuestions(): string {
89
+ return MODIFICATION_REVIEW_QUESTIONS.map((q, i) => `${i + 1}. ${q.text}`).join('\n');
90
+ }
@@ -412,7 +412,7 @@ export function consult(
412
412
  return [];
413
413
  }
414
414
  const resolvedBudget = budget ?? new CostBudget();
415
- if (members.length > resolvedBudget.max_calls) {
415
+ if (resolvedBudget.max_calls > 0 && members.length > resolvedBudget.max_calls) {
416
416
  throw new Error(
417
417
  `Council has ${members.length} members but budget caps at ` +
418
418
  `${resolvedBudget.max_calls} calls.`,
@@ -802,9 +802,9 @@ function _run_round(
802
802
  );
803
803
  actual_usd = _total_usd(actual);
804
804
  spent.usd += _total_usd(actual);
805
- // Persist to the rolling 24h ledger when the daily cap is
806
- // active. Errors are swallowed inside record_spend.
807
- if (budget.daily_limit_usd > 0 && !response.error) {
805
+ // Ledger every billable response, bounded or not (ADR-279): a cap
806
+ // decides whether the total is compared, never whether it is kept.
807
+ if (!response.error) {
808
808
  _record_daily_spend(_total_usd(actual), effective.name, effective.model, {
809
809
  cache_read_input_tokens: response.cache_read_input_tokens,
810
810
  cache_creation_input_tokens: response.cache_creation_input_tokens,
@@ -1246,7 +1246,7 @@ export function run_debate(
1246
1246
  return [];
1247
1247
  }
1248
1248
  const budget = budget0 ?? new CostBudget();
1249
- if (members.length > budget.max_calls) {
1249
+ if (budget.max_calls > 0 && members.length > budget.max_calls) {
1250
1250
  throw new Error(
1251
1251
  `Debate has ${members.length} members but budget caps at ` +
1252
1252
  `${budget.max_calls} calls.`,
@@ -20,9 +20,9 @@ import type { ExternalAIClient } from './clients.js';
20
20
  import { would_exceed as _would_exceed_daily } from './budget_guard.js';
21
21
 
22
22
  export class CostBudget {
23
- max_input_tokens: number;
24
- max_output_tokens: number;
25
- max_calls: number;
23
+ max_input_tokens: number; // 0 = input-token ceiling disabled
24
+ max_output_tokens: number; // 0 = output-token ceiling disabled
25
+ max_calls: number; // 0 = per-invocation call cap disabled (fan-out unbounded)
26
26
  max_total_usd: number; // 0 = USD ceiling disabled (token caps still apply)
27
27
  daily_limit_usd: number; // 0 = rolling 24h cap disabled (D3)
28
28
 
@@ -35,8 +35,11 @@ export class CostBudget {
35
35
  daily_limit_usd?: number;
36
36
  } = {},
37
37
  ) {
38
- this.max_input_tokens = args.max_input_tokens ?? 50_000;
39
- this.max_output_tokens = args.max_output_tokens ?? 20_000;
38
+ // ADR-279: the two token ceilings default to 0 = unbounded, as the two
39
+ // USD ceilings below already did. `max_calls` keeps its default — it
40
+ // bounds fan-out against a plan quota, not money.
41
+ this.max_input_tokens = args.max_input_tokens ?? 0;
42
+ this.max_output_tokens = args.max_output_tokens ?? 0;
40
43
  this.max_calls = args.max_calls ?? 10;
41
44
  this.max_total_usd = args.max_total_usd ?? 0.0;
42
45
  this.daily_limit_usd = args.daily_limit_usd ?? 0.0;
@@ -101,9 +104,17 @@ export function _breach(
101
104
  budget: CostBudget,
102
105
  ): BreachKind {
103
106
  const usd = est ? _total_usd(est) : 0.0;
107
+ // Zero disables a token cap, as `ai-council-config.md:84-86` has always
108
+ // said it does. Until 2026-10-06 these two comparisons carried no guard
109
+ // while the two USD comparisons below them did, so a budget with every
110
+ // cap at zero — the contract's "no bound at all" — breached on a
111
+ // ten-token estimate. The guard goes on each cap separately: a user who
112
+ // set one and left the other at zero is bounded by the one they set.
104
113
  if (
105
- spent.input + (est ? est.input_tokens : 0) > budget.max_input_tokens ||
106
- spent.output + (est ? est.output_tokens : 0) > budget.max_output_tokens
114
+ (budget.max_input_tokens > 0 &&
115
+ spent.input + (est ? est.input_tokens : 0) > budget.max_input_tokens) ||
116
+ (budget.max_output_tokens > 0 &&
117
+ spent.output + (est ? est.output_tokens : 0) > budget.max_output_tokens)
107
118
  ) {
108
119
  return 'tokens';
109
120
  }
@@ -0,0 +1,45 @@
1
+ /**
2
+ * Vendor-CLI sentinel values that are DATA, carried in a module with no
3
+ * dependencies of its own.
4
+ *
5
+ * WHY THIS FILE EXISTS, measured rather than argued. `OPENAI_CLI_VENDOR_DEFAULT`
6
+ * is a single string, and it used to live in `clients.ts` beside the transport
7
+ * classes that compare against it. `ai_council/config.ts` imports that one
8
+ * string and nothing else from `clients.ts`; `config.ts` is reachable from
9
+ * `council-availability`, which is bound on `session_start`. So every hook
10
+ * dispatch on every slot carried the whole council transport layer —
11
+ * `clients.ts` and its closure, **51,523 bytes** of the composed
12
+ * `dist/hooks/dispatch.js` — to compare one string against another. Breaking
13
+ * that one import edge removes exactly that, with no capability removed
14
+ * anywhere: every entry point that actually talks to a vendor CLI imports
15
+ * `clients.ts` directly and still does.
16
+ *
17
+ * The bytes are not an abstraction. `src/config/hook-bundle-budget.json` caps
18
+ * the composed bundle, the cap is a shrink-only ratchet, and on 2026-10-02 the
19
+ * tree stood 75 bytes under it — a state in which no concern anywhere could add
20
+ * a line. This module is how `road-to-a-rule-carrier-that-works-outside-the-repo`
21
+ * Phase 1 paid for its own runtime code instead of asking for a raise.
22
+ *
23
+ * WHAT BELONGS HERE: a vendor-facing constant that a CONFIGURATION reader needs
24
+ * and a TRANSPORT reader also happens to use. Nothing that imports anything.
25
+ * The moment this file gains an import it stops being the cheap half of the
26
+ * split and the split stops being worth its own file.
27
+ */
28
+
29
+ /**
30
+ * Sentinel: let the codex CLI pick its own model, by omitting `--model`.
31
+ *
32
+ * This is not a placeholder for a value nobody looked up. Measured
33
+ * 2026-08-15 against `codex exec --json` on a ChatGPT-account (subscription)
34
+ * transport, every explicitly named candidate was refused with
35
+ * `400 invalid_request_error: The '<model>' model is not supported when using
36
+ * Codex with a ChatGPT account.` — `gpt-4o`, `gpt-5` (this constant's previous
37
+ * value) and `gpt-5.1-codex` alike. Omitting the flag answered normally.
38
+ *
39
+ * So the only value known to work on this transport is "whatever the CLI
40
+ * chooses", and pinning ANY name here would re-break the seat the next time
41
+ * the vendor rotates its lineup. The label is carried into records as-is so a
42
+ * reader can see that no model was pinned, rather than a name being implied
43
+ * that nobody verified.
44
+ */
45
+ export const OPENAI_CLI_VENDOR_DEFAULT = 'codex-default';