@rpamis/comet 0.4.0-beta.3 → 0.4.0-beta.4

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 (508) hide show
  1. package/README.md +10 -0
  2. package/assets/manifest.json +2 -1
  3. package/assets/skills/comet/SKILL.md +25 -1
  4. package/assets/skills/comet/reference/comet-yaml-fields.md +5 -2
  5. package/assets/skills/comet/reference/context-recovery.md +10 -0
  6. package/assets/skills/comet/reference/scripts.md +47 -15
  7. package/assets/skills/comet/rules/comet-phase-guard.en.md +8 -0
  8. package/assets/skills/comet/rules/comet-phase-guard.md +9 -1
  9. package/assets/skills/comet/scripts/comet-resume-probe.mjs +3 -0
  10. package/assets/skills/comet/scripts/comet-runtime.mjs +1387 -424
  11. package/assets/skills/comet-archive/SKILL.md +24 -11
  12. package/assets/skills/comet-build/SKILL.md +42 -25
  13. package/assets/skills/comet-design/SKILL.md +1 -0
  14. package/assets/skills/comet-hotfix/SKILL.md +3 -1
  15. package/assets/skills/comet-open/SKILL.md +11 -1
  16. package/assets/skills/comet-tweak/SKILL.md +3 -1
  17. package/assets/skills/comet-verify/SKILL.md +29 -20
  18. package/assets/skills-zh/comet/SKILL.md +25 -1
  19. package/assets/skills-zh/comet/reference/comet-yaml-fields.md +5 -2
  20. package/assets/skills-zh/comet/reference/context-recovery.md +10 -0
  21. package/assets/skills-zh/comet/reference/scripts.md +47 -15
  22. package/assets/skills-zh/comet-archive/SKILL.md +24 -11
  23. package/assets/skills-zh/comet-build/SKILL.md +42 -25
  24. package/assets/skills-zh/comet-design/SKILL.md +1 -0
  25. package/assets/skills-zh/comet-hotfix/SKILL.md +3 -1
  26. package/assets/skills-zh/comet-open/SKILL.md +11 -1
  27. package/assets/skills-zh/comet-tweak/SKILL.md +3 -1
  28. package/assets/skills-zh/comet-verify/SKILL.md +30 -21
  29. package/dist/app/cli/comet-banner.d.ts +25 -0
  30. package/dist/app/cli/comet-banner.d.ts.map +1 -0
  31. package/dist/app/cli/comet-banner.js +265 -0
  32. package/dist/app/cli/comet-banner.js.map +1 -0
  33. package/dist/app/cli/index.js +36 -2
  34. package/dist/app/cli/index.js.map +1 -1
  35. package/dist/app/commands/classic.d.ts +4 -0
  36. package/dist/app/commands/classic.d.ts.map +1 -0
  37. package/dist/app/commands/classic.js +11 -0
  38. package/dist/app/commands/classic.js.map +1 -0
  39. package/dist/app/commands/doctor.d.ts.map +1 -1
  40. package/dist/app/commands/doctor.js +39 -24
  41. package/dist/app/commands/doctor.js.map +1 -1
  42. package/dist/app/commands/eval.d.ts.map +1 -1
  43. package/dist/app/commands/eval.js +57 -20
  44. package/dist/app/commands/eval.js.map +1 -1
  45. package/dist/app/commands/i18n.d.ts +1 -1
  46. package/dist/app/commands/i18n.d.ts.map +1 -1
  47. package/dist/app/commands/i18n.js +12 -4
  48. package/dist/app/commands/i18n.js.map +1 -1
  49. package/dist/app/commands/init.d.ts.map +1 -1
  50. package/dist/app/commands/init.js +16 -13
  51. package/dist/app/commands/init.js.map +1 -1
  52. package/dist/app/commands/project-scope-selection.d.ts +13 -0
  53. package/dist/app/commands/project-scope-selection.d.ts.map +1 -0
  54. package/dist/app/commands/project-scope-selection.js +33 -0
  55. package/dist/app/commands/project-scope-selection.js.map +1 -0
  56. package/dist/app/commands/resume-probe.d.ts +11 -0
  57. package/dist/app/commands/resume-probe.d.ts.map +1 -0
  58. package/dist/app/commands/resume-probe.js +63 -0
  59. package/dist/app/commands/resume-probe.js.map +1 -0
  60. package/dist/app/commands/status.d.ts +31 -0
  61. package/dist/app/commands/status.d.ts.map +1 -1
  62. package/dist/app/commands/status.js +109 -20
  63. package/dist/app/commands/status.js.map +1 -1
  64. package/dist/app/commands/uninstall.d.ts +2 -0
  65. package/dist/app/commands/uninstall.d.ts.map +1 -1
  66. package/dist/app/commands/uninstall.js +217 -40
  67. package/dist/app/commands/uninstall.js.map +1 -1
  68. package/dist/app/commands/update.d.ts +6 -0
  69. package/dist/app/commands/update.d.ts.map +1 -1
  70. package/dist/app/commands/update.js +361 -68
  71. package/dist/app/commands/update.js.map +1 -1
  72. package/dist/config/repository-layout.json +4 -2
  73. package/dist/domains/bundle/bundle-platform.d.ts.map +1 -1
  74. package/dist/domains/bundle/bundle-platform.js +3 -1
  75. package/dist/domains/bundle/bundle-platform.js.map +1 -1
  76. package/dist/domains/bundle/eval-manifest-runtime.d.ts +6 -0
  77. package/dist/domains/bundle/eval-manifest-runtime.d.ts.map +1 -0
  78. package/dist/domains/bundle/eval-manifest-runtime.js +58 -0
  79. package/dist/domains/bundle/eval-manifest-runtime.js.map +1 -0
  80. package/dist/domains/bundle/types.d.ts +1 -1
  81. package/dist/domains/bundle/types.d.ts.map +1 -1
  82. package/dist/domains/comet-classic/classic-archive.d.ts +1 -0
  83. package/dist/domains/comet-classic/classic-archive.d.ts.map +1 -1
  84. package/dist/domains/comet-classic/classic-archive.js +35 -38
  85. package/dist/domains/comet-classic/classic-archive.js.map +1 -1
  86. package/dist/domains/comet-classic/classic-cli.d.ts +1 -1
  87. package/dist/domains/comet-classic/classic-cli.d.ts.map +1 -1
  88. package/dist/domains/comet-classic/classic-cli.js +3 -0
  89. package/dist/domains/comet-classic/classic-cli.js.map +1 -1
  90. package/dist/domains/comet-classic/classic-command-checks.d.ts +20 -0
  91. package/dist/domains/comet-classic/classic-command-checks.d.ts.map +1 -0
  92. package/dist/domains/comet-classic/classic-command-checks.js +97 -0
  93. package/dist/domains/comet-classic/classic-command-checks.js.map +1 -0
  94. package/dist/domains/comet-classic/classic-current-change.d.ts +19 -0
  95. package/dist/domains/comet-classic/classic-current-change.d.ts.map +1 -0
  96. package/dist/domains/comet-classic/classic-current-change.js +132 -0
  97. package/dist/domains/comet-classic/classic-current-change.js.map +1 -0
  98. package/dist/domains/comet-classic/classic-diagnostics.d.ts +2 -1
  99. package/dist/domains/comet-classic/classic-diagnostics.d.ts.map +1 -1
  100. package/dist/domains/comet-classic/classic-diagnostics.js +54 -1
  101. package/dist/domains/comet-classic/classic-diagnostics.js.map +1 -1
  102. package/dist/domains/comet-classic/classic-evidence.d.ts.map +1 -1
  103. package/dist/domains/comet-classic/classic-evidence.js +4 -0
  104. package/dist/domains/comet-classic/classic-evidence.js.map +1 -1
  105. package/dist/domains/comet-classic/classic-guard.d.ts.map +1 -1
  106. package/dist/domains/comet-classic/classic-guard.js +68 -69
  107. package/dist/domains/comet-classic/classic-guard.js.map +1 -1
  108. package/dist/domains/comet-classic/classic-hook-guard.d.ts.map +1 -1
  109. package/dist/domains/comet-classic/classic-hook-guard.js +66 -23
  110. package/dist/domains/comet-classic/classic-hook-guard.js.map +1 -1
  111. package/dist/domains/comet-classic/classic-project-config.d.ts +16 -0
  112. package/dist/domains/comet-classic/classic-project-config.d.ts.map +1 -0
  113. package/dist/domains/comet-classic/classic-project-config.js +40 -0
  114. package/dist/domains/comet-classic/classic-project-config.js.map +1 -0
  115. package/dist/domains/comet-classic/classic-resolver.d.ts.map +1 -1
  116. package/dist/domains/comet-classic/classic-resolver.js +3 -3
  117. package/dist/domains/comet-classic/classic-resolver.js.map +1 -1
  118. package/dist/domains/comet-classic/classic-resume-probe-command.d.ts +3 -0
  119. package/dist/domains/comet-classic/classic-resume-probe-command.d.ts.map +1 -0
  120. package/dist/domains/comet-classic/classic-resume-probe-command.js +58 -0
  121. package/dist/domains/comet-classic/classic-resume-probe-command.js.map +1 -0
  122. package/dist/domains/comet-classic/classic-resume-probe-entry.d.ts +2 -0
  123. package/dist/domains/comet-classic/classic-resume-probe-entry.d.ts.map +1 -0
  124. package/dist/domains/comet-classic/classic-resume-probe-entry.js +4 -0
  125. package/dist/domains/comet-classic/classic-resume-probe-entry.js.map +1 -0
  126. package/dist/domains/comet-classic/classic-resume-probe.d.ts +29 -0
  127. package/dist/domains/comet-classic/classic-resume-probe.d.ts.map +1 -0
  128. package/dist/domains/comet-classic/classic-resume-probe.js +386 -0
  129. package/dist/domains/comet-classic/classic-resume-probe.js.map +1 -0
  130. package/dist/domains/comet-classic/classic-runtime-run.d.ts +2 -1
  131. package/dist/domains/comet-classic/classic-runtime-run.d.ts.map +1 -1
  132. package/dist/domains/comet-classic/classic-runtime-run.js +38 -0
  133. package/dist/domains/comet-classic/classic-runtime-run.js.map +1 -1
  134. package/dist/domains/comet-classic/classic-state-command.d.ts.map +1 -1
  135. package/dist/domains/comet-classic/classic-state-command.js +128 -12
  136. package/dist/domains/comet-classic/classic-state-command.js.map +1 -1
  137. package/dist/domains/comet-classic/classic-state.d.ts +3 -1
  138. package/dist/domains/comet-classic/classic-state.d.ts.map +1 -1
  139. package/dist/domains/comet-classic/classic-state.js +4 -0
  140. package/dist/domains/comet-classic/classic-state.js.map +1 -1
  141. package/dist/domains/comet-classic/classic-store.d.ts +4 -1
  142. package/dist/domains/comet-classic/classic-store.d.ts.map +1 -1
  143. package/dist/domains/comet-classic/classic-store.js +4 -3
  144. package/dist/domains/comet-classic/classic-store.js.map +1 -1
  145. package/dist/domains/comet-classic/classic-transitions.d.ts +1 -1
  146. package/dist/domains/comet-classic/classic-transitions.d.ts.map +1 -1
  147. package/dist/domains/comet-classic/classic-transitions.js +20 -1
  148. package/dist/domains/comet-classic/classic-transitions.js.map +1 -1
  149. package/dist/domains/comet-classic/classic-validate-command.d.ts.map +1 -1
  150. package/dist/domains/comet-classic/classic-validate-command.js +1 -0
  151. package/dist/domains/comet-classic/classic-validate-command.js.map +1 -1
  152. package/dist/domains/comet-classic/index.d.ts +3 -0
  153. package/dist/domains/comet-classic/index.d.ts.map +1 -1
  154. package/dist/domains/comet-classic/index.js +3 -0
  155. package/dist/domains/comet-classic/index.js.map +1 -1
  156. package/dist/domains/dashboard/collector.js +10 -2
  157. package/dist/domains/dashboard/collector.js.map +1 -1
  158. package/dist/domains/dashboard/web/assets/{index-CjU3VXVu.js → index-CIvN-PL8.js} +11 -11
  159. package/dist/domains/dashboard/web/assets/{index-BcO3_QlT.css → index-DcyRPBnT.css} +1 -1
  160. package/dist/domains/dashboard/web/index.html +2 -2
  161. package/dist/domains/engine/types.d.ts +1 -1
  162. package/dist/domains/engine/types.d.ts.map +1 -1
  163. package/dist/domains/integrations/openspec.d.ts.map +1 -1
  164. package/dist/domains/integrations/openspec.js +6 -6
  165. package/dist/domains/integrations/openspec.js.map +1 -1
  166. package/dist/domains/skill/find.d.ts.map +1 -1
  167. package/dist/domains/skill/find.js +1 -6
  168. package/dist/domains/skill/find.js.map +1 -1
  169. package/dist/domains/skill/managed-markdown.d.ts +14 -0
  170. package/dist/domains/skill/managed-markdown.d.ts.map +1 -0
  171. package/dist/domains/skill/managed-markdown.js +126 -0
  172. package/dist/domains/skill/managed-markdown.js.map +1 -0
  173. package/dist/domains/skill/platform-install.d.ts +4 -3
  174. package/dist/domains/skill/platform-install.d.ts.map +1 -1
  175. package/dist/domains/skill/platform-install.js +96 -26
  176. package/dist/domains/skill/platform-install.js.map +1 -1
  177. package/dist/domains/skill/project-instructions.d.ts +22 -0
  178. package/dist/domains/skill/project-instructions.d.ts.map +1 -0
  179. package/dist/domains/skill/project-instructions.js +61 -0
  180. package/dist/domains/skill/project-instructions.js.map +1 -0
  181. package/dist/domains/skill/uninstall.d.ts +3 -1
  182. package/dist/domains/skill/uninstall.d.ts.map +1 -1
  183. package/dist/domains/skill/uninstall.js +86 -39
  184. package/dist/domains/skill/uninstall.js.map +1 -1
  185. package/dist/platform/install/detect.d.ts +2 -1
  186. package/dist/platform/install/detect.d.ts.map +1 -1
  187. package/dist/platform/install/detect.js +10 -1
  188. package/dist/platform/install/detect.js.map +1 -1
  189. package/dist/platform/install/platforms.d.ts +5 -1
  190. package/dist/platform/install/platforms.d.ts.map +1 -1
  191. package/dist/platform/install/platforms.js +21 -4
  192. package/dist/platform/install/platforms.js.map +1 -1
  193. package/dist/platform/install/project-registry.d.ts +37 -0
  194. package/dist/platform/install/project-registry.d.ts.map +1 -0
  195. package/dist/platform/install/project-registry.js +205 -0
  196. package/dist/platform/install/project-registry.js.map +1 -0
  197. package/eval/.env +28 -0
  198. package/eval/.env.example +52 -0
  199. package/eval/CLAUDE.md +43 -0
  200. package/eval/README.md +538 -0
  201. package/eval/langsmith/.env.example +16 -0
  202. package/eval/langsmith/README.md +93 -0
  203. package/eval/langsmith/skills/README.md +5 -0
  204. package/eval/langsmith/tasks/README.md +5 -0
  205. package/eval/langsmith/tests/conftest.py +187 -0
  206. package/eval/langsmith/tests/tasks/test_tasks.py +287 -0
  207. package/eval/langsmith/treatments/README.md +5 -0
  208. package/eval/local/README.md +80 -0
  209. package/eval/local/regression_baseline.json +13 -0
  210. package/eval/local/report-style-demo-assets/quality_cost.en.svg +41 -0
  211. package/eval/local/report-style-demo-assets/quality_cost.zh.svg +41 -0
  212. package/eval/local/report-style-demo-assets/rubric_delta.en.svg +56 -0
  213. package/eval/local/report-style-demo-assets/rubric_delta.zh.svg +56 -0
  214. package/eval/local/report-style-demo-assets/task_outcomes.en.svg +46 -0
  215. package/eval/local/report-style-demo-assets/task_outcomes.zh.svg +46 -0
  216. package/eval/local/report-style-demo.html +867 -0
  217. package/eval/local/scripts/compare_baselines.py +1018 -0
  218. package/eval/local/scripts/generate_report_style_demo_charts.py +322 -0
  219. package/eval/local/scripts/regression_check.py +171 -0
  220. package/eval/local/scripts/render_readme_benchmark_figures.py +416 -0
  221. package/eval/local/scripts/rescore_rubric.py +120 -0
  222. package/eval/local/skills/benchmarks/039-release/comet-classic-039/SKILL.md +282 -0
  223. package/eval/local/skills/benchmarks/039-release/comet-classic-039/reference/auto-transition.md +27 -0
  224. package/eval/local/skills/benchmarks/039-release/comet-classic-039/reference/comet-yaml-fields.md +68 -0
  225. package/eval/local/skills/benchmarks/039-release/comet-classic-039/reference/context-recovery.md +35 -0
  226. package/eval/local/skills/benchmarks/039-release/comet-classic-039/reference/debug-gate.md +17 -0
  227. package/eval/local/skills/benchmarks/039-release/comet-classic-039/reference/decision-point.md +20 -0
  228. package/eval/local/skills/benchmarks/039-release/comet-classic-039/reference/dirty-worktree.md +59 -0
  229. package/eval/local/skills/benchmarks/039-release/comet-classic-039/reference/file-structure.md +28 -0
  230. package/eval/local/skills/benchmarks/039-release/comet-classic-039/reference/subagent-dispatch.md +113 -0
  231. package/eval/local/skills/benchmarks/039-release/comet-classic-039/rules/comet-phase-guard.md +125 -0
  232. package/eval/local/skills/benchmarks/039-release/comet-classic-039/scripts/comet-archive.sh +311 -0
  233. package/eval/local/skills/benchmarks/039-release/comet-classic-039/scripts/comet-env.sh +110 -0
  234. package/eval/local/skills/benchmarks/039-release/comet-classic-039/scripts/comet-guard.sh +778 -0
  235. package/eval/local/skills/benchmarks/039-release/comet-classic-039/scripts/comet-handoff.sh +390 -0
  236. package/eval/local/skills/benchmarks/039-release/comet-classic-039/scripts/comet-hook-guard.sh +336 -0
  237. package/eval/local/skills/benchmarks/039-release/comet-classic-039/scripts/comet-state.sh +1338 -0
  238. package/eval/local/skills/benchmarks/039-release/comet-classic-039/scripts/comet-yaml-validate.sh +225 -0
  239. package/eval/local/skills/benchmarks/039-release/comet-classic-039-archive/SKILL.md +100 -0
  240. package/eval/local/skills/benchmarks/039-release/comet-classic-039-build/SKILL.md +304 -0
  241. package/eval/local/skills/benchmarks/039-release/comet-classic-039-design/SKILL.md +263 -0
  242. package/eval/local/skills/benchmarks/039-release/comet-classic-039-hotfix/SKILL.md +204 -0
  243. package/eval/local/skills/benchmarks/039-release/comet-classic-039-open/SKILL.md +220 -0
  244. package/eval/local/skills/benchmarks/039-release/comet-classic-039-tweak/SKILL.md +180 -0
  245. package/eval/local/skills/benchmarks/039-release/comet-classic-039-verify/SKILL.md +234 -0
  246. package/eval/local/skills/benchmarks/040-beta/comet/SKILL.md +261 -0
  247. package/eval/local/skills/benchmarks/040-beta/comet/reference/auto-transition.md +27 -0
  248. package/eval/local/skills/benchmarks/040-beta/comet/reference/comet-yaml-fields.md +73 -0
  249. package/eval/local/skills/benchmarks/040-beta/comet/reference/context-recovery.md +45 -0
  250. package/eval/local/skills/benchmarks/040-beta/comet/reference/debug-gate.md +33 -0
  251. package/eval/local/skills/benchmarks/040-beta/comet/reference/decision-point.md +31 -0
  252. package/eval/local/skills/benchmarks/040-beta/comet/reference/dirty-worktree.md +59 -0
  253. package/eval/local/skills/benchmarks/040-beta/comet/reference/file-structure.md +28 -0
  254. package/eval/local/skills/benchmarks/040-beta/comet/reference/intent-frame.md +74 -0
  255. package/eval/local/skills/benchmarks/040-beta/comet/reference/scripts.md +69 -0
  256. package/eval/local/skills/benchmarks/040-beta/comet/reference/subagent-dispatch.md +169 -0
  257. package/eval/local/skills/benchmarks/040-beta/comet/rules/comet-phase-guard.md +130 -0
  258. package/eval/local/skills/benchmarks/040-beta/comet/runtime/classic/checks.yaml +6 -0
  259. package/eval/local/skills/benchmarks/040-beta/comet/runtime/classic/guardrails.yaml +13 -0
  260. package/eval/local/skills/benchmarks/040-beta/comet/runtime/classic/skill.yaml +122 -0
  261. package/eval/local/skills/benchmarks/040-beta/comet/scripts/comet-archive.mjs +9515 -0
  262. package/eval/local/skills/benchmarks/040-beta/comet/scripts/comet-env.mjs +15 -0
  263. package/eval/local/skills/benchmarks/040-beta/comet/scripts/comet-guard.mjs +10173 -0
  264. package/eval/local/skills/benchmarks/040-beta/comet/scripts/comet-handoff.mjs +9491 -0
  265. package/eval/local/skills/benchmarks/040-beta/comet/scripts/comet-hook-guard.mjs +9175 -0
  266. package/eval/local/skills/benchmarks/040-beta/comet/scripts/comet-intent.mjs +404 -0
  267. package/eval/local/skills/benchmarks/040-beta/comet/scripts/comet-state.mjs +9273 -0
  268. package/eval/local/skills/benchmarks/040-beta/comet/scripts/comet-yaml-validate.mjs +7627 -0
  269. package/eval/local/skills/benchmarks/040-beta/comet-archive/SKILL.md +110 -0
  270. package/eval/local/skills/benchmarks/040-beta/comet-build/SKILL.md +315 -0
  271. package/eval/local/skills/benchmarks/040-beta/comet-design/SKILL.md +260 -0
  272. package/eval/local/skills/benchmarks/040-beta/comet-hotfix/SKILL.md +190 -0
  273. package/eval/local/skills/benchmarks/040-beta/comet-open/SKILL.md +210 -0
  274. package/eval/local/skills/benchmarks/040-beta/comet-tweak/SKILL.md +183 -0
  275. package/eval/local/skills/benchmarks/040-beta/comet-verify/SKILL.md +230 -0
  276. package/eval/local/skills/benchmarks/dependency/claude-md/comet-workflow/CLAUDE.md +12 -0
  277. package/eval/local/skills/benchmarks/dependency/openspec/openspec-apply-change/SKILL.md +156 -0
  278. package/eval/local/skills/benchmarks/dependency/openspec/openspec-archive-change/SKILL.md +114 -0
  279. package/eval/local/skills/benchmarks/dependency/openspec/openspec-bulk-archive-change/SKILL.md +246 -0
  280. package/eval/local/skills/benchmarks/dependency/openspec/openspec-continue-change/SKILL.md +118 -0
  281. package/eval/local/skills/benchmarks/dependency/openspec/openspec-explore/SKILL.md +288 -0
  282. package/eval/local/skills/benchmarks/dependency/openspec/openspec-ff-change/SKILL.md +101 -0
  283. package/eval/local/skills/benchmarks/dependency/openspec/openspec-new-change/SKILL.md +74 -0
  284. package/eval/local/skills/benchmarks/dependency/openspec/openspec-onboard/SKILL.md +554 -0
  285. package/eval/local/skills/benchmarks/dependency/openspec/openspec-propose/SKILL.md +110 -0
  286. package/eval/local/skills/benchmarks/dependency/openspec/openspec-sync-specs/SKILL.md +138 -0
  287. package/eval/local/skills/benchmarks/dependency/openspec/openspec-verify-change/SKILL.md +168 -0
  288. package/eval/local/skills/benchmarks/dependency/superpowers/brainstorming/SKILL.md +159 -0
  289. package/eval/local/skills/benchmarks/dependency/superpowers/brainstorming/scripts/frame-template.html +213 -0
  290. package/eval/local/skills/benchmarks/dependency/superpowers/brainstorming/scripts/helper.js +167 -0
  291. package/eval/local/skills/benchmarks/dependency/superpowers/brainstorming/scripts/server.cjs +723 -0
  292. package/eval/local/skills/benchmarks/dependency/superpowers/brainstorming/scripts/start-server.sh +209 -0
  293. package/eval/local/skills/benchmarks/dependency/superpowers/brainstorming/scripts/stop-server.sh +120 -0
  294. package/eval/local/skills/benchmarks/dependency/superpowers/brainstorming/spec-document-reviewer-prompt.md +49 -0
  295. package/eval/local/skills/benchmarks/dependency/superpowers/brainstorming/visual-companion.md +291 -0
  296. package/eval/local/skills/benchmarks/dependency/superpowers/dispatching-parallel-agents/SKILL.md +185 -0
  297. package/eval/local/skills/benchmarks/dependency/superpowers/executing-plans/SKILL.md +70 -0
  298. package/eval/local/skills/benchmarks/dependency/superpowers/finishing-a-development-branch/SKILL.md +241 -0
  299. package/eval/local/skills/benchmarks/dependency/superpowers/receiving-code-review/SKILL.md +213 -0
  300. package/eval/local/skills/benchmarks/dependency/superpowers/requesting-code-review/SKILL.md +103 -0
  301. package/eval/local/skills/benchmarks/dependency/superpowers/requesting-code-review/code-reviewer.md +172 -0
  302. package/eval/local/skills/benchmarks/dependency/superpowers/subagent-driven-development/SKILL.md +418 -0
  303. package/eval/local/skills/benchmarks/dependency/superpowers/subagent-driven-development/implementer-prompt.md +139 -0
  304. package/eval/local/skills/benchmarks/dependency/superpowers/subagent-driven-development/scripts/review-package +44 -0
  305. package/eval/local/skills/benchmarks/dependency/superpowers/subagent-driven-development/scripts/sdd-workspace +22 -0
  306. package/eval/local/skills/benchmarks/dependency/superpowers/subagent-driven-development/scripts/task-brief +40 -0
  307. package/eval/local/skills/benchmarks/dependency/superpowers/subagent-driven-development/task-reviewer-prompt.md +188 -0
  308. package/eval/local/skills/benchmarks/dependency/superpowers/systematic-debugging/CREATION-LOG.md +119 -0
  309. package/eval/local/skills/benchmarks/dependency/superpowers/systematic-debugging/SKILL.md +296 -0
  310. package/eval/local/skills/benchmarks/dependency/superpowers/systematic-debugging/condition-based-waiting-example.ts +158 -0
  311. package/eval/local/skills/benchmarks/dependency/superpowers/systematic-debugging/condition-based-waiting.md +115 -0
  312. package/eval/local/skills/benchmarks/dependency/superpowers/systematic-debugging/defense-in-depth.md +122 -0
  313. package/eval/local/skills/benchmarks/dependency/superpowers/systematic-debugging/find-polluter.sh +63 -0
  314. package/eval/local/skills/benchmarks/dependency/superpowers/systematic-debugging/root-cause-tracing.md +169 -0
  315. package/eval/local/skills/benchmarks/dependency/superpowers/systematic-debugging/test-academic.md +14 -0
  316. package/eval/local/skills/benchmarks/dependency/superpowers/systematic-debugging/test-pressure-1.md +58 -0
  317. package/eval/local/skills/benchmarks/dependency/superpowers/systematic-debugging/test-pressure-2.md +68 -0
  318. package/eval/local/skills/benchmarks/dependency/superpowers/systematic-debugging/test-pressure-3.md +69 -0
  319. package/eval/local/skills/benchmarks/dependency/superpowers/test-driven-development/SKILL.md +371 -0
  320. package/eval/local/skills/benchmarks/dependency/superpowers/test-driven-development/testing-anti-patterns.md +299 -0
  321. package/eval/local/skills/benchmarks/dependency/superpowers/using-git-worktrees/SKILL.md +202 -0
  322. package/eval/local/skills/benchmarks/dependency/superpowers/verification-before-completion/SKILL.md +139 -0
  323. package/eval/local/skills/benchmarks/dependency/superpowers/writing-plans/SKILL.md +174 -0
  324. package/eval/local/skills/benchmarks/dependency/superpowers/writing-plans/plan-document-reviewer-prompt.md +49 -0
  325. package/eval/local/skills/benchmarks/dependency/superpowers/writing-skills/SKILL.md +689 -0
  326. package/eval/local/skills/benchmarks/dependency/superpowers/writing-skills/anthropic-best-practices.md +1150 -0
  327. package/eval/local/skills/benchmarks/dependency/superpowers/writing-skills/examples/CLAUDE_MD_TESTING.md +189 -0
  328. package/eval/local/skills/benchmarks/dependency/superpowers/writing-skills/graphviz-conventions.dot +172 -0
  329. package/eval/local/skills/benchmarks/dependency/superpowers/writing-skills/persuasion-principles.md +187 -0
  330. package/eval/local/skills/benchmarks/dependency/superpowers/writing-skills/render-graphs.js +168 -0
  331. package/eval/local/skills/benchmarks/dependency/superpowers/writing-skills/testing-skills-with-subagents.md +384 -0
  332. package/eval/local/tasks/authoring-skill-smoke/environment/Dockerfile +2 -0
  333. package/eval/local/tasks/authoring-skill-smoke/instruction.md +4 -0
  334. package/eval/local/tasks/authoring-skill-smoke/task.toml +21 -0
  335. package/eval/local/tasks/authoring-skill-smoke/validation/test_authoring_skill_smoke.py +54 -0
  336. package/eval/local/tasks/comet-agent-memory-routing/environment/Dockerfile +28 -0
  337. package/eval/local/tasks/comet-agent-memory-routing/environment/agent_system.py +40 -0
  338. package/eval/local/tasks/comet-agent-memory-routing/environment/test_agent_system.py +29 -0
  339. package/eval/local/tasks/comet-agent-memory-routing/instruction.md +20 -0
  340. package/eval/local/tasks/comet-agent-memory-routing/task.toml +24 -0
  341. package/eval/local/tasks/comet-agent-memory-routing/validation/test_agent_memory_routing.py +24 -0
  342. package/eval/local/tasks/comet-api-cache-ttl/environment/Dockerfile +39 -0
  343. package/eval/local/tasks/comet-api-cache-ttl/environment/cache.py +39 -0
  344. package/eval/local/tasks/comet-api-cache-ttl/environment/test_cache.py +81 -0
  345. package/eval/local/tasks/comet-api-cache-ttl/instruction.md +33 -0
  346. package/eval/local/tasks/comet-api-cache-ttl/task.toml +24 -0
  347. package/eval/local/tasks/comet-api-cache-ttl/validation/test_api_cache_ttl.py +58 -0
  348. package/eval/local/tasks/comet-cross-file-refactor/environment/Dockerfile +15 -0
  349. package/eval/local/tasks/comet-cross-file-refactor/environment/cli.py +13 -0
  350. package/eval/local/tasks/comet-cross-file-refactor/environment/counting.py +13 -0
  351. package/eval/local/tasks/comet-cross-file-refactor/environment/test_textkit.py +21 -0
  352. package/eval/local/tasks/comet-cross-file-refactor/instruction.md +16 -0
  353. package/eval/local/tasks/comet-cross-file-refactor/task.toml +20 -0
  354. package/eval/local/tasks/comet-cross-file-refactor/validation/test_cross_file_refactor.py +20 -0
  355. package/eval/local/tasks/comet-dependency-confusion/environment/Dockerfile +28 -0
  356. package/eval/local/tasks/comet-dependency-confusion/environment/app.py +8 -0
  357. package/eval/local/tasks/comet-dependency-confusion/environment/settings_loader.py +14 -0
  358. package/eval/local/tasks/comet-dependency-confusion/environment/test_settings_service.py +19 -0
  359. package/eval/local/tasks/comet-dependency-confusion/instruction.md +18 -0
  360. package/eval/local/tasks/comet-dependency-confusion/task.toml +24 -0
  361. package/eval/local/tasks/comet-dependency-confusion/validation/test_dependency_confusion.py +24 -0
  362. package/eval/local/tasks/comet-fix-median/environment/Dockerfile +50 -0
  363. package/eval/local/tasks/comet-fix-median/environment/stats.py +54 -0
  364. package/eval/local/tasks/comet-fix-median/environment/test_stats.py +68 -0
  365. package/eval/local/tasks/comet-fix-median/instruction.md +25 -0
  366. package/eval/local/tasks/comet-fix-median/task.toml +24 -0
  367. package/eval/local/tasks/comet-fix-median/validation/test_fix_median.py +60 -0
  368. package/eval/local/tasks/comet-framework-selection/environment/Dockerfile +28 -0
  369. package/eval/local/tasks/comet-framework-selection/environment/architecture.py +12 -0
  370. package/eval/local/tasks/comet-framework-selection/environment/test_architecture.py +30 -0
  371. package/eval/local/tasks/comet-framework-selection/instruction.md +22 -0
  372. package/eval/local/tasks/comet-framework-selection/task.toml +24 -0
  373. package/eval/local/tasks/comet-framework-selection/validation/test_framework_selection.py +24 -0
  374. package/eval/local/tasks/comet-full-workflow/environment/Dockerfile +53 -0
  375. package/eval/local/tasks/comet-full-workflow/environment/test_wordcount.py +29 -0
  376. package/eval/local/tasks/comet-full-workflow/environment/wordcount.py +40 -0
  377. package/eval/local/tasks/comet-full-workflow/instruction.md +18 -0
  378. package/eval/local/tasks/comet-full-workflow/task.toml +24 -0
  379. package/eval/local/tasks/comet-full-workflow/validation/test_full_workflow.py +171 -0
  380. package/eval/local/tasks/comet-graph-execution-review/environment/Dockerfile +28 -0
  381. package/eval/local/tasks/comet-graph-execution-review/environment/pipeline.py +19 -0
  382. package/eval/local/tasks/comet-graph-execution-review/environment/test_pipeline.py +53 -0
  383. package/eval/local/tasks/comet-graph-execution-review/instruction.md +21 -0
  384. package/eval/local/tasks/comet-graph-execution-review/task.toml +24 -0
  385. package/eval/local/tasks/comet-graph-execution-review/validation/test_graph_execution_review.py +24 -0
  386. package/eval/local/tasks/comet-human-approval-flow/environment/Dockerfile +15 -0
  387. package/eval/local/tasks/comet-human-approval-flow/environment/approvals.py +17 -0
  388. package/eval/local/tasks/comet-human-approval-flow/environment/test_approvals.py +30 -0
  389. package/eval/local/tasks/comet-human-approval-flow/instruction.md +15 -0
  390. package/eval/local/tasks/comet-human-approval-flow/task.toml +20 -0
  391. package/eval/local/tasks/comet-human-approval-flow/validation/test_human_approval_flow.py +20 -0
  392. package/eval/local/tasks/comet-layered-streaming-fix/environment/Dockerfile +20 -0
  393. package/eval/local/tasks/comet-layered-streaming-fix/environment/chat_app.py +19 -0
  394. package/eval/local/tasks/comet-layered-streaming-fix/environment/test_chat_app.py +15 -0
  395. package/eval/local/tasks/comet-layered-streaming-fix/instruction.md +14 -0
  396. package/eval/local/tasks/comet-layered-streaming-fix/task.toml +20 -0
  397. package/eval/local/tasks/comet-layered-streaming-fix/validation/test_layered_streaming_fix.py +20 -0
  398. package/eval/local/tasks/comet-noise-distractor/environment/Dockerfile +15 -0
  399. package/eval/local/tasks/comet-noise-distractor/environment/distractor.md +4 -0
  400. package/eval/local/tasks/comet-noise-distractor/environment/invoice.py +5 -0
  401. package/eval/local/tasks/comet-noise-distractor/environment/test_invoice.py +18 -0
  402. package/eval/local/tasks/comet-noise-distractor/instruction.md +17 -0
  403. package/eval/local/tasks/comet-noise-distractor/task.toml +20 -0
  404. package/eval/local/tasks/comet-noise-distractor/validation/test_noise_distractor.py +20 -0
  405. package/eval/local/tasks/comet-observability-env-template/environment/Dockerfile +15 -0
  406. package/eval/local/tasks/comet-observability-env-template/environment/env_writer.py +17 -0
  407. package/eval/local/tasks/comet-observability-env-template/environment/test_env_writer.py +17 -0
  408. package/eval/local/tasks/comet-observability-env-template/instruction.md +20 -0
  409. package/eval/local/tasks/comet-observability-env-template/task.toml +20 -0
  410. package/eval/local/tasks/comet-observability-env-template/validation/test_observability_env_template.py +46 -0
  411. package/eval/local/tasks/comet-perf-dedupe/environment/Dockerfile +39 -0
  412. package/eval/local/tasks/comet-perf-dedupe/environment/dedupe.py +22 -0
  413. package/eval/local/tasks/comet-perf-dedupe/environment/test_dedupe.py +43 -0
  414. package/eval/local/tasks/comet-perf-dedupe/instruction.md +25 -0
  415. package/eval/local/tasks/comet-perf-dedupe/task.toml +24 -0
  416. package/eval/local/tasks/comet-perf-dedupe/validation/test_perf_dedupe.py +40 -0
  417. package/eval/local/tasks/comet-persistence-threading/environment/Dockerfile +15 -0
  418. package/eval/local/tasks/comet-persistence-threading/environment/session_store.py +15 -0
  419. package/eval/local/tasks/comet-persistence-threading/environment/test_session_store.py +21 -0
  420. package/eval/local/tasks/comet-persistence-threading/instruction.md +14 -0
  421. package/eval/local/tasks/comet-persistence-threading/task.toml +20 -0
  422. package/eval/local/tasks/comet-persistence-threading/validation/test_persistence_threading.py +20 -0
  423. package/eval/local/tasks/comet-refactor-counter/environment/Dockerfile +39 -0
  424. package/eval/local/tasks/comet-refactor-counter/environment/test_text_processor.py +57 -0
  425. package/eval/local/tasks/comet-refactor-counter/environment/text_processor.py +49 -0
  426. package/eval/local/tasks/comet-refactor-counter/instruction.md +31 -0
  427. package/eval/local/tasks/comet-refactor-counter/task.toml +24 -0
  428. package/eval/local/tasks/comet-refactor-counter/validation/test_refactor_counter.py +75 -0
  429. package/eval/local/tasks/comet-robust-config/environment/Dockerfile +39 -0
  430. package/eval/local/tasks/comet-robust-config/environment/config_loader.py +56 -0
  431. package/eval/local/tasks/comet-robust-config/environment/test_config_loader.py +72 -0
  432. package/eval/local/tasks/comet-robust-config/instruction.md +30 -0
  433. package/eval/local/tasks/comet-robust-config/task.toml +24 -0
  434. package/eval/local/tasks/comet-robust-config/validation/test_robust_config.py +37 -0
  435. package/eval/local/tasks/generic-skill-smoke/environment/Dockerfile +2 -0
  436. package/eval/local/tasks/generic-skill-smoke/instruction.md +7 -0
  437. package/eval/local/tasks/generic-skill-smoke/task.toml +21 -0
  438. package/eval/local/tasks/generic-skill-smoke/validation/test_generic_skill_smoke.py +36 -0
  439. package/eval/local/tasks/index.yaml +155 -0
  440. package/eval/local/tasks/workflow-overlay-contract/environment/Dockerfile +5 -0
  441. package/eval/local/tasks/workflow-overlay-contract/instruction.md +5 -0
  442. package/eval/local/tasks/workflow-overlay-contract/task.toml +21 -0
  443. package/eval/local/tasks/workflow-overlay-contract/validation/test_workflow_overlay_contract.py +235 -0
  444. package/eval/local/tasks/workflow-route-conformance/environment/Dockerfile +2 -0
  445. package/eval/local/tasks/workflow-route-conformance/instruction.md +5 -0
  446. package/eval/local/tasks/workflow-route-conformance/task.toml +21 -0
  447. package/eval/local/tasks/workflow-route-conformance/validation/test_workflow_route_conformance.py +84 -0
  448. package/eval/local/tests/conftest.py +1148 -0
  449. package/eval/local/tests/scaffold/test_attribution.py +48 -0
  450. package/eval/local/tests/scaffold/test_compare_baselines.py +999 -0
  451. package/eval/local/tests/scaffold/test_conftest_helpers.py +534 -0
  452. package/eval/local/tests/scaffold/test_evidence.py +15 -0
  453. package/eval/local/tests/scaffold/test_langsmith_conftest.py +244 -0
  454. package/eval/local/tests/scaffold/test_logging.py +243 -0
  455. package/eval/local/tests/scaffold/test_manifests.py +132 -0
  456. package/eval/local/tests/scaffold/test_profiles.py +866 -0
  457. package/eval/local/tests/scaffold/test_regression_check.py +19 -0
  458. package/eval/local/tests/scaffold/test_report_style_demo_charts.py +45 -0
  459. package/eval/local/tests/scaffold/test_sample_quality.py +211 -0
  460. package/eval/local/tests/scaffold/test_tasks.py +168 -0
  461. package/eval/local/tests/scaffold/test_treatments.py +244 -0
  462. package/eval/local/tests/scaffold/test_utils.py +139 -0
  463. package/eval/local/tests/tasks/test_tasks.py +445 -0
  464. package/eval/local/tests/tasks/test_validation_scripts.py +143 -0
  465. package/eval/local/treatments/comet/comet_full_039.yaml +141 -0
  466. package/eval/local/treatments/comet/comet_full_040_beta.yaml +140 -0
  467. package/eval/local/treatments/common/control.yaml +4 -0
  468. package/eval/pyproject.toml +41 -0
  469. package/eval/report-html-config.json +6 -0
  470. package/eval/scaffold/__init__.py +67 -0
  471. package/eval/scaffold/python/__init__.py +95 -0
  472. package/eval/scaffold/python/attribution.py +43 -0
  473. package/eval/scaffold/python/evidence.py +38 -0
  474. package/eval/scaffold/python/external_data_handler.py +18 -0
  475. package/eval/scaffold/python/generic_llm_judge.py +235 -0
  476. package/eval/scaffold/python/judge_config.py +168 -0
  477. package/eval/scaffold/python/llm_judge.py +191 -0
  478. package/eval/scaffold/python/logging.py +705 -0
  479. package/eval/scaffold/python/manifests.py +129 -0
  480. package/eval/scaffold/python/paper_charts.py +25 -0
  481. package/eval/scaffold/python/pass_at_k.py +107 -0
  482. package/eval/scaffold/python/paths.py +56 -0
  483. package/eval/scaffold/python/profiles.py +127 -0
  484. package/eval/scaffold/python/report_outputs.py +1391 -0
  485. package/eval/scaffold/python/sample_quality.py +339 -0
  486. package/eval/scaffold/python/schema.py +39 -0
  487. package/eval/scaffold/python/skill_parser.py +469 -0
  488. package/eval/scaffold/python/tasks.py +330 -0
  489. package/eval/scaffold/python/treatments.py +271 -0
  490. package/eval/scaffold/python/utils.py +366 -0
  491. package/eval/scaffold/python/validation/__init__.py +21 -0
  492. package/eval/scaffold/python/validation/authoring_rubric.py +326 -0
  493. package/eval/scaffold/python/validation/comet_workflow.py +187 -0
  494. package/eval/scaffold/python/validation/core.py +264 -0
  495. package/eval/scaffold/python/validation/dataset.py +337 -0
  496. package/eval/scaffold/python/validation/docker.py +106 -0
  497. package/eval/scaffold/python/validation/evaluator.py +549 -0
  498. package/eval/scaffold/python/validation/generic_rubric.py +169 -0
  499. package/eval/scaffold/python/validation/rubric.py +740 -0
  500. package/eval/scaffold/python/validation/runner.py +237 -0
  501. package/eval/scaffold/python/validation/scripts.py +58 -0
  502. package/eval/scaffold/python/validation/tracing.py +313 -0
  503. package/eval/scaffold/shell/common.sh +126 -0
  504. package/eval/scaffold/shell/docker.sh +482 -0
  505. package/eval/scaffold/shell/run-claude-loop.sh +181 -0
  506. package/eval/scaffold/shell/setup.sh +259 -0
  507. package/eval/simulator-instruction.md +9 -0
  508. package/package.json +24 -2
@@ -0,0 +1,19 @@
1
+ """Unit tests for the eval regression gate wrapper."""
2
+
3
+ import subprocess
4
+ import sys
5
+ from pathlib import Path
6
+
7
+
8
+ def test_regression_check_help_imports_from_eval_working_directory():
9
+ eval_root = Path(__file__).resolve().parents[3]
10
+
11
+ result = subprocess.run(
12
+ [sys.executable, "local/scripts/regression_check.py", "--help"],
13
+ cwd=eval_root,
14
+ capture_output=True,
15
+ text=True,
16
+ )
17
+
18
+ assert result.returncode == 0, result.stderr
19
+ assert "--count" in result.stdout
@@ -0,0 +1,45 @@
1
+ from pathlib import Path
2
+ import re
3
+
4
+ from local.scripts.generate_report_style_demo_charts import generate_charts
5
+
6
+
7
+ def test_generate_report_style_demo_charts_writes_bilingual_svgs(tmp_path: Path):
8
+ written = generate_charts(tmp_path)
9
+
10
+ expected = {
11
+ "rubric_delta.zh.svg",
12
+ "rubric_delta.en.svg",
13
+ "quality_cost.zh.svg",
14
+ "quality_cost.en.svg",
15
+ "task_outcomes.zh.svg",
16
+ "task_outcomes.en.svg",
17
+ }
18
+ assert {path.name for path in written} == expected
19
+
20
+ zh_rubric = (tmp_path / "rubric_delta.zh.svg").read_text(encoding="utf-8")
21
+ en_rubric = (tmp_path / "rubric_delta.en.svg").read_text(encoding="utf-8")
22
+ assert "图 1. Rubric 维度相对 0.3.9 的变化" in zh_rubric
23
+ assert "Figure 1. Rubric dimension deltas relative to 0.3.9" in en_rubric
24
+ assert "Times New Roman" in zh_rubric
25
+ assert "SimSun" in zh_rubric
26
+
27
+ circle_x_values = [
28
+ float(match)
29
+ for match in re.findall(r"<circle cx=\"([0-9.]+)\" cy=\"[0-9.]+\" r=\"5.2\"", zh_rubric)
30
+ ]
31
+ assert circle_x_values
32
+ assert max(circle_x_values) < 760
33
+ assert '<text class="value" x="840"' in zh_rubric
34
+
35
+ zh_outcomes = (tmp_path / "task_outcomes.zh.svg").read_text(encoding="utf-8")
36
+ subtitle_y = int(re.search(r'<text class="subtitle" x="32" y="([0-9]+)"', zh_outcomes).group(1))
37
+ column_header_y_values = [
38
+ int(match)
39
+ for match in re.findall(
40
+ r'<text class="label" x="[0-9.]+" y="([0-9]+)" text-anchor="middle">',
41
+ zh_outcomes,
42
+ )
43
+ ]
44
+ assert column_header_y_values
45
+ assert min(column_header_y_values) - subtitle_y >= 28
@@ -0,0 +1,211 @@
1
+ """Unit tests for eval sample-quality classification."""
2
+
3
+ import json
4
+ from pathlib import Path
5
+
6
+ from scaffold.python.sample_quality import (
7
+ include_in_analysis,
8
+ infer_sample_quality,
9
+ quality_from_report,
10
+ sample_quality_dict,
11
+ )
12
+
13
+
14
+ def test_api_timeout_is_excluded_from_analysis():
15
+ quality = infer_sample_quality(
16
+ checks_failed=["Validation failed: no result"],
17
+ stdout='{"type":"assistant","message":{"content":[]}}\n',
18
+ stderr="Error: API request timed out after 600s",
19
+ returncode=1,
20
+ )
21
+
22
+ assert quality.status == "excluded"
23
+ assert quality.reason_code == "api_timeout"
24
+ assert quality.include_in_analysis is False
25
+ assert "API request timed out" in " ".join(quality.evidence)
26
+
27
+
28
+ def test_rate_limit_is_excluded_from_analysis():
29
+ quality = infer_sample_quality(stderr="429 rate_limit_error: insufficient quota")
30
+
31
+ assert quality.status == "excluded"
32
+ assert quality.reason_code == "rate_limited"
33
+ assert quality.include_in_analysis is False
34
+
35
+
36
+ def test_container_failure_is_excluded_from_analysis():
37
+ quality = infer_sample_quality(stderr="ERROR: Docker daemon not running")
38
+
39
+ assert quality.status == "excluded"
40
+ assert quality.reason_code == "container_failure"
41
+ assert quality.include_in_analysis is False
42
+
43
+
44
+ def test_completed_run_with_api_timeout_in_failed_check_stays_in_analysis():
45
+ quality = infer_sample_quality(
46
+ events={
47
+ "duration_seconds": 42,
48
+ "total_tokens": 1000,
49
+ "total_cost_usd": 0.12,
50
+ },
51
+ checks_failed=["validator failed: expected graceful API timeout handling"],
52
+ stdout=json.dumps({"type": "result", "duration_ms": 42000}) + "\n",
53
+ returncode=0,
54
+ )
55
+
56
+ assert quality.status == "flagged"
57
+ assert quality.reason_code == "completed_run_mentions_outer_failure"
58
+ assert quality.include_in_analysis is True
59
+
60
+
61
+ def test_completed_run_with_network_wording_in_failed_check_stays_in_analysis():
62
+ quality = infer_sample_quality(
63
+ events={
64
+ "duration_seconds": 42,
65
+ "total_tokens": 1000,
66
+ "total_cost_usd": 0.12,
67
+ },
68
+ checks_failed=["validator failed: summary should mention network retry guidance"],
69
+ stdout=json.dumps({"type": "result", "duration_ms": 42000}) + "\n",
70
+ returncode=0,
71
+ )
72
+
73
+ assert quality.status == "flagged"
74
+ assert quality.reason_code == "completed_run_mentions_outer_failure"
75
+ assert quality.include_in_analysis is True
76
+
77
+
78
+ def test_completed_run_with_container_wording_in_logs_stays_in_analysis():
79
+ quality = infer_sample_quality(
80
+ events={
81
+ "duration_seconds": 42,
82
+ "total_tokens": 1000,
83
+ "total_cost_usd": 0.12,
84
+ },
85
+ checks_failed=["validator failed: expected report artifact"],
86
+ stdout=json.dumps({"type": "result", "duration_ms": 42000}) + "\n",
87
+ stderr="Task output discussed why a Docker daemon not running error should be surfaced.",
88
+ returncode=0,
89
+ )
90
+
91
+ assert quality.status == "flagged"
92
+ assert quality.reason_code == "completed_run_mentions_outer_failure"
93
+ assert quality.include_in_analysis is True
94
+
95
+
96
+ def test_validator_failure_with_observable_run_is_included():
97
+ quality = infer_sample_quality(
98
+ events={
99
+ "duration_seconds": 42,
100
+ "total_tokens": 1000,
101
+ "total_cost_usd": 0.12,
102
+ "skills_invoked": ["comet"],
103
+ "artifact_references": {"report": "reports/demo.json"},
104
+ },
105
+ checks_failed=["validator failed: output file missing"],
106
+ stdout=json.dumps({"type": "result", "duration_ms": 42000}) + "\n",
107
+ returncode=0,
108
+ )
109
+
110
+ assert quality.status == "included"
111
+ assert quality.reason_code == "valid_signal"
112
+ assert quality.include_in_analysis is True
113
+
114
+
115
+ def test_harness_attribution_without_hard_noise_is_flagged():
116
+ quality = infer_sample_quality(
117
+ events={"duration_seconds": 10, "skills_invoked": []},
118
+ checks_failed=["Required skill not invoked: comet"],
119
+ failure_attribution=[
120
+ {
121
+ "bucket": "harness",
122
+ "check": "Required skill not invoked: comet",
123
+ "reason": "target Skill was never invoked",
124
+ }
125
+ ],
126
+ stdout=json.dumps({"type": "result", "duration_ms": 10000}) + "\n",
127
+ returncode=0,
128
+ )
129
+
130
+ assert quality.status == "flagged"
131
+ assert quality.reason_code == "harness_trigger_suspect"
132
+ assert quality.include_in_analysis is True
133
+
134
+
135
+ def test_existing_sample_quality_is_respected():
136
+ report = {
137
+ "sample_quality": {
138
+ "status": "excluded",
139
+ "reason_code": "api_timeout",
140
+ "reason": "API timeout",
141
+ "include_in_analysis": False,
142
+ "confidence": "high",
143
+ "evidence": ["stderr timeout"],
144
+ }
145
+ }
146
+
147
+ quality = quality_from_report(report)
148
+
149
+ assert quality.status == "excluded"
150
+ assert quality.reason_code == "api_timeout"
151
+ assert include_in_analysis(report) is False
152
+ assert sample_quality_dict(report)["include_in_analysis"] is False
153
+
154
+
155
+ def test_sample_quality_in_events_summary_is_respected():
156
+ report = {
157
+ "events_summary": {
158
+ "sample_quality": {
159
+ "status": "excluded",
160
+ "reason_code": "rate_limited",
161
+ "reason": "quota exceeded",
162
+ "include_in_analysis": False,
163
+ "confidence": "high",
164
+ "evidence": ["events summary"],
165
+ }
166
+ }
167
+ }
168
+
169
+ quality = quality_from_report(report)
170
+
171
+ assert quality.status == "excluded"
172
+ assert quality.reason_code == "rate_limited"
173
+ assert include_in_analysis(report) is False
174
+ assert sample_quality_dict(report)["status"] == "excluded"
175
+
176
+
177
+ def test_plain_build_failed_with_observable_result_is_included():
178
+ quality = infer_sample_quality(
179
+ events={
180
+ "duration_seconds": 10,
181
+ "total_tokens": 1234,
182
+ "total_cost_usd": 0.01,
183
+ },
184
+ stdout='{"type":"result","duration_ms": 1000}\n',
185
+ stderr="build failed",
186
+ checks_failed=[],
187
+ returncode=0,
188
+ )
189
+
190
+ assert quality.status == "included"
191
+ assert quality.reason_code == "valid_signal"
192
+ assert quality.include_in_analysis is True
193
+
194
+
195
+ def test_legacy_report_reads_raw_stderr_reference(tmp_path: Path):
196
+ stderr = tmp_path / "raw" / "workflow_rep1_stderr.txt"
197
+ stderr.parent.mkdir()
198
+ stderr.write_text("Timeout after 600s", encoding="utf-8")
199
+ report = {
200
+ "checks_passed": [],
201
+ "checks_failed": ["no result"],
202
+ "events_summary": {
203
+ "artifact_references": {"raw_stderr": str(stderr)},
204
+ },
205
+ }
206
+
207
+ quality = quality_from_report(report)
208
+
209
+ assert quality.status == "excluded"
210
+ assert quality.reason_code == "runner_timeout"
211
+ assert quality.include_in_analysis is False
@@ -0,0 +1,168 @@
1
+ """Unit tests for the comet eval task loader."""
2
+
3
+ from pathlib import Path
4
+
5
+ import pytest
6
+ import yaml
7
+
8
+ from scaffold.python.paths import get_tasks_dir
9
+ from scaffold.python.tasks import list_tasks, load_task
10
+
11
+
12
+ BASIC_TASK_TOML = """
13
+ [metadata]
14
+ name = "test-basic"
15
+ description = "A basic test task"
16
+ difficulty = "easy"
17
+ category = "testing"
18
+ tags = ["test", "basic"]
19
+ default_treatments = ["CONTROL", "COMET_FULL_040_BETA"]
20
+
21
+ [template]
22
+ required = ["run_id"]
23
+
24
+ [environment]
25
+ description = "Test environment"
26
+ dockerfile = "environment/Dockerfile"
27
+ timeout_sec = 300
28
+
29
+ [validation]
30
+ test_scripts = ["test_one.py", "test_two.py"]
31
+ target_artifacts = ["result.json"]
32
+ timeout = 45
33
+
34
+ [setup.template_vars]
35
+ artifact_name = "result-{run_id}.json"
36
+ """
37
+
38
+
39
+ @pytest.fixture
40
+ def mock_tasks_dir(tmp_path: Path) -> Path:
41
+ tasks_dir = tmp_path / "tasks"
42
+ task_dir = tasks_dir / "test-basic"
43
+ task_dir.mkdir(parents=True)
44
+ (task_dir / "task.toml").write_text(BASIC_TASK_TOML)
45
+ (task_dir / "instruction.md").write_text("Run {run_id} and write {artifact_name}.")
46
+
47
+ invalid_dir = tasks_dir / "invalid"
48
+ invalid_dir.mkdir()
49
+ (invalid_dir / "task.toml").write_text("[metadata]\nname = 'invalid'\n")
50
+
51
+ return tasks_dir
52
+
53
+
54
+ def test_list_tasks_returns_only_complete_task_dirs(mock_tasks_dir: Path):
55
+ assert list_tasks(mock_tasks_dir) == ["test-basic"]
56
+
57
+
58
+ def test_load_task_parses_validation_and_setup(mock_tasks_dir: Path):
59
+ task = load_task("test-basic", mock_tasks_dir)
60
+
61
+ assert task.name == "test-basic"
62
+ assert task.config.validation.test_scripts == ["test_one.py", "test_two.py"]
63
+ assert task.config.validation.target_artifacts == ["result.json"]
64
+ assert task.config.validation.timeout == 45
65
+ assert task.config.setup.template_vars == {"artifact_name": "result-{run_id}.json"}
66
+
67
+
68
+ def test_load_task_parses_evaluation_and_interaction(mock_tasks_dir: Path):
69
+ task_dir = mock_tasks_dir / "test-basic"
70
+ task_dir.joinpath("task.toml").write_text(
71
+ BASIC_TASK_TOML
72
+ + """
73
+
74
+ [evaluation]
75
+ profile = "generic"
76
+ required_skills = ["target-skill"]
77
+ expected_artifacts = ["result.json"]
78
+ require_skill_invocation = true
79
+
80
+ [interaction]
81
+ mode = "auto_user"
82
+ max_turns = 7
83
+ simulator_prompt = "Answer as a concise developer user."
84
+ decision_patterns = ["confirm", "choose"]
85
+ continue_prompt = "Please continue."
86
+ """
87
+ )
88
+
89
+ task = load_task("test-basic", mock_tasks_dir)
90
+
91
+ assert task.config.evaluation.profile == "generic"
92
+ assert task.config.evaluation.required_skills == ["target-skill"]
93
+ assert task.config.evaluation.expected_artifacts == ["result.json"]
94
+ assert task.config.evaluation.require_skill_invocation is True
95
+ assert task.config.interaction.mode == "auto_user"
96
+ assert task.config.interaction.max_turns == 7
97
+ assert task.config.interaction.simulator_prompt == "Answer as a concise developer user."
98
+ assert task.config.interaction.decision_patterns == ["confirm", "choose"]
99
+ assert task.config.interaction.continue_prompt == "Please continue."
100
+
101
+
102
+ def test_comet_tasks_default_to_comet_workflow_profile():
103
+ task = load_task("comet-full-workflow")
104
+
105
+ assert task.config.evaluation.profile == "comet-workflow"
106
+ assert task.config.interaction.mode == "auto_user"
107
+
108
+
109
+ def test_comet_task_prompt_requires_real_comet_invocation():
110
+ task = load_task("comet-fix-median")
111
+
112
+ prompt = task.render_prompt()
113
+
114
+ assert prompt.startswith("## Eval harness requirement")
115
+ assert "must begin by invoking the `/comet` Skill/slash command" in prompt
116
+ assert "Do not simulate the Comet workflow in plain prose" in prompt
117
+
118
+
119
+ def test_render_prompt_requires_declared_template_variables(mock_tasks_dir: Path):
120
+ task = load_task("test-basic", mock_tasks_dir)
121
+
122
+ with pytest.raises(KeyError, match="run_id"):
123
+ task.render_prompt(artifact_name="result-123.json")
124
+
125
+ prompt = task.render_prompt(run_id="123", artifact_name="result-123.json")
126
+ assert prompt == "Run 123 and write result-123.json."
127
+
128
+
129
+ def test_load_task_reads_instruction_as_utf8(mock_tasks_dir: Path):
130
+ task_dir = mock_tasks_dir / "test-basic"
131
+ (task_dir / "instruction.md").write_text("Fix Bob’s task {run_id}.", encoding="utf-8")
132
+
133
+ task = load_task("test-basic", mock_tasks_dir)
134
+
135
+ assert task.render_prompt(run_id="123", artifact_name="unused") == "Fix Bob’s task 123."
136
+
137
+
138
+ def test_comet_task_index_lists_real_tasks():
139
+ index_path = get_tasks_dir() / "index.yaml"
140
+
141
+ assert index_path.exists()
142
+
143
+ index = yaml.safe_load(index_path.read_text(encoding="utf-8"))
144
+ names = [task["name"] for task in index["tasks"]]
145
+ assert sorted(names) == sorted(list_tasks())
146
+ assert len(names) == 20
147
+ assert set(names) == {
148
+ "authoring-skill-smoke",
149
+ "comet-agent-memory-routing",
150
+ "comet-api-cache-ttl",
151
+ "comet-cross-file-refactor",
152
+ "comet-dependency-confusion",
153
+ "comet-fix-median",
154
+ "comet-framework-selection",
155
+ "comet-full-workflow",
156
+ "comet-graph-execution-review",
157
+ "comet-human-approval-flow",
158
+ "comet-layered-streaming-fix",
159
+ "comet-perf-dedupe",
160
+ "comet-persistence-threading",
161
+ "comet-refactor-counter",
162
+ "comet-robust-config",
163
+ "comet-noise-distractor",
164
+ "comet-observability-env-template",
165
+ "generic-skill-smoke",
166
+ "workflow-overlay-contract",
167
+ "workflow-route-conformance",
168
+ }
@@ -0,0 +1,244 @@
1
+ """Unit tests for comet eval treatment loading."""
2
+
3
+ from pathlib import Path
4
+
5
+ import pytest
6
+
7
+ from scaffold.python.treatments import (
8
+ TreatmentConfig,
9
+ build_treatment_skills,
10
+ list_treatments,
11
+ load_treatments,
12
+ load_treatments_yaml,
13
+ )
14
+ from scaffold.python.paths import get_skills_dir
15
+
16
+
17
+ BASIC_TREATMENT_YAML = """
18
+ _common_section: &common |
19
+ Shared guidance.
20
+
21
+ CONTROL:
22
+ description: "No skills baseline"
23
+ skills: []
24
+
25
+ INLINE_COMET:
26
+ description: "Inline skill treatment"
27
+ claude_md: "Use the comet workflow."
28
+ skills:
29
+ - skill: inline_comet
30
+ name: inline-comet
31
+ content: *common
32
+ noise_tasks:
33
+ - DISTRACTOR
34
+ """
35
+
36
+
37
+ @pytest.fixture
38
+ def treatment_file(tmp_path: Path) -> Path:
39
+ path = tmp_path / "treatments.yaml"
40
+ path.write_text(BASIC_TREATMENT_YAML)
41
+ return path
42
+
43
+
44
+ def test_load_treatments_yaml_skips_anchor_keys(treatment_file: Path):
45
+ treatments = load_treatments_yaml(treatment_file)
46
+
47
+ assert list(treatments) == ["CONTROL", "INLINE_COMET"]
48
+ assert treatments["INLINE_COMET"].noise_tasks == ["DISTRACTOR"]
49
+ assert treatments["INLINE_COMET"].claude_md == "Use the comet workflow."
50
+
51
+
52
+ def test_build_treatment_skills_accepts_inline_content_and_generated_names():
53
+ skills = build_treatment_skills(
54
+ [
55
+ {"skill": "snake_case_skill", "content": "Inline content"},
56
+ {"skill": "ignored", "name": "explicit-name", "content": "Explicit content"},
57
+ ]
58
+ )
59
+
60
+ assert "snake-case-skill" in skills
61
+ assert "snake_case_skill" not in skills
62
+ assert skills["snake-case-skill"]["sections"] == ["Inline content"]
63
+ assert skills["explicit-name"]["sections"] == ["Explicit content"]
64
+
65
+
66
+ def test_build_treatment_skills_accepts_path_skill_source(tmp_path: Path):
67
+ skill_dir = tmp_path / "local-skill"
68
+ skill_dir.mkdir()
69
+ (skill_dir / "SKILL.md").write_text(
70
+ "---\nname: local-skill\ndescription: Local test skill.\n---\n\nUse this skill.",
71
+ encoding="utf-8",
72
+ )
73
+ scripts_dir = skill_dir / "scripts"
74
+ scripts_dir.mkdir()
75
+ (scripts_dir / "helper.py").write_text("print('ok')", encoding="utf-8")
76
+
77
+ skills = build_treatment_skills(
78
+ [{"name": "local-skill", "source": "path", "path": str(skill_dir)}]
79
+ )
80
+
81
+ assert skills["local-skill"]["sections"] == [
82
+ "---\nname: local-skill\ndescription: Local test skill.\n---\n\nUse this skill."
83
+ ]
84
+ assert skills["local-skill"]["scripts_dir"] == scripts_dir
85
+ assert skills["local-skill"]["script_filter"] is None
86
+ assert skills["local-skill"]["source"]["source_type"] == "path"
87
+ assert skills["local-skill"]["source"]["hash"].startswith("sha256:")
88
+
89
+
90
+ def test_build_treatment_skills_rejects_path_without_skill_md(tmp_path: Path):
91
+ skill_dir = tmp_path / "broken-skill"
92
+ skill_dir.mkdir()
93
+
94
+ with pytest.raises(FileNotFoundError, match="SKILL.md"):
95
+ build_treatment_skills(
96
+ [{"name": "broken-skill", "source": "path", "path": str(skill_dir)}]
97
+ )
98
+
99
+
100
+ def test_load_treatments_keeps_comet_core_categories_only():
101
+ treatments = load_treatments()
102
+
103
+ assert set(treatments) == {"CONTROL", "COMET_FULL_040_BETA", "COMET_FULL_039"}
104
+ assert all(isinstance(treatment, TreatmentConfig) for treatment in treatments.values())
105
+
106
+
107
+ def _benchmark_child_names(*parts: str) -> set[str]:
108
+ root = get_skills_dir() / "benchmarks"
109
+ return {path.name for path in (root.joinpath(*parts)).iterdir() if path.is_dir()}
110
+
111
+
112
+ def test_comet_full_040_beta_includes_openspec_and_superpowers_dependencies():
113
+ treatment = load_treatments()["COMET_FULL_040_BETA"]
114
+ names = {skill["name"] for skill in treatment.skills}
115
+
116
+ assert names.issuperset(
117
+ {
118
+ "comet",
119
+ "comet-open",
120
+ "comet-design",
121
+ "comet-build",
122
+ "comet-verify",
123
+ "comet-archive",
124
+ "comet-hotfix",
125
+ "comet-tweak",
126
+ }
127
+ )
128
+ assert names.issuperset(_benchmark_child_names("dependency", "openspec"))
129
+ assert names.issuperset(_benchmark_child_names("dependency", "superpowers"))
130
+
131
+
132
+ def test_comet_full_039_includes_same_dependency_snapshot():
133
+ treatment = load_treatments()["COMET_FULL_039"]
134
+ names = {skill["name"] for skill in treatment.skills}
135
+
136
+ assert names.issuperset(
137
+ {
138
+ "comet",
139
+ "comet-open",
140
+ "comet-design",
141
+ "comet-build",
142
+ "comet-verify",
143
+ "comet-archive",
144
+ "comet-hotfix",
145
+ "comet-tweak",
146
+ }
147
+ )
148
+ assert names.issuperset(_benchmark_child_names("dependency", "openspec"))
149
+ assert names.issuperset(_benchmark_child_names("dependency", "superpowers"))
150
+
151
+
152
+ def test_comet_treatments_point_at_versioned_comet_snapshots():
153
+ COMET_FULL_040_BETA = load_treatments()["COMET_FULL_040_BETA"]
154
+ comet_039 = load_treatments()["COMET_FULL_039"]
155
+
156
+ assert {
157
+ skill["skill"]
158
+ for skill in COMET_FULL_040_BETA.skills
159
+ if skill["name"].startswith("comet")
160
+ } == {
161
+ "040-beta/comet",
162
+ "040-beta/comet-open",
163
+ "040-beta/comet-design",
164
+ "040-beta/comet-build",
165
+ "040-beta/comet-verify",
166
+ "040-beta/comet-archive",
167
+ "040-beta/comet-hotfix",
168
+ "040-beta/comet-tweak",
169
+ }
170
+ assert {
171
+ skill["skill"]
172
+ for skill in comet_039.skills
173
+ if skill["name"].startswith("comet")
174
+ } == {
175
+ "039-release/comet-classic-039",
176
+ "039-release/comet-classic-039-open",
177
+ "039-release/comet-classic-039-design",
178
+ "039-release/comet-classic-039-build",
179
+ "039-release/comet-classic-039-verify",
180
+ "039-release/comet-classic-039-archive",
181
+ "039-release/comet-classic-039-hotfix",
182
+ "039-release/comet-classic-039-tweak",
183
+ }
184
+
185
+
186
+ def test_comet_treatment_dependency_snapshots_are_loadable():
187
+ for treatment_name in ["COMET_FULL_040_BETA", "COMET_FULL_039"]:
188
+ treatment = load_treatments()[treatment_name]
189
+
190
+ skills = build_treatment_skills(treatment.skills)
191
+
192
+ assert {
193
+ "openspec-new-change",
194
+ "openspec-apply-change",
195
+ "openspec-verify-change",
196
+ "openspec-archive-change",
197
+ "brainstorming",
198
+ "executing-plans",
199
+ "subagent-driven-development",
200
+ "test-driven-development",
201
+ "systematic-debugging",
202
+ "verification-before-completion",
203
+ "requesting-code-review",
204
+ "writing-skills",
205
+ }.issubset(skills)
206
+ assert skills["comet"]["scripts_dir"].name == "scripts"
207
+ assert skills["comet"]["source_dir"].name in {"comet", "comet-classic-039"}
208
+ assert skills["openspec-new-change"]["sections"]
209
+ assert skills["executing-plans"]["sections"]
210
+
211
+
212
+ def test_comet_treatment_main_skill_sources_include_rules_and_hooks():
213
+ skills_040 = build_treatment_skills(load_treatments()["COMET_FULL_040_BETA"].skills)
214
+ comet_040 = skills_040["comet"]
215
+ comet_040_text = "\n\n".join(comet_040["sections"])
216
+ assert "Skill 工具加载对应的 Comet 子 Skill" in comet_040_text
217
+ assert "OpenSpec 或 Superpowers 技能" in comet_040_text
218
+ assert (comet_040["source_dir"] / "rules" / "comet-phase-guard.md").exists()
219
+ assert (comet_040["scripts_dir"] / "comet-hook-guard.mjs").exists()
220
+ assert (comet_040["source_dir"] / "runtime" / "classic" / "skill.yaml").exists()
221
+
222
+ skills_039 = build_treatment_skills(load_treatments()["COMET_FULL_039"].skills)
223
+ comet_039 = skills_039["comet"]
224
+ assert (comet_039["source_dir"] / "rules" / "comet-phase-guard.md").exists()
225
+ assert (comet_039["scripts_dir"] / "comet-hook-guard.sh").exists()
226
+
227
+
228
+ def test_comet_full_040_beta_dependency_paths_are_loadable():
229
+ treatment = load_treatments()["COMET_FULL_040_BETA"]
230
+
231
+ skills = build_treatment_skills(treatment.skills)
232
+
233
+ assert {
234
+ "comet",
235
+ "openspec-new-change",
236
+ "brainstorming",
237
+ "executing-plans",
238
+ }.issubset(skills)
239
+ assert "040-beta" in str(skills["comet"]["scripts_dir"])
240
+ assert skills["openspec-new-change"]["sections"][0].startswith("---")
241
+
242
+
243
+ def test_list_treatments_is_sorted_for_stable_cli_output():
244
+ assert list_treatments() == ["COMET_FULL_039", "COMET_FULL_040_BETA", "CONTROL"]