@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,187 @@
1
+ """LangSmith eval suite pytest configuration.
2
+
3
+ This suite reuses the local task corpus by default and writes reports under
4
+ eval/langsmith/logs. LangSmith-specific environment checks live here so local
5
+ runs stay free of LangSmith requirements.
6
+ """
7
+
8
+ import importlib.util
9
+ import os
10
+ import subprocess
11
+ from pathlib import Path
12
+
13
+ import pytest
14
+ from dotenv import load_dotenv
15
+ from scaffold.python.utils import _to_bash_path
16
+
17
+ LANGSMITH_ROOT = Path(__file__).resolve().parents[1]
18
+ EVAL_ROOT = LANGSMITH_ROOT.parent
19
+ LOCAL_ROOT = EVAL_ROOT / "local"
20
+ DEFAULT_LANGSMITH_PLUGIN_DIR = EVAL_ROOT / ".cache" / "langsmith-cc-plugin"
21
+
22
+ os.environ.setdefault("BENCH_SUITE_ROOT", str(LANGSMITH_ROOT))
23
+ os.environ.setdefault("BENCH_TASKS_DIR", str(LOCAL_ROOT / "tasks"))
24
+ os.environ.setdefault("BENCH_TREATMENTS_DIR", str(LOCAL_ROOT / "treatments"))
25
+ os.environ.setdefault("BENCH_SKILLS_DIR", str(LOCAL_ROOT / "skills"))
26
+ os.environ.setdefault("BENCH_LOGS_DIR", str(LANGSMITH_ROOT / "logs"))
27
+ # Group every run in this suite under one LangSmith dataset/test-suite by default.
28
+ os.environ.setdefault("LANGSMITH_TEST_SUITE", "comet-skill-eval")
29
+
30
+ load_dotenv(EVAL_ROOT / ".env")
31
+ load_dotenv(LANGSMITH_ROOT / ".env", override=True)
32
+
33
+
34
+ def configure_langsmith_environment() -> None:
35
+ """Derive Claude Code plugin env from the eval suite's LangSmith config."""
36
+ os.environ.setdefault("LANGSMITH_TRACING", "true")
37
+ os.environ.setdefault(
38
+ "TRACE_TO_LANGSMITH",
39
+ "true" if os.environ.get("LANGSMITH_TRACING", "").lower() == "true" else "false",
40
+ )
41
+ os.environ.setdefault("LANGSMITH_PROJECT", "comet-skill-eval")
42
+
43
+ api_key = os.environ.get("LANGSMITH_API_KEY", "")
44
+ if api_key:
45
+ os.environ.setdefault("CC_LANGSMITH_API_KEY", api_key)
46
+ os.environ.setdefault("CC_LANGSMITH_PROJECT", os.environ["LANGSMITH_PROJECT"])
47
+
48
+
49
+ configure_langsmith_environment()
50
+
51
+ _LOCAL_CONFTEST = LOCAL_ROOT / "tests" / "conftest.py"
52
+ _spec = importlib.util.spec_from_file_location("_comet_local_conftest", _LOCAL_CONFTEST)
53
+ _local_conftest = importlib.util.module_from_spec(_spec)
54
+ assert _spec and _spec.loader
55
+ _spec.loader.exec_module(_local_conftest)
56
+
57
+ for _name in dir(_local_conftest):
58
+ if not _name.startswith("__") and _name not in globals():
59
+ globals()[_name] = getattr(_local_conftest, _name)
60
+
61
+
62
+ @pytest.fixture(scope="session", autouse=True)
63
+ def verify_langsmith_environment(request):
64
+ """Require LangSmith credentials only for non-unit LangSmith eval runs."""
65
+ if _local_conftest._is_unit_tests_only(request.config):
66
+ return
67
+ if not os.environ.get("LANGSMITH_API_KEY"):
68
+ pytest.skip("LANGSMITH_API_KEY not set")
69
+
70
+
71
+ def _build_default_langsmith_plugin(target_dir: Path) -> bool:
72
+ """Build the official Claude Code LangSmith plugin into eval/.cache."""
73
+ target_dir.parent.mkdir(parents=True, exist_ok=True)
74
+ mount_arg = f"{target_dir.parent}:/out"
75
+ command = (
76
+ "set -e; "
77
+ "cd /tmp; "
78
+ "git clone --depth 1 https://github.com/langchain-ai/langsmith-claude-code-plugins; "
79
+ "cd langsmith-claude-code-plugins; "
80
+ "corepack enable; "
81
+ "pnpm install; "
82
+ "pnpm build; "
83
+ "rm -rf /out/langsmith-cc-plugin; "
84
+ "cp -r . /out/langsmith-cc-plugin"
85
+ )
86
+ result = subprocess.run(
87
+ ["docker", "run", "--rm", "-v", mount_arg, "node:20", "sh", "-c", command],
88
+ capture_output=True,
89
+ text=True,
90
+ timeout=600,
91
+ )
92
+ if result.returncode == 0:
93
+ return True
94
+ print("[langsmith] failed to auto-build Claude Code tracing plugin.")
95
+ if result.stdout.strip():
96
+ print(result.stdout.strip())
97
+ if result.stderr.strip():
98
+ print(result.stderr.strip())
99
+ return False
100
+
101
+
102
+ def _plugin_dir_env_value(plugin_dir: Path) -> str:
103
+ """Return a plugin path value that docker.sh can test and mount from bash."""
104
+ return _to_bash_path(plugin_dir)
105
+
106
+
107
+ def provision_langsmith_plugin_dir() -> Path | None:
108
+ """Resolve or auto-build the official Claude Code LangSmith plugin directory."""
109
+ configure_langsmith_environment()
110
+ if os.environ.get("TRACE_TO_LANGSMITH", "").lower() != "true":
111
+ return None
112
+
113
+ explicit_dir = os.environ.get("CC_LANGSMITH_PLUGIN_DIR", "").strip()
114
+ if explicit_dir:
115
+ plugin_dir = Path(explicit_dir)
116
+ if plugin_dir.is_dir():
117
+ os.environ["CC_LANGSMITH_PLUGIN_DIR"] = _plugin_dir_env_value(plugin_dir)
118
+ return plugin_dir
119
+ print(
120
+ f"[langsmith] CC_LANGSMITH_PLUGIN_DIR not a directory ({plugin_dir}); "
121
+ "falling back to the eval plugin cache."
122
+ )
123
+ os.environ.pop("CC_LANGSMITH_PLUGIN_DIR", None)
124
+
125
+ plugin_dir = DEFAULT_LANGSMITH_PLUGIN_DIR
126
+ if plugin_dir.is_dir():
127
+ os.environ["CC_LANGSMITH_PLUGIN_DIR"] = _plugin_dir_env_value(plugin_dir)
128
+ return plugin_dir
129
+
130
+ if os.environ.get("CC_LANGSMITH_PLUGIN_AUTO_BUILD", "true").lower() in {
131
+ "0",
132
+ "false",
133
+ "no",
134
+ }:
135
+ print(
136
+ "[langsmith] trajectory tracing disabled: "
137
+ "CC_LANGSMITH_PLUGIN_AUTO_BUILD=false and no plugin directory was provided."
138
+ )
139
+ return None
140
+
141
+ print(
142
+ "[langsmith] building Claude Code tracing plugin into "
143
+ f"{plugin_dir} via node:20..."
144
+ )
145
+ if _build_default_langsmith_plugin(plugin_dir) and plugin_dir.is_dir():
146
+ os.environ["CC_LANGSMITH_PLUGIN_DIR"] = _plugin_dir_env_value(plugin_dir)
147
+ return plugin_dir
148
+
149
+ os.environ.pop("CC_LANGSMITH_PLUGIN_DIR", None)
150
+ return None
151
+
152
+
153
+ @pytest.fixture(scope="session", autouse=True)
154
+ def provision_langsmith_tracing(request):
155
+ """Wire the official langsmith-tracing Claude Code plugin, best-effort.
156
+
157
+ Results logging (rubric scores + treatment comparison) only needs a
158
+ LANGSMITH_API_KEY. Trajectory tracing additionally needs the prebuilt
159
+ ``langsmith-tracing`` plugin, provided via ``CC_LANGSMITH_PLUGIN_DIR``
160
+ (host path). When it is missing we log once and continue without the
161
+ nested Claude Code trajectory instead of failing the run.
162
+ """
163
+ if _local_conftest._is_unit_tests_only(request.config):
164
+ return
165
+
166
+ plugin_dir = provision_langsmith_plugin_dir()
167
+ if plugin_dir:
168
+ print(f"[langsmith] trajectory tracing enabled via plugin: {plugin_dir}")
169
+ else:
170
+ print(
171
+ "[langsmith] trajectory tracing disabled "
172
+ "(rubric + comparison still logged)."
173
+ )
174
+
175
+
176
+ @pytest.fixture(scope="session")
177
+ def langsmith_experiment_metadata():
178
+ """Attach suite metadata to each LangSmith experiment (project).
179
+
180
+ Read by the LangSmith pytest plugin (requires langsmith>=0.7.13); ignored by
181
+ older versions.
182
+ """
183
+ return {
184
+ "suite": "comet-skill-eval",
185
+ "cc_model": os.environ.get("BENCH_CC_MODEL", "cli-default"),
186
+ "cc_version": os.environ.get("BENCH_CC_VERSION", "latest"),
187
+ }
@@ -0,0 +1,287 @@
1
+ """LangSmith suite task runner.
2
+
3
+ Wraps the local task runner with LangSmith's pytest integration. Each
4
+ ``(task, treatment)`` run syncs to a LangSmith dataset example + experiment:
5
+
6
+ - ``log_inputs`` / ``log_reference_outputs`` capture the task prompt and the
7
+ ground-truth expectations (expected artifacts, required skills, rubric).
8
+ - ``log_outputs`` captures the run's efficiency metrics and invoked skills.
9
+ - ``log_feedback`` reports each rubric dimension score (and the check pass rate),
10
+ so CONTROL vs skill-injected treatments compare directly in the experiment view.
11
+ - Trajectory tracing (official ``langsmith-tracing`` Claude Code plugin) nests
12
+ under the same run via ``CC_LANGSMITH_PARENT_DOTTED_ORDER`` when a prebuilt
13
+ plugin dir is provided through ``CC_LANGSMITH_PLUGIN_DIR``.
14
+
15
+ The local suite stays completely free of any LangSmith import; this module only
16
+ adds a thin logging wrapper around the unchanged local runner.
17
+ """
18
+
19
+ import importlib.util
20
+ import json
21
+ import os
22
+ import sys
23
+ from pathlib import Path
24
+
25
+ import pytest
26
+
27
+ from scaffold.python.tasks import load_task
28
+ from scaffold.python.logging import TreatmentResult
29
+
30
+ # ---------------------------------------------------------------------------
31
+ # Load the local runner as a module (do NOT re-export its test_task_treatment;
32
+ # we wrap it below). pytest_generate_tests and any non-task unit tests are
33
+ # re-exported unchanged so parametrization and coverage stay identical.
34
+ # ---------------------------------------------------------------------------
35
+ _LOCAL_TEST_TASKS = (
36
+ Path(__file__).resolve().parents[3] / "local" / "tests" / "tasks" / "test_tasks.py"
37
+ )
38
+ _spec = importlib.util.spec_from_file_location("_comet_local_test_tasks", _LOCAL_TEST_TASKS)
39
+ _local_test_tasks = importlib.util.module_from_spec(_spec)
40
+ assert _spec and _spec.loader
41
+ sys.modules[_spec.name] = _local_test_tasks
42
+ _spec.loader.exec_module(_local_test_tasks)
43
+
44
+ pytest_generate_tests = _local_test_tasks.pytest_generate_tests
45
+ for _name in dir(_local_test_tasks):
46
+ if _name.startswith("test_") and _name != "test_task_treatment":
47
+ globals()[_name] = getattr(_local_test_tasks, _name)
48
+
49
+ PYTEST_TIMEOUT = _local_test_tasks.PYTEST_TIMEOUT
50
+ _run_local_task_treatment = _local_test_tasks.test_task_treatment
51
+
52
+ # LangSmith helpers are optional; degrade to a plain pass-through when the
53
+ # ``langsmith`` extra is not installed so collection never crashes.
54
+ try:
55
+ from langsmith import testing as ls_testing
56
+ from langsmith import get_current_run_tree
57
+ from langsmith.testing import _internal as ls_testing_internal
58
+
59
+ _LANGSMITH_AVAILABLE = True
60
+ except Exception: # pragma: no cover - import guard
61
+ ls_testing = None
62
+ get_current_run_tree = None
63
+ ls_testing_internal = None
64
+ _LANGSMITH_AVAILABLE = False
65
+
66
+ try:
67
+ from scaffold.python.logging import _rubric_scores as _extract_rubric_scores
68
+ except Exception: # pragma: no cover - fallback if private helper moves
69
+ import re as _re
70
+
71
+ _RUBRIC_RE = _re.compile(r"\[RUBRIC\]\s+(\S+):\s*([0-9.]+)")
72
+
73
+ def _extract_rubric_scores(result):
74
+ scores = {}
75
+ for check in getattr(result, "checks_passed", []):
76
+ match = _RUBRIC_RE.search(check)
77
+ if match:
78
+ try:
79
+ scores[match.group(1)] = float(match.group(2))
80
+ except ValueError:
81
+ continue
82
+ return scores
83
+
84
+
85
+ # =============================================================================
86
+ # LANGSMITH LOGGING HELPERS (all best-effort; never break the eval run)
87
+ # =============================================================================
88
+
89
+
90
+ def _safe(fn, label=None):
91
+ """Call a LangSmith logging fn, swallowing errors so tracing never fails a run."""
92
+ try:
93
+ fn()
94
+ except Exception as exc: # pragma: no cover - defensive
95
+ if label:
96
+ print(f"[langsmith] {label} failed: {exc}", file=sys.stderr)
97
+
98
+
99
+ def _install_failed_end_run_outputs_patch():
100
+ """Preserve log_outputs payloads when LangSmith ends a failed pytest run."""
101
+ if not _LANGSMITH_AVAILABLE or ls_testing_internal is None:
102
+ return
103
+ test_case_cls = getattr(ls_testing_internal, "_TestCase", None)
104
+ if test_case_cls is None:
105
+ return
106
+ original = getattr(test_case_cls, "end_run", None)
107
+ if original is None or getattr(original, "_comet_preserve_logged_outputs", False):
108
+ return
109
+
110
+ def end_run(self, run_tree, outputs):
111
+ if outputs is None and getattr(self, "_logged_outputs", None) is not None:
112
+ outputs = self._logged_outputs
113
+ return original(self, run_tree, outputs)
114
+
115
+ end_run._comet_preserve_logged_outputs = True
116
+ end_run._comet_original = original
117
+ test_case_cls.end_run = end_run
118
+
119
+
120
+ _install_failed_end_run_outputs_patch()
121
+
122
+
123
+ def _log_inputs_and_reference(task_name, treatment_name):
124
+ if not _LANGSMITH_AVAILABLE:
125
+ return
126
+ try:
127
+ task = load_task(task_name)
128
+ evaluation = task.config.evaluation
129
+ _safe(
130
+ lambda: ls_testing.log_inputs(
131
+ {
132
+ "task": task_name,
133
+ "treatment": treatment_name,
134
+ "difficulty": getattr(task.config.metadata, "difficulty", None),
135
+ }
136
+ )
137
+ )
138
+ _safe(
139
+ lambda: ls_testing.log_reference_outputs(
140
+ {
141
+ "expected_artifacts": list(evaluation.expected_artifacts or []),
142
+ "required_skills": list(evaluation.required_skills or []),
143
+ "rubric_criteria": list(evaluation.rubric_criteria or []),
144
+ }
145
+ )
146
+ )
147
+ except Exception: # pragma: no cover - defensive
148
+ pass
149
+
150
+
151
+ def _set_parent_run_env():
152
+ """Point the Claude Code plugin at this test's run so its trajectory nests here."""
153
+ if not _LANGSMITH_AVAILABLE or get_current_run_tree is None:
154
+ return None
155
+ try:
156
+ run_tree = get_current_run_tree()
157
+ dotted_order = getattr(run_tree, "dotted_order", None) if run_tree else None
158
+ except Exception: # pragma: no cover - defensive
159
+ dotted_order = None
160
+ if dotted_order:
161
+ os.environ["CC_LANGSMITH_PARENT_DOTTED_ORDER"] = dotted_order
162
+ return dotted_order
163
+
164
+
165
+ def _result_from_logger(logger, treatment_name):
166
+ runs = logger.results.get(treatment_name) or []
167
+ if runs:
168
+ return runs[-1]
169
+
170
+ parametrized_suffix = f"-{treatment_name}-"
171
+ for result_name, result_runs in reversed(list(logger.results.items())):
172
+ if result_name == treatment_name or parametrized_suffix in result_name:
173
+ return result_runs[-1] if result_runs else None
174
+ return None
175
+
176
+
177
+ def _iter_result_loggers():
178
+ seen = set()
179
+ candidates = [
180
+ getattr(_local_test_tasks, "conftest", None),
181
+ sys.modules.get("conftest"),
182
+ sys.modules.get("_comet_local_conftest"),
183
+ ]
184
+ for module in candidates:
185
+ plugin = getattr(module, "_plugin", None) if module else None
186
+ logger = getattr(plugin, "logger", None) if plugin else None
187
+ if logger is not None and id(logger) not in seen:
188
+ seen.add(id(logger))
189
+ yield logger
190
+
191
+
192
+ def _latest_report_result(treatment_name):
193
+ logs_dir = Path(os.environ.get("BENCH_LOGS_DIR", ""))
194
+ if not logs_dir:
195
+ return None
196
+ reports_root = logs_dir / "experiments"
197
+ if not reports_root.exists():
198
+ return None
199
+ parametrized_suffix = f"-{treatment_name}-"
200
+ report_files = sorted(
201
+ reports_root.glob("*/reports/*_report.json"),
202
+ key=lambda path: path.stat().st_mtime,
203
+ reverse=True,
204
+ )
205
+ for report_file in report_files:
206
+ try:
207
+ report = json.loads(report_file.read_text())
208
+ except Exception:
209
+ continue
210
+ result_name = report.get("name", "")
211
+ if result_name != treatment_name and parametrized_suffix not in result_name:
212
+ continue
213
+ return TreatmentResult(
214
+ name=result_name,
215
+ passed=report.get("passed", False),
216
+ checks_passed=report.get("checks_passed", []),
217
+ checks_failed=report.get("checks_failed", []),
218
+ events_summary=report.get("events_summary", {}),
219
+ run_id=report.get("run_id", ""),
220
+ )
221
+ return None
222
+
223
+
224
+ def _latest_result(treatment_name):
225
+ for logger in _iter_result_loggers():
226
+ result = _result_from_logger(logger, treatment_name)
227
+ if result is not None:
228
+ return result
229
+ return _latest_report_result(treatment_name)
230
+
231
+
232
+ def _log_outputs_and_feedback(result):
233
+ if not _LANGSMITH_AVAILABLE:
234
+ return
235
+ if result is None:
236
+ print("[langsmith] no local eval result found; outputs/feedback not logged.", file=sys.stderr)
237
+ return
238
+ summary = getattr(result, "events_summary", {}) or {}
239
+ outputs = {
240
+ "run_id": getattr(result, "run_id", ""),
241
+ "passed": getattr(result, "passed", None),
242
+ "checks_passed": len(getattr(result, "checks_passed", [])),
243
+ "checks_failed": len(getattr(result, "checks_failed", [])),
244
+ "num_turns": summary.get("num_turns"),
245
+ "tool_calls": summary.get("tool_calls"),
246
+ "duration_seconds": summary.get("duration_seconds"),
247
+ "total_tokens": summary.get("total_tokens"),
248
+ "total_cost_usd": summary.get("total_cost_usd"),
249
+ "skills_invoked": summary.get("skills_invoked", []),
250
+ }
251
+ _safe(
252
+ lambda: ls_testing.log_outputs(outputs)
253
+ )
254
+
255
+ passed = len(getattr(result, "checks_passed", []))
256
+ failed = len(getattr(result, "checks_failed", []))
257
+ total = passed + failed
258
+ if total:
259
+ _safe(
260
+ lambda: ls_testing.log_feedback(key="checks_pass_rate", score=passed / total),
261
+ label="log_feedback checks_pass_rate",
262
+ )
263
+
264
+ for dim, score in _extract_rubric_scores(result).items():
265
+ _safe(
266
+ lambda d=dim, s=score: ls_testing.log_feedback(key=f"rubric.{d}", score=s),
267
+ label=f"log_feedback rubric.{dim}",
268
+ )
269
+
270
+
271
+ # =============================================================================
272
+ # TEST
273
+ # =============================================================================
274
+
275
+
276
+ @pytest.mark.timeout(PYTEST_TIMEOUT)
277
+ @pytest.mark.langsmith
278
+ def test_task_treatment(task_name, treatment_name):
279
+ """Run a task+treatment via the local runner and log results to LangSmith."""
280
+ _log_inputs_and_reference(task_name, treatment_name)
281
+ _set_parent_run_env()
282
+ try:
283
+ _run_local_task_treatment(task_name, treatment_name)
284
+ finally:
285
+ _log_outputs_and_feedback(_latest_result(treatment_name))
286
+ os.environ.pop("CC_LANGSMITH_PARENT_DOTTED_ORDER", None)
287
+
@@ -0,0 +1,5 @@
1
+ # LangSmith Treatments
2
+
3
+ 这个套件当前通过 `BENCH_TREATMENTS_DIR` 复用 `../../local/treatments`。
4
+
5
+ 如果需要不同的 Skill 组合方式,可以在这里添加 LangSmith 专用 treatment。
@@ -0,0 +1,80 @@
1
+ # 本地评估套件
2
+
3
+ 这个套件用于在本机运行 Comet 和任意本地 Skill 的 benchmark,并将日志与 Docker 验证结果保存到本地。
4
+ 它不需要 LangSmith 凭证。
5
+
6
+ 从 `eval/` 目录运行:
7
+
8
+ ```bash
9
+ uv run pytest local/tests/tasks/test_tasks.py --task=comet-fix-median --treatment=COMET_FULL_040_BETA -v
10
+ uv run pytest local/tests/tasks/test_tasks.py --task=comet-full-workflow --treatment=CONTROL,COMET_FULL_040_BETA -v
11
+ uv run pytest local/tests/tasks/test_tasks.py -v
12
+ ```
13
+
14
+ 快速运行通用 smoke 任务:
15
+
16
+ ```bash
17
+ uv run pytest local/tests/tasks/test_tasks.py --task=generic-skill-smoke --treatment=CONTROL -v
18
+ ```
19
+
20
+ 运行生成 Skill 的 authoring smoke 任务:
21
+
22
+ ```bash
23
+ uv run pytest local/tests/tasks/test_tasks.py \
24
+ --task=authoring-skill-smoke \
25
+ --eval-manifest=/path/to/generated-skill/comet/eval.yaml \
26
+ --profile=authoring-skill -v
27
+ ```
28
+
29
+ 运行生成 Skill 的路由一致性验证:
30
+
31
+ ```bash
32
+ uv run pytest local/tests/tasks/test_tasks.py \
33
+ --task=workflow-route-conformance \
34
+ --eval-manifest=/path/to/generated-skill/comet/eval.yaml \
35
+ --profile=authoring-skill -v
36
+ ```
37
+
38
+ 当 `--eval-manifest` 指向 `/comet-any` 生成包时,runner 会先把入口 Skill 包和生成的内部 Node Skills 复制到隔离的 eval 工作区,再执行 Docker 验证。
39
+
40
+ `comet-workflow` profile 会把 `skills/benchmarks/dependency/claude-md/comet-workflow/CLAUDE.md` 注入到隔离工作区根目录,用项目级指令强制 agent 先触发 `/comet`。如果需要调整这段提示词,直接改这个资产文件,不需要改 Python runner。
41
+
42
+ Comet baseline 和它依赖的 OpenSpec / Superpowers Skill 都会按完整 Skill 包安装到 `.claude/skills/`,包括 `rules/`、`reference/`、`runtime/`、`scripts/` 以及其他随包文件。安装 canonical `comet` Skill 时,runner 会根据 baseline 自动配置 Claude Code `PreToolUse` hook:`COMET_FULL_039` 使用 `comet-hook-guard.sh`,`COMET_FULL_040_BETA` 使用 `comet-hook-guard.mjs`。
43
+
44
+ 报告中的 `Skills invoked` 和 `skill_invocation` rubric 只统计 Claude Code 事件里真实观测到的 Skill 工具调用,不会根据产物反推。`comet-workflow` profile 会把嵌套 Comet 阶段 Skill、OpenSpec 依赖 Skill、Superpowers 依赖 Skill 都作为关键证据;如果只调用主 `comet` 但没有调用这些依赖,run 会被标记为工作流契约失败。rubric 会按 `full`、`hotfix`、`tweak` 三类 workflow 分别评分:`full` 要求深度设计和完整阶段证据,`hotfix` / `tweak` 使用预设路径的轻量产物和连续执行决策点口径。
45
+
46
+ 容器内 Claude 实验工作区的 ASCII 目录结构见 `../README.md` 的“容器中的 Claude 实验工作区”。
47
+
48
+ 任务索引:
49
+
50
+ ```text
51
+ tasks/index.yaml
52
+ ```
53
+
54
+ 报告和产物写入:
55
+
56
+ ```text
57
+ logs/experiments/
58
+ ```
59
+
60
+ 报告默认只输出 Markdown(`summary.md`)。如需启用可浏览的 HTML,或关闭 Markdown 输出,传入 JSON/YAML 报告配置:
61
+
62
+ ```json
63
+ {
64
+ "report_outputs": {
65
+ "markdown": true,
66
+ "html": true
67
+ }
68
+ }
69
+ ```
70
+
71
+ ```bash
72
+ uv run pytest local/tests/tasks/test_tasks.py --report-config report-config.json -v
73
+ uv run python local/scripts/compare_baselines.py --report-config report-config.json
74
+ ```
75
+
76
+ 也可以设置 `COMET_EVAL_REPORT_CONFIG=/path/to/report-config.json`。
77
+
78
+ 每次运行的报告都会包含 profile、Skill 来源元数据、run id、产物引用,以及结构化失败归因。归因桶包括 `harness`、`workflow`、`task` 和 `model`。
79
+
80
+ 比较报告还会显示 `Data quality summary`。报告保留所有 raw runs 供审计,但 headline 指标、pass@k/pass^k、成本统计、图表和 verdict 默认使用 analysis set。`excluded` 表示明确的环境或运行器噪声(例如 API timeout、rate limit、Docker 启动失败),不会进入主统计;`flagged` 表示可疑 harness/task 噪声,仍进入主统计但会在报告中单独标出;真实 workflow/model/task 失败会保留为 `included`,不会因为分数低被过滤。
@@ -0,0 +1,13 @@
1
+ {
2
+ "dimensions": {
3
+ "main_flow": 1.0,
4
+ "gate_guard": 1.0,
5
+ "skill_invocation": 1.0,
6
+ "spec_drift": 0.25,
7
+ "completion": 0.8,
8
+ "efficiency": 0.73,
9
+ "decision_point_compliance": 0.5,
10
+ "artifact_quality": 1.0
11
+ },
12
+ "source": "regression_check.py"
13
+ }
@@ -0,0 +1,41 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 820 460" role="img" aria-label="Figure 2. Quality-cost frontier">
2
+ <style>
3
+ text { font-family: 'Times New Roman', SimSun, 'Songti SC', 'Noto Serif CJK SC', serif; }
4
+ .title { fill: #1B1A18; font-size: 18px; font-weight: 700; }
5
+ .subtitle, .tick { fill: #66615A; font-size: 12px; }
6
+ .label { fill: #1B1A18; font-size: 13px; }
7
+ .value { fill: #1B1A18; font-size: 12px; font-family: 'Times New Roman', SimSun, 'Songti SC', 'Noto Serif CJK SC', serif; }
8
+ .grid { stroke: #D8D2C7; stroke-width: 1; shape-rendering: crispEdges; }
9
+ .axis { stroke: #1B1A18; stroke-width: 1; shape-rendering: crispEdges; }
10
+ </style>
11
+ <rect width="820" height="460" fill="#FFFFFF" />
12
+ <text class="title" x="32" y="32">Figure 2. Quality-cost frontier</text>
13
+ <text class="subtitle" x="32" y="54">Y-axis is rubric average, x-axis is total tokens; upper-left is better.</text>
14
+ <line class="grid" x1="86.0" y1="72" x2="86.0" y2="372" />
15
+ <text class="tick" x="86.0" y="402" text-anchor="middle">0M</text>
16
+ <line class="grid" x1="292.7" y1="72" x2="292.7" y2="372" />
17
+ <text class="tick" x="292.7" y="402" text-anchor="middle">4M</text>
18
+ <line class="grid" x1="499.3" y1="72" x2="499.3" y2="372" />
19
+ <text class="tick" x="499.3" y="402" text-anchor="middle">8M</text>
20
+ <line class="grid" x1="706.0" y1="72" x2="706.0" y2="372" />
21
+ <text class="tick" x="706.0" y="402" text-anchor="middle">12M</text>
22
+ <line class="grid" x1="86" y1="372.0" x2="706" y2="372.0" />
23
+ <text class="tick" x="60" y="376.0" text-anchor="end">0.3</text>
24
+ <line class="grid" x1="86" y1="272.0" x2="706" y2="272.0" />
25
+ <text class="tick" x="60" y="276.0" text-anchor="end">0.5</text>
26
+ <line class="grid" x1="86" y1="172.0" x2="706" y2="172.0" />
27
+ <text class="tick" x="60" y="176.0" text-anchor="end">0.7</text>
28
+ <line class="grid" x1="86" y1="72.0" x2="706" y2="72.0" />
29
+ <text class="tick" x="60" y="76.0" text-anchor="end">0.9</text>
30
+ <line class="axis" x1="86" y1="372" x2="706" y2="372" />
31
+ <line class="axis" x1="86" y1="72" x2="86" y2="372" />
32
+ <line x1="372.8" y1="252.0" x2="677.4" y2="162.0" stroke="#9B9488" stroke-width="1.5" stroke-dasharray="5 5" />
33
+ <circle cx="677.4" cy="162.0" r="8" fill="#1F5F8B" />
34
+ <text class="value" x="663.4" y="152.0" text-anchor="end">Current workflow</text>
35
+ <text class="tick" x="663.4" y="171.0" text-anchor="end">0.72 / $7.59</text>
36
+ <circle cx="372.8" cy="252.0" r="8" fill="#9F3D2F" />
37
+ <text class="value" x="386.8" y="242.0" text-anchor="start">0.3.9 baseline</text>
38
+ <text class="tick" x="386.8" y="261.0" text-anchor="start">0.54 / $3.97</text>
39
+ <text class="label" x="396.0" y="438" text-anchor="middle">Total tokens</text>
40
+ <text class="label" x="24" y="222.0" transform="rotate(-90 24 222.0)" text-anchor="middle">Rubric average</text>
41
+ </svg>
@@ -0,0 +1,41 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 820 460" role="img" aria-label="图 2. 质量-成本前沿">
2
+ <style>
3
+ text { font-family: 'Times New Roman', SimSun, 'Songti SC', 'Noto Serif CJK SC', serif; }
4
+ .title { fill: #1B1A18; font-size: 18px; font-weight: 700; }
5
+ .subtitle, .tick { fill: #66615A; font-size: 12px; }
6
+ .label { fill: #1B1A18; font-size: 13px; }
7
+ .value { fill: #1B1A18; font-size: 12px; font-family: 'Times New Roman', SimSun, 'Songti SC', 'Noto Serif CJK SC', serif; }
8
+ .grid { stroke: #D8D2C7; stroke-width: 1; shape-rendering: crispEdges; }
9
+ .axis { stroke: #1B1A18; stroke-width: 1; shape-rendering: crispEdges; }
10
+ </style>
11
+ <rect width="820" height="460" fill="#FFFFFF" />
12
+ <text class="title" x="32" y="32">图 2. 质量-成本前沿</text>
13
+ <text class="subtitle" x="32" y="54">纵轴为 Rubric 平均分,横轴为总 token;点越靠左上越理想。</text>
14
+ <line class="grid" x1="86.0" y1="72" x2="86.0" y2="372" />
15
+ <text class="tick" x="86.0" y="402" text-anchor="middle">0M</text>
16
+ <line class="grid" x1="292.7" y1="72" x2="292.7" y2="372" />
17
+ <text class="tick" x="292.7" y="402" text-anchor="middle">4M</text>
18
+ <line class="grid" x1="499.3" y1="72" x2="499.3" y2="372" />
19
+ <text class="tick" x="499.3" y="402" text-anchor="middle">8M</text>
20
+ <line class="grid" x1="706.0" y1="72" x2="706.0" y2="372" />
21
+ <text class="tick" x="706.0" y="402" text-anchor="middle">12M</text>
22
+ <line class="grid" x1="86" y1="372.0" x2="706" y2="372.0" />
23
+ <text class="tick" x="60" y="376.0" text-anchor="end">0.3</text>
24
+ <line class="grid" x1="86" y1="272.0" x2="706" y2="272.0" />
25
+ <text class="tick" x="60" y="276.0" text-anchor="end">0.5</text>
26
+ <line class="grid" x1="86" y1="172.0" x2="706" y2="172.0" />
27
+ <text class="tick" x="60" y="176.0" text-anchor="end">0.7</text>
28
+ <line class="grid" x1="86" y1="72.0" x2="706" y2="72.0" />
29
+ <text class="tick" x="60" y="76.0" text-anchor="end">0.9</text>
30
+ <line class="axis" x1="86" y1="372" x2="706" y2="372" />
31
+ <line class="axis" x1="86" y1="72" x2="86" y2="372" />
32
+ <line x1="372.8" y1="252.0" x2="677.4" y2="162.0" stroke="#9B9488" stroke-width="1.5" stroke-dasharray="5 5" />
33
+ <circle cx="677.4" cy="162.0" r="8" fill="#1F5F8B" />
34
+ <text class="value" x="663.4" y="152.0" text-anchor="end">当前 workflow</text>
35
+ <text class="tick" x="663.4" y="171.0" text-anchor="end">0.72 / $7.59</text>
36
+ <circle cx="372.8" cy="252.0" r="8" fill="#9F3D2F" />
37
+ <text class="value" x="386.8" y="242.0" text-anchor="start">0.3.9 基线</text>
38
+ <text class="tick" x="386.8" y="261.0" text-anchor="start">0.54 / $3.97</text>
39
+ <text class="label" x="396.0" y="438" text-anchor="middle">总 token</text>
40
+ <text class="label" x="24" y="222.0" transform="rotate(-90 24 222.0)" text-anchor="middle">Rubric 平均分</text>
41
+ </svg>