@event4u/agent-config 16.2.0 → 16.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (651) hide show
  1. package/.augment-plugin/marketplace.json +3 -3
  2. package/.augment-plugin/plugin.json +1 -1
  3. package/.claude-plugin/marketplace.json +1 -1
  4. package/CHANGELOG.md +337 -234
  5. package/README.md +15 -13
  6. package/agents/templates/.ai-council.yml.example +26 -8
  7. package/dist/agent-src/commands/analyze/inbox.md +11 -8
  8. package/dist/agent-src/commands/analyze/roadmap-repos.md +1 -1
  9. package/dist/agent-src/commands/bug/fix.md +17 -2
  10. package/dist/agent-src/commands/bug/investigate.md +1 -1
  11. package/dist/agent-src/commands/commit/in-chunks.md +40 -31
  12. package/dist/agent-src/commands/commit.md +72 -33
  13. package/dist/agent-src/commands/condense.md +2 -8
  14. package/dist/agent-src/commands/council/debate.md +11 -7
  15. package/dist/agent-src/commands/council/default.md +10 -9
  16. package/dist/agent-src/commands/council.md +1 -1
  17. package/dist/agent-src/commands/estimate-ticket.md +1 -1
  18. package/dist/agent-src/commands/feature/explore.md +3 -3
  19. package/dist/agent-src/commands/feature/plan.md +2 -2
  20. package/dist/agent-src/commands/feature/roadmap.md +1 -1
  21. package/dist/agent-src/commands/fix/ci.md +18 -4
  22. package/dist/agent-src/commands/fix/commit-messages.md +48 -23
  23. package/dist/agent-src/commands/fix/pr-comments.md +3 -6
  24. package/dist/agent-src/commands/implement-ticket.md +4 -4
  25. package/dist/agent-src/commands/jira-ticket.md +1 -1
  26. package/dist/agent-src/commands/memory/add.md +4 -16
  27. package/dist/agent-src/commands/memory/load.md +5 -6
  28. package/dist/agent-src/commands/memory/promote.md +3 -16
  29. package/dist/agent-src/commands/mission/upgrade.md +3 -2
  30. package/dist/agent-src/commands/optimize/agents-dir.md +2 -2
  31. package/dist/agent-src/commands/optimize/deep.md +4 -2
  32. package/dist/agent-src/commands/optimize/rtk.md +4 -26
  33. package/dist/agent-src/commands/pr/create/description-only.md +18 -15
  34. package/dist/agent-src/commands/pr/create.md +42 -34
  35. package/dist/agent-src/commands/pr/merge.md +136 -9
  36. package/dist/agent-src/commands/prepare-for-review.md +13 -11
  37. package/dist/agent-src/commands/project/analyze.md +7 -35
  38. package/dist/agent-src/commands/refine-ticket.md +1 -1
  39. package/dist/agent-src/commands/review/changes.md +14 -19
  40. package/dist/agent-src/commands/roadmap/create.md +1 -1
  41. package/dist/agent-src/commands/roadmap/materialize.md +1 -1
  42. package/dist/agent-src/commands/roadmap/next.md +10 -1
  43. package/dist/agent-src/commands/roadmap/process-full.md +56 -42
  44. package/dist/agent-src/commands/roadmap/resolve-blockers.md +411 -0
  45. package/dist/agent-src/commands/roadmap/triage-parked.md +325 -0
  46. package/dist/agent-src/commands/roadmap.md +18 -4
  47. package/dist/agent-src/commands/tests/create.md +17 -3
  48. package/dist/agent-src/commands/tests/execute.md +22 -5
  49. package/dist/agent-src/commands/worktree/create.md +7 -3
  50. package/dist/agent-src/commands/worktree/verify.md +2 -1
  51. package/dist/agent-src/contexts/authority/decision-revisit-gate-enforcement.md +43 -0
  52. package/dist/agent-src/contexts/communication/rules-auto/design-fidelity-enforcement.md +24 -0
  53. package/dist/agent-src/contexts/communication/rules-auto/think-before-action-mechanics.md +5 -3
  54. package/dist/agent-src/contexts/communication/rules-auto/token-efficiency-mechanics.md +7 -9
  55. package/dist/agent-src/contexts/contracts/command-suggestion-flow.md +8 -6
  56. package/dist/agent-src/contexts/contracts/frugality-charter.md +8 -5
  57. package/dist/agent-src/contexts/execution/auto-dispatch-classification.md +7 -7
  58. package/dist/agent-src/contexts/execution/auto-orchestration-activation.md +0 -1
  59. package/dist/agent-src/contexts/execution/evidence-discipline.md +2 -2
  60. package/dist/agent-src/contexts/execution/non-interactive-contract.md +5 -8
  61. package/dist/agent-src/contexts/execution/rdp-gate.md +4 -4
  62. package/dist/agent-src/contexts/execution/roadmap-execution-contract.md +9 -8
  63. package/dist/agent-src/contexts/execution/roadmap-process-loop.md +99 -54
  64. package/dist/agent-src/contexts/execution/session-canary-enforcement-history.md +67 -0
  65. package/dist/agent-src/contexts/execution/subagent-routing.md +8 -8
  66. package/dist/agent-src/contexts/execution/subagent-steering.md +6 -4
  67. package/dist/agent-src/contexts/execution/terminal-states.md +2 -2
  68. package/dist/agent-src/contexts/execution/toolchain-resolver.md +95 -7
  69. package/dist/agent-src/contexts/subagent-configuration.md +1 -1
  70. package/dist/agent-src/guidelines/agent-infra/active-remediation-mechanics.md +39 -0
  71. package/dist/agent-src/guidelines/agent-infra/context-hygiene-mechanics.md +1 -1
  72. package/dist/agent-src/guidelines/agent-infra/cross-source-consistency-mechanics.md +8 -10
  73. package/dist/agent-src/guidelines/agent-infra/frontier-reasoning-operating-profile.md +3 -2
  74. package/dist/agent-src/guidelines/agent-infra/layered-settings.md +13 -1
  75. package/dist/agent-src/guidelines/agent-infra/roadmap-progress-mechanics.md +1 -1
  76. package/dist/agent-src/guidelines/agent-infra/self-improvement-pipeline.md +10 -3
  77. package/dist/agent-src/guidelines/agent-infra/size-and-scope.md +36 -0
  78. package/dist/agent-src/guidelines/php/git.md +15 -2
  79. package/dist/agent-src/rules/active-remediation.md +1 -2
  80. package/dist/agent-src/rules/analysis-skill-routing.md +0 -1
  81. package/dist/agent-src/rules/architecture.md +0 -1
  82. package/dist/agent-src/rules/artifact-drafting-protocol.md +0 -1
  83. package/dist/agent-src/rules/artifact-engagement-recording.md +0 -1
  84. package/dist/agent-src/rules/augment-edit-discipline.md +0 -1
  85. package/dist/agent-src/rules/autonomous-execution.md +1 -1
  86. package/dist/agent-src/rules/brand-consistency.md +0 -1
  87. package/dist/agent-src/rules/brand-source-of-truth.md +0 -1
  88. package/dist/agent-src/rules/broken-access-control.md +1 -1
  89. package/dist/agent-src/rules/cli-output-handling.md +0 -1
  90. package/dist/agent-src/rules/code-comment-discipline.md +0 -1
  91. package/dist/agent-src/rules/code-provenance.md +0 -1
  92. package/dist/agent-src/rules/command-suggestion-policy.md +1 -1
  93. package/dist/agent-src/rules/commit-conventions.md +1 -2
  94. package/dist/agent-src/rules/communication-through-line.md +1 -2
  95. package/dist/agent-src/rules/content-quoting-floor.md +1 -2
  96. package/dist/agent-src/rules/context-hygiene.md +6 -6
  97. package/dist/agent-src/rules/copilot-routing.md +1 -2
  98. package/dist/agent-src/rules/council-availability.md +4 -4
  99. package/dist/agent-src/rules/cross-source-consistency.md +4 -6
  100. package/dist/agent-src/rules/decision-revisit-gate.md +17 -35
  101. package/dist/agent-src/rules/delegation-policy.md +2 -3
  102. package/dist/agent-src/rules/design-fidelity.md +12 -16
  103. package/dist/agent-src/rules/design-review-after-ui-write.md +3 -3
  104. package/dist/agent-src/rules/devcontainer-routing.md +1 -2
  105. package/dist/agent-src/rules/doc-screenshot-hygiene.md +1 -1
  106. package/dist/agent-src/rules/docker-commands.md +0 -1
  107. package/dist/agent-src/rules/domain-adoption-policy.md +0 -1
  108. package/dist/agent-src/rules/domain-safety-disclaimer.md +1 -1
  109. package/dist/agent-src/rules/domain-safety-pii.md +1 -1
  110. package/dist/agent-src/rules/domain-safety-retention.md +1 -1
  111. package/dist/agent-src/rules/downstream-changes.md +0 -1
  112. package/dist/agent-src/rules/engineering-safety-floor.md +1 -1
  113. package/dist/agent-src/rules/evaluator-independence.md +3 -2
  114. package/dist/agent-src/rules/external-code-graph-interop.md +0 -1
  115. package/dist/agent-src/rules/external-reference-deep-dive.md +0 -1
  116. package/dist/agent-src/rules/fast-path-marker-visibility.md +2 -2
  117. package/dist/agent-src/rules/finance-safety-floor.md +1 -1
  118. package/dist/agent-src/rules/fix-what-you-see.md +6 -32
  119. package/dist/agent-src/rules/framework-neutrality-in-generic-skills.md +0 -1
  120. package/dist/agent-src/rules/git-history-discipline.md +2 -2
  121. package/dist/agent-src/rules/guidelines.md +0 -1
  122. package/dist/agent-src/rules/history-discipline.md +0 -1
  123. package/dist/agent-src/rules/icon-consistency.md +0 -1
  124. package/dist/agent-src/rules/image-likeness-and-rights.md +1 -1
  125. package/dist/agent-src/rules/improve-before-implement.md +0 -1
  126. package/dist/agent-src/rules/invite-challenge.md +0 -1
  127. package/dist/agent-src/rules/laravel-routing.md +1 -2
  128. package/dist/agent-src/rules/laravel-translations.md +0 -1
  129. package/dist/agent-src/rules/legal-safety-floor.md +3 -3
  130. package/dist/agent-src/rules/lethal-trifecta-guard.md +1 -1
  131. package/dist/agent-src/rules/linked-projects-onboarding-gate.md +0 -1
  132. package/dist/agent-src/rules/low-impact-corpus-privacy-floor.md +1 -1
  133. package/dist/agent-src/rules/markdown-safe-codeblocks.md +0 -1
  134. package/dist/agent-src/rules/media-governance-routing.md +13 -17
  135. package/dist/agent-src/rules/media-sync-ground-truth.md +0 -1
  136. package/dist/agent-src/rules/minimal-safe-diff.md +0 -1
  137. package/dist/agent-src/rules/missing-skill-recovery.md +0 -1
  138. package/dist/agent-src/rules/missing-tool-handling.md +0 -1
  139. package/dist/agent-src/rules/model-recommendation.md +0 -1
  140. package/dist/agent-src/rules/neighbour-precedence.md +64 -0
  141. package/dist/agent-src/rules/no-attribution-footers.md +0 -1
  142. package/dist/agent-src/rules/no-decorative-emojis-in-git-surfaces.md +0 -1
  143. package/dist/agent-src/rules/no-pr-progress-comments.md +0 -1
  144. package/dist/agent-src/rules/no-roadmap-references.md +0 -1
  145. package/dist/agent-src/rules/notes-first-reasoning.md +0 -1
  146. package/dist/agent-src/rules/onboarding-gate.md +0 -1
  147. package/dist/agent-src/rules/output-discipline.md +0 -1
  148. package/dist/agent-src/rules/package-ci-checks.md +0 -1
  149. package/dist/agent-src/rules/persona-governance.md +4 -5
  150. package/dist/agent-src/rules/php-coding.md +0 -1
  151. package/dist/agent-src/rules/prefer-enums-over-literals.md +0 -1
  152. package/dist/agent-src/rules/preservation-guard.md +0 -1
  153. package/dist/agent-src/rules/provider-lifecycle-discipline.md +3 -4
  154. package/dist/agent-src/rules/question-not-instruction.md +1 -1
  155. package/dist/agent-src/rules/reviewer-awareness.md +0 -1
  156. package/dist/agent-src/rules/roadmap-ci-steps-policy.md +0 -1
  157. package/dist/agent-src/rules/roadmap-progress-sync.md +4 -7
  158. package/dist/agent-src/rules/role-mode-adherence.md +0 -1
  159. package/dist/agent-src/rules/rule-type-governance.md +0 -1
  160. package/dist/agent-src/rules/runtime-safety.md +1 -1
  161. package/dist/agent-src/rules/scale-discipline.md +0 -1
  162. package/dist/agent-src/rules/secret-vcs-guard.md +1 -1
  163. package/dist/agent-src/rules/security-sensitive-stop.md +3 -3
  164. package/dist/agent-src/rules/self-repair-loop.md +0 -1
  165. package/dist/agent-src/rules/senior-engineering-discipline.md +0 -1
  166. package/dist/agent-src/rules/session-canary.md +7 -62
  167. package/dist/agent-src/rules/settings-ask-protocol.md +6 -6
  168. package/dist/agent-src/rules/size-enforcement.md +0 -1
  169. package/dist/agent-src/rules/skill-improvement-trigger.md +2 -3
  170. package/dist/agent-src/rules/skill-quality.md +0 -1
  171. package/dist/agent-src/rules/slash-command-routing-policy.md +0 -1
  172. package/dist/agent-src/rules/source-confidentiality.md +1 -1
  173. package/dist/agent-src/rules/source-discovery-gate.md +0 -1
  174. package/dist/agent-src/rules/source-of-truth.md +0 -1
  175. package/dist/agent-src/rules/spreadsheet-source-quality.md +1 -2
  176. package/dist/agent-src/rules/strategy-safety-floor.md +1 -1
  177. package/dist/agent-src/rules/symfony-routing.md +1 -2
  178. package/dist/agent-src/rules/think-before-action.md +0 -1
  179. package/dist/agent-src/rules/token-budget-discipline.md +12 -46
  180. package/dist/agent-src/rules/token-efficiency.md +0 -1
  181. package/dist/agent-src/rules/token-optimizer-maintenance.md +0 -1
  182. package/dist/agent-src/rules/tool-safety.md +1 -1
  183. package/dist/agent-src/rules/ui-audit-gate.md +1 -2
  184. package/dist/agent-src/rules/untrusted-input-defense.md +1 -1
  185. package/dist/agent-src/rules/upstream-proposal.md +0 -1
  186. package/dist/agent-src/rules/user-interaction.md +0 -1
  187. package/dist/agent-src/rules/user-interrupt-priority.md +1 -1
  188. package/dist/agent-src/scripts/archive_completed_roadmaps.ts +115 -20
  189. package/dist/agent-src/scripts/deferral_carry.ts +339 -0
  190. package/dist/agent-src/scripts/gate_budget.ts +47 -23
  191. package/dist/agent-src/scripts/gate_execute.ts +12 -4
  192. package/dist/agent-src/scripts/update_roadmap_progress.ts +4 -1
  193. package/dist/agent-src/skills/ai-council/SKILL.md +7 -4
  194. package/dist/agent-src/skills/ai-council/references/cost-and-redaction.md +21 -11
  195. package/dist/agent-src/skills/ai-council/references/procedure.md +12 -6
  196. package/dist/agent-src/skills/analysis-autonomous-mode/SKILL.md +1 -1
  197. package/dist/agent-src/skills/api-design/data/manifest.json +2 -2
  198. package/dist/agent-src/skills/api-testing/SKILL.md +17 -0
  199. package/dist/agent-src/skills/bug-analyzer/SKILL.md +1 -1
  200. package/dist/agent-src/skills/code-intelligence/SKILL.md +14 -2
  201. package/dist/agent-src/skills/command-routing/SKILL.md +3 -4
  202. package/dist/agent-src/skills/conventional-commits-writing/SKILL.md +127 -139
  203. package/dist/agent-src/skills/corpus-grounding/ATTRIBUTION.md +39 -0
  204. package/dist/agent-src/skills/corpus-grounding/SKILL.md +8 -2
  205. package/dist/agent-src/skills/database/data/manifest.json +2 -2
  206. package/dist/agent-src/skills/database/data/query-tuning.csv +13 -13
  207. package/dist/agent-src/skills/design-system-capture/SKILL.md +0 -3
  208. package/dist/agent-src/skills/design-system-capture/references/import-procedure.md +1 -1
  209. package/dist/agent-src/skills/estimate-ticket/SKILL.md +1 -1
  210. package/dist/agent-src/skills/existing-ui-audit/SKILL.md +2 -2
  211. package/dist/agent-src/skills/fe-design/SKILL.md +1 -1
  212. package/dist/agent-src/skills/feature-planning/SKILL.md +1 -1
  213. package/dist/agent-src/skills/git-workflow/SKILL.md +44 -44
  214. package/dist/agent-src/skills/git-workflow/references/branch-update.md +312 -0
  215. package/dist/agent-src/skills/git-workflow/references/commit-subject.md +205 -0
  216. package/dist/agent-src/skills/iconography/SKILL.md +1 -1
  217. package/dist/agent-src/skills/jira-integration/SKILL.md +3 -3
  218. package/dist/agent-src/skills/js-library-packaging/SKILL.md +2 -2
  219. package/dist/agent-src/skills/merge-conflicts/SKILL.md +10 -4
  220. package/dist/agent-src/skills/monorepo-workspace/SKILL.md +1 -1
  221. package/dist/agent-src/skills/po-discovery/SKILL.md +1 -1
  222. package/dist/agent-src/skills/quality-tools/SKILL.md +11 -1
  223. package/dist/agent-src/skills/quality-tools/references/go-tools.md +76 -0
  224. package/dist/agent-src/skills/quality-tools/references/python-tools.md +104 -0
  225. package/dist/agent-src/skills/refine-ticket/SKILL.md +4 -4
  226. package/dist/agent-src/skills/review-routing/SKILL.md +2 -2
  227. package/dist/agent-src/skills/roadmap-writing/SKILL.md +2 -2
  228. package/dist/agent-src/skills/skill-improvement-pipeline/SKILL.md +5 -3
  229. package/dist/agent-src/skills/source-discovery/SKILL.md +1 -1
  230. package/dist/agent-src/skills/storybook-workshop/SKILL.md +3 -3
  231. package/dist/agent-src/skills/tailwind-engineer/SKILL.md +4 -2
  232. package/dist/agent-src/skills/test-case-discovery/SKILL.md +7 -0
  233. package/dist/agent-src/skills/test-driven-development/SKILL.md +17 -0
  234. package/dist/agent-src/skills/test-performance/SKILL.md +19 -1
  235. package/dist/agent-src/skills/testing-anti-patterns/SKILL.md +1 -1
  236. package/dist/agent-src/skills/ui-component-architect/SKILL.md +2 -2
  237. package/dist/agent-src/skills/using-git-worktrees/SKILL.md +1 -1
  238. package/dist/agent-src/skills/verify-repair-loop/SKILL.md +2 -2
  239. package/dist/agent-src/templates/AGENTS.md +1 -1
  240. package/dist/agent-src/templates/agent-settings.md +46 -129
  241. package/dist/agent-src/templates/agents/agent-project-settings.example.yml +3 -3
  242. package/dist/agent-src/templates/command.md +2 -2
  243. package/dist/agent-src/templates/roadmaps.md +6 -1
  244. package/dist/agent-src/templates/scripts/work_engine/_lib/agent_settings.ts +0 -6
  245. package/dist/agent-src/templates/scripts/work_engine/directives/backend/_self_fix.ts +11 -7
  246. package/dist/agent-src/templates/scripts/work_engine/directives/ui/apply.ts +48 -6
  247. package/dist/agent-src/templates/scripts/work_engine/hooks/builtin/decision_trace.ts +3 -2
  248. package/dist/agent-src/templates/scripts/work_engine/hooks/builtin/memory_visibility.ts +2 -1
  249. package/dist/agent-src/templates/scripts/work_engine/hooks/settings.ts +0 -6
  250. package/dist/agent-src/templates/scripts/work_engine/scoring/decision_engine.ts +9 -12
  251. package/dist/agent-src/templates/scripts/work_engine/scoring/memory_visibility.ts +2 -1
  252. package/dist/agent-src/templates/scripts/work_engine/stack/runner.ts +774 -109
  253. package/dist/agent-src/templates/skill.md +1 -1
  254. package/dist/cli/registry.js +2 -1
  255. package/dist/cli-delegate/archive_completed_roadmaps.js +92 -12
  256. package/dist/cli-delegate/check_update_banner.js +207 -120
  257. package/dist/cli-delegate/chunk-523HCFYO.js +90 -0
  258. package/dist/cli-delegate/{chunk-FP36SWJD.js → chunk-5GPULQBE.js} +2797 -338
  259. package/dist/cli-delegate/{chunk-IGD6ERX6.js → chunk-6SRJTYJS.js} +42 -176
  260. package/dist/cli-delegate/chunk-6V5FMA3P.js +186 -0
  261. package/dist/cli-delegate/{chunk-M2DPGFZ4.js → chunk-6V6TA25H.js} +22 -152
  262. package/dist/cli-delegate/chunk-6YQC2HLF.js +415 -0
  263. package/dist/cli-delegate/{chunk-E4XIZDIB.js → chunk-7HKRE54K.js} +1 -64
  264. package/dist/cli-delegate/chunk-7IQE3D5S.js +191 -0
  265. package/dist/cli-delegate/{chunk-YJ72UIAK.js → chunk-AED2VQGM.js} +1245 -249
  266. package/dist/cli-delegate/{chunk-7HQ52DHU.js → chunk-AL3RZ22D.js} +1 -1
  267. package/dist/cli-delegate/chunk-DEIV7XP7.js +108 -0
  268. package/dist/cli-delegate/{chunk-DBH4AHDK.js → chunk-ED7KCMLB.js} +9 -11
  269. package/dist/cli-delegate/chunk-F3QDG2GT.js +2569 -0
  270. package/dist/cli-delegate/{chunk-6KFEC3G7.js → chunk-G5VVIZRC.js} +3 -3
  271. package/dist/cli-delegate/{chunk-FC75PGJE.js → chunk-H76PHZBI.js} +149 -61
  272. package/dist/cli-delegate/chunk-IAYTIIQW.js +67 -0
  273. package/dist/cli-delegate/chunk-JQOM7TTM.js +1201 -0
  274. package/dist/cli-delegate/chunk-KB5FZ655.js +208 -0
  275. package/dist/cli-delegate/{chunk-7RQP4UDH.js → chunk-KR6EM23A.js} +235 -1455
  276. package/dist/cli-delegate/{chunk-LTYVIY76.js → chunk-KXXWJTDO.js} +6 -11
  277. package/dist/cli-delegate/{chunk-T7L2QK3K.js → chunk-LQOCRFWT.js} +1 -1
  278. package/dist/cli-delegate/{chunk-6KM6ORRY.js → chunk-MDPPKQCQ.js} +58 -9
  279. package/dist/cli-delegate/{chunk-4XFP2Y3E.js → chunk-MSUL5NYP.js} +5 -5
  280. package/dist/cli-delegate/chunk-OAFSJBHH.js +272 -0
  281. package/dist/cli-delegate/{chunk-4E2W63DA.js → chunk-OKJUIAPS.js} +62 -1
  282. package/dist/cli-delegate/{chunk-QAJS5YWY.js → chunk-PHD7OOLE.js} +2 -1
  283. package/dist/cli-delegate/{chunk-P6ZHP5W2.js → chunk-PWX7CKMD.js} +4 -4
  284. package/dist/cli-delegate/{chunk-NDJLNC6Q.js → chunk-T6BP34WI.js} +1 -0
  285. package/dist/cli-delegate/{chunk-7XGBX6ZH.js → chunk-T7XSJSUQ.js} +1144 -589
  286. package/dist/cli-delegate/chunk-ULQRUR23.js +208 -0
  287. package/dist/cli-delegate/chunk-WQWXGIWB.js +1779 -0
  288. package/dist/cli-delegate/{chunk-RGNIWTEA.js → chunk-XQTPXKFA.js} +1 -1
  289. package/dist/cli-delegate/{chunk-NUHLI2RX.js → chunk-YCU3TIXH.js} +2 -0
  290. package/dist/cli-delegate/chunk-ZBZV2G5R.js +210 -0
  291. package/dist/cli-delegate/{chunk-WGXTVKCQ.js → chunk-ZUZKZYCN.js} +5 -3
  292. package/dist/cli-delegate/cmd_analyze_session.js +223 -43
  293. package/dist/cli-delegate/cmd_brand_status.js +3 -2
  294. package/dist/cli-delegate/cmd_conformance.js +1252 -249
  295. package/dist/cli-delegate/cmd_converge.js +3 -3
  296. package/dist/cli-delegate/cmd_doctor.js +19 -9
  297. package/dist/cli-delegate/cmd_doctor_neighbours.js +30 -0
  298. package/dist/cli-delegate/cmd_explain.js +45 -21
  299. package/dist/cli-delegate/cmd_export.js +13 -10
  300. package/dist/cli-delegate/cmd_fleet.js +3 -3
  301. package/dist/cli-delegate/cmd_git_convention.js +1851 -0
  302. package/dist/cli-delegate/cmd_handoff.js +44 -22
  303. package/dist/cli-delegate/cmd_mcp_available.js +3 -2
  304. package/dist/cli-delegate/cmd_memory_get.js +3 -1
  305. package/dist/cli-delegate/cmd_migrate.js +3 -3
  306. package/dist/cli-delegate/cmd_packs_active.js +5 -4
  307. package/dist/cli-delegate/cmd_preflight.js +6 -6
  308. package/dist/cli-delegate/cmd_prune.js +14 -11
  309. package/dist/cli-delegate/cmd_refresh.js +2 -1
  310. package/dist/cli-delegate/cmd_route_audit.js +10 -8
  311. package/dist/cli-delegate/cmd_route_explain.js +4 -4
  312. package/dist/cli-delegate/cmd_session_recycle.js +10 -7
  313. package/dist/cli-delegate/cmd_settings_check.js +54 -7
  314. package/dist/cli-delegate/cmd_settings_get.js +18 -8
  315. package/dist/cli-delegate/cmd_settings_migrate.js +13 -10
  316. package/dist/cli-delegate/cmd_settings_set.js +4 -4
  317. package/dist/cli-delegate/cmd_sync.js +14 -11
  318. package/dist/cli-delegate/cmd_uninstall.js +15 -12
  319. package/dist/cli-delegate/cmd_update.js +7 -7
  320. package/dist/cli-delegate/cmd_upgrade.js +9 -8
  321. package/dist/cli-delegate/cmd_validate.js +15 -12
  322. package/dist/cli-delegate/cmd_versions.js +5 -5
  323. package/dist/cli-delegate/deferral_carry.js +16 -0
  324. package/dist/cli-delegate/gate_budget.js +1 -1
  325. package/dist/cli-delegate/gate_execute.js +3 -3
  326. package/dist/cli-delegate/roadmap_gates.js +6 -6
  327. package/dist/cli-delegate/update_roadmap_progress.js +1 -1
  328. package/dist/discovery/deprecation-report.md +1 -1
  329. package/dist/discovery/discovery-manifest.json +232 -141
  330. package/dist/discovery/discovery-manifest.json.sha256 +1 -1
  331. package/dist/discovery/discovery-manifest.summary.md +3 -3
  332. package/dist/discovery/dormancy-report.md +1 -1
  333. package/dist/discovery/orphan-report.md +1 -1
  334. package/dist/discovery/packs.json +26 -9
  335. package/dist/discovery/trust-report.md +3 -3
  336. package/dist/discovery/workspaces.json +7 -4
  337. package/dist/hooks/dispatch.js +5655 -6623
  338. package/dist/hooks/dispatch.sha256 +1 -1
  339. package/dist/install/claudePathsPlan.js +47 -6
  340. package/dist/install/claudeRuleRewrite.js +7 -0
  341. package/dist/install/emit_host_rules_cli.js +39 -36
  342. package/dist/install/globalRuleScope.js +87 -0
  343. package/dist/install/host_rule_ownership.js +160 -0
  344. package/dist/install/install.mjs +2336 -1249
  345. package/dist/install/installThinLayer.js +289 -0
  346. package/dist/install/installedRuleLinks.js +262 -0
  347. package/dist/install/wizard-plan.js +24 -0
  348. package/dist/mcp/awesome-mcp-servers.row.md +1 -1
  349. package/dist/mcp/mcp-cloudflare-catalogue.json +2 -2
  350. package/dist/mcp/registry-manifest.json +5 -5
  351. package/dist/mcp/server.json +2 -2
  352. package/dist/mcp/server.mjs +36504 -30986
  353. package/dist/router.json +1 -1
  354. package/dist/scripts/_lib/agent_settings.js +26 -120
  355. package/dist/scripts/_lib/claude_settings_hooks.js +10 -8
  356. package/dist/scripts/_lib/compile_time_toggles.js +12 -21
  357. package/dist/scripts/_lib/git_convention.js +232 -0
  358. package/dist/scripts/_lib/global_deploy_inventory.js +730 -0
  359. package/dist/scripts/_lib/installed_layer.js +704 -0
  360. package/dist/scripts/_lib/lean_projection_mode.js +218 -15
  361. package/dist/scripts/_lib/package_root.js +68 -0
  362. package/dist/scripts/_lib/rule_consequence_class.js +45 -0
  363. package/dist/scripts/_lib/rule_injection.js +67 -10
  364. package/dist/scripts/_lib/rule_law_section.js +122 -0
  365. package/dist/scripts/_lib/settings_removed_keys.js +168 -0
  366. package/dist/scripts/_lib/thin_rules.js +535 -0
  367. package/dist/scripts/_lib/windsurf_render.js +60 -0
  368. package/dist/scripts/condense.js +14 -26
  369. package/dist/scripts/project_thin_rules.js +14 -294
  370. package/dist/server/app.js +2 -1
  371. package/dist/server/gitKeysGate.js +105 -0
  372. package/dist/server/routes/settings.js +67 -8
  373. package/dist/server/routes/wizard.js +4 -0
  374. package/dist/server/schemas/settings.js +29 -81
  375. package/dist/shared/skillRanking.js +103 -16
  376. package/dist/ui/assets/{index-Cwq4d0hX.js → index-C3djEJah.js} +2 -2
  377. package/dist/ui/index.html +1 -1
  378. package/docs/MIGRATION.md +72 -1
  379. package/docs/contracts/settings-classes.md +39 -67
  380. package/docs/guidelines/agent-infra/active-remediation-mechanics.md +39 -0
  381. package/docs/guidelines/agent-infra/context-hygiene-mechanics.md +1 -1
  382. package/docs/guidelines/agent-infra/cross-source-consistency-mechanics.md +8 -10
  383. package/docs/guidelines/agent-infra/frontier-reasoning-operating-profile.md +3 -2
  384. package/docs/guidelines/agent-infra/layered-settings.md +13 -1
  385. package/docs/guidelines/agent-infra/roadmap-progress-mechanics.md +1 -1
  386. package/docs/guidelines/agent-infra/self-improvement-pipeline.md +10 -3
  387. package/docs/guidelines/agent-infra/size-and-scope.md +36 -0
  388. package/docs/guidelines/php/git.md +15 -2
  389. package/package.json +1 -1
  390. package/src/agent-src/scripts/archive_completed_roadmaps.ts +115 -20
  391. package/src/agent-src/scripts/deferral_carry.ts +339 -0
  392. package/src/agent-src/scripts/gate_budget.ts +47 -23
  393. package/src/agent-src/scripts/gate_execute.ts +12 -4
  394. package/src/agent-src/scripts/update_roadmap_progress.ts +4 -1
  395. package/src/agent-src/templates/AGENTS.md +1 -1
  396. package/src/agent-src/templates/scripts/work_engine/_lib/agent_settings.ts +0 -6
  397. package/src/agent-src/templates/scripts/work_engine/directives/backend/_self_fix.ts +11 -7
  398. package/src/agent-src/templates/scripts/work_engine/directives/ui/apply.ts +48 -6
  399. package/src/agent-src/templates/scripts/work_engine/hooks/builtin/decision_trace.ts +3 -2
  400. package/src/agent-src/templates/scripts/work_engine/hooks/builtin/memory_visibility.ts +2 -1
  401. package/src/agent-src/templates/scripts/work_engine/hooks/settings.ts +0 -6
  402. package/src/agent-src/templates/scripts/work_engine/scoring/decision_engine.ts +9 -12
  403. package/src/agent-src/templates/scripts/work_engine/scoring/memory_visibility.ts +2 -1
  404. package/src/agent-src/templates/scripts/work_engine/stack/runner.ts +774 -109
  405. package/src/config/agent-settings.template.yml +141 -334
  406. package/src/config/agents-paths.yml +16 -0
  407. package/src/config/assurance-capability-registry.json +7 -3
  408. package/src/config/ci-local-parity.yml +3 -0
  409. package/src/config/continuity-surface.json +10 -3
  410. package/src/config/discovery/packs.yml +17 -1
  411. package/src/config/evaluator-budgets.json +23 -10
  412. package/src/config/gate-coverage.yml +138 -3
  413. package/src/config/gate-violation-baselines.json +64 -16
  414. package/src/config/gitignore-block.txt +19 -0
  415. package/src/config/hook-bundle-budget.json +25 -0
  416. package/src/config/hook-token-budget.json +6 -1
  417. package/src/config/host-instruction-limits.json +33 -0
  418. package/src/config/release-gate-locality.yml +2 -1
  419. package/src/config/routing-coverage-seed.json +67 -4
  420. package/src/config/rule-activation-census.json +7 -3
  421. package/src/config/rule-consequence-class.json +161 -0
  422. package/src/config/rule-law-ceilings.json +105 -0
  423. package/src/config/rule-obligations.json +833 -0
  424. package/src/install/claudePathsPlan.ts +46 -4
  425. package/src/install/claudeRuleRewrite.ts +10 -1
  426. package/src/install/emit_host_rules_cli.ts +43 -34
  427. package/src/install/globalRuleScope.ts +109 -0
  428. package/src/install/host_rule_ownership.ts +170 -0
  429. package/src/install/installThinLayer.ts +378 -0
  430. package/src/install/installedRuleLinks.ts +308 -0
  431. package/src/install/wizard-plan.ts +24 -0
  432. package/src/scripts/_cli/cmd_analyze_session.ts +9 -15
  433. package/src/scripts/_cli/cmd_conformance.ts +13 -2
  434. package/src/scripts/_cli/cmd_doctor.ts +33 -81
  435. package/src/scripts/_cli/cmd_doctor_neighbours.ts +426 -0
  436. package/src/scripts/_cli/cmd_explain.ts +72 -14
  437. package/src/scripts/_cli/cmd_git_convention.ts +637 -0
  438. package/src/scripts/_cli/cmd_settings_check.ts +66 -8
  439. package/src/scripts/_cli/cmd_settings_get.ts +18 -3
  440. package/src/scripts/_cli/doctor_execution.ts +72 -1
  441. package/src/scripts/_dispatch.bash +53 -4
  442. package/src/scripts/_lib/agent_settings.ts +26 -124
  443. package/src/scripts/_lib/blocked_by_marker.ts +1 -1
  444. package/src/scripts/_lib/claude_settings_hooks.ts +10 -8
  445. package/src/scripts/_lib/compile_time_toggles.ts +12 -21
  446. package/src/scripts/_lib/dispatch_import_closure.ts +163 -0
  447. package/src/scripts/_lib/estate_offsets.ts +241 -0
  448. package/src/scripts/_lib/exemption_shape.ts +143 -0
  449. package/src/scripts/_lib/fnv.ts +23 -0
  450. package/src/scripts/_lib/foreign_scan.ts +106 -0
  451. package/src/scripts/_lib/git_base_ref.ts +92 -0
  452. package/src/scripts/_lib/git_convention.ts +291 -0
  453. package/src/scripts/_lib/git_convention_carrier.ts +389 -0
  454. package/src/scripts/_lib/git_convention_grammar.ts +246 -0
  455. package/src/scripts/_lib/git_convention_measure.ts +344 -0
  456. package/src/scripts/_lib/gitignore_block.ts +314 -0
  457. package/src/scripts/_lib/global_deploy_inventory.ts +106 -0
  458. package/src/scripts/_lib/graph_feeder_record.ts +437 -0
  459. package/src/scripts/_lib/hook_settings.ts +73 -0
  460. package/src/scripts/_lib/host_capability.ts +40 -19
  461. package/src/scripts/_lib/host_hook_merge.ts +165 -0
  462. package/src/scripts/_lib/installed_layer.ts +963 -0
  463. package/src/scripts/_lib/json_merge.ts +82 -0
  464. package/src/scripts/_lib/json_pointers.ts +93 -11
  465. package/src/scripts/_lib/knowledge_global.ts +14 -1
  466. package/src/scripts/_lib/lean_projection_mode.ts +275 -15
  467. package/src/scripts/_lib/machine_wake.ts +16 -3
  468. package/src/scripts/_lib/module_reach.ts +456 -0
  469. package/src/scripts/_lib/neighbour_census.ts +760 -0
  470. package/src/scripts/_lib/neighbour_contradictions.ts +236 -0
  471. package/src/scripts/_lib/neighbour_scan.ts +122 -0
  472. package/src/scripts/_lib/neighbour_tool_use.ts +187 -0
  473. package/src/scripts/_lib/prompt_shape.ts +46 -0
  474. package/src/scripts/_lib/ratification_artifact.ts +220 -1
  475. package/src/scripts/_lib/ratification_subject.ts +92 -0
  476. package/src/scripts/_lib/release_findings_ingest.ts +15 -7
  477. package/src/scripts/_lib/release_highlights.ts +5 -0
  478. package/src/scripts/_lib/release_migration_gate.ts +19 -3
  479. package/src/scripts/_lib/reserved_name_sweep.ts +73 -0
  480. package/src/scripts/_lib/review_coverage.ts +134 -0
  481. package/src/scripts/_lib/rule_consequence_class.ts +71 -0
  482. package/src/scripts/_lib/rule_injection.ts +130 -10
  483. package/src/scripts/_lib/rule_law_section.ts +147 -0
  484. package/src/scripts/_lib/rule_layer_overlap.ts +58 -0
  485. package/src/scripts/_lib/rule_obligations.ts +205 -0
  486. package/src/scripts/_lib/self_repair.ts +1 -1
  487. package/src/scripts/_lib/settings_removed_keys.ts +173 -0
  488. package/src/scripts/_lib/skill_origin.ts +254 -0
  489. package/src/scripts/_lib/structured_ask.ts +64 -21
  490. package/src/scripts/_lib/test_red_state.ts +5 -0
  491. package/src/scripts/_lib/thin_rules.ts +620 -0
  492. package/src/scripts/_lib/touched_file_quality.ts +570 -0
  493. package/src/scripts/_lib/turn_end_refusals.ts +77 -2
  494. package/src/scripts/_lib/windsurf_render.ts +63 -0
  495. package/src/scripts/_lib/worker_budget.ts +1 -1
  496. package/src/scripts/adr/regenerate_index.ts +16 -1
  497. package/src/scripts/ai_council/cli_call_budget.ts +13 -5
  498. package/src/scripts/ai_council/clients.ts +26 -57
  499. package/src/scripts/ai_council/config.ts +8 -8
  500. package/src/scripts/ai_council/modification_review.ts +100 -0
  501. package/src/scripts/ai_council/modification_review_questions.ts +90 -0
  502. package/src/scripts/ai_council/orchestrator.ts +5 -5
  503. package/src/scripts/ai_council/spend_gate.ts +18 -7
  504. package/src/scripts/ai_council/vendor_defaults.ts +45 -0
  505. package/src/scripts/ai_team/config.ts +11 -16
  506. package/src/scripts/audit_skill_overlap.ts +261 -0
  507. package/src/scripts/audit_user_type_axis.ts +20 -8
  508. package/src/scripts/before_complete_hook.ts +243 -12
  509. package/src/scripts/bench_ab_clone.ts +1 -2
  510. package/src/scripts/bench_concern_spawn_path.ts +129 -0
  511. package/src/scripts/bench_graph_feeder_latency.ts +584 -0
  512. package/src/scripts/bench_touched_file_quality.ts +238 -0
  513. package/src/scripts/check_agent_artifact_location.ts +36 -0
  514. package/src/scripts/check_branch_freshness.ts +147 -24
  515. package/src/scripts/check_enforcement_coverage.ts +130 -0
  516. package/src/scripts/check_enforcement_matrix.ts +377 -20
  517. package/src/scripts/check_estate_count.ts +130 -153
  518. package/src/scripts/check_evaluator_budgets.ts +4 -0
  519. package/src/scripts/check_finding_dispositions.ts +196 -21
  520. package/src/scripts/check_gate_coverage.ts +4 -3
  521. package/src/scripts/check_gate_reachability.ts +48 -1
  522. package/src/scripts/check_generator_sync.ts +48 -0
  523. package/src/scripts/check_hook_bundle_composition.ts +477 -0
  524. package/src/scripts/check_kernel_edit_ratified.ts +132 -14
  525. package/src/scripts/check_memory.ts +7 -1
  526. package/src/scripts/check_pack_size.ts +1 -1
  527. package/src/scripts/check_release_highlights.ts +10 -0
  528. package/src/scripts/check_release_manifest_content.ts +189 -0
  529. package/src/scripts/check_release_pr_shape.ts +38 -15
  530. package/src/scripts/check_standing_rule_delivery.ts +129 -13
  531. package/src/scripts/check_suppression_hygiene.ts +2 -5
  532. package/src/scripts/check_verify_expectation_delta.ts +521 -0
  533. package/src/scripts/ci_settle.ts +42 -5
  534. package/src/scripts/classify_merge_risk.ts +320 -0
  535. package/src/scripts/closure_scan.ts +91 -1
  536. package/src/scripts/code_graph/detect.ts +127 -7
  537. package/src/scripts/code_graph/foreign.ts +194 -0
  538. package/src/scripts/code_graph/query.ts +217 -4
  539. package/src/scripts/code_graph/types.ts +26 -2
  540. package/src/scripts/code_graph/validate.ts +3 -1
  541. package/src/scripts/code_graph/verbs.ts +103 -0
  542. package/src/scripts/command_suggester/settings.ts +8 -108
  543. package/src/scripts/command_suggester/types.ts +4 -5
  544. package/src/scripts/compile_hook_manifest.ts +33 -1
  545. package/src/scripts/condense.ts +14 -27
  546. package/src/scripts/consumer_matrix.ts +102 -0
  547. package/src/scripts/context_hygiene_hook.ts +13 -23
  548. package/src/scripts/cost/preflight.mjs +12 -1
  549. package/src/scripts/council_cli.ts +7 -7
  550. package/src/scripts/dispatch_r2_reviewer.ts +24 -11
  551. package/src/scripts/estate_exemption_shape.ts +202 -0
  552. package/src/scripts/explain_run.ts +8 -13
  553. package/src/scripts/generate_git_convention_grammar.ts +127 -0
  554. package/src/scripts/generate_host_cost_table.ts +21 -4
  555. package/src/scripts/handoff_context_hook.ts +86 -37
  556. package/src/scripts/hook_manifest.json +1 -1
  557. package/src/scripts/hook_manifest.yaml +175 -15
  558. package/src/scripts/hooks/block_config_weakening.ts +115 -7
  559. package/src/scripts/hooks/block_plumbing_writes.ts +37 -5
  560. package/src/scripts/hooks/code_graph_context_hook.ts +252 -23
  561. package/src/scripts/hooks/concern_failure_policy.ts +280 -0
  562. package/src/scripts/hooks/concern_registry.ts +2 -0
  563. package/src/scripts/hooks/delegation_nudge_hook.ts +2 -3
  564. package/src/scripts/hooks/dispatch_hook.ts +52 -52
  565. package/src/scripts/hooks/evidence_independence.ts +12 -4
  566. package/src/scripts/hooks/exit_codes.ts +2 -1
  567. package/src/scripts/hooks/host_lowering.json +1 -1
  568. package/src/scripts/hooks/host_lowering.ts +19 -1
  569. package/src/scripts/hooks/mcp_usage_observation_hook.ts +121 -0
  570. package/src/scripts/hooks/one_question_per_ask_hook.ts +41 -25
  571. package/src/scripts/hooks/payload_stub.ts +10 -1
  572. package/src/scripts/hooks/push_settle_hook.ts +4 -3
  573. package/src/scripts/hooks/rule_inject_hook.ts +795 -60
  574. package/src/scripts/hooks/state_io.ts +8 -4
  575. package/src/scripts/hooks/table_fingerprint.ts +21 -0
  576. package/src/scripts/hooks/telemetry_usage_hook.ts +24 -7
  577. package/src/scripts/hooks/turn_end_gate_hook.ts +85 -0
  578. package/src/scripts/hooks_status.ts +112 -0
  579. package/src/scripts/injection_scan_hook.ts +7 -0
  580. package/src/scripts/install-hooks.sh +42 -14
  581. package/src/scripts/install.ts +78 -215
  582. package/src/scripts/installed_layer_report.ts +103 -0
  583. package/src/scripts/language_mirror_hook.ts +15 -6
  584. package/src/scripts/learning_sidecar.ts +119 -8
  585. package/src/scripts/lint_blocker_citations.ts +198 -0
  586. package/src/scripts/lint_evidence_artifacts.ts +9 -0
  587. package/src/scripts/lint_hook_concern_budget.ts +10 -21
  588. package/src/scripts/lint_hook_manifest.ts +53 -0
  589. package/src/scripts/lint_major_migration_sections.ts +156 -26
  590. package/src/scripts/lint_pack_boundaries.ts +465 -29
  591. package/src/scripts/lint_roadmap_blockers.ts +282 -29
  592. package/src/scripts/lint_roadmap_complexity.ts +4 -2
  593. package/src/scripts/lint_rule_law_section.ts +647 -0
  594. package/src/scripts/lint_rule_skill_pack_reach.ts +17 -0
  595. package/src/scripts/lint_settings_classes.ts +1 -1
  596. package/src/scripts/lint_ticked_unmet_criteria.ts +165 -0
  597. package/src/scripts/lint_workflow_security.ts +173 -6
  598. package/src/scripts/mcp_server/consumer_tool_catalog.json +53 -0
  599. package/src/scripts/mcp_server/graph_tools.ts +72 -3
  600. package/src/scripts/measure_routing_signal.ts +54 -16
  601. package/src/scripts/measure_skill_ranker_baseline.ts +221 -8
  602. package/src/scripts/memory_learn_hook.ts +91 -6
  603. package/src/scripts/model_rule_injection.ts +55 -8
  604. package/src/scripts/onboarding_gate_hook.ts +7 -6
  605. package/src/scripts/print_required_checks.ts +15 -3
  606. package/src/scripts/probe_host_compliance.ts +33 -5
  607. package/src/scripts/probe_turnaround.ts +183 -3
  608. package/src/scripts/project_thin_rules.ts +34 -327
  609. package/src/scripts/ratification_header.ts +77 -0
  610. package/src/scripts/refusal_envelope.ts +138 -0
  611. package/src/scripts/release_publication.ts +29 -3
  612. package/src/scripts/report_dispatch_import_closure.ts +76 -0
  613. package/src/scripts/report_evidence_temperature.ts +657 -0
  614. package/src/scripts/report_installed_rule_links.ts +274 -0
  615. package/src/scripts/report_label_agreement.ts +233 -0
  616. package/src/scripts/report_module_reach.ts +212 -0
  617. package/src/scripts/report_obligation_mechanism.ts +228 -0
  618. package/src/scripts/report_parked_blockers.ts +222 -0
  619. package/src/scripts/report_required_checks_drift.ts +196 -0
  620. package/src/scripts/report_single_token_triggers.ts +277 -0
  621. package/src/scripts/report_skill_ranker_confusion.ts +543 -0
  622. package/src/scripts/report_standing_payload_by_host.ts +188 -15
  623. package/src/scripts/report_verification_record_coverage.ts +306 -0
  624. package/src/scripts/routing_doctor.ts +2 -2
  625. package/src/scripts/rule_activation_census.ts +5 -2
  626. package/src/scripts/rule_trigger_eval.ts +9 -9
  627. package/src/scripts/schemas/agent-settings.schema.json +17 -31
  628. package/src/scripts/schemas/command.schema.json +1 -1
  629. package/src/scripts/schemas/review-findings.schema.json +3 -2
  630. package/src/scripts/schemas/rule.schema.json +5 -0
  631. package/src/scripts/schemas/skill.schema.json +1 -1
  632. package/src/scripts/self_review_gate.ts +101 -9
  633. package/src/scripts/skill_tools/score_skill_relevance.ts +314 -40
  634. package/src/scripts/sweep_skill_ranker_signals.ts +129 -0
  635. package/src/scripts/sync_gitignore.ts +29 -235
  636. package/src/scripts/sync_pr_branch.ts +403 -132
  637. package/src/scripts/trigger_eval_grandfather.json +0 -21
  638. package/src/server/schemas/settings.ts +42 -176
  639. package/src/shared/skillRanking.ts +169 -14
  640. package/dist/cli-delegate/chunk-5R7HOLAF.js +0 -99
  641. package/dist/cli-delegate/chunk-JNMVLWLR.js +0 -4457
  642. package/dist/cli-delegate/chunk-YDPILCOL.js +0 -152
  643. package/src/scripts/_lib/config_chain.ts +0 -477
  644. package/src/scripts/_lib/conformance_report.ts +0 -403
  645. package/src/scripts/_lib/eval_discrimination.ts +0 -95
  646. package/src/scripts/_lib/evaluator_promotion.ts +0 -225
  647. package/src/scripts/_lib/file_slicer.ts +0 -117
  648. package/src/scripts/_lib/legacy_boundary_map.ts +0 -228
  649. package/src/scripts/_lib/minimality_tiebreak.ts +0 -168
  650. package/src/scripts/_lib/overbuild_lens_contract.ts +0 -196
  651. package/src/scripts/_lib/role_split.ts +0 -338
@@ -1,20 +1,64 @@
1
1
  /**
2
- * `lean_projection.mode` — ONE definition of what the three modes mean.
3
- *
4
- * The projector (`condense.ts`) resolves the value with a real YAML parse; the
5
- * delivery concern (`hooks/rule_inject_hook.ts`) resolves it with an
6
- * indentation-shaped read, because a hook must never fail a tool call because a
7
- * parser could not load. Two readers is unavoidable. Two *normalisations* is
8
- * not, and would be the defect worth preventing: a projector that writes thin
9
- * files while the concern believes the mode is off delivers pointers and no
10
- * bodies, which is exactly the 36.2 % arm the delivery mode exists to replace.
11
- *
12
- * So each side supplies the raw string from its own reader and this module
13
- * decides what it means. Anything unrecognised — absent key, typo, `null`,
14
- * a non-string — is `eager-all`: the parser fallback, which is NOT the value
15
- * the template ships (see the type below), because a mode nobody can spell
16
- * must never silently thin the standing corpus.
2
+ * `lean_projection.mode` — ONE definition of what the three modes mean, and
3
+ * since step 1.2 of `road-to-a-rule-carrier-that-works-outside-the-repo`, ONE
4
+ * reader that produces it.
5
+ *
6
+ * ── What this module used to be, and why that was not enough ──
7
+ *
8
+ * It owned the NORMALISATION and left each caller its own READER: the projector
9
+ * (`condense.ts`) resolved the value with a real YAML parse over the full
10
+ * settings cascade; the delivery concern (`hooks/rule_inject_hook.ts`) resolved
11
+ * it with an indentation-shaped read of `<cwd>/.agent-settings.yml` alone. The
12
+ * header argued that two readers were unavoidable and that two *normalisations*
13
+ * were the only thing worth preventing.
14
+ *
15
+ * Measured on 2026-10-02, that split was not a stylistic difference — it was a
16
+ * disagreement about WHICH FILE. The installer writes settings to
17
+ * `<root>/agents/settings/.agent-settings.yml` (`agent_settings.ts`'s canonical
18
+ * write target; `install.ts:4108`). The concern read `<root>/.agent-settings.yml`,
19
+ * the LEGACY location, and nothing else. On a normal install the concern
20
+ * therefore read a file that does not exist, got `''`, normalised it to
21
+ * `eager-all`, and closed its own gate — while the projector, reading the
22
+ * canonical file, had written thin stubs. That is the pointer arm the delivery
23
+ * mode exists to replace, reached by configuration rather than by choice, and
24
+ * it is a SECOND independent cause of the silence step 1.1 repaired: a consumer
25
+ * that fixed the package root alone would still have received nothing.
26
+ *
27
+ * The user-global layer was invisible to the concern for the same reason, which
28
+ * matters more than it sounds: ADR-020 installs are global-only, so for those
29
+ * consumers the ONLY layer carrying a mode is one the concern never opened.
30
+ *
31
+ * ── D3: one resolver, not a parity test between three ──
32
+ *
33
+ * The roadmap's D3 records the choice and the reason — a parity test keeps
34
+ * three readers that can drift again, and this module already existed to be the
35
+ * one. `resolveLeanProjection` below is that resolver. It reads the layers in
36
+ * the order `load_agent_settings` defines (template base, user-global,
37
+ * project), through `project_settings_path`, which prefers the canonical file
38
+ * and falls back to the legacy one, so a hand-edited root file still works.
39
+ *
40
+ * ── Why the template path is passed in rather than resolved ──
41
+ *
42
+ * `agent_settings.default_template_path()` derives the package root from
43
+ * `import.meta.url` three directories up. That is correct for a module at
44
+ * `<pkg>/src/scripts/_lib/`; inside the composed hook bundle `import.meta.url`
45
+ * is `<pkg>/dist/hooks/dispatch.js`, so the same arithmetic yields the PARENT
46
+ * of the package and the template read misses. Verified in the built bundle,
47
+ * not inferred. With no template the base layer is `{}` and an unconfigured
48
+ * consumer resolves to `eager-all` — the silence again, one layer lower. So a
49
+ * caller that knows the real package root (the carrier does: the dispatcher
50
+ * passes it) hands it over, and the resolver reads the template from there.
51
+ *
52
+ * ── What has NOT changed ──
53
+ *
54
+ * Anything unrecognised — absent key, typo, `null`, a non-string — is still
55
+ * `eager-all`: the parser fallback, which is NOT the value the template ships
56
+ * (see the type below), because a mode nobody can spell must never silently
57
+ * thin the standing corpus. That fallback now fires only when no layer carried
58
+ * a value at all, rather than whenever the concern looked in the wrong place.
17
59
  */
60
+ import * as path from 'node:path';
61
+ import { load_agent_settings } from './agent_settings.js';
18
62
  export const DEFAULT_LEAN_PROJECTION_MODE = 'eager-all';
19
63
  /** Map a raw settings value onto a mode. Unrecognised → `eager-all`. */
20
64
  export function normalizeLeanProjectionMode(raw) {
@@ -146,4 +190,163 @@ export function describeDroppedHosts(res) {
146
190
  export function thinsHost(mode, hosts, hostId) {
147
191
  return writesThinFiles(mode) && hosts.includes(hostId);
148
192
  }
193
+ /**
194
+ * THE resolver. Every surface that asks "which delivery mode" calls this.
195
+ *
196
+ * Tolerant like everything else on a hook path: `load_agent_settings` answers
197
+ * with defaults on an unreadable or malformed file and never throws, and the
198
+ * normalisers above turn anything unrecognised into the safe value. A caller
199
+ * on a hot path pays ONE cascade read per prompt; `modeExplicit` is a lazy
200
+ * getter, so the second, template-isolated read happens only for a caller that
201
+ * actually reads provenance — which today is the installer and nothing else.
202
+ */
203
+ export function resolveLeanProjection(opts = {}) {
204
+ // The LEGACY root path, deliberately, and not `project_settings_path`'s
205
+ // either-or pick. `load_agent_settings` expands whatever it is given into
206
+ // `[the file, <its dir>/agents/settings/.agent-settings.yml, <its dir>/
207
+ // agents/settings/.agent-settings.local.yml]` and merges them deepest-wins,
208
+ // so handing it the root path reads BOTH the legacy and the canonical file
209
+ // — which is strictly more than picking one, and is what a tree carrying
210
+ // both should resolve to. It also keeps one export out of this module's
211
+ // import list, which is runtime bytes in the composed hook bundle.
212
+ const file = opts.settingsPath ?? path.join(opts.projectRoot ?? process.cwd(), '.agent-settings.yml');
213
+ const tpl = opts.packageRoot == null
214
+ ? null
215
+ : path.join(opts.packageRoot, 'src', 'config', 'agent-settings.template.yml');
216
+ let lean;
217
+ try {
218
+ lean = load_agent_settings(tpl === null ? { project_path: file } : { project_path: file, template_path: tpl })['lean_projection'];
219
+ }
220
+ catch {
221
+ /* a settings layer nothing can read must never fail a turn */
222
+ }
223
+ const obj = typeof lean === 'object' && lean !== null && !Array.isArray(lean) ? lean : {};
224
+ const o = obj;
225
+ return {
226
+ mode: normalizeLeanProjectionMode(o['mode'] ?? ''),
227
+ hosts: resolveLeanProjectionHosts(o['hosts']),
228
+ // LAZY, and the hot path is the reason. Provenance needs a SECOND,
229
+ // template-isolated cascade, and only the installer reads it — the
230
+ // delivery concern on `user_prompt_submit` destructures `{ mode, hosts }`
231
+ // and discards this field, so computing it eagerly doubled the per-prompt
232
+ // settings read for an answer nobody asked for. A getter keeps the
233
+ // field's shape (`readonly modeExplicit: boolean`) and charges only the
234
+ // caller that touches it.
235
+ get modeExplicit() {
236
+ return rawExplicitLeanProjectionMode(opts) !== '';
237
+ },
238
+ };
239
+ }
240
+ /**
241
+ * A path no tree contains, so `template_defaults` contributes nothing.
242
+ *
243
+ * This is the mechanism `load_agent_settings` documents for the purpose —
244
+ * "a test or tool that pins every other input can pin the defaults base too,
245
+ * and point it at a nonexistent file to isolate the cascade" — used here for a
246
+ * tool rather than a test. It is a reserved device filename on every platform
247
+ * this package runs on and is never created, so the read fails and the loader's
248
+ * own tolerance turns it into `{}`.
249
+ *
250
+ * The alternative — re-reading the YAML layers by hand — was rejected because
251
+ * it would be a SECOND reader of the same key, which is the precise defect step
252
+ * 1.2 of the carrier roadmap existed to remove. Isolating the base keeps one
253
+ * reader and changes only which layers it is given.
254
+ */
255
+ const NO_TEMPLATE_LAYER = path.join(path.sep, 'dev', 'null', 'agent-config-absent-template.yml');
256
+ /**
257
+ * The RAW `lean_projection.mode` string from the user-controlled layers only,
258
+ * or `''` when no such layer carries it.
259
+ *
260
+ * Raw and un-normalised on purpose: {@link normalizeLeanProjectionMode} maps
261
+ * everything unrecognised — `''` included — onto `eager-all`, so a normalised
262
+ * answer cannot tell "the user chose eager-all" from "the user chose nothing".
263
+ * Provenance needs exactly that distinction, so it has to be read before the
264
+ * normaliser runs.
265
+ */
266
+ export function rawExplicitLeanProjectionMode(opts = {}) {
267
+ const file = opts.settingsPath ?? path.join(opts.projectRoot ?? process.cwd(), '.agent-settings.yml');
268
+ let lean;
269
+ try {
270
+ lean = load_agent_settings({ project_path: file, template_path: NO_TEMPLATE_LAYER })['lean_projection'];
271
+ }
272
+ catch {
273
+ return ''; // a layer nothing can read states no preference
274
+ }
275
+ if (typeof lean !== 'object' || lean === null || Array.isArray(lean))
276
+ return '';
277
+ const m = lean['mode'];
278
+ return typeof m === 'string' ? m.trim() : '';
279
+ }
280
+ /**
281
+ * Did a human ask for this mode, and is it the one the caller is gated on?
282
+ *
283
+ * The question an installer actually has. `modeExplicit` alone is not enough —
284
+ * a consumer who explicitly set `eager-all` has set the key explicitly and must
285
+ * NOT be thinned — so the two conditions are folded here rather than left to
286
+ * every caller to remember to combine.
287
+ */
288
+ export function leanProjectionModeChosen(mode, opts = {}) {
289
+ const raw = rawExplicitLeanProjectionMode(opts);
290
+ return raw !== '' && normalizeLeanProjectionMode(raw) === mode;
291
+ }
292
+ /**
293
+ * May the INSTALLER thin this host's rule tree?
294
+ *
295
+ * The host-aware sibling of {@link leanProjectionModeChosen}, and the predicate
296
+ * `road-to-an-installed-layer-that-is-thinned` step 1.1 keys on. It folds the
297
+ * three conditions that must hold together, once, so no caller has to remember
298
+ * to combine them:
299
+ *
300
+ * 1. **A human asked.** `modeExplicit` — false whenever the only layer carrying
301
+ * the key is the shipped template, which already says `delivery`. Reading the
302
+ * template as consent would thin every consumer's `~/.claude/rules` as a side
303
+ * effect of wiring a reader, which is the owner-reserved default flip (that
304
+ * roadmap's blocker, decision D4).
305
+ * 2. **The chosen mode actually writes stubs.** A consumer who explicitly chose
306
+ * `eager-all` has set the key and must NOT be thinned on the strength of
307
+ * having an opinion.
308
+ * 3. **This host is in scope.** The same `hosts:` list the projector honours, so
309
+ * installer and projector cannot disagree about which trees are thinned.
310
+ *
311
+ * ONE `resolveLeanProjection` call, which is why this is not two
312
+ * {@link leanProjectionModeChosen} calls: that one answers "is the chosen mode
313
+ * exactly X" and knows nothing about `hosts`, so a caller combining it with a
314
+ * host check by hand would re-create the fold this function exists to own.
315
+ *
316
+ * That is one CALL and two cascade READS here, because reading `modeExplicit`
317
+ * triggers its lazy getter and a second, template-isolated load. The installer
318
+ * runs once per deploy and does not care; the cost is named rather than rounded
319
+ * down because the same resolver serves the per-prompt delivery concern, which
320
+ * does NOT read provenance and therefore does not pay it.
321
+ */
322
+ export function installerThinsHost(hostId, opts = {}) {
323
+ const { mode, hosts, modeExplicit } = resolveLeanProjection({
324
+ ...opts,
325
+ settingsPath: opts.settingsPath ?? NO_PROJECT_LAYER,
326
+ });
327
+ return modeExplicit && thinsHost(mode, hosts.hosts, hostId);
328
+ }
329
+ /**
330
+ * A path no tree contains, so the PROJECT cascade contributes nothing.
331
+ *
332
+ * The same device {@link NO_TEMPLATE_LAYER} uses, pointed at the other end of
333
+ * the cascade, and the reason is scope rather than isolation: the thing
334
+ * {@link installerThinsHost} gates is a mutation of `~/.claude/rules`, which
335
+ * belongs to the MACHINE. A per-checkout value must not decide it, in either
336
+ * direction — a project saying `delivery` would thin the layer every other
337
+ * project on that machine reads, and a project saying `eager-all` would
338
+ * suppress an opt-in the user wrote user-globally, because the project cascade
339
+ * merges last and wins.
340
+ *
341
+ * `load_agent_settings` reads `user_global_settings_paths()` regardless of what
342
+ * `project_path` it is given, so pointing the project layer at nothing leaves
343
+ * exactly the machine-global layers — which is the scope the installer's
344
+ * sibling `_resolve_global_rule_scope` already resolves for the same deploy.
345
+ * A caller may still pass an explicit `settingsPath` (tests pin one). A
346
+ * `projectRoot` handed to {@link installerThinsHost} is DISCARDED — the `??`
347
+ * chain terminates at `settingsPath` before `projectRoot` is consulted — which
348
+ * is the intended behaviour and is stated here because a caller passing it and
349
+ * expecting it honoured would otherwise get no signal.
350
+ */
351
+ const NO_PROJECT_LAYER = path.join(path.sep, 'dev', 'null', 'agent-config-absent-project-settings.yml');
149
352
  //# sourceMappingURL=lean_projection_mode.js.map
@@ -0,0 +1,68 @@
1
+ /**
2
+ * Layout-independent package-root resolution for the `_cli` delegate commands.
3
+ *
4
+ * `src/scripts/_cli/*.ts` sits three levels below the package root, so every
5
+ * delegate command derived the root with three hard-coded parent hops. Then the
6
+ * delegate precompile (`fa51c5a54`) started bundling those same modules into
7
+ * `dist/cli-delegate/*.js` — **two** levels below the root. Fixed hop counts are
8
+ * correct in exactly one of the two layouts, and nothing failed loudly: three
9
+ * hops from the bundle lands on `<pkg>/..`, which for a scoped install is
10
+ * `node_modules/@event4u`. `conformance` then reported `dist/router.json` and
11
+ * `src/scripts/hook_manifest.yaml` as missing — files that ship fine — and the
12
+ * 9.11.0 release PR's `tarball E2E` went red on both Node majors.
13
+ *
14
+ * The fix is to stop counting hops. Anchor on the marker that actually defines
15
+ * the root: the `package.json` whose `name` is this package. That answer holds
16
+ * for the source tree, for any bundle depth, for npm-global, npx, and
17
+ * vendor/bin symlink invocations — and it keeps holding if either directory
18
+ * ever moves.
19
+ */
20
+ import * as fs from 'node:fs';
21
+ import * as path from 'node:path';
22
+ import { fileURLToPath } from 'node:url';
23
+ /** `name` in this package's own package.json — the root marker. */
24
+ export const PACKAGE_NAME = '@event4u/agent-config';
25
+ /**
26
+ * Bound on the upward walk. Deep enough for any real install path, finite so a
27
+ * malformed start value can never spin.
28
+ */
29
+ const MAX_ASCENT = 16;
30
+ /**
31
+ * Absolute package root for the module at `fromUrlOrPath` (pass
32
+ * `import.meta.url`).
33
+ *
34
+ * Walks up looking for the package.json whose `name` is {@link PACKAGE_NAME}.
35
+ * A consumer's own package.json encountered on the way is skipped by that name
36
+ * check, so an install nested under another project resolves correctly.
37
+ *
38
+ * `legacyHops` is the pre-existing hop count for the *source* layout and is
39
+ * used only if no marker is found. Falling back beats throwing during CLI
40
+ * startup: a wrong path yields one actionable "missing file" message, while an
41
+ * exception takes down every command in the delegate.
42
+ */
43
+ export function resolvePackageRoot(fromUrlOrPath, legacyHops = 3) {
44
+ const start = fromUrlOrPath.startsWith('file:') ? fileURLToPath(fromUrlOrPath) : fromUrlOrPath;
45
+ const startDir = path.dirname(start);
46
+ let dir = startDir;
47
+ for (let i = 0; i < MAX_ASCENT; i++) {
48
+ const manifest = path.join(dir, 'package.json');
49
+ if (fs.existsSync(manifest)) {
50
+ try {
51
+ const parsed = JSON.parse(fs.readFileSync(manifest, 'utf8'));
52
+ if (parsed.name === PACKAGE_NAME) {
53
+ return dir;
54
+ }
55
+ }
56
+ catch {
57
+ // Unreadable / unparseable manifest — not our marker; keep ascending.
58
+ }
59
+ }
60
+ const parent = path.dirname(dir);
61
+ if (parent === dir) {
62
+ break; // filesystem root
63
+ }
64
+ dir = parent;
65
+ }
66
+ return path.resolve(startDir, ...Array.from({ length: legacyHops }, () => '..'));
67
+ }
68
+ //# sourceMappingURL=package_root.js.map
@@ -0,0 +1,45 @@
1
+ /**
2
+ * The high-consequence rule class — one reader for the config, the projector
3
+ * and the test.
4
+ *
5
+ * The criterion itself is prose and lives where an author meets it: the
6
+ * `consequence_class` property of `src/scripts/schemas/rule.schema.json`. This
7
+ * module does not restate it. It reads the list the criterion produced
8
+ * (`src/config/rule-consequence-class.json`), joins it to what each rule file
9
+ * actually declares, and answers the one question `project_thin_rules` asks:
10
+ * may this rule's stub carry its own law, and if not, has that been declared?
11
+ *
12
+ * WHY A DECLARED `no_stub` SUBSET RATHER THAN A SHORTER CLASS. A member whose
13
+ * law section is missing or over the ceiling cannot ship as stub-plus-law —
14
+ * there is nothing short enough to copy. Two ways to handle that: drop it from
15
+ * the class, or keep it in the class and record why it cannot stand. Dropping
16
+ * it makes the class shrinkable by NOT writing a law, which is the incentive a
17
+ * criterion must not create. Keeping it leaves the obligation visible and costs
18
+ * only a full-bodied projection, which is what those rules get today anyway.
19
+ */
20
+ import * as fs from 'node:fs';
21
+ import * as path from 'node:path';
22
+ export const CLASS_CONFIG_REL = 'src/config/rule-consequence-class.json';
23
+ export const CLAUSES = ['irreversible-external', 'security-boundary', 'authority-bypass'];
24
+ export function readConsequenceClass(repoRoot) {
25
+ const raw = JSON.parse(fs.readFileSync(path.join(repoRoot, CLASS_CONFIG_REL), 'utf-8'));
26
+ return {
27
+ criterion_ref: raw.criterion_ref ?? '',
28
+ members: raw.members ?? {},
29
+ no_stub: raw.no_stub ?? {},
30
+ excluded: raw.excluded ?? {},
31
+ };
32
+ }
33
+ /** Ids whose stub carries their law — members minus the declared `no_stub` set. */
34
+ export function stubLawIds(cfg) {
35
+ return new Set(Object.keys(cfg.members).filter((id) => cfg.no_stub[id] === undefined));
36
+ }
37
+ /** The `consequence_class:` value a rule file declares, or `null`. */
38
+ export function declaredClause(ruleText) {
39
+ const m = /^consequence_class:\s*"?([a-z-]+)"?\s*$/m.exec(ruleText);
40
+ if (m === null)
41
+ return null;
42
+ const v = m[1];
43
+ return CLAUSES.includes(v) ? v : null;
44
+ }
45
+ //# sourceMappingURL=rule_consequence_class.js.map
@@ -55,8 +55,51 @@ import * as path from 'node:path';
55
55
  import { match_prompt } from './router_match.js';
56
56
  /** Kinds of trigger a prompt alone can never fire. */
57
57
  export const PATH_TRIGGER_KINDS = ['path_prefix', 'file_pattern'];
58
+ /**
59
+ * Set by `dispatch_hook` to its own resolved package root. Read here rather
60
+ * than threaded through every caller — see `ruleSourceDirs`.
61
+ */
62
+ export const PACKAGE_ROOT_ENV = 'AGENT_CONFIG_PACKAGE_ROOT';
63
+ function statKind(p) {
64
+ try {
65
+ const s = fs.statSync(p);
66
+ return s.isDirectory() ? 'dir' : s.isFile() ? 'file' : null;
67
+ }
68
+ catch {
69
+ return null;
70
+ }
71
+ }
72
+ /** Resolve the body dirs, the router and the gap wording in ONE filesystem pass. */
73
+ export function ruleSources(repoRoot) {
74
+ const env = (process.env[PACKAGE_ROOT_ENV] ?? '').trim();
75
+ const pkg = env ? path.resolve(env) : null;
76
+ const dirs = [];
77
+ const add = (d) => {
78
+ if (statKind(d) === 'dir' && !dirs.includes(d))
79
+ dirs.push(d);
80
+ };
81
+ add(path.join(repoRoot, 'agents', 'overrides'));
82
+ add(path.join(repoRoot, 'dist', 'agent-src', 'rules'));
83
+ if (pkg !== null)
84
+ add(path.join(pkg, 'dist', 'agent-src', 'rules'));
85
+ const local = path.join(repoRoot, 'dist', 'router.json');
86
+ let router = statKind(local) === 'file' ? local : null;
87
+ if (router === null && pkg !== null) {
88
+ const shipped = path.join(pkg, 'dist', 'router.json');
89
+ if (statKind(shipped) === 'file')
90
+ router = shipped;
91
+ }
92
+ let gap = null;
93
+ if (router === null || dirs.length === 0) {
94
+ const miss = pkg === null
95
+ ? `${PACKAGE_ROOT_ENV} unset`
96
+ : `no ${router === null ? 'dist/router.json' : 'dist/agent-src/rules'} under ${repoRoot} or ${pkg}`;
97
+ gap = `rule-inject: no rule source — ${miss}`;
98
+ }
99
+ return { dirs, pkg, router, gap };
100
+ }
58
101
  export function loadRouter(repoRoot) {
59
- const p = path.join(repoRoot, 'dist', 'router.json');
102
+ const p = ruleSources(repoRoot).router ?? path.join(repoRoot, 'dist', 'router.json');
60
103
  return JSON.parse(fs.readFileSync(p, 'utf8'));
61
104
  }
62
105
  /** Kernel rule ids, as declared by the router. */
@@ -137,16 +180,30 @@ export function matchTierRules(router, prompt, openFiles, command) {
137
180
  }
138
181
  return out;
139
182
  }
140
- /** Where the projected body of a rule lives. */
141
- export function ruleBodyPath(repoRoot, id) {
142
- return path.join(repoRoot, 'dist', 'agent-src', 'rules', `${id}.md`);
143
- }
144
- /** The projected body, or `null` when the rule has no projected file. */
183
+ /**
184
+ * The projected body from the highest-precedence tree carrying it, or `null`.
185
+ *
186
+ * `ruleBodyPath` used to sit in front of this and is gone: it returned the
187
+ * single-root path unconditionally, this diff changed its contract to "the
188
+ * first tree that has the file", and nothing outside this module ever called
189
+ * it. An exported helper whose last caller disappeared in the same diff is an
190
+ * own-orphan, and the composed hook bundle charges for it on every dispatch
191
+ * (`src/config/hook-bundle-budget.json`), so it is removed rather than left as
192
+ * a wrapper nobody uses.
193
+ */
145
194
  export function loadRuleBody(repoRoot, id) {
146
- const p = ruleBodyPath(repoRoot, id);
147
- if (!fs.existsSync(p))
148
- return null;
149
- return fs.readFileSync(p, 'utf8');
195
+ for (const dir of ruleSources(repoRoot).dirs) {
196
+ const p = path.join(dir, `${id}.md`);
197
+ if (statKind(p) === 'file') {
198
+ try {
199
+ return fs.readFileSync(p, 'utf8');
200
+ }
201
+ catch {
202
+ return null;
203
+ }
204
+ }
205
+ }
206
+ return null;
150
207
  }
151
208
  /**
152
209
  * UTF-8 byte length — the runtime measure, dependency-free by design.
@@ -0,0 +1,122 @@
1
+ /**
2
+ * One spelling of "a rule's law section" — the unit three gates and one
3
+ * projector all price.
4
+ *
5
+ * A **law section** is a heading whose title matches `\biron\s+laws?\b` plus
6
+ * everything under it up to the next heading of the same or a shallower depth.
7
+ * A rule may carry several (`direct-answers` has three, `no-cheap-questions`
8
+ * six); the rule's law is all of them, joined by a blank line, because each one
9
+ * states an obligation and a stub carrying only the first would ship a rule
10
+ * whose other laws silently vanished.
11
+ *
12
+ * WHY A SHARED MODULE RATHER THAN A REGEX PER CALLER. The projector
13
+ * (`project_thin_rules.ts`) byte-copies this text into a stub and digests it;
14
+ * the lint (`lint_rule_law_section.ts`) holds it under a ceiling. If those two
15
+ * disagreed about where a section ends, the lint would certify a length the
16
+ * projection does not carry — the exact drift `THIN_ENTRY_MARKER`'s own comment
17
+ * argues against one file over.
18
+ *
19
+ * The heading regex is deliberately the SAME one `check_iron_law_prominence.ts`
20
+ * uses, so "has a law section" here and "is an Iron Law heading" there cannot
21
+ * diverge. That gate owns prominence (H2, near the top); this module owns
22
+ * extent and size.
23
+ *
24
+ * WHAT THIS DOES NOT CLAIM. Not that the extracted text IS the rule's obligation. A rule can state its
25
+ * law in bold prose or a bare fence under no heading at all — several of the 35
26
+ * routed rules without a heading match do exactly that. A heading match is a
27
+ * STRUCTURAL property, checkable; "this sentence is the obligation" is not, and
28
+ * `report_obligation_carriers` plus the ids in `src/config/rule-obligations.json` is where
29
+ * that question already lives.
30
+ */
31
+ import * as fs from 'node:fs';
32
+ /** Same literal as `check_iron_law_prominence.ts` — one definition, two readers. */
33
+ export const IRON_LAW_RE = /\biron\s+laws?\b/i;
34
+ const HEADING_RE = /^(#{1,6})\s+(.+?)\s*$/;
35
+ const FENCE_RE = /^\s*```/;
36
+ /** Return `[frontmatter_including_fences, body]`. Empty frontmatter if none. */
37
+ export function splitFrontmatter(text) {
38
+ if (text.startsWith('---\n')) {
39
+ const end = text.indexOf('\n---\n', 4);
40
+ if (end !== -1) {
41
+ return [text.slice(0, end + 5), text.slice(end + 5)];
42
+ }
43
+ }
44
+ return ['', text];
45
+ }
46
+ /**
47
+ * The body a runtime delivery carries: frontmatter removed, HTML comments
48
+ * removed, trimmed.
49
+ *
50
+ * Comments are stripped because they are authoring scaffolding
51
+ * (`<!-- risk-review: … -->`, `<!-- harvest:… -->`, `ref-ignore` markers) that
52
+ * no host renders to a model, so charging a rule for them would price the wrong
53
+ * thing. Frontmatter is excluded for the reason `check_rule_stub_ceiling` gives
54
+ * for the same exclusion: it is the routing surface, and a rule that gains a
55
+ * trigger must not trip a ceiling whose message tells the author to move prose.
56
+ */
57
+ export function ruleBody(text) {
58
+ const [, body] = splitFrontmatter(text);
59
+ return body.replace(/<!--[\s\S]*?-->/g, '').trim();
60
+ }
61
+ /** Every law section in a rule body, in document order. */
62
+ export function lawSections(body) {
63
+ const lines = body.split('\n');
64
+ let inFence = false;
65
+ const headings = [];
66
+ for (let i = 0; i < lines.length; i += 1) {
67
+ const raw = lines[i];
68
+ if (FENCE_RE.test(raw)) {
69
+ inFence = !inFence;
70
+ continue;
71
+ }
72
+ if (inFence)
73
+ continue;
74
+ const m = HEADING_RE.exec(raw);
75
+ if (m)
76
+ headings.push({ i, depth: m[1].length, title: m[2].trim() });
77
+ }
78
+ const out = [];
79
+ for (let k = 0; k < headings.length; k += 1) {
80
+ const h = headings[k];
81
+ if (!IRON_LAW_RE.test(h.title))
82
+ continue;
83
+ let end = lines.length;
84
+ for (let j = k + 1; j < headings.length; j += 1) {
85
+ const n = headings[j];
86
+ if (n.depth <= h.depth) {
87
+ end = n.i;
88
+ break;
89
+ }
90
+ }
91
+ out.push({
92
+ title: h.title,
93
+ depth: h.depth,
94
+ line: h.i + 1,
95
+ text: lines.slice(h.i, end).join('\n').trim(),
96
+ });
97
+ }
98
+ return out;
99
+ }
100
+ /**
101
+ * The rule's law, as one byte string — all sections joined by a blank line.
102
+ * `null` when the rule has none, which is a different answer from `''`.
103
+ */
104
+ export function lawText(body) {
105
+ const sections = lawSections(body);
106
+ if (sections.length === 0)
107
+ return null;
108
+ return sections.map((s) => s.text).join('\n\n');
109
+ }
110
+ /** Measure one rule file. */
111
+ export function measureRuleFile(id, filePath) {
112
+ const body = ruleBody(fs.readFileSync(filePath, 'utf-8'));
113
+ const law = lawText(body);
114
+ return {
115
+ id,
116
+ lawChars: law === null ? 0 : law.length,
117
+ sections: lawSections(body).length,
118
+ bodyChars: body.length,
119
+ law,
120
+ };
121
+ }
122
+ //# sourceMappingURL=rule_law_section.js.map