@event4u/agent-config 6.1.0 → 7.0.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 (1537) hide show
  1. package/.claude-plugin/marketplace.json +35 -3
  2. package/AGENTS.md +8 -7
  3. package/CHANGELOG.md +408 -0
  4. package/CONTRIBUTING.md +1 -1
  5. package/README.md +17 -15
  6. package/dist/agent-src/commands/agent-status.md +2 -2
  7. package/dist/agent-src/commands/agents/audit.md +3 -3
  8. package/dist/agent-src/commands/agents/init.md +1 -1
  9. package/dist/agent-src/commands/agents/optimize.md +4 -4
  10. package/dist/agent-src/commands/analyze/decision.md +108 -0
  11. package/dist/agent-src/commands/analyze/incident.md +120 -0
  12. package/dist/agent-src/commands/analyze/near-miss.md +113 -0
  13. package/dist/agent-src/commands/analyze/postmortem.md +130 -0
  14. package/dist/agent-src/commands/analyze/premortem.md +104 -0
  15. package/dist/agent-src/commands/analyze.md +124 -0
  16. package/dist/agent-src/commands/brand/identity.md +27 -0
  17. package/dist/agent-src/commands/brand/review.md +27 -0
  18. package/dist/agent-src/commands/brand/strategy.md +27 -0
  19. package/dist/agent-src/commands/brand/tokens.md +28 -0
  20. package/dist/agent-src/commands/brand/voice.md +27 -0
  21. package/dist/agent-src/commands/brand.md +58 -0
  22. package/dist/agent-src/commands/check-current-md.md +3 -3
  23. package/dist/agent-src/commands/condense.md +2 -2
  24. package/dist/agent-src/commands/council/debate.md +2 -2
  25. package/dist/agent-src/commands/council/default.md +45 -18
  26. package/dist/agent-src/commands/fix/portability.md +3 -3
  27. package/dist/agent-src/commands/fix/refs.md +3 -3
  28. package/dist/agent-src/commands/implement-ticket.md +36 -6
  29. package/dist/agent-src/commands/knowledge/cross-repo.md +1 -1
  30. package/dist/agent-src/commands/memory/add.md +1 -1
  31. package/dist/agent-src/commands/mission/upgrade.md +182 -0
  32. package/dist/agent-src/commands/optimize/skills.md +2 -2
  33. package/dist/agent-src/commands/orchestrate.md +1 -1
  34. package/dist/agent-src/commands/pr/create.md +6 -4
  35. package/dist/agent-src/commands/review-changes.md +8 -0
  36. package/dist/agent-src/commands/roadmap/materialize.md +73 -0
  37. package/dist/agent-src/commands/skill/preview.md +1 -1
  38. package/dist/agent-src/commands/skills/discover.md +1 -1
  39. package/dist/agent-src/commands/threat-model.md +4 -4
  40. package/dist/agent-src/commands/upstream-contribute.md +3 -3
  41. package/dist/agent-src/commands/video/from-script.md +2 -2
  42. package/dist/agent-src/commands/video/from-song.md +3 -3
  43. package/dist/agent-src/commands/video/scene.md +1 -1
  44. package/dist/agent-src/commands/video/storyboard.md +1 -1
  45. package/dist/agent-src/commands/video.md +3 -3
  46. package/dist/agent-src/contexts/communication/rules-auto/source-of-truth-mechanics.md +3 -3
  47. package/dist/agent-src/contexts/communication/rules-auto/user-interaction-mechanics.md +1 -1
  48. package/dist/agent-src/contexts/execution/evidence-discipline.md +153 -0
  49. package/dist/agent-src/contexts/execution/project-intelligence.md +264 -0
  50. package/dist/agent-src/contexts/execution/roadmap-process-loop.md +2 -1
  51. package/dist/agent-src/personas/ai-video-technical-director.md +1 -1
  52. package/dist/agent-src/personas/brand-strategist.md +74 -0
  53. package/dist/agent-src/personas/design-director.md +74 -0
  54. package/dist/agent-src/rules/brand-consistency.md +77 -0
  55. package/dist/agent-src/rules/brand-source-of-truth.md +57 -0
  56. package/dist/agent-src/rules/direct-answers.md +2 -0
  57. package/dist/agent-src/rules/domain-safety-disclaimer.md +2 -0
  58. package/dist/agent-src/rules/git-history-discipline.md +1 -0
  59. package/dist/agent-src/rules/icon-consistency.md +53 -0
  60. package/dist/agent-src/rules/image-likeness-and-rights.md +67 -0
  61. package/dist/agent-src/rules/lethal-trifecta-guard.md +1 -1
  62. package/dist/agent-src/rules/persona-governance.md +2 -2
  63. package/dist/agent-src/rules/provider-lifecycle-discipline.md +3 -1
  64. package/dist/agent-src/rules/roadmap-progress-sync.md +10 -0
  65. package/dist/agent-src/rules/security-sensitive-stop.md +9 -3
  66. package/dist/agent-src/rules/size-enforcement.md +1 -1
  67. package/dist/agent-src/rules/source-confidentiality.md +3 -3
  68. package/dist/agent-src/rules/source-discovery-gate.md +98 -0
  69. package/dist/agent-src/rules/think-before-action.md +1 -0
  70. package/dist/agent-src/rules/ui-audit-gate.md +2 -0
  71. package/dist/agent-src/rules/untrusted-input-defense.md +1 -1
  72. package/dist/agent-src/rules/user-interaction.md +1 -1
  73. package/dist/agent-src/scripts/archive_completed_roadmaps.ts +392 -0
  74. package/dist/agent-src/scripts/update_roadmap_progress.ts +824 -0
  75. package/dist/agent-src/skills/adr-create/SKILL.md +5 -5
  76. package/dist/agent-src/skills/agent-security-review/evals/triggers.json +1 -0
  77. package/dist/agent-src/skills/agents-md-thin-root/SKILL.md +1 -1
  78. package/dist/agent-src/skills/ai-council/SKILL.md +1 -1
  79. package/dist/agent-src/skills/analysis-autonomous-mode/SKILL.md +9 -13
  80. package/dist/agent-src/skills/blade-ui/SKILL.md +12 -5
  81. package/dist/agent-src/skills/blameless-post-mortem/SKILL.md +199 -0
  82. package/dist/agent-src/skills/brand/ATTRIBUTION.md +38 -0
  83. package/dist/agent-src/skills/brand/SKILL.md +115 -0
  84. package/dist/agent-src/skills/brand/data/archetypes.csv +13 -0
  85. package/dist/agent-src/skills/brand/data/color-psychology.csv +14 -0
  86. package/dist/agent-src/skills/brand/data/logo-style-fit.csv +13 -0
  87. package/dist/agent-src/skills/brand/data/manifest.json +226 -0
  88. package/dist/agent-src/skills/brand/data/messaging-frameworks.csv +13 -0
  89. package/dist/agent-src/skills/brand/data/naming-patterns.csv +13 -0
  90. package/dist/agent-src/skills/brand/data/typography-principles.csv +13 -0
  91. package/dist/agent-src/skills/brand/data/voice-tone.csv +13 -0
  92. package/dist/agent-src/skills/brand/evals/triggers.json +17 -0
  93. package/dist/agent-src/skills/brand-asset-generation/SKILL.md +89 -0
  94. package/dist/agent-src/skills/brand-asset-generation/evals/triggers.json +17 -0
  95. package/dist/agent-src/skills/brand-audit/SKILL.md +67 -0
  96. package/dist/agent-src/skills/brand-audit/evals/triggers.json +17 -0
  97. package/dist/agent-src/skills/brand-identity/SKILL.md +101 -0
  98. package/dist/agent-src/skills/brand-identity/evals/triggers.json +17 -0
  99. package/dist/agent-src/skills/brand-strategy/SKILL.md +83 -0
  100. package/dist/agent-src/skills/brand-strategy/evals/triggers.json +17 -0
  101. package/dist/agent-src/skills/brand-to-tokens/SKILL.md +102 -0
  102. package/dist/agent-src/skills/brand-to-tokens/evals/triggers.json +17 -0
  103. package/dist/agent-src/skills/brand-to-tokens/templates/marp-brand-deck.md.example +46 -0
  104. package/dist/agent-src/skills/brand-to-tokens/templates/reveal-brand-deck.yaml +32 -0
  105. package/dist/agent-src/skills/canvas-design/evals/triggers.json +1 -0
  106. package/dist/agent-src/skills/check-refs/SKILL.md +5 -5
  107. package/dist/agent-src/skills/code-review/SKILL.md +6 -15
  108. package/dist/agent-src/skills/command-writing/SKILL.md +2 -2
  109. package/dist/agent-src/skills/complexity-first-planning/evals/triggers.json +1 -0
  110. package/dist/agent-src/skills/context-authoring/SKILL.md +2 -2
  111. package/dist/agent-src/skills/context-document/SKILL.md +35 -2
  112. package/dist/agent-src/skills/corpus-grounding/evals/triggers.json +1 -0
  113. package/dist/agent-src/skills/corpus-grounding/scripts/bm25_search.ts +482 -0
  114. package/dist/agent-src/skills/corpus-grounding/scripts/decision_engine.ts +803 -0
  115. package/dist/agent-src/skills/corpus-grounding/scripts/ground.ts +541 -0
  116. package/dist/agent-src/skills/corpus-grounding/scripts/schema_validator.ts +309 -0
  117. package/dist/agent-src/skills/database/SKILL.md +26 -4
  118. package/dist/agent-src/skills/decision-record/SKILL.md +1 -1
  119. package/dist/agent-src/skills/decision-record/evals/triggers.json +17 -0
  120. package/dist/agent-src/skills/decision-review/SKILL.md +179 -0
  121. package/dist/agent-src/skills/description-assist/SKILL.md +1 -1
  122. package/dist/agent-src/skills/design-intelligence/SKILL.md +1 -1
  123. package/dist/agent-src/skills/design-intelligence/data/manifest.json +23 -6
  124. package/dist/agent-src/skills/design-intelligence/evals/triggers.json +1 -0
  125. package/dist/agent-src/skills/design-tokens/evals/triggers.json +1 -0
  126. package/dist/agent-src/skills/design-tokens/scripts/tokens.ts +888 -0
  127. package/dist/agent-src/skills/doc-coauthoring/evals/triggers.json +1 -0
  128. package/dist/agent-src/skills/eloquent/evals/triggers.json +1 -0
  129. package/dist/agent-src/skills/emit-tickets/SKILL.md +198 -0
  130. package/dist/agent-src/skills/estimate-ticket/evals/triggers.json +1 -0
  131. package/dist/agent-src/skills/git-workflow/SKILL.md +33 -0
  132. package/dist/agent-src/skills/guideline-writing/SKILL.md +2 -2
  133. package/dist/agent-src/skills/iconography/SKILL.md +88 -0
  134. package/dist/agent-src/skills/iconography/evals/triggers.json +17 -0
  135. package/dist/agent-src/skills/image-analyser/evals/triggers.json +1 -0
  136. package/dist/agent-src/skills/image-creator/evals/triggers.json +1 -0
  137. package/dist/agent-src/skills/image-editing/SKILL.md +100 -0
  138. package/dist/agent-src/skills/image-editing/evals/triggers.json +17 -0
  139. package/dist/agent-src/skills/image-generation/SKILL.md +95 -0
  140. package/dist/agent-src/skills/image-generation/evals/triggers.json +17 -0
  141. package/dist/agent-src/skills/image-provider-routing/SKILL.md +96 -0
  142. package/dist/agent-src/skills/image-provider-routing/evals/triggers.json +17 -0
  143. package/dist/agent-src/skills/launch-readiness/SKILL.md +21 -0
  144. package/dist/agent-src/skills/learning-to-rule-or-skill/SKILL.md +12 -8
  145. package/dist/agent-src/skills/lint-skills/SKILL.md +5 -5
  146. package/dist/agent-src/skills/logo-generation/SKILL.md +98 -0
  147. package/dist/agent-src/skills/logo-generation/evals/triggers.json +17 -0
  148. package/dist/agent-src/skills/markitdown/SKILL.md +1 -1
  149. package/dist/agent-src/skills/md-language-check/SKILL.md +1 -1
  150. package/dist/agent-src/skills/motion-choreographer/SKILL.md +1 -1
  151. package/dist/agent-src/skills/php-coder/evals/triggers.json +1 -0
  152. package/dist/agent-src/skills/prediction-pool-optimizer/evals/triggers.json +1 -0
  153. package/dist/agent-src/skills/premortem/SKILL.md +137 -0
  154. package/dist/agent-src/skills/prompt-engineering-image/SKILL.md +115 -0
  155. package/dist/agent-src/skills/prompt-engineering-image/evals/triggers.json +17 -0
  156. package/dist/agent-src/skills/prompt-validator/evals/triggers.json +1 -0
  157. package/dist/agent-src/skills/react-shadcn-ui/SKILL.md +12 -5
  158. package/dist/agent-src/skills/react-shadcn-ui/scripts/shadcn_add.ts +388 -0
  159. package/dist/agent-src/skills/reasoning-orchestrator/SKILL.md +1 -1
  160. package/dist/agent-src/skills/reasoning-orchestrator/evals/triggers.json +1 -0
  161. package/dist/agent-src/skills/refine-ticket/evals/triggers.json +1 -0
  162. package/dist/agent-src/skills/roadmap-management/SKILL.md +16 -3
  163. package/dist/agent-src/skills/roadmap-writing/SKILL.md +76 -0
  164. package/dist/agent-src/skills/root-cause-frameworks/SKILL.md +146 -0
  165. package/dist/agent-src/skills/rule-refactor/SKILL.md +9 -9
  166. package/dist/agent-src/skills/rule-writing/SKILL.md +7 -7
  167. package/dist/agent-src/skills/script-writing/SKILL.md +2 -2
  168. package/dist/agent-src/skills/security-audit/SKILL.md +5 -0
  169. package/dist/agent-src/skills/skill-improvement-pipeline/SKILL.md +19 -3
  170. package/dist/agent-src/skills/skill-management/SKILL.md +3 -3
  171. package/dist/agent-src/skills/skill-reviewer/SKILL.md +1 -1
  172. package/dist/agent-src/skills/skill-writing/SKILL.md +5 -5
  173. package/dist/agent-src/skills/skill-writing/evals/triggers.json +1 -0
  174. package/dist/agent-src/skills/source-discovery/SKILL.md +182 -0
  175. package/dist/agent-src/skills/standards-from-config/SKILL.md +93 -0
  176. package/dist/agent-src/skills/systematic-debugging/SKILL.md +7 -0
  177. package/dist/agent-src/skills/tailwind-engineer/scripts/tailwind_config_gen.ts +561 -0
  178. package/dist/agent-src/skills/threat-modeling/SKILL.md +1 -0
  179. package/dist/agent-src/skills/typography-system/SKILL.md +138 -0
  180. package/dist/agent-src/skills/typography-system/evals/triggers.json +17 -0
  181. package/dist/agent-src/skills/upstream-contribute/SKILL.md +3 -3
  182. package/dist/agent-src/skills/verify-repair-loop/SKILL.md +209 -0
  183. package/dist/agent-src/skills/verify-repair-loop/evals/output-schema.yml +20 -0
  184. package/dist/agent-src/skills/verify-repair-loop/evals/triggers.json +17 -0
  185. package/dist/agent-src/templates/agent-settings.md +7 -0
  186. package/dist/agent-src/templates/contexts/knowledge-card.md +69 -0
  187. package/dist/agent-src/templates/contexts/lesson-card.md +73 -0
  188. package/dist/agent-src/templates/roadmaps.md +29 -1
  189. package/dist/agent-src/templates/scripts/README.md +6 -6
  190. package/dist/agent-src/templates/scripts/check_memory.ts +640 -0
  191. package/dist/agent-src/templates/scripts/check_memory_proposal.ts +351 -0
  192. package/dist/agent-src/templates/scripts/implement_ticket/__main__.ts +27 -0
  193. package/dist/agent-src/templates/scripts/memory_hash.ts +333 -0
  194. package/dist/agent-src/templates/scripts/memory_lookup.ts +1067 -0
  195. package/dist/agent-src/templates/scripts/memory_report.ts +846 -0
  196. package/dist/agent-src/templates/scripts/memory_signal.ts +422 -0
  197. package/dist/agent-src/templates/scripts/memory_status.ts +191 -0
  198. package/dist/agent-src/templates/scripts/pr_review_routing.ts +523 -0
  199. package/dist/agent-src/templates/scripts/pr_risk_review.ts +0 -0
  200. package/dist/agent-src/templates/scripts/telemetry/aggregator.ts +0 -0
  201. package/dist/agent-src/templates/scripts/telemetry/boundary.ts +164 -0
  202. package/dist/agent-src/templates/scripts/telemetry/engagement.ts +479 -0
  203. package/dist/agent-src/templates/scripts/telemetry/report_renderer.ts +394 -0
  204. package/dist/agent-src/templates/scripts/telemetry/settings.ts +210 -0
  205. package/dist/agent-src/templates/scripts/telemetry_record.ts +255 -0
  206. package/dist/agent-src/templates/scripts/telemetry_report.ts +189 -0
  207. package/dist/agent-src/templates/scripts/telemetry_status.ts +312 -0
  208. package/dist/agent-src/templates/scripts/tier_usage_report.ts +597 -0
  209. package/dist/agent-src/templates/scripts/work_engine/__main__.ts +14 -0
  210. package/dist/agent-src/templates/scripts/work_engine/_lib/agent_settings.ts +1118 -0
  211. package/dist/agent-src/templates/scripts/work_engine/_lib/user_global_paths.ts +329 -0
  212. package/dist/agent-src/templates/scripts/work_engine/cli.ts +206 -0
  213. package/dist/agent-src/templates/scripts/work_engine/cli_args.ts +249 -0
  214. package/dist/agent-src/templates/scripts/work_engine/delivery_state.ts +225 -0
  215. package/dist/agent-src/templates/scripts/work_engine/directives/backend/analyze.ts +125 -0
  216. package/dist/agent-src/templates/scripts/work_engine/directives/backend/implement.ts +189 -0
  217. package/dist/agent-src/templates/scripts/work_engine/directives/backend/index.ts +94 -0
  218. package/dist/agent-src/templates/scripts/work_engine/directives/backend/memory.ts +193 -0
  219. package/dist/agent-src/templates/scripts/work_engine/directives/backend/plan.ts +267 -0
  220. package/dist/agent-src/templates/scripts/work_engine/directives/backend/refine.ts +518 -0
  221. package/dist/agent-src/templates/scripts/work_engine/directives/backend/report.ts +379 -0
  222. package/dist/agent-src/templates/scripts/work_engine/directives/backend/test.ts +268 -0
  223. package/dist/agent-src/templates/scripts/work_engine/directives/backend/verify.ts +258 -0
  224. package/dist/agent-src/templates/scripts/work_engine/directives/index.ts +32 -0
  225. package/dist/agent-src/templates/scripts/work_engine/directives/mixed/contract.ts +243 -0
  226. package/dist/agent-src/templates/scripts/work_engine/directives/mixed/index.ts +108 -0
  227. package/dist/agent-src/templates/scripts/work_engine/directives/mixed/stitch.ts +259 -0
  228. package/dist/agent-src/templates/scripts/work_engine/directives/mixed/ui.ts +216 -0
  229. package/dist/agent-src/templates/scripts/work_engine/directives/ui/_passthrough.ts +40 -0
  230. package/dist/agent-src/templates/scripts/work_engine/directives/ui/app_spec.ts +241 -0
  231. package/dist/agent-src/templates/scripts/work_engine/directives/ui/apply.ts +216 -0
  232. package/dist/agent-src/templates/scripts/work_engine/directives/ui/audit.ts +506 -0
  233. package/dist/agent-src/templates/scripts/work_engine/directives/ui/design.ts +325 -0
  234. package/dist/agent-src/templates/scripts/work_engine/directives/ui/index.ts +102 -0
  235. package/dist/agent-src/templates/scripts/work_engine/directives/ui/polish.ts +462 -0
  236. package/dist/agent-src/templates/scripts/work_engine/directives/ui/review.ts +474 -0
  237. package/dist/agent-src/templates/scripts/work_engine/directives/ui/scaffold.ts +352 -0
  238. package/dist/agent-src/templates/scripts/work_engine/directives/ui_trivial/_skipped.ts +33 -0
  239. package/dist/agent-src/templates/scripts/work_engine/directives/ui_trivial/apply.ts +213 -0
  240. package/dist/agent-src/templates/scripts/work_engine/directives/ui_trivial/index.ts +111 -0
  241. package/dist/agent-src/templates/scripts/work_engine/directives/ui_trivial/refine.ts +126 -0
  242. package/dist/agent-src/templates/scripts/work_engine/directives/ui_trivial/report.ts +112 -0
  243. package/dist/agent-src/templates/scripts/work_engine/directives/ui_trivial/test.ts +164 -0
  244. package/dist/agent-src/templates/scripts/work_engine/dispatcher.ts +515 -0
  245. package/dist/agent-src/templates/scripts/work_engine/emitters.ts +119 -0
  246. package/dist/agent-src/templates/scripts/work_engine/errors.ts +24 -0
  247. package/dist/agent-src/templates/scripts/work_engine/hook_bootstrap.ts +104 -0
  248. package/dist/agent-src/templates/scripts/work_engine/hooks/builtin/_chat_history_base.ts +176 -0
  249. package/dist/agent-src/templates/scripts/work_engine/hooks/builtin/chat_history_append.ts +41 -0
  250. package/dist/agent-src/templates/scripts/work_engine/hooks/builtin/chat_history_halt_append.ts +89 -0
  251. package/dist/agent-src/templates/scripts/work_engine/hooks/builtin/decision_gate.ts +193 -0
  252. package/dist/agent-src/templates/scripts/work_engine/hooks/builtin/decision_trace.ts +304 -0
  253. package/dist/agent-src/templates/scripts/work_engine/hooks/builtin/directive_set_guard.ts +110 -0
  254. package/dist/agent-src/templates/scripts/work_engine/hooks/builtin/halt_surface_audit.ts +118 -0
  255. package/dist/agent-src/templates/scripts/work_engine/hooks/builtin/index.ts +17 -0
  256. package/dist/agent-src/templates/scripts/work_engine/hooks/builtin/memory_visibility.ts +161 -0
  257. package/dist/agent-src/templates/scripts/work_engine/hooks/builtin/state_shape_validation.ts +45 -0
  258. package/dist/agent-src/templates/scripts/work_engine/hooks/builtin/trace.ts +134 -0
  259. package/dist/agent-src/templates/scripts/work_engine/hooks/context.ts +94 -0
  260. package/dist/agent-src/templates/scripts/work_engine/hooks/events.ts +58 -0
  261. package/dist/agent-src/templates/scripts/work_engine/hooks/exceptions.ts +85 -0
  262. package/dist/agent-src/templates/scripts/work_engine/hooks/index.ts +27 -0
  263. package/dist/agent-src/templates/scripts/work_engine/hooks/registry.ts +66 -0
  264. package/dist/agent-src/templates/scripts/work_engine/hooks/runner.ts +90 -0
  265. package/dist/agent-src/templates/scripts/work_engine/hooks/settings.ts +260 -0
  266. package/dist/agent-src/templates/scripts/work_engine/input_builders.ts +260 -0
  267. package/dist/agent-src/templates/scripts/work_engine/intent/classify.ts +466 -0
  268. package/dist/agent-src/templates/scripts/work_engine/migration/v0_to_v1.ts +531 -0
  269. package/dist/agent-src/templates/scripts/work_engine/orchestration.ts +366 -0
  270. package/dist/agent-src/templates/scripts/work_engine/persona_policy.ts +97 -0
  271. package/dist/agent-src/templates/scripts/work_engine/resolvers/diff.ts +135 -0
  272. package/dist/agent-src/templates/scripts/work_engine/resolvers/file.ts +175 -0
  273. package/dist/agent-src/templates/scripts/work_engine/resolvers/prompt.ts +115 -0
  274. package/dist/agent-src/templates/scripts/work_engine/scoring/confidence.ts +415 -0
  275. package/dist/agent-src/templates/scripts/work_engine/scoring/decision_engine.ts +466 -0
  276. package/dist/agent-src/templates/scripts/work_engine/scoring/decision_trace.ts +298 -0
  277. package/dist/agent-src/templates/scripts/work_engine/scoring/memory_visibility.ts +444 -0
  278. package/dist/agent-src/templates/scripts/work_engine/stack/detect.ts +252 -0
  279. package/dist/agent-src/templates/scripts/work_engine/stack/runner.ts +745 -0
  280. package/dist/agent-src/templates/scripts/work_engine/state.ts +1151 -0
  281. package/dist/agent-src/templates/scripts/work_engine/state_io.ts +413 -0
  282. package/dist/agent-src/templates/tickets.md +120 -0
  283. package/dist/cli/commands/commands.js +2 -2
  284. package/dist/cli/commands/commands.js.map +1 -1
  285. package/dist/cli/commands/doctorShell.js +4 -22
  286. package/dist/cli/commands/doctorShell.js.map +1 -1
  287. package/dist/cli/commands/packs.js +1 -1
  288. package/dist/cli/commands/packs.js.map +1 -1
  289. package/dist/cli/commands/recordTriggerEval.js +179 -0
  290. package/dist/cli/commands/recordTriggerEval.js.map +1 -0
  291. package/dist/cli/commands/recordTriggerEval.test.js +113 -0
  292. package/dist/cli/commands/recordTriggerEval.test.js.map +1 -0
  293. package/dist/cli/commands/workspaces.js +1 -1
  294. package/dist/cli/commands/workspaces.js.map +1 -1
  295. package/dist/cli/main.js +22 -1
  296. package/dist/cli/main.js.map +1 -1
  297. package/dist/cli/python/knowledge_ingest.js +1048 -0
  298. package/dist/cli/python/knowledge_ingest.js.map +1 -0
  299. package/dist/cli/python/workspace_analytics.js +1085 -0
  300. package/dist/cli/python/workspace_analytics.js.map +1 -0
  301. package/dist/cli/python/workspace_crypto.js +544 -0
  302. package/dist/cli/python/workspace_crypto.js.map +1 -0
  303. package/dist/cli/python/workspace_documents.js +1216 -0
  304. package/dist/cli/python/workspace_documents.js.map +1 -0
  305. package/dist/cli/python/workspace_drive.js +574 -0
  306. package/dist/cli/python/workspace_drive.js.map +1 -0
  307. package/dist/cli/python/workspace_drive_health.js +628 -0
  308. package/dist/cli/python/workspace_drive_health.js.map +1 -0
  309. package/dist/cli/python/workspace_explain.js +765 -0
  310. package/dist/cli/python/workspace_explain.js.map +1 -0
  311. package/dist/cli/python/workspace_hosts.js +349 -0
  312. package/dist/cli/python/workspace_hosts.js.map +1 -0
  313. package/dist/cli/python/workspace_inbox.js +692 -0
  314. package/dist/cli/python/workspace_inbox.js.map +1 -0
  315. package/dist/cli/python/workspace_render.js +816 -0
  316. package/dist/cli/python/workspace_render.js.map +1 -0
  317. package/dist/cli/python/workspace_roles.js +487 -0
  318. package/dist/cli/python/workspace_roles.js.map +1 -0
  319. package/dist/cli/python/workspace_secrets.js +180 -0
  320. package/dist/cli/python/workspace_secrets.js.map +1 -0
  321. package/dist/cli/python/workspace_sessions.js +1079 -0
  322. package/dist/cli/python/workspace_sessions.js.map +1 -0
  323. package/dist/cli/python/workspace_skills.js +417 -0
  324. package/dist/cli/python/workspace_skills.js.map +1 -0
  325. package/dist/cli/registry.js +2 -0
  326. package/dist/cli/registry.js.map +1 -1
  327. package/dist/discovery/deprecation-report.md +1 -1
  328. package/dist/discovery/discovery-manifest.json +1174 -123
  329. package/dist/discovery/discovery-manifest.json.sha256 +1 -1
  330. package/dist/discovery/discovery-manifest.summary.md +9 -6
  331. package/dist/discovery/orphan-report.md +1 -1
  332. package/dist/discovery/packs.json +163 -15
  333. package/dist/discovery/trust-report.md +4 -4
  334. package/dist/discovery/workspaces.json +73 -12
  335. package/dist/install/install.mjs +13934 -0
  336. package/dist/mcp/registry-manifest.json +4 -4
  337. package/dist/router.json +1 -1
  338. package/dist/server/routes/wizard.js +50 -21
  339. package/dist/server/routes/wizard.js.map +1 -1
  340. package/dist/server/routes/workspace.js +44 -25
  341. package/dist/server/routes/workspace.js.map +1 -1
  342. package/dist/server/schemas/settings.js +15 -0
  343. package/dist/server/schemas/settings.js.map +1 -1
  344. package/docs/SKILL_CENSUS.md +344 -0
  345. package/docs/architecture/augment-projection.md +1 -1
  346. package/docs/architecture/multi-tool-projection.md +3 -3
  347. package/docs/architecture.md +37 -6
  348. package/docs/benchmark.md +24 -27
  349. package/docs/capability-matrix.md +32 -0
  350. package/docs/catalog.md +50 -9
  351. package/docs/command-naming-audit.md +60 -0
  352. package/docs/contracts/STABILITY.md +32 -0
  353. package/docs/contracts/agents-md-tech-stack.md +1 -1
  354. package/docs/contracts/ai-council-config.md +22 -22
  355. package/docs/contracts/analysis-memory-loop.md +149 -0
  356. package/docs/contracts/benchmark-ab-contract.md +3 -3
  357. package/docs/contracts/branch-protection-policy.md +27 -0
  358. package/docs/contracts/brand-token-consumption.md +69 -0
  359. package/docs/contracts/command-clusters.md +2 -1
  360. package/docs/contracts/command-surface-tiers.md +13 -0
  361. package/docs/contracts/discovery-manifest.schema.json +24 -5
  362. package/docs/contracts/implement-ticket-flow.md +9 -9
  363. package/docs/contracts/install-layout.md +249 -0
  364. package/docs/contracts/kernel-membership.md +1 -1
  365. package/docs/contracts/linear-ai-rules-inclusion.md +2 -2
  366. package/docs/contracts/linter-structural-model.md +1 -1
  367. package/docs/contracts/mcp-discovery-phase-notice.md +1 -1
  368. package/docs/contracts/multi-tool-projection-fidelity.md +1 -1
  369. package/docs/contracts/namespace.md +2 -2
  370. package/docs/contracts/no-runtime-boundary.md +56 -0
  371. package/docs/contracts/package-self-orientation.md +24 -0
  372. package/docs/contracts/provider-lifecycle.md +3 -3
  373. package/docs/contracts/reasoning-discipline-protocol.md +83 -0
  374. package/docs/contracts/rule-classification.md +3 -3
  375. package/docs/contracts/skill-domains.md +1 -1
  376. package/docs/contracts/smoke-contracts.md +1 -1
  377. package/docs/contracts/surface-tiers.md +81 -0
  378. package/docs/contracts/ticket-bundle-format.md +228 -0
  379. package/docs/cookbook.md +152 -0
  380. package/docs/customization.md +12 -1
  381. package/docs/decisions/ADR-013-discovery-frontmatter-contract.md +16 -0
  382. package/docs/decisions/ADR-056-unvalidated-video-adapters-disposition.md +1 -1
  383. package/docs/decisions/ADR-059-render-resume-filesystem-as-state.md +1 -1
  384. package/docs/decisions/ADR-060-comfyui-sandbox-model.md +1 -1
  385. package/docs/decisions/ADR-061-corpus-grounding-layer.md +48 -1
  386. package/docs/decisions/ADR-096-analysis-workbench.md +110 -0
  387. package/docs/decisions/ADR-097-mission-recipe-privilege-boundary.md +121 -0
  388. package/docs/decisions/ADR-098-evidence-first-structure-discovery.md +154 -0
  389. package/docs/decisions/ADR-099-file-first-pattern-library.md +87 -0
  390. package/docs/decisions/ADR-100-global-knowledge-card-sharing.md +133 -0
  391. package/docs/decisions/ADR-101-ticket-bundle-emission.md +109 -0
  392. package/docs/decisions/ADR-102-ticket-handoff-paste-and-mcp.md +72 -0
  393. package/docs/decisions/ADR-103-global-knowledge-default-off-until-measured.md +92 -0
  394. package/docs/decisions/ADR-200-python-to-typescript-migration.md +193 -0
  395. package/docs/decisions/INDEX.md +9 -0
  396. package/docs/distribution/mcp-submission-checklist.md +3 -3
  397. package/docs/featured-commands.md +1 -1
  398. package/docs/featured-skills.md +1 -1
  399. package/docs/getting-started-by-role.md +2 -0
  400. package/docs/getting-started.md +2 -2
  401. package/docs/guidelines/agent-infra/failure-signatures.md +35 -0
  402. package/docs/guidelines/agent-infra/frontier-reasoning-operating-profile.md +5 -0
  403. package/docs/guidelines/agent-infra/size-and-scope.md +17 -0
  404. package/docs/guidelines/agent-infra/skill-quality-checklist.md +2 -2
  405. package/docs/guides/frontend-design-corpus-refresh.md +83 -0
  406. package/docs/guides/skill-preview.md +1 -1
  407. package/docs/hook-payload-capture.md +4 -4
  408. package/docs/mcp.md +1 -1
  409. package/docs/migration/consumer-template-consumption-model.md +145 -0
  410. package/docs/migration/divergences/README.md +55 -0
  411. package/docs/migration/divergences/_template.md +50 -0
  412. package/docs/migration/divergences/bench-stats-float-precision.md +72 -0
  413. package/docs/migration/divergences/mcp-telemetry-node-sqlite.md +61 -0
  414. package/docs/migration/divergences/pack-mcp-content-gzip-body.md +53 -0
  415. package/docs/migration/divergences/src-scripts-build_cloud_bundle.md +63 -0
  416. package/docs/migration/divergences/src-scripts-check_memory.md +91 -0
  417. package/docs/migration/divergences/src-scripts-inventory_abstraction_budget.md +65 -0
  418. package/docs/migration/divergences/src-scripts-lint_marketplace.md +57 -0
  419. package/docs/migration/divergences/src-scripts-lint_mcp_registry_manifest.md +70 -0
  420. package/docs/migration/divergences/src-scripts-spotcheck_thin_root.md +60 -0
  421. package/docs/migration/divergences/src-scripts-validate_agent_settings.md +58 -0
  422. package/docs/migration/node-floor.md +86 -0
  423. package/docs/migration/yaml-roundtrip-spike.md +163 -0
  424. package/docs/personas.md +6 -1
  425. package/docs/role-experiences.md +19 -0
  426. package/docs/setup/per-ide/windsurf.md +1 -1
  427. package/docs/skills-catalog.md +24 -3
  428. package/docs/threat-model.md +28 -0
  429. package/llms.txt +23 -2
  430. package/package.json +10 -15
  431. package/src/config/agent-settings.template.yml +64 -1
  432. package/src/config/discovery/packs.yml +31 -0
  433. package/src/config/discovery/unassigned-artefacts.yml +6 -0
  434. package/src/config/discovery/workspaces.yml +2 -2
  435. package/src/config/gitignore-block.txt +7 -0
  436. package/src/scripts/_cli/cmd_doctor.ts +2306 -0
  437. package/src/scripts/_cli/cmd_explain.ts +748 -0
  438. package/src/scripts/_cli/cmd_export.ts +375 -0
  439. package/src/scripts/_cli/cmd_migrate.ts +951 -0
  440. package/src/scripts/_cli/cmd_prune.ts +610 -0
  441. package/src/scripts/_cli/cmd_refresh.ts +530 -0
  442. package/src/scripts/_cli/cmd_settings_check.ts +407 -0
  443. package/src/scripts/_cli/cmd_settings_migrate.ts +344 -0
  444. package/src/scripts/_cli/cmd_sync.ts +381 -0
  445. package/src/scripts/_cli/cmd_uninstall.ts +833 -0
  446. package/src/scripts/_cli/cmd_update.ts +585 -0
  447. package/src/scripts/_cli/cmd_upgrade.ts +390 -0
  448. package/src/scripts/_cli/cmd_validate.ts +394 -0
  449. package/src/scripts/_cli/cmd_versions.ts +492 -0
  450. package/src/scripts/_cli/explain_last/assumptions.ts +114 -0
  451. package/src/scripts/_cli/explain_last/council.ts +197 -0
  452. package/src/scripts/_cli/explain_last/halt.ts +73 -0
  453. package/src/scripts/_cli/explain_last/index.ts +155 -0
  454. package/src/scripts/_cli/explain_last/inputs.ts +211 -0
  455. package/src/scripts/_cli/explain_last/memory.ts +231 -0
  456. package/src/scripts/_cli/explain_last/provider.ts +82 -0
  457. package/src/scripts/_cli/explain_last/render.ts +54 -0
  458. package/src/scripts/_cli/explain_last/route.ts +70 -0
  459. package/src/scripts/_cli/explain_last/scrubber.ts +138 -0
  460. package/src/scripts/_cli/explain_last/sections/assumptions.ts +51 -0
  461. package/src/scripts/_cli/explain_last/sections/council.ts +56 -0
  462. package/src/scripts/_cli/explain_last/sections/halt.ts +60 -0
  463. package/src/scripts/_cli/explain_last/sections/header.ts +50 -0
  464. package/src/scripts/_cli/explain_last/sections/index.ts +21 -0
  465. package/src/scripts/_cli/explain_last/sections/inputs.ts +63 -0
  466. package/src/scripts/_cli/explain_last/sections/memory.ts +124 -0
  467. package/src/scripts/_cli/explain_last/sections/pack.ts +42 -0
  468. package/src/scripts/_cli/explain_last/sections/provider.ts +51 -0
  469. package/src/scripts/_cli/explain_last/sections/route.ts +48 -0
  470. package/src/scripts/_cli/explain_last/state_loader.ts +119 -0
  471. package/src/scripts/_dispatch.bash +179 -163
  472. package/src/scripts/_lib/agent_settings.ts +1123 -0
  473. package/src/scripts/_lib/agent_src.ts +654 -0
  474. package/src/scripts/_lib/agents_overlay.ts +183 -0
  475. package/src/scripts/_lib/bench_ab_cache.ts +399 -0
  476. package/src/scripts/_lib/bench_ab_scoring.ts +352 -0
  477. package/src/scripts/_lib/bench_ab_scoring_v2.ts +751 -0
  478. package/src/scripts/_lib/bench_cost.ts +396 -0
  479. package/src/scripts/_lib/bench_quality.ts +237 -0
  480. package/src/scripts/_lib/bench_report.ts +255 -0
  481. package/src/scripts/_lib/bench_telegraph.ts +516 -0
  482. package/src/scripts/_lib/bench_telegraph_report.ts +272 -0
  483. package/src/scripts/_lib/changelog_eras.ts +398 -0
  484. package/src/scripts/_lib/claude_desktop_bundler.ts +324 -0
  485. package/src/scripts/_lib/cli_wrapper.ts +89 -0
  486. package/src/scripts/_lib/fs_atomic.ts +172 -0
  487. package/src/scripts/_lib/global_deploy_inventory.ts +639 -0
  488. package/src/scripts/_lib/install_layout.ts +87 -0
  489. package/src/scripts/_lib/install_regenerator.ts +157 -0
  490. package/src/scripts/_lib/installed_lock.ts +451 -0
  491. package/src/scripts/_lib/installed_tools.ts +518 -0
  492. package/src/scripts/_lib/json_pointers.ts +388 -0
  493. package/src/scripts/_lib/knowledge_global.ts +770 -0
  494. package/src/scripts/_lib/knowledge_global_promote.ts +453 -0
  495. package/src/scripts/_lib/knowledge_global_redaction.ts +448 -0
  496. package/src/scripts/_lib/link_crypto.ts +325 -0
  497. package/src/scripts/_lib/linked_projects.ts +613 -0
  498. package/src/scripts/_lib/model_tier.ts +65 -0
  499. package/src/scripts/_lib/module_detection.ts +275 -0
  500. package/src/scripts/_lib/node_sqlite.d.ts +32 -0
  501. package/src/scripts/_lib/pin_resolver.ts +264 -0
  502. package/src/scripts/_lib/py_random.ts +212 -0
  503. package/src/scripts/_lib/script_output.ts +147 -0
  504. package/src/scripts/_lib/security_lint.ts +623 -0
  505. package/src/scripts/_lib/surface_tiers.ts +127 -0
  506. package/src/scripts/_lib/token_count.ts +126 -0
  507. package/src/scripts/_lib/update_check.ts +297 -0
  508. package/src/scripts/_lib/user_global_paths.ts +329 -0
  509. package/src/scripts/_lib/value_ladder.ts +882 -0
  510. package/src/scripts/_lib/value_report.ts +617 -0
  511. package/src/scripts/_lib/zip_min.ts +175 -0
  512. package/src/scripts/adoption_report.ts +357 -0
  513. package/src/scripts/adoption_snapshot.ts +392 -0
  514. package/src/scripts/adoption_status.ts +424 -0
  515. package/src/scripts/adr/regenerate_index.ts +257 -0
  516. package/src/scripts/ai-image/adapters/flux.sh +45 -0
  517. package/src/scripts/ai-image/adapters/gemini-image.sh +45 -0
  518. package/src/scripts/ai-image/adapters/ideogram.sh +45 -0
  519. package/src/scripts/ai-image/adapters/recraft.sh +47 -0
  520. package/src/scripts/ai-video/adapters/comfyui.sh +3 -3
  521. package/src/scripts/ai-video/adapters/fal.sh +3 -3
  522. package/src/scripts/ai-video/adapters/gemini-veo.sh +3 -3
  523. package/src/scripts/ai-video/adapters/higgsfield.sh +3 -3
  524. package/src/scripts/ai-video/adapters/kling.sh +3 -3
  525. package/src/scripts/ai-video/adapters/musetalk.sh +2 -2
  526. package/src/scripts/ai-video/adapters/openai-images.sh +3 -3
  527. package/src/scripts/ai-video/adapters/replicate.sh +3 -3
  528. package/src/scripts/ai-video/adapters/sora.sh +3 -3
  529. package/src/scripts/ai-video/adapters/syncso.sh +3 -3
  530. package/src/scripts/ai-video/audio-adapters/allin1.sh +2 -2
  531. package/src/scripts/ai-video/audio-adapters/whisperx.sh +2 -2
  532. package/src/scripts/ai-video/lib/audio-adapter-contract.md +1 -1
  533. package/src/scripts/ai-video/lib/embed-provenance.sh +2 -2
  534. package/src/scripts/ai-video/lib/ingest-song.sh +2 -2
  535. package/src/scripts/ai-video/lib/parse-blueprint.sh +1 -1
  536. package/src/scripts/ai-video/lib/resume-scan.sh +2 -2
  537. package/src/scripts/ai-video/smoke-trace.sh +16 -7
  538. package/src/scripts/ai-video/stitch.sh +2 -2
  539. package/src/scripts/ai_council/_default_prices.ts +73 -0
  540. package/src/scripts/ai_council/advisors.ts +244 -0
  541. package/src/scripts/ai_council/airgap.ts +249 -0
  542. package/src/scripts/ai_council/budget_guard.ts +492 -0
  543. package/src/scripts/ai_council/bundler.ts +376 -0
  544. package/src/scripts/ai_council/cli_hints.ts +120 -0
  545. package/src/scripts/ai_council/clients.ts +2214 -0
  546. package/src/scripts/ai_council/compile_corpus.ts +681 -0
  547. package/src/scripts/ai_council/confidence_gate.ts +230 -0
  548. package/src/scripts/ai_council/config.ts +1729 -0
  549. package/src/scripts/ai_council/consensus.ts +551 -0
  550. package/src/scripts/ai_council/events_log.ts +327 -0
  551. package/src/scripts/ai_council/learn_low_impact_preview.ts +317 -0
  552. package/src/scripts/ai_council/low_impact.ts +1069 -0
  553. package/src/scripts/ai_council/low_impact_corpus.ts +662 -0
  554. package/src/scripts/ai_council/low_impact_intake.ts +222 -0
  555. package/src/scripts/ai_council/modes.ts +169 -0
  556. package/src/scripts/ai_council/necessity.ts +933 -0
  557. package/src/scripts/ai_council/orchestrator.ts +1689 -0
  558. package/src/scripts/ai_council/pricing.ts +267 -0
  559. package/src/scripts/ai_council/probation_gate.ts +282 -0
  560. package/src/scripts/ai_council/project_context.ts +308 -0
  561. package/src/scripts/ai_council/prompts.ts +600 -0
  562. package/src/scripts/ai_council/redact_low_impact_entry.ts +291 -0
  563. package/src/scripts/ai_council/replay.ts +314 -0
  564. package/src/scripts/ai_council/session.ts +558 -0
  565. package/src/scripts/ai_council/shadow_dispatch.ts +509 -0
  566. package/src/scripts/ai_council/solo_dispatch.ts +281 -0
  567. package/src/scripts/analysis_freshness.ts +343 -0
  568. package/src/scripts/annotate_discovery.ts +288 -0
  569. package/src/scripts/apply_modules_config.ts +537 -0
  570. package/src/scripts/audit_adr_coverage.ts +357 -0
  571. package/src/scripts/audit_auto_rules.ts +415 -0
  572. package/src/scripts/audit_cloud_compatibility.ts +608 -0
  573. package/src/scripts/audit_command_surface.ts +1227 -0
  574. package/src/scripts/audit_initial_context.ts +694 -0
  575. package/src/scripts/audit_likelihood.ts +434 -0
  576. package/src/scripts/audit_mcp_tools.ts +252 -0
  577. package/src/scripts/audit_overlap.ts +421 -0
  578. package/src/scripts/audit_skill_descriptions.ts +402 -0
  579. package/src/scripts/audit_skill_overlap.ts +576 -0
  580. package/src/scripts/audit_user_type_axis.ts +264 -0
  581. package/src/scripts/backfill_model_tier.ts +349 -0
  582. package/src/scripts/bench_ab_cache_dispatch.ts +126 -0
  583. package/src/scripts/bench_ab_clone.ts +610 -0
  584. package/src/scripts/bench_ab_diff.ts +609 -0
  585. package/src/scripts/bench_ab_integrity.ts +261 -0
  586. package/src/scripts/bench_ab_run.ts +417 -0
  587. package/src/scripts/bench_ab_task_runner.ts +1382 -0
  588. package/src/scripts/bench_ab_tracka_run.ts +436 -0
  589. package/src/scripts/bench_ab_v2_run.ts +585 -0
  590. package/src/scripts/bench_ab_v2_stats.ts +1018 -0
  591. package/src/scripts/bench_baseline_ready.ts +326 -0
  592. package/src/scripts/bench_condense_memory.ts +479 -0
  593. package/src/scripts/bench_drift_check.ts +503 -0
  594. package/src/scripts/bench_per_tool.ts +591 -0
  595. package/src/scripts/bench_rtk_savings.ts +710 -0
  596. package/src/scripts/bench_run.ts +509 -0
  597. package/src/scripts/bench_runner.ts +519 -0
  598. package/src/scripts/build_cloud_bundle.ts +692 -0
  599. package/src/scripts/build_discovery_manifest.ts +1371 -0
  600. package/src/scripts/build_linear_digest.ts +368 -0
  601. package/src/scripts/build_mcp_registry_manifest.ts +351 -0
  602. package/src/scripts/build_rule_trigger_matrix.ts +469 -0
  603. package/src/scripts/capture_showcase_session.ts +735 -0
  604. package/src/scripts/chat_history.ts +2301 -0
  605. package/src/scripts/check_always_budget.ts +694 -0
  606. package/src/scripts/check_artefact_checksums.ts +281 -0
  607. package/src/scripts/check_augment_description_cap.ts +133 -0
  608. package/src/scripts/check_augmentignore.ts +108 -0
  609. package/src/scripts/check_beta_review_markers.ts +234 -0
  610. package/src/scripts/check_bite_sized_granularity.ts +116 -0
  611. package/src/scripts/check_cluster_patterns.ts +285 -0
  612. package/src/scripts/check_command_count_messaging.ts +224 -0
  613. package/src/scripts/check_condensation.ts +900 -0
  614. package/src/scripts/check_condensed_paths.ts +414 -0
  615. package/src/scripts/check_context_paths.ts +388 -0
  616. package/src/scripts/check_council_config_location.ts +260 -0
  617. package/src/scripts/check_council_layout.ts +180 -0
  618. package/src/scripts/check_council_references.ts +345 -0
  619. package/src/scripts/check_discovery_determinism.ts +124 -0
  620. package/src/scripts/check_gate_paths.ts +230 -0
  621. package/src/scripts/check_iron_law_prominence.ts +298 -0
  622. package/src/scripts/check_kernel_rule_bundle.ts +242 -0
  623. package/src/scripts/check_knowledge_cards.ts +759 -0
  624. package/src/scripts/check_md_language.ts +291 -0
  625. package/src/scripts/check_memory.ts +845 -0
  626. package/src/scripts/check_memory_proposal.ts +351 -0
  627. package/src/scripts/check_module_management_neutral.ts +238 -0
  628. package/src/scripts/check_no_conflict_markers.ts +298 -0
  629. package/src/scripts/check_no_conflict_markers_allowlist.json +4 -0
  630. package/src/scripts/check_no_external_sources.ts +351 -0
  631. package/src/scripts/check_no_local_settings_committed.ts +69 -0
  632. package/src/scripts/check_no_new_legacy_path.ts +188 -0
  633. package/src/scripts/check_no_roadmap_refs.ts +304 -0
  634. package/src/scripts/check_one_off_location.ts +165 -0
  635. package/src/scripts/check_overlay_cascade_subdirs.ts +188 -0
  636. package/src/scripts/check_portability.ts +860 -0
  637. package/src/scripts/check_proposal.ts +0 -0
  638. package/src/scripts/check_public_catalog_links.ts +204 -0
  639. package/src/scripts/check_public_links.ts +357 -0
  640. package/src/scripts/check_references.ts +963 -0
  641. package/src/scripts/check_release_includes_discovery.ts +94 -0
  642. package/src/scripts/check_release_pr_shape.ts +222 -0
  643. package/src/scripts/check_release_published.ts +235 -0
  644. package/src/scripts/check_release_trunk_sync.ts +203 -0
  645. package/src/scripts/check_reply_consistency.ts +359 -0
  646. package/src/scripts/check_roadmap_trackable.ts +268 -0
  647. package/src/scripts/check_role_doc_links.ts +187 -0
  648. package/src/scripts/check_safety_floor_untouched.ts +160 -0
  649. package/src/scripts/check_skill_requires.ts +205 -0
  650. package/src/scripts/check_structural_breaking.ts +170 -0
  651. package/src/scripts/check_surface_tiers.ts +567 -0
  652. package/src/scripts/check_template_pin_drift.ts +222 -0
  653. package/src/scripts/check_test_coverage_diff.ts +235 -0
  654. package/src/scripts/check_token_optimizer_freshness.ts +183 -0
  655. package/src/scripts/check_trigger_evals.ts +375 -0
  656. package/src/scripts/check_update_banner.ts +143 -0
  657. package/src/scripts/ci_status.ts +0 -0
  658. package/src/scripts/ci_summary.ts +235 -0
  659. package/src/scripts/ci_time_ratio.ts +526 -0
  660. package/src/scripts/command_suggester/cooldown.ts +176 -0
  661. package/src/scripts/command_suggester/index.ts +41 -0
  662. package/src/scripts/command_suggester/loader.ts +205 -0
  663. package/src/scripts/command_suggester/match.ts +294 -0
  664. package/src/scripts/command_suggester/rank.ts +201 -0
  665. package/src/scripts/command_suggester/render.ts +122 -0
  666. package/src/scripts/command_suggester/sanitize.ts +114 -0
  667. package/src/scripts/command_suggester/settings.ts +186 -0
  668. package/src/scripts/command_suggester/types.ts +0 -0
  669. package/src/scripts/compile_router.ts +297 -0
  670. package/src/scripts/condense.sh +7 -1
  671. package/src/scripts/condense.ts +2035 -0
  672. package/src/scripts/condense_memory.ts +334 -0
  673. package/src/scripts/config/index.ts +15 -0
  674. package/src/scripts/config/packs.ts +310 -0
  675. package/src/scripts/config/presets.ts +369 -0
  676. package/src/scripts/config/profile_explain.ts +114 -0
  677. package/src/scripts/config/profiles.ts +277 -0
  678. package/src/scripts/config/session_profiles.ts +1064 -0
  679. package/src/scripts/context_hygiene_hook.ts +272 -0
  680. package/src/scripts/cost_by_conversation.ts +444 -0
  681. package/src/scripts/cost_summary.ts +407 -0
  682. package/src/scripts/council_cli.ts +2827 -0
  683. package/src/scripts/council_prune.ts +153 -0
  684. package/src/scripts/cross_repo_retrieve.ts +694 -0
  685. package/src/scripts/discovery_stats.ts +218 -0
  686. package/src/scripts/evidence_report.ts +580 -0
  687. package/src/scripts/external_sources_denylist.json +1 -0
  688. package/src/scripts/extract_audit_patterns.ts +394 -0
  689. package/src/scripts/first_run_gate_hook.ts +246 -0
  690. package/src/scripts/gen_discovery_baseline.ts +297 -0
  691. package/src/scripts/generate_capabilities_index.ts +496 -0
  692. package/src/scripts/generate_capability_matrix.ts +430 -0
  693. package/src/scripts/generate_catalog.ts +178 -0
  694. package/src/scripts/generate_command_flows.ts +316 -0
  695. package/src/scripts/generate_cookbook.ts +302 -0
  696. package/src/scripts/generate_index.ts +500 -0
  697. package/src/scripts/generate_ownership_matrix.ts +646 -0
  698. package/src/scripts/generate_pack_manifests.ts +1025 -0
  699. package/src/scripts/generate_role_experiences_catalog.ts +265 -0
  700. package/src/scripts/hermetic-install.sh +22 -11
  701. package/src/scripts/hook_manifest.yaml +24 -10
  702. package/src/scripts/hooks/augment-chat-history.sh +3 -10
  703. package/src/scripts/hooks/augment-context-hygiene.sh +3 -10
  704. package/src/scripts/hooks/augment-dispatcher.sh +3 -10
  705. package/src/scripts/hooks/augment-onboarding-gate.sh +3 -10
  706. package/src/scripts/hooks/augment-roadmap-progress.sh +3 -10
  707. package/src/scripts/hooks/block_no_verify.ts +413 -0
  708. package/src/scripts/hooks/cline-dispatcher.sh +3 -10
  709. package/src/scripts/hooks/cowork-dispatcher.sh +3 -14
  710. package/src/scripts/hooks/cursor-dispatcher.sh +3 -10
  711. package/src/scripts/hooks/dispatch_hook.ts +851 -0
  712. package/src/scripts/hooks/dispatch_issues.ts +226 -0
  713. package/src/scripts/hooks/envelope.ts +140 -0
  714. package/src/scripts/hooks/gemini-dispatcher.sh +3 -8
  715. package/src/scripts/hooks/replay_hook.ts +364 -0
  716. package/src/scripts/hooks/state_io.ts +293 -0
  717. package/src/scripts/hooks/windsurf-dispatcher.sh +3 -9
  718. package/src/scripts/hooks_doctor.ts +418 -0
  719. package/src/scripts/hooks_status.ts +292 -0
  720. package/src/scripts/injection_scan_hook.ts +285 -0
  721. package/src/scripts/install +36 -22
  722. package/src/scripts/install-hooks.sh +20 -14
  723. package/src/scripts/install.sh +38 -14
  724. package/src/scripts/install.ts +4515 -0
  725. package/src/scripts/inventory_abstraction_budget.ts +1104 -0
  726. package/src/scripts/inventory_frontmatter.ts +320 -0
  727. package/src/scripts/inventory_meta_layers.ts +516 -0
  728. package/src/scripts/iron_law_sha.ts +233 -0
  729. package/src/scripts/knowledge_global_cli.ts +1105 -0
  730. package/src/scripts/linked_projects_list.ts +310 -0
  731. package/src/scripts/lint_agent_security.ts +224 -0
  732. package/src/scripts/lint_agent_skill_names.ts +241 -0
  733. package/src/scripts/lint_agents_layout.ts +205 -0
  734. package/src/scripts/lint_agents_md.ts +294 -0
  735. package/src/scripts/lint_archived_skills.ts +309 -0
  736. package/src/scripts/lint_artefact_frontmatter.ts +359 -0
  737. package/src/scripts/lint_bench_ab.ts +319 -0
  738. package/src/scripts/lint_bench_corpus.ts +421 -0
  739. package/src/scripts/lint_command_flow_coverage.ts +231 -0
  740. package/src/scripts/lint_command_routing.ts +377 -0
  741. package/src/scripts/lint_command_tiers.ts +345 -0
  742. package/src/scripts/lint_command_verbs.ts +379 -0
  743. package/src/scripts/lint_commit_subjects.ts +243 -0
  744. package/src/scripts/lint_context_spine_usage.ts +198 -0
  745. package/src/scripts/lint_discovery_manifest.ts +540 -0
  746. package/src/scripts/lint_discovery_vocabulary.ts +393 -0
  747. package/src/scripts/lint_empty_roadmaps.ts +147 -0
  748. package/src/scripts/lint_eval_freshness.ts +335 -0
  749. package/src/scripts/lint_examples.ts +183 -0
  750. package/src/scripts/lint_explain_trace.ts +381 -0
  751. package/src/scripts/lint_featured_skills.ts +0 -0
  752. package/src/scripts/lint_flows.ts +701 -0
  753. package/src/scripts/lint_framework_leakage.ts +497 -0
  754. package/src/scripts/lint_framework_leakage_allowlist.json +8 -1
  755. package/src/scripts/lint_frontmatter_boilerplate.ts +356 -0
  756. package/src/scripts/lint_ghostwriter_source.ts +389 -0
  757. package/src/scripts/lint_global_paths.ts +420 -0
  758. package/src/scripts/lint_handoffs.ts +362 -0
  759. package/src/scripts/lint_hidden_unicode.ts +350 -0
  760. package/src/scripts/lint_hook_concern_budget.ts +319 -0
  761. package/src/scripts/lint_hook_manifest.ts +354 -0
  762. package/src/scripts/lint_instruction_smuggling.ts +173 -0
  763. package/src/scripts/lint_load_context.ts +371 -0
  764. package/src/scripts/lint_marketplace.ts +286 -0
  765. package/src/scripts/lint_marketplace_install_completeness.ts +309 -0
  766. package/src/scripts/lint_mcp_config_security.ts +225 -0
  767. package/src/scripts/lint_mcp_registry_manifest.ts +350 -0
  768. package/src/scripts/lint_media_policy_linkage.ts +224 -0
  769. package/src/scripts/lint_missions.ts +774 -0
  770. package/src/scripts/lint_model_tier_coverage.ts +151 -0
  771. package/src/scripts/lint_namespace.ts +295 -0
  772. package/src/scripts/lint_namespace_collisions.ts +203 -0
  773. package/src/scripts/lint_new_skill_gate.ts +462 -0
  774. package/src/scripts/lint_no_new_atomic_commands.ts +342 -0
  775. package/src/scripts/lint_one_off_age.ts +348 -0
  776. package/src/scripts/lint_orchestration_dsl.ts +377 -0
  777. package/src/scripts/lint_orchestrator_auto_detect.ts +177 -0
  778. package/src/scripts/lint_pack_boundaries.ts +366 -0
  779. package/src/scripts/lint_pack_dependencies.ts +541 -0
  780. package/src/scripts/lint_pack_first_win.ts +202 -0
  781. package/src/scripts/lint_persona_governance.ts +292 -0
  782. package/src/scripts/lint_positioning.ts +257 -0
  783. package/src/scripts/lint_profile_overlay_set_only.ts +324 -0
  784. package/src/scripts/lint_readme_jargon.ts +189 -0
  785. package/src/scripts/lint_readme_size.ts +73 -0
  786. package/src/scripts/lint_regression.ts +497 -0
  787. package/src/scripts/lint_roadmap_ci_steps.ts +252 -0
  788. package/src/scripts/lint_roadmap_complexity.ts +295 -0
  789. package/src/scripts/lint_roadmap_later_disposition.ts +357 -0
  790. package/src/scripts/lint_role_experiences.ts +410 -0
  791. package/src/scripts/lint_rule_interactions.ts +281 -0
  792. package/src/scripts/lint_rule_tiers.ts +169 -0
  793. package/src/scripts/lint_showcase_sessions.ts +254 -0
  794. package/src/scripts/lint_skill_frontmatter_safety.ts +279 -0
  795. package/src/scripts/lint_skill_originality.ts +586 -0
  796. package/src/scripts/lint_skill_originality_allowlist.json +20 -0
  797. package/src/scripts/lint_skill_tools.ts +320 -0
  798. package/src/scripts/lint_ticket_buildable.ts +1027 -0
  799. package/src/scripts/lint_topics_yaml.ts +203 -0
  800. package/src/scripts/lint_trust_coherence.ts +377 -0
  801. package/src/scripts/lint_value_dashboard.ts +314 -0
  802. package/src/scripts/lint_workflow_security.ts +637 -0
  803. package/src/scripts/lint_workflow_security_allowlist.json +20 -0
  804. package/src/scripts/lint_workspace_boundary.ts +248 -0
  805. package/src/scripts/mcp_parity_smoke.ts +638 -0
  806. package/src/scripts/mcp_render.ts +346 -0
  807. package/src/scripts/mcp_server/__main__.ts +28 -0
  808. package/src/scripts/mcp_server/catalog.ts +154 -0
  809. package/src/scripts/mcp_server/index.ts +24 -0
  810. package/src/scripts/mcp_server/metadata.ts +83 -0
  811. package/src/scripts/mcp_server/prompts.ts +711 -0
  812. package/src/scripts/mcp_server/resources.ts +343 -0
  813. package/src/scripts/mcp_server/server.ts +439 -0
  814. package/src/scripts/mcp_server/telemetry.ts +154 -0
  815. package/src/scripts/mcp_server/tools.ts +1031 -0
  816. package/src/scripts/mcp_setup.sh +25 -52
  817. package/src/scripts/mcp_telemetry_health.ts +362 -0
  818. package/src/scripts/mcp_telemetry_query.ts +371 -0
  819. package/src/scripts/mcp_telemetry_store.ts +422 -0
  820. package/src/scripts/measure_augment_budget.ts +453 -0
  821. package/src/scripts/measure_density.ts +618 -0
  822. package/src/scripts/measure_frugality_savings.ts +353 -0
  823. package/src/scripts/measure_markitdown_lift.ts +299 -0
  824. package/src/scripts/measure_patterns.ts +682 -0
  825. package/src/scripts/measure_projection_bytes.ts +425 -0
  826. package/src/scripts/measure_rule_budget.ts +627 -0
  827. package/src/scripts/measure_skill_reduction.ts +442 -0
  828. package/src/scripts/media/lib/adapter-common.sh +247 -0
  829. package/src/scripts/media/lib/adapter-contract.md +329 -0
  830. package/src/scripts/media/lib/fixtures/comfyui/result.json +1 -0
  831. package/src/scripts/media/lib/fixtures/fal/result.json +1 -0
  832. package/src/scripts/media/lib/fixtures/flux/asset-0001.png +0 -0
  833. package/src/scripts/media/lib/fixtures/flux/result.json +1 -0
  834. package/src/scripts/media/lib/fixtures/gemini-image/asset-0001.png +0 -0
  835. package/src/scripts/media/lib/fixtures/gemini-image/result.json +1 -0
  836. package/src/scripts/media/lib/fixtures/gemini-veo/result.json +1 -0
  837. package/src/scripts/media/lib/fixtures/higgsfield/result.json +1 -0
  838. package/src/scripts/media/lib/fixtures/ideogram/asset-0001.png +0 -0
  839. package/src/scripts/media/lib/fixtures/ideogram/result.json +1 -0
  840. package/src/scripts/media/lib/fixtures/kling/result.json +1 -0
  841. package/src/scripts/media/lib/fixtures/musetalk/result.json +1 -0
  842. package/src/scripts/media/lib/fixtures/openai-images/result.json +1 -0
  843. package/src/scripts/media/lib/fixtures/recraft/asset-0001.svg +1 -0
  844. package/src/scripts/media/lib/fixtures/recraft/result.json +1 -0
  845. package/src/scripts/media/lib/fixtures/replicate/result.json +1 -0
  846. package/src/scripts/media/lib/fixtures/sora/result.json +1 -0
  847. package/src/scripts/media/lib/fixtures/syncso/result.json +1 -0
  848. package/src/scripts/media/lib/load-config.sh +180 -0
  849. package/src/scripts/media/lib/redact.sh +85 -0
  850. package/src/scripts/memory_hash.ts +331 -0
  851. package/src/scripts/memory_lookup.ts +1278 -0
  852. package/src/scripts/memory_report.ts +845 -0
  853. package/src/scripts/memory_signal.ts +417 -0
  854. package/src/scripts/memory_status.ts +189 -0
  855. package/src/scripts/migrate_command_suggestions.ts +341 -0
  856. package/src/scripts/migrate_frontmatter_defaults.ts +539 -0
  857. package/src/scripts/migration_status.ts +301 -0
  858. package/src/scripts/mine_session.ts +645 -0
  859. package/src/scripts/minimal_safe_diff_hook.ts +355 -0
  860. package/src/scripts/move_artefact.ts +869 -0
  861. package/src/scripts/new_skill.ts +404 -0
  862. package/src/scripts/onboarding_gate_hook.ts +224 -0
  863. package/src/scripts/pack_dependency_allowlist.json +1 -1
  864. package/src/scripts/pack_mcp_content.ts +552 -0
  865. package/src/scripts/parity/README.md +140 -0
  866. package/src/scripts/parity/compare.ts +189 -0
  867. package/src/scripts/parity/coverage_diff.ts +199 -0
  868. package/src/scripts/parity/phase-manifest.json +93 -0
  869. package/src/scripts/parity/phase_gate.ts +270 -0
  870. package/src/scripts/parity/replay.ts +320 -0
  871. package/src/scripts/pattern_share.ts +363 -0
  872. package/src/scripts/plan_physical_move.ts +605 -0
  873. package/src/scripts/prediction-pool/poisson_sim.ts +537 -0
  874. package/src/scripts/prediction-pool/pool_winsim.ts +677 -0
  875. package/src/scripts/prediction-pool/score_ev.ts +546 -0
  876. package/src/scripts/print_required_checks.ts +249 -0
  877. package/src/scripts/probe_projection_fidelity.ts +468 -0
  878. package/src/scripts/probe_skill_registration.ts +787 -0
  879. package/src/scripts/profile_staleness_hook.ts +169 -0
  880. package/src/scripts/profile_use.ts +227 -0
  881. package/src/scripts/project_thin_rules.ts +387 -0
  882. package/src/scripts/propose_modules_config.ts +311 -0
  883. package/src/scripts/prototype_lint_contradictions.ts +414 -0
  884. package/src/scripts/prove_pack_extractable.ts +388 -0
  885. package/src/scripts/readme_linter.ts +913 -0
  886. package/src/scripts/redact_hook_capture.ts +325 -0
  887. package/src/scripts/refine_ticket_detect.ts +703 -0
  888. package/src/scripts/release.ts +1697 -0
  889. package/src/scripts/render_benchmark_md.ts +664 -0
  890. package/src/scripts/render_value_md.ts +506 -0
  891. package/src/scripts/repro/repro_marketplace_install_gap.sh +1 -1
  892. package/src/scripts/roadmap_progress_hook.ts +410 -0
  893. package/src/scripts/router_telemetry.ts +972 -0
  894. package/src/scripts/run.ts +98 -0
  895. package/src/scripts/run_skill_evals.ts +477 -0
  896. package/src/scripts/runtime_dispatcher.ts +586 -0
  897. package/src/scripts/runtime_handler.ts +231 -0
  898. package/src/scripts/runtime_registry.ts +394 -0
  899. package/src/scripts/schemas/command.schema.json +3 -2
  900. package/src/scripts/schemas/mission-catalog.schema.json +112 -0
  901. package/src/scripts/schemas/mission.schema.json +87 -0
  902. package/src/scripts/schemas/pack.schema.json +6 -0
  903. package/src/scripts/schemas/rule.schema.json +1 -0
  904. package/src/scripts/schemas/skill.schema.json +1 -0
  905. package/src/scripts/schemas/ticket-manifest.schema.json +35 -0
  906. package/src/scripts/schemas/ticket.schema.json +60 -0
  907. package/src/scripts/score_skill_selection.ts +570 -0
  908. package/src/scripts/security_audit_config.ts +423 -0
  909. package/src/scripts/skill_collision_clusters.ts +448 -0
  910. package/src/scripts/skill_discovery.ts +690 -0
  911. package/src/scripts/skill_linter.ts +4276 -0
  912. package/src/scripts/skill_overlap.ts +414 -0
  913. package/src/scripts/skill_preview.ts +548 -0
  914. package/src/scripts/skill_tools/audit_persona_coverage.ts +427 -0
  915. package/src/scripts/skill_tools/audit_user_type_coverage.ts +507 -0
  916. package/src/scripts/skill_tools/index.ts +28 -0
  917. package/src/scripts/skill_tools/run_block_d_eval.ts +373 -0
  918. package/src/scripts/skill_tools/score_skill_relevance.ts +475 -0
  919. package/src/scripts/skill_tools/suggest_skill_for_task.ts +288 -0
  920. package/src/scripts/skill_trigger_eval.ts +1046 -0
  921. package/src/scripts/skill_usage_collect.ts +465 -0
  922. package/src/scripts/skill_usage_report.ts +364 -0
  923. package/src/scripts/smoke/kernel.sh +4 -5
  924. package/src/scripts/smoke/router.sh +76 -76
  925. package/src/scripts/smoke/schema.sh +2 -2
  926. package/src/scripts/smoke/skills.sh +73 -52
  927. package/src/scripts/smoke_path_resolution.ts +194 -0
  928. package/src/scripts/smoke_quickstart.ts +224 -0
  929. package/src/scripts/snapshot_agent_outputs.ts +375 -0
  930. package/src/scripts/spotcheck_thin_root.ts +247 -0
  931. package/src/scripts/surface-tiers.yml +68 -0
  932. package/src/scripts/sync_agent_settings.ts +763 -0
  933. package/src/scripts/sync_github_metadata.ts +550 -0
  934. package/src/scripts/sync_gitignore.ts +630 -0
  935. package/src/scripts/sync_yaml_rt.ts +910 -0
  936. package/src/scripts/telegraph_stats.ts +447 -0
  937. package/src/scripts/tool_registry.ts +330 -0
  938. package/src/scripts/tools/adapter_errors.ts +93 -0
  939. package/src/scripts/tools/base_adapter.ts +147 -0
  940. package/src/scripts/tools/github_adapter.ts +229 -0
  941. package/src/scripts/tools/jira_adapter.ts +196 -0
  942. package/src/scripts/trigger_coverage.ts +251 -0
  943. package/src/scripts/update_counts.ts +284 -0
  944. package/src/scripts/update_prices.ts +219 -0
  945. package/src/scripts/validate_agent_settings.ts +265 -0
  946. package/src/scripts/validate_decision_engine.ts +366 -0
  947. package/src/scripts/validate_discovery_manifest.ts +160 -0
  948. package/src/scripts/validate_frontmatter.ts +1030 -0
  949. package/src/scripts/validate_pack_yaml.ts +0 -0
  950. package/src/scripts/validate_safe_paths.ts +164 -0
  951. package/src/scripts/validate_telegraph_carveouts.ts +485 -0
  952. package/src/scripts/verify_before_complete_hook.ts +306 -0
  953. package/src/scripts/verify_physical_move.ts +411 -0
  954. package/src/scripts/wrapper_freshness_hook.ts +179 -0
  955. package/dist/agent-src/scripts/archive_completed_roadmaps.py +0 -171
  956. package/dist/agent-src/scripts/update_roadmap_progress.py +0 -537
  957. package/dist/agent-src/skills/corpus-grounding/scripts/bm25_search.py +0 -212
  958. package/dist/agent-src/skills/corpus-grounding/scripts/decision_engine.py +0 -438
  959. package/dist/agent-src/skills/corpus-grounding/scripts/ground.py +0 -166
  960. package/dist/agent-src/skills/corpus-grounding/scripts/schema_validator.py +0 -160
  961. package/dist/agent-src/skills/design-tokens/scripts/tokens.py +0 -296
  962. package/dist/agent-src/skills/react-shadcn-ui/scripts/shadcn_add.py +0 -299
  963. package/dist/agent-src/skills/tailwind-engineer/scripts/tailwind_config_gen.py +0 -463
  964. package/dist/agent-src/templates/scripts/check_memory.py +0 -282
  965. package/dist/agent-src/templates/scripts/check_memory_proposal.py +0 -180
  966. package/dist/agent-src/templates/scripts/implement_ticket/__init__.py +0 -94
  967. package/dist/agent-src/templates/scripts/implement_ticket/__main__.py +0 -15
  968. package/dist/agent-src/templates/scripts/memory_hash.py +0 -75
  969. package/dist/agent-src/templates/scripts/memory_lookup.py +0 -436
  970. package/dist/agent-src/templates/scripts/memory_report.py +0 -314
  971. package/dist/agent-src/templates/scripts/memory_signal.py +0 -165
  972. package/dist/agent-src/templates/scripts/memory_status.py +0 -76
  973. package/dist/agent-src/templates/scripts/pr_review_routing.py +0 -340
  974. package/dist/agent-src/templates/scripts/pr_risk_review.py +0 -211
  975. package/dist/agent-src/templates/scripts/telemetry/__init__.py +0 -42
  976. package/dist/agent-src/templates/scripts/telemetry/aggregator.py +0 -169
  977. package/dist/agent-src/templates/scripts/telemetry/boundary.py +0 -171
  978. package/dist/agent-src/templates/scripts/telemetry/engagement.py +0 -297
  979. package/dist/agent-src/templates/scripts/telemetry/report_renderer.py +0 -197
  980. package/dist/agent-src/templates/scripts/telemetry/settings.py +0 -177
  981. package/dist/agent-src/templates/scripts/telemetry_record.py +0 -179
  982. package/dist/agent-src/templates/scripts/telemetry_report.py +0 -161
  983. package/dist/agent-src/templates/scripts/telemetry_status.py +0 -142
  984. package/dist/agent-src/templates/scripts/tier_usage_report.py +0 -183
  985. package/dist/agent-src/templates/scripts/work_engine/__init__.py +0 -58
  986. package/dist/agent-src/templates/scripts/work_engine/__main__.py +0 -9
  987. package/dist/agent-src/templates/scripts/work_engine/_lib/__init__.py +0 -7
  988. package/dist/agent-src/templates/scripts/work_engine/_lib/agent_settings.py +0 -840
  989. package/dist/agent-src/templates/scripts/work_engine/_lib/user_global_paths.py +0 -249
  990. package/dist/agent-src/templates/scripts/work_engine/cli.py +0 -195
  991. package/dist/agent-src/templates/scripts/work_engine/cli_args.py +0 -116
  992. package/dist/agent-src/templates/scripts/work_engine/delivery_state.py +0 -137
  993. package/dist/agent-src/templates/scripts/work_engine/directives/__init__.py +0 -33
  994. package/dist/agent-src/templates/scripts/work_engine/directives/backend/__init__.py +0 -98
  995. package/dist/agent-src/templates/scripts/work_engine/directives/backend/analyze.py +0 -98
  996. package/dist/agent-src/templates/scripts/work_engine/directives/backend/implement.py +0 -145
  997. package/dist/agent-src/templates/scripts/work_engine/directives/backend/memory.py +0 -136
  998. package/dist/agent-src/templates/scripts/work_engine/directives/backend/plan.py +0 -175
  999. package/dist/agent-src/templates/scripts/work_engine/directives/backend/refine.py +0 -396
  1000. package/dist/agent-src/templates/scripts/work_engine/directives/backend/report.py +0 -227
  1001. package/dist/agent-src/templates/scripts/work_engine/directives/backend/test.py +0 -180
  1002. package/dist/agent-src/templates/scripts/work_engine/directives/backend/verify.py +0 -170
  1003. package/dist/agent-src/templates/scripts/work_engine/directives/mixed/__init__.py +0 -116
  1004. package/dist/agent-src/templates/scripts/work_engine/directives/mixed/contract.py +0 -254
  1005. package/dist/agent-src/templates/scripts/work_engine/directives/mixed/stitch.py +0 -229
  1006. package/dist/agent-src/templates/scripts/work_engine/directives/mixed/ui.py +0 -231
  1007. package/dist/agent-src/templates/scripts/work_engine/directives/ui/__init__.py +0 -113
  1008. package/dist/agent-src/templates/scripts/work_engine/directives/ui/_passthrough.py +0 -44
  1009. package/dist/agent-src/templates/scripts/work_engine/directives/ui/apply.py +0 -241
  1010. package/dist/agent-src/templates/scripts/work_engine/directives/ui/audit.py +0 -414
  1011. package/dist/agent-src/templates/scripts/work_engine/directives/ui/design.py +0 -335
  1012. package/dist/agent-src/templates/scripts/work_engine/directives/ui/polish.py +0 -513
  1013. package/dist/agent-src/templates/scripts/work_engine/directives/ui/review.py +0 -471
  1014. package/dist/agent-src/templates/scripts/work_engine/directives/ui_trivial/__init__.py +0 -119
  1015. package/dist/agent-src/templates/scripts/work_engine/directives/ui_trivial/_skipped.py +0 -37
  1016. package/dist/agent-src/templates/scripts/work_engine/directives/ui_trivial/apply.py +0 -165
  1017. package/dist/agent-src/templates/scripts/work_engine/directives/ui_trivial/refine.py +0 -66
  1018. package/dist/agent-src/templates/scripts/work_engine/directives/ui_trivial/report.py +0 -62
  1019. package/dist/agent-src/templates/scripts/work_engine/directives/ui_trivial/test.py +0 -115
  1020. package/dist/agent-src/templates/scripts/work_engine/dispatcher.py +0 -331
  1021. package/dist/agent-src/templates/scripts/work_engine/emitters.py +0 -68
  1022. package/dist/agent-src/templates/scripts/work_engine/errors.py +0 -19
  1023. package/dist/agent-src/templates/scripts/work_engine/hook_bootstrap.py +0 -91
  1024. package/dist/agent-src/templates/scripts/work_engine/hooks/__init__.py +0 -54
  1025. package/dist/agent-src/templates/scripts/work_engine/hooks/builtin/__init__.py +0 -35
  1026. package/dist/agent-src/templates/scripts/work_engine/hooks/builtin/_chat_history_base.py +0 -59
  1027. package/dist/agent-src/templates/scripts/work_engine/hooks/builtin/chat_history_append.py +0 -43
  1028. package/dist/agent-src/templates/scripts/work_engine/hooks/builtin/chat_history_halt_append.py +0 -41
  1029. package/dist/agent-src/templates/scripts/work_engine/hooks/builtin/decision_gate.py +0 -162
  1030. package/dist/agent-src/templates/scripts/work_engine/hooks/builtin/decision_trace.py +0 -163
  1031. package/dist/agent-src/templates/scripts/work_engine/hooks/builtin/directive_set_guard.py +0 -53
  1032. package/dist/agent-src/templates/scripts/work_engine/hooks/builtin/halt_surface_audit.py +0 -50
  1033. package/dist/agent-src/templates/scripts/work_engine/hooks/builtin/memory_visibility.py +0 -141
  1034. package/dist/agent-src/templates/scripts/work_engine/hooks/builtin/state_shape_validation.py +0 -52
  1035. package/dist/agent-src/templates/scripts/work_engine/hooks/builtin/trace.py +0 -84
  1036. package/dist/agent-src/templates/scripts/work_engine/hooks/context.py +0 -66
  1037. package/dist/agent-src/templates/scripts/work_engine/hooks/events.py +0 -44
  1038. package/dist/agent-src/templates/scripts/work_engine/hooks/exceptions.py +0 -79
  1039. package/dist/agent-src/templates/scripts/work_engine/hooks/registry.py +0 -60
  1040. package/dist/agent-src/templates/scripts/work_engine/hooks/runner.py +0 -73
  1041. package/dist/agent-src/templates/scripts/work_engine/hooks/settings.py +0 -196
  1042. package/dist/agent-src/templates/scripts/work_engine/input_builders.py +0 -163
  1043. package/dist/agent-src/templates/scripts/work_engine/intent/__init__.py +0 -47
  1044. package/dist/agent-src/templates/scripts/work_engine/intent/classify.py +0 -280
  1045. package/dist/agent-src/templates/scripts/work_engine/migration/__init__.py +0 -8
  1046. package/dist/agent-src/templates/scripts/work_engine/migration/v0_to_v1.py +0 -231
  1047. package/dist/agent-src/templates/scripts/work_engine/orchestration.py +0 -193
  1048. package/dist/agent-src/templates/scripts/work_engine/persona_policy.py +0 -85
  1049. package/dist/agent-src/templates/scripts/work_engine/resolvers/__init__.py +0 -22
  1050. package/dist/agent-src/templates/scripts/work_engine/resolvers/diff.py +0 -106
  1051. package/dist/agent-src/templates/scripts/work_engine/resolvers/file.py +0 -113
  1052. package/dist/agent-src/templates/scripts/work_engine/resolvers/prompt.py +0 -90
  1053. package/dist/agent-src/templates/scripts/work_engine/scoring/__init__.py +0 -14
  1054. package/dist/agent-src/templates/scripts/work_engine/scoring/confidence.py +0 -300
  1055. package/dist/agent-src/templates/scripts/work_engine/scoring/decision_engine.py +0 -351
  1056. package/dist/agent-src/templates/scripts/work_engine/scoring/decision_trace.py +0 -141
  1057. package/dist/agent-src/templates/scripts/work_engine/scoring/memory_visibility.py +0 -283
  1058. package/dist/agent-src/templates/scripts/work_engine/stack/__init__.py +0 -31
  1059. package/dist/agent-src/templates/scripts/work_engine/stack/detect.py +0 -187
  1060. package/dist/agent-src/templates/scripts/work_engine/stack/runner.py +0 -481
  1061. package/dist/agent-src/templates/scripts/work_engine/state.py +0 -694
  1062. package/dist/agent-src/templates/scripts/work_engine/state_io.py +0 -202
  1063. package/dist/cli/python/resolvePython.js +0 -38
  1064. package/dist/cli/python/resolvePython.js.map +0 -1
  1065. package/src/scripts/__pycache__/validate_frontmatter.cpython-312.pyc +0 -0
  1066. package/src/scripts/_archive/_backfill_skill_domains.py +0 -140
  1067. package/src/scripts/_archive/_bootstrap_tier_frontmatter.py +0 -151
  1068. package/src/scripts/_archive/_p43_bodies.py +0 -235
  1069. package/src/scripts/_archive/_p43_condense.py +0 -118
  1070. package/src/scripts/_archive/_p4_migrate.py +0 -199
  1071. package/src/scripts/_archive/_phase2_shim_helper.py +0 -109
  1072. package/src/scripts/_archive/_pilot_council_question.py +0 -57
  1073. package/src/scripts/_cli/__init__.py +0 -0
  1074. package/src/scripts/_cli/cmd_doctor.py +0 -1669
  1075. package/src/scripts/_cli/cmd_explain.py +0 -355
  1076. package/src/scripts/_cli/cmd_export.py +0 -157
  1077. package/src/scripts/_cli/cmd_migrate.py +0 -524
  1078. package/src/scripts/_cli/cmd_prune.py +0 -322
  1079. package/src/scripts/_cli/cmd_refresh.py +0 -179
  1080. package/src/scripts/_cli/cmd_settings_check.py +0 -171
  1081. package/src/scripts/_cli/cmd_settings_migrate.py +0 -147
  1082. package/src/scripts/_cli/cmd_sync.py +0 -166
  1083. package/src/scripts/_cli/cmd_uninstall.py +0 -476
  1084. package/src/scripts/_cli/cmd_update.py +0 -279
  1085. package/src/scripts/_cli/cmd_upgrade.py +0 -172
  1086. package/src/scripts/_cli/cmd_validate.py +0 -177
  1087. package/src/scripts/_cli/cmd_versions.py +0 -160
  1088. package/src/scripts/_cli/explain_last/__init__.py +0 -122
  1089. package/src/scripts/_cli/explain_last/assumptions.py +0 -59
  1090. package/src/scripts/_cli/explain_last/council.py +0 -105
  1091. package/src/scripts/_cli/explain_last/halt.py +0 -44
  1092. package/src/scripts/_cli/explain_last/inputs.py +0 -128
  1093. package/src/scripts/_cli/explain_last/memory.py +0 -94
  1094. package/src/scripts/_cli/explain_last/provider.py +0 -52
  1095. package/src/scripts/_cli/explain_last/render.py +0 -52
  1096. package/src/scripts/_cli/explain_last/route.py +0 -59
  1097. package/src/scripts/_cli/explain_last/scrubber.py +0 -105
  1098. package/src/scripts/_cli/explain_last/sections/__init__.py +0 -35
  1099. package/src/scripts/_cli/explain_last/sections/assumptions.py +0 -21
  1100. package/src/scripts/_cli/explain_last/sections/council.py +0 -27
  1101. package/src/scripts/_cli/explain_last/sections/halt.py +0 -31
  1102. package/src/scripts/_cli/explain_last/sections/header.py +0 -24
  1103. package/src/scripts/_cli/explain_last/sections/inputs.py +0 -27
  1104. package/src/scripts/_cli/explain_last/sections/memory.py +0 -21
  1105. package/src/scripts/_cli/explain_last/sections/pack.py +0 -16
  1106. package/src/scripts/_cli/explain_last/sections/provider.py +0 -26
  1107. package/src/scripts/_cli/explain_last/sections/route.py +0 -22
  1108. package/src/scripts/_cli/explain_last/state_loader.py +0 -76
  1109. package/src/scripts/_emit_domain_table.py +0 -35
  1110. package/src/scripts/_lib/__init__.py +0 -5
  1111. package/src/scripts/_lib/__pycache__/__init__.cpython-312.pyc +0 -0
  1112. package/src/scripts/_lib/__pycache__/agent_src.cpython-312.pyc +0 -0
  1113. package/src/scripts/_lib/agent_settings.py +0 -840
  1114. package/src/scripts/_lib/agent_src.py +0 -491
  1115. package/src/scripts/_lib/agents_overlay.py +0 -120
  1116. package/src/scripts/_lib/bench_ab_cache.py +0 -162
  1117. package/src/scripts/_lib/bench_ab_scoring.py +0 -209
  1118. package/src/scripts/_lib/bench_ab_scoring_v2.py +0 -227
  1119. package/src/scripts/_lib/bench_cost.py +0 -138
  1120. package/src/scripts/_lib/bench_quality.py +0 -118
  1121. package/src/scripts/_lib/bench_report.py +0 -149
  1122. package/src/scripts/_lib/bench_telegraph.py +0 -273
  1123. package/src/scripts/_lib/bench_telegraph_report.py +0 -151
  1124. package/src/scripts/_lib/changelog_eras.py +0 -330
  1125. package/src/scripts/_lib/claude_desktop_bundler.py +0 -238
  1126. package/src/scripts/_lib/cli_wrapper.py +0 -64
  1127. package/src/scripts/_lib/fs_atomic.py +0 -116
  1128. package/src/scripts/_lib/global_deploy_inventory.py +0 -312
  1129. package/src/scripts/_lib/install_regenerator.py +0 -134
  1130. package/src/scripts/_lib/installed_lock.py +0 -256
  1131. package/src/scripts/_lib/installed_tools.py +0 -381
  1132. package/src/scripts/_lib/json_pointers.py +0 -260
  1133. package/src/scripts/_lib/link_crypto.py +0 -206
  1134. package/src/scripts/_lib/linked_projects.py +0 -238
  1135. package/src/scripts/_lib/model_tier.py +0 -52
  1136. package/src/scripts/_lib/module_detection.py +0 -223
  1137. package/src/scripts/_lib/pin_resolver.py +0 -152
  1138. package/src/scripts/_lib/script_output.py +0 -144
  1139. package/src/scripts/_lib/security_lint.py +0 -228
  1140. package/src/scripts/_lib/token_count.py +0 -95
  1141. package/src/scripts/_lib/update_check.py +0 -207
  1142. package/src/scripts/_lib/user_global_paths.py +0 -249
  1143. package/src/scripts/_lib/value_ladder.py +0 -696
  1144. package/src/scripts/_lib/value_report.py +0 -455
  1145. package/src/scripts/_phase4_bucket.py +0 -210
  1146. package/src/scripts/_pilot_measure.py +0 -53
  1147. package/src/scripts/_tmp_scan_framework_leakage.py +0 -119
  1148. package/src/scripts/adoption_report.py +0 -195
  1149. package/src/scripts/adoption_snapshot.py +0 -219
  1150. package/src/scripts/adoption_status.py +0 -166
  1151. package/src/scripts/adr/regenerate_index.py +0 -79
  1152. package/src/scripts/ai-video/lib/adapter-common.sh +0 -231
  1153. package/src/scripts/ai-video/lib/adapter-contract.md +0 -329
  1154. package/src/scripts/ai-video/lib/fixtures/comfyui/result.json +0 -1
  1155. package/src/scripts/ai-video/lib/fixtures/fal/result.json +0 -1
  1156. package/src/scripts/ai-video/lib/fixtures/gemini-veo/result.json +0 -1
  1157. package/src/scripts/ai-video/lib/fixtures/higgsfield/result.json +0 -1
  1158. package/src/scripts/ai-video/lib/fixtures/kling/result.json +0 -1
  1159. package/src/scripts/ai-video/lib/fixtures/musetalk/result.json +0 -1
  1160. package/src/scripts/ai-video/lib/fixtures/openai-images/result.json +0 -1
  1161. package/src/scripts/ai-video/lib/fixtures/replicate/result.json +0 -1
  1162. package/src/scripts/ai-video/lib/fixtures/sora/result.json +0 -1
  1163. package/src/scripts/ai-video/lib/fixtures/syncso/result.json +0 -1
  1164. package/src/scripts/ai-video/lib/load-config.sh +0 -180
  1165. package/src/scripts/ai-video/lib/redact.sh +0 -85
  1166. package/src/scripts/ai_council/__init__.py +0 -40
  1167. package/src/scripts/ai_council/_default_prices.py +0 -50
  1168. package/src/scripts/ai_council/advisors.py +0 -148
  1169. package/src/scripts/ai_council/airgap.py +0 -165
  1170. package/src/scripts/ai_council/budget_guard.py +0 -202
  1171. package/src/scripts/ai_council/bundler.py +0 -263
  1172. package/src/scripts/ai_council/cli_hints.py +0 -123
  1173. package/src/scripts/ai_council/clients.py +0 -1385
  1174. package/src/scripts/ai_council/compile_corpus.py +0 -179
  1175. package/src/scripts/ai_council/confidence_gate.py +0 -156
  1176. package/src/scripts/ai_council/config.py +0 -1419
  1177. package/src/scripts/ai_council/consensus.py +0 -329
  1178. package/src/scripts/ai_council/events_log.py +0 -141
  1179. package/src/scripts/ai_council/learn_low_impact_preview.py +0 -252
  1180. package/src/scripts/ai_council/low_impact.py +0 -714
  1181. package/src/scripts/ai_council/low_impact_corpus.py +0 -466
  1182. package/src/scripts/ai_council/low_impact_intake.py +0 -163
  1183. package/src/scripts/ai_council/modes.py +0 -131
  1184. package/src/scripts/ai_council/necessity.py +0 -782
  1185. package/src/scripts/ai_council/one_off_archive/2026-05/_one_off_2a4_acceptance.py +0 -208
  1186. package/src/scripts/ai_council/one_off_archive/2026-05/_one_off_add_quiet.py +0 -149
  1187. package/src/scripts/ai_council/one_off_archive/2026-05/_one_off_budget_v2_audit.py +0 -206
  1188. package/src/scripts/ai_council/one_off_archive/2026-05/_one_off_context_layer_v1_estimate.py +0 -67
  1189. package/src/scripts/ai_council/one_off_archive/2026-05/_one_off_context_layer_v1_review.py +0 -292
  1190. package/src/scripts/ai_council/one_off_archive/2026-05/_one_off_followups_review.py +0 -259
  1191. package/src/scripts/ai_council/one_off_archive/2026-05/_one_off_inject_quiet_flag.py +0 -33
  1192. package/src/scripts/ai_council/one_off_archive/2026-05/_one_off_measure_v2.sh +0 -36
  1193. package/src/scripts/ai_council/one_off_archive/2026-05/_one_off_measure_verbosity.sh +0 -26
  1194. package/src/scripts/ai_council/one_off_archive/2026-05/_one_off_nondestructive_inline_audit.py +0 -209
  1195. package/src/scripts/ai_council/one_off_archive/2026-05/_one_off_per_task.sh +0 -41
  1196. package/src/scripts/ai_council/one_off_archive/2026-05/_one_off_phase4_dispatch_latency.py +0 -108
  1197. package/src/scripts/ai_council/one_off_archive/2026-05/_one_off_phase6_trigger_jaccard.py +0 -92
  1198. package/src/scripts/ai_council/one_off_archive/2026-05/_one_off_phase_2a_budget_rebalance.py +0 -257
  1199. package/src/scripts/ai_council/one_off_archive/2026-05/_one_off_phase_2a_post_revert.py +0 -197
  1200. package/src/scripts/ai_council/one_off_archive/2026-05/_one_off_rebalancing_audit.py +0 -149
  1201. package/src/scripts/ai_council/one_off_archive/2026-05/_one_off_roundtrip.py +0 -111
  1202. package/src/scripts/ai_council/one_off_archive/2026-05/_one_off_rule_hardening_v1.py +0 -251
  1203. package/src/scripts/ai_council/one_off_archive/2026-05/_one_off_silent_taskfiles.py +0 -98
  1204. package/src/scripts/ai_council/one_off_archive/2026-05/_one_off_structural_open_questions.py +0 -232
  1205. package/src/scripts/ai_council/one_off_archive/2026-05/_one_off_structural_optimization.py +0 -144
  1206. package/src/scripts/ai_council/one_off_archive/2026-05/_one_off_structural_v3_gaps.py +0 -252
  1207. package/src/scripts/ai_council/one_off_archive/2026-05/_one_off_structural_v3_review.py +0 -240
  1208. package/src/scripts/ai_council/one_off_archive/2026-05/_one_off_tier_retrofit.py +0 -180
  1209. package/src/scripts/ai_council/orchestrator.py +0 -1206
  1210. package/src/scripts/ai_council/pricing.py +0 -215
  1211. package/src/scripts/ai_council/probation_gate.py +0 -152
  1212. package/src/scripts/ai_council/project_context.py +0 -159
  1213. package/src/scripts/ai_council/prompts.py +0 -567
  1214. package/src/scripts/ai_council/redact_low_impact_entry.py +0 -155
  1215. package/src/scripts/ai_council/replay.py +0 -155
  1216. package/src/scripts/ai_council/session.py +0 -366
  1217. package/src/scripts/ai_council/shadow_dispatch.py +0 -235
  1218. package/src/scripts/ai_council/solo_dispatch.py +0 -226
  1219. package/src/scripts/annotate_discovery.py +0 -149
  1220. package/src/scripts/apply_modules_config.py +0 -290
  1221. package/src/scripts/audit_adr_coverage.py +0 -173
  1222. package/src/scripts/audit_auto_rules.py +0 -175
  1223. package/src/scripts/audit_cloud_compatibility.py +0 -362
  1224. package/src/scripts/audit_command_surface.py +0 -682
  1225. package/src/scripts/audit_initial_context.py +0 -237
  1226. package/src/scripts/audit_likelihood.py +0 -148
  1227. package/src/scripts/audit_mcp_tools.py +0 -146
  1228. package/src/scripts/audit_overlap.py +0 -145
  1229. package/src/scripts/audit_skill_descriptions.py +0 -180
  1230. package/src/scripts/audit_skill_overlap.py +0 -207
  1231. package/src/scripts/audit_user_type_axis.py +0 -140
  1232. package/src/scripts/backfill_model_tier.py +0 -184
  1233. package/src/scripts/bench_ab_cache_dispatch.py +0 -68
  1234. package/src/scripts/bench_ab_clone.py +0 -220
  1235. package/src/scripts/bench_ab_diff.py +0 -220
  1236. package/src/scripts/bench_ab_integrity.py +0 -143
  1237. package/src/scripts/bench_ab_run.py +0 -235
  1238. package/src/scripts/bench_ab_task_runner.py +0 -814
  1239. package/src/scripts/bench_ab_tracka_run.py +0 -202
  1240. package/src/scripts/bench_ab_v2_run.py +0 -247
  1241. package/src/scripts/bench_ab_v2_stats.py +0 -347
  1242. package/src/scripts/bench_baseline_ready.py +0 -108
  1243. package/src/scripts/bench_condense_memory.py +0 -168
  1244. package/src/scripts/bench_drift_check.py +0 -151
  1245. package/src/scripts/bench_per_tool.py +0 -216
  1246. package/src/scripts/bench_rtk_savings.py +0 -320
  1247. package/src/scripts/bench_run.py +0 -272
  1248. package/src/scripts/bench_runner.py +0 -158
  1249. package/src/scripts/build_cloud_bundle.py +0 -458
  1250. package/src/scripts/build_discovery_manifest.py +0 -757
  1251. package/src/scripts/build_linear_digest.py +0 -260
  1252. package/src/scripts/build_mcp_registry_manifest.py +0 -181
  1253. package/src/scripts/build_rule_trigger_matrix.py +0 -350
  1254. package/src/scripts/capture_showcase_session.py +0 -361
  1255. package/src/scripts/chat_history.py +0 -1799
  1256. package/src/scripts/check_always_budget.py +0 -532
  1257. package/src/scripts/check_artefact_checksums.py +0 -111
  1258. package/src/scripts/check_augment_description_cap.py +0 -79
  1259. package/src/scripts/check_augmentignore.py +0 -72
  1260. package/src/scripts/check_beta_review_markers.py +0 -127
  1261. package/src/scripts/check_bite_sized_granularity.py +0 -98
  1262. package/src/scripts/check_cluster_patterns.py +0 -206
  1263. package/src/scripts/check_command_count_messaging.py +0 -152
  1264. package/src/scripts/check_condensation.py +0 -375
  1265. package/src/scripts/check_condensed_paths.py +0 -231
  1266. package/src/scripts/check_context_paths.py +0 -202
  1267. package/src/scripts/check_council_layout.py +0 -125
  1268. package/src/scripts/check_council_references.py +0 -228
  1269. package/src/scripts/check_discovery_determinism.py +0 -70
  1270. package/src/scripts/check_gate_paths.py +0 -128
  1271. package/src/scripts/check_iron_law_prominence.py +0 -145
  1272. package/src/scripts/check_kernel_rule_bundle.py +0 -151
  1273. package/src/scripts/check_md_language.py +0 -161
  1274. package/src/scripts/check_memory.py +0 -429
  1275. package/src/scripts/check_memory_proposal.py +0 -182
  1276. package/src/scripts/check_module_management_neutral.py +0 -147
  1277. package/src/scripts/check_no_external_sources.py +0 -101
  1278. package/src/scripts/check_no_local_settings_committed.py +0 -51
  1279. package/src/scripts/check_no_new_legacy_path.py +0 -100
  1280. package/src/scripts/check_no_roadmap_refs.py +0 -155
  1281. package/src/scripts/check_one_off_location.py +0 -81
  1282. package/src/scripts/check_overlay_cascade_subdirs.py +0 -129
  1283. package/src/scripts/check_portability.py +0 -574
  1284. package/src/scripts/check_proposal.py +0 -269
  1285. package/src/scripts/check_public_catalog_links.py +0 -125
  1286. package/src/scripts/check_public_links.py +0 -185
  1287. package/src/scripts/check_references.py +0 -559
  1288. package/src/scripts/check_release_includes_discovery.py +0 -61
  1289. package/src/scripts/check_release_pr_shape.py +0 -123
  1290. package/src/scripts/check_release_published.py +0 -145
  1291. package/src/scripts/check_release_trunk_sync.py +0 -152
  1292. package/src/scripts/check_reply_consistency.py +0 -169
  1293. package/src/scripts/check_roadmap_trackable.py +0 -114
  1294. package/src/scripts/check_role_doc_links.py +0 -110
  1295. package/src/scripts/check_safety_floor_untouched.py +0 -125
  1296. package/src/scripts/check_skill_requires.py +0 -147
  1297. package/src/scripts/check_template_pin_drift.py +0 -129
  1298. package/src/scripts/check_test_coverage_diff.py +0 -180
  1299. package/src/scripts/check_token_optimizer_freshness.py +0 -146
  1300. package/src/scripts/check_update_banner.py +0 -86
  1301. package/src/scripts/ci_status.py +0 -301
  1302. package/src/scripts/ci_summary.py +0 -131
  1303. package/src/scripts/ci_time_ratio.py +0 -168
  1304. package/src/scripts/command_suggester/__init__.py +0 -51
  1305. package/src/scripts/command_suggester/cooldown.py +0 -132
  1306. package/src/scripts/command_suggester/loader.py +0 -73
  1307. package/src/scripts/command_suggester/match.py +0 -180
  1308. package/src/scripts/command_suggester/rank.py +0 -120
  1309. package/src/scripts/command_suggester/render.py +0 -86
  1310. package/src/scripts/command_suggester/sanitize.py +0 -113
  1311. package/src/scripts/command_suggester/settings.py +0 -127
  1312. package/src/scripts/command_suggester/types.py +0 -78
  1313. package/src/scripts/compile_router.py +0 -232
  1314. package/src/scripts/condense.py +0 -1919
  1315. package/src/scripts/condense_memory.py +0 -178
  1316. package/src/scripts/config/__init__.py +0 -9
  1317. package/src/scripts/config/packs.py +0 -157
  1318. package/src/scripts/config/presets.py +0 -224
  1319. package/src/scripts/config/profile_explain.py +0 -89
  1320. package/src/scripts/config/profiles.py +0 -191
  1321. package/src/scripts/config/session_profiles.py +0 -542
  1322. package/src/scripts/context_hygiene_hook.py +0 -181
  1323. package/src/scripts/cost_by_conversation.py +0 -78
  1324. package/src/scripts/cost_summary.py +0 -97
  1325. package/src/scripts/council_cli.py +0 -2571
  1326. package/src/scripts/council_prune.py +0 -81
  1327. package/src/scripts/cross_repo_retrieve.py +0 -172
  1328. package/src/scripts/discovery_stats.py +0 -70
  1329. package/src/scripts/extract_audit_patterns.py +0 -202
  1330. package/src/scripts/first_run_gate_hook.py +0 -179
  1331. package/src/scripts/gen_discovery_baseline.py +0 -127
  1332. package/src/scripts/generate_catalog.py +0 -116
  1333. package/src/scripts/generate_command_flows.py +0 -191
  1334. package/src/scripts/generate_index.py +0 -303
  1335. package/src/scripts/generate_ownership_matrix.py +0 -378
  1336. package/src/scripts/generate_pack_manifests.py +0 -340
  1337. package/src/scripts/hooks/__init__.py +0 -1
  1338. package/src/scripts/hooks/dispatch_hook.py +0 -461
  1339. package/src/scripts/hooks/dispatch_issues.py +0 -136
  1340. package/src/scripts/hooks/envelope.py +0 -98
  1341. package/src/scripts/hooks/replay_hook.py +0 -144
  1342. package/src/scripts/hooks/state_io.py +0 -145
  1343. package/src/scripts/hooks_doctor.py +0 -223
  1344. package/src/scripts/hooks_status.py +0 -157
  1345. package/src/scripts/injection_scan_hook.py +0 -145
  1346. package/src/scripts/install.py +0 -5258
  1347. package/src/scripts/inventory_abstraction_budget.py +0 -622
  1348. package/src/scripts/inventory_frontmatter.py +0 -164
  1349. package/src/scripts/inventory_meta_layers.py +0 -288
  1350. package/src/scripts/iron_law_sha.py +0 -107
  1351. package/src/scripts/linked_projects_list.py +0 -91
  1352. package/src/scripts/lint_agent_security.py +0 -112
  1353. package/src/scripts/lint_agent_skill_names.py +0 -150
  1354. package/src/scripts/lint_agents_layout.py +0 -197
  1355. package/src/scripts/lint_agents_md.py +0 -210
  1356. package/src/scripts/lint_archived_skills.py +0 -159
  1357. package/src/scripts/lint_artefact_frontmatter.py +0 -188
  1358. package/src/scripts/lint_bench_ab.py +0 -173
  1359. package/src/scripts/lint_bench_corpus.py +0 -255
  1360. package/src/scripts/lint_command_flow_coverage.py +0 -132
  1361. package/src/scripts/lint_command_routing.py +0 -160
  1362. package/src/scripts/lint_command_tiers.py +0 -216
  1363. package/src/scripts/lint_command_verbs.py +0 -206
  1364. package/src/scripts/lint_commit_subjects.py +0 -139
  1365. package/src/scripts/lint_context_spine_usage.py +0 -137
  1366. package/src/scripts/lint_discovery_manifest.py +0 -176
  1367. package/src/scripts/lint_discovery_vocabulary.py +0 -222
  1368. package/src/scripts/lint_empty_roadmaps.py +0 -80
  1369. package/src/scripts/lint_examples.py +0 -102
  1370. package/src/scripts/lint_explain_trace.py +0 -80
  1371. package/src/scripts/lint_featured_skills.py +0 -144
  1372. package/src/scripts/lint_flows.py +0 -215
  1373. package/src/scripts/lint_framework_leakage.py +0 -375
  1374. package/src/scripts/lint_frontmatter_boilerplate.py +0 -77
  1375. package/src/scripts/lint_ghostwriter_source.py +0 -242
  1376. package/src/scripts/lint_global_paths.py +0 -148
  1377. package/src/scripts/lint_handoffs.py +0 -217
  1378. package/src/scripts/lint_hidden_unicode.py +0 -132
  1379. package/src/scripts/lint_hook_concern_budget.py +0 -207
  1380. package/src/scripts/lint_hook_manifest.py +0 -217
  1381. package/src/scripts/lint_instruction_smuggling.py +0 -107
  1382. package/src/scripts/lint_load_context.py +0 -196
  1383. package/src/scripts/lint_marketplace.py +0 -180
  1384. package/src/scripts/lint_marketplace_install_completeness.py +0 -198
  1385. package/src/scripts/lint_mcp_config_security.py +0 -124
  1386. package/src/scripts/lint_mcp_registry_manifest.py +0 -69
  1387. package/src/scripts/lint_media_policy_linkage.py +0 -140
  1388. package/src/scripts/lint_model_tier_coverage.py +0 -73
  1389. package/src/scripts/lint_namespace.py +0 -135
  1390. package/src/scripts/lint_namespace_collisions.py +0 -103
  1391. package/src/scripts/lint_new_skill_gate.py +0 -144
  1392. package/src/scripts/lint_no_new_atomic_commands.py +0 -180
  1393. package/src/scripts/lint_one_off_age.py +0 -184
  1394. package/src/scripts/lint_orchestration_dsl.py +0 -217
  1395. package/src/scripts/lint_orchestrator_auto_detect.py +0 -111
  1396. package/src/scripts/lint_pack_boundaries.py +0 -147
  1397. package/src/scripts/lint_pack_dependencies.py +0 -137
  1398. package/src/scripts/lint_pack_first_win.py +0 -121
  1399. package/src/scripts/lint_persona_governance.py +0 -164
  1400. package/src/scripts/lint_positioning.py +0 -143
  1401. package/src/scripts/lint_profile_overlay_set_only.py +0 -179
  1402. package/src/scripts/lint_readme_jargon.py +0 -131
  1403. package/src/scripts/lint_readme_size.py +0 -33
  1404. package/src/scripts/lint_regression.py +0 -251
  1405. package/src/scripts/lint_roadmap_ci_steps.py +0 -186
  1406. package/src/scripts/lint_roadmap_complexity.py +0 -220
  1407. package/src/scripts/lint_role_experiences.py +0 -255
  1408. package/src/scripts/lint_rule_interactions.py +0 -170
  1409. package/src/scripts/lint_rule_tiers.py +0 -90
  1410. package/src/scripts/lint_showcase_sessions.py +0 -148
  1411. package/src/scripts/lint_skill_frontmatter_safety.py +0 -144
  1412. package/src/scripts/lint_skill_tools.py +0 -168
  1413. package/src/scripts/lint_topics_yaml.py +0 -89
  1414. package/src/scripts/lint_trust_coherence.py +0 -212
  1415. package/src/scripts/lint_value_dashboard.py +0 -218
  1416. package/src/scripts/lint_workspace_boundary.py +0 -122
  1417. package/src/scripts/mcp_parity_smoke.py +0 -316
  1418. package/src/scripts/mcp_render.py +0 -173
  1419. package/src/scripts/mcp_server/__init__.py +0 -19
  1420. package/src/scripts/mcp_server/__main__.py +0 -12
  1421. package/src/scripts/mcp_server/catalog.py +0 -125
  1422. package/src/scripts/mcp_server/metadata.py +0 -75
  1423. package/src/scripts/mcp_server/prompts.py +0 -442
  1424. package/src/scripts/mcp_server/requirements.txt +0 -4
  1425. package/src/scripts/mcp_server/resources.py +0 -201
  1426. package/src/scripts/mcp_server/server.py +0 -270
  1427. package/src/scripts/mcp_server/telemetry.py +0 -128
  1428. package/src/scripts/mcp_server/tools.py +0 -926
  1429. package/src/scripts/mcp_telemetry_health.py +0 -214
  1430. package/src/scripts/mcp_telemetry_query.py +0 -203
  1431. package/src/scripts/mcp_telemetry_store.py +0 -211
  1432. package/src/scripts/measure_augment_budget.py +0 -214
  1433. package/src/scripts/measure_density.py +0 -232
  1434. package/src/scripts/measure_frugality_savings.py +0 -164
  1435. package/src/scripts/measure_markitdown_lift.py +0 -127
  1436. package/src/scripts/measure_patterns.py +0 -376
  1437. package/src/scripts/measure_projection_bytes.py +0 -159
  1438. package/src/scripts/measure_rule_budget.py +0 -347
  1439. package/src/scripts/measure_skill_reduction.py +0 -102
  1440. package/src/scripts/memory_hash.py +0 -75
  1441. package/src/scripts/memory_lookup.py +0 -436
  1442. package/src/scripts/memory_report.py +0 -314
  1443. package/src/scripts/memory_signal.py +0 -165
  1444. package/src/scripts/memory_status.py +0 -76
  1445. package/src/scripts/migrate_command_suggestions.py +0 -151
  1446. package/src/scripts/migrate_frontmatter_defaults.py +0 -245
  1447. package/src/scripts/mine_session.py +0 -356
  1448. package/src/scripts/minimal_safe_diff_hook.py +0 -245
  1449. package/src/scripts/move_artefact.py +0 -143
  1450. package/src/scripts/new_skill.py +0 -148
  1451. package/src/scripts/onboarding_gate_hook.py +0 -142
  1452. package/src/scripts/pack_mcp_content.py +0 -293
  1453. package/src/scripts/plan_physical_move.py +0 -353
  1454. package/src/scripts/prediction-pool/poisson_sim.py +0 -167
  1455. package/src/scripts/prediction-pool/pool_winsim.py +0 -236
  1456. package/src/scripts/prediction-pool/score_ev.py +0 -188
  1457. package/src/scripts/print_required_checks.py +0 -196
  1458. package/src/scripts/probe_projection_fidelity.py +0 -202
  1459. package/src/scripts/probe_skill_registration.py +0 -413
  1460. package/src/scripts/profile_staleness_hook.py +0 -69
  1461. package/src/scripts/profile_use.py +0 -164
  1462. package/src/scripts/project_thin_rules.py +0 -168
  1463. package/src/scripts/propose_modules_config.py +0 -145
  1464. package/src/scripts/prototype_lint_contradictions.py +0 -150
  1465. package/src/scripts/prove_pack_extractable.py +0 -187
  1466. package/src/scripts/readme_linter.py +0 -589
  1467. package/src/scripts/redact_hook_capture.py +0 -148
  1468. package/src/scripts/refine_ticket_detect.py +0 -646
  1469. package/src/scripts/release.py +0 -1091
  1470. package/src/scripts/render_benchmark_md.py +0 -401
  1471. package/src/scripts/render_value_md.py +0 -347
  1472. package/src/scripts/requirements-evals.txt +0 -8
  1473. package/src/scripts/roadmap_progress_hook.py +0 -274
  1474. package/src/scripts/router_telemetry.py +0 -470
  1475. package/src/scripts/run_skill_evals.py +0 -185
  1476. package/src/scripts/runtime_dispatcher.py +0 -276
  1477. package/src/scripts/runtime_handler.py +0 -148
  1478. package/src/scripts/runtime_registry.py +0 -166
  1479. package/src/scripts/score_skill_selection.py +0 -198
  1480. package/src/scripts/security_audit_config.py +0 -153
  1481. package/src/scripts/setup_eval_venv.sh +0 -58
  1482. package/src/scripts/skill_collision_clusters.py +0 -162
  1483. package/src/scripts/skill_discovery.py +0 -254
  1484. package/src/scripts/skill_linter.py +0 -3694
  1485. package/src/scripts/skill_overlap.py +0 -204
  1486. package/src/scripts/skill_preview.py +0 -179
  1487. package/src/scripts/skill_tools/__init__.py +0 -22
  1488. package/src/scripts/skill_tools/audit_persona_coverage.py +0 -147
  1489. package/src/scripts/skill_tools/audit_user_type_coverage.py +0 -148
  1490. package/src/scripts/skill_tools/run_block_d_eval.py +0 -129
  1491. package/src/scripts/skill_tools/score_skill_relevance.py +0 -169
  1492. package/src/scripts/skill_tools/suggest_skill_for_task.py +0 -113
  1493. package/src/scripts/skill_trigger_eval.py +0 -682
  1494. package/src/scripts/skill_usage_collect.py +0 -191
  1495. package/src/scripts/skill_usage_report.py +0 -162
  1496. package/src/scripts/smoke_path_resolution.py +0 -93
  1497. package/src/scripts/smoke_quickstart.py +0 -144
  1498. package/src/scripts/snapshot_agent_outputs.py +0 -144
  1499. package/src/scripts/spotcheck_thin_root.py +0 -134
  1500. package/src/scripts/sync_agent_settings.py +0 -180
  1501. package/src/scripts/sync_github_metadata.py +0 -147
  1502. package/src/scripts/sync_gitignore.py +0 -291
  1503. package/src/scripts/sync_yaml_rt.py +0 -734
  1504. package/src/scripts/telegraph_stats.py +0 -119
  1505. package/src/scripts/tool_registry.py +0 -146
  1506. package/src/scripts/tools/__init__.py +0 -1
  1507. package/src/scripts/tools/adapter_errors.py +0 -63
  1508. package/src/scripts/tools/base_adapter.py +0 -91
  1509. package/src/scripts/tools/github_adapter.py +0 -128
  1510. package/src/scripts/tools/jira_adapter.py +0 -115
  1511. package/src/scripts/trigger_coverage.py +0 -129
  1512. package/src/scripts/update_counts.py +0 -199
  1513. package/src/scripts/update_prices.py +0 -125
  1514. package/src/scripts/validate_agent_settings.py +0 -124
  1515. package/src/scripts/validate_decision_engine.py +0 -136
  1516. package/src/scripts/validate_discovery_manifest.py +0 -94
  1517. package/src/scripts/validate_frontmatter.py +0 -647
  1518. package/src/scripts/validate_pack_yaml.py +0 -179
  1519. package/src/scripts/validate_safe_paths.py +0 -118
  1520. package/src/scripts/validate_telegraph_carveouts.py +0 -129
  1521. package/src/scripts/verify_before_complete_hook.py +0 -216
  1522. package/src/scripts/verify_physical_move.py +0 -185
  1523. package/src/scripts/wrapper_freshness_hook.py +0 -86
  1524. /package/dist/agent-src/skills/design-intelligence/data/{typography.csv → font-pairings-reference.csv} +0 -0
  1525. /package/src/scripts/{ai-video → media}/lib/fixtures/allin1/analysis.json +0 -0
  1526. /package/src/scripts/{ai-video → media}/lib/fixtures/comfyui/scene-0001.mp4 +0 -0
  1527. /package/src/scripts/{ai-video → media}/lib/fixtures/fal/scene-0001.mp4 +0 -0
  1528. /package/src/scripts/{ai-video → media}/lib/fixtures/gemini-veo/scene-0001.mp4 +0 -0
  1529. /package/src/scripts/{ai-video → media}/lib/fixtures/higgsfield/scene-0001.mp4 +0 -0
  1530. /package/src/scripts/{ai-video → media}/lib/fixtures/kling/scene-0001.mp4 +0 -0
  1531. /package/src/scripts/{ai-video → media}/lib/fixtures/musetalk/lipsync-0001.mp4 +0 -0
  1532. /package/src/scripts/{ai-video → media}/lib/fixtures/openai-images/scene-0001.png +0 -0
  1533. /package/src/scripts/{ai-video → media}/lib/fixtures/replicate/scene-0001.mp4 +0 -0
  1534. /package/src/scripts/{ai-video → media}/lib/fixtures/sora/scene-0001.mp4 +0 -0
  1535. /package/src/scripts/{ai-video → media}/lib/fixtures/syncso/lipsync-0001.mp4 +0 -0
  1536. /package/src/scripts/{ai-video → media}/lib/fixtures/whisperx/transcript.json +0 -0
  1537. /package/src/scripts/{ai-video → media}/lib/telemetry.sh +0 -0
@@ -0,0 +1,1382 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * Track B — task runner for the package-impact A/B bench.
4
+ *
5
+ * TypeScript twin of `src/scripts/bench_ab_task_runner.py` (ADR-200 Python→TS
6
+ * migration, Phase 8 / Wave 8d). Mirrors the CLI contract EXACTLY: flags
7
+ * (`--variant`, `--mode`, `--timeout`), exit codes (0 ok / 1 corpus missing or
8
+ * empty), byte-identical stdout/stderr, and byte-identical written JSON + md
9
+ * reports (timing/run-id fields aside — those are inherently non-deterministic
10
+ * wall-clock values). No behaviour changes.
11
+ *
12
+ * Phase 4 Step 2 of `agents/roadmaps/road-to-package-impact-benchmark.md`.
13
+ *
14
+ * For each task in `internal/bench/corpora/ab-trackb.yaml`, in each variant:
15
+ *
16
+ * 1. Snapshot the variant clone's file tree.
17
+ * 2. Invoke the `claude` CLI with the task prompt — OR dry-run, depending
18
+ * on `--mode`.
19
+ * 3. Capture the transcript, tool-call events, wall-time, and (if available)
20
+ * token + cost counts.
21
+ * 4. Snapshot the post-run tree.
22
+ * 5. Score the task via scripts/_lib/bench_ab_scoring.ts.
23
+ *
24
+ * Modes:
25
+ *
26
+ * - `dry-run` (default) — record the would-run shell command, write a stub
27
+ * transcript naming the variant, score against the unchanged tree.
28
+ * - `live` — actually invoke the `claude` CLI with `--print` (one-shot mode)
29
+ * and the task prompt.
30
+ *
31
+ * The runner ALWAYS resets the clone to a clean state before each task and
32
+ * ALWAYS records the mode in the report header.
33
+ *
34
+ * Cross-batch dependency: `reset_clone` calls `bench_ab_clone.clone()`. Now
35
+ * that the `.ts` twin has landed, this imports `bench_ab_clone.clone()`
36
+ * directly — a single source of truth for the clone surface, no python3
37
+ * dependency.
38
+ */
39
+ import { spawnSync } from 'node:child_process';
40
+ import * as crypto from 'node:crypto';
41
+ import * as fs from 'node:fs';
42
+ import * as path from 'node:path';
43
+ import { fileURLToPath, pathToFileURL } from 'node:url';
44
+ import { parse as parseYaml } from 'yaml';
45
+
46
+ import { clone as _clone } from './bench_ab_clone.js';
47
+ import * as bench_ab_cache from './_lib/bench_ab_cache.js';
48
+ import { score_task } from './_lib/bench_ab_scoring.js';
49
+
50
+ const _HERE = fileURLToPath(import.meta.url);
51
+ // src/scripts/bench_ab_task_runner.ts → parents[2] is the repo root.
52
+ const REPO_ROOT = path.resolve(path.dirname(_HERE), '..', '..');
53
+
54
+ const CORPUS_PATH = path.join(REPO_ROOT, 'internal', 'bench', 'corpora', 'ab-trackb.yaml');
55
+ const REPORTS_DIR = path.join(REPO_ROOT, 'internal', 'bench', 'reports', 'ab');
56
+
57
+ // How far we descend into a clone when snapshotting. The fixture is shallow.
58
+ const SNAPSHOT_MAX_DEPTH = 6;
59
+
60
+ // --- Activation (proven mechanism) ---
61
+ // agent-config is a GLOBAL Claude Code plugin (enabledPlugins in ~/.claude
62
+ // settings), so plain `claude --print` already runs WITH the package. The clean
63
+ // control is `--setting-sources project,local`, which excludes the user settings
64
+ // where `enabledPlugins` lives → plugin OFF, but auth survives. Measured proof:
65
+ // plain --print = ~35.5k input tokens; --setting-sources project,local = ~11.9k
66
+ // → the ~24k delta IS the package's always-on footprint. So:
67
+ // without = `--setting-sources project,local` (plugin OFF, base model)
68
+ // with = plain `--print` (the real installed plugin = package)
69
+ // with-rdp = plain `--print` + RDP rules injected (RDP not yet in the release plugin)
70
+ // (`--bare` is NOT used — it disables auth too.)
71
+ const RDP_EXTRA_FILES: readonly string[] = [
72
+ path.join(REPO_ROOT, 'src', 'rules', 'notes-first-reasoning.md'),
73
+ path.join(REPO_ROOT, 'src', 'agent-src', 'contexts', 'execution', 'rdp-gate.md'),
74
+ ];
75
+
76
+ function _concat_rules(paths: readonly string[]): string {
77
+ const parts: string[] = [];
78
+ for (const p of paths) {
79
+ try {
80
+ parts.push(fs.readFileSync(p, 'utf-8'));
81
+ } catch {
82
+ // OSError → skip (matches Python `except OSError: continue`).
83
+ continue;
84
+ }
85
+ }
86
+ return parts.join('\n\n---\n\n');
87
+ }
88
+
89
+ /**
90
+ * Extra rules injected on top of the plugin. Only `with-rdp` injects (the RDP
91
+ * artifacts aren't in the released plugin yet); `with` uses the real plugin,
92
+ * `without` runs plugin-off.
93
+ */
94
+ export function system_prompt_for(variant: string): string | null {
95
+ if (variant === 'with-rdp') {
96
+ return _concat_rules(RDP_EXTRA_FILES.filter((p) => fs.existsSync(p)));
97
+ }
98
+ return null;
99
+ }
100
+
101
+ /** `without` excludes user settings to drop the global plugin (auth survives). */
102
+ export function setting_sources_for(variant: string): string | null {
103
+ return variant === 'without' ? 'project,local' : null;
104
+ }
105
+
106
+ export function utc_stamp(): string {
107
+ // datetime.now(timezone.utc).strftime("%Y-%m-%dT%H-%M-%SZ")
108
+ const d = new Date();
109
+ const Y = String(d.getUTCFullYear()).padStart(4, '0');
110
+ const m = String(d.getUTCMonth() + 1).padStart(2, '0');
111
+ const D = String(d.getUTCDate()).padStart(2, '0');
112
+ const H = String(d.getUTCHours()).padStart(2, '0');
113
+ const M = String(d.getUTCMinutes()).padStart(2, '0');
114
+ const S = String(d.getUTCSeconds()).padStart(2, '0');
115
+ return `${Y}-${m}-${D}T${H}-${M}-${S}Z`;
116
+ }
117
+
118
+ /**
119
+ * Return {relpath: sha256-short} for every fixture file under the clone.
120
+ *
121
+ * Skips the agent-config surface (.claude, .augment, AGENTS.md, CLAUDE.md,
122
+ * manifest) because that's the variant axis, not the task surface.
123
+ */
124
+ export function snapshot_clone(cloneRoot: string, maxDepth: number = SNAPSHOT_MAX_DEPTH): Record<string, string> {
125
+ const skipRoots = new Set(['.claude', '.augment']);
126
+ const skipFiles = new Set(['AGENTS.md', 'CLAUDE.md', '.bench-ab-manifest.json']);
127
+ const out: Record<string, string> = {};
128
+ for (const filePath of _rglobSorted(cloneRoot)) {
129
+ if (!_isFile(filePath)) {
130
+ continue;
131
+ }
132
+ const rel = path.relative(cloneRoot, filePath);
133
+ const parts = rel.split(path.sep);
134
+ if (parts.length > 0 && skipRoots.has(parts[0]!)) {
135
+ continue;
136
+ }
137
+ const relPosix = parts.join('/');
138
+ if (skipFiles.has(relPosix)) {
139
+ continue;
140
+ }
141
+ if (parts.length > maxDepth) {
142
+ continue;
143
+ }
144
+ let digest: string;
145
+ try {
146
+ const buf = fs.readFileSync(filePath);
147
+ digest = crypto.createHash('sha256').update(buf).digest('hex').slice(0, 16);
148
+ } catch {
149
+ // OSError → skip (matches Python `except OSError: continue`).
150
+ continue;
151
+ }
152
+ out[relPosix] = digest;
153
+ }
154
+ return out;
155
+ }
156
+
157
+ /** Rebuild the clone so each task starts from the same state. */
158
+ export function reset_clone(variant: string): string {
159
+ // Mirror the Python `module.clone(variant, refresh=True, quiet=True)` by
160
+ // calling the `bench_ab_clone` `.ts` twin directly — single source of truth,
161
+ // no python3. Preserve the original "cannot load helper" failure surface.
162
+ try {
163
+ return _clone(variant, { refresh: true, quiet: true });
164
+ } catch {
165
+ throw new Error('cannot load bench_ab_clone helper');
166
+ }
167
+ }
168
+
169
+ /** Resolve the claude CLI binary (env override → PATH). */
170
+ export function claude_executable(): string | null {
171
+ const override = process.env['CLAUDE_CLI'];
172
+ if (override) {
173
+ return override;
174
+ }
175
+ // Resolve to an absolute path so the subprocess (run with cwd=clone_root)
176
+ // cannot miss it on a PATH/cwd quirk — the failure that showed up as a
177
+ // spurious "claude CLI not found" on a later arm of the first full run.
178
+ return _which('claude');
179
+ }
180
+
181
+ interface TokensBreakdown {
182
+ input_tokens: number;
183
+ output_tokens: number;
184
+ cache_read_input_tokens: number;
185
+ cache_creation_input_tokens: number;
186
+ }
187
+
188
+ interface RunResult {
189
+ mode: string;
190
+ reason: string;
191
+ transcript: string;
192
+ exit_code: number | null;
193
+ wall_time_seconds: number;
194
+ tokens?: number;
195
+ /** Empty object `{}` on dry-run (key absent in Python); breakdown otherwise. */
196
+ tokens_breakdown?: TokensBreakdown | Record<string, never>;
197
+ errored?: boolean;
198
+ num_turns?: number;
199
+ subtype?: string;
200
+ }
201
+
202
+ interface RunLiveOpts {
203
+ sysprompt_file?: string | null;
204
+ setting_sources?: string | null;
205
+ max_budget?: number | null;
206
+ model?: string | null;
207
+ }
208
+
209
+ /**
210
+ * Invoke claude in print/one-shot mode against the task prompt.
211
+ *
212
+ * `setting_sources` (e.g. "project,local") drops the global plugin for the
213
+ * `without` arm while keeping auth. `sysprompt_file` injects extra rules
214
+ * (the `with-rdp` arm). `with` passes neither → the real installed plugin.
215
+ */
216
+ export function run_live(
217
+ task: Record<string, unknown>,
218
+ cloneRoot: string,
219
+ timeoutS: number,
220
+ opts: RunLiveOpts = {},
221
+ ): RunResult {
222
+ const { sysprompt_file = null, setting_sources = null, max_budget = null, model = null } = opts;
223
+ const binary = claude_executable();
224
+ if (binary === null) {
225
+ return {
226
+ mode: 'live-skipped',
227
+ reason: 'claude CLI not found; set CLAUDE_CLI or install it',
228
+ transcript: '',
229
+ exit_code: null,
230
+ wall_time_seconds: 0.0,
231
+ tokens: 0,
232
+ tokens_breakdown: {},
233
+ errored: true,
234
+ };
235
+ }
236
+ const prompt = (task['prompt'] as string) ?? '';
237
+ // --output-format json yields a `usage` block for token counts. The global
238
+ // plugin is dropped per-arm via --setting-sources (NOT --bare, which kills auth).
239
+ // bypassPermissions on EVERY arm: the clone is a throwaway fixture, and this
240
+ // equalizes file-edit capability across arms (else `without`, which excludes
241
+ // user settings, would lack edit perms and fail tasks for the wrong reason).
242
+ const cmd = ['--print', '--output-format', 'json', '--permission-mode', 'bypassPermissions'];
243
+ if (model) {
244
+ // Pin ONE model across every arm. The session default here is Opus-4.8-1M,
245
+ // whose ~$1.78 first-turn cache-creation trips any sane budget cap instantly
246
+ // and makes a full corpus run blow the account quota. Holding the model
247
+ // constant is also a validity requirement: the bench measures the package
248
+ // LIFT on a fixed host, not model-vs-model.
249
+ cmd.push('--model', model);
250
+ }
251
+ if (max_budget) {
252
+ // Caps per-task API spend so one runaway agentic loop can't exhaust the
253
+ // account quota (the failure mode that starved later arms on the first run).
254
+ cmd.push('--max-budget-usd', _pyStrNum(max_budget));
255
+ }
256
+ if (setting_sources) {
257
+ cmd.push('--setting-sources', setting_sources);
258
+ }
259
+ if (sysprompt_file !== null) {
260
+ cmd.push('--append-system-prompt-file', sysprompt_file);
261
+ }
262
+ cmd.push('--', prompt);
263
+ const started = _monotonic();
264
+ const result = spawnSync(binary, cmd, {
265
+ cwd: cloneRoot,
266
+ encoding: 'utf-8',
267
+ timeout: timeoutS * 1000,
268
+ });
269
+ const isTimeout =
270
+ (result.error && (result.error as NodeJS.ErrnoException).code === 'ETIMEDOUT') ||
271
+ (result.signal === 'SIGTERM' && Boolean(result.error));
272
+ if (isTimeout) {
273
+ return {
274
+ mode: 'live',
275
+ reason: `timeout after ${timeoutS}s`,
276
+ transcript: (result.stdout ?? '') + '\n[TIMEOUT]',
277
+ exit_code: -1,
278
+ wall_time_seconds: _pyRound(_monotonic() - started, 3),
279
+ tokens: 0,
280
+ tokens_breakdown: {},
281
+ errored: true,
282
+ };
283
+ }
284
+ const duration = _monotonic() - started;
285
+ // Parse the JSON envelope: `result` is the model text; `usage` holds tokens.
286
+ const stdout = result.stdout ?? '';
287
+ const stderr = result.stderr ?? '';
288
+ const returncode = result.status ?? -1;
289
+ let transcript: string = stdout;
290
+ let tokens = 0;
291
+ let isError = false;
292
+ let errReason = 'ok';
293
+ let numTurns = 0;
294
+ let subtype = '';
295
+ let breakdown: TokensBreakdown = {
296
+ input_tokens: 0,
297
+ output_tokens: 0,
298
+ cache_read_input_tokens: 0,
299
+ cache_creation_input_tokens: 0,
300
+ };
301
+ try {
302
+ const obj = JSON.parse(stdout) as Record<string, unknown>;
303
+ // Python: `except (json.JSONDecodeError, AttributeError, ValueError)`.
304
+ // JSON.parse of a non-object (string/number/array) parses fine but then
305
+ // `.get` calls would AttributeError in Python — guard by requiring an object.
306
+ if (obj === null || typeof obj !== 'object' || Array.isArray(obj)) {
307
+ throw new TypeError('not a JSON object');
308
+ }
309
+ isError = Boolean(obj['is_error']);
310
+ // transcript = obj.get("result") or obj.get("text") or proc.stdout
311
+ const resultText = obj['result'];
312
+ const textField = obj['text'];
313
+ transcript = _pyTruthyStr(resultText)
314
+ ? (resultText as string)
315
+ : _pyTruthyStr(textField)
316
+ ? (textField as string)
317
+ : stdout;
318
+ const usage = (_isPlainObj(obj['usage']) ? (obj['usage'] as Record<string, unknown>) : {}) as Record<
319
+ string,
320
+ unknown
321
+ >;
322
+ breakdown = {
323
+ input_tokens: _intOrZero(usage['input_tokens']),
324
+ output_tokens: _intOrZero(usage['output_tokens']),
325
+ cache_read_input_tokens: _intOrZero(usage['cache_read_input_tokens']),
326
+ cache_creation_input_tokens: _intOrZero(usage['cache_creation_input_tokens']),
327
+ };
328
+ tokens =
329
+ breakdown.input_tokens +
330
+ breakdown.output_tokens +
331
+ breakdown.cache_read_input_tokens +
332
+ breakdown.cache_creation_input_tokens;
333
+ // The top-level `usage` block is zeroed on a budget-capped / errored run
334
+ // (and unreliable even on some completions). `modelUsage` carries the
335
+ // authoritative per-model counts — sum it as the fallback so token deltas
336
+ // survive even when a task hits its cap mid-flight.
337
+ if (tokens === 0) {
338
+ const mu = (_isPlainObj(obj['modelUsage']) ? (obj['modelUsage'] as Record<string, unknown>) : {}) as Record<
339
+ string,
340
+ unknown
341
+ >;
342
+ const agg: TokensBreakdown = {
343
+ input_tokens: 0,
344
+ output_tokens: 0,
345
+ cache_read_input_tokens: 0,
346
+ cache_creation_input_tokens: 0,
347
+ };
348
+ for (const stats of Object.values(mu)) {
349
+ const s = (_isPlainObj(stats) ? (stats as Record<string, unknown>) : {}) as Record<string, unknown>;
350
+ agg.input_tokens += _intOrZero(s['inputTokens']);
351
+ agg.output_tokens += _intOrZero(s['outputTokens']);
352
+ agg.cache_read_input_tokens += _intOrZero(s['cacheReadInputTokens']);
353
+ agg.cache_creation_input_tokens += _intOrZero(s['cacheCreationInputTokens']);
354
+ }
355
+ const muTotal =
356
+ agg.input_tokens +
357
+ agg.output_tokens +
358
+ agg.cache_read_input_tokens +
359
+ agg.cache_creation_input_tokens;
360
+ if (muTotal > 0) {
361
+ breakdown = agg;
362
+ tokens = muTotal;
363
+ }
364
+ }
365
+ numTurns = _intOrZero(obj['num_turns']);
366
+ subtype = _pyStrOrEmpty(obj['subtype']);
367
+ // Surface WHY a task errored (budget cap vs. other) without leaking $.
368
+ if (isError) {
369
+ const subtypeRaw = obj['subtype'];
370
+ errReason = _pyTruthyStr(subtypeRaw) ? (subtypeRaw as string) : 'error';
371
+ }
372
+ } catch {
373
+ transcript = stdout;
374
+ }
375
+ return {
376
+ mode: 'live',
377
+ reason: isError ? errReason : returncode === 0 ? 'ok' : `exit ${returncode}`,
378
+ transcript: `${transcript}\n${stderr}`,
379
+ exit_code: returncode,
380
+ wall_time_seconds: _pyRound(duration, 3),
381
+ tokens,
382
+ tokens_breakdown: breakdown,
383
+ errored: isError || returncode !== 0,
384
+ num_turns: numTurns,
385
+ subtype,
386
+ };
387
+ }
388
+
389
+ /** Record what would have run; produce a deterministic stub transcript. */
390
+ export function run_dry(task: Record<string, unknown>, cloneRoot: string, variant: string): RunResult {
391
+ const stubTranscript =
392
+ '[bench_ab_task_runner dry-run]\n' +
393
+ `variant=${variant}\n` +
394
+ `clone=${cloneRoot}\n` +
395
+ `task_id=${_pyStr(task['id'])}\n` +
396
+ '[no claude invocation; --mode live to execute for real]\n';
397
+ return {
398
+ mode: 'dry-run',
399
+ reason: 'ok',
400
+ transcript: stubTranscript,
401
+ exit_code: 0,
402
+ wall_time_seconds: 0.0,
403
+ };
404
+ }
405
+
406
+ interface AskEvents {
407
+ asked: number;
408
+ acted_with_commit: number;
409
+ ratio: number;
410
+ /** True when ratio is an int 0 (total == 0) rather than a rounded float. */
411
+ ratioIsInt: boolean;
412
+ }
413
+
414
+ /** Crude ask-vs-act heuristic over the transcript. */
415
+ export function count_ask_events(transcript: string): AskEvents {
416
+ if (!transcript) {
417
+ return { asked: 0, acted_with_commit: 0, ratio: 0, ratioIsInt: true };
418
+ }
419
+ const lt = transcript.toLowerCase();
420
+ const askMarkers = ['should i', 'do you want', 'shall i', 'soll ich', 'möchtest du'];
421
+ const asked = askMarkers.reduce((acc, m) => acc + _countSub(lt, m), 0);
422
+ const commitMarkers = ['git commit', 'git push', 'gh pr create', 'gh pr merge'];
423
+ const acted = commitMarkers.reduce((acc, m) => acc + _countSub(lt, m), 0);
424
+ const total = asked + acted;
425
+ if (total) {
426
+ return { asked, acted_with_commit: acted, ratio: _pyRound(asked / total, 3), ratioIsInt: false };
427
+ }
428
+ return { asked, acted_with_commit: acted, ratio: 0, ratioIsInt: true };
429
+ }
430
+
431
+ const PROGRESS_PATH = path.join(REPORTS_DIR, '.progress.json');
432
+
433
+ /** Mirror live state to .progress.json for `task bench:ab:watch` (best-effort). */
434
+ function _write_progress(state: Record<string, Json>): void {
435
+ try {
436
+ fs.mkdirSync(REPORTS_DIR, { recursive: true });
437
+ fs.writeFileSync(PROGRESS_PATH, _jsonDumps(state, 2) + '\n');
438
+ } catch {
439
+ // OSError → swallow (best-effort, matches Python `except OSError: pass`).
440
+ }
441
+ }
442
+
443
+ interface ProgressStream {
444
+ write(s: string): void;
445
+ isatty?: () => boolean;
446
+ }
447
+
448
+ /**
449
+ * Live per-task progress. stdlib-only, TTY-aware, log-safe.
450
+ *
451
+ * style: auto (bar if stderr is a TTY, else one plain line per task) | bar |
452
+ * plain | none. Mirrors state to .progress.json regardless of style.
453
+ *
454
+ * Node parity note: Python uses a 1s heartbeat thread to refresh the bar mid
455
+ * task. Node is single-threaded and the work here (spawnSync) is synchronous
456
+ * and blocking, so a timer would never fire during a task anyway — the
457
+ * heartbeat is therefore a no-op here. It only affects live-TTY cosmetics, not
458
+ * any written artifact (.progress.json content is identical), so parity holds
459
+ * on every byte-compared surface.
460
+ */
461
+ export class Progress {
462
+ static readonly BAR_WIDTH = 24;
463
+
464
+ total: number;
465
+ mode: string;
466
+ stream: ProgressStream;
467
+ done = 0;
468
+ started: number;
469
+ kind: 'bar' | 'plain' | 'none';
470
+ private _cur = '';
471
+ private _task_started = 0.0;
472
+
473
+ constructor(total: number, mode: string, style = 'auto', stream?: ProgressStream) {
474
+ this.total = Math.max(total, 1);
475
+ this.mode = mode;
476
+ this.stream = stream ?? { write: (s: string): void => void process.stderr.write(s), isatty: () => process.stderr.isTTY === true };
477
+ this.started = _monotonic();
478
+ if (style === 'bar' || style === 'plain' || style === 'none') {
479
+ this.kind = style;
480
+ } else {
481
+ // auto
482
+ const isatty = this.stream.isatty ? this.stream.isatty() : false;
483
+ this.kind = isatty ? 'bar' : 'plain';
484
+ }
485
+ }
486
+
487
+ private _elapsed(since: number): string {
488
+ const s = Math.trunc(_monotonic() - since);
489
+ return s >= 60 ? `${Math.trunc(s / 60)}m${String(s % 60).padStart(2, '0')}s` : `${s}s`;
490
+ }
491
+
492
+ private _bar(): string {
493
+ const filled = Math.trunc((Progress.BAR_WIDTH * this.done) / this.total);
494
+ return '█'.repeat(filled) + '░'.repeat(Progress.BAR_WIDTH - filled);
495
+ }
496
+
497
+ private _render_bar(suffix = ''): void {
498
+ const line = `\r[${this._bar()}] ${this.done}/${this.total} · ${this._cur} · ${this._elapsed(this.started)}${suffix}`;
499
+ // Python: line.ljust(90)[:160]
500
+ this.stream.write(_ljust(line, 90).slice(0, 160));
501
+ }
502
+
503
+ start_task(variant: string, idx: number, count: number, taskId: string): void {
504
+ this._cur = `${variant} ${idx}/${count} · ${taskId}`;
505
+ this._task_started = _monotonic();
506
+ _write_progress({
507
+ mode: this.mode,
508
+ variant,
509
+ task_idx: idx,
510
+ task_count: count,
511
+ total_done: this.done,
512
+ total: this.total,
513
+ current_id: taskId,
514
+ started_at: utc_stamp(),
515
+ last_result: null,
516
+ });
517
+ if (this.kind === 'none') {
518
+ return;
519
+ }
520
+ if (this.kind === 'bar') {
521
+ this._render_bar(this.mode === 'live' ? ' · running…' : '');
522
+ // heartbeat: no-op under Node's blocking model (see class note).
523
+ } else if (this.mode === 'live') {
524
+ this.stream.write(`[${this.done + 1}/${this.total}] ▶ ${this._cur}\n`);
525
+ }
526
+ }
527
+
528
+ end_task(passed: boolean, wall: number, variant: string, taskId: string): void {
529
+ this.done += 1;
530
+ const mark = passed ? '✓' : '✗';
531
+ _write_progress({
532
+ mode: this.mode,
533
+ variant,
534
+ total_done: this.done,
535
+ total: this.total,
536
+ current_id: taskId,
537
+ updated_at: utc_stamp(),
538
+ last_result: passed ? 'pass' : 'fail',
539
+ });
540
+ if (this.kind === 'none') {
541
+ return;
542
+ }
543
+ if (this.kind === 'bar') {
544
+ this._render_bar(` · ${mark}`);
545
+ } else {
546
+ this.stream.write(`[${this.done}/${this.total}] ${mark} ${variant} · ${taskId} · ${_pyFixed(wall, 1)}s\n`);
547
+ }
548
+ }
549
+
550
+ variant_done(line: string): void {
551
+ if (this.kind === 'bar') {
552
+ this.stream.write('\n');
553
+ }
554
+ this.stream.write(line.endsWith('\n') ? line : line + '\n');
555
+ }
556
+
557
+ finish(): void {
558
+ if (this.kind === 'bar') {
559
+ this.stream.write('\n');
560
+ }
561
+ if (this.kind !== 'none') {
562
+ this.stream.write(`bench progress: ${this.done}/${this.total} tasks · total ${this._elapsed(this.started)}\n`);
563
+ }
564
+ }
565
+ }
566
+
567
+ interface ScoreResultJson {
568
+ passed: boolean;
569
+ checks: Array<{ name: string; ok: boolean; reason: string }>;
570
+ }
571
+
572
+ interface PerTaskEntry {
573
+ id: unknown;
574
+ category: unknown;
575
+ duration?: unknown;
576
+ cognitive?: unknown;
577
+ score: ScoreResultJson;
578
+ errored?: boolean;
579
+ wall_time_seconds: number;
580
+ tokens?: number;
581
+ tokens_breakdown?: TokensBreakdown | Record<string, never>;
582
+ exit_code: number | null;
583
+ mode: string;
584
+ reason: string;
585
+ ask_events: AskEvents;
586
+ }
587
+
588
+ interface BucketAgg {
589
+ passed: number;
590
+ total: number;
591
+ completed: number;
592
+ errored: number;
593
+ completion_rate: number;
594
+ completion_rate_int: boolean;
595
+ mean_wall_time: number;
596
+ mean_wall_time_int: boolean;
597
+ mean_tokens: number; // always an int (Python round(...) with no ndigits)
598
+ }
599
+
600
+ /** Python truthiness for `not e.get("errored")` — missing / falsy → done. */
601
+ function _isDone(e: PerTaskEntry): boolean {
602
+ return !_pyTruthy(e.errored);
603
+ }
604
+
605
+ function _bucketAgg(entries: PerTaskEntry[]): BucketAgg {
606
+ const done = entries.filter(_isDone);
607
+ const passed = done.filter((e) => e.score.passed).length;
608
+ const total = entries.length;
609
+ const completed = done.length;
610
+ const sumWall = done.reduce((acc, e) => acc + (e.wall_time_seconds ?? 0), 0);
611
+ const sumTokens = done.reduce((acc, e) => acc + (e.tokens ?? 0), 0);
612
+ return {
613
+ passed,
614
+ total,
615
+ completed,
616
+ errored: total - completed,
617
+ completion_rate: completed ? _pyRound(passed / completed, 4) : 0,
618
+ completion_rate_int: !completed,
619
+ mean_wall_time: completed ? _pyRound(sumWall / completed, 3) : 0,
620
+ mean_wall_time_int: !completed,
621
+ mean_tokens: completed ? _pyRoundInt(sumTokens / completed) : 0,
622
+ };
623
+ }
624
+
625
+ export function per_category_aggregate(perTask: PerTaskEntry[]): Array<[string, BucketAgg]> {
626
+ // Group preserving first-seen category order (Python dict.setdefault).
627
+ const byCat = new Map<string, PerTaskEntry[]>();
628
+ for (const entry of perTask) {
629
+ // Python: entry.get("category", "unknown") — the .get default fires only
630
+ // when the key is absent; a present value (incl. null) stays.
631
+ const key = entry.category === undefined ? 'unknown' : (entry.category as string);
632
+ if (!byCat.has(key)) {
633
+ byCat.set(key, []);
634
+ }
635
+ byCat.get(key)!.push(entry);
636
+ }
637
+ const out: Array<[string, BucketAgg]> = [];
638
+ for (const [cat, entries] of byCat) {
639
+ out.push([cat, _bucketAgg(entries)]);
640
+ }
641
+ return out;
642
+ }
643
+
644
+ /**
645
+ * Aggregate by the 2×2 (duration × cognitive) cell — the value-benchmark axis.
646
+ *
647
+ * Cell key is `"<duration>/<cognitive>"`. Missing tags fall back to "untagged"
648
+ * (Python `entry.get('duration', 'untagged')`).
649
+ */
650
+ export function per_cell_aggregate(perTask: PerTaskEntry[]): Array<[string, BucketAgg]> {
651
+ const byCell = new Map<string, PerTaskEntry[]>();
652
+ for (const entry of perTask) {
653
+ const dur = entry.duration === undefined ? 'untagged' : _pyStr(entry.duration);
654
+ const cog = entry.cognitive === undefined ? 'untagged' : _pyStr(entry.cognitive);
655
+ const cell = `${dur}/${cog}`;
656
+ if (!byCell.has(cell)) {
657
+ byCell.set(cell, []);
658
+ }
659
+ byCell.get(cell)!.push(entry);
660
+ }
661
+ const out: Array<[string, BucketAgg]> = [];
662
+ for (const [cell, entries] of byCell) {
663
+ out.push([cell, _bucketAgg(entries)]);
664
+ }
665
+ return out;
666
+ }
667
+
668
+ interface CorpusTask {
669
+ id?: unknown;
670
+ category?: unknown;
671
+ prompt?: string;
672
+ [k: string]: unknown;
673
+ }
674
+
675
+ export function write_report(
676
+ variant: string,
677
+ mode: string,
678
+ perTask: PerTaskEntry[],
679
+ duration: number,
680
+ ): string {
681
+ fs.mkdirSync(REPORTS_DIR, { recursive: true });
682
+ const cacheKey = new bench_ab_cache.CacheKey(
683
+ bench_ab_cache.hash_file(CORPUS_PATH),
684
+ bench_ab_cache.claude_cli_version(),
685
+ bench_ab_cache.target_shape_hash(),
686
+ );
687
+ const total = perTask.length;
688
+ const done = perTask.filter(_isDone);
689
+ const completed = done.length;
690
+ const errored = total - completed;
691
+ const passed = done.filter((e) => e.score.passed).length;
692
+ const perCategory = per_category_aggregate(perTask);
693
+ const perCell = per_cell_aggregate(perTask);
694
+
695
+ // Hit-rate is over COMPLETED tasks only — errored tasks excluded.
696
+ const completionRate = completed ? _pyRound(passed / completed, 4) : 0;
697
+ const completionRateInt = !completed;
698
+ const sumWall = done.reduce((acc, e) => acc + (e.wall_time_seconds ?? 0), 0);
699
+ const meanWall = completed ? _pyRound(sumWall / completed, 3) : 0;
700
+ const meanWallInt = !completed;
701
+ const sumTokens = done.reduce((acc, e) => acc + (e.tokens ?? 0), 0);
702
+ const meanTokens = completed ? _pyRoundInt(sumTokens / completed) : 0; // int
703
+ const sumRatio = done.reduce((acc, e) => acc + (e.ask_events?.ratio ?? 0), 0);
704
+ const askVsAct = completed ? _pyRound(sumRatio / completed, 3) : 0;
705
+ const askVsActInt = !completed;
706
+
707
+ const stamp = utc_stamp();
708
+
709
+ // Build the markdown using the same field values.
710
+ const md =
711
+ `# Track B · ${variant} · ${mode}\n\n` +
712
+ `- Stamp: \`${stamp}\`\n` +
713
+ `- Completion rate: **${_pyFixed(completionRate * 100, 1)}%**` +
714
+ ` (${passed}/${completed} completed; ${errored} errored of ${total})\n` +
715
+ `- Mean wall-time: ${meanWallInt ? '0' : _pyNumStr(meanWall)}s\n` +
716
+ `- Ask vs. act ratio: ${askVsActInt ? '0' : _pyNumStr(askVsAct)}\n` +
717
+ `\n## Per-category\n\n` +
718
+ perCategory
719
+ .map(
720
+ ([cat, info]) =>
721
+ `- \`${cat}\` — ${info.passed}/${info.total} ` +
722
+ `(${_pyFixed(info.completion_rate * 100, 1)}%)`,
723
+ )
724
+ .join('\n') +
725
+ '\n';
726
+
727
+ // Build the JSON payload mirroring the Python `results` + `payload` dicts.
728
+ // Field order is significant for byte-parity (Python dict insertion order).
729
+ const resultsJson: Json = {
730
+ mode,
731
+ completion_rate: completionRateInt ? 0 : new PyFloat(completionRate),
732
+ passed,
733
+ completed,
734
+ errored,
735
+ total,
736
+ per_category: _bucketJson(perCategory),
737
+ per_cell: _bucketJson(perCell),
738
+ mean_wall_time: meanWallInt ? 0 : new PyFloat(meanWall),
739
+ total_tokens: sumTokens, // int
740
+ mean_tokens: meanTokens, // int
741
+ ask_vs_act_ratio: askVsActInt ? 0 : new PyFloat(askVsAct),
742
+ per_task: perTask.map((e) => _perTaskJson(e)),
743
+ };
744
+ const payload: Json = {
745
+ schema: 'ab-bench/0.1',
746
+ stamp,
747
+ variant,
748
+ corpus: 'ab-trackb',
749
+ cache_key: cacheKey.to_dict() as unknown as Json,
750
+ duration_seconds: new PyFloat(_pyRound(duration, 3)),
751
+ results: resultsJson,
752
+ };
753
+
754
+ const jsonPath = path.join(REPORTS_DIR, `${stamp}-ab-trackb-${variant}.json`);
755
+ fs.writeFileSync(jsonPath, _jsonDumps(payload, 2) + '\n');
756
+ const mdPath = jsonPath.replace(/\.json$/, '.md');
757
+ fs.writeFileSync(mdPath, md);
758
+ return jsonPath;
759
+ }
760
+
761
+ interface RunVariantResult {
762
+ path: string;
763
+ per_task: PerTaskEntry[];
764
+ duration: number;
765
+ }
766
+
767
+ interface RunVariantOpts {
768
+ max_budget?: number | null;
769
+ model?: string | null;
770
+ progress?: Progress | null;
771
+ }
772
+
773
+ export function run_variant(
774
+ variant: string,
775
+ tasks: CorpusTask[],
776
+ mode: string,
777
+ timeoutS: number,
778
+ opts: RunVariantOpts = {},
779
+ ): RunVariantResult {
780
+ const { max_budget = null, model = null, progress = null } = opts;
781
+ const started = _monotonic();
782
+ // Build the injected rule corpus once per variant (live only).
783
+ let spFile: string | null = null;
784
+ if (mode === 'live') {
785
+ const spText = system_prompt_for(variant);
786
+ if (spText) {
787
+ fs.mkdirSync(REPORTS_DIR, { recursive: true });
788
+ spFile = path.join(REPORTS_DIR, `.sysprompt-${variant}.txt`);
789
+ fs.writeFileSync(spFile, spText, 'utf-8');
790
+ }
791
+ }
792
+ const perTask: PerTaskEntry[] = [];
793
+ tasks.forEach((task, i) => {
794
+ if (progress !== null) {
795
+ progress.start_task(variant, i + 1, tasks.length, _pyStr(task.id));
796
+ }
797
+ // Fixture-only working dir, identical for every arm — the package is NOT
798
+ // in the clone files; activation is the injected system prompt (spFile).
799
+ const cloneRoot = reset_clone('without');
800
+ const pre = snapshot_clone(cloneRoot);
801
+ let runResult: RunResult;
802
+ if (mode === 'live') {
803
+ runResult = run_live(task as Record<string, unknown>, cloneRoot, timeoutS, {
804
+ sysprompt_file: spFile,
805
+ setting_sources: setting_sources_for(variant),
806
+ max_budget,
807
+ model,
808
+ });
809
+ } else {
810
+ runResult = run_dry(task as Record<string, unknown>, cloneRoot, variant);
811
+ }
812
+ const post = snapshot_clone(cloneRoot);
813
+ const score = score_task(task as Record<string, unknown>, {
814
+ pre_snapshot: pre,
815
+ post_snapshot: post,
816
+ clone_root: cloneRoot,
817
+ transcript: runResult.transcript ?? '',
818
+ });
819
+ perTask.push({
820
+ id: task.id,
821
+ category: task.category,
822
+ duration: task['duration'],
823
+ cognitive: task['cognitive'],
824
+ score: { passed: score.passed, checks: score.checks },
825
+ // `errored` = the run did not complete on merit (rate-limit,
826
+ // budget-cap, timeout, CLI failure). Distinct from a content fail.
827
+ errored: Boolean(runResult.errored ?? false),
828
+ wall_time_seconds: runResult.wall_time_seconds ?? 0.0,
829
+ tokens: runResult.tokens ?? 0,
830
+ tokens_breakdown: runResult.tokens_breakdown ?? {},
831
+ exit_code: runResult.exit_code,
832
+ mode: runResult.mode ?? mode,
833
+ reason: runResult.reason ?? '',
834
+ ask_events: count_ask_events(runResult.transcript ?? ''),
835
+ });
836
+ if (progress !== null) {
837
+ progress.end_task(
838
+ Boolean(score.passed),
839
+ Number(runResult.wall_time_seconds ?? 0.0) || 0.0,
840
+ variant,
841
+ _pyStr(task.id),
842
+ );
843
+ }
844
+ });
845
+ const duration = _monotonic() - started;
846
+ const reportPath = write_report(variant, mode, perTask, duration);
847
+ const summary =
848
+ `bench_ab_task_runner: ${variant} (${mode}) → ` +
849
+ `${perTask.filter((e) => e.score.passed).length}/${perTask.length} ` +
850
+ `passed — ${_relPosix(reportPath, REPO_ROOT)}`;
851
+ if (progress !== null) {
852
+ progress.variant_done(summary);
853
+ } else {
854
+ process.stdout.write(summary + '\n');
855
+ }
856
+ return { path: reportPath, per_task: perTask, duration };
857
+ }
858
+
859
+ interface Args {
860
+ variant: string;
861
+ mode: string;
862
+ timeout: number;
863
+ progress: string;
864
+ limit: number;
865
+ tasks: string;
866
+ model: string;
867
+ budget: number;
868
+ }
869
+
870
+ const VARIANT_CHOICES = ['with', 'without', 'with-rdp', 'both', 'all'];
871
+ const PROGRESS_CHOICES = ['auto', 'bar', 'plain', 'none'];
872
+
873
+ function parse_args(argv: string[]): Args {
874
+ const args: Args = {
875
+ variant: 'both',
876
+ mode: 'dry-run',
877
+ timeout: 120,
878
+ progress: 'auto',
879
+ limit: 0,
880
+ tasks: '',
881
+ model: 'claude-sonnet-4-6',
882
+ budget: 2.0,
883
+ };
884
+ for (let i = 0; i < argv.length; i++) {
885
+ const a = argv[i]!;
886
+ if (a === '--variant') args.variant = _choice(argv[++i] ?? '', '--variant', VARIANT_CHOICES);
887
+ else if (a.startsWith('--variant='))
888
+ args.variant = _choice(a.slice('--variant='.length), '--variant', VARIANT_CHOICES);
889
+ else if (a === '--mode') args.mode = _choice(argv[++i] ?? '', '--mode', ['dry-run', 'live']);
890
+ else if (a.startsWith('--mode=')) args.mode = _choice(a.slice('--mode='.length), '--mode', ['dry-run', 'live']);
891
+ else if (a === '--timeout') args.timeout = _pyInt(argv[++i] ?? '', '--timeout');
892
+ else if (a.startsWith('--timeout=')) args.timeout = _pyInt(a.slice('--timeout='.length), '--timeout');
893
+ else if (a === '--progress') args.progress = _choice(argv[++i] ?? '', '--progress', PROGRESS_CHOICES);
894
+ else if (a.startsWith('--progress='))
895
+ args.progress = _choice(a.slice('--progress='.length), '--progress', PROGRESS_CHOICES);
896
+ else if (a === '--limit') args.limit = _pyInt(argv[++i] ?? '', '--limit');
897
+ else if (a.startsWith('--limit=')) args.limit = _pyInt(a.slice('--limit='.length), '--limit');
898
+ else if (a === '--tasks') args.tasks = argv[++i] ?? '';
899
+ else if (a.startsWith('--tasks=')) args.tasks = a.slice('--tasks='.length);
900
+ else if (a === '--model') args.model = argv[++i] ?? '';
901
+ else if (a.startsWith('--model=')) args.model = a.slice('--model='.length);
902
+ else if (a === '--budget') args.budget = _pyFloat(argv[++i] ?? '', '--budget');
903
+ else if (a.startsWith('--budget=')) args.budget = _pyFloat(a.slice('--budget='.length), '--budget');
904
+ else {
905
+ process.stderr.write(`bench_ab_task_runner: error: unrecognized arguments: ${a}\n`);
906
+ process.exitCode = 2;
907
+ throw new ArgExit();
908
+ }
909
+ }
910
+ return args;
911
+ }
912
+
913
+ class ArgExit extends Error {}
914
+
915
+ export function main(argv: string[] | null = null): number {
916
+ const rawArgv = argv ?? process.argv.slice(2);
917
+ const args = parse_args(rawArgv);
918
+ if (!fs.existsSync(CORPUS_PATH)) {
919
+ process.stderr.write(`bench_ab_task_runner: corpus missing at ${CORPUS_PATH}\n`);
920
+ return 1;
921
+ }
922
+ const data = (_yamlSafeLoad(fs.readFileSync(CORPUS_PATH, 'utf-8')) as { tasks?: CorpusTask[] }) ?? {};
923
+ let tasks = data.tasks ?? [];
924
+ if (tasks.length === 0) {
925
+ process.stderr.write('bench_ab_task_runner: corpus has no tasks\n');
926
+ return 1;
927
+ }
928
+ if (args.tasks.trim()) {
929
+ const wanted = args.tasks
930
+ .split(',')
931
+ .map((s) => s.trim())
932
+ .filter((s) => s.length > 0);
933
+ const byId = new Map<string, CorpusTask>();
934
+ for (const t of tasks) {
935
+ byId.set(_pyStr(t.id), t);
936
+ }
937
+ const missing = wanted.filter((w) => !byId.has(w));
938
+ if (missing.length) {
939
+ process.stderr.write(`bench_ab_task_runner: unknown task id(s): ${missing.join(', ')}\n`);
940
+ return 1;
941
+ }
942
+ tasks = wanted.map((w) => byId.get(w)!);
943
+ } else if (args.limit && args.limit > 0) {
944
+ tasks = tasks.slice(0, args.limit);
945
+ }
946
+ let variants: string[];
947
+ if (args.variant === 'both') {
948
+ variants = ['with', 'without'];
949
+ } else if (args.variant === 'all') {
950
+ variants = ['with', 'without', 'with-rdp'];
951
+ } else {
952
+ variants = [args.variant];
953
+ }
954
+ const maxBudget = args.budget && args.budget > 0 ? args.budget : null;
955
+ const model = args.model || null;
956
+ const progress = new Progress(variants.length * tasks.length, args.mode, args.progress);
957
+ for (const variant of variants) {
958
+ run_variant(variant, tasks, args.mode, args.timeout, { max_budget: maxBudget, model, progress });
959
+ }
960
+ progress.finish();
961
+ return 0;
962
+ }
963
+
964
+ // --- JSON shaping ------------------------------------------------------------
965
+
966
+ class PyFloat {
967
+ constructor(readonly value: number) {}
968
+ }
969
+
970
+ type Json = null | boolean | number | string | PyFloat | Json[] | { [k: string]: Json };
971
+
972
+ /** Serialize per-category / per-cell aggregates (same BucketAgg shape). */
973
+ function _bucketJson(buckets: Array<[string, BucketAgg]>): { [k: string]: Json } {
974
+ const out: { [k: string]: Json } = {};
975
+ for (const [key, info] of buckets) {
976
+ out[key] = {
977
+ passed: info.passed,
978
+ total: info.total,
979
+ completed: info.completed,
980
+ errored: info.errored,
981
+ completion_rate: info.completion_rate_int ? 0 : new PyFloat(info.completion_rate),
982
+ mean_wall_time: info.mean_wall_time_int ? 0 : new PyFloat(info.mean_wall_time),
983
+ mean_tokens: info.mean_tokens, // int
984
+ };
985
+ }
986
+ return out;
987
+ }
988
+
989
+ /**
990
+ * Serialize a per_task entry. Python's `write_report` stores the `per_task`
991
+ * list verbatim (it does NOT reshape it), so the JSON carries EXACTLY the keys
992
+ * each entry dict was built with, in insertion order. `run_variant` builds the
993
+ * full 13-key shape; a caller (e.g. the golden test) may pass a reduced dict.
994
+ * Only emit keys that are present so byte-parity holds for both shapes.
995
+ */
996
+ function _perTaskJson(e: PerTaskEntry): Json {
997
+ const out: { [k: string]: Json } = {};
998
+ out['id'] = _toJson(e.id);
999
+ out['category'] = _toJson(e.category);
1000
+ if ('duration' in e) {
1001
+ out['duration'] = _toJson(e.duration);
1002
+ }
1003
+ if ('cognitive' in e) {
1004
+ out['cognitive'] = _toJson(e.cognitive);
1005
+ }
1006
+ out['score'] = {
1007
+ passed: e.score.passed,
1008
+ checks: e.score.checks.map((c) => ({ name: c.name, ok: c.ok, reason: c.reason })),
1009
+ };
1010
+ if ('errored' in e) {
1011
+ out['errored'] = _pyTruthy(e.errored);
1012
+ }
1013
+ out['wall_time_seconds'] = new PyFloat(e.wall_time_seconds);
1014
+ if ('tokens' in e) {
1015
+ out['tokens'] = e.tokens ?? 0; // int
1016
+ }
1017
+ if ('tokens_breakdown' in e) {
1018
+ out['tokens_breakdown'] = _tokensBreakdownJson(e.tokens_breakdown);
1019
+ }
1020
+ out['exit_code'] = e.exit_code === null ? null : e.exit_code;
1021
+ out['mode'] = e.mode;
1022
+ out['reason'] = e.reason;
1023
+ out['ask_events'] = {
1024
+ asked: e.ask_events.asked,
1025
+ acted_with_commit: e.ask_events.acted_with_commit,
1026
+ ratio: e.ask_events.ratioIsInt ? 0 : new PyFloat(e.ask_events.ratio),
1027
+ };
1028
+ return out;
1029
+ }
1030
+
1031
+ /** `tokens_breakdown` is `{}` (run_live skip/timeout/dry-run absent) / a 4-int map. */
1032
+ function _tokensBreakdownJson(b: TokensBreakdown | Record<string, never> | undefined): Json {
1033
+ if (b === undefined || Object.keys(b).length === 0) {
1034
+ return {};
1035
+ }
1036
+ const tb = b as TokensBreakdown;
1037
+ return {
1038
+ input_tokens: tb.input_tokens,
1039
+ output_tokens: tb.output_tokens,
1040
+ cache_read_input_tokens: tb.cache_read_input_tokens,
1041
+ cache_creation_input_tokens: tb.cache_creation_input_tokens,
1042
+ };
1043
+ }
1044
+
1045
+ function _toJson(v: unknown): Json {
1046
+ if (v === null || v === undefined) return null;
1047
+ if (typeof v === 'boolean' || typeof v === 'number' || typeof v === 'string') return v;
1048
+ return String(v);
1049
+ }
1050
+
1051
+ // --- Python helpers ----------------------------------------------------------
1052
+
1053
+ /** json.dumps(obj, indent=2) — sort_keys False, ensure_ascii True. */
1054
+ function _jsonDumps(obj: Json, indent: number): string {
1055
+ const pad = ' '.repeat(indent);
1056
+
1057
+ function enc(value: Json, depth: number): string {
1058
+ if (value === null) return 'null';
1059
+ if (value instanceof PyFloat) {
1060
+ return Number.isInteger(value.value) ? `${value.value}.0` : String(value.value);
1061
+ }
1062
+ if (typeof value === 'boolean') return value ? 'true' : 'false';
1063
+ if (typeof value === 'number') return String(value);
1064
+ if (typeof value === 'string') return encStr(value);
1065
+ if (Array.isArray(value)) {
1066
+ if (value.length === 0) return '[]';
1067
+ const inner = value.map((v) => pad.repeat(depth + 1) + enc(v, depth + 1));
1068
+ return '[\n' + inner.join(',\n') + '\n' + pad.repeat(depth) + ']';
1069
+ }
1070
+ const o = value as { [k: string]: Json };
1071
+ const keys = Object.keys(o);
1072
+ if (keys.length === 0) return '{}';
1073
+ const inner = keys.map((k) => pad.repeat(depth + 1) + encStr(k) + ': ' + enc(o[k]!, depth + 1));
1074
+ return '{\n' + inner.join(',\n') + '\n' + pad.repeat(depth) + '}';
1075
+ }
1076
+
1077
+ function encStr(s: string): string {
1078
+ let out = '"';
1079
+ for (const ch of s) {
1080
+ const cp = ch.codePointAt(0) as number;
1081
+ if (ch === '"') out += '\\"';
1082
+ else if (ch === '\\') out += '\\\\';
1083
+ else if (ch === '\n') out += '\\n';
1084
+ else if (ch === '\r') out += '\\r';
1085
+ else if (ch === '\t') out += '\\t';
1086
+ else if (ch === '\b') out += '\\b';
1087
+ else if (ch === '\f') out += '\\f';
1088
+ else if (cp < 0x20) out += '\\u' + cp.toString(16).padStart(4, '0');
1089
+ else if (cp < 0x7f) out += ch;
1090
+ else if (cp > 0xffff) {
1091
+ const v = cp - 0x10000;
1092
+ const hi = 0xd800 + (v >> 10);
1093
+ const lo = 0xdc00 + (v & 0x3ff);
1094
+ out += '\\u' + hi.toString(16).padStart(4, '0');
1095
+ out += '\\u' + lo.toString(16).padStart(4, '0');
1096
+ } else {
1097
+ out += '\\u' + cp.toString(16).padStart(4, '0');
1098
+ }
1099
+ }
1100
+ return out + '"';
1101
+ }
1102
+
1103
+ return enc(obj, 0);
1104
+ }
1105
+
1106
+ /**
1107
+ * Python `round(value, ndigits)` — round-half-to-even on the EXACT IEEE-754
1108
+ * value (matches CPython, which rounds the true decimal expansion, not a naive
1109
+ * `value * 10**n`). E.g. `round(0.333/2, 3)` → 0.167 (the stored double is
1110
+ * 0.16650…091, strictly above half), where naive half-even gives 0.166.
1111
+ * Returns a number whose own shortest-repr matches what Python's repr produces
1112
+ * for the rounded value (so json.dumps / str() parity holds).
1113
+ */
1114
+ function _pyRound(value: number, ndigits: number): number {
1115
+ if (!Number.isFinite(value)) return value;
1116
+ return Number(_pyFixed(value, ndigits));
1117
+ }
1118
+
1119
+ /**
1120
+ * `format(x, '.Nf')` parity with CPython: round-half-to-even on the EXACT value
1121
+ * of the IEEE-754 double, not a naive `x * 10**N` (which diverges on products
1122
+ * landing just below `.5`, e.g. `12.345 * 100` → 12.34 naive vs 12.35 CPython).
1123
+ * `toFixed(40)` yields the exact decimal expansion; BigInt half-even on that
1124
+ * string reproduces CPython byte-for-byte.
1125
+ */
1126
+ function _pyFixed(x: number, ndigits: number): string {
1127
+ if (!Number.isFinite(x)) return String(x);
1128
+ const neg = x < 0 || Object.is(x, -0);
1129
+ const abs = Math.abs(x);
1130
+ const exact = abs.toFixed(40);
1131
+ const dot = exact.indexOf('.');
1132
+ const intPart = dot === -1 ? exact : exact.slice(0, dot);
1133
+ const fracPart = dot === -1 ? '' : exact.slice(dot + 1);
1134
+ const kept = (intPart + fracPart.slice(0, ndigits).padEnd(ndigits, '0')).replace(/^0+(?=\d)/, '');
1135
+ const rest = fracPart.slice(ndigits);
1136
+ let value = BigInt(kept === '' ? '0' : kept);
1137
+ if (rest.length > 0) {
1138
+ const firstRest = rest.charCodeAt(0) - 48;
1139
+ const hasMore = /[1-9]/.test(rest.slice(1));
1140
+ if (firstRest > 5 || (firstRest === 5 && hasMore)) {
1141
+ value += 1n;
1142
+ } else if (firstRest === 5 && !hasMore) {
1143
+ if (value % 2n === 1n) {
1144
+ value += 1n;
1145
+ }
1146
+ }
1147
+ }
1148
+ let intStr = value.toString();
1149
+ let result: string;
1150
+ if (ndigits === 0) {
1151
+ result = intStr;
1152
+ } else {
1153
+ if (intStr.length <= ndigits) {
1154
+ intStr = '0'.repeat(ndigits - intStr.length + 1) + intStr;
1155
+ }
1156
+ const whole = intStr.slice(0, intStr.length - ndigits);
1157
+ const dec = intStr.slice(intStr.length - ndigits);
1158
+ result = `${whole}.${dec}`;
1159
+ }
1160
+ return neg ? `-${result}` : result;
1161
+ }
1162
+
1163
+ /** Python `round(x)` with no ndigits → nearest int, round-half-to-even. */
1164
+ function _pyRoundInt(x: number): number {
1165
+ if (!Number.isFinite(x)) return x;
1166
+ const floor = Math.floor(x);
1167
+ const frac = x - floor;
1168
+ const eps = Math.max(Math.abs(x), 1) * 2 ** -40;
1169
+ if (Math.abs(frac - 0.5) <= eps) {
1170
+ return floor % 2 === 0 ? floor : floor + 1;
1171
+ }
1172
+ return Math.round(x);
1173
+ }
1174
+
1175
+ /** Python truthiness of an arbitrary JS value (None/false/0/""/[]/{} falsy). */
1176
+ function _pyTruthy(v: unknown): boolean {
1177
+ if (v === null || v === undefined) return false;
1178
+ if (typeof v === 'boolean') return v;
1179
+ if (typeof v === 'number') return v !== 0 && !Number.isNaN(v);
1180
+ if (typeof v === 'string') return v.length > 0;
1181
+ if (Array.isArray(v)) return v.length > 0;
1182
+ if (typeof v === 'object') return Object.keys(v).length > 0;
1183
+ return Boolean(v);
1184
+ }
1185
+
1186
+ /** Python `x or fallback` guard for a string-typed value (truthy → string). */
1187
+ function _pyTruthyStr(v: unknown): boolean {
1188
+ return typeof v === 'string' && v.length > 0;
1189
+ }
1190
+
1191
+ /** Python `str(x or "")` — falsy → "", else `str(value)`. */
1192
+ function _pyStrOrEmpty(v: unknown): string {
1193
+ return _pyTruthy(v) ? _pyStr(v) : '';
1194
+ }
1195
+
1196
+ /** Python `int(x or 0)` for a usage-count field — non-int / falsy → 0. */
1197
+ function _intOrZero(v: unknown): number {
1198
+ if (typeof v === 'number' && Number.isFinite(v)) return Math.trunc(v);
1199
+ if (typeof v === 'boolean') return v ? 1 : 0;
1200
+ return 0;
1201
+ }
1202
+
1203
+ function _isPlainObj(v: unknown): boolean {
1204
+ return v !== null && typeof v === 'object' && !Array.isArray(v);
1205
+ }
1206
+
1207
+ /** Python `str(float)` for the --max-budget-usd argv value (e.g. 2.0 → "2.0"). */
1208
+ function _pyStrNum(x: number): string {
1209
+ return Number.isInteger(x) ? `${x}.0` : String(x);
1210
+ }
1211
+
1212
+ /** argparse `type=float` — accept int/float literals; on failure exit 2. */
1213
+ function _pyFloat(s: string, flag: string): number {
1214
+ const trimmed = s.trim();
1215
+ const n = Number(trimmed);
1216
+ if (trimmed === '' || Number.isNaN(n)) {
1217
+ process.stderr.write(`bench_ab_task_runner: error: argument ${flag}: invalid float value: '${s}'\n`);
1218
+ process.exitCode = 2;
1219
+ throw new ArgExit();
1220
+ }
1221
+ return n;
1222
+ }
1223
+
1224
+ /** Python str.ljust(width) — right-pad with spaces to at least `width`. */
1225
+ function _ljust(s: string, width: number): string {
1226
+ return s.length >= width ? s : s + ' '.repeat(width - s.length);
1227
+ }
1228
+
1229
+ /** Render a float the way Python `f"{x}"` / `str(x)` would (e.g. 0.0 → "0.0"). */
1230
+ function _pyNumStr(x: number): string {
1231
+ if (Number.isInteger(x)) {
1232
+ return `${x}.0`;
1233
+ }
1234
+ return String(x);
1235
+ }
1236
+
1237
+ /** Mirror Python `str(value)` for the dict-id / category JSON-coercion paths. */
1238
+ function _pyStr(v: unknown): string {
1239
+ if (v === null || v === undefined) return 'None';
1240
+ if (v === true) return 'True';
1241
+ if (v === false) return 'False';
1242
+ return String(v);
1243
+ }
1244
+
1245
+ function _countSub(haystack: string, needle: string): number {
1246
+ // str.count — non-overlapping occurrences.
1247
+ if (needle === '') return haystack.length + 1;
1248
+ let count = 0;
1249
+ let idx = 0;
1250
+ while ((idx = haystack.indexOf(needle, idx)) !== -1) {
1251
+ count += 1;
1252
+ idx += needle.length;
1253
+ }
1254
+ return count;
1255
+ }
1256
+
1257
+ function _monotonic(): number {
1258
+ // time.monotonic() — seconds, fractional. process.hrtime gives ns.
1259
+ const [s, ns] = process.hrtime();
1260
+ return s + ns / 1e9;
1261
+ }
1262
+
1263
+ function _which(cmd: string): string | null {
1264
+ const pathEnv = process.env['PATH'] || '';
1265
+ const exts =
1266
+ process.platform === 'win32'
1267
+ ? (process.env['PATHEXT'] || '.EXE;.CMD;.BAT;.COM').split(';')
1268
+ : [''];
1269
+ for (const dir of pathEnv.split(path.delimiter)) {
1270
+ if (!dir) continue;
1271
+ for (const ext of exts) {
1272
+ const candidate = path.join(dir, cmd + ext);
1273
+ try {
1274
+ fs.accessSync(candidate, fs.constants.X_OK);
1275
+ return candidate;
1276
+ } catch {
1277
+ // not here / not executable
1278
+ }
1279
+ }
1280
+ }
1281
+ return null;
1282
+ }
1283
+
1284
+ function _isFile(p: string): boolean {
1285
+ try {
1286
+ return fs.lstatSync(p).isFile();
1287
+ } catch {
1288
+ return false;
1289
+ }
1290
+ }
1291
+
1292
+ /**
1293
+ * sorted(clone_root.rglob("*")) — every entry under root, recursive, sorted by
1294
+ * full Path (component-wise lexical). rglob yields files AND dirs; the caller
1295
+ * filters with is_file. We mirror by walking and returning all paths sorted.
1296
+ */
1297
+ function _rglobSorted(root: string): string[] {
1298
+ const out: string[] = [];
1299
+ const walk = (dir: string): void => {
1300
+ let entries: fs.Dirent[];
1301
+ try {
1302
+ entries = fs.readdirSync(dir, { withFileTypes: true });
1303
+ } catch {
1304
+ return;
1305
+ }
1306
+ for (const e of entries) {
1307
+ const full = path.join(dir, e.name);
1308
+ out.push(full);
1309
+ if (e.isDirectory()) {
1310
+ walk(full);
1311
+ }
1312
+ }
1313
+ };
1314
+ walk(root);
1315
+ out.sort((a, b) => _pyPathCmp(a, b));
1316
+ return out;
1317
+ }
1318
+
1319
+ function _pyPathCmp(a: string, b: string): number {
1320
+ const pa = a.split(path.sep);
1321
+ const pb = b.split(path.sep);
1322
+ const n = Math.min(pa.length, pb.length);
1323
+ for (let i = 0; i < n; i++) {
1324
+ const c = _pyStrCmp(pa[i]!, pb[i]!);
1325
+ if (c !== 0) return c;
1326
+ }
1327
+ return pa.length - pb.length;
1328
+ }
1329
+
1330
+ function _pyStrCmp(a: string, b: string): number {
1331
+ const ca = Array.from(a);
1332
+ const cb = Array.from(b);
1333
+ const n = Math.min(ca.length, cb.length);
1334
+ for (let i = 0; i < n; i++) {
1335
+ const x = ca[i]!.codePointAt(0)!;
1336
+ const y = cb[i]!.codePointAt(0)!;
1337
+ if (x !== y) return x - y;
1338
+ }
1339
+ return ca.length - cb.length;
1340
+ }
1341
+
1342
+ function _relPosix(p: string, base: string): string {
1343
+ return path.relative(base, p).split(path.sep).join('/');
1344
+ }
1345
+
1346
+ function _choice(value: string, flag: string, choices: string[]): string {
1347
+ if (!choices.includes(value)) {
1348
+ const choicesStr = choices.map((c) => `'${c}'`).join(', ');
1349
+ process.stderr.write(
1350
+ `bench_ab_task_runner: error: argument ${flag}: invalid choice: '${value}' (choose from ${choicesStr})\n`,
1351
+ );
1352
+ process.exitCode = 2;
1353
+ throw new ArgExit();
1354
+ }
1355
+ return value;
1356
+ }
1357
+
1358
+ function _pyInt(s: string, flag: string): number {
1359
+ const trimmed = s.trim();
1360
+ if (!/^[+-]?\d+$/.test(trimmed)) {
1361
+ process.stderr.write(`bench_ab_task_runner: error: argument ${flag}: invalid int value: '${s}'\n`);
1362
+ process.exitCode = 2;
1363
+ throw new ArgExit();
1364
+ }
1365
+ return parseInt(trimmed, 10);
1366
+ }
1367
+
1368
+ function _yamlSafeLoad(s: string): unknown {
1369
+ return parseYaml(s, { version: '1.1' });
1370
+ }
1371
+
1372
+ if (import.meta.url === pathToFileURL(process.argv[1] ?? '').href) {
1373
+ try {
1374
+ process.exitCode = main();
1375
+ } catch (e) {
1376
+ if (e instanceof ArgExit) {
1377
+ process.exitCode = process.exitCode ?? 2;
1378
+ } else {
1379
+ throw e;
1380
+ }
1381
+ }
1382
+ }