@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,500 @@
1
+ #!/usr/bin/env tsx
2
+ /**
3
+ * Frozen labelled corpus for the text-layer encoding channels
4
+ * (road-to-runtime-encoding-hardening Phase 2).
5
+ *
6
+ * Own code. The channel TAXONOMY is this package's own Phase-1 measurement
7
+ * (`agents/evidence/reports/encoding-channel-coverage.md`); no fixture, payload,
8
+ * or encoder is derived from any external source.
9
+ *
10
+ * Two properties the freeze depends on:
11
+ *
12
+ * 1. DETERMINISTIC. No `Math.random`, no clock. Carrier selection and channel
13
+ * assignment are index-derived, so the emitted corpus is byte-identical on
14
+ * every run and the sha256 manifest is meaningful. Re-running this script
15
+ * must never change the corpus without a source change.
16
+ *
17
+ * 2. NEUTRAL CARRIERS. Carrier sentences are ordinary engineering prose, not
18
+ * injection strings. The detectors under test are STRUCTURAL — they read
19
+ * codepoints, not meaning — so carrier semantics are irrelevant to recall,
20
+ * and using neutral text keeps this from becoming a reusable attack
21
+ * corpus. This matches the payload-free stance of
22
+ * `skills/judge-injection-defense/fixtures/perturbation-taxonomy.json`.
23
+ *
24
+ * Negatives are drawn from REAL in-repo content (rule bodies, retrieval-store
25
+ * chunks, inter-agent message shapes) so the false-positive rate is measured
26
+ * against realistic traffic rather than toy text.
27
+ *
28
+ * Usage:
29
+ * encoding_corpus --emit # write the corpus + manifest
30
+ * encoding_corpus --check # verify on-disk corpus matches the manifest
31
+ */
32
+ import * as fs from 'node:fs';
33
+ import * as path from 'node:path';
34
+ import * as crypto from 'node:crypto';
35
+ import { fileURLToPath, pathToFileURL } from 'node:url';
36
+
37
+ const _HERE = path.dirname(fileURLToPath(import.meta.url));
38
+ export const ROOT = path.resolve(_HERE, '..', '..');
39
+ export const OUT_DIR = path.join(ROOT, 'internal', 'bench', 'corpora', 'encoding-channels');
40
+
41
+ const cp = (n: number): string => String.fromCodePoint(n);
42
+
43
+ // ---------------------------------------------------------------------------
44
+ // Channel encoders — one per in-scope TEXT-layer channel
45
+ // ---------------------------------------------------------------------------
46
+ //
47
+ // `layer` is asserted by the scope-guard test: the corpus must contain ONLY
48
+ // `text`. It exists so the corpus cannot silently drift into claiming coverage
49
+ // of file/network-layer steganography, which is out of this package's threat
50
+ // model (it governs text, not files or packets).
51
+
52
+ export type Layer = 'text';
53
+
54
+ export interface ChannelSpec {
55
+ readonly id: string;
56
+ readonly layer: Layer;
57
+ /** `strip` = the floor removes it · `flag` = surfaced, text unchanged. */
58
+ readonly disposition: 'strip' | 'flag';
59
+ /** Splice the channel into a carrier. Must be deterministic. */
60
+ readonly encode: (carrier: string, i: number) => string;
61
+ }
62
+
63
+ /** Insert `mark` inside the first word longer than 3 chars (stable choice). */
64
+ function _spliceIntoWord(carrier: string, mark: string): string {
65
+ const words = carrier.split(' ');
66
+ const idx = words.findIndex((w) => w.replace(/[^A-Za-z]/g, '').length > 3);
67
+ const at = idx === -1 ? 0 : idx;
68
+ const w = words[at] as string;
69
+ const cut = Math.max(1, Math.floor(w.length / 2));
70
+ words[at] = w.slice(0, cut) + mark + w.slice(cut);
71
+ return words.join(' ');
72
+ }
73
+
74
+ /** Swap ASCII letters in the first eligible word for the given lookalikes. */
75
+ function _swapLookalikes(carrier: string, map: ReadonlyMap<string, string>): string {
76
+ const words = carrier.split(' ');
77
+ const idx = words.findIndex((w) => [...w.toLowerCase()].some((ch) => map.has(ch)));
78
+ if (idx === -1) return carrier;
79
+ const w = words[idx] as string;
80
+ words[idx] = [...w].map((ch) => map.get(ch.toLowerCase()) ?? ch).join('');
81
+ return words.join(' ');
82
+ }
83
+
84
+ const _CYRILLIC = new Map([['o', cp(0x043e)], ['e', cp(0x0435)], ['a', cp(0x0430)], ['i', cp(0x0456)]]);
85
+ const _GREEK = new Map([['o', cp(0x03bf)], ['a', cp(0x03b1)], ['p', cp(0x03c1)]]);
86
+
87
+ /** ASCII letter -> Mathematical Sans-Serif (U+1D5A0 upper / U+1D5BA lower). */
88
+ function _toMathSans(word: string): string {
89
+ return [...word]
90
+ .map((ch) => {
91
+ const c = ch.codePointAt(0) as number;
92
+ if (c >= 0x41 && c <= 0x5a) return cp(0x1d5a0 + (c - 0x41));
93
+ if (c >= 0x61 && c <= 0x7a) return cp(0x1d5ba + (c - 0x61));
94
+ return ch;
95
+ })
96
+ .join('');
97
+ }
98
+
99
+ /** ASCII -> Halfwidth/Fullwidth Forms (U+FF01 offset from U+0021). */
100
+ function _toFullwidth(word: string): string {
101
+ return [...word]
102
+ .map((ch) => {
103
+ const c = ch.codePointAt(0) as number;
104
+ return c >= 0x21 && c <= 0x7e ? cp(0xff01 + (c - 0x21)) : ch;
105
+ })
106
+ .join('');
107
+ }
108
+
109
+ function _mapFirstLongWord(carrier: string, fn: (w: string) => string): string {
110
+ const words = carrier.split(' ');
111
+ const idx = words.findIndex((w) => w.replace(/[^A-Za-z]/g, '').length > 3);
112
+ const at = idx === -1 ? 0 : idx;
113
+ words[at] = fn(words[at] as string);
114
+ return words.join(' ');
115
+ }
116
+
117
+ export const CHANNELS: readonly ChannelSpec[] = [
118
+ // --- invisible / control: already stripped by the live floor -------------
119
+ {
120
+ id: 'zero-width',
121
+ layer: 'text',
122
+ disposition: 'strip',
123
+ encode: (c, i) => _spliceIntoWord(c, cp([0x200b, 0x200c, 0x200d][i % 3] as number)),
124
+ },
125
+ {
126
+ id: 'zero-width-joiner-bom',
127
+ layer: 'text',
128
+ disposition: 'strip',
129
+ encode: (c, i) => _spliceIntoWord(c, cp([0xfeff, 0x2060, 0x00ad][i % 3] as number)),
130
+ },
131
+ {
132
+ id: 'bidi-control',
133
+ layer: 'text',
134
+ disposition: 'strip',
135
+ encode: (c, i) => {
136
+ const open = [0x202e, 0x202d, 0x2066, 0x2067][i % 4] as number;
137
+ return cp(open) + c + cp(0x202c);
138
+ },
139
+ },
140
+ {
141
+ id: 'invisible-tag-block',
142
+ layer: 'text',
143
+ disposition: 'strip',
144
+ encode: (c, i) => _spliceIntoWord(c, cp(0xe0041 + (i % 26))),
145
+ },
146
+ {
147
+ id: 'deprecated-format',
148
+ layer: 'text',
149
+ disposition: 'strip',
150
+ encode: (c, i) => _spliceIntoWord(c, cp([0x206a, 0x206c, 0x206e, 0xfff9][i % 4] as number)),
151
+ },
152
+ {
153
+ id: 'private-use-area',
154
+ layer: 'text',
155
+ disposition: 'strip',
156
+ encode: (c, i) => _spliceIntoWord(c, cp([0xe000, 0xe123, 0xf8ff][i % 3] as number)),
157
+ },
158
+ {
159
+ id: 'control-char',
160
+ layer: 'text',
161
+ disposition: 'strip',
162
+ encode: (c, i) => _spliceIntoWord(c, cp([0x01, 0x0b, 0x1b, 0x7f, 0x85, 0x9b][i % 6] as number)),
163
+ },
164
+ // --- Phase-1 gaps: uncovered by the live floor ---------------------------
165
+ {
166
+ id: 'invisible-filler',
167
+ layer: 'text',
168
+ disposition: 'strip', // Phase-1 disposition: invisible, no legitimate use here
169
+ encode: (c, i) => _spliceIntoWord(c, cp([0x3164, 0x115f, 0x1160][i % 3] as number)),
170
+ },
171
+ {
172
+ id: 'variation-selector-run',
173
+ layer: 'text',
174
+ disposition: 'flag', // a RUN is the signal; a single VS is legitimate (emoji)
175
+ encode: (c, i) => {
176
+ const base = 0xe0100 + (i % 8);
177
+ const run = [base, base + 1, base + 2, base + 3].slice(0, 3 + (i % 2));
178
+ return _spliceIntoWord(c, run.map(cp).join(''));
179
+ },
180
+ },
181
+ {
182
+ id: 'confusable-cyrillic',
183
+ layer: 'text',
184
+ disposition: 'flag',
185
+ encode: (c) => _swapLookalikes(c, _CYRILLIC),
186
+ },
187
+ {
188
+ id: 'confusable-greek',
189
+ layer: 'text',
190
+ disposition: 'flag',
191
+ encode: (c) => _swapLookalikes(c, _GREEK),
192
+ },
193
+ {
194
+ id: 'math-alphanumeric',
195
+ layer: 'text',
196
+ disposition: 'flag',
197
+ encode: (c) => _mapFirstLongWord(c, _toMathSans),
198
+ },
199
+ {
200
+ id: 'fullwidth-forms',
201
+ layer: 'text',
202
+ disposition: 'flag',
203
+ encode: (c) => _mapFirstLongWord(c, _toFullwidth),
204
+ },
205
+ {
206
+ id: 'combining-mark-run',
207
+ layer: 'text',
208
+ disposition: 'flag',
209
+ encode: (c, i) => _spliceIntoWord(c, cp(0x0301).repeat(8 + (i % 8))),
210
+ },
211
+ {
212
+ id: 'punycode-idn',
213
+ layer: 'text',
214
+ disposition: 'flag',
215
+ encode: (c, i) => `${c} see xn--${['80ak6aa92e', 'e1afmkfd', 'mgbh0fb'][i % 3]}.example for detail`,
216
+ },
217
+ ];
218
+
219
+ // ---------------------------------------------------------------------------
220
+ // Carriers — ordinary engineering prose, deliberately not injection strings
221
+ // ---------------------------------------------------------------------------
222
+
223
+ export const CARRIERS: readonly string[] = [
224
+ 'The migration must remain reversible before it reaches production.',
225
+ 'Every list endpoint paginates or declares an explicit bound.',
226
+ 'Tenant scope is derived server side, never taken from the request body.',
227
+ 'Index parity is checked for each foreign key column.',
228
+ 'The dispatcher refuses to advance without recorded audit findings.',
229
+ 'Retention policy is declared for every append only table.',
230
+ 'Secrets rotate through the configured manager, not through committed files.',
231
+ 'A queue consumer retries with backoff and a dead letter path.',
232
+ 'Response shape changes require a documented deprecation window.',
233
+ 'Cache invalidation happens inside the same transaction boundary.',
234
+ 'The scheduler holds a lock so concurrent runs cannot overlap.',
235
+ 'Structured logging omits every direct identifier by construction.',
236
+ 'Feature flags default to the safe branch when the store is unreachable.',
237
+ 'Background jobs are idempotent because delivery is at least once.',
238
+ 'The health endpoint reports dependency status without leaking hostnames.',
239
+ 'Schema migrations expand first and contract in a later release.',
240
+ 'Authorization is asserted per object, not once per session.',
241
+ 'Uploads are validated server side against an allow list of types.',
242
+ 'Outbound requests carry a timeout and a bounded retry budget.',
243
+ 'Test data is generated from the schema so drift surfaces early.',
244
+ ];
245
+
246
+ // ---------------------------------------------------------------------------
247
+ // Negatives — REAL in-repo content, so the FP rate is measured on real traffic
248
+ // ---------------------------------------------------------------------------
249
+
250
+ interface NegativeSource {
251
+ readonly kind: 'rule-body' | 'retrieval-chunk' | 'inter-agent-message';
252
+ /** Real in-repo directories. Several per kind, because one may be small. */
253
+ readonly dirs: readonly string[];
254
+ readonly quota: number;
255
+ }
256
+
257
+ // The three kinds the roadmap named. Each draws from real content of THAT kind —
258
+ // `agents/memory` is literally what `retrieve()` reads, and the orchestration
259
+ // prompt templates are literally what crosses the agent boundary. Multiple dirs
260
+ // per kind because `retrieval-store` alone yields only ~39 eligible lines, and
261
+ // the emitter must never pad a shortfall with invented text.
262
+ const _NEGATIVE_SOURCES: readonly NegativeSource[] = [
263
+ { kind: 'rule-body', dirs: ['src/rules'], quota: 120 },
264
+ {
265
+ kind: 'retrieval-chunk',
266
+ dirs: ['agents/memory', 'internal/bench/second-brain/retrieval-store'],
267
+ quota: 120,
268
+ },
269
+ {
270
+ kind: 'inter-agent-message',
271
+ dirs: ['src/skills/subagent-orchestration/prompts', 'src/subagents'],
272
+ quota: 120,
273
+ },
274
+ ];
275
+
276
+ function _listFiles(dir: string, exts: readonly string[]): string[] {
277
+ const abs = path.join(ROOT, dir);
278
+ if (!fs.existsSync(abs)) return [];
279
+ const out: string[] = [];
280
+ const walk = (d: string): void => {
281
+ for (const e of fs.readdirSync(d, { withFileTypes: true }).sort((a, b) => a.name.localeCompare(b.name))) {
282
+ const p = path.join(d, e.name);
283
+ if (e.isDirectory()) walk(p);
284
+ else if (exts.some((x) => e.name.endsWith(x))) out.push(p);
285
+ }
286
+ };
287
+ walk(abs);
288
+ return out.sort();
289
+ }
290
+
291
+ /** Sentence-ish slices of real content, long enough to be realistic traffic. */
292
+ function _realSnippets(dir: string, limit: number): string[] {
293
+ const files = _listFiles(dir, ['.md', '.yml', '.yaml']);
294
+ const out: string[] = [];
295
+ for (const f of files) {
296
+ const text = fs.readFileSync(f, 'utf-8');
297
+ for (const raw of text.split('\n')) {
298
+ const line = raw.trim();
299
+ // Skip structure so negatives are prose/values, not markdown scaffold.
300
+ if (line.length < 60 || line.length > 400) continue;
301
+ if (/^[#>|\-*`+\[\]{}]/.test(line)) continue;
302
+ if (line.includes('](')) continue;
303
+ out.push(line);
304
+ if (out.length >= limit) return out;
305
+ }
306
+ }
307
+ return out;
308
+ }
309
+
310
+ // ---------------------------------------------------------------------------
311
+ // Corpus construction
312
+ // ---------------------------------------------------------------------------
313
+
314
+ export interface CorpusEntry {
315
+ readonly id: string;
316
+ readonly label: 'positive' | 'negative';
317
+ /** Channel id for positives; the source kind for negatives. */
318
+ readonly channel: string;
319
+ readonly layer: Layer;
320
+ readonly disposition: 'strip' | 'flag' | 'none';
321
+ readonly text: string;
322
+ }
323
+
324
+ export const MIN_POSITIVES = 300;
325
+ export const MIN_NEGATIVES = 300;
326
+
327
+ export function buildPositives(): CorpusEntry[] {
328
+ const out: CorpusEntry[] = [];
329
+ // Round-robin so the channel histogram is balanced by construction rather
330
+ // than by luck: every channel gets the same count, over varied carriers.
331
+ const perChannel = Math.ceil(MIN_POSITIVES / CHANNELS.length);
332
+ for (const [ci, ch] of CHANNELS.entries()) {
333
+ for (let k = 0; k < perChannel; k++) {
334
+ const carrier = CARRIERS[(ci * perChannel + k) % CARRIERS.length] as string;
335
+ out.push({
336
+ id: `pos-${ch.id}-${String(k).padStart(3, '0')}`,
337
+ label: 'positive',
338
+ channel: ch.id,
339
+ layer: ch.layer,
340
+ disposition: ch.disposition,
341
+ text: ch.encode(carrier, k),
342
+ });
343
+ }
344
+ }
345
+ return out;
346
+ }
347
+
348
+ export function buildNegatives(): CorpusEntry[] {
349
+ const out: CorpusEntry[] = [];
350
+ for (const src of _NEGATIVE_SOURCES) {
351
+ const seen = new Set<string>();
352
+ const collected: string[] = [];
353
+ for (const dir of src.dirs) {
354
+ for (const text of _realSnippets(dir, src.quota)) {
355
+ if (collected.length >= src.quota) break;
356
+ if (seen.has(text)) continue; // the same line can recur across files
357
+ seen.add(text);
358
+ collected.push(text);
359
+ }
360
+ if (collected.length >= src.quota) break;
361
+ }
362
+ for (const [k, text] of collected.entries()) {
363
+ out.push({
364
+ id: `neg-${src.kind}-${String(k).padStart(3, '0')}`,
365
+ label: 'negative',
366
+ channel: src.kind,
367
+ layer: 'text',
368
+ disposition: 'none',
369
+ text,
370
+ });
371
+ }
372
+ }
373
+ return out;
374
+ }
375
+
376
+ function _jsonl(entries: readonly CorpusEntry[]): string {
377
+ return entries.map((e) => JSON.stringify(e)).join('\n') + '\n';
378
+ }
379
+
380
+ function _sha256(s: string): string {
381
+ return crypto.createHash('sha256').update(s, 'utf-8').digest('hex');
382
+ }
383
+
384
+ export interface Manifest {
385
+ readonly corpus_version: number;
386
+ readonly note: string;
387
+ readonly counts: { positives: number; negatives: number; channels: number };
388
+ readonly channel_histogram: Record<string, number>;
389
+ readonly sha256: Record<string, string>;
390
+ }
391
+
392
+ export function buildManifest(pos: readonly CorpusEntry[], neg: readonly CorpusEntry[]): Manifest {
393
+ const hist: Record<string, number> = {};
394
+ for (const e of pos) hist[e.channel] = (hist[e.channel] ?? 0) + 1;
395
+ return {
396
+ corpus_version: 1,
397
+ note:
398
+ 'Frozen labelled corpus for text-layer encoding channels. Regenerate ONLY via ' +
399
+ 'encoding_corpus --emit after a deliberate source change; the sha256 entries are the ' +
400
+ 'freeze. Detectors are never tuned against this corpus (golden-set-freeze).',
401
+ counts: { positives: pos.length, negatives: neg.length, channels: CHANNELS.length },
402
+ channel_histogram: hist,
403
+ sha256: { 'positives.jsonl': _sha256(_jsonl(pos)), 'negatives.jsonl': _sha256(_jsonl(neg)) },
404
+ };
405
+ }
406
+
407
+ function _emit(): number {
408
+ const pos = buildPositives();
409
+ const neg = buildNegatives();
410
+ if (pos.length < MIN_POSITIVES) {
411
+ process.stderr.write(`error: ${pos.length} positives < required ${MIN_POSITIVES}\n`);
412
+ return 1;
413
+ }
414
+ if (neg.length < MIN_NEGATIVES) {
415
+ process.stderr.write(
416
+ `error: ${neg.length} negatives < required ${MIN_NEGATIVES} — real-content sources ` +
417
+ 'did not yield enough snippets; widen the sources, never pad with toy text\n',
418
+ );
419
+ return 1;
420
+ }
421
+ fs.mkdirSync(OUT_DIR, { recursive: true });
422
+ fs.writeFileSync(path.join(OUT_DIR, 'positives.jsonl'), _jsonl(pos), 'utf-8');
423
+ fs.writeFileSync(path.join(OUT_DIR, 'negatives.jsonl'), _jsonl(neg), 'utf-8');
424
+ const manifest = buildManifest(pos, neg);
425
+ fs.writeFileSync(
426
+ path.join(OUT_DIR, 'manifest.json'),
427
+ JSON.stringify(manifest, null, 2) + '\n',
428
+ 'utf-8',
429
+ );
430
+ process.stdout.write(
431
+ `✅ encoding corpus: ${pos.length} positives across ${CHANNELS.length} channels, ` +
432
+ `${neg.length} negatives from real content\n`,
433
+ );
434
+ return 0;
435
+ }
436
+
437
+ /**
438
+ * Verify an on-disk corpus against its manifest.
439
+ *
440
+ * `dir` is injectable so a test can prove the drift detection actually fires
441
+ * **on a throwaway copy**. The obvious version of that test — tamper with the
442
+ * committed corpus, assert failure, restore — introduces a shared-state race:
443
+ * vitest runs files in parallel, so another suite reading the same corpus while
444
+ * it is briefly tampered fails intermittently. An intermittently red gate is
445
+ * worse than a missing one, so the seam exists to remove the mutation entirely.
446
+ */
447
+ export function verifyFreeze(dir: string = OUT_DIR): number {
448
+ const manifestPath = path.join(dir, 'manifest.json');
449
+ if (!fs.existsSync(manifestPath)) {
450
+ process.stderr.write('error: manifest.json missing — run encoding_corpus --emit\n');
451
+ return 1;
452
+ }
453
+ const manifest = JSON.parse(fs.readFileSync(manifestPath, 'utf-8')) as Manifest;
454
+ let bad = 0;
455
+ for (const [name, want] of Object.entries(manifest.sha256)) {
456
+ const got = _sha256(fs.readFileSync(path.join(dir, name), 'utf-8'));
457
+ if (got !== want) {
458
+ process.stderr.write(`❌ ${name}: sha256 drift\n manifest ${want}\n on disk ${got}\n`);
459
+ bad += 1;
460
+ }
461
+ }
462
+ if (bad > 0) {
463
+ process.stderr.write(
464
+ 'The corpus is FROZEN. A drift means either an accidental edit (restore it) or a ' +
465
+ 'deliberate change (re-emit, and say so — a detector must never be tuned against it).\n',
466
+ );
467
+ return 1;
468
+ }
469
+ process.stdout.write(`✅ encoding corpus matches its frozen manifest (${Object.keys(manifest.sha256).length} files)\n`);
470
+ return 0;
471
+ }
472
+
473
+ export function main(argv: readonly string[] | null = null): number {
474
+ const args = argv ?? process.argv.slice(2);
475
+ if (args.includes('-h') || args.includes('--help')) {
476
+ process.stdout.write('usage: encoding_corpus [--emit | --check]\n');
477
+ return 0;
478
+ }
479
+ if (args.includes('--emit')) return _emit();
480
+ if (args.includes('--check')) return verifyFreeze();
481
+ process.stderr.write('usage: encoding_corpus [--emit | --check]\n');
482
+ return 2;
483
+ }
484
+
485
+ declare const __AGENT_CONFIG_BUNDLE__: boolean | undefined;
486
+ function _isCliEntry(): boolean {
487
+ if (typeof __AGENT_CONFIG_BUNDLE__ !== 'undefined' && __AGENT_CONFIG_BUNDLE__) return false;
488
+ if (process.argv[1] === undefined) return false;
489
+ const argvUrl = pathToFileURL(path.resolve(process.argv[1])).href;
490
+ if (import.meta.url === argvUrl) return true;
491
+ try {
492
+ return fs.realpathSync(fileURLToPath(import.meta.url)) === fs.realpathSync(path.resolve(process.argv[1]));
493
+ } catch {
494
+ return false;
495
+ }
496
+ }
497
+
498
+ if (_isCliEntry()) {
499
+ process.exitCode = main();
500
+ }