@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
@@ -30,6 +30,7 @@
30
30
 
31
31
  import * as fs from 'node:fs';
32
32
  import * as path from 'node:path';
33
+ import { spawnSync } from 'node:child_process';
33
34
  import { fileURLToPath, pathToFileURL } from 'node:url';
34
35
 
35
36
  import * as sl from './_lib/security_lint.js';
@@ -261,6 +262,191 @@ export function _scan(sf: sl.ScannedFile): sl.Finding[] {
261
262
  return out;
262
263
  }
263
264
 
265
+ // ---------------------------------------------------------------------------
266
+ // Source-file pass — raw C0 control bytes make a text file INVISIBLE to tools
267
+ // ---------------------------------------------------------------------------
268
+ //
269
+ // The `.md` corpus pass above defends the model's eyes. This pass defends the
270
+ // *reviewer's* and the *gate's* eyes, which is a different failure.
271
+ //
272
+ // A raw control byte (NUL above all) in a text-intended source file makes
273
+ // `file(1)`, `grep`, and every tool that sniffs for binary content classify the
274
+ // file as binary and SKIP IT SILENTLY. A linter grepping such a file reads
275
+ // nothing and reports clean; an agent gathering evidence concludes the code
276
+ // does not exist. That is indistinguishable from a pass, which is the point.
277
+ //
278
+ // Discovered the hard way: `road-to-runtime-encoding-hardening` was authored on
279
+ // the premise that `memory_lookup.ts` had "zero imports" and that the sanitize
280
+ // floor therefore ran nowhere. The file simply carried a raw NUL as a composite
281
+ // map-key separator, so `grep` never read it. The premise was a measurement
282
+ // artifact. See `agents/evidence/reports/nul-byte-source-census.md`.
283
+ //
284
+ // Precision by construction — this pass flags ONLY raw C0 controls, never the
285
+ // invisible/confusable classes `_scan` owns. In a `.ts` file a real bidi or
286
+ // zero-width codepoint is usually a deliberate test fixture or a regex
287
+ // character class (this repo has several, legitimately), so flagging those here
288
+ // would demand an allowlist that grows until the gate is worthless. A raw
289
+ // control byte has NO legitimate use in text-intended source: the language
290
+ // escape (`\0`, `\x01`) compiles to the identical runtime string and keeps the
291
+ // file readable by tools. The fix is always available, so the false-positive
292
+ // rate is structurally zero rather than merely low.
293
+
294
+ /** Extensions whose content is legitimately binary — never flagged. */
295
+ const _BINARY_EXT: ReadonlySet<string> = new Set([
296
+ 'png', 'jpg', 'jpeg', 'gif', 'ico', 'webp', 'avif', 'bmp', 'tiff',
297
+ 'pdf', 'woff', 'woff2', 'ttf', 'otf', 'eot',
298
+ 'zip', 'gz', 'tgz', 'bz2', 'xz', 'zst', '7z', 'rar',
299
+ 'wasm', 'mp3', 'mp4', 'wav', 'ogg', 'webm', 'mov', 'avi',
300
+ 'so', 'dylib', 'dll', 'node', 'a', 'o', 'exe',
301
+ 'jar', 'class', 'pyc', 'pyo',
302
+ 'db', 'sqlite', 'sqlite3', 'bin', 'dat',
303
+ 'docx', 'xlsx', 'pptx', 'doc', 'xls', 'ppt', 'odt', 'ods', 'odp',
304
+ ]);
305
+
306
+ /**
307
+ * Generated trees — skipped, because this is an AUTHORING rule.
308
+ *
309
+ * `dist/` and the per-tool projections are outputs of `src/` (see the
310
+ * `source-of-truth` rule: a projection is never edited by hand). Flagging a
311
+ * control byte there would point the author at a file they must not touch, and
312
+ * `dist/install/*.mjs` is a bundler artifact whose bytes are not even
313
+ * hand-authorable. Fix the source; the projection follows on `task sync`.
314
+ */
315
+ const _GENERATED_PREFIXES: readonly string[] = [
316
+ 'dist/',
317
+ '.augment/',
318
+ '.claude/',
319
+ '.cursor/',
320
+ '.clinerules/',
321
+ // Verbatim captured tool output, not authored text. These are RECORDINGS:
322
+ // escaping a control byte inside one would falsify the record it exists to
323
+ // preserve. If a capture needs to stay grep-readable, the fix is to escape
324
+ // at capture time — never to edit the artifact afterwards.
325
+ 'agents/evidence/analysis/',
326
+ // The frozen hostile-encoding corpus. Its positives ARE raw control
327
+ // characters — that is the thing under test, so flagging them would demand
328
+ // escaping the fixtures and thereby delete the test. The corpus has its own,
329
+ // stronger integrity controls: a sha256 freeze plus a scope-guard test that
330
+ // is itself falsified by an out-of-scope fixture. Excluded here because it
331
+ // is DATA, on the same principle as the captures above.
332
+ 'internal/bench/corpora/encoding-channels/',
333
+ ];
334
+
335
+ function _isGenerated(rel: string): boolean {
336
+ return _GENERATED_PREFIXES.some((p) => rel.startsWith(p));
337
+ }
338
+
339
+ /**
340
+ * True for a raw control CODEPOINT that is not benign whitespace.
341
+ *
342
+ * Codepoints, not bytes, and that distinction is the whole point. A first cut
343
+ * of this pass tested bytes ≤ 0x1F and let two classes through: DEL (U+007F,
344
+ * a single byte above the range) and the C1 controls (U+0080–009F, which encode
345
+ * to a two-byte UTF-8 sequence containing no byte ≤ 0x1F). Both make `file(1)`
346
+ * and git classify a file as binary — `tests/scripts/retrieval_sanitize.test.ts`
347
+ * carried U+007F and U+009F, rendered as `Bin` in `git diff`, unreviewable on a
348
+ * PR, and passed the byte-level check. A gate that misses the thing it exists to
349
+ * catch is the failure this whole roadmap is about, so the range now matches
350
+ * `_classify`'s: C0 + DEL + C1, minus tab / LF / CR.
351
+ */
352
+ function _isRawControlCodepoint(cp: number): boolean {
353
+ if (cp === 0x09 || cp === 0x0a || cp === 0x0d) return false;
354
+ return cp <= 0x1f || (cp >= 0x7f && cp <= 0x9f);
355
+ }
356
+
357
+ function _extensionOf(rel: string): string {
358
+ const base = rel.slice(rel.lastIndexOf('/') + 1);
359
+ const dot = base.lastIndexOf('.');
360
+ return dot <= 0 ? '' : base.slice(dot + 1).toLowerCase();
361
+ }
362
+
363
+ /** Tracked files, or `null` when git is unavailable (then the pass no-ops). */
364
+ function _trackedFiles(): string[] | null {
365
+ const res = spawnSync('git', ['ls-files', '-z'], {
366
+ cwd: sl.ROOT,
367
+ maxBuffer: 64 * 1024 * 1024,
368
+ });
369
+ if (res.status !== 0 || res.stdout === null) return null;
370
+ return res.stdout
371
+ .toString('utf-8')
372
+ .split('\0')
373
+ .filter((p) => p !== '');
374
+ }
375
+
376
+ /**
377
+ * Tracked files this pass is responsible for — text-intended, non-generated.
378
+ *
379
+ * Exported so a green run can state HOW MANY files it actually read. A check
380
+ * that reports "clean" without naming its scope is indistinguishable from a
381
+ * check whose scope matched nothing, which is the failure class this repo has
382
+ * already been bitten by.
383
+ */
384
+ export function _eligibleSourceFiles(): string[] | null {
385
+ const tracked = _trackedFiles();
386
+ if (tracked === null) return null;
387
+ return tracked.filter((rel) => !_isGenerated(rel) && !_BINARY_EXT.has(_extensionOf(rel)));
388
+ }
389
+
390
+ /**
391
+ * Flag raw C0 control bytes in every tracked, text-intended file.
392
+ *
393
+ * `files` is injectable so the regression test can assert a synthetic NUL is
394
+ * caught — without that assertion there is no way to know this pass can still
395
+ * fail, which is the failure mode the whole check exists to prevent.
396
+ */
397
+ export function _scanSourceControlBytes(files: readonly string[] | null = null): sl.Finding[] {
398
+ const tracked = files ?? _eligibleSourceFiles();
399
+ if (tracked === null) return [];
400
+ const out: sl.Finding[] = [];
401
+ for (const rel of tracked) {
402
+ // Re-applied here, not only in `_eligibleSourceFiles`: the exclusions
403
+ // are a property of the CHECK, so an explicit `files` list (a caller, a
404
+ // test) can never widen the scan past what the check is willing to
405
+ // claim. `_eligibleSourceFiles` exists to count, not to be the gate.
406
+ if (_isGenerated(rel)) continue;
407
+ if (_BINARY_EXT.has(_extensionOf(rel))) continue;
408
+ let data: Buffer;
409
+ try {
410
+ data = fs.readFileSync(path.join(sl.ROOT, rel));
411
+ } catch {
412
+ continue; // deleted, unreadable, or a submodule pointer
413
+ }
414
+ // A file that is not valid UTF-8 is binary regardless of its extension
415
+ // (an extensionless fixture, say) — not this check's business.
416
+ try {
417
+ new TextDecoder('utf-8', { fatal: true }).decode(data);
418
+ } catch {
419
+ continue;
420
+ }
421
+ // Iterate CODEPOINTS (the string is already known-valid UTF-8 here), so
422
+ // DEL and the C1 range are visible — see `_isRawControlCodepoint`.
423
+ let line = 1;
424
+ for (const ch of data.toString('utf-8')) {
425
+ const cp = ch.codePointAt(0);
426
+ if (cp === undefined) continue;
427
+ if (cp === 0x0a) {
428
+ line += 1;
429
+ continue;
430
+ }
431
+ if (!_isRawControlCodepoint(cp)) continue;
432
+ const hex = cp.toString(16).toUpperCase().padStart(2, '0');
433
+ out.push(
434
+ new sl.Finding(
435
+ rel,
436
+ line,
437
+ CHECK,
438
+ 'HIGH',
439
+ `raw control character U+${hex} in a text source — makes ` +
440
+ 'grep/file(1)/git treat this file as binary and skip it ' +
441
+ 'silently; use the language escape (e.g. \\0, \\x7F) instead',
442
+ 1.0,
443
+ ),
444
+ );
445
+ }
446
+ }
447
+ return out;
448
+ }
449
+
264
450
  export function _sanitize(filePath: string): string {
265
451
  const raw = fs.readFileSync(filePath, 'utf-8');
266
452
  let cleaned = '';
@@ -323,6 +509,28 @@ export function main(argv: readonly string[] | null = null): number {
323
509
  }
324
510
  }
325
511
 
512
+ // Second pass — raw control bytes in text-intended SOURCE files, which the
513
+ // `.md` corpus above does not cover. Deliberately not folded into
514
+ // `iter_corpus`: different scope (all tracked text files, not the `.md`
515
+ // corpus) and a narrower codepoint set (C0 only). `--fix` does not touch
516
+ // these — rewriting a source file's bytes is the author's call, and the
517
+ // finding names the escape to use.
518
+ const sourceFiles = _eligibleSourceFiles();
519
+ for (const h of _scanSourceControlBytes(sourceFiles)) {
520
+ findings.push(h);
521
+ }
522
+ if (!args.json) {
523
+ // State the scope on every run. A bare "clean" cannot be told apart
524
+ // from a pass whose file list was empty.
525
+ const n = sourceFiles === null ? 0 : sourceFiles.length;
526
+ process.stdout.write(
527
+ sourceFiles === null
528
+ ? ' source pass: SKIPPED — `git ls-files` unavailable, 0 files read for raw control bytes\n'
529
+ : ` source pass: ${n} tracked text file(s) read for raw C0 control bytes ` +
530
+ '(generated trees + verbatim captures excluded)\n',
531
+ );
532
+ }
533
+
326
534
  if (args.fix) {
327
535
  // sorted(flagged) — by path string.
328
536
  for (const p of [...flagged].sort()) {
@@ -36,9 +36,15 @@ const QUIET = process.argv.slice(2).includes('--quiet');
36
36
  // src/scripts/lint_load_context.ts → three dirs up is the repo root.
37
37
  const ROOT = path.resolve(path.dirname(_HERE), '..', '..');
38
38
 
39
+ // Retargeted 2026-07-29: the first two pointed at the ADR-051-emptied tree, so
40
+ // this gate reported "clean (0 declarer(s))" in CI — the count was in its own
41
+ // output the whole time. `agents/contexts` does not exist either (project-local
42
+ // contexts live under agents/settings/contexts) and is kept only as a no-op for
43
+ // consumer layouts that do have it.
39
44
  const SCAN_DIRS = [
40
- path.join(ROOT, '.agent-src.uncondensed', 'rules'),
41
- path.join(ROOT, '.agent-src.uncondensed', 'contexts'),
45
+ path.join(ROOT, 'src', 'rules'),
46
+ path.join(ROOT, 'src', 'agent-src', 'contexts'),
47
+ path.join(ROOT, 'agents', 'settings', 'contexts'),
42
48
  path.join(ROOT, 'agents', 'contexts'),
43
49
  ];
44
50
 
@@ -50,9 +56,10 @@ const ALLOWED_PREFIXES = [
50
56
 
51
57
  const LEGACY_PREFIX = '.agent-src.uncondensed/contexts/';
52
58
 
53
- const SOURCE_ROOT = path.join(ROOT, '.agent-src.uncondensed');
59
+ // Base for resolving a logical `contexts/...` entry to a real file.
60
+ const SOURCE_ROOT = path.join(ROOT, 'src', 'agent-src');
54
61
 
55
- const PUBLIC_RULE_PREFIX = '.agent-src.uncondensed/rules/';
62
+ const PUBLIC_RULE_PREFIX = 'src/rules/';
56
63
  const PROJECT_LOCAL_PREFIX = 'agents/settings/contexts/';
57
64
 
58
65
  const HARD_FLOOR_RULES: ReadonlySet<string> = new Set([
@@ -217,7 +224,12 @@ function main(): number {
217
224
  const warnings: string[] = [];
218
225
  const graph: Record<string, string[]> = {};
219
226
 
220
- for (const f of collect_files()) {
227
+ const _files = collect_files();
228
+ // Gate-coverage contract (src/config/gate-coverage.yml): count FILES INSPECTED,
229
+ // not declarers — "0 declarers" over 400 files is a legitimate result, "0 files"
230
+ // is blindness. Reporting declarers here would have hidden the dead root.
231
+ process.stdout.write(`scanned: ${String(_files.length)}\n`);
232
+ for (const f of _files) {
221
233
  const fm = parse_frontmatter(f);
222
234
  const lazyRaw = fm['load_context'];
223
235
  const eagerRaw = fm['load_context_eager'];
@@ -105,9 +105,15 @@ function _skill_roots(): string[] {
105
105
  }
106
106
  }
107
107
  }
108
- const legacy = path.join(ROOT, '.agent-src.uncondensed', 'skills');
109
- if (roots.length === 0 && _isDir(legacy)) {
110
- roots = [legacy];
108
+ // ADR-051 moved skill authoring to `src/skills`; a later commit deleted
109
+ // `packages/` entirely. Until 2026-07-29 the only fallback was the retired
110
+ // container, so this resolved to [] and the overlap gate silently passed
111
+ // every new skill.
112
+ if (roots.length === 0) {
113
+ const cand = path.join(ROOT, 'src', 'skills');
114
+ if (_isDir(cand)) {
115
+ roots = [cand];
116
+ }
111
117
  }
112
118
  return roots;
113
119
  }
@@ -26,9 +26,24 @@ const _HERE = fileURLToPath(import.meta.url);
26
26
  export const ROOT = path.resolve(path.dirname(_HERE), '..', '..');
27
27
  const SCOPE = path.join(ROOT, 'src', 'scripts');
28
28
 
29
- /** Banned rationale shapes (case-insensitive). */
29
+ /**
30
+ * Banned rationale shapes (case-insensitive).
31
+ *
32
+ * `twin-of` is qualified with a Python signal on purpose. The bare `/\btwin of\b/`
33
+ * it replaced banned an English word rather than a claim shape, and produced 6 false
34
+ * positives out of 7 findings: a CLI twin of an MCP tool, a sync twin of an async
35
+ * probe in the same file, a debate twin of a sibling function, a SQLite twin of a
36
+ * JSON cache. None of those rationalise anything by fidelity to a deleted Python
37
+ * original — which is the only thing this gate exists to stop — and rewording correct
38
+ * comments to dodge a word would have been the tail wagging the dog.
39
+ *
40
+ * The narrowing does not weaken the gate: every shape it targets names Python by
41
+ * construction ("TypeScript twin of the Python original", "twin of the retired
42
+ * .py"), so the qualifier is satisfied precisely when the claim is the banned one.
43
+ * The other three patterns already carry their own Python signal.
44
+ */
30
45
  export const BANNED: ReadonlyArray<[string, RegExp]> = [
31
- ['twin-of', /\btwin of\b/i],
46
+ ['twin-of', /\btwin of\b[^\n]*\b(?:python|py2ts|\.py)\b|\b(?:python|py2ts|\.py)\b[^\n]*\btwin of\b/i],
32
47
  ['latent-quirks', /latent (?:python )?(?:quirks|bugs) replicated/i],
33
48
  ['byte-identical-python', /byte-identical to the python/i],
34
49
  ['python-original', /\bthe python original\b/i],
@@ -373,7 +373,7 @@ function _changed(files: string[]): { pairs: Pair[]; fails: number } {
373
373
  const seen = new Set<string>();
374
374
  const record = (a: Artifact, b: Artifact): void => {
375
375
  if (a.relpath === b.relpath) return;
376
- const key = [a.relpath, b.relpath].sort().join('');
376
+ const key = [a.relpath, b.relpath].sort().join('\0');
377
377
  if (seen.has(key)) return;
378
378
  const o = overlap(a, b);
379
379
  if (o >= WARN) {
@@ -351,7 +351,7 @@ function _sortedSkillMds(root: string): string[] {
351
351
 
352
352
  /** frozenset((a, b)) — order-independent membership key. */
353
353
  function _frozenKey(a: string, b: string): string {
354
- return a <= b ? `${a}${b}` : `${b}${a}`;
354
+ return a <= b ? `${a}\0${b}` : `${b}\0${a}`;
355
355
  }
356
356
 
357
357
  /** sorted(a & b) — codepoint-sorted intersection. */
@@ -838,7 +838,7 @@ function lint(): number {
838
838
  } else {
839
839
  // fm.get("id") is None → set contains None; an id-less ticket
840
840
  // file. Represent the Python None membership separately.
841
- file_ids.add('__none__');
841
+ file_ids.add('\0__none__');
842
842
  }
843
843
  }
844
844
  }
@@ -0,0 +1,170 @@
1
+ #!/usr/bin/env tsx
2
+ /**
3
+ * Lint the UI-track verb → skill-bundle map.
4
+ *
5
+ * The stack-dispatched UI steps halt with a directive verb
6
+ * (`ui-apply-<stack>` and friends). Those verbs are agent-interpreted, not
7
+ * skill paths — only 2 of the engine's 11 literal verbs name a real skill — so
8
+ * the mapping from verb to the skills that implement it is a separate fact.
9
+ * It used to live only in a prose table in `docs/contracts/ui-track-flow.md`,
10
+ * unverified, and two of its four rows were wrong: `vue` named the verb itself
11
+ * (no skill at all) and `plain` — the fallback for every unrecognised project —
12
+ * named `blade-ui`, a `packs: [laravel]` skill that a non-Laravel consumer does
13
+ * not have installed.
14
+ *
15
+ * Two assertions, both decidable in this repo:
16
+ *
17
+ * 1. RESOLUTION — every bundle member is a real skill (`src/skills/<n>/SKILL.md`).
18
+ * 2. PACK REACH — a lane declared `pack_agnostic` names only skills that ship
19
+ * in a stack-neutral pack. This is the assertion that actually matters: CI
20
+ * here cannot see a consumer's installed pack combination, so "the skill
21
+ * exists in our tree" would have passed the `plain → blade-ui` defect
22
+ * unchanged.
23
+ *
24
+ * Exit codes: 0 clean, 1 one or more findings.
25
+ */
26
+
27
+ import * as fs from 'node:fs';
28
+ import * as path from 'node:path';
29
+ import { fileURLToPath } from 'node:url';
30
+
31
+ import {
32
+ STACK_BUNDLES,
33
+ type StackBundle,
34
+ } from '../agent-src/templates/scripts/work_engine/directives/ui/stack_bundles.js';
35
+
36
+ const QUIET = process.argv.includes('--quiet');
37
+
38
+ const _HERE = fileURLToPath(import.meta.url);
39
+ const REPO = path.resolve(path.dirname(_HERE), '..', '..');
40
+ const SKILLS_DIR = path.join(REPO, 'src', 'skills');
41
+
42
+ /**
43
+ * Packs that ship regardless of the project's framework. A `pack_agnostic`
44
+ * lane may only draw on these — anything else is unavailable to some consumer.
45
+ */
46
+ const STACK_NEUTRAL_PACKS: ReadonlySet<string> = new Set(['engineering-base', 'core', 'meta']);
47
+
48
+ const findings: string[] = [];
49
+
50
+ function skill_path(name: string): string {
51
+ return path.join(SKILLS_DIR, name, 'SKILL.md');
52
+ }
53
+
54
+ /** Return the `packs:` list from a skill's frontmatter, or `null` if absent. */
55
+ function packs_of(name: string): string[] | null {
56
+ let text: string;
57
+ try {
58
+ text = fs.readFileSync(skill_path(name), { encoding: 'utf-8' });
59
+ } catch {
60
+ return null;
61
+ }
62
+ // Frontmatter only — a `packs:` mention in the body is not a declaration.
63
+ const end = text.indexOf('\n---', 4);
64
+ const front = end === -1 ? text : text.slice(0, end);
65
+ // `[ \t]*`, not `\s*`: `\s` matches a newline, so the greedy form swallowed
66
+ // the line break and captured the first block-list item as if it were an
67
+ // inline value — which made every block-list skill parse as "no packs".
68
+ const match = /^packs:[ \t]*(.*)$/m.exec(front);
69
+ if (match === null) return null;
70
+ const inline = (match[1] ?? '').trim();
71
+ if (inline.startsWith('[')) {
72
+ return inline
73
+ .replace(/^\[|\]$/g, '')
74
+ .split(',')
75
+ .map((s) => s.trim().replace(/^['"]|['"]$/g, ''))
76
+ .filter((s) => s !== '');
77
+ }
78
+ // Block list: consume the ` - name` lines that follow. `match[0]` stops
79
+ // before the newline, so the first split element is the empty tail of the
80
+ // matched line itself — dropping it is required, not cosmetic: treating it
81
+ // as a non-item ended the loop immediately and made every block-list skill
82
+ // parse as "no packs", which is how this linter first shipped green against
83
+ // the very defect it exists to catch.
84
+ const rest = front.slice(match.index + match[0].length).split('\n').slice(1);
85
+ const out: string[] = [];
86
+ for (const line of rest) {
87
+ const item = /^\s*-\s*(.+?)\s*$/.exec(line);
88
+ if (item === null) break;
89
+ out.push((item[1] ?? '').replace(/^['"]|['"]$/g, ''));
90
+ }
91
+ return out;
92
+ }
93
+
94
+ function check_lane(lane: string, bundle: StackBundle): void {
95
+ const members = [...bundle.build, ...bundle.review];
96
+ if (members.length === 0) {
97
+ findings.push(`${lane}: bundle is empty — a lane must name at least one skill.`);
98
+ return;
99
+ }
100
+ for (const name of new Set(members)) {
101
+ // 1. RESOLUTION
102
+ if (!fs.existsSync(skill_path(name))) {
103
+ findings.push(
104
+ `${lane}: bundle member \`${name}\` has no ` +
105
+ `\`src/skills/${name}/SKILL.md\` — the verb would resolve to nothing.`,
106
+ );
107
+ continue;
108
+ }
109
+ // 2. PACK REACH
110
+ if (!bundle.pack_agnostic) continue;
111
+ const packs = packs_of(name);
112
+ if (packs === null) {
113
+ findings.push(
114
+ `${lane}: bundle member \`${name}\` declares no \`packs:\` — ` +
115
+ 'a pack-agnostic lane cannot verify it ships everywhere.',
116
+ );
117
+ continue;
118
+ }
119
+ const offenders = packs.filter((p) => !STACK_NEUTRAL_PACKS.has(p));
120
+ if (offenders.length > 0) {
121
+ findings.push(
122
+ `${lane}: lane is \`pack_agnostic\` but member \`${name}\` ships only in ` +
123
+ `[${offenders.join(', ')}] — a consumer without that pack gets nothing. ` +
124
+ 'This is the `plain → blade-ui` defect class.',
125
+ );
126
+ }
127
+ }
128
+ }
129
+
130
+ function main(): number {
131
+ const lanes = Object.keys(STACK_BUNDLES).sort();
132
+ if (lanes.length === 0) {
133
+ process.stderr.write('lint-ui-stack-bundles: STACK_BUNDLES is empty — nothing to check.\n');
134
+ return 1;
135
+ }
136
+ for (const lane of lanes) {
137
+ check_lane(lane, STACK_BUNDLES[lane] as StackBundle);
138
+ }
139
+
140
+ // A lane usable as a fallback must be pack-agnostic, else the fallback
141
+ // itself is the thing that fails for an unpredictable consumer.
142
+ const plain = STACK_BUNDLES['plain'];
143
+ if (plain === undefined) {
144
+ findings.push('plain: missing — it is the documented DEFAULT_DIRECTIVE lane.');
145
+ } else if (!plain.pack_agnostic) {
146
+ findings.push(
147
+ 'plain: the fallback lane must be `pack_agnostic` — every unrecognised ' +
148
+ 'project lands here and its packs are unknown.',
149
+ );
150
+ }
151
+
152
+ if (findings.length > 0) {
153
+ for (const f of findings) {
154
+ process.stdout.write(`lint-ui-stack-bundles: ${f}\n`);
155
+ }
156
+ process.stderr.write(
157
+ `lint-ui-stack-bundles: ${findings.length} finding(s) across ${lanes.length} lane(s).\n`,
158
+ );
159
+ return 1;
160
+ }
161
+ if (!QUIET) {
162
+ process.stdout.write(
163
+ `lint-ui-stack-bundles: ${lanes.length} lane(s) clean — every bundle member ` +
164
+ 'resolves, and every pack-agnostic lane stays stack-neutral.\n',
165
+ );
166
+ }
167
+ return 0;
168
+ }
169
+
170
+ process.exit(main());
@@ -97,10 +97,10 @@ export type ToolSideEffect = 'ro' | 'fs-write' | 'shell';
97
97
  * each `tools/call`. `handler` is an async function that receives the
98
98
  * validated arguments + the resolved `consumer_root` path.
99
99
  *
100
- * Mirrors the Python frozen dataclass `BuiltinTool` (field order
101
- * preserved). `side_effect` is a TS-only addition (Phase 3 of
102
- * road-to-credible-install) — the Python original predates the generated
103
- * catalog and had no analogous field.
100
+ * Shape is pinned by `consumer_tool_catalog.json`: `build_mcp_catalog` derives
101
+ * the catalog from `ALLOWLIST` here, and `build_mcp_catalog --strict` fails CI
102
+ * on any drift (`.github/workflows/tests.yml`). `side_effect` is consumed by that
103
+ * generator, so adding or reordering a field means regenerating the catalog.
104
104
  */
105
105
  export interface BuiltinTool {
106
106
  readonly name: string;