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

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 (605) hide show
  1. package/LICENSE +21 -21
  2. package/README.md +15 -1
  3. package/assets/manifest.json +2 -1
  4. package/assets/skills/comet/SKILL.md +54 -28
  5. package/assets/skills/comet/reference/auto-transition.md +1 -1
  6. package/assets/skills/comet/reference/comet-yaml-fields.md +11 -6
  7. package/assets/skills/comet/reference/context-recovery.md +12 -2
  8. package/assets/skills/comet/reference/decision-point.md +11 -0
  9. package/assets/skills/comet/reference/scripts.md +47 -15
  10. package/assets/skills/comet/reference/subagent-dispatch.md +6 -5
  11. package/assets/skills/comet/rules/comet-phase-guard.en.md +31 -28
  12. package/assets/skills/comet/rules/comet-phase-guard.md +31 -29
  13. package/assets/skills/comet/scripts/comet-resume-probe.mjs +3 -0
  14. package/assets/skills/comet/scripts/comet-runtime.mjs +1568 -476
  15. package/assets/skills/comet-any/SKILL.md +1 -1
  16. package/assets/skills/comet-any/reference/authored-zone-example.md +10 -5
  17. package/assets/skills/comet-any/reference/subagents/pause-points-author.md +14 -11
  18. package/assets/skills/comet-any/reference/subagents/skill-reviewer.md +2 -0
  19. package/assets/skills/comet-any/reference/subagents/workflow-entry-author.md +5 -4
  20. package/assets/skills/comet-archive/SKILL.md +52 -18
  21. package/assets/skills/comet-build/SKILL.md +64 -45
  22. package/assets/skills/comet-design/SKILL.md +24 -22
  23. package/assets/skills/comet-hotfix/SKILL.md +37 -34
  24. package/assets/skills/comet-open/SKILL.md +106 -57
  25. package/assets/skills/comet-tweak/SKILL.md +23 -18
  26. package/assets/skills/comet-verify/SKILL.md +57 -72
  27. package/assets/skills-zh/comet/SKILL.md +54 -28
  28. package/assets/skills-zh/comet/reference/auto-transition.md +1 -1
  29. package/assets/skills-zh/comet/reference/comet-yaml-fields.md +11 -6
  30. package/assets/skills-zh/comet/reference/context-recovery.md +12 -2
  31. package/assets/skills-zh/comet/reference/decision-point.md +11 -0
  32. package/assets/skills-zh/comet/reference/scripts.md +47 -15
  33. package/assets/skills-zh/comet/reference/subagent-dispatch.md +6 -5
  34. package/assets/skills-zh/comet-any/SKILL.md +1 -1
  35. package/assets/skills-zh/comet-any/reference/authored-zone-example.md +10 -5
  36. package/assets/skills-zh/comet-any/reference/subagents/pause-points-author.md +14 -12
  37. package/assets/skills-zh/comet-any/reference/subagents/skill-reviewer.md +2 -0
  38. package/assets/skills-zh/comet-any/reference/subagents/workflow-entry-author.md +5 -4
  39. package/assets/skills-zh/comet-archive/SKILL.md +52 -18
  40. package/assets/skills-zh/comet-build/SKILL.md +64 -45
  41. package/assets/skills-zh/comet-design/SKILL.md +24 -22
  42. package/assets/skills-zh/comet-hotfix/SKILL.md +36 -33
  43. package/assets/skills-zh/comet-open/SKILL.md +105 -56
  44. package/assets/skills-zh/comet-tweak/SKILL.md +22 -17
  45. package/assets/skills-zh/comet-verify/SKILL.md +57 -72
  46. package/dist/app/cli/comet-banner.d.ts +25 -0
  47. package/dist/app/cli/comet-banner.d.ts.map +1 -0
  48. package/dist/app/cli/comet-banner.js +265 -0
  49. package/dist/app/cli/comet-banner.js.map +1 -0
  50. package/dist/app/cli/index.js +36 -2
  51. package/dist/app/cli/index.js.map +1 -1
  52. package/dist/app/commands/classic.d.ts +4 -0
  53. package/dist/app/commands/classic.d.ts.map +1 -0
  54. package/dist/app/commands/classic.js +11 -0
  55. package/dist/app/commands/classic.js.map +1 -0
  56. package/dist/app/commands/doctor.d.ts.map +1 -1
  57. package/dist/app/commands/doctor.js +99 -37
  58. package/dist/app/commands/doctor.js.map +1 -1
  59. package/dist/app/commands/eval.d.ts.map +1 -1
  60. package/dist/app/commands/eval.js +57 -20
  61. package/dist/app/commands/eval.js.map +1 -1
  62. package/dist/app/commands/i18n.d.ts +1 -1
  63. package/dist/app/commands/i18n.d.ts.map +1 -1
  64. package/dist/app/commands/i18n.js +12 -4
  65. package/dist/app/commands/i18n.js.map +1 -1
  66. package/dist/app/commands/init.d.ts +1 -1
  67. package/dist/app/commands/init.d.ts.map +1 -1
  68. package/dist/app/commands/init.js +72 -25
  69. package/dist/app/commands/init.js.map +1 -1
  70. package/dist/app/commands/project-scope-selection.d.ts +13 -0
  71. package/dist/app/commands/project-scope-selection.d.ts.map +1 -0
  72. package/dist/app/commands/project-scope-selection.js +33 -0
  73. package/dist/app/commands/project-scope-selection.js.map +1 -0
  74. package/dist/app/commands/resume-probe.d.ts +11 -0
  75. package/dist/app/commands/resume-probe.d.ts.map +1 -0
  76. package/dist/app/commands/resume-probe.js +63 -0
  77. package/dist/app/commands/resume-probe.js.map +1 -0
  78. package/dist/app/commands/status.d.ts +31 -0
  79. package/dist/app/commands/status.d.ts.map +1 -1
  80. package/dist/app/commands/status.js +109 -20
  81. package/dist/app/commands/status.js.map +1 -1
  82. package/dist/app/commands/uninstall.d.ts +5 -0
  83. package/dist/app/commands/uninstall.d.ts.map +1 -1
  84. package/dist/app/commands/uninstall.js +264 -53
  85. package/dist/app/commands/uninstall.js.map +1 -1
  86. package/dist/app/commands/update.d.ts +6 -0
  87. package/dist/app/commands/update.d.ts.map +1 -1
  88. package/dist/app/commands/update.js +558 -86
  89. package/dist/app/commands/update.js.map +1 -1
  90. package/dist/config/repository-layout.json +4 -2
  91. package/dist/domains/bundle/bundle-platform.d.ts +1 -0
  92. package/dist/domains/bundle/bundle-platform.d.ts.map +1 -1
  93. package/dist/domains/bundle/bundle-platform.js +9 -3
  94. package/dist/domains/bundle/bundle-platform.js.map +1 -1
  95. package/dist/domains/bundle/eval-manifest-runtime.d.ts +6 -0
  96. package/dist/domains/bundle/eval-manifest-runtime.d.ts.map +1 -0
  97. package/dist/domains/bundle/eval-manifest-runtime.js +58 -0
  98. package/dist/domains/bundle/eval-manifest-runtime.js.map +1 -0
  99. package/dist/domains/bundle/types.d.ts +1 -1
  100. package/dist/domains/bundle/types.d.ts.map +1 -1
  101. package/dist/domains/comet-classic/classic-archive.d.ts +1 -0
  102. package/dist/domains/comet-classic/classic-archive.d.ts.map +1 -1
  103. package/dist/domains/comet-classic/classic-archive.js +35 -38
  104. package/dist/domains/comet-classic/classic-archive.js.map +1 -1
  105. package/dist/domains/comet-classic/classic-cli.d.ts +1 -1
  106. package/dist/domains/comet-classic/classic-cli.d.ts.map +1 -1
  107. package/dist/domains/comet-classic/classic-cli.js +3 -0
  108. package/dist/domains/comet-classic/classic-cli.js.map +1 -1
  109. package/dist/domains/comet-classic/classic-command-checks.d.ts +20 -0
  110. package/dist/domains/comet-classic/classic-command-checks.d.ts.map +1 -0
  111. package/dist/domains/comet-classic/classic-command-checks.js +97 -0
  112. package/dist/domains/comet-classic/classic-command-checks.js.map +1 -0
  113. package/dist/domains/comet-classic/classic-current-change.d.ts +19 -0
  114. package/dist/domains/comet-classic/classic-current-change.d.ts.map +1 -0
  115. package/dist/domains/comet-classic/classic-current-change.js +132 -0
  116. package/dist/domains/comet-classic/classic-current-change.js.map +1 -0
  117. package/dist/domains/comet-classic/classic-diagnostics.d.ts +2 -1
  118. package/dist/domains/comet-classic/classic-diagnostics.d.ts.map +1 -1
  119. package/dist/domains/comet-classic/classic-diagnostics.js +54 -1
  120. package/dist/domains/comet-classic/classic-diagnostics.js.map +1 -1
  121. package/dist/domains/comet-classic/classic-evidence.d.ts.map +1 -1
  122. package/dist/domains/comet-classic/classic-evidence.js +4 -0
  123. package/dist/domains/comet-classic/classic-evidence.js.map +1 -1
  124. package/dist/domains/comet-classic/classic-guard.d.ts.map +1 -1
  125. package/dist/domains/comet-classic/classic-guard.js +83 -80
  126. package/dist/domains/comet-classic/classic-guard.js.map +1 -1
  127. package/dist/domains/comet-classic/classic-hook-guard.d.ts.map +1 -1
  128. package/dist/domains/comet-classic/classic-hook-guard.js +179 -42
  129. package/dist/domains/comet-classic/classic-hook-guard.js.map +1 -1
  130. package/dist/domains/comet-classic/classic-project-config.d.ts +16 -0
  131. package/dist/domains/comet-classic/classic-project-config.d.ts.map +1 -0
  132. package/dist/domains/comet-classic/classic-project-config.js +40 -0
  133. package/dist/domains/comet-classic/classic-project-config.js.map +1 -0
  134. package/dist/domains/comet-classic/classic-resolver.d.ts.map +1 -1
  135. package/dist/domains/comet-classic/classic-resolver.js +4 -4
  136. package/dist/domains/comet-classic/classic-resolver.js.map +1 -1
  137. package/dist/domains/comet-classic/classic-resume-probe-command.d.ts +3 -0
  138. package/dist/domains/comet-classic/classic-resume-probe-command.d.ts.map +1 -0
  139. package/dist/domains/comet-classic/classic-resume-probe-command.js +58 -0
  140. package/dist/domains/comet-classic/classic-resume-probe-command.js.map +1 -0
  141. package/dist/domains/comet-classic/classic-resume-probe-entry.d.ts +2 -0
  142. package/dist/domains/comet-classic/classic-resume-probe-entry.d.ts.map +1 -0
  143. package/dist/domains/comet-classic/classic-resume-probe-entry.js +4 -0
  144. package/dist/domains/comet-classic/classic-resume-probe-entry.js.map +1 -0
  145. package/dist/domains/comet-classic/classic-resume-probe.d.ts +29 -0
  146. package/dist/domains/comet-classic/classic-resume-probe.d.ts.map +1 -0
  147. package/dist/domains/comet-classic/classic-resume-probe.js +386 -0
  148. package/dist/domains/comet-classic/classic-resume-probe.js.map +1 -0
  149. package/dist/domains/comet-classic/classic-runtime-run.d.ts +2 -1
  150. package/dist/domains/comet-classic/classic-runtime-run.d.ts.map +1 -1
  151. package/dist/domains/comet-classic/classic-runtime-run.js +38 -0
  152. package/dist/domains/comet-classic/classic-runtime-run.js.map +1 -1
  153. package/dist/domains/comet-classic/classic-state-command.d.ts.map +1 -1
  154. package/dist/domains/comet-classic/classic-state-command.js +150 -25
  155. package/dist/domains/comet-classic/classic-state-command.js.map +1 -1
  156. package/dist/domains/comet-classic/classic-state.d.ts +5 -2
  157. package/dist/domains/comet-classic/classic-state.d.ts.map +1 -1
  158. package/dist/domains/comet-classic/classic-state.js +17 -1
  159. package/dist/domains/comet-classic/classic-state.js.map +1 -1
  160. package/dist/domains/comet-classic/classic-store.d.ts +4 -1
  161. package/dist/domains/comet-classic/classic-store.d.ts.map +1 -1
  162. package/dist/domains/comet-classic/classic-store.js +4 -3
  163. package/dist/domains/comet-classic/classic-store.js.map +1 -1
  164. package/dist/domains/comet-classic/classic-transitions.d.ts +1 -1
  165. package/dist/domains/comet-classic/classic-transitions.d.ts.map +1 -1
  166. package/dist/domains/comet-classic/classic-transitions.js +36 -3
  167. package/dist/domains/comet-classic/classic-transitions.js.map +1 -1
  168. package/dist/domains/comet-classic/classic-validate-command.d.ts.map +1 -1
  169. package/dist/domains/comet-classic/classic-validate-command.js +8 -1
  170. package/dist/domains/comet-classic/classic-validate-command.js.map +1 -1
  171. package/dist/domains/comet-classic/index.d.ts +3 -0
  172. package/dist/domains/comet-classic/index.d.ts.map +1 -1
  173. package/dist/domains/comet-classic/index.js +3 -0
  174. package/dist/domains/comet-classic/index.js.map +1 -1
  175. package/dist/domains/dashboard/collector.js +10 -2
  176. package/dist/domains/dashboard/collector.js.map +1 -1
  177. package/dist/domains/dashboard/web/assets/_commonjsHelpers-CqkleIqs.js +1 -0
  178. package/dist/domains/dashboard/web/assets/arc-TGVUG2WN.js +1 -0
  179. package/dist/domains/dashboard/web/assets/architectureDiagram-3BPJPVTR-ASHmiHoP.js +36 -0
  180. package/dist/domains/dashboard/web/assets/blockDiagram-GPEHLZMM-CwASxBKe.js +132 -0
  181. package/dist/domains/dashboard/web/assets/c4Diagram-AAUBKEIU-BU8z_WNk.js +10 -0
  182. package/dist/domains/dashboard/web/assets/channel-kp6Ng2JJ.js +1 -0
  183. package/dist/domains/dashboard/web/assets/chunk-2J33WTMH-CBGlUx4_.js +1 -0
  184. package/dist/domains/dashboard/web/assets/chunk-4BX2VUAB-CS-iGcFz.js +1 -0
  185. package/dist/domains/dashboard/web/assets/chunk-55IACEB6-BUtCVJat.js +1 -0
  186. package/dist/domains/dashboard/web/assets/chunk-727SXJPM-C94tj_pf.js +206 -0
  187. package/dist/domains/dashboard/web/assets/chunk-AQP2D5EJ-BFOKcpdG.js +231 -0
  188. package/dist/domains/dashboard/web/assets/chunk-FMBD7UC4-Dmx8B-st.js +15 -0
  189. package/dist/domains/dashboard/web/assets/chunk-ND2GUHAM-DYV00CNn.js +1 -0
  190. package/dist/domains/dashboard/web/assets/chunk-QZHKN3VN-DMJJyQnw.js +1 -0
  191. package/dist/domains/dashboard/web/assets/classDiagram-4FO5ZUOK-yBDjgMY_.js +1 -0
  192. package/dist/domains/dashboard/web/assets/classDiagram-v2-Q7XG4LA2-yBDjgMY_.js +1 -0
  193. package/dist/domains/dashboard/web/assets/cose-bilkent-S5V4N54A-P4nE2rea.js +1 -0
  194. package/dist/domains/dashboard/web/assets/cynefin-VYW2F7L2-C-R1HXDv.js +166 -0
  195. package/dist/domains/dashboard/web/assets/cytoscape.esm-D3_iZ_3b.js +321 -0
  196. package/dist/domains/dashboard/web/assets/dagre-BM42HDAG-BH8d-C9z.js +4 -0
  197. package/dist/domains/dashboard/web/assets/defaultLocale-DX6XiGOO.js +1 -0
  198. package/dist/domains/dashboard/web/assets/diagram-2AECGRRQ-DpXTgQIH.js +43 -0
  199. package/dist/domains/dashboard/web/assets/diagram-5GNKFQAL-DSiFJzSw.js +10 -0
  200. package/dist/domains/dashboard/web/assets/diagram-KO2AKTUF-DULMkben.js +3 -0
  201. package/dist/domains/dashboard/web/assets/diagram-LMA3HP47-Pi8m_NO9.js +24 -0
  202. package/dist/domains/dashboard/web/assets/diagram-OG6HWLK6-BSe6bCWm.js +24 -0
  203. package/dist/domains/dashboard/web/assets/erDiagram-TEJ5UH35-zb-FEcbq.js +85 -0
  204. package/dist/domains/dashboard/web/assets/flowDiagram-I6XJVG4X-Dr-Gk0z2.js +162 -0
  205. package/dist/domains/dashboard/web/assets/ganttDiagram-6RSMTGT7-qs6Zb2A6.js +292 -0
  206. package/dist/domains/dashboard/web/assets/gitGraphDiagram-PVQCEYII-BQ314orT.js +106 -0
  207. package/dist/domains/dashboard/web/assets/graph--OzhPTMs.js +1 -0
  208. package/dist/domains/dashboard/web/assets/index-BLAfkNTu.css +1 -0
  209. package/dist/domains/dashboard/web/assets/index-DlSYK56b.js +139 -0
  210. package/dist/domains/dashboard/web/assets/index-DtLUOcAW.js +24 -0
  211. package/dist/domains/dashboard/web/assets/index-QO0z6F4w.js +10 -0
  212. package/dist/domains/dashboard/web/assets/infoDiagram-5YYISTIA-O0bQp98A.js +2 -0
  213. package/dist/domains/dashboard/web/assets/init-Gi6I4Gst.js +1 -0
  214. package/dist/domains/dashboard/web/assets/ishikawaDiagram-YF4QCWOH-BPC7wbKh.js +70 -0
  215. package/dist/domains/dashboard/web/assets/journeyDiagram-JHISSGLW-ohViOd4b.js +139 -0
  216. package/dist/domains/dashboard/web/assets/kanban-definition-UN3LZRKU-CHleNdbG.js +89 -0
  217. package/dist/domains/dashboard/web/assets/katex-HP8lGamR.js +257 -0
  218. package/dist/domains/dashboard/web/assets/layout-SsrduOYp.js +1 -0
  219. package/dist/domains/dashboard/web/assets/linear-CyqiW--Q.js +1 -0
  220. package/dist/domains/dashboard/web/assets/marked.esm-DECB3bxB.js +64 -0
  221. package/dist/domains/dashboard/web/assets/mermaid.core-qS9XvtaK.js +301 -0
  222. package/dist/domains/dashboard/web/assets/mindmap-definition-RKZ34NQL-oaGkqO9l.js +96 -0
  223. package/dist/domains/dashboard/web/assets/ordinal-Cboi1Yqb.js +1 -0
  224. package/dist/domains/dashboard/web/assets/pieDiagram-4H26LBE5-CPcB-AFh.js +30 -0
  225. package/dist/domains/dashboard/web/assets/purify.es-VaSPOPhr.js +3 -0
  226. package/dist/domains/dashboard/web/assets/quadrantDiagram-W4KKPZXB-LFy52Qtj.js +7 -0
  227. package/dist/domains/dashboard/web/assets/requirementDiagram-4Y6WPE33-BdjeaYP_.js +84 -0
  228. package/dist/domains/dashboard/web/assets/sankeyDiagram-5OEKKPKP-DDJ4styL.js +40 -0
  229. package/dist/domains/dashboard/web/assets/sequenceDiagram-3UESZ5HK-BL5bFNoz.js +162 -0
  230. package/dist/domains/dashboard/web/assets/stateDiagram-AJRCARHV-BNUfikui.js +1 -0
  231. package/dist/domains/dashboard/web/assets/stateDiagram-v2-BHNVJYJU-DGrsmWts.js +1 -0
  232. package/dist/domains/dashboard/web/assets/timeline-definition-PNZ67QCA--ps2uu6L.js +120 -0
  233. package/dist/domains/dashboard/web/assets/vennDiagram-CIIHVFJN-C2q8q26c.js +34 -0
  234. package/dist/domains/dashboard/web/assets/wardleyDiagram-YWT4CUSO-BUH9gXqd.js +78 -0
  235. package/dist/domains/dashboard/web/assets/xychartDiagram-2RQKCTM6-B-DielEy.js +7 -0
  236. package/dist/domains/dashboard/web/index.html +16 -16
  237. package/dist/domains/engine/types.d.ts +1 -1
  238. package/dist/domains/engine/types.d.ts.map +1 -1
  239. package/dist/domains/factory/package.d.ts.map +1 -1
  240. package/dist/domains/factory/package.js +20 -6
  241. package/dist/domains/factory/package.js.map +1 -1
  242. package/dist/domains/integrations/openspec.d.ts +4 -1
  243. package/dist/domains/integrations/openspec.d.ts.map +1 -1
  244. package/dist/domains/integrations/openspec.js +62 -10
  245. package/dist/domains/integrations/openspec.js.map +1 -1
  246. package/dist/domains/skill/find.d.ts.map +1 -1
  247. package/dist/domains/skill/find.js +1 -6
  248. package/dist/domains/skill/find.js.map +1 -1
  249. package/dist/domains/skill/json-object.d.ts +13 -0
  250. package/dist/domains/skill/json-object.d.ts.map +1 -0
  251. package/dist/domains/skill/json-object.js +24 -0
  252. package/dist/domains/skill/json-object.js.map +1 -0
  253. package/dist/domains/skill/managed-markdown.d.ts +14 -0
  254. package/dist/domains/skill/managed-markdown.d.ts.map +1 -0
  255. package/dist/domains/skill/managed-markdown.js +126 -0
  256. package/dist/domains/skill/managed-markdown.js.map +1 -0
  257. package/dist/domains/skill/platform-inspect.d.ts +9 -0
  258. package/dist/domains/skill/platform-inspect.d.ts.map +1 -0
  259. package/dist/domains/skill/platform-inspect.js +149 -0
  260. package/dist/domains/skill/platform-inspect.js.map +1 -0
  261. package/dist/domains/skill/platform-install.d.ts +20 -9
  262. package/dist/domains/skill/platform-install.d.ts.map +1 -1
  263. package/dist/domains/skill/platform-install.js +356 -153
  264. package/dist/domains/skill/platform-install.js.map +1 -1
  265. package/dist/domains/skill/project-instructions.d.ts +22 -0
  266. package/dist/domains/skill/project-instructions.d.ts.map +1 -0
  267. package/dist/domains/skill/project-instructions.js +61 -0
  268. package/dist/domains/skill/project-instructions.js.map +1 -0
  269. package/dist/domains/skill/uninstall.d.ts +3 -1
  270. package/dist/domains/skill/uninstall.d.ts.map +1 -1
  271. package/dist/domains/skill/uninstall.js +259 -149
  272. package/dist/domains/skill/uninstall.js.map +1 -1
  273. package/dist/platform/fs/file-system.d.ts +3 -3
  274. package/dist/platform/fs/file-system.d.ts.map +1 -1
  275. package/dist/platform/fs/file-system.js +21 -11
  276. package/dist/platform/fs/file-system.js.map +1 -1
  277. package/dist/platform/install/detect.d.ts +2 -1
  278. package/dist/platform/install/detect.d.ts.map +1 -1
  279. package/dist/platform/install/detect.js +10 -1
  280. package/dist/platform/install/detect.js.map +1 -1
  281. package/dist/platform/install/platforms.d.ts +9 -1
  282. package/dist/platform/install/platforms.d.ts.map +1 -1
  283. package/dist/platform/install/platforms.js +23 -4
  284. package/dist/platform/install/platforms.js.map +1 -1
  285. package/dist/platform/install/project-registry.d.ts +38 -0
  286. package/dist/platform/install/project-registry.d.ts.map +1 -0
  287. package/dist/platform/install/project-registry.js +213 -0
  288. package/dist/platform/install/project-registry.js.map +1 -0
  289. package/dist/platform/install/skill-root-owner.d.ts +15 -0
  290. package/dist/platform/install/skill-root-owner.d.ts.map +1 -0
  291. package/dist/platform/install/skill-root-owner.js +68 -0
  292. package/dist/platform/install/skill-root-owner.js.map +1 -0
  293. package/eval/.env.example +52 -0
  294. package/eval/CLAUDE.md +43 -0
  295. package/eval/README.md +538 -0
  296. package/eval/langsmith/.env.example +16 -0
  297. package/eval/langsmith/README.md +93 -0
  298. package/eval/langsmith/skills/README.md +5 -0
  299. package/eval/langsmith/tasks/README.md +5 -0
  300. package/eval/langsmith/tests/conftest.py +187 -0
  301. package/eval/langsmith/tests/tasks/test_tasks.py +287 -0
  302. package/eval/langsmith/treatments/README.md +5 -0
  303. package/eval/local/README.md +80 -0
  304. package/eval/local/regression_baseline.json +13 -0
  305. package/eval/local/report-style-demo-assets/quality_cost.en.svg +41 -0
  306. package/eval/local/report-style-demo-assets/quality_cost.zh.svg +41 -0
  307. package/eval/local/report-style-demo-assets/rubric_delta.en.svg +56 -0
  308. package/eval/local/report-style-demo-assets/rubric_delta.zh.svg +56 -0
  309. package/eval/local/report-style-demo-assets/task_outcomes.en.svg +46 -0
  310. package/eval/local/report-style-demo-assets/task_outcomes.zh.svg +46 -0
  311. package/eval/local/report-style-demo.html +867 -0
  312. package/eval/local/scripts/compare_baselines.py +1018 -0
  313. package/eval/local/scripts/generate_report_style_demo_charts.py +322 -0
  314. package/eval/local/scripts/regression_check.py +171 -0
  315. package/eval/local/scripts/render_readme_benchmark_figures.py +416 -0
  316. package/eval/local/scripts/rescore_rubric.py +120 -0
  317. package/eval/local/skills/benchmarks/039-release/comet-classic-039/SKILL.md +282 -0
  318. package/eval/local/skills/benchmarks/039-release/comet-classic-039/reference/auto-transition.md +27 -0
  319. package/eval/local/skills/benchmarks/039-release/comet-classic-039/reference/comet-yaml-fields.md +68 -0
  320. package/eval/local/skills/benchmarks/039-release/comet-classic-039/reference/context-recovery.md +35 -0
  321. package/eval/local/skills/benchmarks/039-release/comet-classic-039/reference/debug-gate.md +17 -0
  322. package/eval/local/skills/benchmarks/039-release/comet-classic-039/reference/decision-point.md +20 -0
  323. package/eval/local/skills/benchmarks/039-release/comet-classic-039/reference/dirty-worktree.md +59 -0
  324. package/eval/local/skills/benchmarks/039-release/comet-classic-039/reference/file-structure.md +28 -0
  325. package/eval/local/skills/benchmarks/039-release/comet-classic-039/reference/subagent-dispatch.md +113 -0
  326. package/eval/local/skills/benchmarks/039-release/comet-classic-039/rules/comet-phase-guard.md +125 -0
  327. package/eval/local/skills/benchmarks/039-release/comet-classic-039/scripts/comet-archive.sh +311 -0
  328. package/eval/local/skills/benchmarks/039-release/comet-classic-039/scripts/comet-env.sh +110 -0
  329. package/eval/local/skills/benchmarks/039-release/comet-classic-039/scripts/comet-guard.sh +778 -0
  330. package/eval/local/skills/benchmarks/039-release/comet-classic-039/scripts/comet-handoff.sh +390 -0
  331. package/eval/local/skills/benchmarks/039-release/comet-classic-039/scripts/comet-hook-guard.sh +336 -0
  332. package/eval/local/skills/benchmarks/039-release/comet-classic-039/scripts/comet-state.sh +1338 -0
  333. package/eval/local/skills/benchmarks/039-release/comet-classic-039/scripts/comet-yaml-validate.sh +225 -0
  334. package/eval/local/skills/benchmarks/039-release/comet-classic-039-archive/SKILL.md +100 -0
  335. package/eval/local/skills/benchmarks/039-release/comet-classic-039-build/SKILL.md +304 -0
  336. package/eval/local/skills/benchmarks/039-release/comet-classic-039-design/SKILL.md +263 -0
  337. package/eval/local/skills/benchmarks/039-release/comet-classic-039-hotfix/SKILL.md +204 -0
  338. package/eval/local/skills/benchmarks/039-release/comet-classic-039-open/SKILL.md +220 -0
  339. package/eval/local/skills/benchmarks/039-release/comet-classic-039-tweak/SKILL.md +180 -0
  340. package/eval/local/skills/benchmarks/039-release/comet-classic-039-verify/SKILL.md +234 -0
  341. package/eval/local/skills/benchmarks/040-beta/comet/SKILL.md +261 -0
  342. package/eval/local/skills/benchmarks/040-beta/comet/reference/auto-transition.md +27 -0
  343. package/eval/local/skills/benchmarks/040-beta/comet/reference/comet-yaml-fields.md +73 -0
  344. package/eval/local/skills/benchmarks/040-beta/comet/reference/context-recovery.md +45 -0
  345. package/eval/local/skills/benchmarks/040-beta/comet/reference/debug-gate.md +33 -0
  346. package/eval/local/skills/benchmarks/040-beta/comet/reference/decision-point.md +31 -0
  347. package/eval/local/skills/benchmarks/040-beta/comet/reference/dirty-worktree.md +59 -0
  348. package/eval/local/skills/benchmarks/040-beta/comet/reference/file-structure.md +28 -0
  349. package/eval/local/skills/benchmarks/040-beta/comet/reference/intent-frame.md +74 -0
  350. package/eval/local/skills/benchmarks/040-beta/comet/reference/scripts.md +69 -0
  351. package/eval/local/skills/benchmarks/040-beta/comet/reference/subagent-dispatch.md +169 -0
  352. package/eval/local/skills/benchmarks/040-beta/comet/rules/comet-phase-guard.md +130 -0
  353. package/eval/local/skills/benchmarks/040-beta/comet/runtime/classic/checks.yaml +6 -0
  354. package/eval/local/skills/benchmarks/040-beta/comet/runtime/classic/guardrails.yaml +13 -0
  355. package/eval/local/skills/benchmarks/040-beta/comet/runtime/classic/skill.yaml +122 -0
  356. package/eval/local/skills/benchmarks/040-beta/comet/scripts/comet-archive.mjs +9515 -0
  357. package/eval/local/skills/benchmarks/040-beta/comet/scripts/comet-env.mjs +15 -0
  358. package/eval/local/skills/benchmarks/040-beta/comet/scripts/comet-guard.mjs +10173 -0
  359. package/eval/local/skills/benchmarks/040-beta/comet/scripts/comet-handoff.mjs +9491 -0
  360. package/eval/local/skills/benchmarks/040-beta/comet/scripts/comet-hook-guard.mjs +9175 -0
  361. package/eval/local/skills/benchmarks/040-beta/comet/scripts/comet-intent.mjs +404 -0
  362. package/eval/local/skills/benchmarks/040-beta/comet/scripts/comet-state.mjs +9273 -0
  363. package/eval/local/skills/benchmarks/040-beta/comet/scripts/comet-yaml-validate.mjs +7627 -0
  364. package/eval/local/skills/benchmarks/040-beta/comet-archive/SKILL.md +110 -0
  365. package/eval/local/skills/benchmarks/040-beta/comet-build/SKILL.md +315 -0
  366. package/eval/local/skills/benchmarks/040-beta/comet-design/SKILL.md +260 -0
  367. package/eval/local/skills/benchmarks/040-beta/comet-hotfix/SKILL.md +190 -0
  368. package/eval/local/skills/benchmarks/040-beta/comet-open/SKILL.md +210 -0
  369. package/eval/local/skills/benchmarks/040-beta/comet-tweak/SKILL.md +183 -0
  370. package/eval/local/skills/benchmarks/040-beta/comet-verify/SKILL.md +230 -0
  371. package/eval/local/skills/benchmarks/dependency/claude-md/comet-workflow/CLAUDE.md +12 -0
  372. package/eval/local/skills/benchmarks/dependency/openspec/openspec-apply-change/SKILL.md +156 -0
  373. package/eval/local/skills/benchmarks/dependency/openspec/openspec-archive-change/SKILL.md +114 -0
  374. package/eval/local/skills/benchmarks/dependency/openspec/openspec-bulk-archive-change/SKILL.md +246 -0
  375. package/eval/local/skills/benchmarks/dependency/openspec/openspec-continue-change/SKILL.md +118 -0
  376. package/eval/local/skills/benchmarks/dependency/openspec/openspec-explore/SKILL.md +288 -0
  377. package/eval/local/skills/benchmarks/dependency/openspec/openspec-ff-change/SKILL.md +101 -0
  378. package/eval/local/skills/benchmarks/dependency/openspec/openspec-new-change/SKILL.md +74 -0
  379. package/eval/local/skills/benchmarks/dependency/openspec/openspec-onboard/SKILL.md +554 -0
  380. package/eval/local/skills/benchmarks/dependency/openspec/openspec-propose/SKILL.md +110 -0
  381. package/eval/local/skills/benchmarks/dependency/openspec/openspec-sync-specs/SKILL.md +138 -0
  382. package/eval/local/skills/benchmarks/dependency/openspec/openspec-verify-change/SKILL.md +168 -0
  383. package/eval/local/skills/benchmarks/dependency/superpowers/brainstorming/SKILL.md +159 -0
  384. package/eval/local/skills/benchmarks/dependency/superpowers/brainstorming/scripts/frame-template.html +213 -0
  385. package/eval/local/skills/benchmarks/dependency/superpowers/brainstorming/scripts/helper.js +167 -0
  386. package/eval/local/skills/benchmarks/dependency/superpowers/brainstorming/scripts/server.cjs +723 -0
  387. package/eval/local/skills/benchmarks/dependency/superpowers/brainstorming/scripts/start-server.sh +209 -0
  388. package/eval/local/skills/benchmarks/dependency/superpowers/brainstorming/scripts/stop-server.sh +120 -0
  389. package/eval/local/skills/benchmarks/dependency/superpowers/brainstorming/spec-document-reviewer-prompt.md +49 -0
  390. package/eval/local/skills/benchmarks/dependency/superpowers/brainstorming/visual-companion.md +291 -0
  391. package/eval/local/skills/benchmarks/dependency/superpowers/dispatching-parallel-agents/SKILL.md +185 -0
  392. package/eval/local/skills/benchmarks/dependency/superpowers/executing-plans/SKILL.md +70 -0
  393. package/eval/local/skills/benchmarks/dependency/superpowers/finishing-a-development-branch/SKILL.md +241 -0
  394. package/eval/local/skills/benchmarks/dependency/superpowers/receiving-code-review/SKILL.md +213 -0
  395. package/eval/local/skills/benchmarks/dependency/superpowers/requesting-code-review/SKILL.md +103 -0
  396. package/eval/local/skills/benchmarks/dependency/superpowers/requesting-code-review/code-reviewer.md +172 -0
  397. package/eval/local/skills/benchmarks/dependency/superpowers/subagent-driven-development/SKILL.md +418 -0
  398. package/eval/local/skills/benchmarks/dependency/superpowers/subagent-driven-development/implementer-prompt.md +139 -0
  399. package/eval/local/skills/benchmarks/dependency/superpowers/subagent-driven-development/scripts/review-package +44 -0
  400. package/eval/local/skills/benchmarks/dependency/superpowers/subagent-driven-development/scripts/sdd-workspace +22 -0
  401. package/eval/local/skills/benchmarks/dependency/superpowers/subagent-driven-development/scripts/task-brief +40 -0
  402. package/eval/local/skills/benchmarks/dependency/superpowers/subagent-driven-development/task-reviewer-prompt.md +188 -0
  403. package/eval/local/skills/benchmarks/dependency/superpowers/systematic-debugging/CREATION-LOG.md +119 -0
  404. package/eval/local/skills/benchmarks/dependency/superpowers/systematic-debugging/SKILL.md +296 -0
  405. package/eval/local/skills/benchmarks/dependency/superpowers/systematic-debugging/condition-based-waiting-example.ts +158 -0
  406. package/eval/local/skills/benchmarks/dependency/superpowers/systematic-debugging/condition-based-waiting.md +115 -0
  407. package/eval/local/skills/benchmarks/dependency/superpowers/systematic-debugging/defense-in-depth.md +122 -0
  408. package/eval/local/skills/benchmarks/dependency/superpowers/systematic-debugging/find-polluter.sh +63 -0
  409. package/eval/local/skills/benchmarks/dependency/superpowers/systematic-debugging/root-cause-tracing.md +169 -0
  410. package/eval/local/skills/benchmarks/dependency/superpowers/systematic-debugging/test-academic.md +14 -0
  411. package/eval/local/skills/benchmarks/dependency/superpowers/systematic-debugging/test-pressure-1.md +58 -0
  412. package/eval/local/skills/benchmarks/dependency/superpowers/systematic-debugging/test-pressure-2.md +68 -0
  413. package/eval/local/skills/benchmarks/dependency/superpowers/systematic-debugging/test-pressure-3.md +69 -0
  414. package/eval/local/skills/benchmarks/dependency/superpowers/test-driven-development/SKILL.md +371 -0
  415. package/eval/local/skills/benchmarks/dependency/superpowers/test-driven-development/testing-anti-patterns.md +299 -0
  416. package/eval/local/skills/benchmarks/dependency/superpowers/using-git-worktrees/SKILL.md +202 -0
  417. package/eval/local/skills/benchmarks/dependency/superpowers/verification-before-completion/SKILL.md +139 -0
  418. package/eval/local/skills/benchmarks/dependency/superpowers/writing-plans/SKILL.md +174 -0
  419. package/eval/local/skills/benchmarks/dependency/superpowers/writing-plans/plan-document-reviewer-prompt.md +49 -0
  420. package/eval/local/skills/benchmarks/dependency/superpowers/writing-skills/SKILL.md +689 -0
  421. package/eval/local/skills/benchmarks/dependency/superpowers/writing-skills/anthropic-best-practices.md +1150 -0
  422. package/eval/local/skills/benchmarks/dependency/superpowers/writing-skills/examples/CLAUDE_MD_TESTING.md +189 -0
  423. package/eval/local/skills/benchmarks/dependency/superpowers/writing-skills/graphviz-conventions.dot +172 -0
  424. package/eval/local/skills/benchmarks/dependency/superpowers/writing-skills/persuasion-principles.md +187 -0
  425. package/eval/local/skills/benchmarks/dependency/superpowers/writing-skills/render-graphs.js +168 -0
  426. package/eval/local/skills/benchmarks/dependency/superpowers/writing-skills/testing-skills-with-subagents.md +384 -0
  427. package/eval/local/tasks/authoring-skill-smoke/environment/Dockerfile +2 -0
  428. package/eval/local/tasks/authoring-skill-smoke/instruction.md +4 -0
  429. package/eval/local/tasks/authoring-skill-smoke/task.toml +21 -0
  430. package/eval/local/tasks/authoring-skill-smoke/validation/test_authoring_skill_smoke.py +54 -0
  431. package/eval/local/tasks/comet-agent-memory-routing/environment/Dockerfile +28 -0
  432. package/eval/local/tasks/comet-agent-memory-routing/environment/agent_system.py +40 -0
  433. package/eval/local/tasks/comet-agent-memory-routing/environment/test_agent_system.py +29 -0
  434. package/eval/local/tasks/comet-agent-memory-routing/instruction.md +20 -0
  435. package/eval/local/tasks/comet-agent-memory-routing/task.toml +24 -0
  436. package/eval/local/tasks/comet-agent-memory-routing/validation/test_agent_memory_routing.py +24 -0
  437. package/eval/local/tasks/comet-api-cache-ttl/environment/Dockerfile +39 -0
  438. package/eval/local/tasks/comet-api-cache-ttl/environment/cache.py +39 -0
  439. package/eval/local/tasks/comet-api-cache-ttl/environment/test_cache.py +81 -0
  440. package/eval/local/tasks/comet-api-cache-ttl/instruction.md +33 -0
  441. package/eval/local/tasks/comet-api-cache-ttl/task.toml +24 -0
  442. package/eval/local/tasks/comet-api-cache-ttl/validation/test_api_cache_ttl.py +58 -0
  443. package/eval/local/tasks/comet-cross-file-refactor/environment/Dockerfile +15 -0
  444. package/eval/local/tasks/comet-cross-file-refactor/environment/cli.py +13 -0
  445. package/eval/local/tasks/comet-cross-file-refactor/environment/counting.py +13 -0
  446. package/eval/local/tasks/comet-cross-file-refactor/environment/test_textkit.py +21 -0
  447. package/eval/local/tasks/comet-cross-file-refactor/instruction.md +16 -0
  448. package/eval/local/tasks/comet-cross-file-refactor/task.toml +20 -0
  449. package/eval/local/tasks/comet-cross-file-refactor/validation/test_cross_file_refactor.py +20 -0
  450. package/eval/local/tasks/comet-dependency-confusion/environment/Dockerfile +28 -0
  451. package/eval/local/tasks/comet-dependency-confusion/environment/app.py +8 -0
  452. package/eval/local/tasks/comet-dependency-confusion/environment/settings_loader.py +14 -0
  453. package/eval/local/tasks/comet-dependency-confusion/environment/test_settings_service.py +19 -0
  454. package/eval/local/tasks/comet-dependency-confusion/instruction.md +18 -0
  455. package/eval/local/tasks/comet-dependency-confusion/task.toml +24 -0
  456. package/eval/local/tasks/comet-dependency-confusion/validation/test_dependency_confusion.py +24 -0
  457. package/eval/local/tasks/comet-fix-median/environment/Dockerfile +50 -0
  458. package/eval/local/tasks/comet-fix-median/environment/stats.py +54 -0
  459. package/eval/local/tasks/comet-fix-median/environment/test_stats.py +68 -0
  460. package/eval/local/tasks/comet-fix-median/instruction.md +25 -0
  461. package/eval/local/tasks/comet-fix-median/task.toml +24 -0
  462. package/eval/local/tasks/comet-fix-median/validation/test_fix_median.py +60 -0
  463. package/eval/local/tasks/comet-framework-selection/environment/Dockerfile +28 -0
  464. package/eval/local/tasks/comet-framework-selection/environment/architecture.py +12 -0
  465. package/eval/local/tasks/comet-framework-selection/environment/test_architecture.py +30 -0
  466. package/eval/local/tasks/comet-framework-selection/instruction.md +22 -0
  467. package/eval/local/tasks/comet-framework-selection/task.toml +24 -0
  468. package/eval/local/tasks/comet-framework-selection/validation/test_framework_selection.py +24 -0
  469. package/eval/local/tasks/comet-full-workflow/environment/Dockerfile +53 -0
  470. package/eval/local/tasks/comet-full-workflow/environment/test_wordcount.py +29 -0
  471. package/eval/local/tasks/comet-full-workflow/environment/wordcount.py +40 -0
  472. package/eval/local/tasks/comet-full-workflow/instruction.md +18 -0
  473. package/eval/local/tasks/comet-full-workflow/task.toml +24 -0
  474. package/eval/local/tasks/comet-full-workflow/validation/test_full_workflow.py +171 -0
  475. package/eval/local/tasks/comet-graph-execution-review/environment/Dockerfile +28 -0
  476. package/eval/local/tasks/comet-graph-execution-review/environment/pipeline.py +19 -0
  477. package/eval/local/tasks/comet-graph-execution-review/environment/test_pipeline.py +53 -0
  478. package/eval/local/tasks/comet-graph-execution-review/instruction.md +21 -0
  479. package/eval/local/tasks/comet-graph-execution-review/task.toml +24 -0
  480. package/eval/local/tasks/comet-graph-execution-review/validation/test_graph_execution_review.py +24 -0
  481. package/eval/local/tasks/comet-human-approval-flow/environment/Dockerfile +15 -0
  482. package/eval/local/tasks/comet-human-approval-flow/environment/approvals.py +17 -0
  483. package/eval/local/tasks/comet-human-approval-flow/environment/test_approvals.py +30 -0
  484. package/eval/local/tasks/comet-human-approval-flow/instruction.md +15 -0
  485. package/eval/local/tasks/comet-human-approval-flow/task.toml +20 -0
  486. package/eval/local/tasks/comet-human-approval-flow/validation/test_human_approval_flow.py +20 -0
  487. package/eval/local/tasks/comet-layered-streaming-fix/environment/Dockerfile +20 -0
  488. package/eval/local/tasks/comet-layered-streaming-fix/environment/chat_app.py +19 -0
  489. package/eval/local/tasks/comet-layered-streaming-fix/environment/test_chat_app.py +15 -0
  490. package/eval/local/tasks/comet-layered-streaming-fix/instruction.md +14 -0
  491. package/eval/local/tasks/comet-layered-streaming-fix/task.toml +20 -0
  492. package/eval/local/tasks/comet-layered-streaming-fix/validation/test_layered_streaming_fix.py +20 -0
  493. package/eval/local/tasks/comet-noise-distractor/environment/Dockerfile +15 -0
  494. package/eval/local/tasks/comet-noise-distractor/environment/distractor.md +4 -0
  495. package/eval/local/tasks/comet-noise-distractor/environment/invoice.py +5 -0
  496. package/eval/local/tasks/comet-noise-distractor/environment/test_invoice.py +18 -0
  497. package/eval/local/tasks/comet-noise-distractor/instruction.md +17 -0
  498. package/eval/local/tasks/comet-noise-distractor/task.toml +20 -0
  499. package/eval/local/tasks/comet-noise-distractor/validation/test_noise_distractor.py +20 -0
  500. package/eval/local/tasks/comet-observability-env-template/environment/Dockerfile +15 -0
  501. package/eval/local/tasks/comet-observability-env-template/environment/env_writer.py +17 -0
  502. package/eval/local/tasks/comet-observability-env-template/environment/test_env_writer.py +17 -0
  503. package/eval/local/tasks/comet-observability-env-template/instruction.md +20 -0
  504. package/eval/local/tasks/comet-observability-env-template/task.toml +20 -0
  505. package/eval/local/tasks/comet-observability-env-template/validation/test_observability_env_template.py +46 -0
  506. package/eval/local/tasks/comet-perf-dedupe/environment/Dockerfile +39 -0
  507. package/eval/local/tasks/comet-perf-dedupe/environment/dedupe.py +22 -0
  508. package/eval/local/tasks/comet-perf-dedupe/environment/test_dedupe.py +43 -0
  509. package/eval/local/tasks/comet-perf-dedupe/instruction.md +25 -0
  510. package/eval/local/tasks/comet-perf-dedupe/task.toml +24 -0
  511. package/eval/local/tasks/comet-perf-dedupe/validation/test_perf_dedupe.py +40 -0
  512. package/eval/local/tasks/comet-persistence-threading/environment/Dockerfile +15 -0
  513. package/eval/local/tasks/comet-persistence-threading/environment/session_store.py +15 -0
  514. package/eval/local/tasks/comet-persistence-threading/environment/test_session_store.py +21 -0
  515. package/eval/local/tasks/comet-persistence-threading/instruction.md +14 -0
  516. package/eval/local/tasks/comet-persistence-threading/task.toml +20 -0
  517. package/eval/local/tasks/comet-persistence-threading/validation/test_persistence_threading.py +20 -0
  518. package/eval/local/tasks/comet-refactor-counter/environment/Dockerfile +39 -0
  519. package/eval/local/tasks/comet-refactor-counter/environment/test_text_processor.py +57 -0
  520. package/eval/local/tasks/comet-refactor-counter/environment/text_processor.py +49 -0
  521. package/eval/local/tasks/comet-refactor-counter/instruction.md +31 -0
  522. package/eval/local/tasks/comet-refactor-counter/task.toml +24 -0
  523. package/eval/local/tasks/comet-refactor-counter/validation/test_refactor_counter.py +75 -0
  524. package/eval/local/tasks/comet-robust-config/environment/Dockerfile +39 -0
  525. package/eval/local/tasks/comet-robust-config/environment/config_loader.py +56 -0
  526. package/eval/local/tasks/comet-robust-config/environment/test_config_loader.py +72 -0
  527. package/eval/local/tasks/comet-robust-config/instruction.md +30 -0
  528. package/eval/local/tasks/comet-robust-config/task.toml +24 -0
  529. package/eval/local/tasks/comet-robust-config/validation/test_robust_config.py +37 -0
  530. package/eval/local/tasks/generic-skill-smoke/environment/Dockerfile +2 -0
  531. package/eval/local/tasks/generic-skill-smoke/instruction.md +7 -0
  532. package/eval/local/tasks/generic-skill-smoke/task.toml +21 -0
  533. package/eval/local/tasks/generic-skill-smoke/validation/test_generic_skill_smoke.py +36 -0
  534. package/eval/local/tasks/index.yaml +155 -0
  535. package/eval/local/tasks/workflow-overlay-contract/environment/Dockerfile +5 -0
  536. package/eval/local/tasks/workflow-overlay-contract/instruction.md +5 -0
  537. package/eval/local/tasks/workflow-overlay-contract/task.toml +21 -0
  538. package/eval/local/tasks/workflow-overlay-contract/validation/test_workflow_overlay_contract.py +235 -0
  539. package/eval/local/tasks/workflow-route-conformance/environment/Dockerfile +2 -0
  540. package/eval/local/tasks/workflow-route-conformance/instruction.md +5 -0
  541. package/eval/local/tasks/workflow-route-conformance/task.toml +21 -0
  542. package/eval/local/tasks/workflow-route-conformance/validation/test_workflow_route_conformance.py +84 -0
  543. package/eval/local/tests/conftest.py +1148 -0
  544. package/eval/local/tests/scaffold/test_attribution.py +48 -0
  545. package/eval/local/tests/scaffold/test_compare_baselines.py +999 -0
  546. package/eval/local/tests/scaffold/test_conftest_helpers.py +534 -0
  547. package/eval/local/tests/scaffold/test_evidence.py +15 -0
  548. package/eval/local/tests/scaffold/test_langsmith_conftest.py +244 -0
  549. package/eval/local/tests/scaffold/test_logging.py +243 -0
  550. package/eval/local/tests/scaffold/test_manifests.py +132 -0
  551. package/eval/local/tests/scaffold/test_profiles.py +866 -0
  552. package/eval/local/tests/scaffold/test_regression_check.py +19 -0
  553. package/eval/local/tests/scaffold/test_report_style_demo_charts.py +45 -0
  554. package/eval/local/tests/scaffold/test_sample_quality.py +211 -0
  555. package/eval/local/tests/scaffold/test_tasks.py +168 -0
  556. package/eval/local/tests/scaffold/test_treatments.py +244 -0
  557. package/eval/local/tests/scaffold/test_utils.py +139 -0
  558. package/eval/local/tests/tasks/test_tasks.py +445 -0
  559. package/eval/local/tests/tasks/test_validation_scripts.py +143 -0
  560. package/eval/local/treatments/comet/comet_full_039.yaml +141 -0
  561. package/eval/local/treatments/comet/comet_full_040_beta.yaml +140 -0
  562. package/eval/local/treatments/common/control.yaml +4 -0
  563. package/eval/pyproject.toml +41 -0
  564. package/eval/report-html-config.json +6 -0
  565. package/eval/scaffold/__init__.py +67 -0
  566. package/eval/scaffold/python/__init__.py +95 -0
  567. package/eval/scaffold/python/attribution.py +43 -0
  568. package/eval/scaffold/python/evidence.py +38 -0
  569. package/eval/scaffold/python/external_data_handler.py +18 -0
  570. package/eval/scaffold/python/generic_llm_judge.py +235 -0
  571. package/eval/scaffold/python/judge_config.py +168 -0
  572. package/eval/scaffold/python/llm_judge.py +191 -0
  573. package/eval/scaffold/python/logging.py +705 -0
  574. package/eval/scaffold/python/manifests.py +129 -0
  575. package/eval/scaffold/python/paper_charts.py +25 -0
  576. package/eval/scaffold/python/pass_at_k.py +107 -0
  577. package/eval/scaffold/python/paths.py +56 -0
  578. package/eval/scaffold/python/profiles.py +127 -0
  579. package/eval/scaffold/python/report_outputs.py +1391 -0
  580. package/eval/scaffold/python/sample_quality.py +339 -0
  581. package/eval/scaffold/python/schema.py +39 -0
  582. package/eval/scaffold/python/skill_parser.py +469 -0
  583. package/eval/scaffold/python/tasks.py +330 -0
  584. package/eval/scaffold/python/treatments.py +271 -0
  585. package/eval/scaffold/python/utils.py +366 -0
  586. package/eval/scaffold/python/validation/__init__.py +21 -0
  587. package/eval/scaffold/python/validation/authoring_rubric.py +326 -0
  588. package/eval/scaffold/python/validation/comet_workflow.py +187 -0
  589. package/eval/scaffold/python/validation/core.py +264 -0
  590. package/eval/scaffold/python/validation/dataset.py +337 -0
  591. package/eval/scaffold/python/validation/docker.py +106 -0
  592. package/eval/scaffold/python/validation/evaluator.py +549 -0
  593. package/eval/scaffold/python/validation/generic_rubric.py +169 -0
  594. package/eval/scaffold/python/validation/rubric.py +740 -0
  595. package/eval/scaffold/python/validation/runner.py +237 -0
  596. package/eval/scaffold/python/validation/scripts.py +58 -0
  597. package/eval/scaffold/python/validation/tracing.py +313 -0
  598. package/eval/scaffold/shell/common.sh +126 -0
  599. package/eval/scaffold/shell/docker.sh +482 -0
  600. package/eval/scaffold/shell/run-claude-loop.sh +181 -0
  601. package/eval/scaffold/shell/setup.sh +259 -0
  602. package/eval/simulator-instruction.md +9 -0
  603. package/package.json +29 -2
  604. package/dist/domains/dashboard/web/assets/index-BcO3_QlT.css +0 -1
  605. package/dist/domains/dashboard/web/assets/index-CjU3VXVu.js +0 -22
@@ -0,0 +1,139 @@
1
+ """Unit tests for eval scaffold utilities."""
2
+
3
+ from pathlib import Path
4
+
5
+ from scaffold.python import utils
6
+ from scaffold.python.skill_parser import load_skill_content, parse_skill_md
7
+
8
+
9
+ def test_execution_validator_converts_structured_checks(monkeypatch, tmp_path: Path):
10
+ def fake_run_eval_in_docker(*_args, **_kwargs):
11
+ return {
12
+ "checks": [
13
+ {"check": "openspec_artifacts", "status": "passed", "message": "found"},
14
+ {"check": "median_fix", "status": "passed", "message": "all tests pass"},
15
+ {"check": "tests_written", "status": "failed", "message": "missing assertions"},
16
+ ]
17
+ }
18
+
19
+ monkeypatch.setattr(utils, "run_eval_in_docker", fake_run_eval_in_docker)
20
+
21
+ validator = utils.make_execution_validator(
22
+ validation_dir=tmp_path,
23
+ test_scripts="test_task.py",
24
+ target_artifacts=[],
25
+ )
26
+
27
+ passed, failed = validator(tmp_path, {"run_id": "abc"})
28
+
29
+ assert passed == [
30
+ "openspec_artifacts: found",
31
+ "median_fix: all tests pass",
32
+ ]
33
+ assert failed == ["tests_written: missing assertions"]
34
+
35
+
36
+ def test_run_shell_decodes_subprocess_output_as_utf8(monkeypatch):
37
+ captured = {}
38
+
39
+ def fake_run(cmd, **kwargs):
40
+ captured["cmd"] = cmd
41
+ captured["kwargs"] = kwargs
42
+
43
+ monkeypatch.setattr(utils.subprocess, "run", fake_run)
44
+
45
+ utils.run_shell("docker.sh", "check", check=False)
46
+
47
+ assert captured["kwargs"]["encoding"] == "utf-8"
48
+ assert captured["kwargs"]["errors"] == "replace"
49
+
50
+
51
+ def test_to_bash_path_uses_msys_drive_prefix_for_git_bash(monkeypatch):
52
+ monkeypatch.setattr(utils.os, "name", "nt")
53
+ monkeypatch.setattr(utils, "BASH_EXEC", r"C:\Program Files\Git\bin\bash.exe")
54
+
55
+ assert utils._to_bash_path(r"D:\Project\Comet\eval") == "/d/Project/Comet/eval"
56
+
57
+
58
+ def test_to_bash_path_uses_wsl_mount_prefix_for_windowsapps_bash(monkeypatch):
59
+ monkeypatch.setattr(utils.os, "name", "nt")
60
+ monkeypatch.setattr(
61
+ utils,
62
+ "BASH_EXEC",
63
+ r"C:\Users\BENYM\AppData\Local\Microsoft\WindowsApps\bash.exe",
64
+ )
65
+
66
+ assert utils._to_bash_path(r"D:\Project\Comet\eval") == "/mnt/d/Project/Comet/eval"
67
+
68
+
69
+ def test_skill_parser_reads_skill_markdown_as_utf8(tmp_path: Path):
70
+ skill_md = tmp_path / "SKILL.md"
71
+ skill_md.write_text(
72
+ "---\nname: utf8-skill\ndescription: Bob’s test\n---\n\n<overview>\n中文内容\n</overview>\n",
73
+ encoding="utf-8",
74
+ )
75
+
76
+ sections = parse_skill_md(skill_md)
77
+
78
+ assert "Bob’s test" in load_skill_content(skill_md)
79
+ assert "中文内容" in sections["overview"]
80
+
81
+
82
+ def test_bash_env_bridges_eval_keys_to_wsl(monkeypatch):
83
+ monkeypatch.setattr(utils.os, "name", "nt")
84
+ monkeypatch.setattr(
85
+ utils,
86
+ "BASH_EXEC",
87
+ r"C:\Users\BENYM\AppData\Local\Microsoft\WindowsApps\bash.exe",
88
+ )
89
+ monkeypatch.setenv("WSLENV", "EXISTING")
90
+ monkeypatch.setenv("ANTHROPIC_AUTH_TOKEN", "token")
91
+ monkeypatch.setenv("ANTHROPIC_BASE_URL", "https://example.test")
92
+ monkeypatch.delenv("ANTHROPIC_API_KEY", raising=False)
93
+
94
+ env = utils._bash_env()
95
+
96
+ names = env["WSLENV"].split(":")
97
+ assert names[:1] == ["EXISTING"]
98
+ assert "ANTHROPIC_AUTH_TOKEN" in names
99
+ assert "ANTHROPIC_BASE_URL" in names
100
+ assert "ANTHROPIC_API_KEY" not in names
101
+
102
+
103
+ def test_bash_env_bridges_langsmith_hook_log_to_wsl(monkeypatch):
104
+ monkeypatch.setattr(utils.os, "name", "nt")
105
+ monkeypatch.setattr(
106
+ utils,
107
+ "BASH_EXEC",
108
+ r"C:\Users\BENYM\AppData\Local\Microsoft\WindowsApps\bash.exe",
109
+ )
110
+ monkeypatch.setenv("CC_LANGSMITH_LOG_FILE", "/workspace/langsmith-hook.log")
111
+
112
+ env = utils._bash_env()
113
+
114
+ assert "CC_LANGSMITH_LOG_FILE" in env["WSLENV"].split(":")
115
+
116
+
117
+ def test_docker_loop_passes_langsmith_plugin_args_to_loop_driver():
118
+ docker_sh = (utils.SHELL_DIR / "docker.sh").read_text(encoding="utf-8")
119
+
120
+ assert '${PLUGIN_CLI_ARGS[@]+"' in docker_sh
121
+ assert 'bash //opt/scaffold-shell/run-claude-loop.sh "$prompt"' in docker_sh
122
+ assert "CC_LANGSMITH_LOG_FILE" in docker_sh
123
+
124
+
125
+ def test_run_claude_fixture_defaults_langsmith_hook_log_path():
126
+ conftest_py = (Path(__file__).resolve().parents[1] / "conftest.py").read_text(
127
+ encoding="utf-8"
128
+ )
129
+
130
+ assert 'os.environ["CC_LANGSMITH_LOG_FILE"] = "/workspace/langsmith-hook.log"' in conftest_py
131
+
132
+
133
+ def test_claude_loop_applies_plugin_args_to_subject_turns_only():
134
+ loop_sh = (utils.SHELL_DIR / "run-claude-loop.sh").read_text(encoding="utf-8")
135
+
136
+ assert "PLUGIN_ARGS=()" in loop_sh
137
+ assert 'claude -p "$PROMPT" "${PLUGIN_ARGS[@]}"' in loop_sh
138
+ assert 'claude -p "$USER_REPLY" "${PLUGIN_ARGS[@]}"' in loop_sh
139
+ assert 'claude -p "$sim_prompt" "${PLUGIN_ARGS[@]}"' not in loop_sh
@@ -0,0 +1,445 @@
1
+ """Generic test runner for comet skill task + treatment combinations.
2
+
3
+ Usage:
4
+ # Run all default task/treatment combinations
5
+ pytest local/tests/tasks/test_tasks.py -v
6
+
7
+ # Run specific task with specific treatment
8
+ pytest local/tests/tasks/test_tasks.py --task=comet-full-workflow --treatment=COMET_FULL_040_BETA -v
9
+
10
+ # Run specific task with multiple treatments (comma-separated)
11
+ pytest local/tests/tasks/test_tasks.py --task=comet-full-workflow --treatment=COMET_FULL_040_BETA,CONTROL -v
12
+
13
+ # Run with repetitions and parallel workers
14
+ pytest local/tests/tasks/test_tasks.py --task=comet-full-workflow --treatment=COMET_FULL_040_BETA --count=2 -n 2 -v
15
+ """
16
+
17
+ import sys
18
+ import uuid
19
+
20
+ import pytest
21
+ import conftest
22
+ from conftest import get_fixtures
23
+
24
+ from scaffold import NoiseTask, Treatment
25
+ from scaffold.python import extract_events, parse_output
26
+ from scaffold.python.profiles import resolve_profile_name, run_profile_rubric
27
+ from scaffold.python.tasks import list_tasks, load_task
28
+ from scaffold.python.treatments import TreatmentConfig, build_treatment_skills, load_treatments
29
+ from scaffold.python.validation import run_validators
30
+
31
+ # Timeouts
32
+ CLAUDE_TIMEOUT = 1500 # 25 minutes for Claude to complete task (multi-turn loop)
33
+ PYTEST_TIMEOUT = 1800 # 30 minutes total including setup/teardown
34
+ MANIFEST_DYNAMIC_ONLY_TASKS = {"workflow-overlay-contract"}
35
+ CONTROL_BUSINESS_ONLY_TREATMENTS = {"CONTROL"}
36
+ COMET_WORKFLOW_ONLY_CHECK_PREFIXES = (
37
+ "openspec_artifacts",
38
+ "comet_state",
39
+ "workflow_phases",
40
+ "tests_written",
41
+ "tests_exist",
42
+ )
43
+
44
+
45
+ # =============================================================================
46
+ # PARAMETRIZE HELPERS
47
+ # =============================================================================
48
+
49
+
50
+ def expand_treatment_patterns(patterns: list[str], all_treatments: dict) -> list[str]:
51
+ """Expand treatment patterns into matching treatment names."""
52
+ treatment_names = list(all_treatments.keys())
53
+ expanded = []
54
+
55
+ for pattern in patterns:
56
+ if pattern.endswith("*"):
57
+ prefix = pattern[:-1]
58
+ matches = [t for t in treatment_names if t.startswith(prefix)]
59
+ if not matches:
60
+ raise ValueError(
61
+ f"No treatments match pattern: {pattern}. Available: {treatment_names}"
62
+ )
63
+ expanded.extend(matches)
64
+ else:
65
+ if pattern not in all_treatments:
66
+ raise ValueError(f"Treatment not found: {pattern}. Available: {treatment_names}")
67
+ expanded.append(pattern)
68
+
69
+ return list(dict.fromkeys(expanded))
70
+
71
+
72
+ def generate_test_params(task_filter: str | None, treatment_filter: str | None, config=None):
73
+ """Generate (task_name, treatment_name) pairs based on filters."""
74
+ params = []
75
+ all_treatments = load_treatments()
76
+ all_tasks = list_tasks()
77
+ dynamic = None
78
+
79
+ if config is not None:
80
+ dynamic = conftest._get_dynamic_treatment_config(config)
81
+ if dynamic:
82
+ all_treatments[dynamic.name] = dynamic
83
+ manifest_tasks = None
84
+ manifest_baseline_treatments = []
85
+ if config is not None and config.getoption("--eval-manifest"):
86
+ from scaffold.python.manifests import load_eval_manifest
87
+
88
+ manifest = load_eval_manifest(config.getoption("--eval-manifest"))
89
+ manifest_tasks = manifest.recommended_tasks
90
+ manifest_baseline_treatments = manifest.baseline_treatments
91
+
92
+ if task_filter and task_filter not in all_tasks:
93
+ raise ValueError(f"Task not found: {task_filter}. Available: {all_tasks}")
94
+
95
+ treatment_list = []
96
+ if treatment_filter:
97
+ patterns = [t.strip() for t in treatment_filter.split(",")]
98
+ treatment_list = expand_treatment_patterns(patterns, all_treatments)
99
+ elif dynamic and manifest_tasks:
100
+ treatment_list = [
101
+ treatment
102
+ for treatment in manifest_baseline_treatments
103
+ if treatment in all_treatments
104
+ ]
105
+ if dynamic.name not in treatment_list:
106
+ treatment_list.append(dynamic.name)
107
+ elif dynamic:
108
+ treatment_list = [dynamic.name]
109
+
110
+ tasks_to_run = [task_filter] if task_filter else (manifest_tasks or all_tasks)
111
+
112
+ for task_name in tasks_to_run:
113
+ task = load_task(task_name)
114
+ task_treatments = treatment_list
115
+ if (
116
+ dynamic
117
+ and manifest_tasks
118
+ and not treatment_filter
119
+ and task_name in MANIFEST_DYNAMIC_ONLY_TASKS
120
+ ):
121
+ task_treatments = [dynamic.name]
122
+ if task_treatments:
123
+ for treatment_name in task_treatments:
124
+ params.append((task_name, treatment_name))
125
+ else:
126
+ for treatment_name in task.default_treatments:
127
+ if treatment_name in all_treatments:
128
+ params.append((task_name, treatment_name))
129
+
130
+ return params
131
+
132
+
133
+ def _is_control_business_only_run(profile_name: str, treatment_name: str) -> bool:
134
+ return profile_name == "comet-workflow" and treatment_name in CONTROL_BUSINESS_ONLY_TREATMENTS
135
+
136
+
137
+ def _filter_control_workflow_checks(
138
+ profile_name: str,
139
+ treatment_name: str,
140
+ passed: list[str],
141
+ failed: list[str],
142
+ ) -> tuple[list[str], list[str]]:
143
+ """For CONTROL, evaluate comet tasks by business outcome only.
144
+
145
+ CONTROL intentionally has no Skill mounted. OpenSpec/Comet state, phase
146
+ evidence, and workflow-test discipline are reported by the rubric as
147
+ non-applicable instead of counted as task failures.
148
+ """
149
+ if not _is_control_business_only_run(profile_name, treatment_name):
150
+ return passed, failed
151
+
152
+ def keep(check: str) -> bool:
153
+ return not any(check.startswith(prefix) for prefix in COMET_WORKFLOW_ONLY_CHECK_PREFIXES)
154
+
155
+ return [check for check in passed if keep(check)], [check for check in failed if keep(check)]
156
+
157
+
158
+ def _split_comet_completion_checks(
159
+ passed: list[str],
160
+ failed: list[str],
161
+ ) -> dict[str, dict[str, list[str]]]:
162
+ """Split validator results into business and workflow completion buckets."""
163
+
164
+ def is_workflow_check(check: str) -> bool:
165
+ return any(check.startswith(prefix) for prefix in COMET_WORKFLOW_ONLY_CHECK_PREFIXES)
166
+
167
+ return {
168
+ "business_completion": {
169
+ "passed": [check for check in passed if not is_workflow_check(check)],
170
+ "failed": [check for check in failed if not is_workflow_check(check)],
171
+ },
172
+ "workflow_completion": {
173
+ "passed": [check for check in passed if is_workflow_check(check)],
174
+ "failed": [check for check in failed if is_workflow_check(check)],
175
+ },
176
+ }
177
+
178
+
179
+ def test_eval_manifest_baselines_extend_dynamic_treatment_list(tmp_path, monkeypatch):
180
+ package = tmp_path / "manifest-skill"
181
+ package.mkdir()
182
+ (package / "SKILL.md").write_text("---\nname: manifest-skill\n---\n\nBody.", encoding="utf-8")
183
+ comet_dir = package / "comet"
184
+ comet_dir.mkdir()
185
+ manifest = comet_dir / "eval.yaml"
186
+ manifest.write_text(
187
+ """
188
+ apiVersion: comet.eval/v1alpha1
189
+ kind: SkillEvalManifest
190
+ metadata:
191
+ name: manifest-skill
192
+ skill:
193
+ name: manifest-skill
194
+ source: ..
195
+ evaluation:
196
+ recommendedTasks:
197
+ - generic-skill-smoke
198
+ - workflow-overlay-contract
199
+ baselineTreatments:
200
+ - CONTROL
201
+ - COMET_FULL_040_BETA
202
+ - MISSING_BASELINE
203
+ interaction:
204
+ mode: none
205
+ """,
206
+ encoding="utf-8",
207
+ )
208
+
209
+ class Config:
210
+ def getoption(self, name):
211
+ return {"--eval-manifest": str(manifest)}.get(name)
212
+
213
+ monkeypatch.setattr(
214
+ sys.modules[__name__],
215
+ "load_treatments",
216
+ lambda: {
217
+ "CONTROL": TreatmentConfig(name="CONTROL", description="Control"),
218
+ "COMET_FULL_040_BETA": TreatmentConfig(name="COMET_FULL_040_BETA", description="Comet full"),
219
+ },
220
+ )
221
+
222
+ params = generate_test_params("generic-skill-smoke", None, Config())
223
+
224
+ assert params == [
225
+ ("generic-skill-smoke", "CONTROL"),
226
+ ("generic-skill-smoke", "COMET_FULL_040_BETA"),
227
+ ("generic-skill-smoke", "DYNAMIC_SKILL"),
228
+ ]
229
+
230
+ assert generate_test_params("workflow-overlay-contract", None, Config()) == [
231
+ ("workflow-overlay-contract", "DYNAMIC_SKILL")
232
+ ]
233
+ assert generate_test_params(None, None, Config()) == [
234
+ ("generic-skill-smoke", "CONTROL"),
235
+ ("generic-skill-smoke", "COMET_FULL_040_BETA"),
236
+ ("generic-skill-smoke", "DYNAMIC_SKILL"),
237
+ ("workflow-overlay-contract", "DYNAMIC_SKILL"),
238
+ ]
239
+
240
+
241
+ def test_control_comet_workflow_filters_workflow_only_checks():
242
+ passed, failed = _filter_control_workflow_checks(
243
+ "comet-workflow",
244
+ "CONTROL",
245
+ ["sentence_feature", "tests_written: ok", "workflow_phases: 5/5", "tests_exist"],
246
+ [
247
+ "openspec_artifacts: openspec/changes/ directory not found",
248
+ "comet_state: No .comet.yaml found",
249
+ "workflow_phases: Only 1/5 phases",
250
+ "tests_written: No test files written by the agent",
251
+ "tests_exist: No test files found",
252
+ "sentence_feature: --sentences flag not found",
253
+ ],
254
+ )
255
+
256
+ assert passed == ["sentence_feature"]
257
+ assert failed == ["sentence_feature: --sentences flag not found"]
258
+
259
+
260
+ def test_split_comet_completion_checks_separates_business_and_workflow():
261
+ completion = _split_comet_completion_checks(
262
+ ["sentence_feature", "tests_exist", "workflow_phases: 5/5"],
263
+ [
264
+ "openspec_artifacts: missing",
265
+ "comet_state: missing",
266
+ "business_rule: failed",
267
+ ],
268
+ )
269
+
270
+ assert completion["business_completion"] == {
271
+ "passed": ["sentence_feature"],
272
+ "failed": ["business_rule: failed"],
273
+ }
274
+ assert completion["workflow_completion"] == {
275
+ "passed": ["tests_exist", "workflow_phases: 5/5"],
276
+ "failed": ["openspec_artifacts: missing", "comet_state: missing"],
277
+ }
278
+
279
+
280
+ def test_control_filter_does_not_apply_to_comet_treatment():
281
+ passed, failed = _filter_control_workflow_checks(
282
+ "comet-workflow",
283
+ "COMET_FULL_040_BETA",
284
+ [],
285
+ ["openspec_artifacts: missing"],
286
+ )
287
+
288
+ assert passed == []
289
+ assert failed == ["openspec_artifacts: missing"]
290
+
291
+
292
+ def pytest_generate_tests(metafunc):
293
+ """Dynamically parametrize tests based on CLI options.
294
+
295
+ ``--count N`` repeats each (task, treatment) pair N times so the report can
296
+ compute pass-rate distributions instead of a single noisy sample.
297
+ """
298
+ if "task_name" in metafunc.fixturenames and "treatment_name" in metafunc.fixturenames:
299
+ task_filter = metafunc.config.getoption("--task")
300
+ treatment_filter = metafunc.config.getoption("--treatment")
301
+ count = int(metafunc.config.getoption("--count") or 1)
302
+ base_params = generate_test_params(task_filter, treatment_filter, metafunc.config)
303
+ # pytest ids stay (task, treatment); the rep number is tracked separately
304
+ # by the experiment plugin's get_rep_number per treatment. To force N
305
+ # distinct test invocations we append a rep suffix to the param id.
306
+ params = []
307
+ for rep in range(count):
308
+ for task_name, treatment_name in base_params:
309
+ params.append(pytest.param(task_name, treatment_name, id=f"{task_name}-{treatment_name}-r{rep+1}"))
310
+ metafunc.parametrize("task_name,treatment_name", params)
311
+
312
+
313
+ # =============================================================================
314
+ # TEST
315
+ # =============================================================================
316
+
317
+
318
+ @pytest.mark.timeout(PYTEST_TIMEOUT)
319
+ def test_task_treatment(task_name, treatment_name):
320
+ """Run a task with a treatment and validate results."""
321
+ fixtures = get_fixtures()
322
+ task = load_task(task_name)
323
+ treatments = load_treatments()
324
+ dynamic = conftest._get_dynamic_treatment_config(fixtures.request_config)
325
+ if dynamic:
326
+ treatments[dynamic.name] = dynamic
327
+ if treatment_name not in treatments:
328
+ pytest.skip(f"Treatment {treatment_name} not found")
329
+ treatment_cfg = treatments[treatment_name]
330
+ skill_hints = treatment_cfg.skills[0] if treatment_cfg.skills else {}
331
+ validators = task.load_validators()
332
+
333
+ skills = build_treatment_skills(treatment_cfg.skills) if treatment_cfg.skills else {}
334
+ skill_sources = [
335
+ skill.get("source")
336
+ for skill in skills.values()
337
+ if isinstance(skill, dict) and skill.get("source")
338
+ ]
339
+ eval_manifest = next(
340
+ (cfg.get("manifest") for cfg in treatment_cfg.skills if cfg.get("manifest")),
341
+ None,
342
+ )
343
+ treatment = Treatment(
344
+ description=treatment_cfg.description,
345
+ skills=skills,
346
+ claude_md=treatment_cfg.claude_md if treatment_cfg.claude_md else None,
347
+ )
348
+
349
+ run_id = str(uuid.uuid4())
350
+
351
+ template_vars = {"run_id": run_id}
352
+ for var_name, var_template in task.config.setup.template_vars.items():
353
+ template_vars[var_name] = var_template.format(run_id=run_id)
354
+
355
+ prompt = task.render_prompt(**template_vars)
356
+ target_profile = None
357
+ if treatment_cfg.skills:
358
+ target_profile = treatment_cfg.skills[0].get("profile")
359
+ profile_name = resolve_profile_name(
360
+ task,
361
+ override=fixtures.request_config.getoption("--profile"),
362
+ target_profile=target_profile,
363
+ )
364
+ fixtures.setup_test_context(
365
+ skills=treatment.skills,
366
+ claude_md=conftest._build_eval_claude_md(profile_name, treatment.claude_md),
367
+ environment_dir=task.environment_dir,
368
+ )
369
+ interaction = conftest._resolve_interaction_config(task, profile_name, fixtures.request_config)
370
+ skill_package_path = (
371
+ conftest._snapshot_dynamic_skill_package(fixtures.test_dir, skill_hints)
372
+ or skill_hints.get("path")
373
+ )
374
+
375
+ result = fixtures.run_claude(prompt, timeout=CLAUDE_TIMEOUT, interaction=interaction)
376
+
377
+ events = extract_events(parse_output(result.stdout))
378
+ outputs = {
379
+ "run_id": run_id,
380
+ "treatment_name": treatment_name,
381
+ "events": events,
382
+ "profile": profile_name,
383
+ "skill_sources": skill_sources,
384
+ "eval_manifest": eval_manifest,
385
+ "required_skills": skill_hints.get("required_skills")
386
+ or task.config.evaluation.required_skills,
387
+ "expected_artifacts": skill_hints.get("expected_artifacts")
388
+ or task.config.evaluation.expected_artifacts,
389
+ "require_skill_invocation": task.config.evaluation.require_skill_invocation,
390
+ "rubric_criteria": task.config.evaluation.rubric_criteria,
391
+ "skill_package_path": skill_package_path,
392
+ "generated_node_skills": skill_hints.get("generated_node_skills") or [],
393
+ "route_conformance_task": skill_hints.get("route_conformance_task"),
394
+ "route_conformance_expected_node_order": (
395
+ skill_hints.get("route_conformance_expected_node_order") or []
396
+ ),
397
+ "baseline_treatments": skill_hints.get("baseline_treatments") or [],
398
+ "quality_gates": skill_hints.get("quality_gates") or {},
399
+ "required_output_schemas": skill_hints.get("required_output_schemas") or [],
400
+ "expected_evidence": skill_hints.get("expected_evidence") or [],
401
+ "draft_hash": skill_hints.get("draft_hash"),
402
+ "interaction": {
403
+ "mode": interaction.mode,
404
+ "max_turns": interaction.max_turns,
405
+ },
406
+ }
407
+ events["profile"] = outputs["profile"]
408
+ events["skill_sources"] = outputs["skill_sources"]
409
+ events["eval_manifest"] = outputs["eval_manifest"]
410
+ events["interaction"] = outputs["interaction"]
411
+
412
+ passed, failed = run_validators(validators, fixtures.test_dir, outputs)
413
+ completion_slices = _split_comet_completion_checks(passed, failed)
414
+ passed, failed = _filter_control_workflow_checks(
415
+ profile_name,
416
+ treatment_name,
417
+ passed,
418
+ failed,
419
+ )
420
+
421
+ # Rubric scoring: feed the baseline validator outcome as the "completion"
422
+ # dimension input, then append the eight [RUBRIC] messages as informational
423
+ # checks (they never produce hard failures).
424
+ rubric_outputs = dict(outputs)
425
+ rubric_outputs["completion"] = {"passed": passed, "failed": failed}
426
+ if profile_name == "comet-workflow":
427
+ rubric_outputs.update(completion_slices)
428
+ if _is_control_business_only_run(profile_name, treatment_name):
429
+ rubric_outputs["workflow_completion"] = {"passed": [], "failed": []}
430
+ rubric_passed, rubric_failed = run_profile_rubric(profile_name, fixtures.test_dir, rubric_outputs)
431
+ passed = passed + rubric_passed
432
+ failed = failed + rubric_failed
433
+
434
+ fixtures.record_result(
435
+ events,
436
+ passed,
437
+ failed,
438
+ run_id=run_id,
439
+ returncode=result.returncode,
440
+ stdout=result.stdout,
441
+ stderr=result.stderr,
442
+ )
443
+
444
+ if failed:
445
+ pytest.fail(f"Validation failed: {failed}")