@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
@@ -8,8 +8,8 @@
8
8
  *
9
9
  * The record is a COMMITTED ledger — `agents/evidence/release-findings/
10
10
  * <version>.json` — never the PR comment (council 2026-08-03: a comment is
11
- * mutable and unaudited; it is transport, not a record). Every blocking/high
12
- * finding in the ledger must carry a complete disposition
11
+ * mutable and unaudited; it is transport, not a record). Every blocking
12
+ * finding in the ledger (see `isBlocking`) must carry a complete disposition
13
13
  * `{status: fixed|false_positive|accepted_risk, commit (when fixed),
14
14
  * rationale, verified_by}`; the release workflow is red while one does not.
15
15
  *
@@ -75,6 +75,7 @@ import * as path from 'node:path';
75
75
  import process from 'node:process';
76
76
  import { fileURLToPath } from 'node:url';
77
77
 
78
+ import { coverageLabel } from './_lib/review_coverage.js';
78
79
  import { DeadScopeError, reportScanned } from './_lib/scan_scope.js';
79
80
 
80
81
  const _HERE = fileURLToPath(import.meta.url);
@@ -84,6 +85,26 @@ export const LEDGER_DIR = 'agents/evidence/release-findings';
84
85
  export const DISPOSITION_STATUSES = ['fixed', 'false_positive', 'accepted_risk'] as const;
85
86
  export type DispositionStatus = (typeof DISPOSITION_STATUSES)[number];
86
87
 
88
+ /**
89
+ * Every status that means a human re-read the finding and decided.
90
+ *
91
+ * `still_open` is the fourth, and it exists so that "give every row a terminal
92
+ * status" does not read as "close every finding". A row re-checked against the
93
+ * merged head and found to be a real, unfixed issue is adjudicated; writing
94
+ * `accepted_risk` over it to make a count reach zero would be the cheapest way
95
+ * to satisfy the requirement and the one that destroys it.
96
+ *
97
+ * It is deliberately NOT in {@link DISPOSITION_STATUSES}: a BLOCKING row may
98
+ * never pass on it. `missing_dispositions` reports a blocking finding marked
99
+ * `still_open` with its own message and the gate stays red — which is the
100
+ * behaviour a blocking finding that is still open should have.
101
+ *
102
+ * `open` from the schema is absent on purpose. The schema documents it as the
103
+ * INITIAL state, so counting it would make the tally reachable without anyone
104
+ * re-reading a finding.
105
+ */
106
+ export const TERMINAL_STATUSES = [...DISPOSITION_STATUSES, 'still_open'] as const;
107
+
87
108
  export interface LedgerFinding {
88
109
  finding_id: string;
89
110
  severity: 'critical' | 'high' | 'medium' | 'low';
@@ -120,6 +141,12 @@ export interface Ledger {
120
141
  assurance?: string;
121
142
  reviewers?: string[];
122
143
  coverage?: unknown;
144
+ /**
145
+ * Per-run count of findings quoting a supplied fact, written by
146
+ * `self_review_gate` under `--findings-out`. Declared here because ingest
147
+ * now carries it; see {@link INTEGRITY_FIELDS}.
148
+ */
149
+ fact_claims?: unknown;
123
150
  }
124
151
 
125
152
  /**
@@ -139,7 +166,7 @@ export interface Ledger {
139
166
  * consumer inferring it from the findings would be inventing the integrity
140
167
  * claim the fields exist to record.
141
168
  */
142
- export const INTEGRITY_FIELDS = [
169
+ const SCHEMA_INTEGRITY_FIELDS = [
143
170
  'review_independence',
144
171
  'context_relation',
145
172
  'acceptance_status',
@@ -148,6 +175,24 @@ export const INTEGRITY_FIELDS = [
148
175
  'coverage',
149
176
  ] as const;
150
177
 
178
+ /**
179
+ * The carried set: the six above plus `fact_claims`.
180
+ *
181
+ * `fact_claims` is written by `self_review_gate.ts` at `--findings-out` time and
182
+ * was dropped by every ingest, because this list predates it. The field is the
183
+ * falsifier for the supplied-facts change — a count over the next cut — and a
184
+ * falsifier that never reaches the record is not one. It is carried rather than
185
+ * recomputed for the same reason the other six are: only the producing run knows
186
+ * what it quoted.
187
+ *
188
+ * It is NOT in {@link SCHEMA_INTEGRITY_FIELDS}, which is the set the ingest
189
+ * warning names. That warning tells a writer that `check_review_schema` derives
190
+ * `acceptance_status` and `assurance` from `review_independence` and will red on
191
+ * a ledger declaring neither — a sentence that is simply untrue of `fact_claims`,
192
+ * and naming it there would make the warning wrong to buy one shorter list.
193
+ */
194
+ export const INTEGRITY_FIELDS = [...SCHEMA_INTEGRITY_FIELDS, 'fact_claims'] as const;
195
+
151
196
  /**
152
197
  * Merge a self-review artifact into a ledger: new findings by id, the integrity
153
198
  * fields on first write, and — when the review found nothing — the reason that
@@ -226,21 +271,74 @@ function _clean_review_reason(artifact: Record<string, unknown>): string {
226
271
  );
227
272
  }
228
273
 
274
+ export const MEDIUM_SECURITY_BLOCKS_AFTER = '16.3.0';
275
+
276
+ function semverParts(v: string): [number, number, number] | null {
277
+ const m = /^v?(\d+)\.(\d+)\.(\d+)/.exec(v.trim());
278
+ return m ? [Number(m[1]), Number(m[2]), Number(m[3])] : null;
279
+ }
280
+
281
+ /** True unless `release` parses and is at or before the cutoff. */
282
+ export function mediumSecurityBinds(release: string | null): boolean {
283
+ if (release === null) return true;
284
+ const r = semverParts(release);
285
+ const cut = semverParts(MEDIUM_SECURITY_BLOCKS_AFTER) as [number, number, number];
286
+ if (r === null) return true;
287
+ for (let i = 0; i < 3; i++) {
288
+ const a = r[i] as number;
289
+ const b = cut[i] as number;
290
+ if (a !== b) return a > b;
291
+ }
292
+ return false;
293
+ }
294
+
229
295
  /**
230
- * Mirrors self_review_gate.classifyBlocking — security/claim × critical/high,
231
- * MINUS anything the tree disproved.
232
- *
233
- * The `contradicted` clause is not a second policy; it is the same one, and
234
- * the mirror has to carry it or the two gates disagree: the review would stop
235
- * counting a disproved deletion claim as blocking while the release kept
236
- * demanding a disposition for it. A `contradicted` value is written only by
237
- * `annotateContradicted`, which checks the claim against
238
- * `git diff --name-status base...HEAD` AND the working tree.
296
+ * self_review_gate.classifyBlocking (security/claim × critical/high) PLUS
297
+ * security × medium, MINUS anything the tree disproved.
298
+ *
299
+ * Deliberately STRICTER than the merge gate, and the asymmetry is load-bearing
300
+ * rather than drift — do not re-mirror it. The merge gate asks whether a change
301
+ * may enter trunk while work is still integrating; this gate asks whether a
302
+ * known risk may ship to users without an accountable decision. 16.3.0 shipped
303
+ * a medium security finding that had already been open in 16.2.0 with nobody
304
+ * required to decide it, so a medium security finding needs a disposition here
305
+ * while it stays advisory at merge. `accepted_risk` with a rationale satisfies
306
+ * it; `still_open` does not. `claim × medium` stays advisory in both.
307
+ * Council 2026-10-07 (claude-sonnet-4-5 + codex, 2/2 concluded, option a,
308
+ * release gate only). Revisit if medium security findings routinely receive
309
+ * formulaic `accepted_risk` over three consecutive releases, or exceed about
310
+ * ten per release.
311
+ *
312
+ * The widening is prospective: it binds releases after
313
+ * {@link MEDIUM_SECURITY_BLOCKS_AFTER}, the last one published before the
314
+ * decision. A release already shipped cannot be made to wait, and re-gating it
315
+ * would leave exactly two outcomes for a medium security row that is genuinely
316
+ * still open — a red trunk, or an `accepted_risk` written only to turn it
317
+ * green, which is the relabelling this gate exists to refuse. Without a release
318
+ * (a reported finding, a test) the wider rule applies.
319
+ *
320
+ * The cutoff orders by version, not by publication date: a maintenance release
321
+ * on an older line (a 16.2.x cut after the decision) sits at or before the
322
+ * cutoff and is exempt. The council ratified the prospective cutoff and this
323
+ * documented exemption on 2026-10-07 (2/2); cutting a maintenance line is the
324
+ * condition that reopens it.
325
+ *
326
+ * The `contradicted` clause is shared with the merge gate, and has to be or the
327
+ * two disagree: the review would stop counting a disproved deletion claim as
328
+ * blocking while the release kept demanding a disposition for it. A
329
+ * `contradicted` value is written only by `annotateContradicted`, which checks
330
+ * the claim against `git diff --name-status base...HEAD` AND the working tree.
239
331
  */
240
- export function isBlocking(f: Pick<LedgerFinding, 'kind' | 'severity' | 'contradicted'>): boolean {
332
+ export function isBlocking(
333
+ f: Pick<LedgerFinding, 'kind' | 'severity' | 'contradicted'>,
334
+ release: string | null = null,
335
+ ): boolean {
241
336
  if ((f.contradicted ?? '').trim() !== '') {
242
337
  return false;
243
338
  }
339
+ if (f.kind === 'security' && f.severity === 'medium' && mediumSecurityBinds(release)) {
340
+ return true;
341
+ }
244
342
  return (
245
343
  (f.kind === 'security' || f.kind === 'claim') &&
246
344
  (f.severity === 'critical' || f.severity === 'high')
@@ -253,10 +351,13 @@ export function isBlocking(f: Pick<LedgerFinding, 'kind' | 'severity' | 'contrad
253
351
  * Empty rationale / verified_by is a hygiene violation (waiver precedent:
254
352
  * "empty string = hygiene violation"); status `fixed` requires a commit.
255
353
  */
256
- export function missing_dispositions(findings: readonly LedgerFinding[]): string[] {
354
+ export function missing_dispositions(
355
+ findings: readonly LedgerFinding[],
356
+ release: string | null = null,
357
+ ): string[] {
257
358
  const problems: string[] = [];
258
359
  for (const f of findings) {
259
- if (!isBlocking(f)) {
360
+ if (!isBlocking(f, release)) {
260
361
  continue;
261
362
  }
262
363
  const label = `${f.finding_id} (${f.severity} ${f.kind}: ${f.title})`;
@@ -265,6 +366,10 @@ export function missing_dispositions(findings: readonly LedgerFinding[]): string
265
366
  problems.push(`${label}: no disposition status`);
266
367
  continue;
267
368
  }
369
+ if (status === 'still_open') {
370
+ problems.push(`${label}: still_open does not satisfy a blocking finding — fix it, disprove it, or accept the risk with a reason`);
371
+ continue;
372
+ }
268
373
  if (!(DISPOSITION_STATUSES as readonly string[]).includes(status)) {
269
374
  problems.push(`${label}: unknown status ${JSON.stringify(status)}`);
270
375
  continue;
@@ -282,6 +387,69 @@ export function missing_dispositions(findings: readonly LedgerFinding[]): string
282
387
  return problems;
283
388
  }
284
389
 
390
+ /** What the success line reports, counted over the two populations apart. */
391
+ export interface DispositionTally {
392
+ /** Rows `isBlocking` admits. */
393
+ readonly blockingTotal: number;
394
+ /** Of those, the ones `missing_dispositions` finds nothing wrong with. */
395
+ readonly blockingDispositioned: number;
396
+ /** Every other row. The gate cannot fail on these; it can still count them. */
397
+ readonly nonBlockingTotal: number;
398
+ /** Of those, the ones carrying a {@link TERMINAL_STATUSES} value. */
399
+ readonly nonBlockingTerminal: number;
400
+ }
401
+
402
+ /**
403
+ * Count what the gate checked, split by what it can actually require.
404
+ *
405
+ * The recorded failure this exists for: `--release 16.2.0` printed "all 20
406
+ * recorded finding(s) for 16.2.0 dispositioned (blocking ones completely)" over
407
+ * a ledger carrying a `status` on 2 of 20 rows. Both halves of that sentence are
408
+ * individually defensible — the gate did require the blocking ones, and it did
409
+ * complete — and together they say the opposite of the truth, because nobody
410
+ * reads a parenthetical as a retraction of the word in front of it. Eighteen
411
+ * findings had never been adjudicated and the record said they had.
412
+ *
413
+ * The fix is a count, not a new refusal. Exit semantics are untouched: a
414
+ * non-blocking row still cannot fail the gate. What changes is that the line
415
+ * stops claiming the rows it never looked at.
416
+ *
417
+ * An unrecognised status counts as NOT terminal, which is the conservative
418
+ * direction: a typo surfaces as a row the line says is unadjudicated, rather
419
+ * than disappearing into a count that reads as finished.
420
+ */
421
+ export function disposition_tally(
422
+ findings: readonly LedgerFinding[],
423
+ release: string | null = null,
424
+ ): DispositionTally {
425
+ let blockingTotal = 0;
426
+ let blockingDispositioned = 0;
427
+ let nonBlockingTotal = 0;
428
+ let nonBlockingTerminal = 0;
429
+ for (const f of findings) {
430
+ if (isBlocking(f, release)) {
431
+ blockingTotal++;
432
+ if (missing_dispositions([f], release).length === 0) {
433
+ blockingDispositioned++;
434
+ }
435
+ continue;
436
+ }
437
+ nonBlockingTotal++;
438
+ if ((TERMINAL_STATUSES as readonly string[]).includes((f.status ?? '').trim())) {
439
+ nonBlockingTerminal++;
440
+ }
441
+ }
442
+ return { blockingTotal, blockingDispositioned, nonBlockingTotal, nonBlockingTerminal };
443
+ }
444
+
445
+ /** The tally as the success line renders it. Never the word "all". */
446
+ export function disposition_summary(t: DispositionTally): string {
447
+ return (
448
+ `blocking ${String(t.blockingDispositioned)}/${String(t.blockingTotal)} dispositioned · ` +
449
+ `non-blocking ${String(t.nonBlockingTerminal)}/${String(t.nonBlockingTotal)} carry a terminal status`
450
+ );
451
+ }
452
+
285
453
  /**
286
454
  * An empty finding set must say why it is empty.
287
455
  *
@@ -434,10 +602,11 @@ export function resolve_release_status(release: string): ReleaseStatus {
434
602
  export function unrecorded_findings(
435
603
  reported: ReadonlyArray<Pick<LedgerFinding, 'finding_id' | 'severity' | 'kind' | 'title' | 'contradicted'>>,
436
604
  ledger: readonly LedgerFinding[],
605
+ release: string | null = null,
437
606
  ): string[] {
438
607
  const known = new Set(ledger.map((f) => f.finding_id));
439
608
  return reported
440
- .filter((f) => isBlocking(f) && !known.has(f.finding_id))
609
+ .filter((f) => isBlocking(f, release) && !known.has(f.finding_id))
441
610
  .map((f) => `${f.finding_id} (${f.severity} ${f.kind}: ${f.title}) reported by the self-review but not in the ledger`);
442
611
  }
443
612
 
@@ -577,7 +746,7 @@ function main(argv: readonly string[]): number {
577
746
  'ledger is a result rather than an absence\n',
578
747
  );
579
748
  }
580
- const absent = INTEGRITY_FIELDS.filter((k) => ledger[k] === undefined);
749
+ const absent = SCHEMA_INTEGRITY_FIELDS.filter((k) => ledger[k] === undefined);
581
750
  if (absent.length > 0) {
582
751
  process.stdout.write(
583
752
  `⚠️ artifact carried no ${absent.join(', ')} — ` +
@@ -667,18 +836,24 @@ function main(argv: readonly string[]): number {
667
836
  throw exc;
668
837
  }
669
838
 
670
- const problems = missing_dispositions(ledger.findings);
839
+ const problems = missing_dispositions(ledger.findings, release);
671
840
  if (pr) {
672
841
  const reported = parse_comment_findings(_gh_comment_bodies(pr));
673
- problems.push(...unrecorded_findings(reported, ledger.findings));
842
+ problems.push(...unrecorded_findings(reported, ledger.findings, release));
674
843
  }
675
844
 
676
845
  if (problems.length === 0) {
677
846
  const n = ledger.findings.length;
847
+ // The label is appended to BOTH lines, including the zero-findings one:
848
+ // a review that read 65 of 678 files and reported nothing is the case
849
+ // where "no findings" is least informative on its own.
850
+ const partial = coverageLabel(ledger.coverage);
851
+ const suffix = partial === null ? '' : ` — ${partial}`;
678
852
  process.stdout.write(
679
853
  n === 0
680
- ? `✅ no recorded findings for ${release} (ledger ${fs.existsSync(ledgerPath) ? 'empty' : 'absent'})\n`
681
- : `✅ all ${n} recorded finding(s) for ${release} dispositioned (blocking ones completely)\n`,
854
+ ? `✅ no recorded findings for ${release} (ledger ${fs.existsSync(ledgerPath) ? 'empty' : 'absent'})${suffix}\n`
855
+ : `✅ ${String(n)} recorded finding(s) for ${release} — ` +
856
+ `${disposition_summary(disposition_tally(ledger.findings, release))}${suffix}\n`,
682
857
  );
683
858
  return 0;
684
859
  }
@@ -30,7 +30,8 @@
30
30
  * definition. It runs the same contract as the review-side canary in
31
31
  * `docs/contracts/adversarial-review-protocol.md` § 6 (rotating class, sealed
32
32
  * record, NEVER SHIPS) and is deliberately kept OFF the default CI path: it
33
- * mutates the tree, so it is an operator-invoked biannual experiment, not a
33
+ * mutates the tree, so it is a scheduled experiment (`.github/workflows/gate-canary.yml`,
34
+ * monthly, ledger uploaded as a run artifact) or an operator run, never a
34
35
  * per-PR gate. Every plant is reverted in a `finally`.
35
36
  *
36
37
  * CLI:
@@ -415,8 +416,8 @@ function report_negative_control_inventory(specs: readonly GateSpec[]): void {
415
416
  // The arithmetic is the guard against skimming: two numbers that reconcile
416
417
  // against the enforced total cannot be read as "all of them checked".
417
418
  process.stdout.write(
418
- ` ⚠️ declared, not run — the mutating --canary path is operator-invoked and off the per-PR workflow, ` +
419
- `so no negative control ran here.\n`,
419
+ ` ⚠️ declared, not run — the mutating --canary path is off the per-PR workflow (it runs monthly ` +
420
+ `in .github/workflows/gate-canary.yml), so no negative control ran here.\n`,
420
421
  );
421
422
  for (const s of without) {
422
423
  process.stdout.write(` · ${s.id}: ${s.no_canary_reason ?? '(no reason recorded)'}\n`);
@@ -42,6 +42,7 @@ import {
42
42
  resetSourceCache,
43
43
  type InventoryVerdict,
44
44
  } from './_lib/loop_surfaces.js';
45
+ import { analyseModuleReach, groupCounts } from './_lib/module_reach.js';
45
46
 
46
47
  const REPO_ROOT = process.cwd();
47
48
  const TASKFILES_DIR = 'taskfiles';
@@ -312,6 +313,10 @@ function runGate(root: string): number {
312
313
  units: 'exemption row(s) + unreachable target(s) + declared loop instrument(s)',
313
314
  roots: [EXEMPTIONS_REL, INVENTORY_REL, ROOT_TASKFILE, TASKFILES_DIR],
314
315
  });
316
+ // Phase 3.1 of road-to-modules-that-something-calls.md: five numbers beside
317
+ // this gate's existing verdicts, printed whether the gate passes or fails —
318
+ // reported, enforcing nothing, the way the estate gate prints its draft count.
319
+ process.stdout.write(moduleReachLine(moduleReachSummary(root)));
315
320
  const inventoryClean = inv.shape.length === 0 && inv.reach.length === 0;
316
321
  if (v.unreasoned.length === 0 && v.stale.length === 0 && inventoryClean) {
317
322
  process.stdout.write(
@@ -506,13 +511,54 @@ function selfTest(): number {
506
511
  }
507
512
  }
508
513
 
514
+ export interface ModuleReachSummary {
515
+ /** The four group counts — the roadmap's "four group counts", over the unreferenced-by-name set only. */
516
+ groups: Record<'contract-test' | 'open-or-deferred-step' | 'named-outside-open-step' | 'named-in-none', number>;
517
+ /** "the total of modules reached by nothing" (import edges + run-by-path) — the fifth number. */
518
+ reachedByNothing: number;
519
+ /**
520
+ * Not one of the five — the size of the unreferenced-by-name set the four
521
+ * groups partition. Kept on the summary because it is a free cross-check
522
+ * (it must equal the sum of `groups`); never printed as a sixth number.
523
+ */
524
+ unreferencedTotal: number;
525
+ }
526
+
527
+ /**
528
+ * The five module-reach numbers (road-to-modules-that-something-calls.md
529
+ * Phase 3.1) — reported beside this gate's own verdicts, the way the estate
530
+ * gate prints its draft-roadmap count: a number that moves in a change's own
531
+ * gate output, enforcing nothing.
532
+ */
533
+ export function moduleReachSummary(root: string): ModuleReachSummary {
534
+ const { modules } = analyseModuleReach(root);
535
+ const unreferenced = modules.filter((m) => !m.namedByProduction);
536
+ return {
537
+ groups: groupCounts(unreferenced),
538
+ reachedByNothing: modules.filter((m) => !m.reachedByImportOrPath).length,
539
+ unreferencedTotal: unreferenced.length,
540
+ };
541
+ }
542
+
543
+ export function moduleReachLine(s: ModuleReachSummary): string {
544
+ return (
545
+ `module reach (reported, not gated), src/scripts/_lib: ` +
546
+ `contract-test ${String(s.groups['contract-test'])} · ` +
547
+ `open-or-deferred-step ${String(s.groups['open-or-deferred-step'])} · ` +
548
+ `named-outside-open-step ${String(s.groups['named-outside-open-step'])} · ` +
549
+ `named-in-none ${String(s.groups['named-in-none'])} · ` +
550
+ `REACHED-BY-NOTHING total ${String(s.reachedByNothing)}\n`
551
+ );
552
+ }
553
+
509
554
  export function main(argv: string[] = process.argv.slice(2), root = REPO_ROOT): number {
510
555
  if (argv.includes('--self-test')) return selfTest();
511
556
  if (argv.includes('--gate')) return runGate(root);
512
557
  const r = analyse(root);
513
558
  const inv = inventoryVerdict(root);
559
+ const moduleReach = moduleReachSummary(root);
514
560
  if (argv.includes('--json')) {
515
- process.stdout.write(`${JSON.stringify({ ...r, inventory: inv }, null, 2)}\n`);
561
+ process.stdout.write(`${JSON.stringify({ ...r, inventory: inv, moduleReach }, null, 2)}\n`);
516
562
  return 0;
517
563
  }
518
564
  // Emitted on the DEFAULT invocation too, not only under `--gate`: the
@@ -538,6 +584,7 @@ export function main(argv: string[] = process.argv.slice(2), root = REPO_ROOT):
538
584
  `prose-bound surfaces ${String(inv.proseBound.length)}\n`,
539
585
  );
540
586
  for (const f of inv.reach) process.stdout.write(` · ${f.id} — ${f.detail}\n`);
587
+ process.stdout.write(moduleReachLine(moduleReach));
541
588
  return 0;
542
589
  }
543
590
 
@@ -546,11 +546,59 @@ const HOST_LOWERING_TRIPLE: Triple = {
546
546
  },
547
547
  };
548
548
 
549
+ const GRAMMAR_REFERENCE = 'src/skills/git-workflow/references/commit-subject.md';
550
+ const GRAMMAR_GENERATOR = 'src/scripts/generate_git_convention_grammar.ts';
551
+
552
+ /**
553
+ * The commit-subject reference is the fallback a command reads when the
554
+ * `agent-config` binary cannot run, so its grammar block has to be the grammar
555
+ * the binary runs. The page itself is a source too: a hand edit to the block is
556
+ * the drift this row exists to catch.
557
+ */
558
+ const GIT_CONVENTION_GRAMMAR_TRIPLE: Triple = {
559
+ id: 'git-convention-grammar',
560
+ output: GRAMMAR_REFERENCE,
561
+ remedy: './scripts-run src/scripts/generate_git_convention_grammar',
562
+ why: 'the reference carries a grammar and measurement block rendered from the modules the git:convention verb runs',
563
+ sourcesOf() {
564
+ return {
565
+ ok: true,
566
+ sources: [
567
+ { kind: 'file', value: 'src/scripts/_lib/git_convention_grammar.ts' },
568
+ { kind: 'file', value: 'src/scripts/_lib/git_convention_measure.ts' },
569
+ { kind: 'file', value: GRAMMAR_GENERATOR },
570
+ { kind: 'file', value: GRAMMAR_REFERENCE },
571
+ ],
572
+ };
573
+ },
574
+ regenerate(root, workDir) {
575
+ const outFile = path.join(workDir, 'commit-subject.md');
576
+ const tsx = path.join(root, 'node_modules', '.bin', process.platform === 'win32' ? 'tsx.cmd' : 'tsx');
577
+ if (!fs.existsSync(tsx)) {
578
+ return { ok: false, reason: `no tsx at ${path.relative(root, tsx)} — run \`npm ci\` before this gate` };
579
+ }
580
+ const res = spawnSync(tsx, [path.join(root, GRAMMAR_GENERATOR), '--out', outFile], {
581
+ cwd: root,
582
+ encoding: 'utf8',
583
+ maxBuffer: 64 * 1024 * 1024,
584
+ });
585
+ if (res.status !== 0) {
586
+ return { ok: false, reason: `generate_git_convention_grammar exited ${String(res.status)}: ${(res.stderr ?? '').trim()}` };
587
+ }
588
+ try {
589
+ return { ok: true, text: fs.readFileSync(outFile, 'utf8') };
590
+ } catch (e) {
591
+ return { ok: false, reason: `generate_git_convention_grammar reported success but wrote no readable file (${String(e)})` };
592
+ }
593
+ },
594
+ };
595
+
549
596
  export const REGISTRY: readonly Triple[] = [
550
597
  CENSUS_TRIPLE,
551
598
  INSTALL_BUNDLE_TRIPLE,
552
599
  HOOK_MANIFEST_TRIPLE,
553
600
  HOST_LOWERING_TRIPLE,
601
+ GIT_CONVENTION_GRAMMAR_TRIPLE,
554
602
  ];
555
603
 
556
604
  // ---------------------------------------------------------------------------