@event4u/agent-config 16.2.0 → 16.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (651) hide show
  1. package/.augment-plugin/marketplace.json +3 -3
  2. package/.augment-plugin/plugin.json +1 -1
  3. package/.claude-plugin/marketplace.json +1 -1
  4. package/CHANGELOG.md +337 -234
  5. package/README.md +15 -13
  6. package/agents/templates/.ai-council.yml.example +26 -8
  7. package/dist/agent-src/commands/analyze/inbox.md +11 -8
  8. package/dist/agent-src/commands/analyze/roadmap-repos.md +1 -1
  9. package/dist/agent-src/commands/bug/fix.md +17 -2
  10. package/dist/agent-src/commands/bug/investigate.md +1 -1
  11. package/dist/agent-src/commands/commit/in-chunks.md +40 -31
  12. package/dist/agent-src/commands/commit.md +72 -33
  13. package/dist/agent-src/commands/condense.md +2 -8
  14. package/dist/agent-src/commands/council/debate.md +11 -7
  15. package/dist/agent-src/commands/council/default.md +10 -9
  16. package/dist/agent-src/commands/council.md +1 -1
  17. package/dist/agent-src/commands/estimate-ticket.md +1 -1
  18. package/dist/agent-src/commands/feature/explore.md +3 -3
  19. package/dist/agent-src/commands/feature/plan.md +2 -2
  20. package/dist/agent-src/commands/feature/roadmap.md +1 -1
  21. package/dist/agent-src/commands/fix/ci.md +18 -4
  22. package/dist/agent-src/commands/fix/commit-messages.md +48 -23
  23. package/dist/agent-src/commands/fix/pr-comments.md +3 -6
  24. package/dist/agent-src/commands/implement-ticket.md +4 -4
  25. package/dist/agent-src/commands/jira-ticket.md +1 -1
  26. package/dist/agent-src/commands/memory/add.md +4 -16
  27. package/dist/agent-src/commands/memory/load.md +5 -6
  28. package/dist/agent-src/commands/memory/promote.md +3 -16
  29. package/dist/agent-src/commands/mission/upgrade.md +3 -2
  30. package/dist/agent-src/commands/optimize/agents-dir.md +2 -2
  31. package/dist/agent-src/commands/optimize/deep.md +4 -2
  32. package/dist/agent-src/commands/optimize/rtk.md +4 -26
  33. package/dist/agent-src/commands/pr/create/description-only.md +18 -15
  34. package/dist/agent-src/commands/pr/create.md +42 -34
  35. package/dist/agent-src/commands/pr/merge.md +136 -9
  36. package/dist/agent-src/commands/prepare-for-review.md +13 -11
  37. package/dist/agent-src/commands/project/analyze.md +7 -35
  38. package/dist/agent-src/commands/refine-ticket.md +1 -1
  39. package/dist/agent-src/commands/review/changes.md +14 -19
  40. package/dist/agent-src/commands/roadmap/create.md +1 -1
  41. package/dist/agent-src/commands/roadmap/materialize.md +1 -1
  42. package/dist/agent-src/commands/roadmap/next.md +10 -1
  43. package/dist/agent-src/commands/roadmap/process-full.md +56 -42
  44. package/dist/agent-src/commands/roadmap/resolve-blockers.md +411 -0
  45. package/dist/agent-src/commands/roadmap/triage-parked.md +325 -0
  46. package/dist/agent-src/commands/roadmap.md +18 -4
  47. package/dist/agent-src/commands/tests/create.md +17 -3
  48. package/dist/agent-src/commands/tests/execute.md +22 -5
  49. package/dist/agent-src/commands/worktree/create.md +7 -3
  50. package/dist/agent-src/commands/worktree/verify.md +2 -1
  51. package/dist/agent-src/contexts/authority/decision-revisit-gate-enforcement.md +43 -0
  52. package/dist/agent-src/contexts/communication/rules-auto/design-fidelity-enforcement.md +24 -0
  53. package/dist/agent-src/contexts/communication/rules-auto/think-before-action-mechanics.md +5 -3
  54. package/dist/agent-src/contexts/communication/rules-auto/token-efficiency-mechanics.md +7 -9
  55. package/dist/agent-src/contexts/contracts/command-suggestion-flow.md +8 -6
  56. package/dist/agent-src/contexts/contracts/frugality-charter.md +8 -5
  57. package/dist/agent-src/contexts/execution/auto-dispatch-classification.md +7 -7
  58. package/dist/agent-src/contexts/execution/auto-orchestration-activation.md +0 -1
  59. package/dist/agent-src/contexts/execution/evidence-discipline.md +2 -2
  60. package/dist/agent-src/contexts/execution/non-interactive-contract.md +5 -8
  61. package/dist/agent-src/contexts/execution/rdp-gate.md +4 -4
  62. package/dist/agent-src/contexts/execution/roadmap-execution-contract.md +9 -8
  63. package/dist/agent-src/contexts/execution/roadmap-process-loop.md +99 -54
  64. package/dist/agent-src/contexts/execution/session-canary-enforcement-history.md +67 -0
  65. package/dist/agent-src/contexts/execution/subagent-routing.md +8 -8
  66. package/dist/agent-src/contexts/execution/subagent-steering.md +6 -4
  67. package/dist/agent-src/contexts/execution/terminal-states.md +2 -2
  68. package/dist/agent-src/contexts/execution/toolchain-resolver.md +95 -7
  69. package/dist/agent-src/contexts/subagent-configuration.md +1 -1
  70. package/dist/agent-src/guidelines/agent-infra/active-remediation-mechanics.md +39 -0
  71. package/dist/agent-src/guidelines/agent-infra/context-hygiene-mechanics.md +1 -1
  72. package/dist/agent-src/guidelines/agent-infra/cross-source-consistency-mechanics.md +8 -10
  73. package/dist/agent-src/guidelines/agent-infra/frontier-reasoning-operating-profile.md +3 -2
  74. package/dist/agent-src/guidelines/agent-infra/layered-settings.md +13 -1
  75. package/dist/agent-src/guidelines/agent-infra/roadmap-progress-mechanics.md +1 -1
  76. package/dist/agent-src/guidelines/agent-infra/self-improvement-pipeline.md +10 -3
  77. package/dist/agent-src/guidelines/agent-infra/size-and-scope.md +36 -0
  78. package/dist/agent-src/guidelines/php/git.md +15 -2
  79. package/dist/agent-src/rules/active-remediation.md +1 -2
  80. package/dist/agent-src/rules/analysis-skill-routing.md +0 -1
  81. package/dist/agent-src/rules/architecture.md +0 -1
  82. package/dist/agent-src/rules/artifact-drafting-protocol.md +0 -1
  83. package/dist/agent-src/rules/artifact-engagement-recording.md +0 -1
  84. package/dist/agent-src/rules/augment-edit-discipline.md +0 -1
  85. package/dist/agent-src/rules/autonomous-execution.md +1 -1
  86. package/dist/agent-src/rules/brand-consistency.md +0 -1
  87. package/dist/agent-src/rules/brand-source-of-truth.md +0 -1
  88. package/dist/agent-src/rules/broken-access-control.md +1 -1
  89. package/dist/agent-src/rules/cli-output-handling.md +0 -1
  90. package/dist/agent-src/rules/code-comment-discipline.md +0 -1
  91. package/dist/agent-src/rules/code-provenance.md +0 -1
  92. package/dist/agent-src/rules/command-suggestion-policy.md +1 -1
  93. package/dist/agent-src/rules/commit-conventions.md +1 -2
  94. package/dist/agent-src/rules/communication-through-line.md +1 -2
  95. package/dist/agent-src/rules/content-quoting-floor.md +1 -2
  96. package/dist/agent-src/rules/context-hygiene.md +6 -6
  97. package/dist/agent-src/rules/copilot-routing.md +1 -2
  98. package/dist/agent-src/rules/council-availability.md +4 -4
  99. package/dist/agent-src/rules/cross-source-consistency.md +4 -6
  100. package/dist/agent-src/rules/decision-revisit-gate.md +17 -35
  101. package/dist/agent-src/rules/delegation-policy.md +2 -3
  102. package/dist/agent-src/rules/design-fidelity.md +12 -16
  103. package/dist/agent-src/rules/design-review-after-ui-write.md +3 -3
  104. package/dist/agent-src/rules/devcontainer-routing.md +1 -2
  105. package/dist/agent-src/rules/doc-screenshot-hygiene.md +1 -1
  106. package/dist/agent-src/rules/docker-commands.md +0 -1
  107. package/dist/agent-src/rules/domain-adoption-policy.md +0 -1
  108. package/dist/agent-src/rules/domain-safety-disclaimer.md +1 -1
  109. package/dist/agent-src/rules/domain-safety-pii.md +1 -1
  110. package/dist/agent-src/rules/domain-safety-retention.md +1 -1
  111. package/dist/agent-src/rules/downstream-changes.md +0 -1
  112. package/dist/agent-src/rules/engineering-safety-floor.md +1 -1
  113. package/dist/agent-src/rules/evaluator-independence.md +3 -2
  114. package/dist/agent-src/rules/external-code-graph-interop.md +0 -1
  115. package/dist/agent-src/rules/external-reference-deep-dive.md +0 -1
  116. package/dist/agent-src/rules/fast-path-marker-visibility.md +2 -2
  117. package/dist/agent-src/rules/finance-safety-floor.md +1 -1
  118. package/dist/agent-src/rules/fix-what-you-see.md +6 -32
  119. package/dist/agent-src/rules/framework-neutrality-in-generic-skills.md +0 -1
  120. package/dist/agent-src/rules/git-history-discipline.md +2 -2
  121. package/dist/agent-src/rules/guidelines.md +0 -1
  122. package/dist/agent-src/rules/history-discipline.md +0 -1
  123. package/dist/agent-src/rules/icon-consistency.md +0 -1
  124. package/dist/agent-src/rules/image-likeness-and-rights.md +1 -1
  125. package/dist/agent-src/rules/improve-before-implement.md +0 -1
  126. package/dist/agent-src/rules/invite-challenge.md +0 -1
  127. package/dist/agent-src/rules/laravel-routing.md +1 -2
  128. package/dist/agent-src/rules/laravel-translations.md +0 -1
  129. package/dist/agent-src/rules/legal-safety-floor.md +3 -3
  130. package/dist/agent-src/rules/lethal-trifecta-guard.md +1 -1
  131. package/dist/agent-src/rules/linked-projects-onboarding-gate.md +0 -1
  132. package/dist/agent-src/rules/low-impact-corpus-privacy-floor.md +1 -1
  133. package/dist/agent-src/rules/markdown-safe-codeblocks.md +0 -1
  134. package/dist/agent-src/rules/media-governance-routing.md +13 -17
  135. package/dist/agent-src/rules/media-sync-ground-truth.md +0 -1
  136. package/dist/agent-src/rules/minimal-safe-diff.md +0 -1
  137. package/dist/agent-src/rules/missing-skill-recovery.md +0 -1
  138. package/dist/agent-src/rules/missing-tool-handling.md +0 -1
  139. package/dist/agent-src/rules/model-recommendation.md +0 -1
  140. package/dist/agent-src/rules/neighbour-precedence.md +64 -0
  141. package/dist/agent-src/rules/no-attribution-footers.md +0 -1
  142. package/dist/agent-src/rules/no-decorative-emojis-in-git-surfaces.md +0 -1
  143. package/dist/agent-src/rules/no-pr-progress-comments.md +0 -1
  144. package/dist/agent-src/rules/no-roadmap-references.md +0 -1
  145. package/dist/agent-src/rules/notes-first-reasoning.md +0 -1
  146. package/dist/agent-src/rules/onboarding-gate.md +0 -1
  147. package/dist/agent-src/rules/output-discipline.md +0 -1
  148. package/dist/agent-src/rules/package-ci-checks.md +0 -1
  149. package/dist/agent-src/rules/persona-governance.md +4 -5
  150. package/dist/agent-src/rules/php-coding.md +0 -1
  151. package/dist/agent-src/rules/prefer-enums-over-literals.md +0 -1
  152. package/dist/agent-src/rules/preservation-guard.md +0 -1
  153. package/dist/agent-src/rules/provider-lifecycle-discipline.md +3 -4
  154. package/dist/agent-src/rules/question-not-instruction.md +1 -1
  155. package/dist/agent-src/rules/reviewer-awareness.md +0 -1
  156. package/dist/agent-src/rules/roadmap-ci-steps-policy.md +0 -1
  157. package/dist/agent-src/rules/roadmap-progress-sync.md +4 -7
  158. package/dist/agent-src/rules/role-mode-adherence.md +0 -1
  159. package/dist/agent-src/rules/rule-type-governance.md +0 -1
  160. package/dist/agent-src/rules/runtime-safety.md +1 -1
  161. package/dist/agent-src/rules/scale-discipline.md +0 -1
  162. package/dist/agent-src/rules/secret-vcs-guard.md +1 -1
  163. package/dist/agent-src/rules/security-sensitive-stop.md +3 -3
  164. package/dist/agent-src/rules/self-repair-loop.md +0 -1
  165. package/dist/agent-src/rules/senior-engineering-discipline.md +0 -1
  166. package/dist/agent-src/rules/session-canary.md +7 -62
  167. package/dist/agent-src/rules/settings-ask-protocol.md +6 -6
  168. package/dist/agent-src/rules/size-enforcement.md +0 -1
  169. package/dist/agent-src/rules/skill-improvement-trigger.md +2 -3
  170. package/dist/agent-src/rules/skill-quality.md +0 -1
  171. package/dist/agent-src/rules/slash-command-routing-policy.md +0 -1
  172. package/dist/agent-src/rules/source-confidentiality.md +1 -1
  173. package/dist/agent-src/rules/source-discovery-gate.md +0 -1
  174. package/dist/agent-src/rules/source-of-truth.md +0 -1
  175. package/dist/agent-src/rules/spreadsheet-source-quality.md +1 -2
  176. package/dist/agent-src/rules/strategy-safety-floor.md +1 -1
  177. package/dist/agent-src/rules/symfony-routing.md +1 -2
  178. package/dist/agent-src/rules/think-before-action.md +0 -1
  179. package/dist/agent-src/rules/token-budget-discipline.md +12 -46
  180. package/dist/agent-src/rules/token-efficiency.md +0 -1
  181. package/dist/agent-src/rules/token-optimizer-maintenance.md +0 -1
  182. package/dist/agent-src/rules/tool-safety.md +1 -1
  183. package/dist/agent-src/rules/ui-audit-gate.md +1 -2
  184. package/dist/agent-src/rules/untrusted-input-defense.md +1 -1
  185. package/dist/agent-src/rules/upstream-proposal.md +0 -1
  186. package/dist/agent-src/rules/user-interaction.md +0 -1
  187. package/dist/agent-src/rules/user-interrupt-priority.md +1 -1
  188. package/dist/agent-src/scripts/archive_completed_roadmaps.ts +115 -20
  189. package/dist/agent-src/scripts/deferral_carry.ts +339 -0
  190. package/dist/agent-src/scripts/gate_budget.ts +47 -23
  191. package/dist/agent-src/scripts/gate_execute.ts +12 -4
  192. package/dist/agent-src/scripts/update_roadmap_progress.ts +4 -1
  193. package/dist/agent-src/skills/ai-council/SKILL.md +7 -4
  194. package/dist/agent-src/skills/ai-council/references/cost-and-redaction.md +21 -11
  195. package/dist/agent-src/skills/ai-council/references/procedure.md +12 -6
  196. package/dist/agent-src/skills/analysis-autonomous-mode/SKILL.md +1 -1
  197. package/dist/agent-src/skills/api-design/data/manifest.json +2 -2
  198. package/dist/agent-src/skills/api-testing/SKILL.md +17 -0
  199. package/dist/agent-src/skills/bug-analyzer/SKILL.md +1 -1
  200. package/dist/agent-src/skills/code-intelligence/SKILL.md +14 -2
  201. package/dist/agent-src/skills/command-routing/SKILL.md +3 -4
  202. package/dist/agent-src/skills/conventional-commits-writing/SKILL.md +127 -139
  203. package/dist/agent-src/skills/corpus-grounding/ATTRIBUTION.md +39 -0
  204. package/dist/agent-src/skills/corpus-grounding/SKILL.md +8 -2
  205. package/dist/agent-src/skills/database/data/manifest.json +2 -2
  206. package/dist/agent-src/skills/database/data/query-tuning.csv +13 -13
  207. package/dist/agent-src/skills/design-system-capture/SKILL.md +0 -3
  208. package/dist/agent-src/skills/design-system-capture/references/import-procedure.md +1 -1
  209. package/dist/agent-src/skills/estimate-ticket/SKILL.md +1 -1
  210. package/dist/agent-src/skills/existing-ui-audit/SKILL.md +2 -2
  211. package/dist/agent-src/skills/fe-design/SKILL.md +1 -1
  212. package/dist/agent-src/skills/feature-planning/SKILL.md +1 -1
  213. package/dist/agent-src/skills/git-workflow/SKILL.md +44 -44
  214. package/dist/agent-src/skills/git-workflow/references/branch-update.md +312 -0
  215. package/dist/agent-src/skills/git-workflow/references/commit-subject.md +205 -0
  216. package/dist/agent-src/skills/iconography/SKILL.md +1 -1
  217. package/dist/agent-src/skills/jira-integration/SKILL.md +3 -3
  218. package/dist/agent-src/skills/js-library-packaging/SKILL.md +2 -2
  219. package/dist/agent-src/skills/merge-conflicts/SKILL.md +10 -4
  220. package/dist/agent-src/skills/monorepo-workspace/SKILL.md +1 -1
  221. package/dist/agent-src/skills/po-discovery/SKILL.md +1 -1
  222. package/dist/agent-src/skills/quality-tools/SKILL.md +11 -1
  223. package/dist/agent-src/skills/quality-tools/references/go-tools.md +76 -0
  224. package/dist/agent-src/skills/quality-tools/references/python-tools.md +104 -0
  225. package/dist/agent-src/skills/refine-ticket/SKILL.md +4 -4
  226. package/dist/agent-src/skills/review-routing/SKILL.md +2 -2
  227. package/dist/agent-src/skills/roadmap-writing/SKILL.md +2 -2
  228. package/dist/agent-src/skills/skill-improvement-pipeline/SKILL.md +5 -3
  229. package/dist/agent-src/skills/source-discovery/SKILL.md +1 -1
  230. package/dist/agent-src/skills/storybook-workshop/SKILL.md +3 -3
  231. package/dist/agent-src/skills/tailwind-engineer/SKILL.md +4 -2
  232. package/dist/agent-src/skills/test-case-discovery/SKILL.md +7 -0
  233. package/dist/agent-src/skills/test-driven-development/SKILL.md +17 -0
  234. package/dist/agent-src/skills/test-performance/SKILL.md +19 -1
  235. package/dist/agent-src/skills/testing-anti-patterns/SKILL.md +1 -1
  236. package/dist/agent-src/skills/ui-component-architect/SKILL.md +2 -2
  237. package/dist/agent-src/skills/using-git-worktrees/SKILL.md +1 -1
  238. package/dist/agent-src/skills/verify-repair-loop/SKILL.md +2 -2
  239. package/dist/agent-src/templates/AGENTS.md +1 -1
  240. package/dist/agent-src/templates/agent-settings.md +46 -129
  241. package/dist/agent-src/templates/agents/agent-project-settings.example.yml +3 -3
  242. package/dist/agent-src/templates/command.md +2 -2
  243. package/dist/agent-src/templates/roadmaps.md +6 -1
  244. package/dist/agent-src/templates/scripts/work_engine/_lib/agent_settings.ts +0 -6
  245. package/dist/agent-src/templates/scripts/work_engine/directives/backend/_self_fix.ts +11 -7
  246. package/dist/agent-src/templates/scripts/work_engine/directives/ui/apply.ts +48 -6
  247. package/dist/agent-src/templates/scripts/work_engine/hooks/builtin/decision_trace.ts +3 -2
  248. package/dist/agent-src/templates/scripts/work_engine/hooks/builtin/memory_visibility.ts +2 -1
  249. package/dist/agent-src/templates/scripts/work_engine/hooks/settings.ts +0 -6
  250. package/dist/agent-src/templates/scripts/work_engine/scoring/decision_engine.ts +9 -12
  251. package/dist/agent-src/templates/scripts/work_engine/scoring/memory_visibility.ts +2 -1
  252. package/dist/agent-src/templates/scripts/work_engine/stack/runner.ts +774 -109
  253. package/dist/agent-src/templates/skill.md +1 -1
  254. package/dist/cli/registry.js +2 -1
  255. package/dist/cli-delegate/archive_completed_roadmaps.js +92 -12
  256. package/dist/cli-delegate/check_update_banner.js +207 -120
  257. package/dist/cli-delegate/chunk-523HCFYO.js +90 -0
  258. package/dist/cli-delegate/{chunk-FP36SWJD.js → chunk-5GPULQBE.js} +2797 -338
  259. package/dist/cli-delegate/{chunk-IGD6ERX6.js → chunk-6SRJTYJS.js} +42 -176
  260. package/dist/cli-delegate/chunk-6V5FMA3P.js +186 -0
  261. package/dist/cli-delegate/{chunk-M2DPGFZ4.js → chunk-6V6TA25H.js} +22 -152
  262. package/dist/cli-delegate/chunk-6YQC2HLF.js +415 -0
  263. package/dist/cli-delegate/{chunk-E4XIZDIB.js → chunk-7HKRE54K.js} +1 -64
  264. package/dist/cli-delegate/chunk-7IQE3D5S.js +191 -0
  265. package/dist/cli-delegate/{chunk-YJ72UIAK.js → chunk-AED2VQGM.js} +1245 -249
  266. package/dist/cli-delegate/{chunk-7HQ52DHU.js → chunk-AL3RZ22D.js} +1 -1
  267. package/dist/cli-delegate/chunk-DEIV7XP7.js +108 -0
  268. package/dist/cli-delegate/{chunk-DBH4AHDK.js → chunk-ED7KCMLB.js} +9 -11
  269. package/dist/cli-delegate/chunk-F3QDG2GT.js +2569 -0
  270. package/dist/cli-delegate/{chunk-6KFEC3G7.js → chunk-G5VVIZRC.js} +3 -3
  271. package/dist/cli-delegate/{chunk-FC75PGJE.js → chunk-H76PHZBI.js} +149 -61
  272. package/dist/cli-delegate/chunk-IAYTIIQW.js +67 -0
  273. package/dist/cli-delegate/chunk-JQOM7TTM.js +1201 -0
  274. package/dist/cli-delegate/chunk-KB5FZ655.js +208 -0
  275. package/dist/cli-delegate/{chunk-7RQP4UDH.js → chunk-KR6EM23A.js} +235 -1455
  276. package/dist/cli-delegate/{chunk-LTYVIY76.js → chunk-KXXWJTDO.js} +6 -11
  277. package/dist/cli-delegate/{chunk-T7L2QK3K.js → chunk-LQOCRFWT.js} +1 -1
  278. package/dist/cli-delegate/{chunk-6KM6ORRY.js → chunk-MDPPKQCQ.js} +58 -9
  279. package/dist/cli-delegate/{chunk-4XFP2Y3E.js → chunk-MSUL5NYP.js} +5 -5
  280. package/dist/cli-delegate/chunk-OAFSJBHH.js +272 -0
  281. package/dist/cli-delegate/{chunk-4E2W63DA.js → chunk-OKJUIAPS.js} +62 -1
  282. package/dist/cli-delegate/{chunk-QAJS5YWY.js → chunk-PHD7OOLE.js} +2 -1
  283. package/dist/cli-delegate/{chunk-P6ZHP5W2.js → chunk-PWX7CKMD.js} +4 -4
  284. package/dist/cli-delegate/{chunk-NDJLNC6Q.js → chunk-T6BP34WI.js} +1 -0
  285. package/dist/cli-delegate/{chunk-7XGBX6ZH.js → chunk-T7XSJSUQ.js} +1144 -589
  286. package/dist/cli-delegate/chunk-ULQRUR23.js +208 -0
  287. package/dist/cli-delegate/chunk-WQWXGIWB.js +1779 -0
  288. package/dist/cli-delegate/{chunk-RGNIWTEA.js → chunk-XQTPXKFA.js} +1 -1
  289. package/dist/cli-delegate/{chunk-NUHLI2RX.js → chunk-YCU3TIXH.js} +2 -0
  290. package/dist/cli-delegate/chunk-ZBZV2G5R.js +210 -0
  291. package/dist/cli-delegate/{chunk-WGXTVKCQ.js → chunk-ZUZKZYCN.js} +5 -3
  292. package/dist/cli-delegate/cmd_analyze_session.js +223 -43
  293. package/dist/cli-delegate/cmd_brand_status.js +3 -2
  294. package/dist/cli-delegate/cmd_conformance.js +1252 -249
  295. package/dist/cli-delegate/cmd_converge.js +3 -3
  296. package/dist/cli-delegate/cmd_doctor.js +19 -9
  297. package/dist/cli-delegate/cmd_doctor_neighbours.js +30 -0
  298. package/dist/cli-delegate/cmd_explain.js +45 -21
  299. package/dist/cli-delegate/cmd_export.js +13 -10
  300. package/dist/cli-delegate/cmd_fleet.js +3 -3
  301. package/dist/cli-delegate/cmd_git_convention.js +1851 -0
  302. package/dist/cli-delegate/cmd_handoff.js +44 -22
  303. package/dist/cli-delegate/cmd_mcp_available.js +3 -2
  304. package/dist/cli-delegate/cmd_memory_get.js +3 -1
  305. package/dist/cli-delegate/cmd_migrate.js +3 -3
  306. package/dist/cli-delegate/cmd_packs_active.js +5 -4
  307. package/dist/cli-delegate/cmd_preflight.js +6 -6
  308. package/dist/cli-delegate/cmd_prune.js +14 -11
  309. package/dist/cli-delegate/cmd_refresh.js +2 -1
  310. package/dist/cli-delegate/cmd_route_audit.js +10 -8
  311. package/dist/cli-delegate/cmd_route_explain.js +4 -4
  312. package/dist/cli-delegate/cmd_session_recycle.js +10 -7
  313. package/dist/cli-delegate/cmd_settings_check.js +54 -7
  314. package/dist/cli-delegate/cmd_settings_get.js +18 -8
  315. package/dist/cli-delegate/cmd_settings_migrate.js +13 -10
  316. package/dist/cli-delegate/cmd_settings_set.js +4 -4
  317. package/dist/cli-delegate/cmd_sync.js +14 -11
  318. package/dist/cli-delegate/cmd_uninstall.js +15 -12
  319. package/dist/cli-delegate/cmd_update.js +7 -7
  320. package/dist/cli-delegate/cmd_upgrade.js +9 -8
  321. package/dist/cli-delegate/cmd_validate.js +15 -12
  322. package/dist/cli-delegate/cmd_versions.js +5 -5
  323. package/dist/cli-delegate/deferral_carry.js +16 -0
  324. package/dist/cli-delegate/gate_budget.js +1 -1
  325. package/dist/cli-delegate/gate_execute.js +3 -3
  326. package/dist/cli-delegate/roadmap_gates.js +6 -6
  327. package/dist/cli-delegate/update_roadmap_progress.js +1 -1
  328. package/dist/discovery/deprecation-report.md +1 -1
  329. package/dist/discovery/discovery-manifest.json +232 -141
  330. package/dist/discovery/discovery-manifest.json.sha256 +1 -1
  331. package/dist/discovery/discovery-manifest.summary.md +3 -3
  332. package/dist/discovery/dormancy-report.md +1 -1
  333. package/dist/discovery/orphan-report.md +1 -1
  334. package/dist/discovery/packs.json +26 -9
  335. package/dist/discovery/trust-report.md +3 -3
  336. package/dist/discovery/workspaces.json +7 -4
  337. package/dist/hooks/dispatch.js +5655 -6623
  338. package/dist/hooks/dispatch.sha256 +1 -1
  339. package/dist/install/claudePathsPlan.js +47 -6
  340. package/dist/install/claudeRuleRewrite.js +7 -0
  341. package/dist/install/emit_host_rules_cli.js +39 -36
  342. package/dist/install/globalRuleScope.js +87 -0
  343. package/dist/install/host_rule_ownership.js +160 -0
  344. package/dist/install/install.mjs +2336 -1249
  345. package/dist/install/installThinLayer.js +289 -0
  346. package/dist/install/installedRuleLinks.js +262 -0
  347. package/dist/install/wizard-plan.js +24 -0
  348. package/dist/mcp/awesome-mcp-servers.row.md +1 -1
  349. package/dist/mcp/mcp-cloudflare-catalogue.json +2 -2
  350. package/dist/mcp/registry-manifest.json +5 -5
  351. package/dist/mcp/server.json +2 -2
  352. package/dist/mcp/server.mjs +36504 -30986
  353. package/dist/router.json +1 -1
  354. package/dist/scripts/_lib/agent_settings.js +26 -120
  355. package/dist/scripts/_lib/claude_settings_hooks.js +10 -8
  356. package/dist/scripts/_lib/compile_time_toggles.js +12 -21
  357. package/dist/scripts/_lib/git_convention.js +232 -0
  358. package/dist/scripts/_lib/global_deploy_inventory.js +730 -0
  359. package/dist/scripts/_lib/installed_layer.js +704 -0
  360. package/dist/scripts/_lib/lean_projection_mode.js +218 -15
  361. package/dist/scripts/_lib/package_root.js +68 -0
  362. package/dist/scripts/_lib/rule_consequence_class.js +45 -0
  363. package/dist/scripts/_lib/rule_injection.js +67 -10
  364. package/dist/scripts/_lib/rule_law_section.js +122 -0
  365. package/dist/scripts/_lib/settings_removed_keys.js +168 -0
  366. package/dist/scripts/_lib/thin_rules.js +535 -0
  367. package/dist/scripts/_lib/windsurf_render.js +60 -0
  368. package/dist/scripts/condense.js +14 -26
  369. package/dist/scripts/project_thin_rules.js +14 -294
  370. package/dist/server/app.js +2 -1
  371. package/dist/server/gitKeysGate.js +105 -0
  372. package/dist/server/routes/settings.js +67 -8
  373. package/dist/server/routes/wizard.js +4 -0
  374. package/dist/server/schemas/settings.js +29 -81
  375. package/dist/shared/skillRanking.js +103 -16
  376. package/dist/ui/assets/{index-Cwq4d0hX.js → index-C3djEJah.js} +2 -2
  377. package/dist/ui/index.html +1 -1
  378. package/docs/MIGRATION.md +72 -1
  379. package/docs/contracts/settings-classes.md +39 -67
  380. package/docs/guidelines/agent-infra/active-remediation-mechanics.md +39 -0
  381. package/docs/guidelines/agent-infra/context-hygiene-mechanics.md +1 -1
  382. package/docs/guidelines/agent-infra/cross-source-consistency-mechanics.md +8 -10
  383. package/docs/guidelines/agent-infra/frontier-reasoning-operating-profile.md +3 -2
  384. package/docs/guidelines/agent-infra/layered-settings.md +13 -1
  385. package/docs/guidelines/agent-infra/roadmap-progress-mechanics.md +1 -1
  386. package/docs/guidelines/agent-infra/self-improvement-pipeline.md +10 -3
  387. package/docs/guidelines/agent-infra/size-and-scope.md +36 -0
  388. package/docs/guidelines/php/git.md +15 -2
  389. package/package.json +1 -1
  390. package/src/agent-src/scripts/archive_completed_roadmaps.ts +115 -20
  391. package/src/agent-src/scripts/deferral_carry.ts +339 -0
  392. package/src/agent-src/scripts/gate_budget.ts +47 -23
  393. package/src/agent-src/scripts/gate_execute.ts +12 -4
  394. package/src/agent-src/scripts/update_roadmap_progress.ts +4 -1
  395. package/src/agent-src/templates/AGENTS.md +1 -1
  396. package/src/agent-src/templates/scripts/work_engine/_lib/agent_settings.ts +0 -6
  397. package/src/agent-src/templates/scripts/work_engine/directives/backend/_self_fix.ts +11 -7
  398. package/src/agent-src/templates/scripts/work_engine/directives/ui/apply.ts +48 -6
  399. package/src/agent-src/templates/scripts/work_engine/hooks/builtin/decision_trace.ts +3 -2
  400. package/src/agent-src/templates/scripts/work_engine/hooks/builtin/memory_visibility.ts +2 -1
  401. package/src/agent-src/templates/scripts/work_engine/hooks/settings.ts +0 -6
  402. package/src/agent-src/templates/scripts/work_engine/scoring/decision_engine.ts +9 -12
  403. package/src/agent-src/templates/scripts/work_engine/scoring/memory_visibility.ts +2 -1
  404. package/src/agent-src/templates/scripts/work_engine/stack/runner.ts +774 -109
  405. package/src/config/agent-settings.template.yml +141 -334
  406. package/src/config/agents-paths.yml +16 -0
  407. package/src/config/assurance-capability-registry.json +7 -3
  408. package/src/config/ci-local-parity.yml +3 -0
  409. package/src/config/continuity-surface.json +10 -3
  410. package/src/config/discovery/packs.yml +17 -1
  411. package/src/config/evaluator-budgets.json +23 -10
  412. package/src/config/gate-coverage.yml +138 -3
  413. package/src/config/gate-violation-baselines.json +64 -16
  414. package/src/config/gitignore-block.txt +19 -0
  415. package/src/config/hook-bundle-budget.json +25 -0
  416. package/src/config/hook-token-budget.json +6 -1
  417. package/src/config/host-instruction-limits.json +33 -0
  418. package/src/config/release-gate-locality.yml +2 -1
  419. package/src/config/routing-coverage-seed.json +67 -4
  420. package/src/config/rule-activation-census.json +7 -3
  421. package/src/config/rule-consequence-class.json +161 -0
  422. package/src/config/rule-law-ceilings.json +105 -0
  423. package/src/config/rule-obligations.json +833 -0
  424. package/src/install/claudePathsPlan.ts +46 -4
  425. package/src/install/claudeRuleRewrite.ts +10 -1
  426. package/src/install/emit_host_rules_cli.ts +43 -34
  427. package/src/install/globalRuleScope.ts +109 -0
  428. package/src/install/host_rule_ownership.ts +170 -0
  429. package/src/install/installThinLayer.ts +378 -0
  430. package/src/install/installedRuleLinks.ts +308 -0
  431. package/src/install/wizard-plan.ts +24 -0
  432. package/src/scripts/_cli/cmd_analyze_session.ts +9 -15
  433. package/src/scripts/_cli/cmd_conformance.ts +13 -2
  434. package/src/scripts/_cli/cmd_doctor.ts +33 -81
  435. package/src/scripts/_cli/cmd_doctor_neighbours.ts +426 -0
  436. package/src/scripts/_cli/cmd_explain.ts +72 -14
  437. package/src/scripts/_cli/cmd_git_convention.ts +637 -0
  438. package/src/scripts/_cli/cmd_settings_check.ts +66 -8
  439. package/src/scripts/_cli/cmd_settings_get.ts +18 -3
  440. package/src/scripts/_cli/doctor_execution.ts +72 -1
  441. package/src/scripts/_dispatch.bash +53 -4
  442. package/src/scripts/_lib/agent_settings.ts +26 -124
  443. package/src/scripts/_lib/blocked_by_marker.ts +1 -1
  444. package/src/scripts/_lib/claude_settings_hooks.ts +10 -8
  445. package/src/scripts/_lib/compile_time_toggles.ts +12 -21
  446. package/src/scripts/_lib/dispatch_import_closure.ts +163 -0
  447. package/src/scripts/_lib/estate_offsets.ts +241 -0
  448. package/src/scripts/_lib/exemption_shape.ts +143 -0
  449. package/src/scripts/_lib/fnv.ts +23 -0
  450. package/src/scripts/_lib/foreign_scan.ts +106 -0
  451. package/src/scripts/_lib/git_base_ref.ts +92 -0
  452. package/src/scripts/_lib/git_convention.ts +291 -0
  453. package/src/scripts/_lib/git_convention_carrier.ts +389 -0
  454. package/src/scripts/_lib/git_convention_grammar.ts +246 -0
  455. package/src/scripts/_lib/git_convention_measure.ts +344 -0
  456. package/src/scripts/_lib/gitignore_block.ts +314 -0
  457. package/src/scripts/_lib/global_deploy_inventory.ts +106 -0
  458. package/src/scripts/_lib/graph_feeder_record.ts +437 -0
  459. package/src/scripts/_lib/hook_settings.ts +73 -0
  460. package/src/scripts/_lib/host_capability.ts +40 -19
  461. package/src/scripts/_lib/host_hook_merge.ts +165 -0
  462. package/src/scripts/_lib/installed_layer.ts +963 -0
  463. package/src/scripts/_lib/json_merge.ts +82 -0
  464. package/src/scripts/_lib/json_pointers.ts +93 -11
  465. package/src/scripts/_lib/knowledge_global.ts +14 -1
  466. package/src/scripts/_lib/lean_projection_mode.ts +275 -15
  467. package/src/scripts/_lib/machine_wake.ts +16 -3
  468. package/src/scripts/_lib/module_reach.ts +456 -0
  469. package/src/scripts/_lib/neighbour_census.ts +760 -0
  470. package/src/scripts/_lib/neighbour_contradictions.ts +236 -0
  471. package/src/scripts/_lib/neighbour_scan.ts +122 -0
  472. package/src/scripts/_lib/neighbour_tool_use.ts +187 -0
  473. package/src/scripts/_lib/prompt_shape.ts +46 -0
  474. package/src/scripts/_lib/ratification_artifact.ts +220 -1
  475. package/src/scripts/_lib/ratification_subject.ts +92 -0
  476. package/src/scripts/_lib/release_findings_ingest.ts +15 -7
  477. package/src/scripts/_lib/release_highlights.ts +5 -0
  478. package/src/scripts/_lib/release_migration_gate.ts +19 -3
  479. package/src/scripts/_lib/reserved_name_sweep.ts +73 -0
  480. package/src/scripts/_lib/review_coverage.ts +134 -0
  481. package/src/scripts/_lib/rule_consequence_class.ts +71 -0
  482. package/src/scripts/_lib/rule_injection.ts +130 -10
  483. package/src/scripts/_lib/rule_law_section.ts +147 -0
  484. package/src/scripts/_lib/rule_layer_overlap.ts +58 -0
  485. package/src/scripts/_lib/rule_obligations.ts +205 -0
  486. package/src/scripts/_lib/self_repair.ts +1 -1
  487. package/src/scripts/_lib/settings_removed_keys.ts +173 -0
  488. package/src/scripts/_lib/skill_origin.ts +254 -0
  489. package/src/scripts/_lib/structured_ask.ts +64 -21
  490. package/src/scripts/_lib/test_red_state.ts +5 -0
  491. package/src/scripts/_lib/thin_rules.ts +620 -0
  492. package/src/scripts/_lib/touched_file_quality.ts +570 -0
  493. package/src/scripts/_lib/turn_end_refusals.ts +77 -2
  494. package/src/scripts/_lib/windsurf_render.ts +63 -0
  495. package/src/scripts/_lib/worker_budget.ts +1 -1
  496. package/src/scripts/adr/regenerate_index.ts +16 -1
  497. package/src/scripts/ai_council/cli_call_budget.ts +13 -5
  498. package/src/scripts/ai_council/clients.ts +26 -57
  499. package/src/scripts/ai_council/config.ts +8 -8
  500. package/src/scripts/ai_council/modification_review.ts +100 -0
  501. package/src/scripts/ai_council/modification_review_questions.ts +90 -0
  502. package/src/scripts/ai_council/orchestrator.ts +5 -5
  503. package/src/scripts/ai_council/spend_gate.ts +18 -7
  504. package/src/scripts/ai_council/vendor_defaults.ts +45 -0
  505. package/src/scripts/ai_team/config.ts +11 -16
  506. package/src/scripts/audit_skill_overlap.ts +261 -0
  507. package/src/scripts/audit_user_type_axis.ts +20 -8
  508. package/src/scripts/before_complete_hook.ts +243 -12
  509. package/src/scripts/bench_ab_clone.ts +1 -2
  510. package/src/scripts/bench_concern_spawn_path.ts +129 -0
  511. package/src/scripts/bench_graph_feeder_latency.ts +584 -0
  512. package/src/scripts/bench_touched_file_quality.ts +238 -0
  513. package/src/scripts/check_agent_artifact_location.ts +36 -0
  514. package/src/scripts/check_branch_freshness.ts +147 -24
  515. package/src/scripts/check_enforcement_coverage.ts +130 -0
  516. package/src/scripts/check_enforcement_matrix.ts +377 -20
  517. package/src/scripts/check_estate_count.ts +130 -153
  518. package/src/scripts/check_evaluator_budgets.ts +4 -0
  519. package/src/scripts/check_finding_dispositions.ts +196 -21
  520. package/src/scripts/check_gate_coverage.ts +4 -3
  521. package/src/scripts/check_gate_reachability.ts +48 -1
  522. package/src/scripts/check_generator_sync.ts +48 -0
  523. package/src/scripts/check_hook_bundle_composition.ts +477 -0
  524. package/src/scripts/check_kernel_edit_ratified.ts +132 -14
  525. package/src/scripts/check_memory.ts +7 -1
  526. package/src/scripts/check_pack_size.ts +1 -1
  527. package/src/scripts/check_release_highlights.ts +10 -0
  528. package/src/scripts/check_release_manifest_content.ts +189 -0
  529. package/src/scripts/check_release_pr_shape.ts +38 -15
  530. package/src/scripts/check_standing_rule_delivery.ts +129 -13
  531. package/src/scripts/check_suppression_hygiene.ts +2 -5
  532. package/src/scripts/check_verify_expectation_delta.ts +521 -0
  533. package/src/scripts/ci_settle.ts +42 -5
  534. package/src/scripts/classify_merge_risk.ts +320 -0
  535. package/src/scripts/closure_scan.ts +91 -1
  536. package/src/scripts/code_graph/detect.ts +127 -7
  537. package/src/scripts/code_graph/foreign.ts +194 -0
  538. package/src/scripts/code_graph/query.ts +217 -4
  539. package/src/scripts/code_graph/types.ts +26 -2
  540. package/src/scripts/code_graph/validate.ts +3 -1
  541. package/src/scripts/code_graph/verbs.ts +103 -0
  542. package/src/scripts/command_suggester/settings.ts +8 -108
  543. package/src/scripts/command_suggester/types.ts +4 -5
  544. package/src/scripts/compile_hook_manifest.ts +33 -1
  545. package/src/scripts/condense.ts +14 -27
  546. package/src/scripts/consumer_matrix.ts +102 -0
  547. package/src/scripts/context_hygiene_hook.ts +13 -23
  548. package/src/scripts/cost/preflight.mjs +12 -1
  549. package/src/scripts/council_cli.ts +7 -7
  550. package/src/scripts/dispatch_r2_reviewer.ts +24 -11
  551. package/src/scripts/estate_exemption_shape.ts +202 -0
  552. package/src/scripts/explain_run.ts +8 -13
  553. package/src/scripts/generate_git_convention_grammar.ts +127 -0
  554. package/src/scripts/generate_host_cost_table.ts +21 -4
  555. package/src/scripts/handoff_context_hook.ts +86 -37
  556. package/src/scripts/hook_manifest.json +1 -1
  557. package/src/scripts/hook_manifest.yaml +175 -15
  558. package/src/scripts/hooks/block_config_weakening.ts +115 -7
  559. package/src/scripts/hooks/block_plumbing_writes.ts +37 -5
  560. package/src/scripts/hooks/code_graph_context_hook.ts +252 -23
  561. package/src/scripts/hooks/concern_failure_policy.ts +280 -0
  562. package/src/scripts/hooks/concern_registry.ts +2 -0
  563. package/src/scripts/hooks/delegation_nudge_hook.ts +2 -3
  564. package/src/scripts/hooks/dispatch_hook.ts +52 -52
  565. package/src/scripts/hooks/evidence_independence.ts +12 -4
  566. package/src/scripts/hooks/exit_codes.ts +2 -1
  567. package/src/scripts/hooks/host_lowering.json +1 -1
  568. package/src/scripts/hooks/host_lowering.ts +19 -1
  569. package/src/scripts/hooks/mcp_usage_observation_hook.ts +121 -0
  570. package/src/scripts/hooks/one_question_per_ask_hook.ts +41 -25
  571. package/src/scripts/hooks/payload_stub.ts +10 -1
  572. package/src/scripts/hooks/push_settle_hook.ts +4 -3
  573. package/src/scripts/hooks/rule_inject_hook.ts +795 -60
  574. package/src/scripts/hooks/state_io.ts +8 -4
  575. package/src/scripts/hooks/table_fingerprint.ts +21 -0
  576. package/src/scripts/hooks/telemetry_usage_hook.ts +24 -7
  577. package/src/scripts/hooks/turn_end_gate_hook.ts +85 -0
  578. package/src/scripts/hooks_status.ts +112 -0
  579. package/src/scripts/injection_scan_hook.ts +7 -0
  580. package/src/scripts/install-hooks.sh +42 -14
  581. package/src/scripts/install.ts +78 -215
  582. package/src/scripts/installed_layer_report.ts +103 -0
  583. package/src/scripts/language_mirror_hook.ts +15 -6
  584. package/src/scripts/learning_sidecar.ts +119 -8
  585. package/src/scripts/lint_blocker_citations.ts +198 -0
  586. package/src/scripts/lint_evidence_artifacts.ts +9 -0
  587. package/src/scripts/lint_hook_concern_budget.ts +10 -21
  588. package/src/scripts/lint_hook_manifest.ts +53 -0
  589. package/src/scripts/lint_major_migration_sections.ts +156 -26
  590. package/src/scripts/lint_pack_boundaries.ts +465 -29
  591. package/src/scripts/lint_roadmap_blockers.ts +282 -29
  592. package/src/scripts/lint_roadmap_complexity.ts +4 -2
  593. package/src/scripts/lint_rule_law_section.ts +647 -0
  594. package/src/scripts/lint_rule_skill_pack_reach.ts +17 -0
  595. package/src/scripts/lint_settings_classes.ts +1 -1
  596. package/src/scripts/lint_ticked_unmet_criteria.ts +165 -0
  597. package/src/scripts/lint_workflow_security.ts +173 -6
  598. package/src/scripts/mcp_server/consumer_tool_catalog.json +53 -0
  599. package/src/scripts/mcp_server/graph_tools.ts +72 -3
  600. package/src/scripts/measure_routing_signal.ts +54 -16
  601. package/src/scripts/measure_skill_ranker_baseline.ts +221 -8
  602. package/src/scripts/memory_learn_hook.ts +91 -6
  603. package/src/scripts/model_rule_injection.ts +55 -8
  604. package/src/scripts/onboarding_gate_hook.ts +7 -6
  605. package/src/scripts/print_required_checks.ts +15 -3
  606. package/src/scripts/probe_host_compliance.ts +33 -5
  607. package/src/scripts/probe_turnaround.ts +183 -3
  608. package/src/scripts/project_thin_rules.ts +34 -327
  609. package/src/scripts/ratification_header.ts +77 -0
  610. package/src/scripts/refusal_envelope.ts +138 -0
  611. package/src/scripts/release_publication.ts +29 -3
  612. package/src/scripts/report_dispatch_import_closure.ts +76 -0
  613. package/src/scripts/report_evidence_temperature.ts +657 -0
  614. package/src/scripts/report_installed_rule_links.ts +274 -0
  615. package/src/scripts/report_label_agreement.ts +233 -0
  616. package/src/scripts/report_module_reach.ts +212 -0
  617. package/src/scripts/report_obligation_mechanism.ts +228 -0
  618. package/src/scripts/report_parked_blockers.ts +222 -0
  619. package/src/scripts/report_required_checks_drift.ts +196 -0
  620. package/src/scripts/report_single_token_triggers.ts +277 -0
  621. package/src/scripts/report_skill_ranker_confusion.ts +543 -0
  622. package/src/scripts/report_standing_payload_by_host.ts +188 -15
  623. package/src/scripts/report_verification_record_coverage.ts +306 -0
  624. package/src/scripts/routing_doctor.ts +2 -2
  625. package/src/scripts/rule_activation_census.ts +5 -2
  626. package/src/scripts/rule_trigger_eval.ts +9 -9
  627. package/src/scripts/schemas/agent-settings.schema.json +17 -31
  628. package/src/scripts/schemas/command.schema.json +1 -1
  629. package/src/scripts/schemas/review-findings.schema.json +3 -2
  630. package/src/scripts/schemas/rule.schema.json +5 -0
  631. package/src/scripts/schemas/skill.schema.json +1 -1
  632. package/src/scripts/self_review_gate.ts +101 -9
  633. package/src/scripts/skill_tools/score_skill_relevance.ts +314 -40
  634. package/src/scripts/sweep_skill_ranker_signals.ts +129 -0
  635. package/src/scripts/sync_gitignore.ts +29 -235
  636. package/src/scripts/sync_pr_branch.ts +403 -132
  637. package/src/scripts/trigger_eval_grandfather.json +0 -21
  638. package/src/server/schemas/settings.ts +42 -176
  639. package/src/shared/skillRanking.ts +169 -14
  640. package/dist/cli-delegate/chunk-5R7HOLAF.js +0 -99
  641. package/dist/cli-delegate/chunk-JNMVLWLR.js +0 -4457
  642. package/dist/cli-delegate/chunk-YDPILCOL.js +0 -152
  643. package/src/scripts/_lib/config_chain.ts +0 -477
  644. package/src/scripts/_lib/conformance_report.ts +0 -403
  645. package/src/scripts/_lib/eval_discrimination.ts +0 -95
  646. package/src/scripts/_lib/evaluator_promotion.ts +0 -225
  647. package/src/scripts/_lib/file_slicer.ts +0 -117
  648. package/src/scripts/_lib/legacy_boundary_map.ts +0 -228
  649. package/src/scripts/_lib/minimality_tiebreak.ts +0 -168
  650. package/src/scripts/_lib/overbuild_lens_contract.ts +0 -196
  651. package/src/scripts/_lib/role_split.ts +0 -338
@@ -0,0 +1,535 @@
1
+ /**
2
+ * The thin-projection MECHANISM, with no CLI entry of its own.
3
+ *
4
+ * Extracted from `src/scripts/project_thin_rules.ts` for
5
+ * `road-to-an-installed-layer-that-is-thinned` step 1.1, which needs the
6
+ * INSTALLER to apply the projector's own predicate to `~/.claude/rules`.
7
+ *
8
+ * THE EXTRACTION IS THE POINT, NOT TIDYING. `src/scripts/install.ts` is the
9
+ * `build:install-bundle` entry, and `check_installer_import_purity` fails the
10
+ * build when any module reachable from it carries a module-level
11
+ * `process.exit()` — including the guarded `if (isMain) process.exit(main())`
12
+ * shape, which that gate's own test names as "the real incident shape".
13
+ * `project_thin_rules.ts` carries exactly that at its foot, so the installer
14
+ * could not import it. The two live alternatives were both worse: a second
15
+ * implementation of the stub form inside `src/install/` is the duplicate-reader
16
+ * defect this repository has already paid for twice (the `lean_projection.mode`
17
+ * header records the latest), and moving the CLI instead would break every
18
+ * caller of `project_thin_rules --measure`.
19
+ *
20
+ * So the mechanism moves and the CLI stays. `project_thin_rules.ts` re-exports
21
+ * every name below, so no existing importer changes.
22
+ *
23
+ * Nothing here runs on import, nothing here writes, and nothing here calls
24
+ * `process.exit`. `measure`, `write_thin`, the JSON dumper and the CLI remain in
25
+ * `project_thin_rules.ts`.
26
+ */
27
+ import { createHash } from 'node:crypto';
28
+ import * as fs from 'node:fs';
29
+ import * as path from 'node:path';
30
+ import { fileURLToPath } from 'node:url';
31
+ import { lawText, ruleBody } from './rule_law_section.js';
32
+ import { readConsequenceClass, stubLawIds, } from './rule_consequence_class.js';
33
+ import { pathOnlyRuleIds, triggerlessRuleIds, } from './rule_injection.js';
34
+ const _HERE = fileURLToPath(import.meta.url);
35
+ /**
36
+ * The package root.
37
+ *
38
+ * FOUR levels up, not three: this module sits at `src/scripts/_lib/`, one
39
+ * directory deeper than the `src/scripts/<file>` the arithmetic was written for.
40
+ * Keeping the old `'..','..'` here would have resolved to `src/` and every
41
+ * default root below would have been silently wrong — the extraction's one
42
+ * genuine hazard, so it is stated rather than left to be noticed.
43
+ *
44
+ * Correct for a module READ FROM SOURCE. A bundled caller must hand its own
45
+ * package root over via {@link ThinRoots}; see that interface for why.
46
+ */
47
+ export const REPO_ROOT = path.resolve(path.dirname(_HERE), '..', '..', '..');
48
+ export const RULES_SOURCE = path.join(REPO_ROOT, 'dist/agent-src', 'rules');
49
+ export const ROUTER = path.join(REPO_ROOT, 'dist', 'router.json');
50
+ /** `sorted(dir.glob("*.md"))` — non-recursive, lexically sorted abs paths. */
51
+ export function _globSortedMd(dir) {
52
+ let names;
53
+ try {
54
+ names = fs.readdirSync(dir);
55
+ }
56
+ catch {
57
+ return [];
58
+ }
59
+ const out = names.filter((n) => n.endsWith('.md')).map((n) => path.join(dir, n));
60
+ out.sort();
61
+ return out;
62
+ }
63
+ /** The always-full-bodied set — authoritative kernel list from the router. */
64
+ export function kernel_ids(routerPath = ROUTER) {
65
+ const data = JSON.parse(fs.readFileSync(routerPath, 'utf-8'));
66
+ const kernel = data.kernel;
67
+ if (Array.isArray(kernel)) {
68
+ return new Set(kernel.map((x) => String(x)));
69
+ }
70
+ return new Set();
71
+ }
72
+ /**
73
+ * Tier rules the router gives NO trigger at all.
74
+ *
75
+ * These cannot be delivered on a match, so thinning them would remove a body
76
+ * that nothing can ever put back — a silent hole rather than a saving. They
77
+ * project full-bodied, and `measure` reports them by name so the residue is
78
+ * visible instead of being absorbed into the pointer count
79
+ * (road-to-trigger-delivered-rule-bodies 1.3).
80
+ */
81
+ /**
82
+ * Rules whose ONLY triggers are path-shaped — reachable from `pre_tool_use`
83
+ * and from no other slot (road-to-delivery-for-every-host 3.2).
84
+ *
85
+ * They must never be thinned while the delivery concern is NOT bound on
86
+ * `pre_tool_use`, because a stub plus a slot nobody listens on is a rule that
87
+ * reaches the model at no scope at all. This is the same failure the
88
+ * `no_trigger_ids` exemption prevents, one step out: there the rule has nothing
89
+ * to match on, here it has nothing to match ON.
90
+ *
91
+ * Stated as a PROPERTY rather than a list of ids. If the concern is ever bound
92
+ * on `pre_tool_use` again, this exemption is what should be reconsidered — not
93
+ * three names someone has to remember.
94
+ *
95
+ * WHAT THIS EXEMPTION DOES **NOT** COVER — recorded 2026-09-08, R2 finding 1,
96
+ * because the silence read as coverage. The predicate is `every` trigger
97
+ * path-shaped. A rule with BOTH path and non-path triggers is therefore THINNED,
98
+ * and its path-shaped half then has no carrier at all: the stub carries no
99
+ * frontmatter (`condense.ts` writes it with `_writeText`, bypassing
100
+ * `_emit_claude_rule`'s host-native `paths:` key), `pre_tool_use` lost the
101
+ * binding under owner ruling E2, and `user_prompt_submit` never populates
102
+ * `openFiles`. Measured over the current `dist/router.json`: **18 such rules**,
103
+ * all non-kernel and all thinned — augment-edit-discipline, design-fidelity,
104
+ * doc-screenshot-hygiene, domain-adoption-policy,
105
+ * framework-neutrality-in-generic-skills, image-likeness-and-rights,
106
+ * laravel-translations, lethal-trifecta-guard, linked-projects-onboarding-gate,
107
+ * low-impact-corpus-privacy-floor, markdown-safe-codeblocks, onboarding-gate,
108
+ * persona-governance, php-coding, provider-lifecycle-discipline,
109
+ * roadmap-ci-steps-policy, roadmap-progress-sync, settings-ask-protocol.
110
+ *
111
+ * They do NOT reach the model at no scope: every non-path route
112
+ * (keyword / phrase / command) still delivers the body through the concern, and
113
+ * on `claude-code` they never had a separate host-native path route to lose —
114
+ * `_claude_paths_plan` emits no `paths:` for a mixed-trigger rule on purpose, so
115
+ * under `eager-all` they loaded UNCONDITIONALLY. What is lost is the difference
116
+ * between unconditional and prompt-triggered: a session that touches a matching
117
+ * file and says nothing that matches gets nothing.
118
+ *
119
+ * The labelled corpus cannot see this and the endpoint says so rather than
120
+ * implying otherwise — `model_rule_injection --endpoints` (b) now publishes the
121
+ * shipped `user_prompt_submit` reach beside the pre-registered reading, and
122
+ * every one of these 18 has at least one prompt-matching positive, so none
123
+ * appears in its "reachable only via a path trigger" column.
124
+ *
125
+ * WHY THIS IS NOT WIDENED TO `some` HERE. Measured: exempting all 18 moves the
126
+ * thin rule layer 23,592 -> 39,921 GPT tok (+16,329, +69 %), which is a budget
127
+ * move of a magnitude no agent may take, and it would erase most of the saving
128
+ * the flip is licensed on. Restoring a path route needs either that exemption
129
+ * under a re-anchored baseline or a `pre_tool_use` binding under a raised slot
130
+ * cap — both owner-reserved, so the closure is tracked rather than taken here.
131
+ * ADR-267's Consequences section names the receiver.
132
+ */
133
+ /**
134
+ * ONE spelling of the router-derived sets, shared with the injector (R2
135
+ * finding 11).
136
+ *
137
+ * `path_only_ids` and `no_trigger_ids` were each a second, hand-rolled
138
+ * implementation of `_lib/rule_injection.ts::pathOnlyRuleIds` /
139
+ * `triggerlessRuleIds` — verified identical over the current router at the time
140
+ * (symmetric difference empty), so drift risk rather than a live defect. It is
141
+ * exactly the hazard `THIN_ENTRY_MARKER`'s own comment argues against one
142
+ * screen below ("a gate that re-spelled this string would drift from the writer
143
+ * silently"), and the two consumers here are the PROJECTOR's exemption set and
144
+ * the INJECTOR's reachability set: they must not be able to disagree about which
145
+ * rules the delivery path can reach.
146
+ *
147
+ * The finding named `path_only_ids`. The defect-pattern sweep found the SECOND
148
+ * instance one function down — `no_trigger_ids` against `triggerlessRuleIds` —
149
+ * and it is delegated in the same change. Count: 2 of 2 duplicated
150
+ * router-derived sets in this file, 0 remaining.
151
+ */
152
+ function _router(routerPath = ROUTER) {
153
+ return JSON.parse(fs.readFileSync(routerPath, 'utf-8'));
154
+ }
155
+ export function path_only_ids(routerPath = ROUTER) {
156
+ return pathOnlyRuleIds(_router(routerPath));
157
+ }
158
+ export function no_trigger_ids(routerPath = ROUTER) {
159
+ return new Set(triggerlessRuleIds(_router(routerPath)));
160
+ }
161
+ /**
162
+ * id → workspaces for every non-kernel router entry (router.json schema v2,
163
+ * road-to-request-scoped-rule-load Phase 1). Rules absent from the map (or
164
+ * with an empty list) fail safe: they stay in scope.
165
+ */
166
+ export function rule_workspaces_map(routerPath = ROUTER) {
167
+ const data = JSON.parse(fs.readFileSync(routerPath, 'utf-8'));
168
+ const map = new Map();
169
+ for (const tier of ['tier_1', 'tier_2']) {
170
+ const entries = data[tier];
171
+ if (!Array.isArray(entries))
172
+ continue;
173
+ for (const e of entries) {
174
+ const obj = e;
175
+ const ws = Array.isArray(obj.workspaces) ? obj.workspaces.map((w) => String(w)) : [];
176
+ map.set(String(obj.id), ws);
177
+ }
178
+ }
179
+ return map;
180
+ }
181
+ /**
182
+ * Whether a rule id survives a workspace scope. Kernel always survives;
183
+ * `scope === null` = legacy-all. An out-of-scope non-kernel rule is dropped
184
+ * entirely — neither body nor pointer line (the pointer floor shrinks with
185
+ * consumer scoping).
186
+ */
187
+ export function id_in_scope(rule_id, scope, kernel, wsMap, fallback_ws = []) {
188
+ if (scope === null || kernel.has(rule_id)) {
189
+ return true;
190
+ }
191
+ // Router map first (schema v2); `type: manual` rules are reference-only
192
+ // and never emitted to the router — their frontmatter is the fallback.
193
+ const ws = wsMap.get(rule_id) ?? fallback_ws;
194
+ if (ws.length === 0) {
195
+ return true; // untagged / unknown → fail safe
196
+ }
197
+ return ws.some((w) => scope.includes(w));
198
+ }
199
+ /** `workspaces:` list parsed straight from a rule file's frontmatter. */
200
+ export function fm_workspaces(text) {
201
+ const [fm] = split_frontmatter(text);
202
+ // Flow style: `workspaces: [a, b, c]`
203
+ const flow = /^workspaces:[ \t]*\[([^\]]*)\]/m.exec(fm);
204
+ if (flow) {
205
+ return flow[1]
206
+ .split(',')
207
+ .map((s) => s.trim().replace(/^["']|["']$/g, ''))
208
+ .filter((s) => s.length > 0);
209
+ }
210
+ // Block style; tolerate the list being the LAST frontmatter key.
211
+ const m = /^workspaces:[ \t]*\n((?:[ \t]+-[ \t]+.*(?:\n|$))+)/m.exec(fm);
212
+ if (!m) {
213
+ return [];
214
+ }
215
+ return [...m[1].matchAll(/-[ \t]+(\S+)/g)].map((x) => x[1]);
216
+ }
217
+ /** Return [frontmatter_including_fences, body]. Empty fm if none. */
218
+ export function split_frontmatter(text) {
219
+ if (text.startsWith('---\n')) {
220
+ const end = text.indexOf('\n---\n', 4);
221
+ if (end !== -1) {
222
+ return [text.slice(0, end + 5), text.slice(end + 5)];
223
+ }
224
+ }
225
+ return ['', text];
226
+ }
227
+ function _description(fm) {
228
+ // re.search(r'^description:\s*"?(.+?)"?\s*$', fm, re.MULTILINE)
229
+ const m = /^description:\s*"?(.+?)"?\s*$/m.exec(fm);
230
+ return m ? m[1].trim() : '';
231
+ }
232
+ // How many trigger keywords/phrases to surface as the always-on match hint.
233
+ const _TRIGGER_HINT_LIMIT = 6;
234
+ /** A short, comma-joined sample of the rule's trigger keywords/phrases. */
235
+ function _trigger_hint(fm) {
236
+ const hits = [];
237
+ // re.finditer(r'^\s*-\s*(?:keyword|phrase):\s*"?(.+?)"?\s*$', fm, re.MULTILINE)
238
+ const re = /^\s*-\s*(?:keyword|phrase):\s*"?(.+?)"?\s*$/gm;
239
+ let m;
240
+ while ((m = re.exec(fm)) !== null) {
241
+ hits.push(m[1].trim());
242
+ if (hits.length >= _TRIGGER_HINT_LIMIT) {
243
+ break;
244
+ }
245
+ }
246
+ return hits.join(', ');
247
+ }
248
+ /** Python `str.title()` — uppercase first alpha of each run, rest lowercase. */
249
+ function _title(s) {
250
+ return s.replace(/[A-Za-z]+/g, (w) => w.charAt(0).toUpperCase() + w.slice(1).toLowerCase());
251
+ }
252
+ /**
253
+ * The marker that makes a projected entry recognisable as a stub.
254
+ *
255
+ * Exported so the WRITER and every DETECTOR share one definition. A gate that
256
+ * re-spelled this string would drift from the writer silently, and the failure
257
+ * would be invisible in exactly the direction that matters: a stub the gate
258
+ * fails to recognise reads as a complete rule body. Two gates had done exactly
259
+ * that until step 2.1 of `road-to-a-thinned-layer-measured-in-one-unit`; both
260
+ * import this now.
261
+ *
262
+ * SHORTENED 2026-10-06 from 47 characters to 27 (step 2.2). It is paid once per
263
+ * stub and there were 89 stubs on the measured layer, so the sentence cost
264
+ * 4,183 characters of a 97,496-character standing total; at 27 it costs 2,403,
265
+ * a saving of 1,780 = 20 x 89.
266
+ *
267
+ * WHAT THE SHORTENING WAS NOT ALLOWED TO DO: drop the instruction. This is the
268
+ * only standing text in the whole layer that says what a stub is FOR — "load
269
+ * the body" occurs in no kernel rule and in neither root instruction file — so
270
+ * a bare token like `> thin` would have saved more and left nothing that could
271
+ * be followed. The decision record (D2, K6) rejected that explicitly: nothing
272
+ * in this repository can check whether an instruction nobody states is still
273
+ * obeyed.
274
+ *
275
+ * WHY IT MUST STAY LONG ENOUGH TO BE UNIQUE: {@link is_thin_entry} is a
276
+ * substring test over the whole file, so a marker short or generic enough to
277
+ * occur inside ordinary rule prose would make that rule read as a stub — and
278
+ * nine rule files carry blockquote lines. `thin_marker_unique_in_corpus.test.ts`
279
+ * runs the constant against every rule body in `src/rules/` and against every
280
+ * entry `build_thin` emits, in both directions, which is the check that bounds
281
+ * any further shortening.
282
+ */
283
+ export const THIN_ENTRY_MARKER = '> Load the body on a match.';
284
+ /** Is this projected entry a pointer stub rather than a rule body? */
285
+ export function is_thin_entry(text) {
286
+ return text.includes(THIN_ENTRY_MARKER);
287
+ }
288
+ /**
289
+ * What introduces a stub's body pointer. One writer, one reader.
290
+ *
291
+ * A BARE PATH SINCE 2026-10-06 (step 2.3 of
292
+ * `road-to-a-thinned-layer-measured-in-one-unit`). The pointer used to be a
293
+ * markdown link, ``Body: [`<id>`](<prefix><id>.md)``, whose link TEXT repeated
294
+ * the rule id the target already ends in. That cost `6 + len(id)` per stub over
295
+ * the bare form — 2,359 characters across the 89 stubs of the measured layer,
296
+ * 534 of it pure syntax and the rest the id written a second time.
297
+ *
298
+ * Nothing followed the link as a link. Under `delivery` the hook loads the body
299
+ * and never reads the pointer at all; under `thin` an agent reads the path. A
300
+ * markdown link renders in neither case, so the syntax bought rendering nobody
301
+ * was doing.
302
+ */
303
+ export const THIN_BODY_POINTER_PREFIX = 'Body: ';
304
+ /**
305
+ * The pointer, as the WRITER emits it — exported so a detector cannot re-spell
306
+ * it, which is the same drift {@link THIN_ENTRY_MARKER} documents one screen up
307
+ * and which two gates had already committed there.
308
+ *
309
+ * WHAT IT CAPTURES is the whole tail of the line from `Body: ` to its end, and
310
+ * that is the intended semantic rather than an accident of greediness: the
311
+ * writer emits the pointer LAST on its line, so the tail IS the path. A review
312
+ * round proposed a lazy `(.+?\.md)` to stop at the first `.md`; measured, it
313
+ * changes nothing, because `\s*$` forces the match to reach end of line either
314
+ * way and a lazy quantifier simply backtracks forward to the same place. The
315
+ * greedy form is kept and the property is pinned by a test, so the next reader
316
+ * meets the measurement instead of repeating the proposal.
317
+ *
318
+ * ANCHORED TO END OF LINE, NOT `\S+`. The pointer is the last thing on its
319
+ * line, and a package root may contain spaces; `\S+` would silently stop at the
320
+ * first one and report a well-formed pointer as missing.
321
+ *
322
+ * COMPOSED FROM {@link THIN_BODY_POINTER_PREFIX} rather than re-spelling it.
323
+ * The constant exists so a reader cannot hold its own copy, and a pattern six
324
+ * lines below it holding a literal `Body: ` would have broken that invariant in
325
+ * the file that states it.
326
+ */
327
+ export const THIN_BODY_POINTER_RE = (() => {
328
+ const lit = THIN_BODY_POINTER_PREFIX.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
329
+ // THE LAST PREFIX ON THE LINE, NOT THE FIRST. `thin_entry` puts the rule's
330
+ // own `description` on the SAME line ahead of the pointer, so a description
331
+ // containing the literal `Body: ` used to start the match inside the
332
+ // description and capture it as part of the path — `has_body_pointer` stayed
333
+ // true while the extraction was wrong, which is a wrong assertion rather
334
+ // than a visible failure. Forbidding a second prefix inside the capture
335
+ // makes the first viable start the last occurrence, which is the pointer.
336
+ return new RegExp(`${lit}((?:(?!${lit}).)+\\.md)\\s*$`, 'm');
337
+ })();
338
+ /** Does this entry carry a body pointer the writer would recognise? */
339
+ export function has_body_pointer(text) {
340
+ return THIN_BODY_POINTER_RE.test(text);
341
+ }
342
+ /**
343
+ * Where a stub tells a reader the body actually is.
344
+ *
345
+ * FIXED 2026-09-07: this pointed into the uncondensed source tree ADR-051
346
+ * retired — the literal path is deliberately NOT reproduced here, because
347
+ * `check_no_uncondensed_refs` matches the string and cannot tell a repair
348
+ * record from a live reference; `git log -S` on this file finds the old value.
349
+ * It exists in no checkout, so EVERY stub's fallback pointer
350
+ * resolved to nothing — invisible under `delivery`, where the hook loads the
351
+ * body from `dist/agent-src/rules` and never follows this link, and total under
352
+ * `thin`, where the pointer is the only path to the body there is.
353
+ *
354
+ * KNOWN LIMIT, stated rather than discovered later: one relative prefix cannot
355
+ * be right for every tree, because they sit at different depths — `.claude/rules`
356
+ * and `.cursor/rules` are two levels below the repo root and `.clinerules` is
357
+ * one. `../../` is correct for the first two, which are the only trees the
358
+ * shipped `lean_projection.hosts` default can thin. A stub in `.clinerules`
359
+ * needs an operator to have added `cline` to that list, and its pointer is off
360
+ * by one level. That is strictly better than the previous state, where the
361
+ * pointer was dead in all three, and it is recorded here so the remaining case
362
+ * is a known limit rather than a surprise.
363
+ */
364
+ const BODY_LINK_PREFIX = '../../dist/agent-src/rules/';
365
+ /**
366
+ * The absolute body-link prefix for a tree whose rules were installed OUT of the
367
+ * repository — `~/.claude/rules`, where no relative prefix can be right.
368
+ *
369
+ * The limit documented on {@link BODY_LINK_PREFIX} is a statement about trees at
370
+ * a KNOWN depth below a repo root. An installed layer has no such relation to
371
+ * the package at all: `~/.claude/rules/x.md` and `<pkg>/dist/agent-src/rules/x.md`
372
+ * share no common ancestor the installer may assume, so the only prefix that can
373
+ * resolve is one rooted at the package the install was made from. The installer
374
+ * knows that path (`package_root`), which is why this takes it rather than
375
+ * deriving it from `import.meta.url` — inside a bundled CLI that arithmetic
376
+ * yields the parent of the package, the same miss `lean_projection_mode`'s header
377
+ * records for the template read.
378
+ *
379
+ * KNOWN LIMIT, stated rather than found later: the pointer is as durable as the
380
+ * package directory it names. A global `npm i -g` install is durable; an `npx`
381
+ * run is not, and a stub written from an ephemeral package root points at a path
382
+ * that will not exist afterwards. That is strictly better than the project-
383
+ * relative prefix, which resolves from an installed layer NEVER, and under
384
+ * `delivery` the hook loads the body and does not follow this link at all.
385
+ */
386
+ export function absoluteBodyLinkPrefix(packageRoot) {
387
+ return `${path.join(path.resolve(packageRoot), 'dist', 'agent-src', 'rules')}${path.sep}`;
388
+ }
389
+ /** Build the minimal progressive-disclosure pointer for a non-kernel rule. */
390
+ export function thin_entry(rule_id, text, bodyLinkPrefix = BODY_LINK_PREFIX) {
391
+ const [fm] = split_frontmatter(text);
392
+ const desc = _description(fm);
393
+ const hint = _trigger_hint(fm);
394
+ const title = _title(rule_id.replace(/-/g, ' '));
395
+ const fires = hint ? ` Fires on: ${hint}.` : '';
396
+ return (`## ${title}\n` +
397
+ `${THIN_ENTRY_MARKER}${fires} ${desc} ` +
398
+ `${THIN_BODY_POINTER_PREFIX}${bodyLinkPrefix}${rule_id}.md\n`);
399
+ }
400
+ /**
401
+ * The marker that opens a stub's copied law block, and the one that closes it
402
+ * with the digest of what was copied.
403
+ *
404
+ * Exported for the same reason {@link THIN_ENTRY_MARKER} is: a detector that
405
+ * re-spelled either string would drift from the writer silently, and the
406
+ * failure would read as "this stub carries no law" — the one direction that
407
+ * matters.
408
+ */
409
+ export const STUB_LAW_OPEN = '<!-- law: byte-copied from the rule, sha256 ';
410
+ export const STUB_LAW_CLOSE = '<!-- /law -->';
411
+ /** Short digest of a law text — the same function the stub writer and any reader use. */
412
+ export function lawDigest(law) {
413
+ return createHash('sha256').update(law, 'utf-8').digest('hex').slice(0, 16);
414
+ }
415
+ /**
416
+ * Raised when a class member cannot carry its law and has not said so.
417
+ *
418
+ * The roadmap's own words: a class member whose law section is missing or over
419
+ * the ceiling FAILS the projection rather than shipping a shortened copy. The
420
+ * declared `no_stub` subset is the escape, and it costs a reason in the diff —
421
+ * which is the whole difference between an exception and a silent shrink.
422
+ */
423
+ export class StubLawError extends Error {
424
+ ruleId;
425
+ constructor(ruleId, message) {
426
+ super(message);
427
+ this.name = 'StubLawError';
428
+ this.ruleId = ruleId;
429
+ }
430
+ }
431
+ /** Characters of law a stub may carry — the hard ceiling `lint_rule_law_section` holds. */
432
+ export const STUB_LAW_MAX_CHARS = 2_000;
433
+ /**
434
+ * A stub that carries the rule's own law, byte for byte.
435
+ *
436
+ * The council rejected a compiled or summarised contract: a second
437
+ * authoritative representation of a rule is a new trust boundary whose
438
+ * omissions read as permission. So nothing here rewrites, truncates or
439
+ * reformats — the law text is `slice`d out of the source body and emitted
440
+ * verbatim, and the digest beside it is what makes "verbatim" checkable rather
441
+ * than asserted.
442
+ */
443
+ export function thin_entry_with_law(rule_id, text, bodyLinkPrefix = BODY_LINK_PREFIX) {
444
+ const law = lawText(ruleBody(text));
445
+ if (law === null) {
446
+ throw new StubLawError(rule_id, `${rule_id} is a high-consequence class member with no law section — write one, or ` +
447
+ `record it under \`no_stub\` in src/config/rule-consequence-class.json with the reason`);
448
+ }
449
+ if (law.length > STUB_LAW_MAX_CHARS) {
450
+ throw new StubLawError(rule_id, `${rule_id} is a high-consequence class member whose law section is ${law.length} chars, ` +
451
+ `over the ${STUB_LAW_MAX_CHARS} ceiling — a stub never ships a shortened copy, so either ` +
452
+ 'the law moves under the ceiling or the rule is recorded under `no_stub` in ' +
453
+ 'src/config/rule-consequence-class.json with the reason');
454
+ }
455
+ return (thin_entry(rule_id, text, bodyLinkPrefix) +
456
+ `\n${STUB_LAW_OPEN}${lawDigest(law)} -->\n` +
457
+ `${law}\n` +
458
+ `${STUB_LAW_CLOSE}\n`);
459
+ }
460
+ /** Map {filename: thin_or_full_text} for every rule. Kernel stays full. */
461
+ export function build_thin(rules_dir = RULES_SOURCE, scope = null,
462
+ /**
463
+ * Optional sink for the D3 diagnostic
464
+ * (road-to-delivery-for-every-host 2.2).
465
+ *
466
+ * An `auto` rule the router gives NO trigger is already kept full-bodied by
467
+ * `noTrigger` below, which is the substantive protection and predates this
468
+ * roadmap. What did not exist is any way to SEE it happen: the rule is
469
+ * silently exempted, so an author who removes a rule's last trigger gets a
470
+ * silently eager rule and no signal. The line makes the exemption audible.
471
+ */
472
+ announce = null,
473
+ /**
474
+ * The high-consequence class. Defaults to the committed config; a caller
475
+ * may inject one so a fixture can drive the stub-law form without a tree.
476
+ */
477
+ consequenceClass = null,
478
+ /**
479
+ * Where the router, the consequence class and the stub body links come from
480
+ * when the caller is NOT this repository's own projector.
481
+ *
482
+ * Every default below is derived from {@link REPO_ROOT}, which is
483
+ * `import.meta.url` four directories up. That is correct for a module read
484
+ * from `<pkg>/src/scripts/`, and wrong inside a bundled CLI, where the same
485
+ * arithmetic lands on the PARENT of the package — so a caller that knows the
486
+ * real package root hands it over instead of letting the module guess.
487
+ */
488
+ roots = null) {
489
+ const routerPath = roots?.routerPath ?? (roots?.packageRoot === undefined
490
+ ? ROUTER
491
+ : path.join(roots.packageRoot, 'dist', 'router.json'));
492
+ const classRoot = roots?.packageRoot ?? REPO_ROOT;
493
+ const bodyLinkPrefix = roots?.bodyLinkPrefix ?? BODY_LINK_PREFIX;
494
+ const kernel = kernel_ids(routerPath);
495
+ const noTrigger = no_trigger_ids(routerPath);
496
+ const pathOnly = path_only_ids(routerPath);
497
+ const cls = consequenceClass ?? readConsequenceClass(classRoot);
498
+ const lawInStub = stubLawIds(cls);
499
+ const wsMap = scope !== null ? rule_workspaces_map(routerPath) : new Map();
500
+ const out = new Map();
501
+ for (const p of _globSortedMd(rules_dir)) {
502
+ const text = fs.readFileSync(p, 'utf-8');
503
+ const stem = path.basename(p).replace(/\.md$/, '');
504
+ if (!id_in_scope(stem, scope, kernel, wsMap, fm_workspaces(text))) {
505
+ continue; // out of workspace scope — no body, no pointer line
506
+ }
507
+ // A declared `no_stub` member keeps its whole body. Its law cannot be
508
+ // copied into a stub, and a stub with no law is exactly the shape the
509
+ // class exists to prevent for these rules — so the safe residue is the
510
+ // full text, not a pointer.
511
+ const noStub = cls.no_stub[stem] !== undefined;
512
+ const full = kernel.has(stem) || noTrigger.has(stem) || pathOnly.has(stem) || noStub;
513
+ if (announce !== null && noTrigger.has(stem) && !kernel.has(stem)) {
514
+ announce(`D3: trigger-less auto rule ${path.basename(p)} — kept full-bodied, never thinned`);
515
+ }
516
+ if (announce !== null && pathOnly.has(stem) && !kernel.has(stem) && !noTrigger.has(stem)) {
517
+ announce(`E2: path-only auto rule ${path.basename(p)} — kept full-bodied; its only triggers ` +
518
+ `are path-shaped and the delivery concern is not bound on pre_tool_use`);
519
+ }
520
+ if (full) {
521
+ out.set(path.basename(p), text);
522
+ continue;
523
+ }
524
+ if (lawInStub.has(stem)) {
525
+ if (announce !== null) {
526
+ announce(`LAW: high-consequence rule ${path.basename(p)} — stub carries its own law section, byte-copied`);
527
+ }
528
+ out.set(path.basename(p), thin_entry_with_law(stem, text, bodyLinkPrefix));
529
+ continue;
530
+ }
531
+ out.set(path.basename(p), thin_entry(stem, text, bodyLinkPrefix));
532
+ }
533
+ return out;
534
+ }
535
+ //# sourceMappingURL=thin_rules.js.map
@@ -0,0 +1,60 @@
1
+ /**
2
+ * The windsurf single-file surface, rendered — one renderer, two callers.
3
+ *
4
+ * `road-to-a-hook-bundle-with-one-yaml-reader` 3.1. `condense.generate_windsurfrules`
5
+ * WRITES `.windsurfrules`; the standing-payload census needs the same bytes to
6
+ * report windsurf's figure without reading that file, because it is an untracked
7
+ * generated projection and reading it published a number that tracked when the
8
+ * checkout last ran `task generate-tools` rather than anything about the tree.
9
+ *
10
+ * Both callers share THIS function. A second renderer living in the census would
11
+ * have measured a file nobody receives, which is Risk 3 of that roadmap.
12
+ *
13
+ * WHY A SEPARATE MODULE rather than an export from `condense.ts`: that file sits
14
+ * 1,228 lines over the 1,500-line cap `check_source_size_budget` ratchets, so
15
+ * every line added there is a new violation. Splitting the renderer out moves
16
+ * `condense.ts` DOWN. The file is small on purpose and carries only what the
17
+ * render needs.
18
+ *
19
+ * `strip_frontmatter` moved here with it — it is the render's one non-trivial
20
+ * dependency, it has exactly one caller left inside `condense.ts`, and leaving it
21
+ * behind would have meant either an import cycle or a second copy.
22
+ * `condense.ts` re-exports it, so `src/install/emit_host_rules_cli.ts` and every
23
+ * other importer keeps its path.
24
+ */
25
+ import * as fs from 'node:fs';
26
+ import * as path from 'node:path';
27
+ /** Python `str.lstrip("\n")` — strip only leading newlines. Mirrors `condense._lstripNewlines`. */
28
+ function lstripNewlines(s) {
29
+ return s.replace(/^\n+/, '');
30
+ }
31
+ /** Python `str.strip()` with no args — strip leading/trailing Unicode whitespace. Mirrors `condense._strip`. */
32
+ function strip(s) {
33
+ return s.replace(/^\s+/u, '').replace(/\s+$/u, '');
34
+ }
35
+ /** Drop a leading `---` frontmatter block, if the content opens with one. */
36
+ export function strip_frontmatter(content) {
37
+ if (content.startsWith('---')) {
38
+ const end = content.indexOf('---', 3);
39
+ if (end !== -1) {
40
+ content = lstripNewlines(content.slice(end + 3));
41
+ }
42
+ }
43
+ return content;
44
+ }
45
+ /**
46
+ * The exact bytes `generate_windsurfrules` writes, for a given rule set.
47
+ *
48
+ * `rulesSource` is a parameter rather than `condense.MODULE_STATE.RULES_SOURCE`
49
+ * so a caller can render a tree it names — the census renders the projection
50
+ * source directly, with no module state to set up.
51
+ */
52
+ export function render_windsurfrules(rulesSource, rules) {
53
+ const parts = ['# Auto-generated from dist/agent-src/rules/ — do not edit directly\n'];
54
+ for (const rule of rules) {
55
+ const content = strip_frontmatter(fs.readFileSync(path.join(rulesSource, rule), 'utf-8'));
56
+ parts.push(`---\n\n${strip(content)}\n`);
57
+ }
58
+ return parts.join('\n') + '\n';
59
+ }
60
+ //# sourceMappingURL=windsurf_render.js.map
@@ -33,6 +33,7 @@ import { fileURLToPath, pathToFileURL } from 'node:url';
33
33
  import * as YAML from 'yaml';
34
34
  import { _domains_command_logical, artefact_roots as _agent_src_artefact_roots, iter_all_sources as _agent_src_iter_all_sources, resolve_logical as _agent_src_resolve_logical, strip_source_prefix, } from './_lib/agent_src.js';
35
35
  import { rewriteProjectedBodyLinks } from './_lib/guidelines_lane.js';
36
+ import { render_windsurfrules, strip_frontmatter } from './_lib/windsurf_render.js';
36
37
  // Import-safety note: `project_thin_rules` guards its CLI entry
37
38
  // (`_isCliEntry()` before `process.exit(main())`), so importing it here is
38
39
  // side-effect-free. condense.ts is bundled into the installer, where a bare
@@ -40,7 +41,7 @@ import { rewriteProjectedBodyLinks } from './_lib/guidelines_lane.js';
40
41
  // bundled-CLI-entry-guard landmine. Verified before wiring, not assumed.
41
42
  import { build_thin } from './project_thin_rules.js';
42
43
  import { build_claude_hook_matrix } from './_lib/claude_settings_hooks.js';
43
- import { describeDroppedHosts, normalizeLeanProjectionMode, resolveLeanProjectionHosts, thinsHost, writesThinFiles } from './_lib/lean_projection_mode.js';
44
+ import { describeDroppedHosts, resolveLeanProjection, thinsHost, writesThinFiles } from './_lib/lean_projection_mode.js';
44
45
  import { is_claude_builtin_name } from './_lib/claude_builtin_names.js';
45
46
  import { project_settings_path, load_agent_settings } from './_lib/agent_settings.js';
46
47
  import { rule_is_compile_enabled } from './_lib/compile_time_toggles.js';
@@ -385,15 +386,14 @@ function _read_projection_scope_dedup() {
385
386
  return false;
386
387
  }
387
388
  function _lean_projection_settings() {
388
- const data = load_agent_settings({ project_path: MODULE_STATE.SETTINGS_FILE });
389
- const lean = data['lean_projection'];
390
- const obj = typeof lean === 'object' && lean !== null && !Array.isArray(lean)
391
- ? lean
392
- : {};
393
- return {
394
- mode: normalizeLeanProjectionMode(obj['mode'] ?? ''),
395
- hosts: resolveLeanProjectionHosts(obj['hosts']),
396
- };
389
+ // Step 1.2 of `road-to-a-rule-carrier-that-works-outside-the-repo`: this is
390
+ // now the shared resolver rather than one of three private readers. The
391
+ // INPUT is unchanged — `MODULE_STATE.SETTINGS_FILE` is still the file, so
392
+ // the projector's answer is the answer it always gave — and only the code
393
+ // that interprets it is shared. That is risk 2 of the roadmap's register
394
+ // ("making the hook agree with the projector could also move the
395
+ // projector") discharged by construction instead of by a test alone.
396
+ return resolveLeanProjection({ settingsPath: MODULE_STATE.SETTINGS_FILE });
397
397
  }
398
398
  // --- hashing -----------------------------------------------------------------
399
399
  export function apply_path_rewriter(relative_path) {
@@ -677,15 +677,9 @@ function _filter_tool_dirs(mapping) {
677
677
  }
678
678
  return out;
679
679
  }
680
- export function strip_frontmatter(content) {
681
- if (content.startsWith('---')) {
682
- const end = content.indexOf('---', 3);
683
- if (end !== -1) {
684
- content = _lstripNewlines(content.slice(end + 3));
685
- }
686
- }
687
- return content;
688
- }
680
+ // Moved to `_lib/windsurf_render.ts` beside its one remaining caller here and
681
+ // the census that renders through it; re-exported so every importer's path holds.
682
+ export { strip_frontmatter };
689
683
  // ── Path rewriter (P1 of road-to-path-fixes.md) ───────────────────────────
690
684
  // Kept byte-identical to check_condensation.ts::_rewritePaths (the two MUST
691
685
  // agree — see ADR-200 note). Mirrors condense.py::_rewrite_paths.
@@ -1086,14 +1080,8 @@ export function generate_windsurfrules() {
1086
1080
  // on `.windsurf/rules`. Without this line removing the per-run filter regressed
1087
1081
  // it 13 → 113: the per-run filter had been covering it by accident.
1088
1082
  const rules = partition_rules_for_dir('.windsurf/rules', _scoped_rule_basenames());
1089
- const parts = ['# Auto-generated from dist/agent-src/rules/ — do not edit directly\n'];
1090
- for (const rule of rules) {
1091
- const p = path.join(MODULE_STATE.RULES_SOURCE, rule);
1092
- const content = strip_frontmatter(_readText(p));
1093
- parts.push(`---\n\n${_strip(content)}\n`);
1094
- }
1095
1083
  const output = path.join(MODULE_STATE.PROJECT_ROOT, '.windsurfrules');
1096
- _writeText(output, parts.join('\n') + '\n');
1084
+ _writeText(output, render_windsurfrules(MODULE_STATE.RULES_SOURCE, rules));
1097
1085
  info(` ✅ Generated .windsurfrules (${rules.length} rules)`);
1098
1086
  return rules.length;
1099
1087
  }