@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
@@ -1,17 +1,18 @@
1
1
  #!/usr/bin/env tsx
2
2
  /**
3
- * Agent-config sync — condense .agent-src.uncondensed/ → dist/agent-src/
3
+ * Agent-config sync — project the artefact roots under src/ → dist/agent-src/
4
4
  * and project dist/agent-src/ → .augment/ (copies for rules by default,
5
5
  * symlinks for the rest; opt into rule symlinks via
6
6
  * augment.rules_use_symlinks in .agent-settings.yml).
7
7
  *
8
8
  * Ported from the retired Python `src/scripts/condense.py` (ADR-200 — Python→TS
9
- * migration, Phase 5). Mirrors the Python CLI surface EXACTLY — every
10
- * subcommand (`--sync`, `--list`, `--changed`, `--check`, `--check-hashes`,
11
- * `--clean-hashes`, `--mark-done <path>`, `--mark-all-done`,
12
- * `--generate-tools`, `--clean-tools`, `--project-augment`) — same flags,
13
- * exit codes, stdout/stderr split, byte-identical messages. No behaviour
14
- * changes; historical quirks preserved and flagged.
9
+ * migration, Phase 5), which mirrored the Python CLI surface exactly.
10
+ * ADR-201 then narrowed it: `.md` is copied verbatim + path-rewritten instead of
11
+ * rewritten by an agent, so the condensation-hash cache and its subcommands
12
+ * (`--check-hashes`, `--clean-hashes`, `--mark-done`, `--mark-all-done`) are gone —
13
+ * staleness is read off the projection itself. Remaining surface: `--sync`,
14
+ * `--list`, `--changed`, `--check`, `--generate-tools`, `--clean-tools`,
15
+ * `--project-augment`.
15
16
  *
16
17
  * Path handling note: the retired Python implementation uses `pathlib.Path` objects.
17
18
  * This twin uses absolute path strings (the host filesystem on the
@@ -22,11 +23,11 @@
22
23
  * multi-root helper functions (iter_all_sources, resolve_logical,
23
24
  * artefact_roots) are exposed through a mutable module-state object so the
24
25
  * pytest suite's monkeypatch pattern — reassigning `condense.PROJECT_ROOT`,
25
- * `condense.HASH_FILE`, `condense.iter_all_sources`, … — has a faithful TS
26
+ * `condense.TARGET_DIR`, `condense.iter_all_sources`, … — has a faithful TS
26
27
  * equivalent. Tests mutate `MODULE_STATE` via the exported setters.
27
28
  */
28
- import * as crypto from 'node:crypto';
29
29
  import * as fs from 'node:fs';
30
+ import * as os from 'node:os';
30
31
  import * as path from 'node:path';
31
32
  import { fileURLToPath, pathToFileURL } from 'node:url';
32
33
  import * as YAML from 'yaml';
@@ -34,6 +35,7 @@ import { artefact_roots as _agent_src_artefact_roots, iter_all_sources as _agent
34
35
  import { build_claude_hook_matrix } from './_lib/claude_settings_hooks.js';
35
36
  import { is_claude_builtin_name } from './_lib/claude_builtin_names.js';
36
37
  import { project_settings_path, load_agent_settings } from './_lib/agent_settings.js';
38
+ import { rule_is_compile_enabled } from './_lib/compile_time_toggles.js';
37
39
  import { info, success, flush_summary, resolve_level } from './_lib/script_output.js';
38
40
  import { TIER_TO_CLAUDE_MODEL as _TIER_TO_CLAUDE_MODEL, MODEL_TIER_RE as _MODEL_TIER_RE, } from './_lib/model_tier.js';
39
41
  // The Python module imports `_SLUG_PREFIX_RE` from `_lib.agent_src`. The TS
@@ -201,7 +203,7 @@ function _stripChars(s, chars) {
201
203
  // =============================================================================
202
204
  // Module state — mutable mirror of the Python module-level constants & hooks.
203
205
  //
204
- // The pytest suite reassigns `condense.PROJECT_ROOT`, `condense.HASH_FILE`,
206
+ // The pytest suite reassigns `condense.PROJECT_ROOT`, `condense.TARGET_DIR`,
205
207
  // `condense.TARGET_DIR`, `condense.SOURCE_DIR`, `condense.RULES_SOURCE`,
206
208
  // `condense.SKILLS_SOURCE`, `condense.COMMANDS_SOURCE`,
207
209
  // `condense.CLAUDE_SKILLS_DIR`, `condense.AUGMENT_DIR`, `condense.SETTINGS_FILE`,
@@ -221,7 +223,6 @@ function _deriveState(root) {
221
223
  SOURCE_DIR: path.join(root, '.agent-src.uncondensed'),
222
224
  TARGET_DIR: path.join(root, 'dist/agent-src'),
223
225
  AUGMENT_DIR: path.join(root, '.augment'),
224
- HASH_FILE: path.join(root, 'internal', '.condensation-hashes.json'),
225
226
  SETTINGS_FILE: project_settings_path(root),
226
227
  RULES_SOURCE: path.join(root, 'dist/agent-src', 'rules'),
227
228
  SKILLS_SOURCE: path.join(root, 'dist/agent-src', 'skills'),
@@ -334,118 +335,100 @@ function _read_augment_rules_use_symlinks() {
334
335
  }
335
336
  return false;
336
337
  }
337
- function _lean_projection_mode() {
338
+ /**
339
+ * Per-tool user-scope rule directory, for the scope-dedup below. Only tools
340
+ * whose host reads a user-scope rules directory can have a redundant twin;
341
+ * everything else has nothing to de-duplicate against.
342
+ */
343
+ const USER_SCOPE_RULE_DIRS = {
344
+ '.claude/rules': path.join('.claude', 'rules'),
345
+ };
346
+ function _read_projection_scope_dedup() {
338
347
  const data = load_agent_settings({ project_path: MODULE_STATE.SETTINGS_FILE });
339
- const lean = data['lean_projection'];
340
- if (typeof lean === 'object' &&
341
- lean !== null &&
342
- !Array.isArray(lean) &&
343
- String(lean['mode'] ?? '')
344
- .trim()
345
- .toLowerCase() === 'thin') {
346
- return 'thin';
348
+ const projection = data['projection'];
349
+ if (typeof projection !== 'object' || projection === null || Array.isArray(projection)) {
350
+ return false;
347
351
  }
348
- return 'eager-all';
349
- }
350
- // --- hashing -----------------------------------------------------------------
351
- export function file_hash(filepath) {
352
- const h = crypto.createHash('sha256');
353
- h.update(fs.readFileSync(filepath));
354
- return h.digest('hex');
355
- }
356
- const _DEP_FRONTMATTER_KEYS = ['skills', 'rules'];
357
- function _slug_to_logical(slug) {
358
- for (const cand of [`skills/${slug}/SKILL.md`, `rules/${slug}.md`]) {
359
- if (_resolve_source(cand) !== null) {
360
- return cand;
361
- }
352
+ const value = projection['scope_dedup'];
353
+ if (typeof value === 'boolean') {
354
+ return value;
362
355
  }
363
- return null;
364
- }
365
- function _direct_includes(relative) {
366
- const source = _resolve_source(relative);
367
- if (source === null) {
368
- return [];
356
+ if (typeof value === 'string') {
357
+ return ['true', 'yes', 'on', '1'].includes(value.trim().toLowerCase());
369
358
  }
370
- let meta;
359
+ return false;
360
+ }
361
+ /**
362
+ * Rules whose user-scope twin is BYTE-IDENTICAL to the source, i.e. safe to
363
+ * skip at project scope: the host still loads the same text, once instead of
364
+ * twice, so nothing the model sees changes.
365
+ *
366
+ * Byte-identity is the whole safety argument and is not negotiable. Keying on
367
+ * the filename alone would silently let a stale globally-installed copy win
368
+ * whenever the two scopes hold different versions — which is the NORMAL state
369
+ * while developing the package (measured: 110/110 shared filenames differing in
370
+ * bytes). This is deliberately not the thin-projection mechanism: no rule
371
+ * becomes trigger-gated, so the quality floor that disabled thin projection
372
+ * does not apply here.
373
+ */
374
+ function _dedupable_rules(tool_dir, rules, userHome) {
375
+ const relative = USER_SCOPE_RULE_DIRS[tool_dir];
376
+ if (relative === undefined) {
377
+ return new Set();
378
+ }
379
+ // A hostile or simply absent $HOME must make the dedup inert, not
380
+ // adventurous. In a container `$HOME` is often unset (so `homedir()` can
381
+ // resolve to `/`) or world-writable, and this function decides which rules
382
+ // to STOP emitting — reading an unexpected tree there is how a projection
383
+ // silently loses a rule. Council review of PR #1055 raised exactly this.
384
+ let userDirStat;
385
+ const userDir = path.join(userHome, relative);
371
386
  try {
372
- [meta] = _parse_frontmatter(_readText(source));
387
+ userDirStat = fs.statSync(userDir);
373
388
  }
374
389
  catch {
375
- return [];
390
+ return new Set();
376
391
  }
377
- const deps = [];
378
- for (const key of _DEP_FRONTMATTER_KEYS) {
379
- const value = meta[key];
380
- if (!Array.isArray(value)) {
381
- continue;
382
- }
383
- for (const item of value) {
384
- if (typeof item !== 'string') {
385
- continue;
386
- }
387
- const logical = _slug_to_logical(item.trim());
388
- if (logical !== null && logical !== relative) {
389
- deps.push(logical);
390
- }
391
- }
392
+ if (!userDirStat.isDirectory()) {
393
+ return new Set();
392
394
  }
393
- return deps;
394
- }
395
- export function effective_hash(relative, _seen = null) {
396
- const source = _resolve_source(relative);
397
- if (source === null) {
398
- return '';
399
- }
400
- const own = file_hash(source);
401
- if (_seen !== null && _seen.has(relative)) {
402
- return own; // cycle — fold own content only
395
+ // World-writable user scope: anyone on the box could plant a byte-identical
396
+ // twin and thereby delete a rule from the project projection. Refuse.
397
+ if ((userDirStat.mode & 0o002) !== 0) {
398
+ _print(` ⚠️ ${tool_dir}: user-scope rules dir is world-writable — scope-dedup skipped`);
399
+ return new Set();
403
400
  }
404
- const deps = [...new Set(_direct_includes(relative))].sort((a, b) => a < b ? -1 : a > b ? 1 : 0);
405
- if (deps.length === 0) {
406
- return own; // leaf — identical to plain file_hash
407
- }
408
- const seenNext = new Set(_seen ?? []);
409
- seenNext.add(relative);
410
- const parts = [own, ...deps.map((dep) => effective_hash(dep, seenNext))];
411
- return crypto.createHash('sha256').update(parts.join('\n'), 'utf-8').digest('hex');
412
- }
413
- export function load_hashes() {
414
- if (_exists(MODULE_STATE.HASH_FILE)) {
401
+ const skip = new Set();
402
+ for (const rule of rules) {
403
+ const twin = path.join(userDir, rule);
404
+ const source = path.join(MODULE_STATE.RULES_SOURCE, rule);
415
405
  try {
416
- return JSON.parse(_readText(MODULE_STATE.HASH_FILE));
406
+ if (!_isFile(twin) || !_isFile(source))
407
+ continue;
408
+ if (fs.readFileSync(twin).equals(fs.readFileSync(source))) {
409
+ skip.add(rule);
410
+ }
417
411
  }
418
412
  catch {
419
- return {};
413
+ // An unreadable twin is simply not de-duplicable — emit the project copy.
420
414
  }
421
415
  }
422
- return {};
423
- }
424
- export function save_hashes(hashes) {
425
- _mkdirp(path.dirname(MODULE_STATE.HASH_FILE));
426
- _writeText(MODULE_STATE.HASH_FILE, _jsonDumpsSorted(hashes) + '\n');
416
+ return skip;
427
417
  }
428
- /** Mirror json.dumps(obj, indent=2, sort_keys=True) for a flat string map. */
429
- function _jsonDumpsSorted(obj) {
430
- const keys = Object.keys(obj).sort((a, b) => (a < b ? -1 : a > b ? 1 : 0));
431
- if (keys.length === 0) {
432
- return '{}';
433
- }
434
- const lines = keys.map((k) => ` ${JSON.stringify(k)}: ${JSON.stringify(obj[k])}`);
435
- return `{\n${lines.join(',\n')}\n}`;
436
- }
437
- export function mark_done(relative_path) {
438
- const source_file = _resolve_source(relative_path);
439
- if (source_file === null || !_exists(source_file)) {
440
- _print(`❌ Source file not found: ${relative_path}`);
441
- process.exit(1);
418
+ function _lean_projection_mode() {
419
+ const data = load_agent_settings({ project_path: MODULE_STATE.SETTINGS_FILE });
420
+ const lean = data['lean_projection'];
421
+ if (typeof lean === 'object' &&
422
+ lean !== null &&
423
+ !Array.isArray(lean) &&
424
+ String(lean['mode'] ?? '')
425
+ .trim()
426
+ .toLowerCase() === 'thin') {
427
+ return 'thin';
442
428
  }
443
- apply_path_rewriter(relative_path);
444
- const hashes = load_hashes();
445
- hashes[relative_path] = effective_hash(relative_path);
446
- save_hashes(hashes);
447
- _print(`✅ Marked as condensed: ${relative_path}`);
429
+ return 'eager-all';
448
430
  }
431
+ // --- hashing -----------------------------------------------------------------
449
432
  export function apply_path_rewriter(relative_path) {
450
433
  const target = path.join(MODULE_STATE.TARGET_DIR, relative_path);
451
434
  if (!_exists(target) || !relative_path.endsWith('.md')) {
@@ -459,57 +442,63 @@ export function apply_path_rewriter(relative_path) {
459
442
  _writeText(target, rewritten);
460
443
  return true;
461
444
  }
462
- export function mark_all_done() {
463
- const hashes = load_hashes();
464
- let count = 0;
465
- for (const [source_file, relative] of _iter_sources()) {
466
- if (!should_condense(source_file)) {
467
- continue;
468
- }
469
- hashes[relative] = effective_hash(relative);
470
- count += 1;
445
+ /**
446
+ * Whether the projection of `relative` is out of date.
447
+ *
448
+ * Post-ADR-201 the projection IS `rewrite(source)` — a pure function of the
449
+ * source's own bytes and its own relative path. So staleness is *observable in
450
+ * the output* rather than inferred from a stored source hash, which is both
451
+ * simpler and strictly stronger: the old hash cache could only tell you the
452
+ * source had moved since someone last claimed to have condensed it. It never
453
+ * looked at dist, so a hand-edited or half-written projection read as current.
454
+ *
455
+ * The dropped dependency-folding (`effective_hash` mixed in the hashes of
456
+ * `skills:` / `rules:` frontmatter deps) has no counterpart here, and needs
457
+ * none: an LLM rewrite could be influenced by a dependency's content, a pure
458
+ * rewrite cannot. Probed rather than assumed — the whole rewriter chain
459
+ * (`_depth_prefix`, `_split_frontmatter`, `_rewrite_body_links`,
460
+ * `_rewrite_frontmatter_lines`, `_parse_trust_and_owner`,
461
+ * `_inject_hrr_banner`) touches no file but its own input.
462
+ */
463
+ export function is_projection_stale(relative) {
464
+ const source = _resolve_source(relative);
465
+ if (source === null) {
466
+ // No source at all — a leftover in dist. `check_sync` owns that verdict.
467
+ return false;
468
+ }
469
+ if (skip_compile_disabled_rule(relative)) {
470
+ // Deliberately absent from the projection, not out of date.
471
+ return false;
471
472
  }
472
- save_hashes(hashes);
473
- _print(`✅ Marked ${count} files as condensed`);
473
+ const target = path.join(MODULE_STATE.TARGET_DIR, relative);
474
+ if (!_exists(target)) {
475
+ return true; // never projected
476
+ }
477
+ return _readText(target) !== _rewrite_paths(_readText(source), relative);
474
478
  }
475
479
  export function list_changed_md(_source_dir) {
476
480
  // _source_dir retained for signature compatibility but ignored (multi-root).
477
- const hashes = load_hashes();
478
481
  const changed = [];
479
- for (const [source_file, relative] of _iter_sources()) {
480
- if (!should_condense(source_file)) {
482
+ const seen = new Set();
483
+ for (const [, relative] of _iter_sources()) {
484
+ if (seen.has(relative)) {
485
+ continue;
486
+ }
487
+ seen.add(relative);
488
+ // Resolve through `_resolve_source` rather than trusting the iterator's
489
+ // physical hit: `src/` and `src/agent-src/` are both artefact roots, so
490
+ // one relative path can name two unrelated files and only the resolver
491
+ // knows which one wins.
492
+ const source = _resolve_source(relative);
493
+ if (source === null || !should_condense(source)) {
481
494
  continue;
482
495
  }
483
- const current_hash = effective_hash(relative);
484
- const stored_hash = hashes[relative];
485
- if (stored_hash !== current_hash) {
496
+ if (is_projection_stale(relative)) {
486
497
  changed.push(relative);
487
498
  }
488
499
  }
489
500
  return changed;
490
501
  }
491
- export function find_stale_hashes(_source_dir) {
492
- const hashes = load_hashes();
493
- const stale = [];
494
- for (const relative of Object.keys(hashes).sort((a, b) => (a < b ? -1 : a > b ? 1 : 0))) {
495
- if (_resolve_source(relative) === null) {
496
- stale.push(relative);
497
- }
498
- }
499
- return stale;
500
- }
501
- export function clean_stale_hashes(_source_dir) {
502
- const stale = find_stale_hashes(_source_dir);
503
- if (stale.length === 0) {
504
- return 0;
505
- }
506
- const hashes = load_hashes();
507
- for (const relative of stale) {
508
- delete hashes[relative];
509
- }
510
- save_hashes(hashes);
511
- return stale.length;
512
- }
513
502
  export function should_condense(filepath) {
514
503
  if (path.extname(filepath) !== '.md') {
515
504
  return false;
@@ -579,19 +568,61 @@ export function cleanup_stale(_source_dir, target_dir) {
579
568
  }
580
569
  return deleted;
581
570
  }
571
+ /** ADR-201 (accepted 2026-07-29): `.md` is COPIED + path-rewritten, never rewritten
572
+ * by an LLM. Set false to restore the pre-ADR-201 behaviour, where `.md` was skipped
573
+ * here and an agent wrote the condensed body into `dist/` by hand.
574
+ *
575
+ * Measured basis for the removal: 0/429 artifacts saved ≥500 tok, aggregate 0.86%,
576
+ * 267/429 byte-identical, and −36 tok on the always-loaded kernel (condensation made
577
+ * the per-request surface *worse*). Determinism failed by construction: the hash
578
+ * covered the source, never the output, so drift was undetectable — observed live.
579
+ *
580
+ * Council verdict A: `dist/agent-src/` STAYS as a deterministically-produced,
581
+ * git-diffable artifact. Only the *manner* of derivation changes. */
582
+ export const COPY_MD_VERBATIM = true;
583
+ /** True when `relative` is a rule whose compile-time toggle is off, so the projector
584
+ * must not emit it. Exported for the coupling test — without a pinned test the
585
+ * second half of "dormancy" would be asserted rather than enforced, which is the
586
+ * exact failure ADR telegraph/0002 § part 1 records. */
587
+ export function skip_compile_disabled_rule(relative) {
588
+ const posix = relative.split(path.sep).join('/');
589
+ if (!posix.startsWith('rules/') || !posix.endsWith('.md')) {
590
+ return false;
591
+ }
592
+ const rule_id = path.basename(posix, '.md');
593
+ const settings = load_agent_settings({ project_path: MODULE_STATE.SETTINGS_FILE });
594
+ return !rule_is_compile_enabled(rule_id, settings);
595
+ }
582
596
  export function sync_non_md(_source_dir, target_dir) {
583
597
  let copied = 0;
584
598
  const seen = new Set();
585
599
  for (const [source_file, relative] of _iter_sources()) {
586
- if (should_condense(source_file)) {
587
- continue; // .md files are condensed by the agent, not copied here
600
+ if (!COPY_MD_VERBATIM && should_condense(source_file)) {
601
+ continue; // pre-ADR-201: .md was condensed by the agent, not copied here
588
602
  }
589
603
  if (seen.has(relative)) {
590
604
  continue;
591
605
  }
606
+ // ADR telegraph/0002 § part 1: a compile-time-disabled RULE must not be
607
+ // emitted at all. Router membership alone was never zero-cost — the host
608
+ // reads the projected FILE, so a rule dropped from router.json while its
609
+ // body still shipped kept costing its full token price. One switch, both
610
+ // surfaces. Unknown ids are always emitted (the map gates, it does not
611
+ // allowlist), so this is a no-op for every rule but the gated ones.
612
+ if (skip_compile_disabled_rule(relative)) {
613
+ continue;
614
+ }
592
615
  seen.add(relative);
593
616
  const target_file = path.join(target_dir, relative);
594
617
  copy_file(source_file, target_file);
618
+ // ADR-201: a copied `.md` still needs the ONE deterministic transform the
619
+ // removal deliberately preserves — `apply_path_rewriter` fixes relative
620
+ // links so they resolve from the DELIVERED location (`../../docs/…` →
621
+ // `../docs/…`, ~38 artifacts). Without this the projection's links break.
622
+ // Idempotent: it returns false when nothing changed.
623
+ if (COPY_MD_VERBATIM && relative.endsWith('.md')) {
624
+ apply_path_rewriter(relative);
625
+ }
595
626
  _print(` Copied: ${relative}`);
596
627
  copied += 1;
597
628
  }
@@ -621,6 +652,12 @@ export function check_sync(_source_dir, target_dir) {
621
652
  continue;
622
653
  }
623
654
  seen.add(relative);
655
+ // A compile-disabled rule is deliberately absent from the projection,
656
+ // so demanding a counterpart would report the intended state as a defect.
657
+ // Same predicate the projector and the router compiler use.
658
+ if (skip_compile_disabled_rule(relative)) {
659
+ continue;
660
+ }
624
661
  if (!_exists(path.join(target_dir, relative))) {
625
662
  missing.push(relative);
626
663
  }
@@ -631,7 +668,10 @@ export function check_sync(_source_dir, target_dir) {
631
668
  continue;
632
669
  }
633
670
  const relative = _relativeToPosix(target_file, target_dir);
634
- if (_resolve_source(relative) === null) {
671
+ // Two ways a projected file is stale: no source at all, or a source
672
+ // that is compile-disabled — the second is how a re-enabled-then-
673
+ // disabled rule leaves weight behind.
674
+ if (_resolve_source(relative) === null || skip_compile_disabled_rule(relative)) {
635
675
  stale.push(relative);
636
676
  }
637
677
  }
@@ -898,6 +938,12 @@ function _scoped_rule_basenames() {
898
938
  return _iterdirSorted(MODULE_STATE.RULES_SOURCE)
899
939
  .filter((p) => p.endsWith('.md') && _isFile(p))
900
940
  .filter((p) => rule_in_scope(p, scope, pack_scope))
941
+ // A compile-disabled rule has no dist/agent-src/ counterpart, so a per-tool
942
+ // symlink to it would dangle. The source file still exists, which is why the
943
+ // scope filters alone let it through — the toggle is a separate axis and this
944
+ // is its fourth consumer, after the router compiler, the dist writer, and
945
+ // check_sync. Same predicate in all four; that is the point.
946
+ .filter((p) => !skip_compile_disabled_rule(`rules/${path.basename(p)}`))
901
947
  .map((p) => path.basename(p))
902
948
  .sort((a, b) => (a < b ? -1 : a > b ? 1 : 0));
903
949
  }
@@ -911,18 +957,27 @@ export function generate_rule_symlinks() {
911
957
  // a consumer actually enables it, mirroring an unmet import.
912
958
  throw new Error('lean_projection.mode=thin requires project_thin_rules (not ported in condense.ts)');
913
959
  }
960
+ const dedup_on = _read_projection_scope_dedup();
961
+ const user_home = process.env['HOME'] ?? os.homedir();
962
+ const skipped_per_tool = {};
914
963
  let total = 0;
915
964
  for (const [tool_dir, rel_prefix] of Object.entries(tool_dirs)) {
916
965
  const target_dir = path.join(MODULE_STATE.PROJECT_ROOT, tool_dir);
966
+ const skip = dedup_on ? _dedupable_rules(tool_dir, rules, user_home) : new Set();
967
+ skipped_per_tool[tool_dir] = skip;
917
968
  _mkdirp(target_dir);
918
- // Clean stale symlinks
969
+ // Clean stale symlinks — a rule that became de-duplicable this run is
970
+ // stale at project scope too, so it has to go with the rest.
919
971
  for (const item of _iterdirSorted(target_dir)) {
920
972
  const name = path.basename(item);
921
- if (_isSymlink(item) && !rules.includes(name) && name !== 'README.md') {
973
+ if (_isSymlink(item) && (!rules.includes(name) || skip.has(name)) && name !== 'README.md') {
922
974
  fs.unlinkSync(item);
923
975
  }
924
976
  }
925
977
  for (const rule of rules) {
978
+ if (skip.has(rule)) {
979
+ continue;
980
+ }
926
981
  const link = path.join(target_dir, rule);
927
982
  if (_existsOrSymlink(link)) {
928
983
  fs.unlinkSync(link);
@@ -939,9 +994,23 @@ export function generate_rule_symlinks() {
939
994
  const source_count = rules.length;
940
995
  for (const tool_dir of Object.keys(tool_dirs)) {
941
996
  const target_dir = path.join(MODULE_STATE.PROJECT_ROOT, tool_dir);
942
- const tool_count = _iterdirSorted(target_dir).filter((f) => f.endsWith('.md')).length;
943
- if (tool_count !== source_count) {
944
- _print(` ⚠️ ${tool_dir}: ${tool_count} rules (expected ${source_count})`);
997
+ // Count only the RULES this run emitted, not every `.md` in the tree.
998
+ // Some tool trees legitimately receive other artefact classes — the cline
999
+ // tree also carries `*.subagent.md` — and counting those produced a
1000
+ // permanent "111 rules (expected 110)" warning that was pure noise. A
1001
+ // warning that is always on is a warning nobody reads.
1002
+ const emitted = new Set(rules);
1003
+ const tool_count = _iterdirSorted(target_dir).filter((f) => emitted.has(path.basename(f))).length;
1004
+ // Expect the de-duplicated count, not the source count: a skipped rule is
1005
+ // an intended absence, so warning on it would train the reader to ignore
1006
+ // this line — which is how a real drift gets missed.
1007
+ const skipped = (skipped_per_tool[tool_dir] ?? new Set()).size;
1008
+ const expected = source_count - skipped;
1009
+ if (tool_count !== expected) {
1010
+ _print(` ⚠️ ${tool_dir}: ${tool_count} rules (expected ${expected})`);
1011
+ }
1012
+ if (skipped > 0) {
1013
+ _print(` ℹ️ ${tool_dir}: ${skipped} rule(s) skipped — byte-identical twin already installed at user scope`);
945
1014
  }
946
1015
  }
947
1016
  info(` ✅ Created ${total} rule symlinks across ${Object.keys(tool_dirs).length} tool directories (${source_count} rules each)`);
@@ -2056,7 +2125,7 @@ function _print(line) {
2056
2125
  }
2057
2126
  export function main(argv = process.argv.slice(2)) {
2058
2127
  if (!_exists(MODULE_STATE.SOURCE_DIR) && !_any_source_root_exists()) {
2059
- _print(`❌ No source directory found (looked at ${MODULE_STATE.SOURCE_DIR} and packages/*/.agent-src.uncondensed)`);
2128
+ _print(`❌ No source directory found (looked at the artefact roots under src/ and ${MODULE_STATE.SOURCE_DIR})`);
2060
2129
  return 1;
2061
2130
  }
2062
2131
  const arg = argv.length > 0 ? argv[0] : '--sync';
@@ -2070,28 +2139,18 @@ export function main(argv = process.argv.slice(2)) {
2070
2139
  else if (arg === '--changed') {
2071
2140
  const changed = list_changed_md(MODULE_STATE.SOURCE_DIR);
2072
2141
  if (changed.length === 0) {
2073
- _print('✅ No .md files changed since last condensation');
2142
+ _print('✅ Every .md projection matches its source');
2074
2143
  return 0;
2075
2144
  }
2076
- _print(`📝 ${changed.length} .md files changed since last condensation:\n`);
2145
+ _print(`📝 ${changed.length} .md projection(s) out of date — run 'task sync':\n`);
2077
2146
  for (const f of changed) {
2078
2147
  _print(` ${f}`);
2079
2148
  }
2080
2149
  }
2081
- else if (arg === '--mark-done') {
2082
- if (argv.length < 2) {
2083
- _print('Usage: python scripts/condense.py --mark-done <relative-path>');
2084
- return 1;
2085
- }
2086
- mark_done(argv[1]);
2087
- }
2088
- else if (arg === '--mark-all-done') {
2089
- mark_all_done();
2090
- }
2091
2150
  else if (arg === '--check') {
2092
2151
  const [missing, stale] = check_sync(MODULE_STATE.SOURCE_DIR, MODULE_STATE.TARGET_DIR);
2093
2152
  if (missing.length === 0 && stale.length === 0) {
2094
- _print('✅ dist/agent-src/ is in sync with .agent-src.uncondensed/');
2153
+ _print('✅ dist/agent-src/ is in sync with the artefact roots under src/');
2095
2154
  return 0;
2096
2155
  }
2097
2156
  if (missing.length > 0) {
@@ -2106,73 +2165,31 @@ export function main(argv = process.argv.slice(2)) {
2106
2165
  _print(` ${f}`);
2107
2166
  }
2108
2167
  }
2109
- _print(`\nRun 'task sync' to fix non-.md files, then ask the agent to condense .md files.`);
2168
+ _print(`\nRun 'task sync' — the projection is a deterministic copy, so it needs no agent step.`);
2110
2169
  return 1;
2111
2170
  }
2112
2171
  else if (arg === '--sync') {
2113
- _print(`Source: ${MODULE_STATE.SOURCE_DIR}`);
2172
+ // SOURCE_DIR is the pre-ADR-051 single root, kept only as a fallback probe;
2173
+ // the real inputs are the artefact roots the multi-root iterator walks.
2174
+ _print(`Source: the artefact roots under src/`);
2114
2175
  _print(`Target: ${MODULE_STATE.TARGET_DIR}\n`);
2115
2176
  _print('--- Syncing non-.md files ---');
2116
2177
  const copied = sync_non_md(MODULE_STATE.SOURCE_DIR, MODULE_STATE.TARGET_DIR);
2117
2178
  _print(`\n--- Cleanup stale files ---`);
2118
2179
  const deleted = cleanup_stale(MODULE_STATE.SOURCE_DIR, MODULE_STATE.TARGET_DIR);
2119
- const hashes = load_hashes();
2120
- const stale_keys = Object.keys(hashes).filter((k) => _resolve_source(k) === null);
2121
- for (const k of stale_keys) {
2122
- delete hashes[k];
2123
- }
2124
- if (stale_keys.length > 0) {
2125
- save_hashes(hashes);
2126
- _print(` Cleaned ${stale_keys.length} stale hash entries`);
2127
- }
2128
2180
  const changed = list_changed_md(MODULE_STATE.SOURCE_DIR);
2129
2181
  _print(`\n✅ Done: ${copied} copied, ${deleted} stale deleted`);
2130
2182
  if (changed.length > 0) {
2131
- _print(`📝 ${changed.length} .md files need condensation (run --changed to see them)`);
2183
+ // --sync writes .md itself, so anything still stale here is a bug in
2184
+ // the projector, not work left for a follow-up step.
2185
+ _print(`❌ ${changed.length} .md projection(s) still out of date after sync (run --changed)`);
2132
2186
  }
2133
2187
  else {
2134
- _print(`✅ All .md files are up to date`);
2188
+ _print(`✅ Every .md projection matches its source`);
2135
2189
  }
2136
2190
  _print(`\n--- Projecting dist/agent-src/ → .augment/ ---`);
2137
2191
  project_to_augment();
2138
2192
  }
2139
- else if (arg === '--check-hashes') {
2140
- let has_issues = false;
2141
- const changed = list_changed_md(MODULE_STATE.SOURCE_DIR);
2142
- const stale = find_stale_hashes(MODULE_STATE.SOURCE_DIR);
2143
- if (stale.length > 0) {
2144
- has_issues = true;
2145
- _print(`⚠️ ${stale.length} stale hash(es) for deleted source files:\n`);
2146
- for (const f of stale) {
2147
- _print(` ${f}`);
2148
- }
2149
- _print(`\nRun 'task sync-clean-hashes' to remove them.\n`);
2150
- }
2151
- if (changed.length > 0) {
2152
- has_issues = true;
2153
- _print(`❌ ${changed.length} .md file(s) need recondensation:\n`);
2154
- for (const f of changed) {
2155
- const stored = load_hashes()[f];
2156
- const reason = stored === undefined ? 'no hash stored' : 'hash mismatch';
2157
- _print(` ${f} (${reason})`);
2158
- }
2159
- _print(`\nRun '/condense' command to recondense these files.`);
2160
- }
2161
- if (!has_issues) {
2162
- _print('✅ All condensation hashes are clean (no stale, no mismatches)');
2163
- return 0;
2164
- }
2165
- return 1;
2166
- }
2167
- else if (arg === '--clean-hashes') {
2168
- const count = clean_stale_hashes(MODULE_STATE.SOURCE_DIR);
2169
- if (count) {
2170
- _print(`✅ Removed ${count} stale hash(es)`);
2171
- }
2172
- else {
2173
- _print('✅ No stale hashes found');
2174
- }
2175
- }
2176
2193
  else if (arg === '--generate-tools') {
2177
2194
  generate_tools();
2178
2195
  }
@@ -2183,7 +2200,7 @@ export function main(argv = process.argv.slice(2)) {
2183
2200
  project_to_augment();
2184
2201
  }
2185
2202
  else {
2186
- _print('Usage: python scripts/condense.py [--sync|--list|--changed|--check|--check-hashes|--clean-hashes|--mark-done <path>|--mark-all-done|--generate-tools|--clean-tools|--project-augment]');
2203
+ _print('Usage: condense [--sync|--list|--changed|--check|--generate-tools|--clean-tools|--project-augment]');
2187
2204
  return 1;
2188
2205
  }
2189
2206
  return 0;