@event4u/agent-config 9.9.0 → 9.11.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 (479) hide show
  1. package/.claude-plugin/marketplace.json +1 -1
  2. package/CHANGELOG.md +212 -194
  3. package/README.md +13 -16
  4. package/agents/templates/.ai-council.yml.example +481 -0
  5. package/agents/templates/.ai-video.xml.example +247 -0
  6. package/dist/agent-src/commands/agent-status.md +12 -11
  7. package/dist/agent-src/commands/agents/user/accept.md +115 -30
  8. package/dist/agent-src/commands/agents/user/delete.md +147 -0
  9. package/dist/agent-src/commands/agents/user/review.md +65 -28
  10. package/dist/agent-src/commands/agents/user/show.md +82 -29
  11. package/dist/agent-src/commands/agents/user/update.md +2 -2
  12. package/dist/agent-src/commands/agents/user.md +16 -3
  13. package/dist/agent-src/commands/check-current-md.md +0 -10
  14. package/dist/agent-src/commands/condense.md +28 -97
  15. package/dist/agent-src/commands/cost/report.md +7 -0
  16. package/dist/agent-src/commands/fix/portability.md +0 -8
  17. package/dist/agent-src/commands/fix/refs.md +0 -8
  18. package/dist/agent-src/commands/humanize.md +2 -2
  19. package/dist/agent-src/commands/jira-ticket.md +1 -1
  20. package/dist/agent-src/commands/memory/load.md +11 -0
  21. package/dist/agent-src/commands/optimize/skills.md +1 -1
  22. package/dist/agent-src/commands/pr/create.md +4 -4
  23. package/dist/agent-src/commands/profile/show.md +3 -3
  24. package/dist/agent-src/commands/rule-compliance-audit.md +5 -4
  25. package/dist/agent-src/commands/security-audit-config.md +1 -1
  26. package/dist/agent-src/commands/sync/gitignore/fix.md +1 -1
  27. package/dist/agent-src/commands/tdd.md +21 -0
  28. package/dist/agent-src/commands/team/delegate.md +2 -2
  29. package/dist/agent-src/commands/team-knowledge/bootstrap.md +9 -8
  30. package/dist/agent-src/commands/team-knowledge/consolidate.md +8 -7
  31. package/dist/agent-src/commands/team.md +4 -1
  32. package/dist/agent-src/commands/upstream-contribute.md +0 -1
  33. package/dist/agent-src/contexts/authority/commit-mechanics.md +7 -0
  34. package/dist/agent-src/contexts/authority/destructive-mechanics.md +16 -0
  35. package/dist/agent-src/contexts/authority/scope-mechanics.md +61 -0
  36. package/dist/agent-src/contexts/communication/rules-auto/reply-close-mechanics.md +20 -18
  37. package/dist/agent-src/contexts/communication/rules-auto/skill-quality-mechanics.md +1 -1
  38. package/dist/agent-src/contexts/communication/rules-auto/slash-command-routing-policy-mechanics.md +1 -1
  39. package/dist/agent-src/contexts/communication/rules-auto/source-of-truth-mechanics.md +9 -10
  40. package/dist/agent-src/contexts/communication/rules-auto/think-before-action-mechanics.md +1 -1
  41. package/dist/agent-src/contexts/communication/rules-auto/user-interaction-mechanics.md +11 -0
  42. package/dist/agent-src/contexts/contracts/artifact-engagement-flow.md +26 -15
  43. package/dist/agent-src/contexts/contracts/command-suggestion-flow.md +3 -0
  44. package/dist/agent-src/contexts/execution/auto-dispatch-classification.md +67 -37
  45. package/dist/agent-src/contexts/execution/auto-orchestration-activation.md +1 -1
  46. package/dist/agent-src/contexts/execution/autonomy-examples.md +1 -1
  47. package/dist/agent-src/contexts/execution/autonomy-mechanics.md +7 -6
  48. package/dist/agent-src/contexts/execution/evidence-discipline.md +92 -77
  49. package/dist/agent-src/contexts/execution/orchestration-benchmark-gate.md +22 -21
  50. package/dist/agent-src/contexts/execution/orchestration-telemetry.md +24 -0
  51. package/dist/agent-src/contexts/execution/project-intelligence.md +122 -103
  52. package/dist/agent-src/contexts/execution/roadmap-execution-contract.md +23 -21
  53. package/dist/agent-src/contexts/execution/subagent-response-contract.md +5 -5
  54. package/dist/agent-src/contexts/execution/subagent-routing.md +11 -0
  55. package/dist/agent-src/contexts/execution/subagent-spawn-contract.md +13 -13
  56. package/dist/agent-src/contexts/execution/subagent-steering.md +36 -34
  57. package/dist/agent-src/contexts/execution/toolchain-resolver.md +1 -1
  58. package/dist/agent-src/contexts/execution/user-memory-channels.md +189 -0
  59. package/dist/agent-src/contexts/execution/verification-mechanics.md +9 -0
  60. package/dist/agent-src/contexts/model-recommendations.md +3 -2
  61. package/dist/agent-src/contexts/subagent-configuration.md +3 -3
  62. package/dist/agent-src/ghostwriter/README.md +2 -2
  63. package/dist/agent-src/packs/README.md +1 -1
  64. package/dist/agent-src/personas/README.md +5 -5
  65. package/dist/agent-src/personas/_template-specialist/persona.md +3 -3
  66. package/dist/agent-src/personas/backend-architect.md +24 -23
  67. package/dist/agent-src/personas/eloquent-tamer.md +30 -30
  68. package/dist/agent-src/personas/frontend-engineer.md +30 -30
  69. package/dist/agent-src/personas/product-owner.md +41 -38
  70. package/dist/agent-src/personas/qa.md +13 -13
  71. package/dist/agent-src/personas/security-engineer.md +22 -22
  72. package/dist/agent-src/presets/README.md +3 -3
  73. package/dist/agent-src/profiles/README.md +3 -3
  74. package/dist/agent-src/rules/active-remediation.md +2 -2
  75. package/dist/agent-src/rules/artifact-engagement-recording.md +4 -4
  76. package/dist/agent-src/rules/ask-when-uncertain.md +0 -4
  77. package/dist/agent-src/rules/augment-edit-discipline.md +1 -1
  78. package/dist/agent-src/rules/broken-access-control.md +4 -4
  79. package/dist/agent-src/rules/code-comment-discipline.md +1 -1
  80. package/dist/agent-src/rules/code-provenance.md +2 -2
  81. package/dist/agent-src/rules/commit-policy.md +4 -9
  82. package/dist/agent-src/rules/communication-through-line.md +5 -5
  83. package/dist/agent-src/rules/decision-revisit-gate.md +1 -1
  84. package/dist/agent-src/rules/design-fidelity.md +1 -1
  85. package/dist/agent-src/rules/doc-screenshot-hygiene.md +1 -1
  86. package/dist/agent-src/rules/domain-adoption-policy.md +1 -1
  87. package/dist/agent-src/rules/domain-safety-pii.md +1 -1
  88. package/dist/agent-src/rules/external-code-graph-interop.md +1 -1
  89. package/dist/agent-src/rules/fast-path-marker-visibility.md +43 -7
  90. package/dist/agent-src/rules/finance-safety-floor.md +1 -1
  91. package/dist/agent-src/rules/framework-neutrality-in-generic-skills.md +3 -3
  92. package/dist/agent-src/rules/history-discipline.md +1 -1
  93. package/dist/agent-src/rules/legal-safety-floor.md +1 -1
  94. package/dist/agent-src/rules/lethal-trifecta-guard.md +5 -5
  95. package/dist/agent-src/rules/low-impact-corpus-privacy-floor.md +10 -8
  96. package/dist/agent-src/rules/media-governance-routing.md +13 -13
  97. package/dist/agent-src/rules/media-sync-ground-truth.md +29 -11
  98. package/dist/agent-src/rules/no-cheap-questions.md +7 -7
  99. package/dist/agent-src/rules/no-decorative-emojis-in-git-surfaces.md +29 -18
  100. package/dist/agent-src/rules/non-destructive-by-default.md +5 -23
  101. package/dist/agent-src/rules/onboarding-gate.md +14 -4
  102. package/dist/agent-src/rules/persona-governance.md +2 -2
  103. package/dist/agent-src/rules/prefer-enums-over-literals.md +9 -9
  104. package/dist/agent-src/rules/preservation-guard.md +10 -2
  105. package/dist/agent-src/rules/question-not-instruction.md +1 -1
  106. package/dist/agent-src/rules/roadmap-progress-sync.md +6 -6
  107. package/dist/agent-src/rules/rule-type-governance.md +1 -1
  108. package/dist/agent-src/rules/scale-discipline.md +1 -1
  109. package/dist/agent-src/rules/scope-control.md +1 -1
  110. package/dist/agent-src/rules/secret-vcs-guard.md +1 -1
  111. package/dist/agent-src/rules/security-sensitive-stop.md +17 -11
  112. package/dist/agent-src/rules/senior-engineering-discipline.md +17 -17
  113. package/dist/agent-src/rules/session-canary.md +1 -1
  114. package/dist/agent-src/rules/skill-quality.md +1 -1
  115. package/dist/agent-src/rules/source-confidentiality.md +21 -19
  116. package/dist/agent-src/rules/source-of-truth.md +6 -5
  117. package/dist/agent-src/rules/spreadsheet-source-quality.md +2 -2
  118. package/dist/agent-src/rules/strategy-safety-floor.md +1 -1
  119. package/dist/agent-src/rules/think-before-action.md +5 -5
  120. package/dist/agent-src/rules/token-budget-discipline.md +5 -3
  121. package/dist/agent-src/rules/token-efficiency.md +2 -2
  122. package/dist/agent-src/rules/untrusted-input-defense.md +4 -4
  123. package/dist/agent-src/rules/user-interaction.md +12 -0
  124. package/dist/agent-src/rules/verify-before-complete.md +4 -24
  125. package/dist/agent-src/skills/adversarial-review/SKILL.md +2 -2
  126. package/dist/agent-src/skills/agent-security-review/SKILL.md +52 -45
  127. package/dist/agent-src/skills/agents-md-thin-root/SKILL.md +2 -2
  128. package/dist/agent-src/skills/ai-code-blindspots/SKILL.md +20 -20
  129. package/dist/agent-src/skills/ai-council/SKILL.md +185 -128
  130. package/dist/agent-src/skills/analysis-skill-router/SKILL.md +3 -3
  131. package/dist/agent-src/skills/api-endpoint/SKILL.md +2 -2
  132. package/dist/agent-src/skills/artisan-commands/SKILL.md +2 -2
  133. package/dist/agent-src/skills/async-python-patterns/SKILL.md +8 -7
  134. package/dist/agent-src/skills/authz-review/SKILL.md +16 -15
  135. package/dist/agent-src/skills/aws-infrastructure/SKILL.md +5 -5
  136. package/dist/agent-src/skills/blade-ui/SKILL.md +1 -1
  137. package/dist/agent-src/skills/bug-analyzer/SKILL.md +30 -12
  138. package/dist/agent-src/skills/code-intelligence/SKILL.md +0 -1
  139. package/dist/agent-src/skills/code-intelligence/evals/triggers.json +52 -0
  140. package/dist/agent-src/skills/code-review/SKILL.md +6 -6
  141. package/dist/agent-src/skills/command-routing/SKILL.md +5 -4
  142. package/dist/agent-src/skills/composer-packages/SKILL.md +2 -2
  143. package/dist/agent-src/skills/condense-memory/SKILL.md +43 -41
  144. package/dist/agent-src/skills/context-document/SKILL.md +23 -21
  145. package/dist/agent-src/skills/copilot-config/SKILL.md +6 -1
  146. package/dist/agent-src/skills/decision-record/SKILL.md +20 -18
  147. package/dist/agent-src/skills/design-intelligence/SKILL.md +4 -4
  148. package/dist/agent-src/skills/design-review/SKILL.md +15 -14
  149. package/dist/agent-src/skills/design-system-capture/reference/design-system-json.md +28 -25
  150. package/dist/agent-src/skills/devcontainer/SKILL.md +2 -2
  151. package/dist/agent-src/skills/docker/SKILL.md +1 -1
  152. package/dist/agent-src/skills/docx-authoring/evals/triggers.json +52 -0
  153. package/dist/agent-src/skills/emit-tickets/SKILL.md +2 -2
  154. package/dist/agent-src/skills/error-handling-patterns/SKILL.md +1 -1
  155. package/dist/agent-src/skills/estimate-ticket/SKILL.md +2 -2
  156. package/dist/agent-src/skills/evaluate-llm-feature/SKILL.md +0 -1
  157. package/dist/agent-src/skills/evaluate-llm-feature/evals/triggers.json +52 -0
  158. package/dist/agent-src/skills/existing-ui-audit/SKILL.md +21 -7
  159. package/dist/agent-src/skills/fe-design/SKILL.md +10 -0
  160. package/dist/agent-src/skills/feature-planning/SKILL.md +2 -2
  161. package/dist/agent-src/skills/finishing-a-development-branch/SKILL.md +3 -3
  162. package/dist/agent-src/skills/flux/SKILL.md +1 -1
  163. package/dist/agent-src/skills/frontend-render-security/SKILL.md +13 -13
  164. package/dist/agent-src/skills/git-workflow/SKILL.md +33 -33
  165. package/dist/agent-src/skills/grafana/SKILL.md +5 -0
  166. package/dist/agent-src/skills/humanizer/SKILL.md +83 -66
  167. package/dist/agent-src/skills/humanizer/data/patterns.md +14 -14
  168. package/dist/agent-src/skills/humanizer/references/anti-aiisms.md +4 -4
  169. package/dist/agent-src/skills/judge-artifact-completeness/SKILL.md +82 -37
  170. package/dist/agent-src/skills/judge-bug-hunter/SKILL.md +17 -5
  171. package/dist/agent-src/skills/judge-injection-defense/SKILL.md +63 -25
  172. package/dist/agent-src/skills/judge-security-auditor/SKILL.md +2 -0
  173. package/dist/agent-src/skills/judge-synthesis/SKILL.md +72 -28
  174. package/dist/agent-src/skills/laravel-horizon/SKILL.md +5 -0
  175. package/dist/agent-src/skills/laravel-mail/SKILL.md +5 -4
  176. package/dist/agent-src/skills/laravel-middleware/SKILL.md +5 -4
  177. package/dist/agent-src/skills/laravel-notifications/SKILL.md +10 -9
  178. package/dist/agent-src/skills/laravel-pennant/SKILL.md +1 -1
  179. package/dist/agent-src/skills/laravel-pulse/SKILL.md +9 -8
  180. package/dist/agent-src/skills/laravel-reverb/SKILL.md +6 -5
  181. package/dist/agent-src/skills/laravel-scheduling/SKILL.md +6 -1
  182. package/dist/agent-src/skills/laravel-validation/SKILL.md +12 -0
  183. package/dist/agent-src/skills/launch-readiness/SKILL.md +1 -1
  184. package/dist/agent-src/skills/learning-to-rule-or-skill/SKILL.md +7 -7
  185. package/dist/agent-src/skills/learning-tutor/SKILL.md +44 -43
  186. package/dist/agent-src/skills/learning-tutor/evals/triggers.json +52 -0
  187. package/dist/agent-src/skills/license-compliance-audit/SKILL.md +7 -7
  188. package/dist/agent-src/skills/license-compliance-borrow-check/SKILL.md +3 -3
  189. package/dist/agent-src/skills/license-compliance-credits/SKILL.md +4 -4
  190. package/dist/agent-src/skills/llm-provider-knowledge/SKILL.md +0 -1
  191. package/dist/agent-src/skills/memory-consolidation/SKILL.md +69 -64
  192. package/dist/agent-src/skills/motion-choreographer/SKILL.md +6 -6
  193. package/dist/agent-src/skills/pdf-tools/evals/triggers.json +52 -0
  194. package/dist/agent-src/skills/performance-analysis/SKILL.md +7 -3
  195. package/dist/agent-src/skills/persona-improvement/SKILL.md +0 -2
  196. package/dist/agent-src/skills/persona-improvement/evals/triggers.json +52 -0
  197. package/dist/agent-src/skills/php-coder/SKILL.md +10 -0
  198. package/dist/agent-src/skills/prediction-pool-optimizer/SKILL.md +129 -120
  199. package/dist/agent-src/skills/prediction-pool-optimizer/reference/ev-fixtures.md +36 -35
  200. package/dist/agent-src/skills/prediction-pool-optimizer/reference/odds-and-bonus.md +45 -41
  201. package/dist/agent-src/skills/project-analysis-core/SKILL.md +4 -4
  202. package/dist/agent-src/skills/project-analysis-hypothesis-driven/SKILL.md +3 -3
  203. package/dist/agent-src/skills/project-analysis-react/SKILL.md +1 -1
  204. package/dist/agent-src/skills/project-analysis-symfony/SKILL.md +1 -1
  205. package/dist/agent-src/skills/project-analysis-zend-laminas/SKILL.md +2 -2
  206. package/dist/agent-src/skills/prompt-engineering-patterns/SKILL.md +1 -1
  207. package/dist/agent-src/skills/prompt-validator/SKILL.md +39 -39
  208. package/dist/agent-src/skills/quality-tools/SKILL.md +15 -15
  209. package/dist/agent-src/skills/react-shadcn-ui/SKILL.md +55 -19
  210. package/dist/agent-src/skills/react-shadcn-ui/reference/registry.md +29 -27
  211. package/dist/agent-src/skills/readme-writing-package/SKILL.md +2 -2
  212. package/dist/agent-src/skills/reasoning-orchestrator/SKILL.md +25 -25
  213. package/dist/agent-src/skills/recursive-verification/SKILL.md +6 -5
  214. package/dist/agent-src/skills/refine-prompt/SKILL.md +1 -1
  215. package/dist/agent-src/skills/refine-ticket/SKILL.md +20 -2
  216. package/dist/agent-src/skills/repomix-packer/SKILL.md +1 -1
  217. package/dist/agent-src/skills/requesting-code-review/SKILL.md +2 -2
  218. package/dist/agent-src/skills/roadmap-management/SKILL.md +80 -66
  219. package/dist/agent-src/skills/roadmap-writing/SKILL.md +84 -77
  220. package/dist/agent-src/skills/rule-refactor/SKILL.md +1 -1
  221. package/dist/agent-src/skills/screenshot-hygiene/evals/triggers.json +52 -0
  222. package/dist/agent-src/skills/security-audit/SKILL.md +26 -9
  223. package/dist/agent-src/skills/security-maturity-assessment/SKILL.md +38 -16
  224. package/dist/agent-src/skills/skill-improvement-pipeline/SKILL.md +14 -11
  225. package/dist/agent-src/skills/skill-writing/SKILL.md +9 -8
  226. package/dist/agent-src/skills/song-to-script/SKILL.md +93 -85
  227. package/dist/agent-src/skills/sql-writing/SKILL.md +2 -2
  228. package/dist/agent-src/skills/stakeholder-tradeoff/SKILL.md +4 -3
  229. package/dist/agent-src/skills/standards-from-config/SKILL.md +61 -43
  230. package/dist/agent-src/skills/subagent-orchestration/SKILL.md +22 -8
  231. package/dist/agent-src/skills/subagent-orchestration/prompts/README.md +28 -2
  232. package/dist/agent-src/skills/supply-chain-intake/SKILL.md +13 -13
  233. package/dist/agent-src/skills/systematic-debugging/SKILL.md +22 -21
  234. package/dist/agent-src/skills/tailwind-engineer/SKILL.md +1 -1
  235. package/dist/agent-src/skills/technical-specification/SKILL.md +5 -0
  236. package/dist/agent-src/skills/terraform/SKILL.md +2 -2
  237. package/dist/agent-src/skills/terragrunt/SKILL.md +8 -8
  238. package/dist/agent-src/skills/testing-anti-patterns/process-anti-patterns.md +1 -1
  239. package/dist/agent-src/skills/threat-modeling/SKILL.md +19 -13
  240. package/dist/agent-src/skills/universal-project-analysis/SKILL.md +1 -1
  241. package/dist/agent-src/skills/upstream-contribute/SKILL.md +0 -1
  242. package/dist/agent-src/skills/using-git-worktrees/SKILL.md +9 -9
  243. package/dist/agent-src/skills/validate-feature-fit/SKILL.md +3 -1
  244. package/dist/agent-src/skills/verify-completion-evidence/SKILL.md +4 -6
  245. package/dist/agent-src/skills/verify-repair-loop/SKILL.md +67 -61
  246. package/dist/agent-src/skills/video-director/SKILL.md +7 -7
  247. package/dist/agent-src/skills/worktree-lifecycle/SKILL.md +3 -3
  248. package/dist/agent-src/templates/agents/agent-project-settings.example.yml +1 -1
  249. package/dist/agent-src/templates/contexts/knowledge-pages.md +47 -45
  250. package/dist/agent-src/templates/contexts/lesson-card.md +2 -2
  251. package/dist/agent-src/templates/contexts/tenant-boundaries.md +2 -2
  252. package/dist/agent-src/templates/contexts.md +1 -1
  253. package/dist/agent-src/templates/features.md +1 -1
  254. package/dist/agent-src/templates/roadmaps.md +125 -116
  255. package/dist/agent-src/templates/rule.md +2 -1
  256. package/dist/agent-src/templates/scripts/pr_risk_review.ts +0 -0
  257. package/dist/agent-src/templates/scripts/telemetry/aggregator.ts +0 -0
  258. package/dist/agent-src/templates/scripts/tier_usage_report.ts +2 -2
  259. package/dist/agent-src/templates/scripts/work_engine/directives/ui/apply.ts +30 -30
  260. package/dist/agent-src/templates/scripts/work_engine/directives/ui/design.ts +88 -33
  261. package/dist/agent-src/templates/scripts/work_engine/directives/ui/polish.ts +22 -2
  262. package/dist/agent-src/templates/scripts/work_engine/directives/ui/review.ts +21 -2
  263. package/dist/agent-src/templates/scripts/work_engine/directives/ui/stack_bundles.ts +179 -0
  264. package/dist/agent-src/templates/scripts/work_engine/stack/detect.ts +155 -4
  265. package/dist/agent-src/templates/scripts/work_engine/state.ts +21 -4
  266. package/dist/agent-src/user-types/README.md +8 -8
  267. package/dist/agent-src/user-types/galabau-field-crew.md +34 -33
  268. package/dist/agent-src/user-types/metalworking-shop.md +35 -34
  269. package/dist/agent-src/user-types/truck-driver.md +22 -20
  270. package/dist/cli/initRouting.js +74 -11
  271. package/dist/cli/initRouting.js.map +1 -1
  272. package/dist/cli/main.js +14 -3
  273. package/dist/cli/main.js.map +1 -1
  274. package/dist/cli/python/workspace_roles.js +2 -2
  275. package/dist/cli/python/workspace_roles.js.map +1 -1
  276. package/dist/cli-delegate/chunk-4SV3XGFA.js +6910 -0
  277. package/dist/cli-delegate/chunk-736JCWLM.js +1104 -0
  278. package/dist/cli-delegate/chunk-7DSAMZFU.js +356 -0
  279. package/dist/cli-delegate/chunk-7HQ52DHU.js +74 -0
  280. package/dist/cli-delegate/chunk-BJGXZNPM.js +266 -0
  281. package/dist/cli-delegate/chunk-FTAISGDQ.js +117 -0
  282. package/dist/cli-delegate/chunk-GME3Q44L.js +82 -0
  283. package/dist/cli-delegate/chunk-GRRPEPRN.js +336 -0
  284. package/dist/cli-delegate/chunk-HJ6DAJHR.js +502 -0
  285. package/dist/cli-delegate/chunk-IR7P7JWA.js +872 -0
  286. package/dist/cli-delegate/chunk-J55WI3RR.js +47 -0
  287. package/dist/cli-delegate/chunk-MCJYCQPF.js +35 -0
  288. package/dist/cli-delegate/chunk-NDJLNC6Q.js +169 -0
  289. package/dist/cli-delegate/chunk-OMIVVCG2.js +26 -0
  290. package/dist/cli-delegate/chunk-OY53J6II.js +7336 -0
  291. package/dist/cli-delegate/chunk-RDGRHAAB.js +259 -0
  292. package/dist/cli-delegate/chunk-TFG57JJM.js +1969 -0
  293. package/dist/cli-delegate/chunk-XX6TOPD7.js +715 -0
  294. package/dist/cli-delegate/chunk-YMFO6FDN.js +10603 -0
  295. package/dist/cli-delegate/cmd_analyze_session.js +294 -0
  296. package/dist/cli-delegate/cmd_conformance.js +646 -0
  297. package/dist/cli-delegate/cmd_converge.js +326 -0
  298. package/dist/cli-delegate/cmd_doctor.js +144 -0
  299. package/dist/cli-delegate/cmd_explain.js +2508 -0
  300. package/dist/cli-delegate/cmd_export.js +296 -0
  301. package/dist/cli-delegate/cmd_fleet.js +332 -0
  302. package/dist/cli-delegate/cmd_memory_get.js +3878 -0
  303. package/dist/cli-delegate/cmd_migrate.js +11 -0
  304. package/dist/cli-delegate/cmd_preflight.js +270 -0
  305. package/dist/cli-delegate/cmd_prune.js +444 -0
  306. package/dist/cli-delegate/cmd_refresh.js +28 -0
  307. package/dist/cli-delegate/cmd_settings_check.js +574 -0
  308. package/dist/cli-delegate/cmd_settings_migrate.js +223 -0
  309. package/dist/cli-delegate/cmd_sync.js +264 -0
  310. package/dist/cli-delegate/cmd_uninstall.js +656 -0
  311. package/dist/cli-delegate/cmd_update.js +425 -0
  312. package/dist/cli-delegate/cmd_upgrade.js +444 -0
  313. package/dist/cli-delegate/cmd_validate.js +305 -0
  314. package/dist/cli-delegate/cmd_versions.js +370 -0
  315. package/dist/discovery/deprecation-report.md +1 -1
  316. package/dist/discovery/discovery-manifest.json +100 -67
  317. package/dist/discovery/discovery-manifest.json.sha256 +1 -1
  318. package/dist/discovery/discovery-manifest.summary.md +4 -4
  319. package/dist/discovery/orphan-report.md +1 -1
  320. package/dist/discovery/packs.json +16 -10
  321. package/dist/discovery/trust-report.md +2 -2
  322. package/dist/discovery/workspaces.json +7 -5
  323. package/dist/hooks/dispatch.js +186 -12
  324. package/dist/install/emit_host_rules_cli.js +2 -1
  325. package/dist/install/emit_host_rules_cli.js.map +1 -1
  326. package/dist/install/install.mjs +418 -378
  327. package/dist/install/rule_scope.js +5 -1
  328. package/dist/install/rule_scope.js.map +1 -1
  329. package/dist/install/toolDetection.js +40 -12
  330. package/dist/install/toolDetection.js.map +1 -1
  331. package/dist/install/wizard-plan.js +2 -2
  332. package/dist/install/wizard-plan.js.map +1 -1
  333. package/dist/mcp/registry-manifest.json +3 -3
  334. package/dist/mcp/server.json +2 -2
  335. package/dist/mcp/server.mjs +2194 -1003
  336. package/dist/router.json +1 -1
  337. package/dist/scripts/_lib/compile_time_toggles.js +48 -0
  338. package/dist/scripts/_lib/compile_time_toggles.js.map +1 -0
  339. package/dist/scripts/condense.js +234 -217
  340. package/dist/scripts/condense.js.map +1 -1
  341. package/dist/server/schemas/settings.js +4 -0
  342. package/dist/server/schemas/settings.js.map +1 -1
  343. package/dist/shared/userMd/utils.js +30 -0
  344. package/dist/shared/userMd/utils.js.map +1 -1
  345. package/dist/ui/assets/index-BpSQt5vm.js.map +1 -1
  346. package/docs/guidelines/agent-infra/api-cost-levers.md +56 -5
  347. package/docs/guidelines/agent-infra/simplicity-and-goal-demos.md +93 -33
  348. package/package.json +4 -2
  349. package/src/agent-src/templates/scripts/pr_risk_review.ts +0 -0
  350. package/src/agent-src/templates/scripts/telemetry/aggregator.ts +0 -0
  351. package/src/agent-src/templates/scripts/tier_usage_report.ts +2 -2
  352. package/src/agent-src/templates/scripts/work_engine/directives/ui/apply.ts +30 -30
  353. package/src/agent-src/templates/scripts/work_engine/directives/ui/design.ts +88 -33
  354. package/src/agent-src/templates/scripts/work_engine/directives/ui/polish.ts +22 -2
  355. package/src/agent-src/templates/scripts/work_engine/directives/ui/review.ts +21 -2
  356. package/src/agent-src/templates/scripts/work_engine/directives/ui/stack_bundles.ts +179 -0
  357. package/src/agent-src/templates/scripts/work_engine/stack/detect.ts +155 -4
  358. package/src/agent-src/templates/scripts/work_engine/state.ts +21 -4
  359. package/src/config/agent-settings.template.yml +32 -2
  360. package/src/config/ci-local-parity.yml +142 -0
  361. package/src/config/discovery/packs.yml +7 -0
  362. package/src/config/evaluator-budgets.json +1 -1
  363. package/src/config/gate-coverage.yml +127 -0
  364. package/src/config/pack-size-budget.json +27 -0
  365. package/src/config/preamble-payload-budget.json +44 -0
  366. package/src/install/emit_host_rules_cli.ts +2 -1
  367. package/src/install/rule_scope.ts +5 -1
  368. package/src/install/toolDetection.ts +39 -8
  369. package/src/install/wizard-plan.ts +2 -2
  370. package/src/scripts/_cli/cmd_conformance.ts +2 -1
  371. package/src/scripts/_cli/cmd_converge.ts +2 -1
  372. package/src/scripts/_cli/cmd_doctor.ts +292 -15
  373. package/src/scripts/_cli/cmd_export.ts +2 -1
  374. package/src/scripts/_cli/cmd_fleet.ts +2 -1
  375. package/src/scripts/_cli/cmd_migrate.ts +2 -1
  376. package/src/scripts/_cli/cmd_preflight.ts +2 -1
  377. package/src/scripts/_cli/cmd_refresh.ts +2 -1
  378. package/src/scripts/_cli/cmd_update.ts +2 -1
  379. package/src/scripts/_cli/cmd_upgrade.ts +2 -1
  380. package/src/scripts/_cli/cmd_versions.ts +2 -1
  381. package/src/scripts/_cli/detection_report.ts +480 -0
  382. package/src/scripts/_dispatch.bash +52 -14
  383. package/src/scripts/_lib/agent_user_profile.ts +381 -0
  384. package/src/scripts/_lib/agents_overlay.ts +9 -0
  385. package/src/scripts/_lib/anchor_eval.ts +311 -0
  386. package/src/scripts/_lib/cc_transcript.ts +316 -0
  387. package/src/scripts/_lib/changelog_eras.ts +103 -9
  388. package/src/scripts/_lib/compile_time_toggles.ts +79 -0
  389. package/src/scripts/_lib/confusables.ts +101 -0
  390. package/src/scripts/_lib/duplicate_scope_census.ts +77 -0
  391. package/src/scripts/_lib/environment_detector.ts +441 -0
  392. package/src/scripts/_lib/managed_agents_folder.ts +181 -0
  393. package/src/scripts/_lib/package_root.ts +72 -0
  394. package/src/scripts/_lib/payload_hash_drift.ts +126 -0
  395. package/src/scripts/_lib/preservation_migration.ts +291 -0
  396. package/src/scripts/_lib/retrieval_sanitize.ts +166 -2
  397. package/src/scripts/_lib/scan_scope.ts +115 -0
  398. package/src/scripts/_lib/user_global_memory_audit.ts +187 -0
  399. package/src/scripts/_lib/user_global_observations.ts +830 -0
  400. package/src/scripts/_lib/user_global_revocations.ts +110 -0
  401. package/src/scripts/_lib/user_memory_gate_counters.ts +291 -0
  402. package/src/scripts/ai_council/blind_review.ts +0 -0
  403. package/src/scripts/ai_council/budget_guard.ts +90 -11
  404. package/src/scripts/ai_council/bundler.ts +2 -2
  405. package/src/scripts/ai_council/clients.ts +59 -3
  406. package/src/scripts/ai_council/config.ts +53 -7
  407. package/src/scripts/ai_council/modes.ts +68 -2
  408. package/src/scripts/ai_council/orchestrator.ts +54 -9
  409. package/src/scripts/ai_council/transport_resolver.ts +331 -0
  410. package/src/scripts/ai_team/team_dispatch.ts +17 -6
  411. package/src/scripts/anchor_eval_falsify.ts +198 -0
  412. package/src/scripts/anchor_scoring_run.ts +239 -0
  413. package/src/scripts/annotate_discovery.ts +1 -65
  414. package/src/scripts/bench_quality_run.ts +168 -4
  415. package/src/scripts/cache_realization_report.ts +782 -0
  416. package/src/scripts/check_artefact_count_messaging.ts +5 -1
  417. package/src/scripts/check_augment_description_cap.ts +15 -4
  418. package/src/scripts/check_bundle_path_leakage.ts +10 -4
  419. package/src/scripts/check_ci_local_parity.ts +317 -0
  420. package/src/scripts/check_condensation.ts +96 -191
  421. package/src/scripts/check_context_paths.ts +38 -9
  422. package/src/scripts/check_dependency_floors.ts +153 -0
  423. package/src/scripts/check_gate_coverage.ts +299 -0
  424. package/src/scripts/check_iron_law_prominence.ts +22 -1
  425. package/src/scripts/check_kernel_prefix_stability.ts +0 -0
  426. package/src/scripts/check_no_new_legacy_path.ts +16 -6
  427. package/src/scripts/check_no_roadmap_refs.ts +22 -9
  428. package/src/scripts/check_originality_freshness.ts +167 -0
  429. package/src/scripts/check_pack_size.ts +188 -0
  430. package/src/scripts/check_preamble_payload_budget.ts +130 -0
  431. package/src/scripts/check_proposal.ts +0 -0
  432. package/src/scripts/check_references.ts +0 -1
  433. package/src/scripts/check_safety_floor_untouched.ts +171 -24
  434. package/src/scripts/check_site_links.ts +62 -3
  435. package/src/scripts/ci_status.ts +0 -0
  436. package/src/scripts/cluster_near_miss_patterns.ts +0 -0
  437. package/src/scripts/code_graph/build.ts +0 -0
  438. package/src/scripts/command_suggester/types.ts +0 -0
  439. package/src/scripts/compile_router.ts +10 -14
  440. package/src/scripts/condense.sh +3 -4
  441. package/src/scripts/condense.ts +247 -228
  442. package/src/scripts/cost/track.mjs +168 -33
  443. package/src/scripts/cost_summary.ts +33 -1
  444. package/src/scripts/council_cli.ts +51 -5
  445. package/src/scripts/discovery_graph.ts +0 -0
  446. package/src/scripts/encoding_corpus.ts +500 -0
  447. package/src/scripts/encoding_corpus_report.ts +216 -0
  448. package/src/scripts/evaluator_umbrella.sh +34 -1
  449. package/src/scripts/generate_index.ts +19 -2
  450. package/src/scripts/install-hooks.sh +2 -2
  451. package/src/scripts/learning_sidecar.ts +0 -0
  452. package/src/scripts/lint_confusables.ts +10 -72
  453. package/src/scripts/lint_eval_fixture_citations.ts +113 -0
  454. package/src/scripts/lint_featured_skills.ts +0 -0
  455. package/src/scripts/lint_hidden_unicode.ts +208 -0
  456. package/src/scripts/lint_load_context.ts +17 -5
  457. package/src/scripts/lint_new_skill_gate.ts +9 -3
  458. package/src/scripts/lint_no_python_twin_rationale.ts +17 -2
  459. package/src/scripts/lint_originality.ts +1 -1
  460. package/src/scripts/lint_skill_originality.ts +1 -1
  461. package/src/scripts/lint_ticket_buildable.ts +1 -1
  462. package/src/scripts/lint_ui_stack_bundles.ts +170 -0
  463. package/src/scripts/mcp_server/tools.ts +4 -4
  464. package/src/scripts/measure_scope_dedup.ts +224 -0
  465. package/src/scripts/memory_lookup.ts +0 -0
  466. package/src/scripts/mine_session.ts +98 -0
  467. package/src/scripts/orchestration_payload_hash_drift.ts +145 -0
  468. package/src/scripts/preamble_byte_census.ts +574 -0
  469. package/src/scripts/probe_skill_registration.ts +2 -2
  470. package/src/scripts/redact_hook_capture.ts +13 -0
  471. package/src/scripts/release.ts +65 -10
  472. package/src/scripts/router_telemetry.ts +1 -1
  473. package/src/scripts/second_brain_retrieval.ts +14 -4
  474. package/src/scripts/skill_linter.ts +5 -0
  475. package/src/scripts/surface-tiers.yml +2 -0
  476. package/src/scripts/validate_pack_yaml.ts +0 -0
  477. package/src/server/schemas/settings.ts +8 -0
  478. package/src/shared/userMd/utils.ts +31 -0
  479. package/dist/agent-src/rules/telegraph-speak.md +0 -87
@@ -409,13 +409,97 @@ function _rstrip(text: string): string {
409
409
  return text.replace(/\s+$/u, '');
410
410
  }
411
411
 
412
+ /**
413
+ * Split a current-era body into (carry-over, archived) at `boundary`.
414
+ *
415
+ * The archive is named `pre-<boundary>`, so by its own contract it may only
416
+ * hold entries STRICTLY OLDER than the boundary. Sections at or above it —
417
+ * i.e. the incoming release's own entry, when it is already prepended — stay
418
+ * in the new era.
419
+ *
420
+ * On a fresh release run the body never contains the incoming entry (the split
421
+ * runs before the prepend), so the carry-over is empty and this is a no-op.
422
+ * On a `--resume` run the entry IS already committed and the bump step is
423
+ * correctly skipped, so without this partition the split archived the release
424
+ * it was named after and nothing ever put it back: the current era ended up
425
+ * empty and the `changelog-entry` CI gate went red. That is the 9.10.0
426
+ * failure. The partition makes the two orderings converge.
427
+ *
428
+ * Changelog bodies are newest-first, so the carry-over is a prefix — but the
429
+ * scan is per-heading rather than "stop at the first older one" so a
430
+ * hand-edited out-of-order body cannot silently archive a newer entry.
431
+ */
432
+ export function _partition_era_body(
433
+ body: readonly string[],
434
+ boundary: string,
435
+ ): { carry: string[]; archived: string[] } {
436
+ const b = _RELEASE_VERSION_RE.exec(boundary.trim());
437
+ if (!b) {
438
+ throw new Error(`not a bare semver (X.Y.Z): '${boundary}'`);
439
+ }
440
+ const bound: [number, number, number] = [
441
+ Number.parseInt(b[1]!, 10),
442
+ Number.parseInt(b[2]!, 10),
443
+ Number.parseInt(b[3]!, 10),
444
+ ];
445
+
446
+ // Section boundaries: every `## [X.Y.Z]` heading starts a new section.
447
+ // Content before the first heading (there should be none) rides along with
448
+ // the archive, matching the pre-fix behaviour for that shape.
449
+ const starts: number[] = [];
450
+ for (let i = 0; i < body.length; i++) {
451
+ if (VERSION_HEADING_RE.test(body[i]!)) {
452
+ starts.push(i);
453
+ }
454
+ }
455
+ if (starts.length === 0) {
456
+ return { carry: [], archived: [...body] };
457
+ }
458
+
459
+ const carry: string[] = [];
460
+ const archived: string[] = [...body.slice(0, starts[0]!)];
461
+ for (let s = 0; s < starts.length; s++) {
462
+ const from = starts[s]!;
463
+ const to = s + 1 < starts.length ? starts[s + 1]! : body.length;
464
+ const section = body.slice(from, to);
465
+ const m = VERSION_HEADING_RE.exec(body[from]!);
466
+ const v = m?.groups?.['version'];
467
+ const parsed = v ? _RELEASE_VERSION_RE.exec(v) : null;
468
+ if (parsed === null || parsed === undefined) {
469
+ archived.push(...section);
470
+ continue;
471
+ }
472
+ const cur: [number, number, number] = [
473
+ Number.parseInt(parsed[1]!, 10),
474
+ Number.parseInt(parsed[2]!, 10),
475
+ Number.parseInt(parsed[3]!, 10),
476
+ ];
477
+ const isOlder =
478
+ cur[0] < bound[0] ||
479
+ (cur[0] === bound[0] && cur[1] < bound[1]) ||
480
+ (cur[0] === bound[0] && cur[1] === bound[1] && cur[2] < bound[2]);
481
+ (isOlder ? archived : carry).push(...section);
482
+ }
483
+ return { carry, archived };
484
+ }
485
+
486
+ /** Drop trailing blank lines (in place semantics, returns the same array). */
487
+ function _trim_trailing_blanks(xs: string[]): string[] {
488
+ while (xs.length > 0 && xs[xs.length - 1]!.trim() === '') {
489
+ xs.pop();
490
+ }
491
+ return xs;
492
+ }
493
+
412
494
  /**
413
495
  * Execute `plan` against the on-disk CHANGELOG.md.
414
496
  *
415
497
  * - Refuses to overwrite an existing archive file.
416
- * - Moves every entry in the current era body into the new archive.
498
+ * - Moves every entry OLDER than the boundary into the new archive; an
499
+ * already-prepended entry for the incoming release stays in the new era
500
+ * (see `_partition_era_body`).
417
501
  * - Replaces the current era block with the collapsed pointer + the
418
- * freshly-labelled new current era header (empty body).
502
+ * freshly-labelled new current era header.
419
503
  */
420
504
  export function perform_split(plan: SplitPlan): void {
421
505
  if (fs.existsSync(plan.archive_path)) {
@@ -433,21 +517,31 @@ export function perform_split(plan: SplitPlan): void {
433
517
  }
434
518
 
435
519
  const [body_start, , next_era_line] = _era_body_bounds(lines, current_idx);
436
- const entries = lines.slice(body_start, next_era_line);
437
- // Trim trailing blank lines so the archive doesn't accumulate them.
438
- while (entries.length > 0 && entries[entries.length - 1]!.trim() === '') {
439
- entries.pop();
440
- }
520
+ const body = lines.slice(body_start, next_era_line);
521
+ // Entries at/above the boundary (a resume run's already-prepended release
522
+ // entry) stay in the new era; only older ones are archived.
523
+ const { carry, archived } = _partition_era_body(body, plan.boundary);
524
+ // Trim trailing blank lines so neither side accumulates them.
525
+ _trim_trailing_blanks(archived);
526
+ _trim_trailing_blanks(carry);
441
527
 
442
528
  const collapsed = _splitlines(_rstrip_newlines(collapsed_era_block(plan.boundary)));
443
529
  const new_era = _splitlines(_rstrip_newlines(new_era_intro_block(plan.new_era_label, plan.boundary)));
444
530
 
445
531
  const head = lines.slice(0, current_idx);
446
532
  const tail = lines.slice(next_era_line);
447
- const new_lines = [...head, ...collapsed, '', ...new_era, '', ...tail];
533
+ const new_lines = [
534
+ ...head,
535
+ ...collapsed,
536
+ '',
537
+ ...new_era,
538
+ '',
539
+ ...(carry.length > 0 ? [...carry, ''] : []),
540
+ ...tail,
541
+ ];
448
542
  const new_text = _rstrip(new_lines.join('\n')) + '\n';
449
543
 
450
- const archive_body = entries.length > 0 ? _rstrip(entries.join('\n')) + '\n' : '';
544
+ const archive_body = archived.length > 0 ? _rstrip(archived.join('\n')) + '\n' : '';
451
545
  const archive_text = archive_file_header(plan.boundary) + archive_body;
452
546
 
453
547
  fs.mkdirSync(path.dirname(plan.archive_path), { recursive: true });
@@ -0,0 +1,79 @@
1
+ /**
2
+ * Compile-time rule toggles — the single definition, shared by the router compiler
3
+ * and the projector.
4
+ *
5
+ * WHY THIS FILE EXISTS
6
+ * --------------------
7
+ * The map used to live only in `compile_router.ts`, which meant a disabled rule was
8
+ * dropped from `dist/router.json` while its **body still shipped** as a file in
9
+ * `dist/agent-src/rules/` (and through the `.claude/rules/` symlink). ADR
10
+ * `telegraph/0002` originally claimed that flipping the toggle gave "zero-cost
11
+ * dormancy". That was measured and found half wrong on 2026-07-29: the router entry
12
+ * governs *trigger-routing*; **file existence governs always-loaded injection**, and
13
+ * the host reads the file — a maintainer session's context listed the body verbatim
14
+ * as "project instructions", never having consulted the router.
15
+ *
16
+ * Two surfaces, one switch. Sharing the definition is what lets the projector honour
17
+ * it, so `speak: false` means what the ADR assumed instead of the ADR being weakened
18
+ * to match a partial implementation.
19
+ */
20
+
21
+ /**
22
+ * HOW A RULE GETS HERE — the dormancy routing (road-to-cache-economy Phase 3)
23
+ * --------------------------------------------------------------------------
24
+ * A rule body is re-written on EVERY subagent spawn, so an always-loaded rule
25
+ * that is not earning its keep is paid per spawn, not once. That makes "should
26
+ * this rule be dormant?" a real question — and this map is the ONLY place the
27
+ * answer may land. The route, in order:
28
+ *
29
+ * 1. **Candidate** — `preamble_byte_census` ranks always-loaded rules by
30
+ * per-spawn token cost (`--top`). A candidate is a number, never an
31
+ * impression: telegraph-speak was ~982 tokens.
32
+ * 2. **Evidence** — the same bar telegraph-speak had to clear: an output-side
33
+ * bench showing the rule does not pay for itself, judged against the
34
+ * kill-criterion, BEFORE dormancy. A preference is not evidence, and
35
+ * "it looks verbose" is not a measurement.
36
+ * 3. **Landing** — a new entry in the map below, keyed on a real setting the
37
+ * consumer can flip back. Never a fifth toggle axis: this predicate already
38
+ * has four consumers (the router compiler, the dist writer, `check_sync`,
39
+ * and the per-tool symlink generator), and a rule wired into three of four
40
+ * is how the last attempt blocked its own push.
41
+ *
42
+ * What is explicitly NOT this route: dropping a rule from the router while its
43
+ * body still ships (that was the measured half-truth this file exists to fix),
44
+ * and gating bodies behind triggers wholesale — that is thin projection, which
45
+ * failed a 48% quality floor at 36.2% and stays disabled.
46
+ */
47
+
48
+ /** Loose settings shape — the toggles only ever read nested plain objects. */
49
+ export type ToggleSettings = Record<string, unknown>;
50
+
51
+ /** rule-id → predicate. A rule is emitted (router AND projection) only when its
52
+ * predicate returns true. A rule absent from this map is always emitted. */
53
+ export const COMPILE_TIME_TOGGLES: Record<string, (s: ToggleSettings) => boolean> = {
54
+ // `speak` defaults FALSE (dormant) per docs/adrs/telegraph/0002 — the absent-key
55
+ // fallback used to be `true`, which silently contradicted ADR 0001 (accepted,
56
+ // "default off until bench"). Measured basis: median vs_terse −9.27% (API) /
57
+ // −5.47% (exact cl100k_base) — telegraph emits MORE than a plain "be terse".
58
+ // Opt back in with an explicit `telegraph.speak: true` once an output-side bench
59
+ // clears the kill-criterion bar. `enabled` keeps its true default: it is the
60
+ // family master switch, and flipping it would silence sibling telegraph settings
61
+ // that were never measured negative.
62
+ //
63
+ // This predicate deliberately does NOT read `speak_scope`. That key disables the
64
+ // rule's *behaviour* and never removed its token cost — the trap the measurement
65
+ // exposed.
66
+ 'telegraph-speak': (s: ToggleSettings): boolean => {
67
+ const tg = (s['telegraph'] as ToggleSettings | undefined) ?? {};
68
+ const enabled = tg['enabled'] === undefined ? true : tg['enabled'];
69
+ const speak = tg['speak'] === undefined ? false : tg['speak'];
70
+ return Boolean(enabled) && Boolean(speak);
71
+ },
72
+ };
73
+
74
+ /** True when the rule may be emitted. Unknown ids are always emitted — the map is an
75
+ * opt-in list of gated rules, never an allowlist of permitted ones. */
76
+ export function rule_is_compile_enabled(rule_id: string, settings: ToggleSettings): boolean {
77
+ const predicate = COMPILE_TIME_TOGGLES[rule_id];
78
+ return predicate === undefined ? true : predicate(settings);
79
+ }
@@ -0,0 +1,101 @@
1
+ /**
2
+ * Visible mixed-script confusable signature — the ONE definition in the tree.
3
+ *
4
+ * Extracted from `lint_confusables.ts` so the authoring-time linter and the
5
+ * runtime encoding scanner share one table and one decision rule
6
+ * (road-to-runtime-encoding-hardening Phase 3). Two copies of a confusable set
7
+ * is exactly the drift this extraction prevents: a codepoint added to one and
8
+ * not the other means the two surfaces disagree about what a homoglyph is.
9
+ *
10
+ * The dependency direction matters. This module imports NOTHING — no `fs`, no
11
+ * lint framework — so the runtime retrieval path can use it without pulling the
12
+ * authoring-time lint infrastructure into a request.
13
+ */
14
+
15
+ /** A token needs this many letters before the signature can fire. */
16
+ export const MIN_LETTERS = 3;
17
+
18
+ // Unicode-script classifiers via property escapes (requires the `u` flag).
19
+ const _LATIN = /\p{Script=Latin}/u;
20
+ const _CYRILLIC = /\p{Script=Cyrillic}/u;
21
+ const _GREEK = /\p{Script=Greek}/u;
22
+ const _LETTER = /\p{L}/u;
23
+
24
+ /** A "token" is a maximal run of letters / combining marks / decimal digits. */
25
+ export const TOKEN_RE = /[\p{L}\p{M}\p{Nd}]+/gu;
26
+
27
+ /**
28
+ * Cyrillic + Greek codepoints that have a basic-Latin lookalike (Unicode TR39
29
+ * confusables, common subset). A foreign letter only counts toward the
30
+ * confusable signal when it is in this set — Greek math operators with no Latin
31
+ * twin (Δ Σ Π Ω Φ Θ Λ Ξ Ψ Γ δ π ω …) are deliberately excluded so legit
32
+ * notation does not false-positive.
33
+ */
34
+ export const CONFUSABLE_FOREIGN: ReadonlySet<number> = new Set([
35
+ // Cyrillic lowercase ↔ Latin
36
+ 0x0430 /*а→a*/, 0x0435 /*е→e*/, 0x043e /*о→o*/, 0x0440 /*р→p*/, 0x0441 /*с→c*/,
37
+ 0x0443 /*у→y*/, 0x0445 /*х→x*/, 0x0455 /*ѕ→s*/, 0x0456 /*і→i*/, 0x0458 /*ј→j*/,
38
+ 0x04bb /*һ→h*/, 0x0501 /*ԁ→d*/, 0x051b /*ԛ→q*/, 0x0577 /*no*/,
39
+ // Cyrillic uppercase ↔ Latin
40
+ 0x0410 /*А→A*/, 0x0412 /*В→B*/, 0x0415 /*Е→E*/, 0x041a /*К→K*/, 0x041c /*М→M*/,
41
+ 0x041d /*Н→H*/, 0x041e /*О→O*/, 0x0420 /*Р→P*/, 0x0421 /*С→C*/, 0x0422 /*Т→T*/,
42
+ 0x0423 /*У→Y*/, 0x0425 /*Х→X*/, 0x0405 /*Ѕ→S*/, 0x0406 /*І→I*/, 0x0408 /*Ј→J*/,
43
+ // Greek lowercase ↔ Latin
44
+ 0x03b1 /*α→a*/, 0x03b5 /*ε→e*/, 0x03bf /*ο→o*/, 0x03bd /*ν→v*/, 0x03c1 /*ρ→p*/,
45
+ 0x03c5 /*υ→u*/, 0x03c7 /*χ→x*/, 0x03ba /*κ→k*/,
46
+ // Greek uppercase ↔ Latin (only those with a real Latin twin)
47
+ 0x0391 /*Α→A*/, 0x0392 /*Β→B*/, 0x0395 /*Ε→E*/, 0x0396 /*Ζ→Z*/, 0x0397 /*Η→H*/,
48
+ 0x0399 /*Ι→I*/, 0x039a /*Κ→K*/, 0x039c /*Μ→M*/, 0x039d /*Ν→N*/, 0x039f /*Ο→O*/,
49
+ 0x03a1 /*Ρ→P*/, 0x03a4 /*Τ→T*/, 0x03a5 /*Υ→Y*/, 0x03a7 /*Χ→X*/, 0x0392 /*Β→B*/,
50
+ ]);
51
+
52
+ type ScriptName = 'latin' | 'cyrillic' | 'greek' | 'other';
53
+
54
+ function _script_of(ch: string): ScriptName {
55
+ if (_LATIN.test(ch)) return 'latin';
56
+ if (_CYRILLIC.test(ch)) return 'cyrillic';
57
+ if (_GREEK.test(ch)) return 'greek';
58
+ return 'other';
59
+ }
60
+
61
+ /**
62
+ * Classify a single token. Returns the offending mixed-script descriptor when
63
+ * the token matches the homoglyph signature, else null.
64
+ *
65
+ * The containment rules are the load-bearing part, and they are why this is one
66
+ * shared function rather than two similar ones: a Latin-majority token with at
67
+ * least one TR39-confusable foreign letter is the signal; a single-script token
68
+ * (a genuine Cyrillic or Greek word) is not; and a token whose foreign letters
69
+ * outnumber its Latin ones is a foreign word, not an attack.
70
+ */
71
+ export function classifyToken(token: string): string | null {
72
+ let latin = 0;
73
+ let cyrillic = 0;
74
+ let greek = 0;
75
+ let letters = 0;
76
+ for (const ch of token) {
77
+ if (!_LETTER.test(ch)) continue; // skip combining marks / digits for script vote
78
+ letters += 1;
79
+ const script = _script_of(ch);
80
+ if (script === 'latin') {
81
+ latin += 1;
82
+ } else if (script === 'cyrillic' || script === 'greek') {
83
+ // Only confusable foreign letters (TR39) count — math operators with
84
+ // no Latin twin are ignored, so legit notation never trips.
85
+ if (CONFUSABLE_FOREIGN.has(ch.codePointAt(0) as number)) {
86
+ if (script === 'cyrillic') cyrillic += 1;
87
+ else greek += 1;
88
+ }
89
+ }
90
+ }
91
+ if (letters < MIN_LETTERS) return null;
92
+ const foreign = cyrillic + greek;
93
+ if (latin === 0 || foreign === 0) return null; // single-script (or no Latin) → legit
94
+ if (latin <= foreign) return null; // majority must be Latin (foreign word ≠ attack)
95
+ const which = cyrillic > 0 && greek > 0
96
+ ? 'cyrillic+greek'
97
+ : cyrillic > 0
98
+ ? 'cyrillic'
99
+ : 'greek';
100
+ return `latin+${which} (${latin} latin / ${foreign} foreign-confusable)`;
101
+ }
@@ -0,0 +1,77 @@
1
+ /**
2
+ * Duplicate-scope rule census — the shared byte-comparison primitive behind
3
+ * both C-2 (`cache_realization_report.ts`'s `computeDuplicateScope`, which
4
+ * turns this into a share of subagent write volume) and the `doctor`
5
+ * `duplicate-scope-rules` health check (`_cli/cmd_doctor.ts`), so the two
6
+ * surfaces can never drift on what counts as "shared" or how a redundant
7
+ * copy's size is estimated.
8
+ *
9
+ * `road-to-cache-economy.md` Phase 3: the same 110 rule
10
+ * filenames observed at both `~/.claude/rules` (user scope) and
11
+ * `dist/agent-src/rules` (project scope) on this maintainer's own checkout —
12
+ * C-2 confirmed at 38.5% of subagent write volume. This module answers only
13
+ * "which filenames are shared, and how many redundant bytes do they cost" —
14
+ * the write-volume share and the doctor warning are each computed by their
15
+ * own caller from this raw census.
16
+ *
17
+ * Detection only. Never deletes, never rewrites a user's file — see
18
+ * `non-destructive-by-default`.
19
+ */
20
+ import * as fs from 'node:fs';
21
+ import * as path from 'node:path';
22
+
23
+ export interface DuplicateScopeCensus {
24
+ evaluable: boolean;
25
+ reason?: string | undefined;
26
+ /** `.md` basenames present in BOTH directories, sorted. */
27
+ shared_filenames: string[];
28
+ /** Σ min(userBytes, projectBytes) over shared filenames — the conservative
29
+ * estimate of the redundant copy (the roadmap's byte census found the two
30
+ * scopes near-identical in size, so the min/max choice rarely matters). */
31
+ duplicate_chars: number;
32
+ }
33
+
34
+ /**
35
+ * For every `.md` filename present in BOTH `userRulesDir` and
36
+ * `projectRulesDir`, the redundant copy is estimated as the SMALLER of the
37
+ * two files' byte sizes, summed across all shared filenames.
38
+ */
39
+ export function censusDuplicateScope(userRulesDir: string, projectRulesDir: string): DuplicateScopeCensus {
40
+ if (!fs.existsSync(userRulesDir) || !fs.existsSync(projectRulesDir)) {
41
+ return {
42
+ evaluable: false,
43
+ reason: `one or both rule directories are missing (user: ${userRulesDir}, project: ${projectRulesDir})`,
44
+ shared_filenames: [],
45
+ duplicate_chars: 0,
46
+ };
47
+ }
48
+
49
+ const userFiles = new Set(fs.readdirSync(userRulesDir).filter((f) => f.endsWith('.md')));
50
+ const projectFiles = fs.readdirSync(projectRulesDir).filter((f) => f.endsWith('.md'));
51
+
52
+ const shared: string[] = [];
53
+ let duplicateChars = 0;
54
+ for (const f of projectFiles) {
55
+ if (!userFiles.has(f)) continue;
56
+ shared.push(f);
57
+ const a = fs.statSync(path.join(userRulesDir, f)).size;
58
+ const b = fs.statSync(path.join(projectRulesDir, f)).size;
59
+ duplicateChars += Math.min(a, b);
60
+ }
61
+ shared.sort();
62
+
63
+ if (shared.length === 0) {
64
+ return {
65
+ evaluable: false,
66
+ reason: 'no shared .md filenames between the two rule scopes — this checkout has no duplicate-scope install',
67
+ shared_filenames: [],
68
+ duplicate_chars: 0,
69
+ };
70
+ }
71
+
72
+ return {
73
+ evaluable: true,
74
+ shared_filenames: shared,
75
+ duplicate_chars: duplicateChars,
76
+ };
77
+ }