@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,216 @@
1
+ #!/usr/bin/env tsx
2
+ /**
3
+ * Measure the encoding floor against the FROZEN corpus
4
+ * (road-to-runtime-encoding-hardening Phase 4).
5
+ *
6
+ * Renders the numbers from the corpus — never hand-typed — and evaluates them
7
+ * against the thresholds the roadmap pre-registered BEFORE the detector existed:
8
+ *
9
+ * recall on in-scope positives >= 0.95
10
+ * recall on unambiguous classes >= 0.99
11
+ * (zero-width, bidi, variation-selector)
12
+ * false-positive rate on clean negatives <= 0.005
13
+ * added runtime model spend == 0 (structural: no model call)
14
+ * added latency < 2 ms p95 per message
15
+ *
16
+ * A positive counts as DETECTED when the floor either strips its signal
17
+ * (`sanitize_text` changed the value) or reports it (`scan_encoding_findings`
18
+ * returned a finding). Both are "the vector did not reach the model unnoticed",
19
+ * which is the property under test.
20
+ *
21
+ * Usage:
22
+ * encoding_corpus_report # human summary + exit 1 if a gate fails
23
+ * encoding_corpus_report --json # machine payload
24
+ */
25
+ import * as fs from 'node:fs';
26
+ import * as path from 'node:path';
27
+ import { fileURLToPath, pathToFileURL } from 'node:url';
28
+
29
+ import { OUT_DIR, type CorpusEntry } from './encoding_corpus.js';
30
+ import { sanitize_text, scan_encoding_findings } from './_lib/retrieval_sanitize.js';
31
+
32
+ /** Pre-registered acceptance thresholds — do not edit to make a run pass. */
33
+ export const THRESHOLDS = {
34
+ recall_all: 0.95,
35
+ recall_unambiguous: 0.99,
36
+ fp_rate_max: 0.005,
37
+ latency_p95_ms_max: 2,
38
+ } as const;
39
+
40
+ /** Classes the roadmap singled out as unambiguous → higher recall bar. */
41
+ export const UNAMBIGUOUS_CHANNELS: readonly string[] = [
42
+ 'zero-width',
43
+ 'zero-width-joiner-bom',
44
+ 'bidi-control',
45
+ 'variation-selector-run',
46
+ ];
47
+
48
+ function _readJsonl(name: string): CorpusEntry[] {
49
+ return fs
50
+ .readFileSync(path.join(OUT_DIR, name), 'utf-8')
51
+ .split('\n')
52
+ .filter((l) => l !== '')
53
+ .map((l) => JSON.parse(l) as CorpusEntry);
54
+ }
55
+
56
+ /** True when the floor either stripped or reported the entry's signal. */
57
+ export function detected(text: string): { hit: boolean; stripped: boolean; flagged: boolean } {
58
+ const stripped = sanitize_text(text) !== text;
59
+ const flagged = scan_encoding_findings(text).length > 0;
60
+ return { hit: stripped || flagged, stripped, flagged };
61
+ }
62
+
63
+ export interface Report {
64
+ readonly corpus: { positives: number; negatives: number };
65
+ readonly recall_all: number;
66
+ readonly recall_unambiguous: number;
67
+ readonly fp_rate: number;
68
+ readonly per_channel: Record<string, { n: number; detected: number; recall: number }>;
69
+ readonly false_positives: readonly string[];
70
+ readonly latency_p95_ms: number;
71
+ readonly model_calls: 0;
72
+ readonly gates: Record<string, { value: number; threshold: number; pass: boolean }>;
73
+ readonly verdict: 'ADOPT' | 'DETECT-AND-FLAG-ONLY' | 'FAIL';
74
+ }
75
+
76
+ function _p95(samples: readonly number[]): number {
77
+ const sorted = [...samples].sort((a, b) => a - b);
78
+ const idx = Math.min(sorted.length - 1, Math.floor(sorted.length * 0.95));
79
+ return sorted[idx] ?? 0;
80
+ }
81
+
82
+ export function measure(): Report {
83
+ const positives = _readJsonl('positives.jsonl');
84
+ const negatives = _readJsonl('negatives.jsonl');
85
+
86
+ const perChannel: Record<string, { n: number; detected: number; recall: number }> = {};
87
+ const latencies: number[] = [];
88
+ let hits = 0;
89
+ for (const e of positives) {
90
+ const t0 = process.hrtime.bigint();
91
+ const d = detected(e.text);
92
+ latencies.push(Number(process.hrtime.bigint() - t0) / 1e6);
93
+ const slot = perChannel[e.channel] ?? { n: 0, detected: 0, recall: 0 };
94
+ slot.n += 1;
95
+ if (d.hit) {
96
+ slot.detected += 1;
97
+ hits += 1;
98
+ }
99
+ slot.recall = slot.detected / slot.n;
100
+ perChannel[e.channel] = slot;
101
+ }
102
+
103
+ const falsePositives: string[] = [];
104
+ for (const e of negatives) {
105
+ const t0 = process.hrtime.bigint();
106
+ const d = detected(e.text);
107
+ latencies.push(Number(process.hrtime.bigint() - t0) / 1e6);
108
+ if (d.hit) falsePositives.push(`${e.id}: ${e.text.slice(0, 90)}`);
109
+ }
110
+
111
+ const unambiguous = positives.filter((e) => UNAMBIGUOUS_CHANNELS.includes(e.channel));
112
+ const unambiguousHits = unambiguous.filter((e) => detected(e.text).hit).length;
113
+
114
+ const recallAll = positives.length === 0 ? 0 : hits / positives.length;
115
+ const recallUnambiguous = unambiguous.length === 0 ? 0 : unambiguousHits / unambiguous.length;
116
+ const fpRate = negatives.length === 0 ? 0 : falsePositives.length / negatives.length;
117
+ const p95 = _p95(latencies);
118
+
119
+ const gates = {
120
+ recall_all: { value: recallAll, threshold: THRESHOLDS.recall_all, pass: recallAll >= THRESHOLDS.recall_all },
121
+ recall_unambiguous: {
122
+ value: recallUnambiguous,
123
+ threshold: THRESHOLDS.recall_unambiguous,
124
+ pass: recallUnambiguous >= THRESHOLDS.recall_unambiguous,
125
+ },
126
+ fp_rate: { value: fpRate, threshold: THRESHOLDS.fp_rate_max, pass: fpRate <= THRESHOLDS.fp_rate_max },
127
+ latency_p95_ms: {
128
+ value: p95,
129
+ threshold: THRESHOLDS.latency_p95_ms_max,
130
+ pass: p95 < THRESHOLDS.latency_p95_ms_max,
131
+ },
132
+ };
133
+
134
+ // The roadmap's pre-registered branch: recall clears but FP is over budget →
135
+ // ship detect-and-flag only, never automatic quarantine, and publish the FP
136
+ // number. Nothing here quarantines anyway, so this records which branch the
137
+ // measurement selected rather than switching behaviour after the fact.
138
+ const recallOk = gates.recall_all.pass && gates.recall_unambiguous.pass;
139
+ const verdict: Report['verdict'] = !recallOk
140
+ ? 'FAIL'
141
+ : gates.fp_rate.pass && gates.latency_p95_ms.pass
142
+ ? 'ADOPT'
143
+ : 'DETECT-AND-FLAG-ONLY';
144
+
145
+ return {
146
+ corpus: { positives: positives.length, negatives: negatives.length },
147
+ recall_all: recallAll,
148
+ recall_unambiguous: recallUnambiguous,
149
+ fp_rate: fpRate,
150
+ per_channel: perChannel,
151
+ false_positives: falsePositives,
152
+ latency_p95_ms: p95,
153
+ model_calls: 0,
154
+ gates,
155
+ verdict,
156
+ };
157
+ }
158
+
159
+ function _render(r: Report): string {
160
+ const pct = (n: number): string => (n * 100).toFixed(2) + '%';
161
+ const lines: string[] = [];
162
+ lines.push(`corpus: ${r.corpus.positives} positives · ${r.corpus.negatives} negatives`);
163
+ lines.push('');
164
+ lines.push('per-channel recall');
165
+ for (const [ch, s] of Object.entries(r.per_channel).sort()) {
166
+ const mark = s.recall === 1 ? ' ' : '!!';
167
+ lines.push(` ${mark} ${ch.padEnd(24)} ${s.detected}/${s.n} ${pct(s.recall)}`);
168
+ }
169
+ lines.push('');
170
+ for (const [name, g] of Object.entries(r.gates)) {
171
+ const cmp = name === 'fp_rate' || name === 'latency_p95_ms' ? '<=' : '>=';
172
+ const val = name === 'latency_p95_ms' ? `${g.value.toFixed(3)} ms` : pct(g.value);
173
+ const thr = name === 'latency_p95_ms' ? `${g.threshold} ms` : pct(g.threshold);
174
+ lines.push(` ${g.pass ? 'PASS' : 'FAIL'} ${name.padEnd(20)} ${val} ${cmp} ${thr}`);
175
+ }
176
+ lines.push(` PASS ${'model_calls'.padEnd(20)} 0 (structural: no model call on this path)`);
177
+ if (r.false_positives.length > 0) {
178
+ lines.push('');
179
+ lines.push(`false positives (${r.false_positives.length}):`);
180
+ for (const fp of r.false_positives.slice(0, 12)) lines.push(` - ${fp}`);
181
+ if (r.false_positives.length > 12) {
182
+ lines.push(` … ${r.false_positives.length - 12} more`);
183
+ }
184
+ }
185
+ lines.push('');
186
+ lines.push(`verdict: ${r.verdict}`);
187
+ return lines.join('\n') + '\n';
188
+ }
189
+
190
+ export function main(argv: readonly string[] | null = null): number {
191
+ const args = argv ?? process.argv.slice(2);
192
+ const r = measure();
193
+ if (args.includes('--json')) {
194
+ process.stdout.write(JSON.stringify(r, null, 2) + '\n');
195
+ } else {
196
+ process.stdout.write(_render(r));
197
+ }
198
+ return r.verdict === 'FAIL' ? 1 : 0;
199
+ }
200
+
201
+ declare const __AGENT_CONFIG_BUNDLE__: boolean | undefined;
202
+ function _isCliEntry(): boolean {
203
+ if (typeof __AGENT_CONFIG_BUNDLE__ !== 'undefined' && __AGENT_CONFIG_BUNDLE__) return false;
204
+ if (process.argv[1] === undefined) return false;
205
+ const argvUrl = pathToFileURL(path.resolve(process.argv[1])).href;
206
+ if (import.meta.url === argvUrl) return true;
207
+ try {
208
+ return fs.realpathSync(fileURLToPath(import.meta.url)) === fs.realpathSync(path.resolve(process.argv[1]));
209
+ } catch {
210
+ return false;
211
+ }
212
+ }
213
+
214
+ if (_isCliEntry()) {
215
+ process.exitCode = main();
216
+ }
@@ -65,11 +65,38 @@ UNPACKED_BYTES="$(npm pack --dry-run --json --ignore-scripts --silent 2>/dev/nul
65
65
  step "headless consumer install from the tarball"
66
66
  WORK="$(mktemp -d)"
67
67
  trap 'rm -rf "$WORK"' EXIT
68
+ COLD_START_T0="$(node -e 'console.log(Date.now())')"
68
69
  ( cd "$WORK" && npm init -y >/dev/null 2>&1 \
69
70
  && npm install --omit=dev --no-audit --no-fund --silent "$ROOT/$TARBALL" )
70
71
  PKG_DIR="$WORK/node_modules/@event4u/agent-config"
71
72
  [[ -d "$PKG_DIR" ]] || { echo "❌ install did not produce the package dir" >&2; exit 1; }
72
73
 
74
+ # ------------------------------------------- 3b. cold start: install → doctor
75
+ # The bare-machine wall-clock a first-time user lives through, measured end to
76
+ # end from `npm install` to `doctor` having run. This is EVIDENCE, never a
77
+ # promise, and deliberately NOT a budget entry: it is dominated by network and
78
+ # registry latency, which are not ours to guarantee. A gate on it would flap on
79
+ # runner weather and teach the reader to ignore the line
80
+ # (road-to-zero-ceremony-install Phase 6).
81
+ step "cold start: install → doctor (evidence, not a gate)"
82
+ COLD_START_MS="$(node -e '
83
+ const {execFileSync}=require("node:child_process");
84
+ const [bin, t0] = process.argv.slice(1);
85
+ try { execFileSync(bin, ["doctor"], {stdio:"ignore"}); }
86
+ catch { /* doctor may report findings; the run still bounds the wall-clock */ }
87
+ console.log(Date.now() - Number(t0));' "$WORK/node_modules/.bin/agent-config" "$COLD_START_T0")"
88
+ COLD_START_CONDITIONS="$(uname -s)/$(uname -m) · node $(node --version) · npm $(npm --version) · npm install --omit=dev from a LOCAL tarball (no registry round-trip for the package itself; a real first-touch install adds registry latency)"
89
+ printf 'cold_start_install_to_doctor_ms=%s\n' "$COLD_START_MS"
90
+ printf 'cold_start_conditions=%s\n' "$COLD_START_CONDITIONS"
91
+ if [[ -n "${GITHUB_STEP_SUMMARY:-}" ]]; then
92
+ {
93
+ printf '### Cold start — install → doctor\n\n'
94
+ printf '**%s ms**\n\n' "$COLD_START_MS"
95
+ printf 'Conditions: %s\n\n' "$COLD_START_CONDITIONS"
96
+ printf 'Evidence, not a promise — no shipped claim states this as a guarantee.\n'
97
+ } >> "$GITHUB_STEP_SUMMARY"
98
+ fi
99
+
73
100
  # --------------------------------------------------------- 4. staleness lints
74
101
  step "staleness lints (pre-migration refs)"
75
102
  ./scripts-run src/scripts/lint_pre_migration_refs
@@ -128,10 +155,16 @@ const m={
128
155
  mcp_boot_to_initialize_ms: Number(process.argv[6]),
129
156
  cli_help_command_count: Number(process.argv[7]),
130
157
  mcp_public_tool_count: Number(process.argv[8]),
158
+ // Evidence-only: carried in the artifact with its conditions, never gated.
159
+ // check_evaluator_budgets iterates the BUDGET entries, so an extra
160
+ // measurement is recorded and ignored by the gate — by design.
161
+ cold_start_install_to_doctor_ms: Number(process.argv[9]),
162
+ cold_start_conditions: process.argv[10],
131
163
  };
132
164
  fs.writeFileSync(process.argv[1], JSON.stringify(m, null, 2));
133
165
  console.log(JSON.stringify(m, null, 1));' \
134
- "$MEASURE_TMP" "$UNPACKED_BYTES" "$NM_MB" "$DEP_COUNT" "$CLI_MS" "$MCP_MS" "$CLI_COUNT" "$MCP_TOOLS"
166
+ "$MEASURE_TMP" "$UNPACKED_BYTES" "$NM_MB" "$DEP_COUNT" "$CLI_MS" "$MCP_MS" "$CLI_COUNT" "$MCP_TOOLS" \
167
+ "$COLD_START_MS" "$COLD_START_CONDITIONS"
135
168
 
136
169
  step "budget gate (absolute + >regression_pct creep)"
137
170
  ./scripts-run src/scripts/check_evaluator_budgets --measurements "$MEASURE_TMP"
@@ -25,6 +25,7 @@ import {
25
25
  strip_source_prefix,
26
26
  } from './_lib/agent_src.js';
27
27
  import { computeStatus as domainSoundnessStatus } from './domain_soundness_status.js';
28
+ import { skip_compile_disabled_rule } from './condense.js';
28
29
 
29
30
  const _HERE = fileURLToPath(import.meta.url);
30
31
 
@@ -243,6 +244,12 @@ export function _collect_skills(): Entry[] {
243
244
  return _sortedKeys(seen).map((k) => seen.get(k) as Entry);
244
245
  }
245
246
 
247
+ // docs/catalog.md is a SHIPPED file, so a relative link from it must resolve inside
248
+ // package.json#files. docs/proof.md is not shipped and cannot be: it is 58KB of
249
+ // generated output linking eight paths under internal/bench/, tests/ and src/scripts/
250
+ // that are themselves unshipped, so shipping it would hand consumers a page of dead
251
+ // links. The published site URL is the honest target for a consumer-facing pointer.
252
+
246
253
  export function _collect_rules(): Entry[] {
247
254
  const seen = new Map<string, Entry>();
248
255
  for (const srcRoot of artefact_roots()) {
@@ -255,6 +262,14 @@ export function _collect_rules(): Entry[] {
255
262
  if (seen.has(stem)) {
256
263
  continue;
257
264
  }
265
+ // A compile-disabled rule has no dist/agent-src/ counterpart, and the
266
+ // table links the SHIPPED path — so listing it emits a dead link. The
267
+ // toggle is a separate axis from the source file's existence; this is its
268
+ // fifth consumer after the router compiler, the dist writer, check_sync,
269
+ // and the per-tool symlink generator. Same predicate in all five.
270
+ if (skip_compile_disabled_rule(`rules/${stem}.md`)) {
271
+ continue;
272
+ }
258
273
  const fm = _parse_frontmatter(fs.readFileSync(ruleMd, 'utf-8'));
259
274
  seen.set(stem, {
260
275
  kind: 'rule',
@@ -420,7 +435,8 @@ export function _render_catalog(
420
435
  '> not yet. Coverage is reported per tier (`./scripts-run',
421
436
  '> src/scripts/skill_eval_coverage`) and CI-ratcheted so it can only rise.',
422
437
  '> Listing here never implies a skill is behaviourally tested — the',
423
- '> current coverage and its gap are published on [the proof page](proof.md).',
438
+ '> current coverage and its gap are published on [the proof page]' +
439
+ '(https://event4u-app.github.io/agent-config/proof/).',
424
440
  '',
425
441
  '> **Non-coding domain correctness is scoped, not proven.** The',
426
442
  '> `finance` / `founder` / `ops` / `content` skills are forged on TS/PHP',
@@ -429,7 +445,8 @@ export function _render_catalog(
429
445
  '> cited formulas, or rubric targets matching a named external practice);',
430
446
  '> the rest are labeled `unvalidated` until they pass one',
431
447
  '> (`./scripts-run src/scripts/domain_soundness_status`). A disclaimer',
432
- '> floor bounds liability, not correctness — see [the proof page](proof.md).',
448
+ '> floor bounds liability, not correctness — see [the proof page]' +
449
+ '(https://event4u-app.github.io/agent-config/proof/).',
433
450
  '',
434
451
  _render_table(skills, ['kind', 'name', 'source', 'description'], '../', _to_shipped_path),
435
452
  '',
@@ -30,8 +30,8 @@ cat > "$HOOKS_DIR/pre-push" << 'EOF'
30
30
  # the old hook only verified dist sync + the COMMAND count — it missed
31
31
  # guideline/skill/rule count drift and the generate-tools / router / corpus
32
32
  # outputs (e.g. a new guideline bumping the count in README + docs/architecture).
33
- # `task consistency` is the EXACT CI mirror (sync-check + sync-check-hashes +
34
- # sync + generate-tools + compile-router + compile-corpus + `git diff --quiet`),
33
+ # `task consistency` is the EXACT CI mirror (sync-check + sync + generate-tools
34
+ # + compile-router + compile-corpus + `git diff --quiet`),
35
35
  # so any derived-output drift blocks the push here. Runtime ~15-40s (it
36
36
  # regenerates the tool trees) — cheaper than a red CI run and a fixup re-push.
37
37
 
Binary file
@@ -34,86 +34,24 @@ import * as fs from 'node:fs';
34
34
  import { fileURLToPath, pathToFileURL } from 'node:url';
35
35
 
36
36
  import * as sl from './_lib/security_lint.js';
37
+ import { TOKEN_RE, classifyToken } from './_lib/confusables.js';
37
38
 
38
39
  export const CHECK = 'mixed-script-confusable';
39
40
 
40
- const MIN_LETTERS = 3;
41
-
42
- // Unicode-script classifiers via property escapes (requires the `u` flag).
43
- const _LATIN = /\p{Script=Latin}/u;
44
- const _CYRILLIC = /\p{Script=Cyrillic}/u;
45
- const _GREEK = /\p{Script=Greek}/u;
46
- const _LETTER = /\p{L}/u;
47
- // A "token" is a maximal run of letters / combining marks / decimal digits.
48
- const _TOKEN = /[\p{L}\p{M}\p{Nd}]+/gu;
49
-
50
- // Cyrillic + Greek codepoints that have a basic-Latin lookalike (Unicode TR39
51
- // confusables, common subset). A foreign letter only counts toward the
52
- // confusable signal when it is in this set — Greek math operators with no Latin
53
- // twin (Δ Σ Π Ω Φ Θ Λ Ξ Ψ Γ δ π ω …) are deliberately excluded so legit
54
- // notation does not false-positive.
55
- const _CONFUSABLE_FOREIGN: ReadonlySet<number> = new Set([
56
- // Cyrillic lowercase ↔ Latin
57
- 0x0430 /*а→a*/, 0x0435 /*е→e*/, 0x043e /*о→o*/, 0x0440 /*р→p*/, 0x0441 /*с→c*/,
58
- 0x0443 /*у→y*/, 0x0445 /*х→x*/, 0x0455 /*ѕ→s*/, 0x0456 /*і→i*/, 0x0458 /*ј→j*/,
59
- 0x04bb /*һ→h*/, 0x0501 /*ԁ→d*/, 0x051b /*ԛ→q*/, 0x0577 /*no*/,
60
- // Cyrillic uppercase ↔ Latin
61
- 0x0410 /*А→A*/, 0x0412 /*В→B*/, 0x0415 /*Е→E*/, 0x041a /*К→K*/, 0x041c /*М→M*/,
62
- 0x041d /*Н→H*/, 0x041e /*О→O*/, 0x0420 /*Р→P*/, 0x0421 /*С→C*/, 0x0422 /*Т→T*/,
63
- 0x0423 /*У→Y*/, 0x0425 /*Х→X*/, 0x0405 /*Ѕ→S*/, 0x0406 /*І→I*/, 0x0408 /*Ј→J*/,
64
- // Greek lowercase ↔ Latin
65
- 0x03b1 /*α→a*/, 0x03b5 /*ε→e*/, 0x03bf /*ο→o*/, 0x03bd /*ν→v*/, 0x03c1 /*ρ→p*/,
66
- 0x03c5 /*υ→u*/, 0x03c7 /*χ→x*/, 0x03ba /*κ→k*/,
67
- // Greek uppercase ↔ Latin (only those with a real Latin twin)
68
- 0x0391 /*Α→A*/, 0x0392 /*Β→B*/, 0x0395 /*Ε→E*/, 0x0396 /*Ζ→Z*/, 0x0397 /*Η→H*/,
69
- 0x0399 /*Ι→I*/, 0x039a /*Κ→K*/, 0x039c /*Μ→M*/, 0x039d /*Ν→N*/, 0x039f /*Ο→O*/,
70
- 0x03a1 /*Ρ→P*/, 0x03a4 /*Τ→T*/, 0x03a5 /*Υ→Y*/, 0x03a7 /*Χ→X*/, 0x0392 /*Β→B*/,
71
- ]);
72
-
73
- type ScriptName = 'latin' | 'cyrillic' | 'greek' | 'other';
74
-
75
- function _script_of(ch: string): ScriptName {
76
- if (_LATIN.test(ch)) return 'latin';
77
- if (_CYRILLIC.test(ch)) return 'cyrillic';
78
- if (_GREEK.test(ch)) return 'greek';
79
- return 'other';
80
- }
41
+ // The confusable table + the mixed-script decision rule live in ONE place so
42
+ // this authoring-time linter and the runtime encoding scanner cannot drift apart
43
+ // (road-to-runtime-encoding-hardening Phase 3). `_classify_token` stays exported
44
+ // under its original name — it is this module's published surface and its tests
45
+ // address it here.
46
+ const _TOKEN = TOKEN_RE;
81
47
 
82
48
  /**
83
49
  * Classify a single token. Returns the offending mixed-script descriptor when
84
50
  * the token matches the homoglyph signature, else null.
51
+ *
52
+ * Thin re-export of the shared implementation — see `_lib/confusables.ts`.
85
53
  */
86
- export function _classify_token(token: string): string | null {
87
- let latin = 0;
88
- let cyrillic = 0;
89
- let greek = 0;
90
- let letters = 0;
91
- for (const ch of token) {
92
- if (!_LETTER.test(ch)) continue; // skip combining marks / digits for script vote
93
- letters += 1;
94
- const script = _script_of(ch);
95
- if (script === 'latin') {
96
- latin += 1;
97
- } else if (script === 'cyrillic' || script === 'greek') {
98
- // Only confusable foreign letters (TR39) count — math operators with
99
- // no Latin twin are ignored, so legit notation never trips.
100
- if (_CONFUSABLE_FOREIGN.has(ch.codePointAt(0) as number)) {
101
- if (script === 'cyrillic') cyrillic += 1;
102
- else greek += 1;
103
- }
104
- }
105
- }
106
- if (letters < MIN_LETTERS) return null;
107
- const foreign = cyrillic + greek;
108
- if (latin === 0 || foreign === 0) return null; // single-script (or no Latin) → legit
109
- if (latin <= foreign) return null; // majority must be Latin (foreign word ≠ attack)
110
- const which = cyrillic > 0 && greek > 0
111
- ? 'cyrillic+greek'
112
- : cyrillic > 0
113
- ? 'cyrillic'
114
- : 'greek';
115
- return `latin+${which} (${latin} latin / ${foreign} foreign-confusable)`;
116
- }
54
+ export const _classify_token = classifyToken;
117
55
 
118
56
  export function _scan(sf: sl.ScannedFile): sl.Finding[] {
119
57
  if (sf.pragma_allows(CHECK)) {
@@ -0,0 +1,113 @@
1
+ #!/usr/bin/env tsx
2
+ /**
3
+ * Every design-artifact eval fixture id must be cited by some surface.
4
+ *
5
+ * The fixtures file used to assert that the lifecycle contract's branch table
6
+ * "references these ids". It cites nine of them; the rest are gated elsewhere
7
+ * (the design-fidelity mechanics guideline, the lane-matrix test) — and a
8
+ * handful were cited by nothing at all. An uncited fixture is an eval nobody
9
+ * runs and no contract depends on, which is exactly the shape of coverage that
10
+ * looks real in a count and is absent in practice.
11
+ *
12
+ * This checks citation, not correctness: an id must appear outside its own
13
+ * definition. Which surface cites it is the author's call.
14
+ *
15
+ * Exit codes: 0 every id cited, 1 one or more uncited.
16
+ */
17
+
18
+ import * as fs from 'node:fs';
19
+ import * as path from 'node:path';
20
+ import { fileURLToPath } from 'node:url';
21
+
22
+ const QUIET = process.argv.includes('--quiet');
23
+
24
+ const _HERE = fileURLToPath(import.meta.url);
25
+ const REPO = path.resolve(path.dirname(_HERE), '..', '..');
26
+ const FIXTURES = path.join(REPO, 'tests', 'design-artifacts', 'eval-fixtures.md');
27
+
28
+ /** Surfaces allowed to satisfy a citation. */
29
+ const SCAN_ROOTS: readonly string[] = [
30
+ path.join(REPO, 'docs', 'contracts'),
31
+ path.join(REPO, 'docs', 'guidelines'),
32
+ path.join(REPO, 'src', 'skills'),
33
+ path.join(REPO, 'src', 'rules'),
34
+ path.join(REPO, 'tests', 'scripts'),
35
+ ];
36
+
37
+ const SCAN_EXTS: ReadonlySet<string> = new Set(['.md', '.ts']);
38
+
39
+ function walk(dir: string, out: string[]): void {
40
+ let entries: fs.Dirent[];
41
+ try {
42
+ entries = fs.readdirSync(dir, { withFileTypes: true });
43
+ } catch {
44
+ return;
45
+ }
46
+ for (const entry of entries) {
47
+ const p = path.join(dir, entry.name);
48
+ if (entry.isDirectory()) {
49
+ walk(p, out);
50
+ } else if (SCAN_EXTS.has(path.extname(entry.name))) {
51
+ out.push(p);
52
+ }
53
+ }
54
+ }
55
+
56
+ function main(): number {
57
+ let fixtureText: string;
58
+ try {
59
+ fixtureText = fs.readFileSync(FIXTURES, { encoding: 'utf-8' });
60
+ } catch {
61
+ process.stderr.write(`lint-eval-fixture-citations: cannot read ${FIXTURES}\n`);
62
+ return 1;
63
+ }
64
+
65
+ // Ids are declared as `### daf-...` headings or as leading table cells.
66
+ const ids = new Set<string>();
67
+ for (const m of fixtureText.matchAll(/^###\s+(daf-[a-z0-9-]+)\s*$/gm)) {
68
+ ids.add(m[1] as string);
69
+ }
70
+ for (const m of fixtureText.matchAll(/^\|\s*`(daf-[a-z0-9-]+)`\s*\|/gm)) {
71
+ ids.add(m[1] as string);
72
+ }
73
+ if (ids.size === 0) {
74
+ process.stderr.write('lint-eval-fixture-citations: no fixture ids found — parser drift.\n');
75
+ return 1;
76
+ }
77
+
78
+ const files: string[] = [];
79
+ for (const root of SCAN_ROOTS) {
80
+ walk(root, files);
81
+ }
82
+ const haystack = files
83
+ .map((f) => {
84
+ try {
85
+ return fs.readFileSync(f, { encoding: 'utf-8' });
86
+ } catch {
87
+ return '';
88
+ }
89
+ })
90
+ .join('\n');
91
+
92
+ const uncited = [...ids].filter((id) => !haystack.includes(id)).sort();
93
+ if (uncited.length > 0) {
94
+ for (const id of uncited) {
95
+ process.stdout.write(
96
+ `lint-eval-fixture-citations: \`${id}\` is cited by no contract, ` +
97
+ 'guideline, skill, rule, or test — an eval nobody runs.\n',
98
+ );
99
+ }
100
+ process.stderr.write(
101
+ `lint-eval-fixture-citations: ${uncited.length} of ${ids.size} fixture id(s) uncited.\n`,
102
+ );
103
+ return 1;
104
+ }
105
+ if (!QUIET) {
106
+ process.stdout.write(
107
+ `lint-eval-fixture-citations: ${ids.size} fixture id(s), all cited.\n`,
108
+ );
109
+ }
110
+ return 0;
111
+ }
112
+
113
+ process.exit(main());
Binary file