@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
@@ -18,11 +18,10 @@
18
18
  * target dir of your choosing — it never overwrites the live `.claude/` /
19
19
  * `.augment/` projections.
20
20
  *
21
- * NOTE (faithful literal): the thin-entry pointer keeps the verbatim
22
- * `Body: [`{rule_id}`](../../dist/agent-src/rules/{rule_id}.md)`
23
- * Markdown link from the retired Python implementation. The same-basename `.py` twin
24
- * carries that literal, so the ADR-051 legacy-path guard exempts this `.ts`
25
- * file by twin-parity.
21
+ * NOTE: the thin-entry pointer literal moved with the mechanism — it is
22
+ * `BODY_LINK_PREFIX` in `_lib/thin_rules.ts` now, so the twin-parity argument
23
+ * that exempted it from the ADR-051 legacy-path guard belongs to THAT file and
24
+ * no longer describes this one, which holds the string nowhere.
26
25
  *
27
26
  * Historical quirks are preserved deliberately — tests and downstream consumers pin the exact behaviour.
28
27
  *
@@ -35,338 +34,46 @@ import * as path from 'node:path';
35
34
  import process from 'node:process';
36
35
  import { fileURLToPath, pathToFileURL } from 'node:url';
37
36
 
38
- import {
39
- pathOnlyRuleIds,
40
- triggerlessRuleIds,
41
- type Router,
42
- } from './_lib/rule_injection.js';
43
37
  import * as token_count from './_lib/token_count.js';
44
38
 
45
- const _HERE = fileURLToPath(import.meta.url);
46
- // REPO_ROOT = Path(__file__).resolve().parent.parent.parent — three dirs up
47
- // from src/scripts/<file>.
48
- export const REPO_ROOT = path.resolve(path.dirname(_HERE), '..', '..');
49
-
50
- export const RULES_SOURCE = path.join(REPO_ROOT, 'dist/agent-src', 'rules');
51
- export const ROUTER = path.join(REPO_ROOT, 'dist', 'router.json');
52
-
53
- /** `sorted(dir.glob("*.md"))` — non-recursive, lexically sorted abs paths. */
54
- function _globSortedMd(dir: string): string[] {
55
- let names: string[];
56
- try {
57
- names = fs.readdirSync(dir);
58
- } catch {
59
- return [];
60
- }
61
- const out = names.filter((n) => n.endsWith('.md')).map((n) => path.join(dir, n));
62
- out.sort();
63
- return out;
64
- }
65
-
66
- /** The always-full-bodied set — authoritative kernel list from the router. */
67
- export function kernel_ids(): Set<string> {
68
- const data = JSON.parse(fs.readFileSync(ROUTER, 'utf-8')) as Record<string, unknown>;
69
- const kernel = data.kernel;
70
- if (Array.isArray(kernel)) {
71
- return new Set(kernel.map((x) => String(x)));
72
- }
73
- return new Set();
74
- }
75
-
76
- /**
77
- * Tier rules the router gives NO trigger at all.
78
- *
79
- * These cannot be delivered on a match, so thinning them would remove a body
80
- * that nothing can ever put back — a silent hole rather than a saving. They
81
- * project full-bodied, and `measure` reports them by name so the residue is
82
- * visible instead of being absorbed into the pointer count
83
- * (road-to-trigger-delivered-rule-bodies 1.3).
84
- */
85
- /**
86
- * Rules whose ONLY triggers are path-shaped — reachable from `pre_tool_use`
87
- * and from no other slot (road-to-delivery-for-every-host 3.2).
88
- *
89
- * They must never be thinned while the delivery concern is NOT bound on
90
- * `pre_tool_use`, because a stub plus a slot nobody listens on is a rule that
91
- * reaches the model at no scope at all. This is the same failure the
92
- * `no_trigger_ids` exemption prevents, one step out: there the rule has nothing
93
- * to match on, here it has nothing to match ON.
94
- *
95
- * Stated as a PROPERTY rather than a list of ids. If the concern is ever bound
96
- * on `pre_tool_use` again, this exemption is what should be reconsidered — not
97
- * three names someone has to remember.
98
- *
99
- * WHAT THIS EXEMPTION DOES **NOT** COVER — recorded 2026-09-08, R2 finding 1,
100
- * because the silence read as coverage. The predicate is `every` trigger
101
- * path-shaped. A rule with BOTH path and non-path triggers is therefore THINNED,
102
- * and its path-shaped half then has no carrier at all: the stub carries no
103
- * frontmatter (`condense.ts` writes it with `_writeText`, bypassing
104
- * `_emit_claude_rule`'s host-native `paths:` key), `pre_tool_use` lost the
105
- * binding under owner ruling E2, and `user_prompt_submit` never populates
106
- * `openFiles`. Measured over the current `dist/router.json`: **18 such rules**,
107
- * all non-kernel and all thinned — augment-edit-discipline, design-fidelity,
108
- * doc-screenshot-hygiene, domain-adoption-policy,
109
- * framework-neutrality-in-generic-skills, image-likeness-and-rights,
110
- * laravel-translations, lethal-trifecta-guard, linked-projects-onboarding-gate,
111
- * low-impact-corpus-privacy-floor, markdown-safe-codeblocks, onboarding-gate,
112
- * persona-governance, php-coding, provider-lifecycle-discipline,
113
- * roadmap-ci-steps-policy, roadmap-progress-sync, settings-ask-protocol.
114
- *
115
- * They do NOT reach the model at no scope: every non-path route
116
- * (keyword / phrase / command) still delivers the body through the concern, and
117
- * on `claude-code` they never had a separate host-native path route to lose —
118
- * `_claude_paths_plan` emits no `paths:` for a mixed-trigger rule on purpose, so
119
- * under `eager-all` they loaded UNCONDITIONALLY. What is lost is the difference
120
- * between unconditional and prompt-triggered: a session that touches a matching
121
- * file and says nothing that matches gets nothing.
122
- *
123
- * The labelled corpus cannot see this and the endpoint says so rather than
124
- * implying otherwise — `model_rule_injection --endpoints` (b) now publishes the
125
- * shipped `user_prompt_submit` reach beside the pre-registered reading, and
126
- * every one of these 18 has at least one prompt-matching positive, so none
127
- * appears in its "reachable only via a path trigger" column.
128
- *
129
- * WHY THIS IS NOT WIDENED TO `some` HERE. Measured: exempting all 18 moves the
130
- * thin rule layer 23,592 -> 39,921 GPT tok (+16,329, +69 %), which is a budget
131
- * move of a magnitude no agent may take, and it would erase most of the saving
132
- * the flip is licensed on. Restoring a path route needs either that exemption
133
- * under a re-anchored baseline or a `pre_tool_use` binding under a raised slot
134
- * cap — both owner-reserved, so the closure is tracked rather than taken here.
135
- * ADR-267's Consequences section names the receiver.
136
- */
137
39
  /**
138
- * ONE spelling of the router-derived sets, shared with the injector (R2
139
- * finding 11).
140
- *
141
- * `path_only_ids` and `no_trigger_ids` were each a second, hand-rolled
142
- * implementation of `_lib/rule_injection.ts::pathOnlyRuleIds` /
143
- * `triggerlessRuleIds` — verified identical over the current router at the time
144
- * (symmetric difference empty), so drift risk rather than a live defect. It is
145
- * exactly the hazard `THIN_ENTRY_MARKER`'s own comment argues against one
146
- * screen below ("a gate that re-spelled this string would drift from the writer
147
- * silently"), and the two consumers here are the PROJECTOR's exemption set and
148
- * the INJECTOR's reachability set: they must not be able to disagree about which
149
- * rules the delivery path can reach.
40
+ * The mechanism lives in `_lib/thin_rules.ts`; this file is its CLI.
150
41
  *
151
- * The finding named `path_only_ids`. The defect-pattern sweep found the SECOND
152
- * instance one function down — `no_trigger_ids` against `triggerlessRuleIds` —
153
- * and it is delegated in the same change. Count: 2 of 2 duplicated
154
- * router-derived sets in this file, 0 remaining.
155
- */
156
- function _router(): Router {
157
- return JSON.parse(fs.readFileSync(ROUTER, 'utf-8')) as Router;
158
- }
159
-
160
- export function path_only_ids(): Set<string> {
161
- return pathOnlyRuleIds(_router());
162
- }
163
-
164
- export function no_trigger_ids(): Set<string> {
165
- return new Set(triggerlessRuleIds(_router()));
166
- }
167
-
168
- /**
169
- * id → workspaces for every non-kernel router entry (router.json schema v2,
170
- * road-to-request-scoped-rule-load Phase 1). Rules absent from the map (or
171
- * with an empty list) fail safe: they stay in scope.
42
+ * Re-exported wholesale so every existing importer of
43
+ * `project_thin_rules.{build_thin,thin_entry,is_thin_entry,RULES_SOURCE,…}`
44
+ * keeps working unchanged. The split exists because `src/scripts/install.ts` is
45
+ * a bundle entry and `check_installer_import_purity` forbids it reaching a
46
+ * module-level `process.exit()` — which this file has, at its foot, by design.
172
47
  */
173
- export function rule_workspaces_map(): Map<string, string[]> {
174
- const data = JSON.parse(fs.readFileSync(ROUTER, 'utf-8')) as Record<string, unknown>;
175
- const map = new Map<string, string[]>();
176
- for (const tier of ['tier_1', 'tier_2']) {
177
- const entries = data[tier];
178
- if (!Array.isArray(entries)) continue;
179
- for (const e of entries) {
180
- const obj = e as Record<string, unknown>;
181
- const ws = Array.isArray(obj.workspaces) ? obj.workspaces.map((w) => String(w)) : [];
182
- map.set(String(obj.id), ws);
183
- }
184
- }
185
- return map;
186
- }
187
-
188
- /**
189
- * Whether a rule id survives a workspace scope. Kernel always survives;
190
- * `scope === null` = legacy-all. An out-of-scope non-kernel rule is dropped
191
- * entirely — neither body nor pointer line (the pointer floor shrinks with
192
- * consumer scoping).
193
- */
194
- export function id_in_scope(
195
- rule_id: string,
196
- scope: readonly string[] | null,
197
- kernel: ReadonlySet<string>,
198
- wsMap: ReadonlyMap<string, string[]>,
199
- fallback_ws: readonly string[] = [],
200
- ): boolean {
201
- if (scope === null || kernel.has(rule_id)) {
202
- return true;
203
- }
204
- // Router map first (schema v2); `type: manual` rules are reference-only
205
- // and never emitted to the router — their frontmatter is the fallback.
206
- const ws = wsMap.get(rule_id) ?? fallback_ws;
207
- if (ws.length === 0) {
208
- return true; // untagged / unknown → fail safe
209
- }
210
- return ws.some((w) => scope.includes(w));
211
- }
212
-
213
- /** `workspaces:` list parsed straight from a rule file's frontmatter. */
214
- export function fm_workspaces(text: string): string[] {
215
- const [fm] = split_frontmatter(text);
216
- // Flow style: `workspaces: [a, b, c]`
217
- const flow = /^workspaces:[ \t]*\[([^\]]*)\]/m.exec(fm);
218
- if (flow) {
219
- return (flow[1] as string)
220
- .split(',')
221
- .map((s) => s.trim().replace(/^["']|["']$/g, ''))
222
- .filter((s) => s.length > 0);
223
- }
224
- // Block style; tolerate the list being the LAST frontmatter key.
225
- const m = /^workspaces:[ \t]*\n((?:[ \t]+-[ \t]+.*(?:\n|$))+)/m.exec(fm);
226
- if (!m) {
227
- return [];
228
- }
229
- return [...(m[1] as string).matchAll(/-[ \t]+(\S+)/g)].map((x) => x[1] as string);
230
- }
231
-
232
- /** Return [frontmatter_including_fences, body]. Empty fm if none. */
233
- export function split_frontmatter(text: string): [string, string] {
234
- if (text.startsWith('---\n')) {
235
- const end = text.indexOf('\n---\n', 4);
236
- if (end !== -1) {
237
- return [text.slice(0, end + 5), text.slice(end + 5)];
238
- }
239
- }
240
- return ['', text];
241
- }
242
-
243
- function _description(fm: string): string {
244
- // re.search(r'^description:\s*"?(.+?)"?\s*$', fm, re.MULTILINE)
245
- const m = /^description:\s*"?(.+?)"?\s*$/m.exec(fm);
246
- return m ? (m[1] as string).trim() : '';
247
- }
248
-
249
- // How many trigger keywords/phrases to surface as the always-on match hint.
250
- const _TRIGGER_HINT_LIMIT = 6;
251
-
252
- /** A short, comma-joined sample of the rule's trigger keywords/phrases. */
253
- function _trigger_hint(fm: string): string {
254
- const hits: string[] = [];
255
- // re.finditer(r'^\s*-\s*(?:keyword|phrase):\s*"?(.+?)"?\s*$', fm, re.MULTILINE)
256
- const re = /^\s*-\s*(?:keyword|phrase):\s*"?(.+?)"?\s*$/gm;
257
- let m: RegExpExecArray | null;
258
- while ((m = re.exec(fm)) !== null) {
259
- hits.push((m[1] as string).trim());
260
- if (hits.length >= _TRIGGER_HINT_LIMIT) {
261
- break;
262
- }
263
- }
264
- return hits.join(', ');
265
- }
266
-
267
- /** Python `str.title()` — uppercase first alpha of each run, rest lowercase. */
268
- function _title(s: string): string {
269
- return s.replace(/[A-Za-z]+/g, (w) => w.charAt(0).toUpperCase() + w.slice(1).toLowerCase());
270
- }
271
-
272
- /**
273
- * The marker that makes a projected entry recognisable as a stub.
274
- *
275
- * Exported so the WRITER and every DETECTOR share one definition. A gate that
276
- * re-spelled this string would drift from the writer silently, and the failure
277
- * would be invisible in exactly the direction that matters: a stub the gate
278
- * fails to recognise reads as a complete rule body.
279
- */
280
- export const THIN_ENTRY_MARKER = '> Routed rule — load the body on trigger-match.';
281
-
282
- /** Is this projected entry a pointer stub rather than a rule body? */
283
- export function is_thin_entry(text: string): boolean {
284
- return text.includes(THIN_ENTRY_MARKER);
285
- }
286
-
287
- /**
288
- * Where a stub tells a reader the body actually is.
289
- *
290
- * FIXED 2026-09-07: this pointed into the uncondensed source tree ADR-051
291
- * retired — the literal path is deliberately NOT reproduced here, because
292
- * `check_no_uncondensed_refs` matches the string and cannot tell a repair
293
- * record from a live reference; `git log -S` on this file finds the old value.
294
- * It exists in no checkout, so EVERY stub's fallback pointer
295
- * resolved to nothing — invisible under `delivery`, where the hook loads the
296
- * body from `dist/agent-src/rules` and never follows this link, and total under
297
- * `thin`, where the pointer is the only path to the body there is.
298
- *
299
- * KNOWN LIMIT, stated rather than discovered later: one relative prefix cannot
300
- * be right for every tree, because they sit at different depths — `.claude/rules`
301
- * and `.cursor/rules` are two levels below the repo root and `.clinerules` is
302
- * one. `../../` is correct for the first two, which are the only trees the
303
- * shipped `lean_projection.hosts` default can thin. A stub in `.clinerules`
304
- * needs an operator to have added `cline` to that list, and its pointer is off
305
- * by one level. That is strictly better than the previous state, where the
306
- * pointer was dead in all three, and it is recorded here so the remaining case
307
- * is a known limit rather than a surprise.
308
- */
309
- const BODY_LINK_PREFIX = '../../dist/agent-src/rules/';
310
-
311
- /** Build the minimal progressive-disclosure pointer for a non-kernel rule. */
312
- export function thin_entry(rule_id: string, text: string): string {
313
- const [fm] = split_frontmatter(text);
314
- const desc = _description(fm);
315
- const hint = _trigger_hint(fm);
316
- const title = _title(rule_id.replace(/-/g, ' '));
317
- const fires = hint ? ` Fires on: ${hint}.` : '';
318
- return (
319
- `## ${title}\n` +
320
- `${THIN_ENTRY_MARKER}${fires} ${desc} ` +
321
- `Body: [\`${rule_id}\`](${BODY_LINK_PREFIX}${rule_id}.md)\n`
322
- );
323
- }
48
+ export * from './_lib/thin_rules.js';
49
+ import {
50
+ _globSortedMd,
51
+ build_thin,
52
+ fm_workspaces,
53
+ id_in_scope,
54
+ kernel_ids,
55
+ no_trigger_ids,
56
+ REPO_ROOT,
57
+ RULES_SOURCE,
58
+ rule_workspaces_map,
59
+ } from './_lib/thin_rules.js';
60
+ void REPO_ROOT;
324
61
 
325
- /** Map {filename: thin_or_full_text} for every rule. Kernel stays full. */
326
- export function build_thin(
327
- rules_dir: string = RULES_SOURCE,
328
- scope: readonly string[] | null = null,
329
- /**
330
- * Optional sink for the D3 diagnostic
331
- * (road-to-delivery-for-every-host 2.2).
332
- *
333
- * An `auto` rule the router gives NO trigger is already kept full-bodied by
334
- * `noTrigger` below, which is the substantive protection and predates this
335
- * roadmap. What did not exist is any way to SEE it happen: the rule is
336
- * silently exempted, so an author who removes a rule's last trigger gets a
337
- * silently eager rule and no signal. The line makes the exemption audible.
338
- */
339
- announce: ((message: string) => void) | null = null,
340
- ): Map<string, string> {
341
- const kernel = kernel_ids();
342
- const noTrigger = no_trigger_ids();
343
- const pathOnly = path_only_ids();
344
- const wsMap = scope !== null ? rule_workspaces_map() : new Map<string, string[]>();
345
- const out = new Map<string, string>();
346
- for (const p of _globSortedMd(rules_dir)) {
347
- const text = fs.readFileSync(p, 'utf-8');
348
- const stem = path.basename(p).replace(/\.md$/, '');
349
- if (!id_in_scope(stem, scope, kernel, wsMap, fm_workspaces(text))) {
350
- continue; // out of workspace scope — no body, no pointer line
351
- }
352
- const full = kernel.has(stem) || noTrigger.has(stem) || pathOnly.has(stem);
353
- if (announce !== null && noTrigger.has(stem) && !kernel.has(stem)) {
354
- announce(`D3: trigger-less auto rule ${path.basename(p)} — kept full-bodied, never thinned`);
355
- }
356
- if (announce !== null && pathOnly.has(stem) && !kernel.has(stem) && !noTrigger.has(stem)) {
357
- announce(
358
- `E2: path-only auto rule ${path.basename(p)} — kept full-bodied; its only triggers ` +
359
- `are path-shaped and the delivery concern is not bound on pre_tool_use`,
360
- );
361
- }
362
- out.set(path.basename(p), full ? text : thin_entry(stem, text));
363
- }
364
- return out;
365
- }
62
+ const _HERE = fileURLToPath(import.meta.url);
366
63
 
367
64
  export interface ThinMeasure {
368
65
  rules_total: number;
369
66
  kernel_full: number;
67
+ /**
68
+ * Everything non-kernel that the no-trigger residue does not claim — which
69
+ * is NOT the same as everything actually thinned, and the gap grew with the
70
+ * `no_stub` subset. The path-only residue and the declared `no_stub`
71
+ * members project full-bodied and are counted here anyway, because the
72
+ * field's identity (`rules_total = kernel_full + non_kernel_thinned +
73
+ * no_trigger_full`) is pinned by a test and is what the CLI's own line
74
+ * arithmetic rests on. Named rather than silently widened: for the real
75
+ * thinned count, ask `build_thin` and filter on {@link is_thin_entry}.
76
+ */
370
77
  non_kernel_thinned: number;
371
78
  /** Non-kernel rules kept full-bodied because the router gives them no trigger. */
372
79
  no_trigger_full: number;
@@ -0,0 +1,77 @@
1
+ #!/usr/bin/env tsx
2
+ /**
3
+ * ratification_header — print a ratification artifact's `providers:`,
4
+ * `verdict:` and `seats:` frontmatter lines, derived from per-seat final
5
+ * verdicts.
6
+ *
7
+ * The two header fields used to be typed by the author, and three findings in
8
+ * one release were the header saying more than the seats had: `ratified` over a
9
+ * non-convergent seat, two providers over one closing seat. This is the writer
10
+ * side of the fix; `readRatification` refuses the same shapes on the reader
11
+ * side whenever `seats:` is recorded.
12
+ *
13
+ * Usage: ratification_header --seat <provider>=<final-verdict> [--seat …]
14
+ * final-verdict: ratified | confirmed-non-expanding | refused | non-convergent
15
+ * | no-final-verdict (the seat closed or was absent at the end)
16
+ *
17
+ * Exit codes: 0 = header printed · 2 = usage error.
18
+ */
19
+
20
+ import * as fs from 'node:fs';
21
+ import * as path from 'node:path';
22
+ import { fileURLToPath, pathToFileURL } from 'node:url';
23
+
24
+ import {
25
+ SEAT_PROVIDER_RE,
26
+ SEAT_VERDICTS,
27
+ renderRatificationHeader,
28
+ type SeatVerdict,
29
+ } from './_lib/ratification_artifact.js';
30
+
31
+ export function main(argv: readonly string[] = process.argv.slice(2)): number {
32
+ const seats = new Map<string, SeatVerdict>();
33
+ for (let i = 0; i < argv.length; i += 1) {
34
+ if (argv[i] !== '--seat') {
35
+ process.stderr.write(`error: unknown argument ${String(argv[i])}\n`);
36
+ return 2;
37
+ }
38
+ const raw = argv[i + 1] ?? '';
39
+ i += 1;
40
+ const eq = raw.indexOf('=');
41
+ const provider = raw.slice(0, eq);
42
+ const verdict = raw.slice(eq + 1);
43
+ if (eq <= 0 || !SEAT_PROVIDER_RE.test(provider) || !SEAT_VERDICTS.includes(verdict)) {
44
+ process.stderr.write(
45
+ `error: --seat needs <provider id ${String(SEAT_PROVIDER_RE)}>=<one of ` +
46
+ `${SEAT_VERDICTS.join('|')}>, got \`${raw}\`\n`,
47
+ );
48
+ return 2;
49
+ }
50
+ if (seats.has(provider)) {
51
+ process.stderr.write(`error: seat \`${provider}\` given twice\n`);
52
+ return 2;
53
+ }
54
+ seats.set(provider, verdict as SeatVerdict);
55
+ }
56
+ if (seats.size === 0) {
57
+ process.stderr.write('error: at least one --seat is required\n');
58
+ return 2;
59
+ }
60
+ process.stdout.write(`${renderRatificationHeader(seats)}\n`);
61
+ return 0;
62
+ }
63
+
64
+ function _isCliEntry(): boolean {
65
+ if (process.argv[1] === undefined) return false;
66
+ const here = fileURLToPath(import.meta.url);
67
+ if (import.meta.url === pathToFileURL(path.resolve(process.argv[1])).href) return true;
68
+ try {
69
+ return fs.realpathSync(here) === fs.realpathSync(path.resolve(process.argv[1]));
70
+ } catch {
71
+ return false;
72
+ }
73
+ }
74
+
75
+ if (_isCliEntry()) {
76
+ process.exit(main());
77
+ }
@@ -0,0 +1,138 @@
1
+ #!/usr/bin/env tsx
2
+ /**
3
+ * refusal_envelope — the hand-off an agent writes when a HOST classifier
4
+ * refuses a step of an owner-directed task (ADR-282 § Part B).
5
+ *
6
+ * The repository cannot change the host classifier, and an agent must never
7
+ * route around a refused action. With the owner present it asks once for an
8
+ * explicit in-session authorization and re-runs the same step once; this
9
+ * envelope is the fallback when that is refused too or no owner is present.
10
+ * Write one ready-to-paste continuation prompt and name its path in one line,
11
+ * so the owner never has to ask for it.
12
+ *
13
+ * The envelope lands at `agents/tmp/<round-hex>/prompt.md`. The directory name
14
+ * is an opaque round id because `block-speaking-inbox-dir` refuses any other
15
+ * shape under `agents/tmp/`; the id is random, so an earlier envelope is never
16
+ * overwritten.
17
+ *
18
+ * Subagent lanes report refusals in the fixed `classifier_refusals` field;
19
+ * `batchLaneRefusals` folds every lane's field into ONE list so a drain ends in
20
+ * one envelope instead of N reports the owner collects by hand. A lane report
21
+ * WITHOUT the field is malformed — "no field" and "no refusals" must not read
22
+ * the same, or a lane that forgot to report looks like a lane that was clean.
23
+ *
24
+ * Usage:
25
+ * refusal_envelope --input <file.json> [--root DIR]
26
+ * The JSON is an `EnvelopeInput`. Prints the written path as the last line.
27
+ */
28
+
29
+ import { randomBytes } from 'node:crypto';
30
+ import * as fs from 'node:fs';
31
+ import * as path from 'node:path';
32
+ import { pathToFileURL } from 'node:url';
33
+
34
+ export interface Refusal {
35
+ action: string;
36
+ reason: string;
37
+ lane?: string;
38
+ }
39
+
40
+ export interface EnvelopeInput {
41
+ task: string;
42
+ done: string[];
43
+ refusals: Refusal[];
44
+ remaining: string[];
45
+ /** Path of the owner-directive record that authorized the task, if any. */
46
+ ownerDirective?: string;
47
+ }
48
+
49
+ export interface LaneReport {
50
+ lane: string;
51
+ classifier_refusals: Array<{ action: string; reason: string }>;
52
+ }
53
+
54
+ const bullets = (items: readonly string[]): string => (items.length > 0 ? items.map((i) => `- ${i}`).join('\n') : '- none');
55
+
56
+ export function renderEnvelope(input: EnvelopeInput): string {
57
+ if (input.refusals.length === 0) {
58
+ throw new Error('an envelope needs at least one refusal — without one there is nothing to hand off');
59
+ }
60
+ const refused = input.refusals
61
+ .map((r) => `- ${r.lane !== undefined ? `[${r.lane}] ` : ''}${r.action} — refused: ${r.reason}`)
62
+ .join('\n');
63
+ const auth =
64
+ input.ownerDirective !== undefined
65
+ ? `The repository owner directly ordered this task; the order is recorded verbatim in \`${input.ownerDirective}\`. I am the owner and I authorize the remaining steps below in this message.`
66
+ : 'I am the owner of this repository and I authorize the remaining steps below in this message.';
67
+ return [
68
+ '# Continuation prompt — paste into a fresh session',
69
+ '',
70
+ '## Task',
71
+ '',
72
+ input.task,
73
+ '',
74
+ '## Done',
75
+ '',
76
+ bullets(input.done),
77
+ '',
78
+ '## Refused by the host classifier',
79
+ '',
80
+ refused,
81
+ '',
82
+ 'Do not retry or route around these refusals. If one recurs, stop and say so.',
83
+ '',
84
+ '## Remaining steps',
85
+ '',
86
+ input.remaining.map((s, i) => `${i + 1}. ${s}`).join('\n'),
87
+ '',
88
+ '## Owner authorization',
89
+ '',
90
+ auth,
91
+ '',
92
+ ].join('\n');
93
+ }
94
+
95
+ export function writeEnvelope(root: string, input: EnvelopeInput): string {
96
+ const body = renderEnvelope(input);
97
+ const dir = path.join(root, 'agents', 'tmp', `round-${randomBytes(4).toString('hex')}`);
98
+ fs.mkdirSync(dir, { recursive: true });
99
+ const file = path.join(dir, 'prompt.md');
100
+ fs.writeFileSync(file, body, { flag: 'wx' });
101
+ return file;
102
+ }
103
+
104
+ export function batchLaneRefusals(reports: readonly LaneReport[]): Refusal[] {
105
+ const out: Refusal[] = [];
106
+ for (const r of reports) {
107
+ if (!Array.isArray(r.classifier_refusals)) {
108
+ throw new Error(`lane ${r.lane} report is missing the classifier_refusals field`);
109
+ }
110
+ for (const x of r.classifier_refusals) {
111
+ out.push({ lane: r.lane, action: x.action, reason: x.reason });
112
+ }
113
+ }
114
+ return out;
115
+ }
116
+
117
+ export function main(argv: readonly string[] = process.argv.slice(2)): number {
118
+ let root = process.cwd();
119
+ let input: string | undefined;
120
+ for (let i = 0; i < argv.length; i++) {
121
+ if (argv[i] === '--root') {
122
+ root = argv[++i] ?? root;
123
+ } else if (argv[i] === '--input') {
124
+ input = argv[++i];
125
+ }
126
+ }
127
+ if (input === undefined) {
128
+ process.stderr.write('usage: refusal_envelope --input <file.json> [--root DIR]\n');
129
+ return 2;
130
+ }
131
+ const file = writeEnvelope(root, JSON.parse(fs.readFileSync(input, 'utf8')) as EnvelopeInput);
132
+ process.stdout.write(`${path.relative(root, file)}\n`);
133
+ return 0;
134
+ }
135
+
136
+ if (import.meta.url === pathToFileURL(process.argv[1] ?? '').href) {
137
+ process.exit(main());
138
+ }
@@ -466,20 +466,37 @@ export function local_release_gate_argv(): string[] {
466
466
  * Returns `null` on any measurement failure — a shallow clone or a missing tag
467
467
  * is an environment fact, and a release must not stop over one. `null` means
468
468
  * the line is simply not rendered.
469
+ *
470
+ * Both ends are resolved to SHAs BEFORE measuring, and the rendered level
471
+ * carries them. The 16.3.0 line read `23 vs 1` while the measurer re-run on
472
+ * `16.2.0..16.3.0` reads `83 vs 3`: `HEAD` at write time was not the commit the
473
+ * tag later named, and the line recorded neither end, so nobody could say which
474
+ * range it had read. With both SHAs in the line, `measure_release_mix --from
475
+ * <from> --to <to>` reproduces it.
469
476
  */
470
477
  export function measure_mix_obligation(
471
478
  version: string,
472
479
  fromRef?: string | null,
480
+ opts: { toRef?: string; cwd?: string } = {},
473
481
  ): MixObligation | null {
482
+ const cwd = opts.cwd ?? REPO_ROOT;
483
+ const toRef = opts.toRef ?? 'HEAD';
474
484
  try {
475
- const from = fromRef ?? previous_release_tag('HEAD', REPO_ROOT);
485
+ const from = fromRef ?? previous_release_tag(toRef, cwd);
476
486
  if (!from) return null;
477
- const reading = measureRange(from, 'HEAD', loadTaxonomy(), version, REPO_ROOT);
487
+ const from_sha = _resolve_commit(from, cwd);
488
+ const to_sha = _resolve_commit(toRef, cwd);
489
+ const reading = measureRange(from_sha, to_sha, loadTaxonomy(), version, cwd);
478
490
  const o = reading.response_obligation;
479
491
  return {
480
492
  level:
481
493
  `governance-only ${String(o.governance_only)} vs consumer-only ` +
482
- `${String(o.consumer_only)} (taxonomy ${reading.taxonomy_version})`,
494
+ `${String(o.consumer_only)} (taxonomy ${reading.taxonomy_version}; ` +
495
+ `range ${from_sha.slice(0, 12)}..${to_sha.slice(0, 12)})`,
496
+ from_sha,
497
+ to_sha,
498
+ governance_only: o.governance_only,
499
+ consumer_only: o.consumer_only,
483
500
  };
484
501
  } catch (err) {
485
502
  // Printed rather than swallowed. Nothing refuses over the reading any
@@ -494,6 +511,15 @@ export function measure_mix_obligation(
494
511
  }
495
512
  }
496
513
 
514
+ function _resolve_commit(ref: string, cwd: string): string {
515
+ const r = spawnSync('git', ['rev-parse', '--verify', `${ref}^{commit}`], { encoding: 'utf-8', cwd });
516
+ const sha = (r.stdout ?? '').trim();
517
+ if (r.status !== 0 || !/^[0-9a-f]{40}$/u.test(sha)) {
518
+ throw new Error(`cannot resolve \`${ref}\` to a commit`);
519
+ }
520
+ return sha;
521
+ }
522
+
497
523
  /**
498
524
  * Refuse the FIRST remote state of a release whose section is not publishable.
499
525
  *