@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
@@ -0,0 +1,188 @@
1
+ #!/usr/bin/env tsx
2
+ /**
3
+ * check_pack_size — enforce the published-tarball payload budget
4
+ * (road-to-zero-ceremony-install Phase 4).
5
+ *
6
+ * Two metrics, both ungated before this script existed:
7
+ * 1. COMPRESSED tarball size — absolute max, plus the >regression_pct creep
8
+ * rule (fails even under the absolute budget, so slow rot cannot hide
9
+ * under a generous cap).
10
+ * 2. PER-SKILL share of the skills subtree — no single skill may silently
11
+ * reclaim space freed elsewhere. Named exceptions carry a reason.
12
+ *
13
+ * The UNPACKED size is deliberately NOT re-gated here: it is already owned by
14
+ * `evaluator-budgets.unpacked_size_mb`, measured at release time on the BUILT
15
+ * artifact. Two gates for one lever is how conflicting numbers start.
16
+ *
17
+ * Usage:
18
+ * ./scripts-run src/scripts/check_pack_size [--json]
19
+ * ./scripts-run src/scripts/check_pack_size --pack-json <file> # test/offline
20
+ *
21
+ * Exit codes: 0 green · 1 over budget · 2 misuse / unreadable input.
22
+ */
23
+
24
+ import { execFileSync } from 'node:child_process';
25
+ import * as fs from 'node:fs';
26
+ import * as path from 'node:path';
27
+ import { fileURLToPath } from 'node:url';
28
+
29
+ const REPO_ROOT = path.resolve(fileURLToPath(import.meta.url), '..', '..', '..');
30
+ const BUDGET_PATH = path.join(REPO_ROOT, 'src', 'config', 'pack-size-budget.json');
31
+ const SKILL_PREFIX = 'dist/agent-src/skills/';
32
+
33
+ export interface PackFile {
34
+ path: string;
35
+ size: number;
36
+ }
37
+
38
+ export interface PackResult {
39
+ size: number;
40
+ unpackedSize: number;
41
+ files: PackFile[];
42
+ }
43
+
44
+ export interface PackSizeBudget {
45
+ regression_pct: number;
46
+ budgets: Record<string, { max: number; last_measured: number; method: string }>;
47
+ per_skill_share: {
48
+ max_pct: number;
49
+ basis: string;
50
+ rationale: string;
51
+ exceptions: Record<string, { max_pct: number; measured_pct: number; reason: string }>;
52
+ };
53
+ }
54
+
55
+ /**
56
+ * Parse `npm pack --json` stdout. npm runs the `prepare` lifecycle script even
57
+ * under `--ignore-scripts` on some versions, and this repo's `prepare` prints a
58
+ * banner — straight into the stream we parse. Slice from the first `[` so a
59
+ * lifecycle banner is tolerated instead of becoming a SyntaxError.
60
+ */
61
+ export function parsePackJson(stdout: string): PackResult {
62
+ const start = stdout.indexOf('[');
63
+ const parsed = JSON.parse(start >= 0 ? stdout.slice(start) : stdout) as PackResult[];
64
+ const first = parsed[0];
65
+ if (first === undefined) throw new Error('npm pack --json returned an empty array');
66
+ return first;
67
+ }
68
+
69
+ /** Bytes per skill under `dist/agent-src/skills/`, plus the subtree total. */
70
+ export function skillBytes(files: readonly PackFile[]): { perSkill: Record<string, number>; total: number } {
71
+ const perSkill: Record<string, number> = {};
72
+ let total = 0;
73
+ for (const file of files) {
74
+ if (!file.path.startsWith(SKILL_PREFIX)) continue;
75
+ const name = file.path.slice(SKILL_PREFIX.length).split('/')[0];
76
+ if (name === undefined || name === '') continue;
77
+ perSkill[name] = (perSkill[name] ?? 0) + file.size;
78
+ total += file.size;
79
+ }
80
+ return { perSkill, total };
81
+ }
82
+
83
+ /** Every violation, as human-readable lines. Empty array means green. */
84
+ export function evaluate(budget: PackSizeBudget, pack: PackResult): string[] {
85
+ const errors: string[] = [];
86
+
87
+ const packedMb = pack.size / 1e6;
88
+ const entry = budget.budgets['packed_size_mb'];
89
+ if (entry === undefined) {
90
+ errors.push('packed_size_mb: missing from the budget file — gate would pass vacuously');
91
+ } else if (packedMb > entry.max) {
92
+ errors.push(`packed_size_mb: measured ${packedMb.toFixed(3)} exceeds budget ${entry.max}`);
93
+ } else {
94
+ const pct = budget.regression_pct;
95
+ const ceiling = entry.last_measured * (1 + pct / 100);
96
+ if (entry.last_measured > 0 && packedMb > ceiling) {
97
+ errors.push(
98
+ `packed_size_mb: measured ${packedMb.toFixed(3)} regressed >${pct}% vs ` +
99
+ `last_measured ${entry.last_measured} (ceiling ${ceiling.toFixed(3)}) — ` +
100
+ 'fails even under the absolute budget',
101
+ );
102
+ }
103
+ }
104
+
105
+ const { perSkill, total } = skillBytes(pack.files);
106
+ if (total === 0) {
107
+ errors.push(`per_skill_share: no files under ${SKILL_PREFIX} — gate would pass vacuously`);
108
+ return errors;
109
+ }
110
+ const { max_pct: defaultMax, exceptions } = budget.per_skill_share;
111
+ for (const [name, bytes] of Object.entries(perSkill)) {
112
+ const share = (bytes / total) * 100;
113
+ const exception = exceptions[name];
114
+ const cap = exception?.max_pct ?? defaultMax;
115
+ if (share > cap) {
116
+ errors.push(
117
+ exception === undefined
118
+ ? `per_skill_share: ${name} is ${share.toFixed(2)}% of the skills payload, over the ${cap}% cap — ` +
119
+ 'shrink it, or add a named exception with a reason'
120
+ : `per_skill_share: ${name} is ${share.toFixed(2)}%, over its own exception cap of ${cap}% — ` +
121
+ 'the exception is not a blank cheque; shrink it or raise the cap with a reason',
122
+ );
123
+ }
124
+ }
125
+ for (const name of Object.keys(exceptions)) {
126
+ if (!(name in perSkill)) {
127
+ errors.push(`per_skill_share: exception for '${name}' is stale — no such skill ships`);
128
+ }
129
+ }
130
+ return errors;
131
+ }
132
+
133
+ function readPack(argv: readonly string[]): PackResult {
134
+ const idx = argv.indexOf('--pack-json');
135
+ if (idx >= 0) {
136
+ const file = argv[idx + 1];
137
+ if (file === undefined) throw new Error('--pack-json needs a path');
138
+ return parsePackJson(fs.readFileSync(file, 'utf-8'));
139
+ }
140
+ const stdout = execFileSync('npm', ['pack', '--dry-run', '--json', '--ignore-scripts', '--silent'], {
141
+ cwd: REPO_ROOT,
142
+ encoding: 'utf-8',
143
+ maxBuffer: 64 * 1024 * 1024,
144
+ stdio: ['ignore', 'pipe', 'ignore'],
145
+ });
146
+ return parsePackJson(stdout);
147
+ }
148
+
149
+ export function main(argv: readonly string[] = process.argv.slice(2)): number {
150
+ let budget: PackSizeBudget;
151
+ let pack: PackResult;
152
+ try {
153
+ budget = JSON.parse(fs.readFileSync(BUDGET_PATH, 'utf-8')) as PackSizeBudget;
154
+ } catch (err) {
155
+ process.stderr.write(`❌ pack size: cannot read ${BUDGET_PATH}: ${String(err)}\n`);
156
+ return 2;
157
+ }
158
+ try {
159
+ pack = readPack(argv);
160
+ } catch (err) {
161
+ process.stderr.write(`❌ pack size: npm pack failed: ${String(err)}\n`);
162
+ return 2;
163
+ }
164
+
165
+ const errors = evaluate(budget, pack);
166
+ const { perSkill, total } = skillBytes(pack.files);
167
+ if (argv.includes('--json')) {
168
+ process.stdout.write(
169
+ `${JSON.stringify({ packed_mb: pack.size / 1e6, skills_total_bytes: total, skills: Object.keys(perSkill).length, errors }, null, 2)}\n`,
170
+ );
171
+ return errors.length > 0 ? 1 : 0;
172
+ }
173
+ if (errors.length > 0) {
174
+ for (const e of errors) process.stderr.write(`❌ pack size: ${e}\n`);
175
+ return 1;
176
+ }
177
+ process.stdout.write(
178
+ `✅ pack size within budget — ${(pack.size / 1e6).toFixed(3)} MB packed, ` +
179
+ `${Object.keys(perSkill).length} skills, largest share ` +
180
+ `${Math.max(...Object.values(perSkill).map((b) => (b / total) * 100)).toFixed(2)}%\n`,
181
+ );
182
+ return 0;
183
+ }
184
+
185
+ const _selfPath = fileURLToPath(import.meta.url);
186
+ if (process.argv[1] !== undefined && path.resolve(process.argv[1]) === path.resolve(_selfPath)) {
187
+ process.exit(main());
188
+ }
@@ -0,0 +1,130 @@
1
+ #!/usr/bin/env tsx
2
+ /**
3
+ * Ratchet gate for the per-spawn preamble payload (road-to-cache-economy
4
+ * Phase 3, unblocked by C-3 measuring 38.0% against a 15% bar).
5
+ *
6
+ * WHY A RATCHET AND NOT THE ROADMAP'S LITERAL NUMBERS
7
+ * ---------------------------------------------------
8
+ * The roadmap's candidate ceiling (median 40k / p95 50k) is anchored to an
9
+ * upstream ~37k cold start. This package's own deterministic in-repo payload is
10
+ * ~102.8k tokens, so a hard 40k gate would be red the day it lands — and a gate
11
+ * that is always red trains the reader to ignore it, which is precisely the
12
+ * failure the gates-that-can-fail work exists to prevent. So this fails on
13
+ * GROWTH: the number can only walk down, and the 40k/50k target stays recorded
14
+ * in the budget file as the destination.
15
+ *
16
+ * Only deterministic, in-repo buckets are gated. User-scope rules depend on what
17
+ * the developer happens to have installed globally, and the tool-definition
18
+ * bucket has no local source at all — the census reports that one as an explicit
19
+ * residual rather than pretending to measure it.
20
+ *
21
+ * Exit codes: 0 within budget · 1 over budget · 2 misuse / unreadable budget.
22
+ */
23
+ import * as fs from 'node:fs';
24
+ import * as path from 'node:path';
25
+
26
+ import { censusClaudeMdHierarchy, censusRuleDir, censusSkillsCatalog } from './preamble_byte_census.js';
27
+
28
+ const HERE = path.dirname(new URL(import.meta.url).pathname);
29
+ const REPO_ROOT = path.resolve(HERE, '..', '..');
30
+ const BUDGET_FILE = path.join(REPO_ROOT, 'src', 'config', 'preamble-payload-budget.json');
31
+
32
+ interface Budget {
33
+ baseline_tokens: number;
34
+ headroom_pct: number;
35
+ target_tokens: { median: number; p95: number };
36
+ }
37
+
38
+ export interface BudgetVerdict {
39
+ measured: number;
40
+ baseline: number;
41
+ ceiling: number;
42
+ withinBudget: boolean;
43
+ buckets: Array<{ name: string; tokens: number }>;
44
+ }
45
+
46
+ function tokens(chars: number): number {
47
+ return Math.round(chars / 4);
48
+ }
49
+
50
+ export function readBudget(file: string = BUDGET_FILE): Budget {
51
+ const raw = JSON.parse(fs.readFileSync(file, 'utf-8')) as Record<string, unknown>;
52
+ const baseline = Number(raw['baseline_tokens']);
53
+ const headroom = Number(raw['headroom_pct']);
54
+ if (!Number.isFinite(baseline) || !Number.isFinite(headroom)) {
55
+ throw new Error(`${file}: baseline_tokens and headroom_pct must both be numbers`);
56
+ }
57
+ const target = (raw['target_tokens'] ?? {}) as Record<string, unknown>;
58
+ return {
59
+ baseline_tokens: baseline,
60
+ headroom_pct: headroom,
61
+ target_tokens: { median: Number(target['median']), p95: Number(target['p95']) },
62
+ };
63
+ }
64
+
65
+ /** Measure only what the repo tree determines — no `~`, no transcripts, no network. */
66
+ export function measureDeterministicPayload(
67
+ repoRoot: string = REPO_ROOT,
68
+ ): Array<{ name: string; tokens: number }> {
69
+ const projectRules = censusRuleDir(path.join(repoRoot, 'dist', 'agent-src', 'rules'));
70
+ const skills = censusSkillsCatalog(path.join(repoRoot, 'dist', 'agent-src', 'skills'));
71
+ // Only the PROJECT half of the CLAUDE.md hierarchy is deterministic — the
72
+ // user file and its @-imports live on whatever machine runs this.
73
+ const claudeMd = censusClaudeMdHierarchy(repoRoot, path.join(repoRoot, '.no-such-home'));
74
+ const projectClaudeMdChars =
75
+ claudeMd.project_claude_md_chars + claudeMd.project_claude_local_md_chars;
76
+ return [
77
+ { name: 'project-scope rules', tokens: tokens(projectRules.chars) },
78
+ { name: 'preloaded skills catalog', tokens: tokens(skills.chars) },
79
+ { name: 'CLAUDE.md hierarchy (project only)', tokens: tokens(projectClaudeMdChars) },
80
+ ];
81
+ }
82
+
83
+ export function evaluate(repoRoot?: string, budgetFile?: string): BudgetVerdict {
84
+ const budget = readBudget(budgetFile);
85
+ const buckets = measureDeterministicPayload(repoRoot);
86
+ const measured = buckets.reduce((sum, b) => sum + b.tokens, 0);
87
+ const ceiling = Math.round(budget.baseline_tokens * (1 + budget.headroom_pct / 100));
88
+ return { measured, baseline: budget.baseline_tokens, ceiling, withinBudget: measured <= ceiling, buckets };
89
+ }
90
+
91
+ export function main(argv: string[] = process.argv.slice(2)): number {
92
+ const json = argv.includes('--format=json') || argv.includes('--json');
93
+ let verdict: BudgetVerdict;
94
+ try {
95
+ verdict = evaluate();
96
+ } catch (err) {
97
+ process.stderr.write(`❌ preamble-payload budget: ${(err as Error).message}\n`);
98
+ return 2;
99
+ }
100
+
101
+ if (json) {
102
+ process.stdout.write(JSON.stringify(verdict, null, 2) + '\n');
103
+ return verdict.withinBudget ? 0 : 1;
104
+ }
105
+
106
+ for (const b of verdict.buckets) {
107
+ process.stdout.write(` ${b.name.padEnd(38)} ${String(b.tokens).padStart(8)} tok\n`);
108
+ }
109
+ const delta = verdict.measured - verdict.baseline;
110
+ const sign = delta >= 0 ? '+' : '';
111
+ process.stdout.write(
112
+ ` ${'measured total'.padEnd(38)} ${String(verdict.measured).padStart(8)} tok ` +
113
+ `(baseline ${verdict.baseline}, ${sign}${delta}; ceiling ${verdict.ceiling})\n`,
114
+ );
115
+ if (!verdict.withinBudget) {
116
+ process.stderr.write(
117
+ `❌ per-spawn preamble payload grew past the ratchet: ${verdict.measured} > ${verdict.ceiling} tok.\n` +
118
+ ` Every rule and skill description here is re-written on EVERY subagent spawn, so growth\n` +
119
+ ` is paid per spawn, not once. Either shrink the addition, or raise baseline_tokens in\n` +
120
+ ` src/config/preamble-payload-budget.json with the reason in the same commit.\n`,
121
+ );
122
+ return 1;
123
+ }
124
+ process.stdout.write('✅ per-spawn preamble payload within the ratchet.\n');
125
+ return 0;
126
+ }
127
+
128
+ if (process.argv[1] !== undefined && import.meta.url === `file://${process.argv[1]}`) {
129
+ process.exit(main());
130
+ }
Binary file
@@ -179,7 +179,6 @@ const EXAMPLE_PATH_PATTERNS: RegExp[] = [
179
179
  /skills\/[\w-]+\.md/, // short skill refs in examples (not SKILL.md path)
180
180
  /skills\/[\w-]+\/SKILL\.md/, // example skill paths in commands
181
181
  /\{/, // template placeholders like {module}
182
- /\.condensation-hashes\.json/, // JSON file, not .md
183
182
  /-foo\.(md|json|yml|yaml)$/, // `-foo.<ext>` placeholder examples
184
183
  /-bar\.(md|json|yml|yaml)$/, // `-bar.<ext>` placeholder examples
185
184
  // ── docs/+src/ illustrative example paths (Phase-0 step 7a) ──
@@ -9,24 +9,62 @@
9
9
  * messages, the same git plumbing and the same `origin/main` → `main`
10
10
  * fallback. Historical quirks are preserved deliberately — tests and downstream consumers pin the exact behaviour.
11
11
  *
12
- * Per Q3=A locked decision (council Round 3, 2026-05-03), the four
13
- * safety-floor always-rules are out of scope for Phase 2A slimming:
12
+ * The four safety-floor always-rules it guards:
14
13
  * - non-destructive-by-default
15
14
  * - commit-policy
16
15
  * - scope-control
17
16
  * - verify-before-complete
18
17
  *
19
- * Exit codes: 0 = clean (or skipped — see `--skip-if-no-baseline`),
20
- * 1 = safety-floor file modified, 3 = internal error.
18
+ * NARROWED 2026-07-31 (ADR-203). The Q3=A decision (council Round 3,
19
+ * 2026-05-03) put these rules out of scope for Phase-2A slimming, and the guard
20
+ * implemented that as "no edits at all". That over-shot: it also blocked
21
+ * preservation-conforming P4 migrations, which move lookup material into a
22
+ * declared `load_context:` target without losing anything — and since the two
23
+ * kernel rules over their budget caps are guarded files, the pairing had no
24
+ * legal state at all.
25
+ *
26
+ * The lock now blocks SUBSTANTIVE changes and exempts proven migrations. Proven
27
+ * is the load-bearing word: `_lib/preservation_migration.ts` CHECKS that every
28
+ * paragraph, list item and fenced block survives — in the rule (telegraph
29
+ * condensation allowed) or verbatim in a declared context — with Iron Law
30
+ * headings holding their level and Iron Law fences byte-exact. No label, no
31
+ * commit-message attestation, no honour system: unprovable ⇒ substantive ⇒
32
+ * blocked.
33
+ *
34
+ * Exit codes: 0 = clean, skipped, or verified migration,
35
+ * 1 = substantive safety-floor change, 3 = internal error.
21
36
  */
22
37
  import { spawnSync } from 'node:child_process';
23
38
  import * as path from 'node:path';
24
39
  import * as fs from 'node:fs';
25
40
  import { fileURLToPath, pathToFileURL } from 'node:url';
26
41
 
42
+ import { assertWatchlistResolves } from './_lib/scan_scope.js';
43
+ import {
44
+ load_context_targets,
45
+ verify_migration,
46
+ type Finding,
47
+ } from './_lib/preservation_migration.js';
48
+
27
49
  const _HERE = fileURLToPath(import.meta.url);
28
50
  const REPO_ROOT = path.resolve(path.dirname(_HERE), '..', '..');
29
- const RULES_DIR_REL = '.agent-src.uncondensed/rules';
51
+ /**
52
+ * Root the four floor rules live under (ADR-051).
53
+ *
54
+ * Until 2026-07-29 this named the retired source container, so the guard
55
+ * compared diffs against paths absent from every commit and reported
56
+ * `✅ Safety-floor untouched (4 rules guarded)` no matter what was edited.
57
+ * `assertWatchlistResolves` below now makes that state a loud failure instead
58
+ * of a clean bill of health.
59
+ *
60
+ * A first pass also kept the legacy path "in case a pre-ADR-051 baseline names
61
+ * it". That was speculative — CI always diffs against current `main` — and it
62
+ * tripped `check_no_new_legacy_path`, which is right: the source of truth is
63
+ * `src/`, and a dead path kept alive for an unmeasured scenario is how the
64
+ * original defect survived.
65
+ */
66
+ const RULES_DIR_REL = 'src/rules';
67
+ const RULES_DIRS_REL = [RULES_DIR_REL] as const;
30
68
  const SAFETY_FLOOR = [
31
69
  'non-destructive-by-default.md',
32
70
  'commit-policy.md',
@@ -34,6 +72,17 @@ const SAFETY_FLOOR = [
34
72
  'verify-before-complete.md',
35
73
  ] as const;
36
74
 
75
+ /** Every repo-relative path this guard watches, across all known roots. */
76
+ function _floor_candidates(): string[] {
77
+ return RULES_DIRS_REL.flatMap((dir) => SAFETY_FLOOR.map((name) => `${dir}/${name}`));
78
+ }
79
+
80
+ /** Which of `changed` are guarded floor files. Pure — the gate's whole decision. */
81
+ function _breaches(changed: readonly string[]): string[] {
82
+ const floorPaths = new Set(_floor_candidates());
83
+ return changed.filter((p) => floorPaths.has(p)).sort();
84
+ }
85
+
37
86
  function _run_git(args: string[]): [number, string] {
38
87
  const proc = spawnSync('git', args, {
39
88
  cwd: REPO_ROOT,
@@ -43,13 +92,26 @@ function _run_git(args: string[]): [number, string] {
43
92
  return [code, (proc.stdout ?? '') + (proc.stderr ?? '')];
44
93
  }
45
94
 
95
+ /** File content at `ref`, or null when the path does not exist there. */
96
+ function _git_show(ref: string, path: string): string | null {
97
+ const [code, out] = _run_git(["show", `${ref}:${path}`]);
98
+ return code === 0 ? out : null;
99
+ }
100
+
46
101
  function _baseline_exists(ref: string): boolean {
47
102
  const [code] = _run_git(['rev-parse', '--verify', '--quiet', ref]);
48
103
  return code === 0;
49
104
  }
50
105
 
51
- function _changed_files(baseline: string): string[] {
52
- const [code, output] = _run_git(['diff', '--name-only', `${baseline}...HEAD`]);
106
+ /**
107
+ * Files changed between `baseline` and `head`.
108
+ *
109
+ * `head` is parameterised (default `HEAD`) so the guard is verifiable against a
110
+ * real historical range — without it the only way to exercise a breach was to
111
+ * manufacture a commit, which is why this gate shipped untested for months.
112
+ */
113
+ function _changed_files(baseline: string, head = 'HEAD'): string[] {
114
+ const [code, output] = _run_git(['diff', '--name-only', `${baseline}...${head}`]);
53
115
  if (code !== 0) {
54
116
  throw new Error(`git diff failed: ${output}`);
55
117
  }
@@ -61,11 +123,12 @@ function _changed_files(baseline: string): string[] {
61
123
 
62
124
  interface ParsedArgs {
63
125
  baseline: string;
126
+ head: string;
64
127
  skip_if_no_baseline: boolean;
65
128
  }
66
129
 
67
130
  function parse_args(argv: readonly string[]): ParsedArgs {
68
- const args: ParsedArgs = { baseline: 'origin/main', skip_if_no_baseline: false };
131
+ const args: ParsedArgs = { baseline: 'origin/main', head: 'HEAD', skip_if_no_baseline: false };
69
132
  for (let i = 0; i < argv.length; i++) {
70
133
  const arg = argv[i]!;
71
134
  if (arg === '--baseline') {
@@ -79,11 +142,22 @@ function parse_args(argv: readonly string[]): ParsedArgs {
79
142
  args.baseline = v;
80
143
  } else if (arg.startsWith('--baseline=')) {
81
144
  args.baseline = arg.slice('--baseline='.length);
145
+ } else if (arg === '--head') {
146
+ const v = argv[++i];
147
+ if (v === undefined) {
148
+ process.stderr.write(
149
+ 'check_safety_floor_untouched: error: argument --head: expected one argument\n',
150
+ );
151
+ process.exit(2);
152
+ }
153
+ args.head = v;
154
+ } else if (arg.startsWith('--head=')) {
155
+ args.head = arg.slice('--head='.length);
82
156
  } else if (arg === '--skip-if-no-baseline') {
83
157
  args.skip_if_no_baseline = true;
84
158
  } else if (arg === '-h' || arg === '--help') {
85
159
  process.stdout.write(
86
- 'usage: check_safety_floor_untouched [-h] [--baseline BASELINE] [--skip-if-no-baseline]\n',
160
+ 'usage: check_safety_floor_untouched [-h] [--baseline BASELINE] [--head HEAD] [--skip-if-no-baseline]\n',
87
161
  );
88
162
  process.exit(0);
89
163
  } else {
@@ -118,34 +192,97 @@ function main(): number {
118
192
 
119
193
  let changed: string[];
120
194
  try {
121
- changed = _changed_files(args.baseline);
195
+ changed = _changed_files(args.baseline, args.head);
122
196
  } catch (exc) {
123
197
  const msg = exc instanceof Error ? exc.message : String(exc);
124
198
  process.stderr.write(`❌ ${msg}\n`);
125
199
  return 3;
126
200
  }
127
201
 
128
- const floorPaths = new Set(SAFETY_FLOOR.map((name) => `${RULES_DIR_REL}/${name}`));
129
- const breaches = changed.filter((p) => floorPaths.has(p)).sort();
202
+ // Scope assertion BEFORE the comparison: if none of the guarded paths exist
203
+ // on disk, this guard cannot fire and must say so loudly rather than
204
+ // reporting a clean floor it never looked at.
205
+ let guarded: string[];
206
+ try {
207
+ guarded = assertWatchlistResolves({
208
+ gate: 'check_safety_floor_untouched',
209
+ candidates: _floor_candidates(),
210
+ repoRoot: REPO_ROOT,
211
+ });
212
+ } catch (exc) {
213
+ const msg = exc instanceof Error ? exc.message : String(exc);
214
+ process.stderr.write(`❌ ${msg}\n`);
215
+ return 3;
216
+ }
217
+
218
+ const breaches = _breaches(changed);
130
219
 
131
220
  if (breaches.length) {
132
- process.stderr.write(
133
- '❌ Safety-floor rule(s) modified — Phase 2A is not allowed to ' +
134
- 'touch these (Q3=A locked decision):\n',
135
- );
221
+ // ADR-203: the lock narrowed from "no edits" to "no SUBSTANTIVE edits".
222
+ // A preservation-conforming P4 migration is exempt — but only when the
223
+ // guard can PROVE it is one. Anything unprovable is substantive.
224
+ const blocked: Array<[string, Finding[]]> = [];
136
225
  for (const p of breaches) {
137
- process.stderr.write(` ${p}\n`);
226
+ const base = _git_show(args.baseline, p);
227
+ const head = _git_show(args.head, p);
228
+ if (base === null || head === null) {
229
+ blocked.push([p, [{ code: 'passage-lost', detail: 'file added or deleted — not a migration' }]]);
230
+ continue;
231
+ }
232
+ const headContexts = new Map<string, string>();
233
+ const baseContexts = new Map<string, string>();
234
+ for (const rel of load_context_targets(head)) {
235
+ const target = `src/agent-src/${rel}`;
236
+ const h = _git_show(args.head, target);
237
+ if (h !== null) headContexts.set(target, h);
238
+ const b = _git_show(args.baseline, target);
239
+ baseContexts.set(target, b ?? '');
240
+ }
241
+ const findings = verify_migration({
242
+ base_rule: base,
243
+ head_rule: head,
244
+ head_contexts: headContexts,
245
+ base_contexts: baseContexts,
246
+ });
247
+ if (findings.length) blocked.push([p, findings]);
138
248
  }
139
- process.stderr.write(
140
- '\n Lift via the two-gate rollback documented in ' +
141
- 'agents/roadmaps/road-to-structural-optimization.md ' +
142
- '§ Phase 2A Abort/rollback.\n',
249
+
250
+ if (blocked.length) {
251
+ process.stderr.write(
252
+ '❌ Substantive change to safety-floor rule(s) — blocked (ADR-203 ' +
253
+ 'narrowed the Q3=A lock; only PROVEN preservation-conforming P4 ' +
254
+ 'migrations are exempt):\n',
255
+ );
256
+ for (const [p, findings] of blocked) {
257
+ process.stderr.write(`\n ${p}\n`);
258
+ for (const f of findings) {
259
+ process.stderr.write(` · [${f.code}] ${f.detail}\n`);
260
+ }
261
+ }
262
+ process.stderr.write(
263
+ '\n A migration must leave every paragraph, list item and fenced block\n' +
264
+ ' either in the rule (telegraph condensation is fine) or verbatim in a\n' +
265
+ ' declared load_context: target. Iron Law headings keep their level and\n' +
266
+ ' Iron Law fences stay byte-exact. Unprovable ⇒ substantive ⇒ blocked.\n',
267
+ );
268
+ return 1;
269
+ }
270
+
271
+ process.stdout.write(
272
+ `✅ Safety-floor edit(s) verified as preservation-conforming P4 migration ` +
273
+ `(${breaches.length} rule file(s); every passage accounted for):\n`,
143
274
  );
144
- return 1;
275
+ for (const p of breaches) {
276
+ process.stdout.write(` ${p}\n`);
277
+ }
278
+ return 0;
145
279
  }
146
280
 
281
+ // Report the RESOLVED count, not the declared one — the old message printed
282
+ // `SAFETY_FLOOR.length` unconditionally, so it claimed 4 guarded rules while
283
+ // guarding zero.
147
284
  process.stdout.write(
148
- `✅ Safety-floor untouched (${SAFETY_FLOOR.length} rules guarded ` +
285
+ `✅ Safety-floor untouched (${guarded.length} rule file(s) guarded ` +
149
286
  `vs. ${args.baseline}).\n`,
150
287
  );
151
288
  return 0;
@@ -177,4 +314,14 @@ if (_isCliEntry() || process.argv[1] === _HERE) {
177
314
  process.exit(main());
178
315
  }
179
316
 
180
- export { REPO_ROOT, RULES_DIR_REL, SAFETY_FLOOR, _baseline_exists, _changed_files, main };
317
+ export {
318
+ REPO_ROOT,
319
+ RULES_DIR_REL,
320
+ RULES_DIRS_REL,
321
+ SAFETY_FLOOR,
322
+ _baseline_exists,
323
+ _breaches,
324
+ _changed_files,
325
+ _floor_candidates,
326
+ main,
327
+ };