@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
@@ -14,8 +14,8 @@
14
14
  * as "project instructions", never having consulted the router.
15
15
  *
16
16
  * Two surfaces, one switch. Sharing the definition is what lets the projector honour
17
- * it, so `speak: false` means what the ADR assumed instead of the ADR being weakened
18
- * to match a partial implementation.
17
+ * it, so dormancy means what the ADR assumed instead of the ADR being weakened to
18
+ * match a partial implementation.
19
19
  */
20
20
 
21
21
  /**
@@ -51,25 +51,16 @@ export type ToggleSettings = Record<string, unknown>;
51
51
  /** rule-id → predicate. A rule is emitted (router AND projection) only when its
52
52
  * predicate returns true. A rule absent from this map is always emitted. */
53
53
  export const COMPILE_TIME_TOGGLES: Record<string, (s: ToggleSettings) => boolean> = {
54
- // `speak` defaults FALSE (dormant) per docs/adrs/telegraph/0002 — the absent-key
55
- // fallback used to be `true`, which silently contradicted ADR 0001 (accepted,
56
- // "default off until bench"). Measured basis: median vs_terse −9.27% (API) /
57
- // −5.47% (exact cl100k_base) — telegraph emits MORE than a plain "be terse".
58
- // Opt back in with an explicit `telegraph.speak: true` once an output-side bench
59
- // clears the kill-criterion bar. `enabled` keeps its true default: it is the
60
- // family master switch, and flipping it would silence sibling telegraph settings
61
- // that were never measured negative.
62
- //
63
- // The predicate gates on `telegraph.speak` because that is the only lever that
64
- // removes the rule's ~982-token body from the router and the projection. A knob
65
- // that merely narrowed the grammar at runtime would leave the token cost in place
66
- // — the trap the measurement exposed.
67
- 'telegraph-speak': (s: ToggleSettings): boolean => {
68
- const tg = (s['telegraph'] as ToggleSettings | undefined) ?? {};
69
- const enabled = tg['enabled'] === undefined ? true : tg['enabled'];
70
- const speak = tg['speak'] === undefined ? false : tg['speak'];
71
- return Boolean(enabled) && Boolean(speak);
72
- },
54
+ // DORMANT, unconditionally. `speak` defaulted FALSE per docs/adrs/telegraph/0002
55
+ // (measured basis: median vs_terse −9.27% API / −5.47% exact cl100k_base —
56
+ // telegraph emits MORE than a plain "be terse"), and on 2026-10-09 the
57
+ // `telegraph.speak` key was retired with that default as the fixed value
58
+ // (road-to-settings-classes-derivable-surface-stagnation Phase 2.1). Whether
59
+ // the rule ships is the kill-criterion bench verdict, a package-level decision
60
+ // rather than a per-install one, so re-enabling it is a change to this
61
+ // predicate, made when an output-side bench clears the bar — never a setting.
62
+ // A leftover `telegraph.speak: true` is warned about by the loader and ignored.
63
+ 'telegraph-speak': (): boolean => false,
73
64
  };
74
65
 
75
66
  /** True when the rule may be emitted. Unknown ids are always emitted — the map is an
@@ -0,0 +1,163 @@
1
+ /**
2
+ * The static import closure of the hook dispatcher, and the class of each
3
+ * module in it.
4
+ *
5
+ * `check_kernel_edit_ratified` derives part of its watched set from this
6
+ * reading: a module the dispatcher reaches that decides an exit code needs a
7
+ * ratification record, whichever file the logic currently lives in. A hand
8
+ * list stayed correct until one function moved files; a derived set follows it.
9
+ *
10
+ * Deliberately static and deliberately narrow, so the reading is reproducible
11
+ * from a tree alone:
12
+ *
13
+ * - only RELATIVE specifiers (`./x.js`, `../_lib/y.js`) are followed —
14
+ * packages and `node:` builtins are not this repository's plumbing;
15
+ * - `import … from`, `export … from` and side-effect `import '…'` count;
16
+ * dynamic `import()` does not, because its target is not decidable here;
17
+ * - the walk STOPS at the concern table. Every module `concern_registry.ts`
18
+ * imports is a concern, classed `concern` and not walked into, because
19
+ * concerns stay outside the fence — a governance concern is gated by its
20
+ * own `block_*` pattern, and widening to every concern would turn routine
21
+ * edits into record-carrying ones.
22
+ *
23
+ * Classes, decided from the module's own source text:
24
+ *
25
+ * - `verdict` — names an exit-code constant (`EXIT_ALLOW`, `EXIT_BLOCK`,
26
+ * `EXIT_WARN`, `EXIT_USAGE`), or exports a function whose name says it
27
+ * decides a refusal (`deny…`, `…block…`, `…verdict…`, `…fail_closed…`).
28
+ * The constants are how the dispatcher turns a crash, a timeout or a stdin
29
+ * failure into the code a host acts on; the second signal catches a policy
30
+ * that returns a boolean the dispatcher then maps — `denyOnStdinFailure`
31
+ * names no constant and still decides whether a failed read refuses.
32
+ * - `payload` — names the payload a concern receives (`payload`, `stdin`).
33
+ * - `neither` — everything else (timing, state I/O, logging).
34
+ * - `concern` — imported by the concern table; outside the fence.
35
+ *
36
+ * The classes read NAMES, not data flow. A module already in the closure as
37
+ * `payload` or `neither` that gains verdict-influencing logic under a neutral
38
+ * name is not reclassified; the gate covers the arrival of such a module
39
+ * (`closureArrivals`) and its declassification (the base∪head union), not this.
40
+ * Closing it needs call-graph analysis — a different design, not a tweak.
41
+ */
42
+
43
+ import * as fs from 'node:fs';
44
+ import * as path from 'node:path';
45
+
46
+ /** The dispatcher, repo-relative. The closure's root. */
47
+ export const DISPATCHER_PATH = 'src/scripts/hooks/dispatch_hook.ts';
48
+
49
+ /** The concern table. Its imports are concerns, the walk's boundary. */
50
+ export const CONCERN_REGISTRY_PATH = 'src/scripts/hooks/concern_registry.ts';
51
+
52
+ export type ModuleClass = 'verdict' | 'payload' | 'neither' | 'concern';
53
+
54
+ export interface ClosureEntry {
55
+ /** Repo-relative POSIX path. */
56
+ path: string;
57
+ class: ModuleClass;
58
+ }
59
+
60
+ const EXIT_CONSTANT_RE = /\bEXIT_(?:ALLOW|BLOCK|WARN|USAGE)\b/;
61
+ const VERDICT_EXPORT_RE =
62
+ /\bexport\s+(?:async\s+)?(?:function\s+|const\s+)([A-Za-z_$][\w$]*)/g;
63
+ const VERDICT_NAME_RE = /deny|block|verdict|fail_?closed|refus/i;
64
+ const PAYLOAD_RE = /\b(?:payload|stdin)\b/i;
65
+
66
+ /**
67
+ * Relative specifiers in a module's source. Comments are stripped first so a
68
+ * commented-out import does not count as an edge.
69
+ */
70
+ export function relativeSpecifiers(source: string): string[] {
71
+ const stripped = source.replace(/\/\*[\s\S]*?\*\//g, '').replace(/(^|[^:])\/\/.*$/gm, '$1');
72
+ const out: string[] = [];
73
+ const re = /(?:\bimport\s+(?:type\s+)?(?:[\s\S]*?\bfrom\s*)?|\bexport\s+(?:type\s+)?[\s\S]*?\bfrom\s*)['"](\.{1,2}\/[^'"]+)['"]/g;
74
+ let m: RegExpExecArray | null;
75
+ while ((m = re.exec(stripped)) !== null) {
76
+ if (m[1] !== undefined) {
77
+ out.push(m[1]);
78
+ }
79
+ }
80
+ return out;
81
+ }
82
+
83
+ /** Resolve a `.js` specifier from `fromRel` to the `.ts` source on disk. */
84
+ function resolveSpecifier(root: string, fromRel: string, spec: string): string | null {
85
+ const base = path.posix.join(path.posix.dirname(fromRel), spec);
86
+ const candidates = [base.replace(/\.js$/, '.ts'), base, `${base}.ts`, `${base}/index.ts`];
87
+ for (const c of candidates) {
88
+ const norm = path.posix.normalize(c);
89
+ if (fs.existsSync(path.join(root, norm)) && fs.statSync(path.join(root, norm)).isFile()) {
90
+ return norm;
91
+ }
92
+ }
93
+ return null;
94
+ }
95
+
96
+ /** Classify one module from its source text. Never returns `concern`. */
97
+ export function classifySource(source: string): Exclude<ModuleClass, 'concern'> {
98
+ if (EXIT_CONSTANT_RE.test(source)) {
99
+ return 'verdict';
100
+ }
101
+ for (const m of source.matchAll(VERDICT_EXPORT_RE)) {
102
+ if (VERDICT_NAME_RE.test(m[1] ?? '')) {
103
+ return 'verdict';
104
+ }
105
+ }
106
+ if (PAYLOAD_RE.test(source)) {
107
+ return 'payload';
108
+ }
109
+ return 'neither';
110
+ }
111
+
112
+ /**
113
+ * Walk the closure from the dispatcher under `root`. Returns `[]` when the
114
+ * dispatcher is absent, so a fixture tree without one yields an empty set
115
+ * rather than an error. The dispatcher itself is not in the result — it is
116
+ * already watched by name.
117
+ */
118
+ export function dispatchImportClosure(root: string, entry: string = DISPATCHER_PATH): ClosureEntry[] {
119
+ if (!fs.existsSync(path.join(root, entry))) {
120
+ return [];
121
+ }
122
+ const seen = new Map<string, ModuleClass>();
123
+ const queue: string[] = [entry];
124
+ const visited = new Set<string>();
125
+ while (queue.length > 0) {
126
+ const rel = queue.shift() as string;
127
+ if (visited.has(rel)) {
128
+ continue;
129
+ }
130
+ visited.add(rel);
131
+ const source = fs.readFileSync(path.join(root, rel), 'utf8');
132
+ if (rel !== entry) {
133
+ seen.set(rel, classifySource(source));
134
+ }
135
+ const isRegistry = rel === CONCERN_REGISTRY_PATH;
136
+ for (const spec of relativeSpecifiers(source)) {
137
+ const target = resolveSpecifier(root, rel, spec);
138
+ if (target === null || target === entry) {
139
+ continue;
140
+ }
141
+ if (isRegistry) {
142
+ if (!seen.has(target)) {
143
+ seen.set(target, 'concern');
144
+ }
145
+ visited.add(target);
146
+ continue;
147
+ }
148
+ if (!visited.has(target)) {
149
+ queue.push(target);
150
+ }
151
+ }
152
+ }
153
+ return [...seen.entries()]
154
+ .map(([p, c]) => ({ path: p, class: c }))
155
+ .sort((a, b) => a.path.localeCompare(b.path));
156
+ }
157
+
158
+ /** The verdict-deciding modules of the closure — the part the gate watches. */
159
+ export function verdictModules(root: string): string[] {
160
+ return dispatchImportClosure(root)
161
+ .filter((e) => e.class === 'verdict')
162
+ .map((e) => e.path);
163
+ }
@@ -0,0 +1,241 @@
1
+ /**
2
+ * How a CHANGE touches the roadmap estate — the diff half, read once.
3
+ *
4
+ * `check_estate_count` answers two different questions with two different
5
+ * inputs. The count half reads the TREE and ratchets it against the base ref's
6
+ * tree. This module is the other half: it reads the DIFF and says what the
7
+ * change did — which roadmaps entered the active top level, which left it, which
8
+ * of the arrivals declared an exemption, and what that exemption says.
9
+ *
10
+ * WHY IT LIVES HERE AND NOT IN THE GATE. `check_source_size_budget` scores
11
+ * `Σ max(0, lines(f) − 1500)` over `src/**` and the gate crossed the ceiling
12
+ * when the exemption-shape work landed. That gate does not object to new code;
13
+ * it objects to new code in the file that is already too big to read, and the
14
+ * ratchet was right about which file that was. The seam it forced is the one a
15
+ * reader would draw anyway — tree-reading on one side of it, diff-reading on the
16
+ * other — so the extraction is a correction rather than a concession.
17
+ *
18
+ * `exemptionReason` sits here rather than beside the vocabulary it feeds
19
+ * (`exemption_shape.ts`) because this is the module that READS a change; that
20
+ * one is the module that JUDGES a reason. The split is read-then-judge, and
21
+ * keeping it means the vocabulary module imports no filesystem and no git.
22
+ */
23
+ import * as path from 'node:path';
24
+
25
+ import {
26
+ is_roadmap_candidate as isRoadmapCandidate,
27
+ parse_frontmatter as parseFrontmatter,
28
+ } from '../../agent-src/scripts/update_roadmap_progress.js';
29
+
30
+ /** How a change touched the active roadmap tree, as git reports it. */
31
+ export interface OffsetLedger {
32
+ /** Files that entered the active top level: new files, and un-parked ones. */
33
+ added: string[];
34
+ /** Files that left it: deleted, archived, parked or merged away. */
35
+ offsets: string[];
36
+ /** Added files carrying an `estate_offset_exempt:` reason, with the reason. */
37
+ exempt: Array<{ file: string; reason: string }>;
38
+ /**
39
+ * The subset of `offsets` that went to `later/`.
40
+ *
41
+ * Tracked separately because parking is the one offset that RAISES another
42
+ * gated count: active falls by one and later rises by one, which under an
43
+ * exact floor is growth in `later_roadmaps` unless this allowance exists.
44
+ * Kept out of a general "any offset raises any allowance" rule on purpose —
45
+ * an archived roadmap must not buy a new `later/` file.
46
+ */
47
+ parked: string[];
48
+ }
49
+
50
+ /** An `estate_growth_exempt:` reason ADDED to a roadmap in this change. */
51
+ export interface GrowthClaim {
52
+ /** The roadmap the claim was added to, as git reports the path. */
53
+ file: string;
54
+ reason: string;
55
+ }
56
+
57
+ /** `agents/roadmaps/<name>.md` — the active top level. code-comment-allow provenance-comment -- operand, not provenance */
58
+ function isActiveTopLevel(rel: string): boolean {
59
+ const norm = rel.split(path.sep).join('/');
60
+ if (!norm.startsWith('agents/roadmaps/') || !norm.endsWith('.md')) {
61
+ return false;
62
+ }
63
+ const tail = norm.slice('agents/roadmaps/'.length);
64
+ return !tail.includes('/') && isRoadmapCandidate(norm);
65
+ }
66
+
67
+ /**
68
+ * A disposition directory — where an offset sends a roadmap.
69
+ *
70
+ * `stubs/` is in the set, and it was missing from the first version. Un-stubbing
71
+ * is the documented promotion path, so a stub moved to the top level is an
72
+ * ADDITION that T3 must charge, and a roadmap demoted to a stub is an offset.
73
+ * With `stubs/` unrecognised, a promotion was classified as neither and the lint
74
+ * could never charge it — the one hole that let an active roadmap arrive for free.
75
+ */
76
+ function isDisposed(rel: string): boolean {
77
+ const norm = rel.split(path.sep).join('/');
78
+ return /^agents\/roadmaps\/(archive|later|skipped|stubs)\//.test(norm);
79
+ }
80
+
81
+ /** A roadmap parked for later — the one disposition that grows another count. */
82
+ function isParked(rel: string): boolean {
83
+ return rel.split(path.sep).join('/').startsWith('agents/roadmaps/later/');
84
+ }
85
+
86
+ /**
87
+ * Read the exemption reason a newly added roadmap declares, if any.
88
+ *
89
+ * The key lives in the file's own frontmatter rather than in a config or a
90
+ * commit trailer, for the reason `RATCHET_RESET_KEY` gives for living inside the
91
+ * baseline JSON: the claim then shows up in the diff of the change that makes
92
+ * it, and a reviewer sees it without being told to look.
93
+ *
94
+ * THE BLOCK SCALAR IS READ HERE AND NOT BY `parseFrontmatter`, which is a flat
95
+ * line parser with no YAML block support: it returns the value as everything
96
+ * after the first colon. Measured 2026-10-01 across the three roadmap trees,
97
+ * **38 of 221 exemptions are written `estate_offset_exempt: >-` with the reason
98
+ * indented beneath**, and for every one of them this function used to return
99
+ * the literal two-character string `>-`. That is non-empty, so the gate
100
+ * accepted it — a key whose whole purpose is that a reviewer sees the claim was
101
+ * being checked against a YAML punctuation mark on one file in six. The fix
102
+ * belongs here rather than in the shared parser because every other caller of
103
+ * that parser reads single-token values (`status`, `complexity`) where block
104
+ * support buys nothing and a rewrite risks the dashboard.
105
+ */
106
+ export function exemptionReason(text: string): string | null {
107
+ const block = blockScalar(text, 'estate_offset_exempt');
108
+ if (block !== null) return block === '' ? null : block;
109
+ const fm = parseFrontmatter(text);
110
+ const raw = (fm as Record<string, unknown>)['estate_offset_exempt'];
111
+ if (typeof raw !== 'string') {
112
+ return null;
113
+ }
114
+ const reason = raw.trim().replace(/^["']|["']$/g, '').trim();
115
+ return reason === '' ? null : reason;
116
+ }
117
+
118
+ /**
119
+ * The folded body of `<key>: >-` / `<key>: |`, or `null` when not that form.
120
+ *
121
+ * Returns `''` — not `null` — for a block header with no body, so the caller can
122
+ * tell "declared and empty" from "not a block scalar". An empty block is the
123
+ * blank-reason case the key already refuses, and collapsing it into `null` here
124
+ * would send it back to the flat parser, which would hand back `>-` and accept it.
125
+ */
126
+ function blockScalar(text: string, key: string): string | null {
127
+ const m = /^---\r?\n([\s\S]*?)\r?\n---/.exec(text);
128
+ if (m === null) return null;
129
+ const lines = (m[1] as string).split(/\r?\n/);
130
+ const head = new RegExp(`^${key}:[ \\t]*(.*)$`);
131
+ for (let i = 0; i < lines.length; i += 1) {
132
+ const hm = head.exec(lines[i] as string);
133
+ if (hm === null) continue;
134
+ // Only the block indicators. A quoted or bare value is the flat form and
135
+ // stays with the flat parser, which already handles it.
136
+ //
137
+ // THE TRAILING COMMENT IS PART OF THE HEADER, and omitting it was a
138
+ // BYPASS rather than a parse gap. `estate_offset_exempt: >- # offset`
139
+ // failed this test, fell through to the flat parser, and came back as
140
+ // the string `">- # offset"` — which the shape rule then searched for a
141
+ // disposition word and found one, IN THE COMMENT, over a body it never
142
+ // read. The indicator may also be written `>2-` as well as `>-2`, so
143
+ // both orders are accepted; an indentation indicator is never `0`.
144
+ if (!/^[>|](?:[1-9][-+]?|[-+]?[1-9]?)(?:[ \t]+#.*)?$/.test((hm[1] as string).trim())) return null;
145
+ const body: string[] = [];
146
+ for (let j = i + 1; j < lines.length; j += 1) {
147
+ const line = lines[j] as string;
148
+ if (line.trim() === '') continue;
149
+ // The first unindented line ends the block — the next key.
150
+ if (!/^[ \t]/.test(line)) break;
151
+ body.push(line.trim());
152
+ }
153
+ return body.join(' ').replace(/\s+/g, ' ').trim();
154
+ }
155
+ return null;
156
+ }
157
+
158
+ /**
159
+ * Classify the change's effect on the active roadmap tree.
160
+ *
161
+ * Renames carry information a name-only diff loses: `road-to-x.md` →
162
+ * `archive/road-to-x.md` is the wanted direction and counts as an offset, while
163
+ * `later/road-to-x.md` → `road-to-x.md` is an un-parking and counts as an
164
+ * addition. A top-level-to-top-level rename is neither.
165
+ */
166
+ export function classifyDiff(
167
+ nameStatus: string,
168
+ readFile: (rel: string) => string | null,
169
+ ): OffsetLedger {
170
+ const added: string[] = [];
171
+ const offsets: string[] = [];
172
+ const exempt: Array<{ file: string; reason: string }> = [];
173
+ const parked: string[] = [];
174
+ for (const line of nameStatus.split('\n')) {
175
+ if (line.trim() === '') continue;
176
+ const cols = line.split('\t');
177
+ const status = (cols[0] ?? '').trim();
178
+ if (status.startsWith('R') || status.startsWith('C')) {
179
+ const from = cols[1] ?? '';
180
+ const to = cols[2] ?? '';
181
+ if (isActiveTopLevel(from) && isDisposed(to)) {
182
+ offsets.push(from);
183
+ if (isParked(to)) parked.push(to);
184
+ } else if (isDisposed(from) && isActiveTopLevel(to)) {
185
+ added.push(to);
186
+ }
187
+ continue;
188
+ }
189
+ const file = cols[1] ?? '';
190
+ if (!isActiveTopLevel(file)) continue;
191
+ if (status === 'A') {
192
+ added.push(file);
193
+ } else if (status === 'D') {
194
+ offsets.push(file);
195
+ }
196
+ }
197
+ for (const file of added) {
198
+ const text = readFile(file);
199
+ if (text === null) continue;
200
+ const reason = exemptionReason(text);
201
+ if (reason !== null) {
202
+ exempt.push({ file, reason });
203
+ }
204
+ }
205
+ return { added, offsets, exempt, parked };
206
+ }
207
+
208
+ /**
209
+ * The `estate_growth_exempt:` reasons this change ADDS, read from the patch.
210
+ *
211
+ * Read from the diff rather than from the file, and that is the point: a claim
212
+ * sitting in a roadmap authorises nothing on a later change, so an exemption
213
+ * cannot be banked the way surplus in a stored baseline could. It also means a
214
+ * newly added roadmap and an edited one need no separate handling — in a
215
+ * `base...HEAD` patch both arrive as `+` lines.
216
+ *
217
+ * `--unified=0` keeps context lines out, so a claim that merely sits NEAR an
218
+ * edited line is not read as added. Deliberately tolerant of leading whitespace
219
+ * and of quoted values, matching `exemptionReason`; deliberately NOT tolerant of
220
+ * an empty reason, because an exemption whose reason is blank is the silent
221
+ * exception the key exists to replace.
222
+ */
223
+ export function growthClaims(patch: string): GrowthClaim[] {
224
+ const out: GrowthClaim[] = [];
225
+ let file = '';
226
+ for (const line of patch.split('\n')) {
227
+ // `+++ b/<path>` names the file the following `+` lines belong to. The
228
+ // `/dev/null` form is a deletion, which cannot carry a claim.
229
+ const head = /^\+\+\+ b\/(.+)$/.exec(line);
230
+ if (head !== null) {
231
+ file = (head[1] ?? '').trim();
232
+ continue;
233
+ }
234
+ if (!line.startsWith('+') || line.startsWith('+++')) continue;
235
+ const m = /^\+\s*estate_growth_exempt:\s*(.+?)\s*$/.exec(line);
236
+ if (m === null) continue;
237
+ const reason = (m[1] ?? '').trim().replace(/^["']|["']$/g, '').trim();
238
+ if (reason !== '') out.push({ file, reason });
239
+ }
240
+ return out;
241
+ }
@@ -0,0 +1,143 @@
1
+ /**
2
+ * What an `estate_offset_exempt` reason has to SAY — one vocabulary, two readers.
3
+ *
4
+ * THE DEFECT THIS EXISTS TO NAME. The one-in-one-out rule charges every added
5
+ * active roadmap against a disposed one, and `estate_offset_exempt: <reason>`
6
+ * is the escape hatch that costs "one reviewable line instead of a silent
7
+ * exception". `exemptionReason` accepted any non-empty string, so the line was
8
+ * reviewable in the sense that it existed. Measured 2026-10-01 over the active,
9
+ * `later/` and `archive/` trees: 221 files carry the key, and 43 of them name
10
+ * no alternative disposition at all under the three-lemma set the roadmap named
11
+ * from memory, and 6 under the measured one below — including three that say only
12
+ * `lane N of <parent>`. The escape hatch was free.
13
+ *
14
+ * WHAT A SHAPED REASON SAYS. It names at least one disposition the author
15
+ * considered instead of adding a file: archiving something, parking it in
16
+ * `later/`, merging into an existing roadmap, or any of the words this tree
17
+ * actually uses for those three. The requirement is deliberately NOT "explain
18
+ * yourself well" — that is unjudgeable — but "name what you rejected", which is
19
+ * a word that is either present or absent.
20
+ *
21
+ * WHY THE VOCABULARY IS MEASURED AND NOT CHOSEN. The commissioning roadmap
22
+ * named three lemmas, archive / park / merge, from memory. Over the real
23
+ * population those three cover 178 of 221; the measured ten below cover 215.
24
+ * The 37-file gap is not boilerplate — "Offsetting it individually is not
25
+ * possible without splitting the set" and "no completed roadmap to retire
26
+ * against this addition" both name a rejected alternative in words the
27
+ * three-lemma set does not carry. A refusal vocabulary that reds one added
28
+ * roadmap in five on the house style gets weakened until it finds nothing, so
29
+ * the set here is the one the tree writes. Every number above carries its
30
+ * producing command: `./scripts-run src/scripts/estate_exemption_shape`.
31
+ *
32
+ * `close` is excluded on purpose, and it is the most common verb in these
33
+ * reasons: it almost always refers to closing WORK, not to disposing of a file,
34
+ * so accepting it would make the check pass on a sentence that named nothing.
35
+ *
36
+ * WHAT THIS DOES NOT DO, stated because a reviewer called it HIGH and the
37
+ * disagreement is worth recording rather than resolving silently. The cheapest
38
+ * string that passes is the single word `park`, and `park 1` / `park 2` are two
39
+ * distinct reasons to the duplicate rule. So this verifies that a disposition
40
+ * word APPEARS; it does not verify that the author thought about one, and no
41
+ * check can. The claim the gate's message makes is therefore "name what you
42
+ * rejected", which is what a word either does or does not do — not "explain
43
+ * yourself well", which is unjudgeable. A reason gamed down to one word is
44
+ * visible to a human reviewer in the diff, which is where the key's own stated
45
+ * purpose puts the real control; what this removes is the case where there was
46
+ * nothing to look at because the reason was free text nobody had read.
47
+ *
48
+ * WHY ONE MODULE. Two readers consume this — the estate gate, which refuses,
49
+ * and the measurement script, which reports. A second copy of the lemma list is
50
+ * how a gate and its own evidence drift apart, and a drifted vocabulary fails
51
+ * silently: the report says the tree conforms while the gate refuses it.
52
+ */
53
+
54
+ /**
55
+ * The dispositions a reason may name, as source strings.
56
+ *
57
+ * Exported individually rather than as one baked regex so the measurement
58
+ * script can report per-lemma counts against the same list the gate refuses on.
59
+ */
60
+ export const DISPOSITION_LEMMAS: readonly { readonly name: string; readonly source: string }[] = [
61
+ { name: 'archive', source: String.raw`archiv\w*` },
62
+ // `park` is the one stem with a common false friend, and a reviewer named
63
+ // it: `park\w*` matches `parkour` at a word boundary, so a reason saying
64
+ // nothing about dispositions passes on a word that is not one. Enumerated
65
+ // instead of stemmed — the inflections this tree writes, and no more. Every
66
+ // other lemma keeps its stem; none of them has a false friend in English
67
+ // that could plausibly appear in a sentence about roadmap dispositions.
68
+ { name: 'park', source: String.raw`unpark(?:ed|ing|s)?\b|park(?:ed|ing|s)?\b` },
69
+ { name: 'merge', source: String.raw`merg\w*` },
70
+ { name: 'later', source: String.raw`later\/` },
71
+ { name: 'offset', source: String.raw`offset\w*` },
72
+ { name: 'defer', source: String.raw`defer\w*` },
73
+ { name: 'fold', source: String.raw`fold\w*` },
74
+ { name: 'consolidate', source: String.raw`consolidat\w*` },
75
+ { name: 'absorb', source: String.raw`absorb\w*` },
76
+ { name: 'retire', source: String.raw`retir\w*` },
77
+ ];
78
+
79
+ /** The whole vocabulary as one alternation — the gate's own test. */
80
+ export const DISPOSITION_SOURCE = `\\b(?:${DISPOSITION_LEMMAS.map((l) => l.source).join('|')})`;
81
+
82
+ const DISPOSITION_RE = new RegExp(DISPOSITION_SOURCE, 'i');
83
+
84
+ /** Does this reason name at least one rejected alternative? */
85
+ export function namesDisposition(reason: string): boolean {
86
+ return DISPOSITION_RE.test(reason);
87
+ }
88
+
89
+ /** Which lemmas a reason names, for the reader's per-file column. */
90
+ export function lemmasNamed(reason: string): string[] {
91
+ return DISPOSITION_LEMMAS.filter((l) => new RegExp(`\\b(?:${l.source})`, 'i').test(reason)).map((l) => l.name);
92
+ }
93
+
94
+ /**
95
+ * The comparison key for "two added files say the same thing".
96
+ *
97
+ * Case and whitespace are folded because a reason pasted into a second file and
98
+ * re-wrapped by an editor is the same reason. Nothing else is folded: a reason
99
+ * that differs by one clause is a different reason, and a normaliser clever
100
+ * enough to call those equal would start refusing reasons that genuinely differ.
101
+ */
102
+ export function reasonKey(reason: string): string {
103
+ return reason.toLowerCase().replace(/\s+/g, ' ').trim();
104
+ }
105
+
106
+ /** One added file whose exemption reason does not hold up. */
107
+ export interface ExemptionFinding {
108
+ readonly file: string;
109
+ readonly kind: 'shapeless' | 'duplicate';
110
+ /** For `duplicate`, the other added file carrying the same reason. */
111
+ readonly twin: string | null;
112
+ readonly reason: string;
113
+ }
114
+
115
+ /**
116
+ * Judge the exemptions a single change ADDS — never the ones already in the tree.
117
+ *
118
+ * Grandfathering is load-bearing rather than polite. 43 of the 221 existing
119
+ * reasons name no disposition; re-reading them would land this check red on a
120
+ * fifth of the corpus, which is a backlog wearing a control's clothes. The
121
+ * input is `classifyDiff`'s exempt ledger, which by construction lists only the
122
+ * files this change added.
123
+ */
124
+ export function exemptionFindings(
125
+ exempt: readonly { readonly file: string; readonly reason: string }[],
126
+ ): ExemptionFinding[] {
127
+ const out: ExemptionFinding[] = [];
128
+ const seen = new Map<string, string>();
129
+ for (const e of exempt) {
130
+ if (!namesDisposition(e.reason)) {
131
+ out.push({ file: e.file, kind: 'shapeless', twin: null, reason: e.reason });
132
+ continue;
133
+ }
134
+ const key = reasonKey(e.reason);
135
+ const twin = seen.get(key);
136
+ if (twin === undefined) {
137
+ seen.set(key, e.file);
138
+ continue;
139
+ }
140
+ out.push({ file: e.file, kind: 'duplicate', twin, reason: e.reason });
141
+ }
142
+ return out;
143
+ }
@@ -0,0 +1,23 @@
1
+ /**
2
+ * FNV-1a, 32-bit — the one definition in this tree.
3
+ *
4
+ * Extracted from `rule_trigger_eval.ts`, which still re-exports it under its
5
+ * own name so its suite keeps importing the symbol it always did. The reason
6
+ * for the extraction is the reason this file carries a doc block at all: a
7
+ * second consumer arrived (`measure_skill_ranker_baseline`'s held-out
8
+ * partition), and two copies of a hash that decides which rows a measurement
9
+ * reads is the shape in which a partition quietly stops being the same
10
+ * partition. One definition, two callers.
11
+ *
12
+ * Pure — no imports, no I/O, no clock.
13
+ */
14
+
15
+ /** FNV-1a over UTF-16 code units, returned as an unsigned 32-bit integer. */
16
+ export function fnv1a(s: string): number {
17
+ let h = 0x811c9dc5;
18
+ for (let i = 0; i < s.length; i += 1) {
19
+ h ^= s.charCodeAt(i);
20
+ h = Math.imul(h, 0x01000193) >>> 0;
21
+ }
22
+ return h >>> 0;
23
+ }