@rpamis/comet 0.4.0-beta.1 → 0.4.0-beta.11

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 (1297) hide show
  1. package/LICENSE +21 -21
  2. package/README.md +279 -113
  3. package/assets/manifest.json +17 -5
  4. package/assets/skills/comet/SKILL.md +17 -256
  5. package/assets/skills/comet/reference/auto-transition.md +1 -1
  6. package/assets/skills/comet/reference/classic-layout.md +34 -0
  7. package/assets/skills/comet/reference/comet-yaml-fields.md +14 -8
  8. package/assets/skills/comet/reference/context-recovery.md +14 -4
  9. package/assets/skills/comet/reference/decision-point.md +11 -0
  10. package/assets/skills/comet/reference/file-structure.md +2 -2
  11. package/assets/skills/comet/reference/intent-frame.md +3 -3
  12. package/assets/skills/comet/reference/scripts.md +47 -15
  13. package/assets/skills/comet/reference/subagent-dispatch.md +8 -7
  14. package/assets/skills/comet/rules/comet-phase-guard.en.md +34 -31
  15. package/assets/skills/comet/rules/comet-phase-guard.md +34 -32
  16. package/assets/skills/comet/rules/comet-workflow-guard.en.md +32 -0
  17. package/assets/skills/comet/rules/comet-workflow-guard.md +32 -0
  18. package/assets/skills/comet/scripts/comet-entry-runtime.mjs +8074 -0
  19. package/assets/skills/comet/scripts/comet-hook-router.mjs +12086 -0
  20. package/assets/skills/comet/scripts/comet-resume-probe.mjs +3 -0
  21. package/assets/skills/comet/scripts/comet-runtime.mjs +10449 -4105
  22. package/assets/skills/comet-any/SKILL.md +5 -5
  23. package/assets/skills/comet-any/reference/authored-zone-example.md +10 -5
  24. package/assets/skills/comet-any/reference/authoring-subagents.md +1 -1
  25. package/assets/skills/comet-any/reference/bundle-authoring.md +2 -2
  26. package/assets/skills/comet-any/reference/subagents/pause-points-author.md +14 -11
  27. package/assets/skills/comet-any/reference/subagents/reference-author.md +1 -1
  28. package/assets/skills/comet-any/reference/subagents/script-author.md +1 -1
  29. package/assets/skills/comet-any/reference/subagents/skill-core-author.md +1 -1
  30. package/assets/skills/comet-any/reference/subagents/skill-reviewer.md +4 -2
  31. package/assets/skills/comet-any/reference/subagents/workflow-entry-author.md +8 -7
  32. package/assets/skills/comet-archive/SKILL.md +69 -26
  33. package/assets/skills/comet-build/SKILL.md +77 -58
  34. package/assets/skills/comet-classic/SKILL.md +295 -0
  35. package/assets/skills/comet-design/SKILL.md +40 -36
  36. package/assets/skills/comet-hotfix/SKILL.md +57 -35
  37. package/assets/skills/comet-native/SKILL.md +132 -0
  38. package/assets/skills/comet-native/reference/artifacts.md +141 -0
  39. package/assets/skills/comet-native/reference/clarification.md +54 -0
  40. package/assets/skills/comet-native/reference/commands.md +168 -0
  41. package/assets/skills/comet-native/reference/recovery.md +96 -0
  42. package/assets/skills/comet-native/scripts/comet-native-hook-guard.mjs +4 -0
  43. package/assets/skills/comet-native/scripts/comet-native-runtime.mjs +34165 -0
  44. package/assets/skills/comet-open/SKILL.md +119 -59
  45. package/assets/skills/comet-tweak/SKILL.md +52 -27
  46. package/assets/skills/comet-verify/SKILL.md +65 -73
  47. package/assets/skills-zh/comet/SKILL.md +17 -244
  48. package/assets/skills-zh/comet/reference/auto-transition.md +1 -1
  49. package/assets/skills-zh/comet/reference/classic-layout.md +34 -0
  50. package/assets/skills-zh/comet/reference/comet-yaml-fields.md +13 -8
  51. package/assets/skills-zh/comet/reference/context-recovery.md +14 -4
  52. package/assets/skills-zh/comet/reference/decision-point.md +11 -0
  53. package/assets/skills-zh/comet/reference/file-structure.md +2 -2
  54. package/assets/skills-zh/comet/reference/intent-frame.md +3 -3
  55. package/assets/skills-zh/comet/reference/scripts.md +47 -15
  56. package/assets/skills-zh/comet/reference/subagent-dispatch.md +8 -7
  57. package/assets/skills-zh/comet-any/SKILL.md +5 -5
  58. package/assets/skills-zh/comet-any/reference/authored-zone-example.md +10 -5
  59. package/assets/skills-zh/comet-any/reference/authoring-subagents.md +1 -1
  60. package/assets/skills-zh/comet-any/reference/bundle-authoring.md +2 -2
  61. package/assets/skills-zh/comet-any/reference/subagents/pause-points-author.md +14 -12
  62. package/assets/skills-zh/comet-any/reference/subagents/reference-author.md +1 -1
  63. package/assets/skills-zh/comet-any/reference/subagents/script-author.md +1 -1
  64. package/assets/skills-zh/comet-any/reference/subagents/skill-core-author.md +1 -1
  65. package/assets/skills-zh/comet-any/reference/subagents/skill-reviewer.md +4 -2
  66. package/assets/skills-zh/comet-any/reference/subagents/workflow-entry-author.md +8 -7
  67. package/assets/skills-zh/comet-archive/SKILL.md +69 -26
  68. package/assets/skills-zh/comet-build/SKILL.md +77 -58
  69. package/assets/skills-zh/comet-classic/SKILL.md +283 -0
  70. package/assets/skills-zh/comet-design/SKILL.md +40 -36
  71. package/assets/skills-zh/comet-hotfix/SKILL.md +56 -34
  72. package/assets/skills-zh/comet-native/SKILL.md +132 -0
  73. package/assets/skills-zh/comet-native/reference/artifacts.md +141 -0
  74. package/assets/skills-zh/comet-native/reference/clarification.md +54 -0
  75. package/assets/skills-zh/comet-native/reference/commands.md +168 -0
  76. package/assets/skills-zh/comet-native/reference/recovery.md +96 -0
  77. package/assets/skills-zh/comet-open/SKILL.md +118 -58
  78. package/assets/skills-zh/comet-tweak/SKILL.md +51 -26
  79. package/assets/skills-zh/comet-verify/SKILL.md +65 -73
  80. package/dist/app/cli/comet-banner.d.ts +25 -0
  81. package/dist/app/cli/comet-banner.d.ts.map +1 -0
  82. package/dist/app/cli/comet-banner.js +265 -0
  83. package/dist/app/cli/comet-banner.js.map +1 -0
  84. package/dist/app/cli/index.js +113 -16
  85. package/dist/app/cli/index.js.map +1 -1
  86. package/dist/app/commands/classic.d.ts +5 -0
  87. package/dist/app/commands/classic.d.ts.map +1 -0
  88. package/dist/app/commands/classic.js +32 -0
  89. package/dist/app/commands/classic.js.map +1 -0
  90. package/dist/app/commands/command-result.d.ts +6 -0
  91. package/dist/app/commands/command-result.d.ts.map +1 -0
  92. package/dist/app/commands/command-result.js +4 -0
  93. package/dist/app/commands/command-result.js.map +1 -0
  94. package/dist/app/commands/doctor.d.ts +4 -0
  95. package/dist/app/commands/doctor.d.ts.map +1 -1
  96. package/dist/app/commands/doctor.js +926 -95
  97. package/dist/app/commands/doctor.js.map +1 -1
  98. package/dist/app/commands/eval.d.ts +3 -1
  99. package/dist/app/commands/eval.d.ts.map +1 -1
  100. package/dist/app/commands/eval.js +80 -22
  101. package/dist/app/commands/eval.js.map +1 -1
  102. package/dist/app/commands/i18n.d.ts +1 -1
  103. package/dist/app/commands/i18n.d.ts.map +1 -1
  104. package/dist/app/commands/i18n.js +18 -6
  105. package/dist/app/commands/i18n.js.map +1 -1
  106. package/dist/app/commands/init.d.ts +13 -3
  107. package/dist/app/commands/init.d.ts.map +1 -1
  108. package/dist/app/commands/init.js +561 -72
  109. package/dist/app/commands/init.js.map +1 -1
  110. package/dist/app/commands/native.d.ts +2 -0
  111. package/dist/app/commands/native.d.ts.map +1 -0
  112. package/dist/app/commands/native.js +10 -0
  113. package/dist/app/commands/native.js.map +1 -0
  114. package/dist/app/commands/project-scope-selection.d.ts +13 -0
  115. package/dist/app/commands/project-scope-selection.d.ts.map +1 -0
  116. package/dist/app/commands/project-scope-selection.js +35 -0
  117. package/dist/app/commands/project-scope-selection.js.map +1 -0
  118. package/dist/app/commands/resume-probe.d.ts +12 -0
  119. package/dist/app/commands/resume-probe.d.ts.map +1 -0
  120. package/dist/app/commands/resume-probe.js +68 -0
  121. package/dist/app/commands/resume-probe.js.map +1 -0
  122. package/dist/app/commands/status.d.ts.map +1 -1
  123. package/dist/app/commands/status.js +70 -104
  124. package/dist/app/commands/status.js.map +1 -1
  125. package/dist/app/commands/uninstall.d.ts +5 -0
  126. package/dist/app/commands/uninstall.d.ts.map +1 -1
  127. package/dist/app/commands/uninstall.js +264 -53
  128. package/dist/app/commands/uninstall.js.map +1 -1
  129. package/dist/app/commands/update.d.ts +29 -5
  130. package/dist/app/commands/update.d.ts.map +1 -1
  131. package/dist/app/commands/update.js +1431 -127
  132. package/dist/app/commands/update.js.map +1 -1
  133. package/dist/app/commands/workflow.d.ts +6 -0
  134. package/dist/app/commands/workflow.d.ts.map +1 -0
  135. package/dist/app/commands/workflow.js +11 -0
  136. package/dist/app/commands/workflow.js.map +1 -0
  137. package/dist/config/repository-layout.json +29 -3
  138. package/dist/domains/bundle/bundle-platform.d.ts +1 -0
  139. package/dist/domains/bundle/bundle-platform.d.ts.map +1 -1
  140. package/dist/domains/bundle/bundle-platform.js +10 -4
  141. package/dist/domains/bundle/bundle-platform.js.map +1 -1
  142. package/dist/domains/bundle/eval-manifest-runtime.d.ts +8 -0
  143. package/dist/domains/bundle/eval-manifest-runtime.d.ts.map +1 -0
  144. package/dist/domains/bundle/eval-manifest-runtime.js +118 -0
  145. package/dist/domains/bundle/eval-manifest-runtime.js.map +1 -0
  146. package/dist/domains/bundle/eval-run-result.d.ts +22 -0
  147. package/dist/domains/bundle/eval-run-result.d.ts.map +1 -0
  148. package/dist/domains/bundle/eval-run-result.js +207 -0
  149. package/dist/domains/bundle/eval-run-result.js.map +1 -0
  150. package/dist/domains/bundle/eval.d.ts.map +1 -1
  151. package/dist/domains/bundle/eval.js +21 -24
  152. package/dist/domains/bundle/eval.js.map +1 -1
  153. package/dist/domains/bundle/factory.d.ts.map +1 -1
  154. package/dist/domains/bundle/factory.js +2 -9
  155. package/dist/domains/bundle/factory.js.map +1 -1
  156. package/dist/domains/bundle/review-summary.js +1 -1
  157. package/dist/domains/bundle/review-summary.js.map +1 -1
  158. package/dist/domains/bundle/state.d.ts.map +1 -1
  159. package/dist/domains/bundle/state.js +117 -2
  160. package/dist/domains/bundle/state.js.map +1 -1
  161. package/dist/domains/bundle/types.d.ts +1 -1
  162. package/dist/domains/bundle/types.d.ts.map +1 -1
  163. package/dist/domains/comet-classic/classic-archive-pointer.d.ts +8 -0
  164. package/dist/domains/comet-classic/classic-archive-pointer.d.ts.map +1 -0
  165. package/dist/domains/comet-classic/classic-archive-pointer.js +66 -0
  166. package/dist/domains/comet-classic/classic-archive-pointer.js.map +1 -0
  167. package/dist/domains/comet-classic/classic-archive.d.ts +1 -0
  168. package/dist/domains/comet-classic/classic-archive.d.ts.map +1 -1
  169. package/dist/domains/comet-classic/classic-archive.js +205 -114
  170. package/dist/domains/comet-classic/classic-archive.js.map +1 -1
  171. package/dist/domains/comet-classic/classic-branch-binding.d.ts +51 -0
  172. package/dist/domains/comet-classic/classic-branch-binding.d.ts.map +1 -0
  173. package/dist/domains/comet-classic/classic-branch-binding.js +107 -0
  174. package/dist/domains/comet-classic/classic-branch-binding.js.map +1 -0
  175. package/dist/domains/comet-classic/classic-cli.d.ts +3 -1
  176. package/dist/domains/comet-classic/classic-cli.d.ts.map +1 -1
  177. package/dist/domains/comet-classic/classic-cli.js +12 -3
  178. package/dist/domains/comet-classic/classic-cli.js.map +1 -1
  179. package/dist/domains/comet-classic/classic-command-checks.d.ts +20 -0
  180. package/dist/domains/comet-classic/classic-command-checks.d.ts.map +1 -0
  181. package/dist/domains/comet-classic/classic-command-checks.js +94 -0
  182. package/dist/domains/comet-classic/classic-command-checks.js.map +1 -0
  183. package/dist/domains/comet-classic/classic-command-context.d.ts +12 -0
  184. package/dist/domains/comet-classic/classic-command-context.d.ts.map +1 -0
  185. package/dist/domains/comet-classic/classic-command-context.js +42 -0
  186. package/dist/domains/comet-classic/classic-command-context.js.map +1 -0
  187. package/dist/domains/comet-classic/classic-current-change.d.ts +17 -0
  188. package/dist/domains/comet-classic/classic-current-change.d.ts.map +1 -0
  189. package/dist/domains/comet-classic/classic-current-change.js +112 -0
  190. package/dist/domains/comet-classic/classic-current-change.js.map +1 -0
  191. package/dist/domains/comet-classic/classic-diagnostics.d.ts +2 -1
  192. package/dist/domains/comet-classic/classic-diagnostics.d.ts.map +1 -1
  193. package/dist/domains/comet-classic/classic-diagnostics.js +54 -1
  194. package/dist/domains/comet-classic/classic-diagnostics.js.map +1 -1
  195. package/dist/domains/comet-classic/classic-evidence.d.ts +1 -0
  196. package/dist/domains/comet-classic/classic-evidence.d.ts.map +1 -1
  197. package/dist/domains/comet-classic/classic-evidence.js +101 -37
  198. package/dist/domains/comet-classic/classic-evidence.js.map +1 -1
  199. package/dist/domains/comet-classic/classic-guard.d.ts.map +1 -1
  200. package/dist/domains/comet-classic/classic-guard.js +229 -208
  201. package/dist/domains/comet-classic/classic-guard.js.map +1 -1
  202. package/dist/domains/comet-classic/classic-handoff.d.ts.map +1 -1
  203. package/dist/domains/comet-classic/classic-handoff.js +155 -107
  204. package/dist/domains/comet-classic/classic-handoff.js.map +1 -1
  205. package/dist/domains/comet-classic/classic-hook-guard.d.ts +9 -0
  206. package/dist/domains/comet-classic/classic-hook-guard.d.ts.map +1 -1
  207. package/dist/domains/comet-classic/classic-hook-guard.js +406 -54
  208. package/dist/domains/comet-classic/classic-hook-guard.js.map +1 -1
  209. package/dist/domains/comet-classic/classic-layout-initialization.d.ts +86 -0
  210. package/dist/domains/comet-classic/classic-layout-initialization.d.ts.map +1 -0
  211. package/dist/domains/comet-classic/classic-layout-initialization.js +813 -0
  212. package/dist/domains/comet-classic/classic-layout-initialization.js.map +1 -0
  213. package/dist/domains/comet-classic/classic-layout.d.ts +47 -0
  214. package/dist/domains/comet-classic/classic-layout.d.ts.map +1 -0
  215. package/dist/domains/comet-classic/classic-layout.js +227 -0
  216. package/dist/domains/comet-classic/classic-layout.js.map +1 -0
  217. package/dist/domains/comet-classic/classic-migrate.d.ts +4 -0
  218. package/dist/domains/comet-classic/classic-migrate.d.ts.map +1 -1
  219. package/dist/domains/comet-classic/classic-migrate.js +8 -12
  220. package/dist/domains/comet-classic/classic-migrate.js.map +1 -1
  221. package/dist/domains/comet-classic/classic-openspec-command.d.ts +4 -0
  222. package/dist/domains/comet-classic/classic-openspec-command.d.ts.map +1 -0
  223. package/dist/domains/comet-classic/classic-openspec-command.js +45 -0
  224. package/dist/domains/comet-classic/classic-openspec-command.js.map +1 -0
  225. package/dist/domains/comet-classic/classic-openspec-root.d.ts +13 -0
  226. package/dist/domains/comet-classic/classic-openspec-root.d.ts.map +1 -0
  227. package/dist/domains/comet-classic/classic-openspec-root.js +47 -0
  228. package/dist/domains/comet-classic/classic-openspec-root.js.map +1 -0
  229. package/dist/domains/comet-classic/classic-paths.d.ts +11 -1
  230. package/dist/domains/comet-classic/classic-paths.d.ts.map +1 -1
  231. package/dist/domains/comet-classic/classic-paths.js +87 -35
  232. package/dist/domains/comet-classic/classic-paths.js.map +1 -1
  233. package/dist/domains/comet-classic/classic-project-config.d.ts +16 -0
  234. package/dist/domains/comet-classic/classic-project-config.d.ts.map +1 -0
  235. package/dist/domains/comet-classic/classic-project-config.js +36 -0
  236. package/dist/domains/comet-classic/classic-project-config.js.map +1 -0
  237. package/dist/domains/comet-classic/classic-protected-path.d.ts +39 -0
  238. package/dist/domains/comet-classic/classic-protected-path.d.ts.map +1 -0
  239. package/dist/domains/comet-classic/classic-protected-path.js +69 -0
  240. package/dist/domains/comet-classic/classic-protected-path.js.map +1 -0
  241. package/dist/domains/comet-classic/classic-resolver.d.ts.map +1 -1
  242. package/dist/domains/comet-classic/classic-resolver.js +4 -4
  243. package/dist/domains/comet-classic/classic-resolver.js.map +1 -1
  244. package/dist/domains/comet-classic/classic-resume-probe-command.d.ts +3 -0
  245. package/dist/domains/comet-classic/classic-resume-probe-command.d.ts.map +1 -0
  246. package/dist/domains/comet-classic/classic-resume-probe-command.js +59 -0
  247. package/dist/domains/comet-classic/classic-resume-probe-command.js.map +1 -0
  248. package/dist/domains/comet-classic/classic-resume-probe-entry.d.ts +2 -0
  249. package/dist/domains/comet-classic/classic-resume-probe-entry.d.ts.map +1 -0
  250. package/dist/domains/comet-classic/classic-resume-probe-entry.js +4 -0
  251. package/dist/domains/comet-classic/classic-resume-probe-entry.js.map +1 -0
  252. package/dist/domains/comet-classic/classic-resume-probe.d.ts +29 -0
  253. package/dist/domains/comet-classic/classic-resume-probe.d.ts.map +1 -0
  254. package/dist/domains/comet-classic/classic-resume-probe.js +406 -0
  255. package/dist/domains/comet-classic/classic-resume-probe.js.map +1 -0
  256. package/dist/domains/comet-classic/classic-root-command.d.ts +5 -0
  257. package/dist/domains/comet-classic/classic-root-command.d.ts.map +1 -0
  258. package/dist/domains/comet-classic/classic-root-command.js +84 -0
  259. package/dist/domains/comet-classic/classic-root-command.js.map +1 -0
  260. package/dist/domains/comet-classic/classic-root-move.d.ts +119 -0
  261. package/dist/domains/comet-classic/classic-root-move.d.ts.map +1 -0
  262. package/dist/domains/comet-classic/classic-root-move.js +1737 -0
  263. package/dist/domains/comet-classic/classic-root-move.js.map +1 -0
  264. package/dist/domains/comet-classic/classic-runtime-run.d.ts +2 -1
  265. package/dist/domains/comet-classic/classic-runtime-run.d.ts.map +1 -1
  266. package/dist/domains/comet-classic/classic-runtime-run.js +278 -5
  267. package/dist/domains/comet-classic/classic-runtime-run.js.map +1 -1
  268. package/dist/domains/comet-classic/classic-state-command.d.ts.map +1 -1
  269. package/dist/domains/comet-classic/classic-state-command.js +342 -87
  270. package/dist/domains/comet-classic/classic-state-command.js.map +1 -1
  271. package/dist/domains/comet-classic/classic-state-events.d.ts +1 -1
  272. package/dist/domains/comet-classic/classic-state-events.d.ts.map +1 -1
  273. package/dist/domains/comet-classic/classic-state-events.js +3 -4
  274. package/dist/domains/comet-classic/classic-state-events.js.map +1 -1
  275. package/dist/domains/comet-classic/classic-state.d.ts +6 -4
  276. package/dist/domains/comet-classic/classic-state.d.ts.map +1 -1
  277. package/dist/domains/comet-classic/classic-state.js +20 -7
  278. package/dist/domains/comet-classic/classic-state.js.map +1 -1
  279. package/dist/domains/comet-classic/classic-store.d.ts +6 -1
  280. package/dist/domains/comet-classic/classic-store.d.ts.map +1 -1
  281. package/dist/domains/comet-classic/classic-store.js +36 -23
  282. package/dist/domains/comet-classic/classic-store.js.map +1 -1
  283. package/dist/domains/comet-classic/classic-transitions.d.ts +1 -1
  284. package/dist/domains/comet-classic/classic-transitions.d.ts.map +1 -1
  285. package/dist/domains/comet-classic/classic-transitions.js +37 -3
  286. package/dist/domains/comet-classic/classic-transitions.js.map +1 -1
  287. package/dist/domains/comet-classic/classic-validate-command.d.ts.map +1 -1
  288. package/dist/domains/comet-classic/classic-validate-command.js +40 -20
  289. package/dist/domains/comet-classic/classic-validate-command.js.map +1 -1
  290. package/dist/domains/comet-classic/index.d.ts +3 -0
  291. package/dist/domains/comet-classic/index.d.ts.map +1 -1
  292. package/dist/domains/comet-classic/index.js +3 -0
  293. package/dist/domains/comet-classic/index.js.map +1 -1
  294. package/dist/domains/comet-entry/current-selection-repair.d.ts +17 -0
  295. package/dist/domains/comet-entry/current-selection-repair.d.ts.map +1 -0
  296. package/dist/domains/comet-entry/current-selection-repair.js +19 -0
  297. package/dist/domains/comet-entry/current-selection-repair.js.map +1 -0
  298. package/dist/domains/comet-entry/current-selection.d.ts +28 -0
  299. package/dist/domains/comet-entry/current-selection.d.ts.map +1 -0
  300. package/dist/domains/comet-entry/current-selection.js +114 -0
  301. package/dist/domains/comet-entry/current-selection.js.map +1 -0
  302. package/dist/domains/comet-entry/entry-runtime-entry.d.ts +2 -0
  303. package/dist/domains/comet-entry/entry-runtime-entry.d.ts.map +1 -0
  304. package/dist/domains/comet-entry/entry-runtime-entry.js +3 -0
  305. package/dist/domains/comet-entry/entry-runtime-entry.js.map +1 -0
  306. package/dist/domains/comet-entry/entry-runtime.d.ts +7 -0
  307. package/dist/domains/comet-entry/entry-runtime.d.ts.map +1 -0
  308. package/dist/domains/comet-entry/entry-runtime.js +55 -0
  309. package/dist/domains/comet-entry/entry-runtime.js.map +1 -0
  310. package/dist/domains/comet-entry/hook-adapter.d.ts +6 -0
  311. package/dist/domains/comet-entry/hook-adapter.d.ts.map +1 -0
  312. package/dist/domains/comet-entry/hook-adapter.js +202 -0
  313. package/dist/domains/comet-entry/hook-adapter.js.map +1 -0
  314. package/dist/domains/comet-entry/hook-router-entry.d.ts +8 -0
  315. package/dist/domains/comet-entry/hook-router-entry.d.ts.map +1 -0
  316. package/dist/domains/comet-entry/hook-router-entry.js +88 -0
  317. package/dist/domains/comet-entry/hook-router-entry.js.map +1 -0
  318. package/dist/domains/comet-entry/hook-router.d.ts +32 -0
  319. package/dist/domains/comet-entry/hook-router.d.ts.map +1 -0
  320. package/dist/domains/comet-entry/hook-router.js +133 -0
  321. package/dist/domains/comet-entry/hook-router.js.map +1 -0
  322. package/dist/domains/comet-entry/hook-types.d.ts +20 -0
  323. package/dist/domains/comet-entry/hook-types.d.ts.map +1 -0
  324. package/dist/domains/comet-entry/hook-types.js +2 -0
  325. package/dist/domains/comet-entry/hook-types.js.map +1 -0
  326. package/dist/domains/comet-entry/init-workflow.d.ts +19 -0
  327. package/dist/domains/comet-entry/init-workflow.d.ts.map +1 -0
  328. package/dist/domains/comet-entry/init-workflow.js +132 -0
  329. package/dist/domains/comet-entry/init-workflow.js.map +1 -0
  330. package/dist/domains/comet-entry/project-status.d.ts +3 -0
  331. package/dist/domains/comet-entry/project-status.d.ts.map +1 -0
  332. package/dist/domains/comet-entry/project-status.js +291 -0
  333. package/dist/domains/comet-entry/project-status.js.map +1 -0
  334. package/dist/domains/comet-entry/resolve-entry.d.ts +3 -0
  335. package/dist/domains/comet-entry/resolve-entry.d.ts.map +1 -0
  336. package/dist/domains/comet-entry/resolve-entry.js +18 -0
  337. package/dist/domains/comet-entry/resolve-entry.js.map +1 -0
  338. package/dist/domains/comet-entry/resume-probe.d.ts +34 -0
  339. package/dist/domains/comet-entry/resume-probe.d.ts.map +1 -0
  340. package/dist/domains/comet-entry/resume-probe.js +462 -0
  341. package/dist/domains/comet-entry/resume-probe.js.map +1 -0
  342. package/dist/domains/comet-entry/types.d.ts +60 -0
  343. package/dist/domains/comet-entry/types.d.ts.map +1 -0
  344. package/dist/domains/comet-entry/types.js +2 -0
  345. package/dist/domains/comet-entry/types.js.map +1 -0
  346. package/dist/domains/comet-entry/workflow-resolution.d.ts +8 -0
  347. package/dist/domains/comet-entry/workflow-resolution.d.ts.map +1 -0
  348. package/dist/domains/comet-entry/workflow-resolution.js +16 -0
  349. package/dist/domains/comet-entry/workflow-resolution.js.map +1 -0
  350. package/dist/domains/comet-native/index.d.ts +35 -0
  351. package/dist/domains/comet-native/index.d.ts.map +1 -0
  352. package/dist/domains/comet-native/index.js +35 -0
  353. package/dist/domains/comet-native/index.js.map +1 -0
  354. package/dist/domains/comet-native/native-acceptance.d.ts +53 -0
  355. package/dist/domains/comet-native/native-acceptance.d.ts.map +1 -0
  356. package/dist/domains/comet-native/native-acceptance.js +658 -0
  357. package/dist/domains/comet-native/native-acceptance.js.map +1 -0
  358. package/dist/domains/comet-native/native-archive-content.d.ts +26 -0
  359. package/dist/domains/comet-native/native-archive-content.d.ts.map +1 -0
  360. package/dist/domains/comet-native/native-archive-content.js +159 -0
  361. package/dist/domains/comet-native/native-archive-content.js.map +1 -0
  362. package/dist/domains/comet-native/native-archive-inspection.d.ts +9 -0
  363. package/dist/domains/comet-native/native-archive-inspection.d.ts.map +1 -0
  364. package/dist/domains/comet-native/native-archive-inspection.js +97 -0
  365. package/dist/domains/comet-native/native-archive-inspection.js.map +1 -0
  366. package/dist/domains/comet-native/native-archive-preflight.d.ts +54 -0
  367. package/dist/domains/comet-native/native-archive-preflight.d.ts.map +1 -0
  368. package/dist/domains/comet-native/native-archive-preflight.js +222 -0
  369. package/dist/domains/comet-native/native-archive-preflight.js.map +1 -0
  370. package/dist/domains/comet-native/native-archive-transaction.d.ts +20 -0
  371. package/dist/domains/comet-native/native-archive-transaction.d.ts.map +1 -0
  372. package/dist/domains/comet-native/native-archive-transaction.js +1183 -0
  373. package/dist/domains/comet-native/native-archive-transaction.js.map +1 -0
  374. package/dist/domains/comet-native/native-archive.d.ts +36 -0
  375. package/dist/domains/comet-native/native-archive.d.ts.map +1 -0
  376. package/dist/domains/comet-native/native-archive.js +422 -0
  377. package/dist/domains/comet-native/native-archive.js.map +1 -0
  378. package/dist/domains/comet-native/native-artifacts.d.ts +10 -0
  379. package/dist/domains/comet-native/native-artifacts.d.ts.map +1 -0
  380. package/dist/domains/comet-native/native-artifacts.js +204 -0
  381. package/dist/domains/comet-native/native-artifacts.js.map +1 -0
  382. package/dist/domains/comet-native/native-atomic-file.d.ts +10 -0
  383. package/dist/domains/comet-native/native-atomic-file.d.ts.map +1 -0
  384. package/dist/domains/comet-native/native-atomic-file.js +179 -0
  385. package/dist/domains/comet-native/native-atomic-file.js.map +1 -0
  386. package/dist/domains/comet-native/native-bounded-file.d.ts +19 -0
  387. package/dist/domains/comet-native/native-bounded-file.d.ts.map +1 -0
  388. package/dist/domains/comet-native/native-bounded-file.js +184 -0
  389. package/dist/domains/comet-native/native-bounded-file.js.map +1 -0
  390. package/dist/domains/comet-native/native-build-evidence.d.ts +42 -0
  391. package/dist/domains/comet-native/native-build-evidence.d.ts.map +1 -0
  392. package/dist/domains/comet-native/native-build-evidence.js +257 -0
  393. package/dist/domains/comet-native/native-build-evidence.js.map +1 -0
  394. package/dist/domains/comet-native/native-canonical-hash.d.ts +10 -0
  395. package/dist/domains/comet-native/native-canonical-hash.d.ts.map +1 -0
  396. package/dist/domains/comet-native/native-canonical-hash.js +100 -0
  397. package/dist/domains/comet-native/native-canonical-hash.js.map +1 -0
  398. package/dist/domains/comet-native/native-change-recovery.d.ts +11 -0
  399. package/dist/domains/comet-native/native-change-recovery.d.ts.map +1 -0
  400. package/dist/domains/comet-native/native-change-recovery.js +15 -0
  401. package/dist/domains/comet-native/native-change-recovery.js.map +1 -0
  402. package/dist/domains/comet-native/native-change.d.ts +64 -0
  403. package/dist/domains/comet-native/native-change.d.ts.map +1 -0
  404. package/dist/domains/comet-native/native-change.js +738 -0
  405. package/dist/domains/comet-native/native-change.js.map +1 -0
  406. package/dist/domains/comet-native/native-check-receipt-model.d.ts +63 -0
  407. package/dist/domains/comet-native/native-check-receipt-model.d.ts.map +1 -0
  408. package/dist/domains/comet-native/native-check-receipt-model.js +352 -0
  409. package/dist/domains/comet-native/native-check-receipt-model.js.map +1 -0
  410. package/dist/domains/comet-native/native-check-receipt-storage.d.ts +10 -0
  411. package/dist/domains/comet-native/native-check-receipt-storage.d.ts.map +1 -0
  412. package/dist/domains/comet-native/native-check-receipt-storage.js +200 -0
  413. package/dist/domains/comet-native/native-check-receipt-storage.js.map +1 -0
  414. package/dist/domains/comet-native/native-check-receipt.d.ts +19 -0
  415. package/dist/domains/comet-native/native-check-receipt.d.ts.map +1 -0
  416. package/dist/domains/comet-native/native-check-receipt.js +453 -0
  417. package/dist/domains/comet-native/native-check-receipt.js.map +1 -0
  418. package/dist/domains/comet-native/native-check.d.ts +24 -0
  419. package/dist/domains/comet-native/native-check.d.ts.map +1 -0
  420. package/dist/domains/comet-native/native-check.js +38 -0
  421. package/dist/domains/comet-native/native-check.js.map +1 -0
  422. package/dist/domains/comet-native/native-checkpoint-journal.d.ts +13 -0
  423. package/dist/domains/comet-native/native-checkpoint-journal.d.ts.map +1 -0
  424. package/dist/domains/comet-native/native-checkpoint-journal.js +53 -0
  425. package/dist/domains/comet-native/native-checkpoint-journal.js.map +1 -0
  426. package/dist/domains/comet-native/native-checkpoint-storage.d.ts +43 -0
  427. package/dist/domains/comet-native/native-checkpoint-storage.d.ts.map +1 -0
  428. package/dist/domains/comet-native/native-checkpoint-storage.js +487 -0
  429. package/dist/domains/comet-native/native-checkpoint-storage.js.map +1 -0
  430. package/dist/domains/comet-native/native-cli-entry.d.ts +2 -0
  431. package/dist/domains/comet-native/native-cli-entry.d.ts.map +1 -0
  432. package/dist/domains/comet-native/native-cli-entry.js +18 -0
  433. package/dist/domains/comet-native/native-cli-entry.js.map +1 -0
  434. package/dist/domains/comet-native/native-cli.d.ts +7 -0
  435. package/dist/domains/comet-native/native-cli.d.ts.map +1 -0
  436. package/dist/domains/comet-native/native-cli.js +1256 -0
  437. package/dist/domains/comet-native/native-cli.js.map +1 -0
  438. package/dist/domains/comet-native/native-config.d.ts +23 -0
  439. package/dist/domains/comet-native/native-config.d.ts.map +1 -0
  440. package/dist/domains/comet-native/native-config.js +60 -0
  441. package/dist/domains/comet-native/native-config.js.map +1 -0
  442. package/dist/domains/comet-native/native-conflict-inspection.d.ts +17 -0
  443. package/dist/domains/comet-native/native-conflict-inspection.d.ts.map +1 -0
  444. package/dist/domains/comet-native/native-conflict-inspection.js +90 -0
  445. package/dist/domains/comet-native/native-conflict-inspection.js.map +1 -0
  446. package/dist/domains/comet-native/native-conflict-radar.d.ts +75 -0
  447. package/dist/domains/comet-native/native-conflict-radar.d.ts.map +1 -0
  448. package/dist/domains/comet-native/native-conflict-radar.js +326 -0
  449. package/dist/domains/comet-native/native-conflict-radar.js.map +1 -0
  450. package/dist/domains/comet-native/native-continuation.d.ts +12 -0
  451. package/dist/domains/comet-native/native-continuation.d.ts.map +1 -0
  452. package/dist/domains/comet-native/native-continuation.js +201 -0
  453. package/dist/domains/comet-native/native-continuation.js.map +1 -0
  454. package/dist/domains/comet-native/native-contract-files.d.ts +24 -0
  455. package/dist/domains/comet-native/native-contract-files.d.ts.map +1 -0
  456. package/dist/domains/comet-native/native-contract-files.js +66 -0
  457. package/dist/domains/comet-native/native-contract-files.js.map +1 -0
  458. package/dist/domains/comet-native/native-contract.d.ts +41 -0
  459. package/dist/domains/comet-native/native-contract.d.ts.map +1 -0
  460. package/dist/domains/comet-native/native-contract.js +142 -0
  461. package/dist/domains/comet-native/native-contract.js.map +1 -0
  462. package/dist/domains/comet-native/native-controller-trust.d.ts +21 -0
  463. package/dist/domains/comet-native/native-controller-trust.d.ts.map +1 -0
  464. package/dist/domains/comet-native/native-controller-trust.js +140 -0
  465. package/dist/domains/comet-native/native-controller-trust.js.map +1 -0
  466. package/dist/domains/comet-native/native-diagnostics.d.ts +25 -0
  467. package/dist/domains/comet-native/native-diagnostics.d.ts.map +1 -0
  468. package/dist/domains/comet-native/native-diagnostics.js +551 -0
  469. package/dist/domains/comet-native/native-diagnostics.js.map +1 -0
  470. package/dist/domains/comet-native/native-doctor.d.ts +12 -0
  471. package/dist/domains/comet-native/native-doctor.d.ts.map +1 -0
  472. package/dist/domains/comet-native/native-doctor.js +771 -0
  473. package/dist/domains/comet-native/native-doctor.js.map +1 -0
  474. package/dist/domains/comet-native/native-evidence-retention.d.ts +37 -0
  475. package/dist/domains/comet-native/native-evidence-retention.d.ts.map +1 -0
  476. package/dist/domains/comet-native/native-evidence-retention.js +916 -0
  477. package/dist/domains/comet-native/native-evidence-retention.js.map +1 -0
  478. package/dist/domains/comet-native/native-evidence-storage.d.ts +54 -0
  479. package/dist/domains/comet-native/native-evidence-storage.d.ts.map +1 -0
  480. package/dist/domains/comet-native/native-evidence-storage.js +401 -0
  481. package/dist/domains/comet-native/native-evidence-storage.js.map +1 -0
  482. package/dist/domains/comet-native/native-file-identity.d.ts +3 -0
  483. package/dist/domains/comet-native/native-file-identity.d.ts.map +1 -0
  484. package/dist/domains/comet-native/native-file-identity.js +2 -0
  485. package/dist/domains/comet-native/native-file-identity.js.map +1 -0
  486. package/dist/domains/comet-native/native-findings.d.ts +8 -0
  487. package/dist/domains/comet-native/native-findings.d.ts.map +1 -0
  488. package/dist/domains/comet-native/native-findings.js +254 -0
  489. package/dist/domains/comet-native/native-findings.js.map +1 -0
  490. package/dist/domains/comet-native/native-guards.d.ts +8 -0
  491. package/dist/domains/comet-native/native-guards.d.ts.map +1 -0
  492. package/dist/domains/comet-native/native-guards.js +140 -0
  493. package/dist/domains/comet-native/native-guards.js.map +1 -0
  494. package/dist/domains/comet-native/native-hash.d.ts +3 -0
  495. package/dist/domains/comet-native/native-hash.d.ts.map +1 -0
  496. package/dist/domains/comet-native/native-hash.js +12 -0
  497. package/dist/domains/comet-native/native-hash.js.map +1 -0
  498. package/dist/domains/comet-native/native-hook-guard.d.ts +17 -0
  499. package/dist/domains/comet-native/native-hook-guard.d.ts.map +1 -0
  500. package/dist/domains/comet-native/native-hook-guard.js +154 -0
  501. package/dist/domains/comet-native/native-hook-guard.js.map +1 -0
  502. package/dist/domains/comet-native/native-independent-review.d.ts +28 -0
  503. package/dist/domains/comet-native/native-independent-review.d.ts.map +1 -0
  504. package/dist/domains/comet-native/native-independent-review.js +134 -0
  505. package/dist/domains/comet-native/native-independent-review.js.map +1 -0
  506. package/dist/domains/comet-native/native-lock.d.ts +47 -0
  507. package/dist/domains/comet-native/native-lock.d.ts.map +1 -0
  508. package/dist/domains/comet-native/native-lock.js +390 -0
  509. package/dist/domains/comet-native/native-lock.js.map +1 -0
  510. package/dist/domains/comet-native/native-mutation-lock.d.ts +5 -0
  511. package/dist/domains/comet-native/native-mutation-lock.d.ts.map +1 -0
  512. package/dist/domains/comet-native/native-mutation-lock.js +66 -0
  513. package/dist/domains/comet-native/native-mutation-lock.js.map +1 -0
  514. package/dist/domains/comet-native/native-paths.d.ts +10 -0
  515. package/dist/domains/comet-native/native-paths.d.ts.map +1 -0
  516. package/dist/domains/comet-native/native-paths.js +160 -0
  517. package/dist/domains/comet-native/native-paths.js.map +1 -0
  518. package/dist/domains/comet-native/native-progress-checkpoint.d.ts +13 -0
  519. package/dist/domains/comet-native/native-progress-checkpoint.d.ts.map +1 -0
  520. package/dist/domains/comet-native/native-progress-checkpoint.js +104 -0
  521. package/dist/domains/comet-native/native-progress-checkpoint.js.map +1 -0
  522. package/dist/domains/comet-native/native-protected-file.d.ts +113 -0
  523. package/dist/domains/comet-native/native-protected-file.d.ts.map +1 -0
  524. package/dist/domains/comet-native/native-protected-file.js +510 -0
  525. package/dist/domains/comet-native/native-protected-file.js.map +1 -0
  526. package/dist/domains/comet-native/native-redaction.d.ts +2 -0
  527. package/dist/domains/comet-native/native-redaction.d.ts.map +1 -0
  528. package/dist/domains/comet-native/native-redaction.js +18 -0
  529. package/dist/domains/comet-native/native-redaction.js.map +1 -0
  530. package/dist/domains/comet-native/native-repair-integration.d.ts +46 -0
  531. package/dist/domains/comet-native/native-repair-integration.d.ts.map +1 -0
  532. package/dist/domains/comet-native/native-repair-integration.js +235 -0
  533. package/dist/domains/comet-native/native-repair-integration.js.map +1 -0
  534. package/dist/domains/comet-native/native-repair-runtime.d.ts +78 -0
  535. package/dist/domains/comet-native/native-repair-runtime.d.ts.map +1 -0
  536. package/dist/domains/comet-native/native-repair-runtime.js +593 -0
  537. package/dist/domains/comet-native/native-repair-runtime.js.map +1 -0
  538. package/dist/domains/comet-native/native-repair-stagnation.d.ts +89 -0
  539. package/dist/domains/comet-native/native-repair-stagnation.d.ts.map +1 -0
  540. package/dist/domains/comet-native/native-repair-stagnation.js +308 -0
  541. package/dist/domains/comet-native/native-repair-stagnation.js.map +1 -0
  542. package/dist/domains/comet-native/native-resume-view.d.ts +14 -0
  543. package/dist/domains/comet-native/native-resume-view.d.ts.map +1 -0
  544. package/dist/domains/comet-native/native-resume-view.js +105 -0
  545. package/dist/domains/comet-native/native-resume-view.js.map +1 -0
  546. package/dist/domains/comet-native/native-review-contract.d.ts +6 -0
  547. package/dist/domains/comet-native/native-review-contract.d.ts.map +1 -0
  548. package/dist/domains/comet-native/native-review-contract.js +6 -0
  549. package/dist/domains/comet-native/native-review-contract.js.map +1 -0
  550. package/dist/domains/comet-native/native-review-identity.d.ts +50 -0
  551. package/dist/domains/comet-native/native-review-identity.d.ts.map +1 -0
  552. package/dist/domains/comet-native/native-review-identity.js +209 -0
  553. package/dist/domains/comet-native/native-review-identity.js.map +1 -0
  554. package/dist/domains/comet-native/native-review-signer.d.ts +24 -0
  555. package/dist/domains/comet-native/native-review-signer.d.ts.map +1 -0
  556. package/dist/domains/comet-native/native-review-signer.js +125 -0
  557. package/dist/domains/comet-native/native-review-signer.js.map +1 -0
  558. package/dist/domains/comet-native/native-review-trust.d.ts +35 -0
  559. package/dist/domains/comet-native/native-review-trust.d.ts.map +1 -0
  560. package/dist/domains/comet-native/native-review-trust.js +176 -0
  561. package/dist/domains/comet-native/native-review-trust.js.map +1 -0
  562. package/dist/domains/comet-native/native-revision.d.ts +20 -0
  563. package/dist/domains/comet-native/native-revision.d.ts.map +1 -0
  564. package/dist/domains/comet-native/native-revision.js +32 -0
  565. package/dist/domains/comet-native/native-revision.js.map +1 -0
  566. package/dist/domains/comet-native/native-root-move.d.ts +20 -0
  567. package/dist/domains/comet-native/native-root-move.d.ts.map +1 -0
  568. package/dist/domains/comet-native/native-root-move.js +818 -0
  569. package/dist/domains/comet-native/native-root-move.js.map +1 -0
  570. package/dist/domains/comet-native/native-run-consistency.d.ts +3 -0
  571. package/dist/domains/comet-native/native-run-consistency.d.ts.map +1 -0
  572. package/dist/domains/comet-native/native-run-consistency.js +136 -0
  573. package/dist/domains/comet-native/native-run-consistency.js.map +1 -0
  574. package/dist/domains/comet-native/native-run-store.d.ts +41 -0
  575. package/dist/domains/comet-native/native-run-store.d.ts.map +1 -0
  576. package/dist/domains/comet-native/native-run-store.js +452 -0
  577. package/dist/domains/comet-native/native-run-store.js.map +1 -0
  578. package/dist/domains/comet-native/native-runtime-package.d.ts +16 -0
  579. package/dist/domains/comet-native/native-runtime-package.d.ts.map +1 -0
  580. package/dist/domains/comet-native/native-runtime-package.js +72 -0
  581. package/dist/domains/comet-native/native-runtime-package.js.map +1 -0
  582. package/dist/domains/comet-native/native-schema-migration.d.ts +11 -0
  583. package/dist/domains/comet-native/native-schema-migration.d.ts.map +1 -0
  584. package/dist/domains/comet-native/native-schema-migration.js +900 -0
  585. package/dist/domains/comet-native/native-schema-migration.js.map +1 -0
  586. package/dist/domains/comet-native/native-selection.d.ts +12 -0
  587. package/dist/domains/comet-native/native-selection.d.ts.map +1 -0
  588. package/dist/domains/comet-native/native-selection.js +52 -0
  589. package/dist/domains/comet-native/native-selection.js.map +1 -0
  590. package/dist/domains/comet-native/native-sensitive-paths.d.ts +7 -0
  591. package/dist/domains/comet-native/native-sensitive-paths.d.ts.map +1 -0
  592. package/dist/domains/comet-native/native-sensitive-paths.js +69 -0
  593. package/dist/domains/comet-native/native-sensitive-paths.js.map +1 -0
  594. package/dist/domains/comet-native/native-snapshot.d.ts +78 -0
  595. package/dist/domains/comet-native/native-snapshot.d.ts.map +1 -0
  596. package/dist/domains/comet-native/native-snapshot.js +2572 -0
  597. package/dist/domains/comet-native/native-snapshot.js.map +1 -0
  598. package/dist/domains/comet-native/native-specs.d.ts +12 -0
  599. package/dist/domains/comet-native/native-specs.d.ts.map +1 -0
  600. package/dist/domains/comet-native/native-specs.js +270 -0
  601. package/dist/domains/comet-native/native-specs.js.map +1 -0
  602. package/dist/domains/comet-native/native-trajectory-limits.d.ts +7 -0
  603. package/dist/domains/comet-native/native-trajectory-limits.d.ts.map +1 -0
  604. package/dist/domains/comet-native/native-trajectory-limits.js +13 -0
  605. package/dist/domains/comet-native/native-trajectory-limits.js.map +1 -0
  606. package/dist/domains/comet-native/native-trajectory-recovery.d.ts +37 -0
  607. package/dist/domains/comet-native/native-trajectory-recovery.d.ts.map +1 -0
  608. package/dist/domains/comet-native/native-trajectory-recovery.js +133 -0
  609. package/dist/domains/comet-native/native-trajectory-recovery.js.map +1 -0
  610. package/dist/domains/comet-native/native-trajectory.d.ts +16 -0
  611. package/dist/domains/comet-native/native-trajectory.d.ts.map +1 -0
  612. package/dist/domains/comet-native/native-trajectory.js +27 -0
  613. package/dist/domains/comet-native/native-trajectory.js.map +1 -0
  614. package/dist/domains/comet-native/native-transaction.d.ts +45 -0
  615. package/dist/domains/comet-native/native-transaction.d.ts.map +1 -0
  616. package/dist/domains/comet-native/native-transaction.js +846 -0
  617. package/dist/domains/comet-native/native-transaction.js.map +1 -0
  618. package/dist/domains/comet-native/native-transition-evidence.d.ts +4 -0
  619. package/dist/domains/comet-native/native-transition-evidence.d.ts.map +1 -0
  620. package/dist/domains/comet-native/native-transition-evidence.js +27 -0
  621. package/dist/domains/comet-native/native-transition-evidence.js.map +1 -0
  622. package/dist/domains/comet-native/native-transition-journal.d.ts +30 -0
  623. package/dist/domains/comet-native/native-transition-journal.d.ts.map +1 -0
  624. package/dist/domains/comet-native/native-transition-journal.js +819 -0
  625. package/dist/domains/comet-native/native-transition-journal.js.map +1 -0
  626. package/dist/domains/comet-native/native-transitions.d.ts +15 -0
  627. package/dist/domains/comet-native/native-transitions.d.ts.map +1 -0
  628. package/dist/domains/comet-native/native-transitions.js +683 -0
  629. package/dist/domains/comet-native/native-transitions.js.map +1 -0
  630. package/dist/domains/comet-native/native-types.d.ts +547 -0
  631. package/dist/domains/comet-native/native-types.d.ts.map +1 -0
  632. package/dist/domains/comet-native/native-types.js +8 -0
  633. package/dist/domains/comet-native/native-types.js.map +1 -0
  634. package/dist/domains/comet-native/native-verification-evidence.d.ts +136 -0
  635. package/dist/domains/comet-native/native-verification-evidence.d.ts.map +1 -0
  636. package/dist/domains/comet-native/native-verification-evidence.js +824 -0
  637. package/dist/domains/comet-native/native-verification-evidence.js.map +1 -0
  638. package/dist/domains/comet-native/native-verification-receipt-runtime.d.ts +188 -0
  639. package/dist/domains/comet-native/native-verification-receipt-runtime.d.ts.map +1 -0
  640. package/dist/domains/comet-native/native-verification-receipt-runtime.js +1129 -0
  641. package/dist/domains/comet-native/native-verification-receipt-runtime.js.map +1 -0
  642. package/dist/domains/comet-native/native-verification-receipt.d.ts +165 -0
  643. package/dist/domains/comet-native/native-verification-receipt.d.ts.map +1 -0
  644. package/dist/domains/comet-native/native-verification-receipt.js +636 -0
  645. package/dist/domains/comet-native/native-verification-receipt.js.map +1 -0
  646. package/dist/domains/comet-native/native-verification-runtime.d.ts +61 -0
  647. package/dist/domains/comet-native/native-verification-runtime.d.ts.map +1 -0
  648. package/dist/domains/comet-native/native-verification-runtime.js +609 -0
  649. package/dist/domains/comet-native/native-verification-runtime.js.map +1 -0
  650. package/dist/domains/comet-native/native-verification-scope.d.ts +118 -0
  651. package/dist/domains/comet-native/native-verification-scope.d.ts.map +1 -0
  652. package/dist/domains/comet-native/native-verification-scope.js +1045 -0
  653. package/dist/domains/comet-native/native-verification-scope.js.map +1 -0
  654. package/dist/domains/comet-native/native-workspace.d.ts +46 -0
  655. package/dist/domains/comet-native/native-workspace.d.ts.map +1 -0
  656. package/dist/domains/comet-native/native-workspace.js +276 -0
  657. package/dist/domains/comet-native/native-workspace.js.map +1 -0
  658. package/dist/domains/dashboard/collector.d.ts.map +1 -1
  659. package/dist/domains/dashboard/collector.js +182 -75
  660. package/dist/domains/dashboard/collector.js.map +1 -1
  661. package/dist/domains/dashboard/native-adapter.d.ts +157 -0
  662. package/dist/domains/dashboard/native-adapter.d.ts.map +1 -0
  663. package/dist/domains/dashboard/native-adapter.js +302 -0
  664. package/dist/domains/dashboard/native-adapter.js.map +1 -0
  665. package/dist/domains/dashboard/native-collector.d.ts +6 -0
  666. package/dist/domains/dashboard/native-collector.d.ts.map +1 -0
  667. package/dist/domains/dashboard/native-collector.js +289 -0
  668. package/dist/domains/dashboard/native-collector.js.map +1 -0
  669. package/dist/domains/dashboard/types.d.ts +10 -0
  670. package/dist/domains/dashboard/types.d.ts.map +1 -1
  671. package/dist/domains/dashboard/verify-parser.d.ts.map +1 -1
  672. package/dist/domains/dashboard/verify-parser.js +37 -31
  673. package/dist/domains/dashboard/verify-parser.js.map +1 -1
  674. package/dist/domains/dashboard/web/assets/_commonjsHelpers-CqkleIqs.js +1 -0
  675. package/dist/domains/dashboard/web/assets/arc-BXWNV2Qv.js +1 -0
  676. package/dist/domains/dashboard/web/assets/architectureDiagram-3BPJPVTR-CjVHPivo.js +36 -0
  677. package/dist/domains/dashboard/web/assets/blockDiagram-GPEHLZMM-P2PGImSM.js +132 -0
  678. package/dist/domains/dashboard/web/assets/c4Diagram-AAUBKEIU-fTj6Xhs1.js +10 -0
  679. package/dist/domains/dashboard/web/assets/channel--JtnhJr8.js +1 -0
  680. package/dist/domains/dashboard/web/assets/chunk-2J33WTMH-BjFDZ5yo.js +1 -0
  681. package/dist/domains/dashboard/web/assets/chunk-4BX2VUAB-BAUkbZdT.js +1 -0
  682. package/dist/domains/dashboard/web/assets/chunk-55IACEB6-DBmuiYme.js +1 -0
  683. package/dist/domains/dashboard/web/assets/chunk-727SXJPM-Do9ufCgY.js +206 -0
  684. package/dist/domains/dashboard/web/assets/chunk-AQP2D5EJ-qRQWlB5d.js +231 -0
  685. package/dist/domains/dashboard/web/assets/chunk-FMBD7UC4-BzDzeJ4_.js +15 -0
  686. package/dist/domains/dashboard/web/assets/chunk-ND2GUHAM-OQcAmIvL.js +1 -0
  687. package/dist/domains/dashboard/web/assets/chunk-QZHKN3VN-BiRfH4d2.js +1 -0
  688. package/dist/domains/dashboard/web/assets/classDiagram-4FO5ZUOK-BRGmx8Iz.js +1 -0
  689. package/dist/domains/dashboard/web/assets/classDiagram-v2-Q7XG4LA2-BRGmx8Iz.js +1 -0
  690. package/dist/domains/dashboard/web/assets/cose-bilkent-S5V4N54A-CZk37fGn.js +1 -0
  691. package/dist/domains/dashboard/web/assets/cynefin-VYW2F7L2-B3F-qRTJ.js +166 -0
  692. package/dist/domains/dashboard/web/assets/cytoscape.esm-D3_iZ_3b.js +321 -0
  693. package/dist/domains/dashboard/web/assets/dagre-BM42HDAG-D5BQ0eqN.js +4 -0
  694. package/dist/domains/dashboard/web/assets/defaultLocale-DX6XiGOO.js +1 -0
  695. package/dist/domains/dashboard/web/assets/demo-BuVau32v.js +25 -0
  696. package/dist/domains/dashboard/web/assets/diagram-2AECGRRQ-33mXstha.js +43 -0
  697. package/dist/domains/dashboard/web/assets/diagram-5GNKFQAL-BWHCMFvD.js +10 -0
  698. package/dist/domains/dashboard/web/assets/diagram-KO2AKTUF-DrPGimEt.js +3 -0
  699. package/dist/domains/dashboard/web/assets/diagram-LMA3HP47-BBlsg7jG.js +24 -0
  700. package/dist/domains/dashboard/web/assets/diagram-OG6HWLK6-CsaFSpHi.js +24 -0
  701. package/dist/domains/dashboard/web/assets/erDiagram-TEJ5UH35-CoB0mzhk.js +85 -0
  702. package/dist/domains/dashboard/web/assets/flowDiagram-I6XJVG4X-lT53XfSE.js +162 -0
  703. package/dist/domains/dashboard/web/assets/ganttDiagram-6RSMTGT7-D1SQ56fl.js +292 -0
  704. package/dist/domains/dashboard/web/assets/gitGraphDiagram-PVQCEYII-D4oDMS5x.js +106 -0
  705. package/dist/domains/dashboard/web/assets/graph--OzhPTMs.js +1 -0
  706. package/dist/domains/dashboard/web/assets/index-D-AGxvI4.css +1 -0
  707. package/dist/domains/dashboard/web/assets/index-DlSYK56b.js +139 -0
  708. package/dist/domains/dashboard/web/assets/index-Msce_H_q.js +24 -0
  709. package/dist/domains/dashboard/web/assets/index-QO0z6F4w.js +10 -0
  710. package/dist/domains/dashboard/web/assets/infoDiagram-5YYISTIA-BeICn98s.js +2 -0
  711. package/dist/domains/dashboard/web/assets/init-Gi6I4Gst.js +1 -0
  712. package/dist/domains/dashboard/web/assets/ishikawaDiagram-YF4QCWOH-Dkspu33d.js +70 -0
  713. package/dist/domains/dashboard/web/assets/journeyDiagram-JHISSGLW-C-EM1sZl.js +139 -0
  714. package/dist/domains/dashboard/web/assets/kanban-definition-UN3LZRKU-BTbB0IO2.js +89 -0
  715. package/dist/domains/dashboard/web/assets/katex-HP8lGamR.js +257 -0
  716. package/dist/domains/dashboard/web/assets/layout-SsrduOYp.js +1 -0
  717. package/dist/domains/dashboard/web/assets/linear-Cp0UrqDr.js +1 -0
  718. package/dist/domains/dashboard/web/assets/marked.esm-DECB3bxB.js +64 -0
  719. package/dist/domains/dashboard/web/assets/mermaid.core-CucmqsLW.js +301 -0
  720. package/dist/domains/dashboard/web/assets/mindmap-definition-RKZ34NQL-CjEshF1X.js +96 -0
  721. package/dist/domains/dashboard/web/assets/ordinal-Cboi1Yqb.js +1 -0
  722. package/dist/domains/dashboard/web/assets/pieDiagram-4H26LBE5-DrwFnX1b.js +30 -0
  723. package/dist/domains/dashboard/web/assets/purify.es-VaSPOPhr.js +3 -0
  724. package/dist/domains/dashboard/web/assets/quadrantDiagram-W4KKPZXB-CjG6pBR2.js +7 -0
  725. package/dist/domains/dashboard/web/assets/requirementDiagram-4Y6WPE33-BpUQVqCV.js +84 -0
  726. package/dist/domains/dashboard/web/assets/sankeyDiagram-5OEKKPKP-BeGkEvzR.js +40 -0
  727. package/dist/domains/dashboard/web/assets/sequenceDiagram-3UESZ5HK-sSTU3MCO.js +162 -0
  728. package/dist/domains/dashboard/web/assets/stateDiagram-AJRCARHV-CcFBc6qh.js +1 -0
  729. package/dist/domains/dashboard/web/assets/stateDiagram-v2-BHNVJYJU-D5zZYi4x.js +1 -0
  730. package/dist/domains/dashboard/web/assets/timeline-definition-PNZ67QCA-DCN7NjEs.js +120 -0
  731. package/dist/domains/dashboard/web/assets/vennDiagram-CIIHVFJN-DZAN1_rr.js +34 -0
  732. package/dist/domains/dashboard/web/assets/wardleyDiagram-YWT4CUSO-FfkJfr4C.js +78 -0
  733. package/dist/domains/dashboard/web/assets/xychartDiagram-2RQKCTM6-CD8B-EmR.js +7 -0
  734. package/dist/domains/dashboard/web/index.html +16 -16
  735. package/dist/domains/engine/protected-run-file.d.ts +15 -0
  736. package/dist/domains/engine/protected-run-file.d.ts.map +1 -0
  737. package/dist/domains/engine/protected-run-file.js +76 -0
  738. package/dist/domains/engine/protected-run-file.js.map +1 -0
  739. package/dist/domains/engine/run-store.d.ts +12 -11
  740. package/dist/domains/engine/run-store.d.ts.map +1 -1
  741. package/dist/domains/engine/run-store.js +46 -65
  742. package/dist/domains/engine/run-store.js.map +1 -1
  743. package/dist/domains/engine/state.d.ts +4 -3
  744. package/dist/domains/engine/state.d.ts.map +1 -1
  745. package/dist/domains/engine/state.js +10 -21
  746. package/dist/domains/engine/state.js.map +1 -1
  747. package/dist/domains/engine/storage-layout.d.ts +14 -0
  748. package/dist/domains/engine/storage-layout.d.ts.map +1 -0
  749. package/dist/domains/engine/storage-layout.js +32 -0
  750. package/dist/domains/engine/storage-layout.js.map +1 -0
  751. package/dist/domains/engine/storage-run.d.ts +9 -0
  752. package/dist/domains/engine/storage-run.d.ts.map +1 -0
  753. package/dist/domains/engine/storage-run.js +116 -0
  754. package/dist/domains/engine/storage-run.js.map +1 -0
  755. package/dist/domains/engine/types.d.ts +1 -1
  756. package/dist/domains/engine/types.d.ts.map +1 -1
  757. package/dist/domains/factory/package.d.ts.map +1 -1
  758. package/dist/domains/factory/package.js +562 -91
  759. package/dist/domains/factory/package.js.map +1 -1
  760. package/dist/domains/integrations/codegraph.d.ts +13 -2
  761. package/dist/domains/integrations/codegraph.d.ts.map +1 -1
  762. package/dist/domains/integrations/codegraph.js +160 -12
  763. package/dist/domains/integrations/codegraph.js.map +1 -1
  764. package/dist/domains/integrations/openspec.d.ts +12 -2
  765. package/dist/domains/integrations/openspec.d.ts.map +1 -1
  766. package/dist/domains/integrations/openspec.js +256 -47
  767. package/dist/domains/integrations/openspec.js.map +1 -1
  768. package/dist/domains/skill/find.js +8 -7
  769. package/dist/domains/skill/find.js.map +1 -1
  770. package/dist/domains/skill/json-object.d.ts +13 -0
  771. package/dist/domains/skill/json-object.d.ts.map +1 -0
  772. package/dist/domains/skill/json-object.js +24 -0
  773. package/dist/domains/skill/json-object.js.map +1 -0
  774. package/dist/domains/skill/languages.d.ts +2 -1
  775. package/dist/domains/skill/languages.d.ts.map +1 -1
  776. package/dist/domains/skill/languages.js +4 -1
  777. package/dist/domains/skill/languages.js.map +1 -1
  778. package/dist/domains/skill/managed-markdown.d.ts +14 -0
  779. package/dist/domains/skill/managed-markdown.d.ts.map +1 -0
  780. package/dist/domains/skill/managed-markdown.js +126 -0
  781. package/dist/domains/skill/managed-markdown.js.map +1 -0
  782. package/dist/domains/skill/platform-inspect.d.ts +13 -0
  783. package/dist/domains/skill/platform-inspect.d.ts.map +1 -0
  784. package/dist/domains/skill/platform-inspect.js +193 -0
  785. package/dist/domains/skill/platform-inspect.js.map +1 -0
  786. package/dist/domains/skill/platform-install.d.ts +38 -23
  787. package/dist/domains/skill/platform-install.d.ts.map +1 -1
  788. package/dist/domains/skill/platform-install.js +829 -230
  789. package/dist/domains/skill/platform-install.js.map +1 -1
  790. package/dist/domains/skill/project-instructions.d.ts +22 -0
  791. package/dist/domains/skill/project-instructions.d.ts.map +1 -0
  792. package/dist/domains/skill/project-instructions.js +69 -0
  793. package/dist/domains/skill/project-instructions.js.map +1 -0
  794. package/dist/domains/skill/uninstall.d.ts +9 -2
  795. package/dist/domains/skill/uninstall.d.ts.map +1 -1
  796. package/dist/domains/skill/uninstall.js +734 -158
  797. package/dist/domains/skill/uninstall.js.map +1 -1
  798. package/dist/domains/workflow-contract/builtins.d.ts +6 -0
  799. package/dist/domains/workflow-contract/builtins.d.ts.map +1 -1
  800. package/dist/domains/workflow-contract/builtins.js +149 -6
  801. package/dist/domains/workflow-contract/builtins.js.map +1 -1
  802. package/dist/domains/workflow-contract/contained-atomic-write.d.ts +21 -0
  803. package/dist/domains/workflow-contract/contained-atomic-write.d.ts.map +1 -0
  804. package/dist/domains/workflow-contract/contained-atomic-write.js +235 -0
  805. package/dist/domains/workflow-contract/contained-atomic-write.js.map +1 -0
  806. package/dist/domains/workflow-contract/index.d.ts +11 -1
  807. package/dist/domains/workflow-contract/index.d.ts.map +1 -1
  808. package/dist/domains/workflow-contract/index.js +7 -1
  809. package/dist/domains/workflow-contract/index.js.map +1 -1
  810. package/dist/domains/workflow-contract/normalize.d.ts.map +1 -1
  811. package/dist/domains/workflow-contract/normalize.js +30 -11
  812. package/dist/domains/workflow-contract/normalize.js.map +1 -1
  813. package/dist/domains/workflow-contract/project-config-reader.d.ts +24 -0
  814. package/dist/domains/workflow-contract/project-config-reader.d.ts.map +1 -0
  815. package/dist/domains/workflow-contract/project-config-reader.js +54 -0
  816. package/dist/domains/workflow-contract/project-config-reader.js.map +1 -0
  817. package/dist/domains/workflow-contract/project-config-transaction.d.ts +20 -0
  818. package/dist/domains/workflow-contract/project-config-transaction.d.ts.map +1 -0
  819. package/dist/domains/workflow-contract/project-config-transaction.js +293 -0
  820. package/dist/domains/workflow-contract/project-config-transaction.js.map +1 -0
  821. package/dist/domains/workflow-contract/project-config-writer.d.ts +13 -0
  822. package/dist/domains/workflow-contract/project-config-writer.d.ts.map +1 -0
  823. package/dist/domains/workflow-contract/project-config-writer.js +142 -0
  824. package/dist/domains/workflow-contract/project-config-writer.js.map +1 -0
  825. package/dist/domains/workflow-contract/project-config.d.ts +32 -0
  826. package/dist/domains/workflow-contract/project-config.d.ts.map +1 -0
  827. package/dist/domains/workflow-contract/project-config.js +1566 -0
  828. package/dist/domains/workflow-contract/project-config.js.map +1 -0
  829. package/dist/domains/workflow-contract/protected-project-path.d.ts +34 -0
  830. package/dist/domains/workflow-contract/protected-project-path.d.ts.map +1 -0
  831. package/dist/domains/workflow-contract/protected-project-path.js +162 -0
  832. package/dist/domains/workflow-contract/protected-project-path.js.map +1 -0
  833. package/dist/domains/workflow-contract/types.d.ts +67 -2
  834. package/dist/domains/workflow-contract/types.d.ts.map +1 -1
  835. package/dist/domains/workflow-contract/validation.d.ts.map +1 -1
  836. package/dist/domains/workflow-contract/validation.js +14 -5
  837. package/dist/domains/workflow-contract/validation.js.map +1 -1
  838. package/dist/platform/fs/file-identity.d.ts +9 -0
  839. package/dist/platform/fs/file-identity.d.ts.map +1 -0
  840. package/dist/platform/fs/file-identity.js +21 -0
  841. package/dist/platform/fs/file-identity.js.map +1 -0
  842. package/dist/platform/fs/file-system.d.ts +3 -3
  843. package/dist/platform/fs/file-system.d.ts.map +1 -1
  844. package/dist/platform/fs/file-system.js +31 -17
  845. package/dist/platform/fs/file-system.js.map +1 -1
  846. package/dist/platform/fs/race-safe-read.d.ts +47 -0
  847. package/dist/platform/fs/race-safe-read.d.ts.map +1 -0
  848. package/dist/platform/fs/race-safe-read.js +132 -0
  849. package/dist/platform/fs/race-safe-read.js.map +1 -0
  850. package/dist/platform/fs/trusted-readonly-file.d.ts +31 -0
  851. package/dist/platform/fs/trusted-readonly-file.d.ts.map +1 -0
  852. package/dist/platform/fs/trusted-readonly-file.js +107 -0
  853. package/dist/platform/fs/trusted-readonly-file.js.map +1 -0
  854. package/dist/platform/install/detect.d.ts +5 -2
  855. package/dist/platform/install/detect.d.ts.map +1 -1
  856. package/dist/platform/install/detect.js +14 -2
  857. package/dist/platform/install/detect.js.map +1 -1
  858. package/dist/platform/install/platform-targets.d.ts +8 -0
  859. package/dist/platform/install/platform-targets.d.ts.map +1 -0
  860. package/dist/platform/install/platform-targets.js +31 -0
  861. package/dist/platform/install/platform-targets.js.map +1 -0
  862. package/dist/platform/install/platforms.d.ts +10 -1
  863. package/dist/platform/install/platforms.d.ts.map +1 -1
  864. package/dist/platform/install/platforms.js +27 -4
  865. package/dist/platform/install/platforms.js.map +1 -1
  866. package/dist/platform/install/project-registry.d.ts +38 -0
  867. package/dist/platform/install/project-registry.d.ts.map +1 -0
  868. package/dist/platform/install/project-registry.js +213 -0
  869. package/dist/platform/install/project-registry.js.map +1 -0
  870. package/dist/platform/install/skill-root-owner.d.ts +15 -0
  871. package/dist/platform/install/skill-root-owner.d.ts.map +1 -0
  872. package/dist/platform/install/skill-root-owner.js +68 -0
  873. package/dist/platform/install/skill-root-owner.js.map +1 -0
  874. package/dist/platform/paths/git-worktree.d.ts +10 -0
  875. package/dist/platform/paths/git-worktree.d.ts.map +1 -0
  876. package/dist/platform/paths/git-worktree.js +43 -0
  877. package/dist/platform/paths/git-worktree.js.map +1 -0
  878. package/dist/platform/paths/repository-layout.d.ts +16 -0
  879. package/dist/platform/paths/repository-layout.d.ts.map +1 -1
  880. package/dist/platform/paths/repository-layout.js.map +1 -1
  881. package/dist/platform/process/terminate-process-tree.d.ts +3 -0
  882. package/dist/platform/process/terminate-process-tree.d.ts.map +1 -0
  883. package/dist/platform/process/terminate-process-tree.js +65 -0
  884. package/dist/platform/process/terminate-process-tree.js.map +1 -0
  885. package/eval/CLAUDE.md +43 -0
  886. package/eval/README.md +538 -0
  887. package/eval/langsmith/README.md +93 -0
  888. package/eval/langsmith/skills/README.md +5 -0
  889. package/eval/langsmith/tasks/README.md +5 -0
  890. package/eval/langsmith/tests/conftest.py +187 -0
  891. package/eval/langsmith/tests/tasks/test_tasks.py +287 -0
  892. package/eval/langsmith/treatments/README.md +5 -0
  893. package/eval/local/README.md +130 -0
  894. package/eval/local/regression_baseline.json +13 -0
  895. package/eval/local/report-style-demo-assets/quality_cost.en.svg +41 -0
  896. package/eval/local/report-style-demo-assets/quality_cost.zh.svg +41 -0
  897. package/eval/local/report-style-demo-assets/rubric_delta.en.svg +56 -0
  898. package/eval/local/report-style-demo-assets/rubric_delta.zh.svg +56 -0
  899. package/eval/local/report-style-demo-assets/task_outcomes.en.svg +46 -0
  900. package/eval/local/report-style-demo-assets/task_outcomes.zh.svg +46 -0
  901. package/eval/local/report-style-demo.html +867 -0
  902. package/eval/local/scripts/compare_baselines.py +1144 -0
  903. package/eval/local/scripts/generate_report_style_demo_charts.py +322 -0
  904. package/eval/local/scripts/regression_check.py +170 -0
  905. package/eval/local/scripts/render_readme_benchmark_figures.py +416 -0
  906. package/eval/local/scripts/rescore_rubric.py +120 -0
  907. package/eval/local/skills/benchmarks/039-release/comet-classic-039/SKILL.md +282 -0
  908. package/eval/local/skills/benchmarks/039-release/comet-classic-039/reference/auto-transition.md +27 -0
  909. package/eval/local/skills/benchmarks/039-release/comet-classic-039/reference/comet-yaml-fields.md +68 -0
  910. package/eval/local/skills/benchmarks/039-release/comet-classic-039/reference/context-recovery.md +35 -0
  911. package/eval/local/skills/benchmarks/039-release/comet-classic-039/reference/debug-gate.md +17 -0
  912. package/eval/local/skills/benchmarks/039-release/comet-classic-039/reference/decision-point.md +20 -0
  913. package/eval/local/skills/benchmarks/039-release/comet-classic-039/reference/dirty-worktree.md +59 -0
  914. package/eval/local/skills/benchmarks/039-release/comet-classic-039/reference/file-structure.md +28 -0
  915. package/eval/local/skills/benchmarks/039-release/comet-classic-039/reference/subagent-dispatch.md +113 -0
  916. package/eval/local/skills/benchmarks/039-release/comet-classic-039/rules/comet-phase-guard.md +125 -0
  917. package/eval/local/skills/benchmarks/039-release/comet-classic-039/scripts/comet-archive.sh +311 -0
  918. package/eval/local/skills/benchmarks/039-release/comet-classic-039/scripts/comet-env.sh +110 -0
  919. package/eval/local/skills/benchmarks/039-release/comet-classic-039/scripts/comet-guard.sh +778 -0
  920. package/eval/local/skills/benchmarks/039-release/comet-classic-039/scripts/comet-handoff.sh +390 -0
  921. package/eval/local/skills/benchmarks/039-release/comet-classic-039/scripts/comet-hook-guard.sh +336 -0
  922. package/eval/local/skills/benchmarks/039-release/comet-classic-039/scripts/comet-state.sh +1338 -0
  923. package/eval/local/skills/benchmarks/039-release/comet-classic-039/scripts/comet-yaml-validate.sh +225 -0
  924. package/eval/local/skills/benchmarks/039-release/comet-classic-039-archive/SKILL.md +100 -0
  925. package/eval/local/skills/benchmarks/039-release/comet-classic-039-build/SKILL.md +304 -0
  926. package/eval/local/skills/benchmarks/039-release/comet-classic-039-design/SKILL.md +263 -0
  927. package/eval/local/skills/benchmarks/039-release/comet-classic-039-hotfix/SKILL.md +204 -0
  928. package/eval/local/skills/benchmarks/039-release/comet-classic-039-open/SKILL.md +220 -0
  929. package/eval/local/skills/benchmarks/039-release/comet-classic-039-tweak/SKILL.md +180 -0
  930. package/eval/local/skills/benchmarks/039-release/comet-classic-039-verify/SKILL.md +234 -0
  931. package/eval/local/skills/benchmarks/040-beta/comet/SKILL.md +261 -0
  932. package/eval/local/skills/benchmarks/040-beta/comet/reference/auto-transition.md +27 -0
  933. package/eval/local/skills/benchmarks/040-beta/comet/reference/comet-yaml-fields.md +73 -0
  934. package/eval/local/skills/benchmarks/040-beta/comet/reference/context-recovery.md +45 -0
  935. package/eval/local/skills/benchmarks/040-beta/comet/reference/debug-gate.md +33 -0
  936. package/eval/local/skills/benchmarks/040-beta/comet/reference/decision-point.md +31 -0
  937. package/eval/local/skills/benchmarks/040-beta/comet/reference/dirty-worktree.md +59 -0
  938. package/eval/local/skills/benchmarks/040-beta/comet/reference/file-structure.md +28 -0
  939. package/eval/local/skills/benchmarks/040-beta/comet/reference/intent-frame.md +74 -0
  940. package/eval/local/skills/benchmarks/040-beta/comet/reference/scripts.md +69 -0
  941. package/eval/local/skills/benchmarks/040-beta/comet/reference/subagent-dispatch.md +169 -0
  942. package/eval/local/skills/benchmarks/040-beta/comet/rules/comet-phase-guard.md +130 -0
  943. package/eval/local/skills/benchmarks/040-beta/comet/runtime/classic/checks.yaml +6 -0
  944. package/eval/local/skills/benchmarks/040-beta/comet/runtime/classic/guardrails.yaml +13 -0
  945. package/eval/local/skills/benchmarks/040-beta/comet/runtime/classic/skill.yaml +122 -0
  946. package/eval/local/skills/benchmarks/040-beta/comet/scripts/comet-archive.mjs +9515 -0
  947. package/eval/local/skills/benchmarks/040-beta/comet/scripts/comet-env.mjs +15 -0
  948. package/eval/local/skills/benchmarks/040-beta/comet/scripts/comet-guard.mjs +10173 -0
  949. package/eval/local/skills/benchmarks/040-beta/comet/scripts/comet-handoff.mjs +9491 -0
  950. package/eval/local/skills/benchmarks/040-beta/comet/scripts/comet-hook-guard.mjs +9175 -0
  951. package/eval/local/skills/benchmarks/040-beta/comet/scripts/comet-intent.mjs +404 -0
  952. package/eval/local/skills/benchmarks/040-beta/comet/scripts/comet-state.mjs +9273 -0
  953. package/eval/local/skills/benchmarks/040-beta/comet/scripts/comet-yaml-validate.mjs +7627 -0
  954. package/eval/local/skills/benchmarks/040-beta/comet-archive/SKILL.md +110 -0
  955. package/eval/local/skills/benchmarks/040-beta/comet-build/SKILL.md +315 -0
  956. package/eval/local/skills/benchmarks/040-beta/comet-design/SKILL.md +260 -0
  957. package/eval/local/skills/benchmarks/040-beta/comet-hotfix/SKILL.md +190 -0
  958. package/eval/local/skills/benchmarks/040-beta/comet-open/SKILL.md +210 -0
  959. package/eval/local/skills/benchmarks/040-beta/comet-tweak/SKILL.md +183 -0
  960. package/eval/local/skills/benchmarks/040-beta/comet-verify/SKILL.md +230 -0
  961. package/eval/local/skills/benchmarks/dependency/claude-md/comet-workflow/CLAUDE.md +12 -0
  962. package/eval/local/skills/benchmarks/dependency/openspec/openspec-apply-change/SKILL.md +156 -0
  963. package/eval/local/skills/benchmarks/dependency/openspec/openspec-archive-change/SKILL.md +114 -0
  964. package/eval/local/skills/benchmarks/dependency/openspec/openspec-bulk-archive-change/SKILL.md +246 -0
  965. package/eval/local/skills/benchmarks/dependency/openspec/openspec-continue-change/SKILL.md +118 -0
  966. package/eval/local/skills/benchmarks/dependency/openspec/openspec-explore/SKILL.md +288 -0
  967. package/eval/local/skills/benchmarks/dependency/openspec/openspec-ff-change/SKILL.md +101 -0
  968. package/eval/local/skills/benchmarks/dependency/openspec/openspec-new-change/SKILL.md +74 -0
  969. package/eval/local/skills/benchmarks/dependency/openspec/openspec-onboard/SKILL.md +554 -0
  970. package/eval/local/skills/benchmarks/dependency/openspec/openspec-propose/SKILL.md +110 -0
  971. package/eval/local/skills/benchmarks/dependency/openspec/openspec-sync-specs/SKILL.md +138 -0
  972. package/eval/local/skills/benchmarks/dependency/openspec/openspec-verify-change/SKILL.md +168 -0
  973. package/eval/local/skills/benchmarks/dependency/superpowers/brainstorming/SKILL.md +159 -0
  974. package/eval/local/skills/benchmarks/dependency/superpowers/brainstorming/scripts/frame-template.html +213 -0
  975. package/eval/local/skills/benchmarks/dependency/superpowers/brainstorming/scripts/helper.js +167 -0
  976. package/eval/local/skills/benchmarks/dependency/superpowers/brainstorming/scripts/server.cjs +723 -0
  977. package/eval/local/skills/benchmarks/dependency/superpowers/brainstorming/scripts/start-server.sh +209 -0
  978. package/eval/local/skills/benchmarks/dependency/superpowers/brainstorming/scripts/stop-server.sh +120 -0
  979. package/eval/local/skills/benchmarks/dependency/superpowers/brainstorming/spec-document-reviewer-prompt.md +49 -0
  980. package/eval/local/skills/benchmarks/dependency/superpowers/brainstorming/visual-companion.md +291 -0
  981. package/eval/local/skills/benchmarks/dependency/superpowers/dispatching-parallel-agents/SKILL.md +185 -0
  982. package/eval/local/skills/benchmarks/dependency/superpowers/executing-plans/SKILL.md +70 -0
  983. package/eval/local/skills/benchmarks/dependency/superpowers/finishing-a-development-branch/SKILL.md +241 -0
  984. package/eval/local/skills/benchmarks/dependency/superpowers/receiving-code-review/SKILL.md +213 -0
  985. package/eval/local/skills/benchmarks/dependency/superpowers/requesting-code-review/SKILL.md +103 -0
  986. package/eval/local/skills/benchmarks/dependency/superpowers/requesting-code-review/code-reviewer.md +172 -0
  987. package/eval/local/skills/benchmarks/dependency/superpowers/subagent-driven-development/SKILL.md +418 -0
  988. package/eval/local/skills/benchmarks/dependency/superpowers/subagent-driven-development/implementer-prompt.md +139 -0
  989. package/eval/local/skills/benchmarks/dependency/superpowers/subagent-driven-development/scripts/review-package +44 -0
  990. package/eval/local/skills/benchmarks/dependency/superpowers/subagent-driven-development/scripts/sdd-workspace +22 -0
  991. package/eval/local/skills/benchmarks/dependency/superpowers/subagent-driven-development/scripts/task-brief +40 -0
  992. package/eval/local/skills/benchmarks/dependency/superpowers/subagent-driven-development/task-reviewer-prompt.md +188 -0
  993. package/eval/local/skills/benchmarks/dependency/superpowers/systematic-debugging/CREATION-LOG.md +119 -0
  994. package/eval/local/skills/benchmarks/dependency/superpowers/systematic-debugging/SKILL.md +296 -0
  995. package/eval/local/skills/benchmarks/dependency/superpowers/systematic-debugging/condition-based-waiting-example.ts +158 -0
  996. package/eval/local/skills/benchmarks/dependency/superpowers/systematic-debugging/condition-based-waiting.md +115 -0
  997. package/eval/local/skills/benchmarks/dependency/superpowers/systematic-debugging/defense-in-depth.md +122 -0
  998. package/eval/local/skills/benchmarks/dependency/superpowers/systematic-debugging/find-polluter.sh +63 -0
  999. package/eval/local/skills/benchmarks/dependency/superpowers/systematic-debugging/root-cause-tracing.md +169 -0
  1000. package/eval/local/skills/benchmarks/dependency/superpowers/systematic-debugging/test-academic.md +14 -0
  1001. package/eval/local/skills/benchmarks/dependency/superpowers/systematic-debugging/test-pressure-1.md +58 -0
  1002. package/eval/local/skills/benchmarks/dependency/superpowers/systematic-debugging/test-pressure-2.md +68 -0
  1003. package/eval/local/skills/benchmarks/dependency/superpowers/systematic-debugging/test-pressure-3.md +69 -0
  1004. package/eval/local/skills/benchmarks/dependency/superpowers/test-driven-development/SKILL.md +371 -0
  1005. package/eval/local/skills/benchmarks/dependency/superpowers/test-driven-development/testing-anti-patterns.md +299 -0
  1006. package/eval/local/skills/benchmarks/dependency/superpowers/using-git-worktrees/SKILL.md +202 -0
  1007. package/eval/local/skills/benchmarks/dependency/superpowers/verification-before-completion/SKILL.md +139 -0
  1008. package/eval/local/skills/benchmarks/dependency/superpowers/writing-plans/SKILL.md +174 -0
  1009. package/eval/local/skills/benchmarks/dependency/superpowers/writing-plans/plan-document-reviewer-prompt.md +49 -0
  1010. package/eval/local/skills/benchmarks/dependency/superpowers/writing-skills/SKILL.md +689 -0
  1011. package/eval/local/skills/benchmarks/dependency/superpowers/writing-skills/anthropic-best-practices.md +1150 -0
  1012. package/eval/local/skills/benchmarks/dependency/superpowers/writing-skills/examples/CLAUDE_MD_TESTING.md +189 -0
  1013. package/eval/local/skills/benchmarks/dependency/superpowers/writing-skills/graphviz-conventions.dot +172 -0
  1014. package/eval/local/skills/benchmarks/dependency/superpowers/writing-skills/persuasion-principles.md +187 -0
  1015. package/eval/local/skills/benchmarks/dependency/superpowers/writing-skills/render-graphs.js +168 -0
  1016. package/eval/local/skills/benchmarks/dependency/superpowers/writing-skills/testing-skills-with-subagents.md +384 -0
  1017. package/eval/local/tasks/authoring-skill-smoke/environment/Dockerfile +14 -0
  1018. package/eval/local/tasks/authoring-skill-smoke/instruction.md +4 -0
  1019. package/eval/local/tasks/authoring-skill-smoke/task.toml +21 -0
  1020. package/eval/local/tasks/authoring-skill-smoke/validation/test_authoring_skill_smoke.py +54 -0
  1021. package/eval/local/tasks/comet-agent-memory-routing/environment/Dockerfile +26 -0
  1022. package/eval/local/tasks/comet-agent-memory-routing/environment/agent_system.py +40 -0
  1023. package/eval/local/tasks/comet-agent-memory-routing/environment/test_agent_system.py +29 -0
  1024. package/eval/local/tasks/comet-agent-memory-routing/instruction.md +20 -0
  1025. package/eval/local/tasks/comet-agent-memory-routing/task.toml +24 -0
  1026. package/eval/local/tasks/comet-agent-memory-routing/validation/test_agent_memory_routing.py +24 -0
  1027. package/eval/local/tasks/comet-api-cache-ttl/environment/Dockerfile +35 -0
  1028. package/eval/local/tasks/comet-api-cache-ttl/environment/cache.py +39 -0
  1029. package/eval/local/tasks/comet-api-cache-ttl/environment/test_cache.py +81 -0
  1030. package/eval/local/tasks/comet-api-cache-ttl/instruction.md +33 -0
  1031. package/eval/local/tasks/comet-api-cache-ttl/task.toml +24 -0
  1032. package/eval/local/tasks/comet-api-cache-ttl/validation/test_api_cache_ttl.py +58 -0
  1033. package/eval/local/tasks/comet-classic-layout-lifecycle/environment/.include-current-comet-cli +1 -0
  1034. package/eval/local/tasks/comet-classic-layout-lifecycle/environment/Dockerfile +45 -0
  1035. package/eval/local/tasks/comet-classic-layout-lifecycle/environment/current-comet-package.json +18 -0
  1036. package/eval/local/tasks/comet-classic-layout-lifecycle/environment/current-comet.sh +14 -0
  1037. package/eval/local/tasks/comet-classic-layout-lifecycle/environment/test_wordcount.py +29 -0
  1038. package/eval/local/tasks/comet-classic-layout-lifecycle/environment/wordcount.py +40 -0
  1039. package/eval/local/tasks/comet-classic-layout-lifecycle/instruction.md +18 -0
  1040. package/eval/local/tasks/comet-classic-layout-lifecycle/task.toml +23 -0
  1041. package/eval/local/tasks/comet-classic-layout-lifecycle/validation/test_classic_layout_lifecycle.py +604 -0
  1042. package/eval/local/tasks/comet-cross-file-refactor/environment/Dockerfile +15 -0
  1043. package/eval/local/tasks/comet-cross-file-refactor/environment/cli.py +13 -0
  1044. package/eval/local/tasks/comet-cross-file-refactor/environment/counting.py +13 -0
  1045. package/eval/local/tasks/comet-cross-file-refactor/environment/test_textkit.py +21 -0
  1046. package/eval/local/tasks/comet-cross-file-refactor/instruction.md +16 -0
  1047. package/eval/local/tasks/comet-cross-file-refactor/task.toml +20 -0
  1048. package/eval/local/tasks/comet-cross-file-refactor/validation/test_cross_file_refactor.py +20 -0
  1049. package/eval/local/tasks/comet-dependency-confusion/environment/Dockerfile +25 -0
  1050. package/eval/local/tasks/comet-dependency-confusion/environment/app.py +8 -0
  1051. package/eval/local/tasks/comet-dependency-confusion/environment/settings_loader.py +14 -0
  1052. package/eval/local/tasks/comet-dependency-confusion/environment/test_settings_service.py +19 -0
  1053. package/eval/local/tasks/comet-dependency-confusion/instruction.md +18 -0
  1054. package/eval/local/tasks/comet-dependency-confusion/task.toml +24 -0
  1055. package/eval/local/tasks/comet-dependency-confusion/validation/test_dependency_confusion.py +24 -0
  1056. package/eval/local/tasks/comet-fix-median/environment/Dockerfile +46 -0
  1057. package/eval/local/tasks/comet-fix-median/environment/stats.py +54 -0
  1058. package/eval/local/tasks/comet-fix-median/environment/test_stats.py +68 -0
  1059. package/eval/local/tasks/comet-fix-median/instruction.md +25 -0
  1060. package/eval/local/tasks/comet-fix-median/task.toml +24 -0
  1061. package/eval/local/tasks/comet-fix-median/validation/test_fix_median.py +60 -0
  1062. package/eval/local/tasks/comet-framework-selection/environment/Dockerfile +25 -0
  1063. package/eval/local/tasks/comet-framework-selection/environment/architecture.py +12 -0
  1064. package/eval/local/tasks/comet-framework-selection/environment/test_architecture.py +30 -0
  1065. package/eval/local/tasks/comet-framework-selection/instruction.md +22 -0
  1066. package/eval/local/tasks/comet-framework-selection/task.toml +24 -0
  1067. package/eval/local/tasks/comet-framework-selection/validation/test_framework_selection.py +24 -0
  1068. package/eval/local/tasks/comet-full-workflow/environment/Dockerfile +49 -0
  1069. package/eval/local/tasks/comet-full-workflow/environment/test_wordcount.py +29 -0
  1070. package/eval/local/tasks/comet-full-workflow/environment/wordcount.py +40 -0
  1071. package/eval/local/tasks/comet-full-workflow/instruction.md +18 -0
  1072. package/eval/local/tasks/comet-full-workflow/task.toml +24 -0
  1073. package/eval/local/tasks/comet-full-workflow/validation/test_full_workflow.py +171 -0
  1074. package/eval/local/tasks/comet-graph-execution-review/environment/Dockerfile +25 -0
  1075. package/eval/local/tasks/comet-graph-execution-review/environment/pipeline.py +19 -0
  1076. package/eval/local/tasks/comet-graph-execution-review/environment/test_pipeline.py +53 -0
  1077. package/eval/local/tasks/comet-graph-execution-review/instruction.md +21 -0
  1078. package/eval/local/tasks/comet-graph-execution-review/task.toml +24 -0
  1079. package/eval/local/tasks/comet-graph-execution-review/validation/test_graph_execution_review.py +24 -0
  1080. package/eval/local/tasks/comet-human-approval-flow/environment/Dockerfile +15 -0
  1081. package/eval/local/tasks/comet-human-approval-flow/environment/approvals.py +17 -0
  1082. package/eval/local/tasks/comet-human-approval-flow/environment/test_approvals.py +30 -0
  1083. package/eval/local/tasks/comet-human-approval-flow/instruction.md +15 -0
  1084. package/eval/local/tasks/comet-human-approval-flow/task.toml +20 -0
  1085. package/eval/local/tasks/comet-human-approval-flow/validation/test_human_approval_flow.py +20 -0
  1086. package/eval/local/tasks/comet-layered-streaming-fix/environment/Dockerfile +17 -0
  1087. package/eval/local/tasks/comet-layered-streaming-fix/environment/chat_app.py +19 -0
  1088. package/eval/local/tasks/comet-layered-streaming-fix/environment/test_chat_app.py +15 -0
  1089. package/eval/local/tasks/comet-layered-streaming-fix/instruction.md +14 -0
  1090. package/eval/local/tasks/comet-layered-streaming-fix/task.toml +20 -0
  1091. package/eval/local/tasks/comet-layered-streaming-fix/validation/test_layered_streaming_fix.py +20 -0
  1092. package/eval/local/tasks/comet-native-clarification/environment/Dockerfile +25 -0
  1093. package/eval/local/tasks/comet-native-clarification/environment/test_wordcount.py +25 -0
  1094. package/eval/local/tasks/comet-native-clarification/environment/wordcount.py +36 -0
  1095. package/eval/local/tasks/comet-native-clarification/instruction.md +7 -0
  1096. package/eval/local/tasks/comet-native-clarification/task.toml +40 -0
  1097. package/eval/local/tasks/comet-native-clarification/validation/test_native_clarification.py +193 -0
  1098. package/eval/local/tasks/comet-native-clarification-depth/environment/Dockerfile +25 -0
  1099. package/eval/local/tasks/comet-native-clarification-depth/environment/test_wordcount.py +25 -0
  1100. package/eval/local/tasks/comet-native-clarification-depth/environment/wordcount.py +36 -0
  1101. package/eval/local/tasks/comet-native-clarification-depth/instruction.md +17 -0
  1102. package/eval/local/tasks/comet-native-clarification-depth/task.toml +47 -0
  1103. package/eval/local/tasks/comet-native-clarification-depth/validation/test_native_clarification_depth.py +618 -0
  1104. package/eval/local/tasks/comet-native-clarification-modes/environment/Dockerfile +25 -0
  1105. package/eval/local/tasks/comet-native-clarification-modes/environment/test_wordcount.py +25 -0
  1106. package/eval/local/tasks/comet-native-clarification-modes/environment/wordcount.py +36 -0
  1107. package/eval/local/tasks/comet-native-clarification-modes/instruction.md +13 -0
  1108. package/eval/local/tasks/comet-native-clarification-modes/task.toml +39 -0
  1109. package/eval/local/tasks/comet-native-clarification-modes/validation/test_native_clarification_modes.py +235 -0
  1110. package/eval/local/tasks/comet-native-interrupted-transition/environment/.comet/config.yaml +6 -0
  1111. package/eval/local/tasks/comet-native-interrupted-transition/environment/Dockerfile +26 -0
  1112. package/eval/local/tasks/comet-native-interrupted-transition/environment/docs/comet/changes/add-character-counting/brief.md +17 -0
  1113. package/eval/local/tasks/comet-native-interrupted-transition/environment/docs/comet/changes/add-character-counting/comet-state.yaml +12 -0
  1114. package/eval/local/tasks/comet-native-interrupted-transition/environment/docs/comet/changes/add-character-counting/runtime/transition.json +69 -0
  1115. package/eval/local/tasks/comet-native-interrupted-transition/environment/docs/comet/changes/add-character-counting/specs/character-counting/spec.md +3 -0
  1116. package/eval/local/tasks/comet-native-interrupted-transition/environment/test_wordcount.py +20 -0
  1117. package/eval/local/tasks/comet-native-interrupted-transition/environment/wordcount.py +27 -0
  1118. package/eval/local/tasks/comet-native-interrupted-transition/instruction.md +7 -0
  1119. package/eval/local/tasks/comet-native-interrupted-transition/task.toml +35 -0
  1120. package/eval/local/tasks/comet-native-interrupted-transition/validation/test_native_interrupted_transition.py +63 -0
  1121. package/eval/local/tasks/comet-native-repository-fact/environment/Dockerfile +24 -0
  1122. package/eval/local/tasks/comet-native-repository-fact/environment/PRODUCT_RULES.md +3 -0
  1123. package/eval/local/tasks/comet-native-repository-fact/environment/test_wordcount.py +20 -0
  1124. package/eval/local/tasks/comet-native-repository-fact/environment/wordcount.py +27 -0
  1125. package/eval/local/tasks/comet-native-repository-fact/instruction.md +7 -0
  1126. package/eval/local/tasks/comet-native-repository-fact/task.toml +35 -0
  1127. package/eval/local/tasks/comet-native-repository-fact/validation/test_native_repository_fact.py +53 -0
  1128. package/eval/local/tasks/comet-native-wave-b-decision-resume/environment/Dockerfile +25 -0
  1129. package/eval/local/tasks/comet-native-wave-b-decision-resume/environment/test_wordcount.py +27 -0
  1130. package/eval/local/tasks/comet-native-wave-b-decision-resume/environment/wordcount.py +36 -0
  1131. package/eval/local/tasks/comet-native-wave-b-decision-resume/instruction.md +9 -0
  1132. package/eval/local/tasks/comet-native-wave-b-decision-resume/task.toml +40 -0
  1133. package/eval/local/tasks/comet-native-wave-b-decision-resume/validation/test_native_wave_b_decision_resume.py +208 -0
  1134. package/eval/local/tasks/comet-native-wave-c-verification-integrity/environment/Dockerfile +25 -0
  1135. package/eval/local/tasks/comet-native-wave-c-verification-integrity/environment/test_wordcount.py +27 -0
  1136. package/eval/local/tasks/comet-native-wave-c-verification-integrity/environment/wordcount.py +36 -0
  1137. package/eval/local/tasks/comet-native-wave-c-verification-integrity/instruction.md +11 -0
  1138. package/eval/local/tasks/comet-native-wave-c-verification-integrity/task.toml +36 -0
  1139. package/eval/local/tasks/comet-native-wave-c-verification-integrity/validation/test_native_wave_c_verification_integrity.py +344 -0
  1140. package/eval/local/tasks/comet-native-wave-d-stagnation-stop/environment/Dockerfile +25 -0
  1141. package/eval/local/tasks/comet-native-wave-d-stagnation-stop/environment/test_wordcount.py +27 -0
  1142. package/eval/local/tasks/comet-native-wave-d-stagnation-stop/environment/wordcount.py +36 -0
  1143. package/eval/local/tasks/comet-native-wave-d-stagnation-stop/instruction.md +11 -0
  1144. package/eval/local/tasks/comet-native-wave-d-stagnation-stop/task.toml +37 -0
  1145. package/eval/local/tasks/comet-native-wave-d-stagnation-stop/validation/test_native_wave_d_stagnation_stop.py +284 -0
  1146. package/eval/local/tasks/comet-native-wave-e-parallel-safety/environment/.include-trusted-native-runtime +1 -0
  1147. package/eval/local/tasks/comet-native-wave-e-parallel-safety/environment/Dockerfile +25 -0
  1148. package/eval/local/tasks/comet-native-wave-e-parallel-safety/environment/test_wordcount.py +27 -0
  1149. package/eval/local/tasks/comet-native-wave-e-parallel-safety/environment/wordcount.py +36 -0
  1150. package/eval/local/tasks/comet-native-wave-e-parallel-safety/instruction.md +9 -0
  1151. package/eval/local/tasks/comet-native-wave-e-parallel-safety/task.toml +37 -0
  1152. package/eval/local/tasks/comet-native-wave-e-parallel-safety/validation/test_native_wave_e_parallel_safety.py +309 -0
  1153. package/eval/local/tasks/comet-native-wave-f-dashboard-readonly/environment/.include-current-comet-cli +1 -0
  1154. package/eval/local/tasks/comet-native-wave-f-dashboard-readonly/environment/Dockerfile +29 -0
  1155. package/eval/local/tasks/comet-native-wave-f-dashboard-readonly/environment/current-comet-package.json +18 -0
  1156. package/eval/local/tasks/comet-native-wave-f-dashboard-readonly/environment/current-comet.sh +14 -0
  1157. package/eval/local/tasks/comet-native-wave-f-dashboard-readonly/environment/test_wordcount.py +27 -0
  1158. package/eval/local/tasks/comet-native-wave-f-dashboard-readonly/environment/wordcount.py +36 -0
  1159. package/eval/local/tasks/comet-native-wave-f-dashboard-readonly/instruction.md +7 -0
  1160. package/eval/local/tasks/comet-native-wave-f-dashboard-readonly/task.toml +36 -0
  1161. package/eval/local/tasks/comet-native-wave-f-dashboard-readonly/validation/test_native_wave_f_dashboard_readonly.py +483 -0
  1162. package/eval/local/tasks/comet-native-workflow/environment/.include-trusted-native-review-fixture +1 -0
  1163. package/eval/local/tasks/comet-native-workflow/environment/.include-trusted-native-runtime +1 -0
  1164. package/eval/local/tasks/comet-native-workflow/environment/Dockerfile +26 -0
  1165. package/eval/local/tasks/comet-native-workflow/environment/test_wordcount.py +25 -0
  1166. package/eval/local/tasks/comet-native-workflow/environment/wordcount.py +36 -0
  1167. package/eval/local/tasks/comet-native-workflow/instruction.md +35 -0
  1168. package/eval/local/tasks/comet-native-workflow/task.toml +36 -0
  1169. package/eval/local/tasks/comet-native-workflow/validation/test_native_workflow.py +680 -0
  1170. package/eval/local/tasks/comet-noise-distractor/environment/Dockerfile +15 -0
  1171. package/eval/local/tasks/comet-noise-distractor/environment/distractor.md +4 -0
  1172. package/eval/local/tasks/comet-noise-distractor/environment/invoice.py +5 -0
  1173. package/eval/local/tasks/comet-noise-distractor/environment/test_invoice.py +18 -0
  1174. package/eval/local/tasks/comet-noise-distractor/instruction.md +17 -0
  1175. package/eval/local/tasks/comet-noise-distractor/task.toml +20 -0
  1176. package/eval/local/tasks/comet-noise-distractor/validation/test_noise_distractor.py +20 -0
  1177. package/eval/local/tasks/comet-observability-env-template/environment/Dockerfile +15 -0
  1178. package/eval/local/tasks/comet-observability-env-template/environment/env_writer.py +17 -0
  1179. package/eval/local/tasks/comet-observability-env-template/environment/test_env_writer.py +17 -0
  1180. package/eval/local/tasks/comet-observability-env-template/instruction.md +20 -0
  1181. package/eval/local/tasks/comet-observability-env-template/task.toml +20 -0
  1182. package/eval/local/tasks/comet-observability-env-template/validation/test_observability_env_template.py +46 -0
  1183. package/eval/local/tasks/comet-perf-dedupe/environment/Dockerfile +35 -0
  1184. package/eval/local/tasks/comet-perf-dedupe/environment/dedupe.py +22 -0
  1185. package/eval/local/tasks/comet-perf-dedupe/environment/test_dedupe.py +43 -0
  1186. package/eval/local/tasks/comet-perf-dedupe/instruction.md +25 -0
  1187. package/eval/local/tasks/comet-perf-dedupe/task.toml +24 -0
  1188. package/eval/local/tasks/comet-perf-dedupe/validation/test_perf_dedupe.py +40 -0
  1189. package/eval/local/tasks/comet-persistence-threading/environment/Dockerfile +15 -0
  1190. package/eval/local/tasks/comet-persistence-threading/environment/session_store.py +15 -0
  1191. package/eval/local/tasks/comet-persistence-threading/environment/test_session_store.py +21 -0
  1192. package/eval/local/tasks/comet-persistence-threading/instruction.md +14 -0
  1193. package/eval/local/tasks/comet-persistence-threading/task.toml +20 -0
  1194. package/eval/local/tasks/comet-persistence-threading/validation/test_persistence_threading.py +20 -0
  1195. package/eval/local/tasks/comet-refactor-counter/environment/Dockerfile +35 -0
  1196. package/eval/local/tasks/comet-refactor-counter/environment/test_text_processor.py +57 -0
  1197. package/eval/local/tasks/comet-refactor-counter/environment/text_processor.py +49 -0
  1198. package/eval/local/tasks/comet-refactor-counter/instruction.md +31 -0
  1199. package/eval/local/tasks/comet-refactor-counter/task.toml +24 -0
  1200. package/eval/local/tasks/comet-refactor-counter/validation/test_refactor_counter.py +75 -0
  1201. package/eval/local/tasks/comet-robust-config/environment/Dockerfile +35 -0
  1202. package/eval/local/tasks/comet-robust-config/environment/config_loader.py +56 -0
  1203. package/eval/local/tasks/comet-robust-config/environment/test_config_loader.py +72 -0
  1204. package/eval/local/tasks/comet-robust-config/instruction.md +30 -0
  1205. package/eval/local/tasks/comet-robust-config/task.toml +24 -0
  1206. package/eval/local/tasks/comet-robust-config/validation/test_robust_config.py +37 -0
  1207. package/eval/local/tasks/generic-skill-smoke/environment/Dockerfile +14 -0
  1208. package/eval/local/tasks/generic-skill-smoke/instruction.md +7 -0
  1209. package/eval/local/tasks/generic-skill-smoke/task.toml +21 -0
  1210. package/eval/local/tasks/generic-skill-smoke/validation/test_generic_skill_smoke.py +41 -0
  1211. package/eval/local/tasks/index.yaml +229 -0
  1212. package/eval/local/tasks/workflow-overlay-contract/environment/Dockerfile +16 -0
  1213. package/eval/local/tasks/workflow-overlay-contract/instruction.md +5 -0
  1214. package/eval/local/tasks/workflow-overlay-contract/task.toml +21 -0
  1215. package/eval/local/tasks/workflow-overlay-contract/validation/test_workflow_overlay_contract.py +235 -0
  1216. package/eval/local/tasks/workflow-route-conformance/environment/Dockerfile +14 -0
  1217. package/eval/local/tasks/workflow-route-conformance/instruction.md +5 -0
  1218. package/eval/local/tasks/workflow-route-conformance/task.toml +21 -0
  1219. package/eval/local/tasks/workflow-route-conformance/validation/test_workflow_route_conformance.py +84 -0
  1220. package/eval/local/tests/conftest.py +1921 -0
  1221. package/eval/local/tests/scaffold/test_aligned_comparison.py +1012 -0
  1222. package/eval/local/tests/scaffold/test_attribution.py +48 -0
  1223. package/eval/local/tests/scaffold/test_compare_baselines.py +999 -0
  1224. package/eval/local/tests/scaffold/test_conftest_helpers.py +980 -0
  1225. package/eval/local/tests/scaffold/test_evidence.py +15 -0
  1226. package/eval/local/tests/scaffold/test_langsmith_conftest.py +244 -0
  1227. package/eval/local/tests/scaffold/test_logging.py +377 -0
  1228. package/eval/local/tests/scaffold/test_manifests.py +134 -0
  1229. package/eval/local/tests/scaffold/test_native_aligned_eval.py +353 -0
  1230. package/eval/local/tests/scaffold/test_native_wave_evaluations.py +2168 -0
  1231. package/eval/local/tests/scaffold/test_profiles.py +1149 -0
  1232. package/eval/local/tests/scaffold/test_regression_check.py +19 -0
  1233. package/eval/local/tests/scaffold/test_report_style_demo_charts.py +45 -0
  1234. package/eval/local/tests/scaffold/test_sample_quality.py +268 -0
  1235. package/eval/local/tests/scaffold/test_tasks.py +1013 -0
  1236. package/eval/local/tests/scaffold/test_treatments.py +353 -0
  1237. package/eval/local/tests/scaffold/test_utils.py +561 -0
  1238. package/eval/local/tests/tasks/__init__.py +1 -0
  1239. package/eval/local/tests/tasks/test_tasks.py +474 -0
  1240. package/eval/local/tests/tasks/test_validation_scripts.py +787 -0
  1241. package/eval/local/treatments/comet/comet_classic_docs_layout.yaml +121 -0
  1242. package/eval/local/treatments/comet/comet_full_039.yaml +141 -0
  1243. package/eval/local/treatments/comet/comet_full_040_beta.yaml +140 -0
  1244. package/eval/local/treatments/comet/comet_native_phase1.yaml +66 -0
  1245. package/eval/local/treatments/common/control.yaml +4 -0
  1246. package/eval/pyproject.toml +41 -0
  1247. package/eval/report-html-config.json +6 -0
  1248. package/eval/scaffold/__init__.py +67 -0
  1249. package/eval/scaffold/python/__init__.py +95 -0
  1250. package/eval/scaffold/python/aligned_comparison.py +1632 -0
  1251. package/eval/scaffold/python/attribution.py +43 -0
  1252. package/eval/scaffold/python/evidence.py +38 -0
  1253. package/eval/scaffold/python/external_data_handler.py +18 -0
  1254. package/eval/scaffold/python/generic_llm_judge.py +237 -0
  1255. package/eval/scaffold/python/judge_config.py +168 -0
  1256. package/eval/scaffold/python/llm_judge.py +188 -0
  1257. package/eval/scaffold/python/logging.py +804 -0
  1258. package/eval/scaffold/python/manifests.py +131 -0
  1259. package/eval/scaffold/python/native_eval.py +143 -0
  1260. package/eval/scaffold/python/paper_charts.py +25 -0
  1261. package/eval/scaffold/python/pass_at_k.py +106 -0
  1262. package/eval/scaffold/python/paths.py +56 -0
  1263. package/eval/scaffold/python/profiles.py +127 -0
  1264. package/eval/scaffold/python/report_outputs.py +1573 -0
  1265. package/eval/scaffold/python/sample_quality.py +382 -0
  1266. package/eval/scaffold/python/schema.py +39 -0
  1267. package/eval/scaffold/python/skill_parser.py +469 -0
  1268. package/eval/scaffold/python/tasks.py +343 -0
  1269. package/eval/scaffold/python/treatments.py +271 -0
  1270. package/eval/scaffold/python/utils.py +460 -0
  1271. package/eval/scaffold/python/validation/__init__.py +31 -0
  1272. package/eval/scaffold/python/validation/authoring_rubric.py +328 -0
  1273. package/eval/scaffold/python/validation/comet_workflow.py +227 -0
  1274. package/eval/scaffold/python/validation/core.py +264 -0
  1275. package/eval/scaffold/python/validation/dataset.py +337 -0
  1276. package/eval/scaffold/python/validation/docker.py +106 -0
  1277. package/eval/scaffold/python/validation/evaluator.py +549 -0
  1278. package/eval/scaffold/python/validation/generic_rubric.py +198 -0
  1279. package/eval/scaffold/python/validation/native_wave.py +2154 -0
  1280. package/eval/scaffold/python/validation/native_workflow.py +252 -0
  1281. package/eval/scaffold/python/validation/rubric.py +780 -0
  1282. package/eval/scaffold/python/validation/runner.py +237 -0
  1283. package/eval/scaffold/python/validation/scripts.py +58 -0
  1284. package/eval/scaffold/python/validation/tracing.py +313 -0
  1285. package/eval/scaffold/shell/common.sh +126 -0
  1286. package/eval/scaffold/shell/completion-point.sh +18 -0
  1287. package/eval/scaffold/shell/decision-point.sh +35 -0
  1288. package/eval/scaffold/shell/docker.sh +716 -0
  1289. package/eval/scaffold/shell/native-review-signer-daemon.mjs +144 -0
  1290. package/eval/scaffold/shell/native-review-verifier-daemon.mjs +178 -0
  1291. package/eval/scaffold/shell/run-claude-loop.sh +234 -0
  1292. package/eval/scaffold/shell/setup.sh +259 -0
  1293. package/eval/simulator-instruction.md +9 -0
  1294. package/package.json +64 -10
  1295. package/dist/domains/dashboard/web/assets/demo-DQyfozbi.js +0 -1
  1296. package/dist/domains/dashboard/web/assets/index-BcO3_QlT.css +0 -1
  1297. package/dist/domains/dashboard/web/assets/index-CjU3VXVu.js +0 -22
@@ -0,0 +1,1921 @@
1
+ """Shared pytest fixtures and experiment logging plugin.
2
+
3
+ Generates rich experiment logs in logs/experiments/ including:
4
+ - summary.md: Full markdown report with tables and details
5
+ - events/: Parsed events from each test run
6
+ - raw/: Raw Claude CLI output
7
+ - reports/: Per-run validation reports
8
+ - artifacts/: Files Claude generated and their execution output
9
+ - metadata.json: Experiment metadata
10
+
11
+ Supports pytest-xdist parallel execution via worker coordination.
12
+ """
13
+
14
+ import json
15
+ import hashlib
16
+ import os
17
+ import re
18
+ import secrets
19
+ import shutil
20
+ import subprocess
21
+ import tempfile
22
+ import time
23
+ from contextlib import contextmanager
24
+ from datetime import datetime
25
+ from pathlib import Path
26
+ from types import SimpleNamespace
27
+ from typing import Any
28
+
29
+ import pytest
30
+
31
+ from scaffold import run_claude_in_docker, run_python_in_docker, run_shell
32
+ from scaffold.python import (
33
+ ExperimentLogger,
34
+ TreatmentResult,
35
+ build_eval_artifact_references,
36
+ classify_failures,
37
+ get_profile,
38
+ load_report_output_config,
39
+ save_events,
40
+ save_raw,
41
+ save_report,
42
+ strip_ansi,
43
+ )
44
+ from scaffold.python.sample_quality import infer_sample_quality
45
+ from scaffold.python.skill_parser import SCRIPT_EXTENSIONS
46
+ from scaffold.python.utils import run_claude_loop_in_docker
47
+ from scaffold.python.aligned_comparison import (
48
+ EXPECTED_CASE_MATRIX_FILENAME,
49
+ build_execution_identity,
50
+ expected_case_matrix_payload,
51
+ parse_expected_case_matrix,
52
+ )
53
+
54
+
55
+ def _extract_loop_turns(stderr: str | None) -> int | None:
56
+ match = re.search(r"\[loop\] finished after (\d+) turns", stderr or "")
57
+ return int(match.group(1)) if match else None
58
+
59
+
60
+ def _extract_loop_interaction(stderr: str | None) -> dict[str, int | None]:
61
+ source = stderr or ""
62
+ return {
63
+ "actual_turns": _extract_loop_turns(source),
64
+ "decision_points": source.count("[loop] decision point detected"),
65
+ "deterministic_replies": source.count("[loop] deterministic decision reply applied"),
66
+ "completion_signals": source.count("[loop] workflow completion detected"),
67
+ "fresh_resume_boundaries": source.count("[loop] fresh resume boundary detected"),
68
+ }
69
+
70
+
71
+ def _bounded_command_evidence(command: str, matches: list[re.Match[str]]) -> str:
72
+ chunks: list[str] = []
73
+ remaining = 4000
74
+ last_end = -1
75
+ for match in matches:
76
+ start = max(0, match.start() - 300)
77
+ end = min(len(command), match.end() + 300)
78
+ if start <= last_end and chunks:
79
+ overlap = max(0, last_end - start)
80
+ addition = command[start + overlap : end]
81
+ addition = addition[:remaining]
82
+ chunks[-1] += addition
83
+ remaining -= len(addition)
84
+ last_end = max(last_end, end)
85
+ else:
86
+ chunk = command[start:end][:remaining]
87
+ if chunks:
88
+ separator = "\n...[truncated]...\n"
89
+ if len(separator) > remaining:
90
+ break
91
+ chunks.append(separator)
92
+ remaining -= len(separator)
93
+ chunks.append(chunk)
94
+ remaining -= len(chunk)
95
+ last_end = end
96
+ if remaining <= 0:
97
+ break
98
+ excerpt = "".join(chunks)
99
+ return re.sub(
100
+ r"(?i)\b(api[_-]?key|auth[_-]?token|password|secret)\s*=\s*"
101
+ r"(?:\"[^\"]*\"|'[^']*'|[^\s;]+)",
102
+ r"\1=[REDACTED]",
103
+ excerpt,
104
+ )
105
+
106
+
107
+ def _tool_result_succeeded(item: dict[str, Any]) -> bool:
108
+ is_error = item.get("is_error")
109
+ if is_error is True or str(is_error).strip().lower() == "true" or item.get("error"):
110
+ return False
111
+ status = str(item.get("status") or "").strip().lower()
112
+ if status in {"error", "failed", "failure", "cancelled", "canceled"}:
113
+ return False
114
+ content = item.get("content", "")
115
+ if isinstance(content, list):
116
+ content = " ".join(
117
+ str(block.get("text") or "") if isinstance(block, dict) else str(block)
118
+ for block in content
119
+ )
120
+ return not bool(
121
+ re.search(
122
+ r"(?i)^\s*(?:error|failed|failure|tool[_ -]?error)\b|"
123
+ r"\b(?:exit|exited with)(?:\s+code)?\s*[1-9]\d*\b",
124
+ str(content),
125
+ )
126
+ )
127
+
128
+
129
+ def _extract_subject_turn_evidence(stdout: str | None) -> list[dict[str, Any]]:
130
+ """Group safe assistant result text and bounded tool evidence by subject turn."""
131
+ turns: list[dict[str, Any]] = []
132
+ tool_calls: list[dict[str, Any]] = []
133
+ tool_calls_by_id: dict[str, dict[str, Any]] = {}
134
+ last_assistant_text = ""
135
+ for line in (stdout or "").splitlines():
136
+ try:
137
+ event = json.loads(line)
138
+ except (json.JSONDecodeError, TypeError):
139
+ continue
140
+ if not isinstance(event, dict):
141
+ continue
142
+ if event.get("type") == "assistant":
143
+ content = (event.get("message") or {}).get("content") or []
144
+ assistant_text = " ".join(
145
+ str(block.get("text") or "")
146
+ for block in content
147
+ if isinstance(block, dict) and block.get("type") == "text"
148
+ ).strip()
149
+ if assistant_text:
150
+ last_assistant_text = assistant_text
151
+ for block in content:
152
+ if isinstance(block, dict) and block.get("type") == "tool_use":
153
+ name = block.get("name")
154
+ if isinstance(name, str) and name:
155
+ evidence: dict[str, Any] = {"name": name, "success": False}
156
+ tool_input = block.get("input")
157
+ if isinstance(tool_input, dict):
158
+ for key in ("file_path", "path", "notebook_path"):
159
+ value = tool_input.get(key)
160
+ if isinstance(value, str) and value:
161
+ evidence["path"] = value[:500]
162
+ break
163
+ command = tool_input.get("command")
164
+ if isinstance(command, str) and command:
165
+ target_matches = list(
166
+ re.finditer(
167
+ r"(?i)(?:[a-z]:)?[./\\\w-]*\.py\b|"
168
+ r"\bbrief\.md\b|"
169
+ r"\bspec\.md\b",
170
+ command,
171
+ )
172
+ )
173
+ if target_matches:
174
+ evidence["command"] = _bounded_command_evidence(
175
+ command, target_matches
176
+ )
177
+ tool_calls.append(evidence)
178
+ tool_id = block.get("id")
179
+ if isinstance(tool_id, str) and tool_id:
180
+ tool_calls_by_id[tool_id] = evidence
181
+ continue
182
+ if event.get("type") == "user":
183
+ content = (event.get("message") or {}).get("content") or []
184
+ for block in content:
185
+ if not isinstance(block, dict) or block.get("type") != "tool_result":
186
+ continue
187
+ tool_use_id = block.get("tool_use_id")
188
+ if isinstance(tool_use_id, str) and tool_use_id in tool_calls_by_id:
189
+ tool_calls_by_id[tool_use_id]["success"] = _tool_result_succeeded(block)
190
+ continue
191
+ if event.get("type") != "result":
192
+ continue
193
+ result = event.get("result")
194
+ turns.append(
195
+ {
196
+ "turn": len(turns) + 1,
197
+ "result": result if isinstance(result, str) and result else last_assistant_text,
198
+ "tool_calls": tool_calls,
199
+ }
200
+ )
201
+ tool_calls = []
202
+ tool_calls_by_id = {}
203
+ last_assistant_text = ""
204
+ return turns
205
+
206
+
207
+ # =============================================================================
208
+ # CONSTANTS
209
+ # =============================================================================
210
+
211
+ PROJECT_ROOT = Path(__file__).parent.parent
212
+ EVAL_ROOT = PROJECT_ROOT.parent
213
+ REPOSITORY_ROOT = EVAL_ROOT.parent
214
+
215
+ # Shared files for xdist worker coordination
216
+ XDIST_EXPERIMENT_FILE = PROJECT_ROOT / ".pytest_experiment_id"
217
+ DOCKER_BUILD_LOCK = PROJECT_ROOT / ".pytest_docker_build.lock"
218
+ EXPERIMENT_ID_ENV = "COMET_EVAL_EXPERIMENT_ID"
219
+ EXPERIMENT_ID_RE = re.compile(r"^[A-Za-z0-9][A-Za-z0-9._-]{0,127}$")
220
+
221
+ # Global plugin instance (set during pytest_configure)
222
+ _plugin: "ExperimentPlugin | None" = None
223
+
224
+ # Cache discovered scripts (computed once on first call)
225
+ _KNOWN_SCRIPTS: list[str] | None = None
226
+
227
+ COMET_WORKFLOW_CLAUDE_MD_PATH = (
228
+ PROJECT_ROOT
229
+ / "skills"
230
+ / "benchmarks"
231
+ / "dependency"
232
+ / "claude-md"
233
+ / "comet-workflow"
234
+ / "CLAUDE.md"
235
+ )
236
+
237
+ CURRENT_COMET_CLI_MARKER = ".include-current-comet-cli"
238
+ CURRENT_COMET_BUILD_SCHEMA = "comet.eval.current-comet-build.v1"
239
+ TRUSTED_NATIVE_RUNTIME_MARKER = ".include-trusted-native-runtime"
240
+ TRUSTED_NATIVE_RUNTIME_SCHEMA = "comet.eval.trusted-native-runtime.v1"
241
+ TRUSTED_NATIVE_REVIEW_FIXTURE_MARKER = ".include-trusted-native-review-fixture"
242
+ TRUSTED_NATIVE_REVIEW_FIXTURE_SCHEMA = "comet.eval.native-review-fixture.v1"
243
+ MODEL_EXECUTION_ENV_KEYS = (
244
+ "ANTHROPIC_BASE_URL",
245
+ "ANTHROPIC_MODEL",
246
+ "ANTHROPIC_DEFAULT_HAIKU_MODEL",
247
+ "ANTHROPIC_DEFAULT_SONNET_MODEL",
248
+ "ANTHROPIC_DEFAULT_OPUS_MODEL",
249
+ "ANTHROPIC_DEFAULT_OPUS_MODEL_NAME",
250
+ "ANTHROPIC_DEFAULT_SONNET_MODEL_NAME",
251
+ "CLAUDE_CODE_SUBAGENT_MODEL",
252
+ )
253
+
254
+
255
+ def _selected_claude_model() -> str | None:
256
+ """Resolve the exact model selector passed to Claude without persisting it."""
257
+ return os.environ.get("BENCH_CC_MODEL") or os.environ.get("ANTHROPIC_MODEL")
258
+
259
+
260
+ def _model_execution_config() -> dict[str, str | None]:
261
+ """Return only model-routing values; credentials are deliberately excluded."""
262
+ return {key: os.environ.get(key) for key in MODEL_EXECUTION_ENV_KEYS}
263
+
264
+
265
+ def _capture_execution_identity(test_dir: Path, *, model: str | None, interaction):
266
+ """Capture an immutable image/tool identity and a safe report payload."""
267
+ result = run_shell(
268
+ "docker.sh",
269
+ "execution-identity",
270
+ str(test_dir),
271
+ timeout=300,
272
+ check=False,
273
+ )
274
+ if result.returncode != 0:
275
+ raise RuntimeError("Could not verify eval Docker/Claude execution identity")
276
+ try:
277
+ raw = json.loads(result.stdout)
278
+ except (TypeError, json.JSONDecodeError) as error:
279
+ raise RuntimeError("Eval execution identity output is not valid JSON") from error
280
+ report_identity = build_execution_identity(
281
+ raw,
282
+ model=model,
283
+ model_config=_model_execution_config(),
284
+ interaction=interaction,
285
+ )
286
+ return SimpleNamespace(
287
+ runtime_image_id=raw["runtime_image_id"],
288
+ report_identity=report_identity,
289
+ )
290
+
291
+
292
+ def _regular_tree_files(root: Path) -> list[Path]:
293
+ files: list[Path] = []
294
+ for path in sorted(root.rglob("*")):
295
+ if path.is_symlink():
296
+ raise ValueError(f"Current Comet snapshot source contains a symbolic link: {path}")
297
+ if path.is_file():
298
+ files.append(path)
299
+ return files
300
+
301
+
302
+ def _tree_digest(root: Path, files: list[Path] | None = None) -> tuple[str, int]:
303
+ digest = hashlib.sha256()
304
+ selected = files if files is not None else _regular_tree_files(root)
305
+ for path in selected:
306
+ relative = path.relative_to(root).as_posix()
307
+ payload = path.read_bytes()
308
+ digest.update(relative.encode("utf-8"))
309
+ digest.update(b"\0")
310
+ digest.update(str(len(payload)).encode("ascii"))
311
+ digest.update(b"\0")
312
+ digest.update(hashlib.sha256(payload).hexdigest().encode("ascii"))
313
+ digest.update(b"\n")
314
+ return digest.hexdigest(), len(selected)
315
+
316
+
317
+ def _build_current_comet_dist(checkout: Path, output: Path) -> str:
318
+ """Compile the checkout's TypeScript into an isolated, timestamp-free dist tree."""
319
+ node = shutil.which("node")
320
+ tsc = checkout / "node_modules/typescript/bin/tsc"
321
+ compiler_package = checkout / "node_modules/typescript/package.json"
322
+ if not node or not tsc.is_file() or not compiler_package.is_file():
323
+ raise FileNotFoundError("Current Comet source build requires local Node.js and TypeScript")
324
+ compiler = json.loads(compiler_package.read_text(encoding="utf-8"))
325
+ version = compiler.get("version")
326
+ if not isinstance(version, str) or not version:
327
+ raise ValueError("Current Comet TypeScript compiler version is invalid")
328
+ result = subprocess.run(
329
+ [
330
+ node,
331
+ str(tsc),
332
+ "--pretty",
333
+ "false",
334
+ "--outDir",
335
+ str(output),
336
+ "--declaration",
337
+ "false",
338
+ "--declarationMap",
339
+ "false",
340
+ "--sourceMap",
341
+ "false",
342
+ "--incremental",
343
+ "false",
344
+ ],
345
+ cwd=checkout,
346
+ capture_output=True,
347
+ text=True,
348
+ timeout=180,
349
+ check=False,
350
+ )
351
+ if result.returncode != 0:
352
+ detail = (result.stdout + "\n" + result.stderr).strip()
353
+ raise RuntimeError(f"Current Comet source build failed: {detail[-4000:]}")
354
+ required = [output / "app/cli/index.js", output / "domains/dashboard/native-adapter.js"]
355
+ missing = [str(path) for path in required if not path.is_file()]
356
+ if missing:
357
+ raise FileNotFoundError(f"Current Comet source build omitted required output: {missing}")
358
+ return version
359
+
360
+
361
+ def _copy_current_comet_cli_snapshot(environment_dir: Path, test_dir: Path) -> None:
362
+ """Expose the current checkout's built CLI to task containers on request.
363
+
364
+ The task workspace is the only host directory mounted into Docker. A task
365
+ carrying ``CURRENT_COMET_CLI_MARKER`` therefore needs an explicit snapshot
366
+ of this checkout's bin/dist package rather than a published npm version.
367
+ """
368
+ if not (environment_dir / CURRENT_COMET_CLI_MARKER).is_file():
369
+ return
370
+
371
+ target = test_dir / "_eval_current_comet"
372
+ if target.exists():
373
+ shutil.rmtree(target)
374
+ target.mkdir(parents=True)
375
+ package_file = REPOSITORY_ROOT / "package.json"
376
+ bin_dir = REPOSITORY_ROOT / "bin"
377
+ assets_dir = REPOSITORY_ROOT / "assets"
378
+ assets_manifest = assets_dir / "manifest.json"
379
+ source_roots = [
380
+ REPOSITORY_ROOT / "app",
381
+ REPOSITORY_ROOT / "domains",
382
+ REPOSITORY_ROOT / "platform",
383
+ ]
384
+ source_files = [
385
+ path
386
+ for root in source_roots
387
+ for path in _regular_tree_files(root)
388
+ if path.suffix in {".ts", ".tsx", ".json"}
389
+ ]
390
+ source_files.extend(
391
+ path
392
+ for path in (
393
+ REPOSITORY_ROOT / "tsconfig.json",
394
+ package_file,
395
+ REPOSITORY_ROOT / "bin/comet.js",
396
+ )
397
+ if path.is_file()
398
+ )
399
+ asset_files = _regular_tree_files(assets_dir) if assets_dir.is_dir() else []
400
+ source_files.extend(asset_files)
401
+ if (
402
+ not package_file.is_file()
403
+ or not bin_dir.is_dir()
404
+ or not assets_manifest.is_file()
405
+ or not asset_files
406
+ or not source_files
407
+ ):
408
+ raise FileNotFoundError("Current Comet source snapshot is incomplete")
409
+ source_hash, source_count = _tree_digest(REPOSITORY_ROOT, sorted(set(source_files)))
410
+ with tempfile.TemporaryDirectory(prefix="comet-eval-source-build-") as temporary:
411
+ built_dist = Path(temporary) / "dist"
412
+ compiler_version = _build_current_comet_dist(REPOSITORY_ROOT, built_dist)
413
+ shutil.copytree(built_dist, target / "dist")
414
+ shutil.copytree(bin_dir, target / "bin")
415
+ shutil.copytree(assets_dir, target / "assets")
416
+ shutil.copy2(package_file, target / "package.json")
417
+ snapshot_files = [
418
+ path
419
+ for relative in ("assets", "bin", "dist")
420
+ for path in _regular_tree_files(target / relative)
421
+ ] + [target / "package.json"]
422
+ snapshot_hash, snapshot_count = _tree_digest(target, sorted(snapshot_files))
423
+ identity = {
424
+ "schema": CURRENT_COMET_BUILD_SCHEMA,
425
+ "sourceHash": source_hash,
426
+ "sourceFileCount": source_count,
427
+ "snapshotHash": snapshot_hash,
428
+ "snapshotFileCount": snapshot_count,
429
+ "packageHash": hashlib.sha256((target / "package.json").read_bytes()).hexdigest(),
430
+ "assetsHash": _tree_digest(target, _regular_tree_files(target / "assets"))[0],
431
+ "assetsFileCount": len(_regular_tree_files(target / "assets")),
432
+ "manifestHash": hashlib.sha256((target / "assets/manifest.json").read_bytes()).hexdigest(),
433
+ "entryHash": hashlib.sha256((target / "dist/app/cli/index.js").read_bytes()).hexdigest(),
434
+ "nativeAdapterHash": hashlib.sha256(
435
+ (target / "dist/domains/dashboard/native-adapter.js").read_bytes()
436
+ ).hexdigest(),
437
+ "compilerVersion": compiler_version,
438
+ }
439
+ (target / "build-identity.json").write_text(
440
+ json.dumps(identity, indent=2) + "\n", encoding="utf-8"
441
+ )
442
+
443
+
444
+ def _copy_trusted_native_runtime_snapshot(
445
+ environment_dir: Path,
446
+ test_dir: Path,
447
+ skills: dict[str, Any] | None,
448
+ ) -> None:
449
+ """Snapshot the controller-selected Native runtime before the Agent starts."""
450
+ if not (environment_dir / TRUSTED_NATIVE_RUNTIME_MARKER).is_file():
451
+ return
452
+ config = (skills or {}).get("comet-native")
453
+ if not isinstance(config, dict):
454
+ raise ValueError("Trusted Native oracle requires the comet-native Skill source")
455
+ source_dir = config.get("source_dir")
456
+ scripts_dir = config.get("scripts_dir")
457
+ candidates = []
458
+ if source_dir:
459
+ candidates.append(Path(source_dir) / "scripts/comet-native-runtime.mjs")
460
+ if scripts_dir:
461
+ candidates.append(Path(scripts_dir) / "comet-native-runtime.mjs")
462
+ source = next(
463
+ (
464
+ candidate
465
+ for candidate in candidates
466
+ if candidate.is_file() and not candidate.is_symlink()
467
+ ),
468
+ None,
469
+ )
470
+ if source is None:
471
+ raise FileNotFoundError("Controller-selected Comet Native runtime is unavailable")
472
+
473
+ target_root = test_dir / "_eval_trusted_oracles"
474
+ if target_root.exists():
475
+ shutil.rmtree(target_root)
476
+ target_root.mkdir(parents=True)
477
+ target = target_root / "comet-native-runtime.mjs"
478
+ shutil.copyfile(source, target)
479
+ identity = {
480
+ "schema": TRUSTED_NATIVE_RUNTIME_SCHEMA,
481
+ "runtimeFile": target.name,
482
+ "runtimeHash": hashlib.sha256(target.read_bytes()).hexdigest(),
483
+ }
484
+ (target_root / "native-runtime-identity.json").write_text(
485
+ json.dumps(identity, indent=2) + "\n", encoding="utf-8"
486
+ )
487
+
488
+
489
+ def _copy_trusted_native_review_fixture(
490
+ environment_dir: Path,
491
+ test_dir: Path,
492
+ ) -> None:
493
+ """Provision external review trust without exposing private keys."""
494
+ marker = environment_dir / TRUSTED_NATIVE_REVIEW_FIXTURE_MARKER
495
+ if not marker.is_file():
496
+ return
497
+ change = marker.read_text(encoding="utf-8").strip()
498
+ if not re.fullmatch(r"[a-z][a-z0-9]*(?:-[a-z0-9]+)*", change):
499
+ raise ValueError("Trusted Native review fixture change name is invalid")
500
+ oracle_root = test_dir / "_eval_trusted_oracles"
501
+ runtime = oracle_root / "comet-native-runtime.mjs"
502
+ if not runtime.is_file():
503
+ raise FileNotFoundError(
504
+ "Trusted Native review fixture requires the controller-selected runtime"
505
+ )
506
+ node = shutil.which("node")
507
+ if node is None:
508
+ raise FileNotFoundError("Trusted Native review fixture requires Node.js")
509
+ generator = r"""
510
+ const {createHash,generateKeyPairSync,sign}=require('node:crypto');
511
+ const change=process.argv[1];
512
+ const canonical=(value)=>{
513
+ if(value===null)return 'null';
514
+ if(Array.isArray(value))return `[${value.map(canonical).join(',')}]`;
515
+ if(typeof value==='object')return `{${Object.keys(value).sort().map(
516
+ key=>`${JSON.stringify(key)}:${canonical(value[key])}`
517
+ ).join(',')}}`;
518
+ return JSON.stringify(value);
519
+ };
520
+ const hash=(tag,value)=>createHash('sha256').update(`${tag}\n${canonical(value)}`).digest('hex');
521
+ const keyPair=()=>{
522
+ const pair=generateKeyPairSync('ed25519');
523
+ const publicKey=pair.publicKey.export({format:'der',type:'spki'});
524
+ return {
525
+ identity:{
526
+ schema:'comet.native.review-identity.v1',
527
+ algorithm:'ed25519',
528
+ keyId:createHash('sha256').update(publicKey).digest('hex'),
529
+ publicKey:publicKey.toString('base64')
530
+ },
531
+ privateKey:pair.privateKey.export({format:'der',type:'pkcs8'}).toString('base64')
532
+ };
533
+ };
534
+ const proof=(pair,payloadHash)=>({
535
+ schema:'comet.native.review-signature.v1',
536
+ algorithm:'ed25519',
537
+ keyId:pair.identity.keyId,
538
+ payloadHash,
539
+ signature:sign(null,Buffer.concat([
540
+ Buffer.from('comet.native.review-payload.v1\0'),
541
+ Buffer.from(payloadHash,'hex')
542
+ ]),{
543
+ key:Buffer.from(pair.privateKey,'base64'),
544
+ format:'der',
545
+ type:'pkcs8'
546
+ }).toString('base64')
547
+ });
548
+ const controller=keyPair();
549
+ const implementation=keyPair();
550
+ const reviewer=keyPair();
551
+ const waiver=keyPair();
552
+ const policyContent={
553
+ schema:'comet.native.review-trust-policy.v2',
554
+ controllerKeyId:controller.identity.keyId,
555
+ implementationKeyId:implementation.identity.keyId,
556
+ trustedReviewers:[reviewer.identity],
557
+ trustedWaiverSigners:[waiver.identity]
558
+ };
559
+ const policyHash=hash('comet.native.review-trust-policy.v2',policyContent);
560
+ const policy={
561
+ ...policyContent,
562
+ policyHash,
563
+ controllerSignature:proof(controller,policyHash)
564
+ };
565
+ const projectRootHash=hash('comet.native.controller-project-root.v1','/workspace');
566
+ const store={
567
+ schema:'comet.native.controller-trust-store.v1',
568
+ projects:[{
569
+ projectRootHash,
570
+ controllerIdentity:controller.identity,
571
+ }]
572
+ };
573
+ process.stdout.write(JSON.stringify({
574
+ policy,
575
+ store,
576
+ identities:{
577
+ implementation:implementation.identity,
578
+ reviewer:reviewer.identity,
579
+ waiver:waiver.identity
580
+ },
581
+ privateKeys:{
582
+ implementation:implementation.privateKey,
583
+ reviewer:reviewer.privateKey,
584
+ waiver:waiver.privateKey
585
+ }
586
+ }));
587
+ """
588
+ generated = subprocess.run(
589
+ [node, "-e", generator, change],
590
+ capture_output=True,
591
+ text=True,
592
+ timeout=30,
593
+ check=True,
594
+ )
595
+ fixture = json.loads(generated.stdout)
596
+ controller_home = oracle_root / "controller-home"
597
+ controller_home.mkdir(parents=True, exist_ok=True)
598
+ (controller_home / "native-controller-trust.json").write_text(
599
+ json.dumps(fixture["store"], indent=2) + "\n", encoding="utf-8"
600
+ )
601
+ policy_file = oracle_root / "native-review-trust.json"
602
+ policy_file.write_text(
603
+ json.dumps(fixture["policy"], indent=2) + "\n", encoding="utf-8"
604
+ )
605
+ project_policy = test_dir / ".comet" / "native-review-trust.json"
606
+ project_policy.parent.mkdir(parents=True, exist_ok=True)
607
+ shutil.copyfile(policy_file, project_policy)
608
+ for role, identity in fixture["identities"].items():
609
+ (oracle_root / f"{role}-identity.json").write_text(
610
+ json.dumps(identity, indent=2) + "\n", encoding="utf-8"
611
+ )
612
+ secrets_root = test_dir.with_name(f".{test_dir.name}-native-review-secrets")
613
+ if secrets_root.exists():
614
+ shutil.rmtree(secrets_root)
615
+ secrets_root.mkdir(mode=0o700)
616
+ for role, private_key in fixture["privateKeys"].items():
617
+ secret_file = secrets_root / f"{role}-key.json"
618
+ secret_file.write_text(
619
+ json.dumps(
620
+ {
621
+ "identity": fixture["identities"][role],
622
+ "privateKey": private_key,
623
+ },
624
+ indent=2,
625
+ )
626
+ + "\n",
627
+ encoding="utf-8",
628
+ )
629
+ secret_file.chmod(0o600)
630
+ signer_token = secrets_root / "signer-token"
631
+ signer_token.write_text(secrets.token_hex(32) + "\n", encoding="utf-8")
632
+ signer_token.chmod(0o600)
633
+ signer = """\
634
+ const [role,change,...args]=process.argv.slice(2);
635
+ const endpoint=process.env.COMET_NATIVE_REVIEW_VERIFIER_URL;
636
+ if(!endpoint||!['implementation','reviewer','waiver'].includes(role)){
637
+ process.stderr.write('Native external verifier is unavailable or the role is invalid\\n');
638
+ process.exit(64);
639
+ }
640
+ let response;
641
+ for(let attempt=0;attempt<20;attempt+=1){
642
+ try{
643
+ response=await fetch(`${endpoint}/invoke`,{
644
+ method:'POST',
645
+ headers:{'content-type':'application/json'},
646
+ body:JSON.stringify({role,change,args})
647
+ });
648
+ break;
649
+ }catch(error){
650
+ if(attempt===19)throw error;
651
+ await new Promise(resolve=>setTimeout(resolve,250));
652
+ }
653
+ }
654
+ const result=await response.json();
655
+ if(!response.ok){
656
+ process.stderr.write(`${result.error??'Native external verifier rejected the request'}\\n`);
657
+ process.exit(65);
658
+ }
659
+ process.stdout.write(result.stdout??'');
660
+ """
661
+ signer_file = oracle_root / "native-review-signer.mjs"
662
+ signer_file.write_text(signer, encoding="utf-8")
663
+ public_fixture = {
664
+ "schema": TRUSTED_NATIVE_REVIEW_FIXTURE_SCHEMA,
665
+ "change": change,
666
+ "policyHash": fixture["policy"]["policyHash"],
667
+ "signer": "/workspace/_eval_trusted_oracles/native-review-signer.mjs",
668
+ "signerMode": "external-verifier-sidecar",
669
+ "roles": ["implementation", "reviewer", "waiver"],
670
+ }
671
+ (oracle_root / "native-review-fixture.json").write_text(
672
+ json.dumps(public_fixture, indent=2) + "\n", encoding="utf-8"
673
+ )
674
+
675
+
676
+ # =============================================================================
677
+ # PYTEST HOOKS
678
+ # =============================================================================
679
+
680
+
681
+ def pytest_addoption(parser):
682
+ """Add CLI options for task and treatment selection."""
683
+ parser.addoption(
684
+ "--task",
685
+ action="store",
686
+ default=None,
687
+ help="Run specific task (e.g., --task=comet-full-workflow)",
688
+ )
689
+ parser.addoption(
690
+ "--treatment",
691
+ action="store",
692
+ default=None,
693
+ help="Run specific treatment (e.g., --treatment=COMET_FULL_040_BETA)",
694
+ )
695
+ parser.addoption(
696
+ "--count",
697
+ action="store",
698
+ type=int,
699
+ default=1,
700
+ help="Repeat each task/treatment combination N times for distribution stats (default: 1)",
701
+ )
702
+ parser.addoption(
703
+ "--skill-path",
704
+ action="store",
705
+ default=None,
706
+ help="Local Skill directory or SKILL.md to evaluate",
707
+ )
708
+ parser.addoption(
709
+ "--skill-name",
710
+ action="store",
711
+ default=None,
712
+ help="Skill name to inject for --skill-path",
713
+ )
714
+ parser.addoption(
715
+ "--profile",
716
+ action="store",
717
+ default=None,
718
+ help="Eval profile override",
719
+ )
720
+ parser.addoption(
721
+ "--eval-manifest",
722
+ action="store",
723
+ default=None,
724
+ help="Path to comet/eval.yaml",
725
+ )
726
+ parser.addoption(
727
+ "--interaction-mode",
728
+ action="store",
729
+ default=None,
730
+ help="Override interaction mode (e.g., none, auto_user)",
731
+ )
732
+ parser.addoption(
733
+ "--max-turns",
734
+ action="store",
735
+ default=None,
736
+ help="Override max interaction turns for auto_user loops",
737
+ )
738
+ parser.addoption(
739
+ "--simulator-prompt",
740
+ action="store",
741
+ default=None,
742
+ help="Override user simulator prompt for auto_user loops",
743
+ )
744
+ parser.addoption(
745
+ "--report-config",
746
+ action="store",
747
+ default=None,
748
+ help="JSON/YAML config for eval report outputs",
749
+ )
750
+
751
+
752
+ def pytest_configure(config):
753
+ """Register experiment plugin (decision deferred to sessionstart)."""
754
+ config.addinivalue_line(
755
+ "markers",
756
+ "eval_case(repetition): controller-owned task/treatment/repetition identity",
757
+ )
758
+ global _plugin
759
+ _plugin = ExperimentPlugin(config)
760
+ config.pluginmanager.register(_plugin, "experiment_plugin")
761
+
762
+
763
+ # =============================================================================
764
+ # EXPERIMENT PLUGIN
765
+ # =============================================================================
766
+
767
+
768
+ class ExperimentPlugin:
769
+ """Pytest plugin that generates rich experiment logs in logs/experiments/."""
770
+
771
+ def __init__(self, config):
772
+ self.config = config
773
+ self.logger: ExperimentLogger | None = None
774
+ self.start_time = None
775
+ self.run_counter: dict[str, int] = {}
776
+ self.is_xdist_worker = hasattr(config, "workerinput")
777
+ self.is_xdist_master = (
778
+ not hasattr(config, "workerinput")
779
+ and (getattr(config.option, "numprocesses", None) or 0) > 0
780
+ )
781
+ self.worker_id = (
782
+ config.workerinput.get("workerid", "master") if self.is_xdist_worker else "master"
783
+ )
784
+
785
+ def pytest_sessionstart(self, session):
786
+ """Create or join experiment logger at session start."""
787
+ if _is_unit_tests_only(self.config):
788
+ return
789
+
790
+ name = _get_experiment_name(session)
791
+ use_coordination = self.is_xdist_worker or self.is_xdist_master
792
+ experiment_id = _get_or_create_experiment_id(name, use_coordination)
793
+
794
+ report_outputs = load_report_output_config(self.config.getoption("--report-config"))
795
+ self.logger = ExperimentLogger(
796
+ experiment_name=name,
797
+ experiment_id=experiment_id,
798
+ report_outputs=report_outputs,
799
+ )
800
+ self.start_time = time.time()
801
+
802
+ print(f"\n{'=' * 60}")
803
+ print(f"EXPERIMENT: {self.logger.experiment_id}")
804
+ print(f"Logging to: {self.logger.base_dir}")
805
+ print(f"{'=' * 60}\n")
806
+
807
+ def pytest_collection_finish(self, session):
808
+ """Persist the full collected case matrix before any model run starts."""
809
+ if not self.logger:
810
+ return
811
+ cases = _expected_cases_from_items(session.items)
812
+ if not cases:
813
+ return
814
+ payload = expected_case_matrix_payload(cases)
815
+ _persist_expected_case_matrix(self.logger.base_dir, payload)
816
+ self.logger.metadata["expected_case_matrix"] = {
817
+ "schema": payload["schema"],
818
+ "matrix_hash": payload["matrix_hash"],
819
+ "case_count": len(payload["cases"]),
820
+ "path": EXPECTED_CASE_MATRIX_FILENAME,
821
+ }
822
+
823
+ def pytest_sessionfinish(self, session, exitstatus):
824
+ """Generate and save summary at session end."""
825
+ if not self.logger:
826
+ return
827
+
828
+ if self.is_xdist_worker:
829
+ return
830
+
831
+ if self.is_xdist_master:
832
+ time.sleep(1)
833
+
834
+ self._reload_expected_case_matrix_metadata()
835
+ self._reload_results_from_reports()
836
+
837
+ if self.logger.results:
838
+ self.logger.finalize()
839
+ self._print_summary()
840
+
841
+ _cleanup_experiment_coordination()
842
+
843
+ def _reload_expected_case_matrix_metadata(self):
844
+ """Attach the worker-written matrix to controller-finalized metadata."""
845
+ path = self.logger.base_dir / EXPECTED_CASE_MATRIX_FILENAME
846
+ if not path.is_file():
847
+ return
848
+ try:
849
+ payload = json.loads(path.read_text(encoding="utf-8"))
850
+ matrix = parse_expected_case_matrix(payload)
851
+ except (OSError, json.JSONDecodeError, ValueError) as error:
852
+ raise RuntimeError("Expected case matrix became invalid before finalize") from error
853
+ self.logger.metadata["expected_case_matrix"] = {
854
+ "schema": payload["schema"],
855
+ "matrix_hash": matrix.matrix_hash,
856
+ "case_count": len(matrix.cases),
857
+ "path": EXPECTED_CASE_MATRIX_FILENAME,
858
+ }
859
+
860
+ def get_rep_number(self, treatment_name: str) -> int:
861
+ """Get the next repetition number for a treatment."""
862
+ if treatment_name not in self.run_counter:
863
+ self.run_counter[treatment_name] = 0
864
+ self.run_counter[treatment_name] += 1
865
+ return self.run_counter[treatment_name]
866
+
867
+ def _reload_results_from_reports(self):
868
+ """Reload results from saved report files (aggregates all workers)."""
869
+ reports_dir = self.logger.reports_dir
870
+ if not reports_dir.exists():
871
+ return
872
+
873
+ self.logger.results.clear()
874
+
875
+ for report_file in sorted(reports_dir.glob("*.json")):
876
+ try:
877
+ report = json.loads(report_file.read_text())
878
+ treatment_name = report.get("name", "unknown")
879
+ result = TreatmentResult(
880
+ name=treatment_name,
881
+ passed=report.get("passed", False),
882
+ checks_passed=report.get("checks_passed", []),
883
+ checks_failed=report.get("checks_failed", []),
884
+ events_summary=report.get("events_summary", {}),
885
+ run_id=report.get("run_id", ""),
886
+ )
887
+ if treatment_name not in self.logger.results:
888
+ self.logger.results[treatment_name] = []
889
+ self.logger.results[treatment_name].append(result)
890
+ except Exception as e:
891
+ import sys
892
+
893
+ print(f"Warning: failed to reload report {report_file.name}: {e}", file=sys.stderr)
894
+
895
+ def _print_summary(self):
896
+ """Print summary to console."""
897
+ print(f"\n{'=' * 120}")
898
+ print(" RESULTS")
899
+ print(f"{'=' * 120}\n")
900
+
901
+ print(
902
+ f"{'Treatment':<25} {'Checks':<15} {'Turns':<8} {'Dur':<8} {'Tokens':<12} {'Cost':<10} {'Skills':<40}"
903
+ )
904
+ print("-" * 120)
905
+
906
+ for treatment, runs in self.logger.results.items():
907
+ for r in runs:
908
+ checks_passed = len(r.checks_passed)
909
+ checks_total = checks_passed + len(r.checks_failed)
910
+ check_pct = (checks_passed / checks_total * 100) if checks_total > 0 else 0
911
+ checks_str = f"{checks_passed}/{checks_total} ({check_pct:.0f}%)"
912
+ turns = str(r.turns) if r.turns else "?"
913
+ dur = f"{r.duration:.0f}s" if r.duration else "?"
914
+ tokens = f"{r.total_tokens:,}" if r.total_tokens is not None else "?"
915
+ cost = f"${r.total_cost_usd:.4f}" if r.total_cost_usd is not None else "?"
916
+ skills = r.events_summary.get("skills_invoked", [])
917
+ skills_str = ", ".join(skills) if skills else "none"
918
+ if len(skills_str) > 38:
919
+ skills_str = skills_str[:35] + "..."
920
+ print(
921
+ f"{treatment:<25} {checks_str:<15} {turns:<8} {dur:<8} {tokens:<12} {cost:<10} {skills_str:<40}"
922
+ )
923
+
924
+ print("-" * 120)
925
+ total_passed = sum(
926
+ sum(len(r.checks_passed) for r in runs) for runs in self.logger.results.values()
927
+ )
928
+ total_checks = sum(
929
+ sum(len(r.checks_passed) + len(r.checks_failed) for r in runs)
930
+ for runs in self.logger.results.values()
931
+ )
932
+ if total_checks:
933
+ print(
934
+ f"Total: {total_passed}/{total_checks} checks passed ({total_passed / total_checks * 100:.1f}%)"
935
+ )
936
+ print(f"{'=' * 120}")
937
+
938
+
939
+ # =============================================================================
940
+ # EXPERIMENT PLUGIN HELPERS
941
+ # =============================================================================
942
+
943
+
944
+ def _is_unit_tests_only(config) -> bool:
945
+ """Check if running ONLY unit tests (scaffold/scripts - don't need experiment logs)."""
946
+ args = [a for a in (config.args or []) if not a.startswith("-")]
947
+ if not args:
948
+ return False
949
+ return all("scripts" in arg or "scaffold" in arg for arg in args)
950
+
951
+
952
+ def _get_experiment_name(session) -> str:
953
+ """Determine experiment name from task name parameter."""
954
+ items = getattr(session, "items", None)
955
+ if not items:
956
+ return "experiment"
957
+
958
+ first_item = items[0]
959
+ if hasattr(first_item, "callspec") and "task_name" in first_item.callspec.params:
960
+ return first_item.callspec.params["task_name"].replace("-", "_")
961
+
962
+ return "experiment"
963
+
964
+
965
+ def _get_dynamic_treatment_config(config):
966
+ manifest_path = config.getoption("--eval-manifest")
967
+ if manifest_path:
968
+ from scaffold.python.manifests import load_eval_manifest
969
+ from scaffold.python.treatments import TreatmentConfig
970
+
971
+ manifest = load_eval_manifest(manifest_path)
972
+ node_skills = []
973
+ for node_skill in manifest.generated_node_skills:
974
+ node_path = manifest.skill_path.parent / node_skill
975
+ if (node_path / "SKILL.md").exists():
976
+ node_skills.append(
977
+ {
978
+ "name": node_skill,
979
+ "source": "path",
980
+ "path": str(node_path),
981
+ }
982
+ )
983
+ return TreatmentConfig(
984
+ name="DYNAMIC_SKILL",
985
+ description=f"Dynamic Skill target: {manifest.skill_name}",
986
+ skills=[
987
+ {
988
+ "name": manifest.skill_name,
989
+ "source": "path",
990
+ "path": str(manifest.skill_path),
991
+ "profile": manifest.profile,
992
+ "manifest": str(manifest.path),
993
+ "baseline_treatments": manifest.baseline_treatments,
994
+ "quality_gates": manifest.quality_gates,
995
+ "required_output_schemas": manifest.required_output_schemas,
996
+ "expected_evidence": manifest.expected_evidence,
997
+ "draft_hash": manifest.draft_hash,
998
+ "required_skills": manifest.required_skills,
999
+ "expected_artifacts": manifest.expected_artifacts,
1000
+ "generated_node_skills": manifest.generated_node_skills,
1001
+ "route_conformance_task": manifest.route_conformance_task,
1002
+ "route_conformance_expected_node_order": (
1003
+ manifest.route_conformance_expected_node_order
1004
+ ),
1005
+ }
1006
+ ]
1007
+ + node_skills,
1008
+ )
1009
+
1010
+ skill_path = config.getoption("--skill-path")
1011
+ if not skill_path:
1012
+ return None
1013
+ skill_name = config.getoption("--skill-name") or Path(skill_path).resolve().parent.name
1014
+ profile = config.getoption("--profile")
1015
+ skill_cfg = {
1016
+ "name": skill_name,
1017
+ "source": "path",
1018
+ "path": skill_path,
1019
+ }
1020
+ if profile:
1021
+ skill_cfg["profile"] = profile
1022
+ from scaffold.python.treatments import TreatmentConfig
1023
+
1024
+ return TreatmentConfig(
1025
+ name="DYNAMIC_SKILL",
1026
+ description=f"Dynamic Skill target: {skill_name}",
1027
+ skills=[skill_cfg],
1028
+ )
1029
+
1030
+
1031
+ def _resolve_interaction_config(task, profile_name: str, config):
1032
+ profile_default = get_profile(profile_name).default_interaction
1033
+ task_interaction = task.config.interaction
1034
+
1035
+ mode = task_interaction.mode or profile_default.mode
1036
+ max_turns = task_interaction.max_turns or profile_default.max_turns
1037
+ simulator_prompt = task_interaction.simulator_prompt or profile_default.simulator_prompt
1038
+ decision_patterns = list(
1039
+ task_interaction.decision_patterns or profile_default.decision_patterns
1040
+ )
1041
+ decision_reply = task_interaction.decision_reply or profile_default.decision_reply
1042
+ decision_replies = list(task_interaction.decision_replies or profile_default.decision_replies)
1043
+ continue_prompt = task_interaction.continue_prompt or profile_default.continue_prompt
1044
+ fresh_resume_marker = task_interaction.fresh_resume_marker
1045
+
1046
+ mode_override = config.getoption("--interaction-mode")
1047
+ if mode_override:
1048
+ mode = mode_override
1049
+
1050
+ max_turns_override = config.getoption("--max-turns")
1051
+ if max_turns_override not in (None, ""):
1052
+ max_turns = int(max_turns_override)
1053
+
1054
+ simulator_prompt_override = config.getoption("--simulator-prompt")
1055
+
1056
+ prompt_file = os.environ.get("BENCH_SIMULATOR_PROMPT_FILE")
1057
+ prompt_path = Path(prompt_file) if prompt_file else (EVAL_ROOT / "simulator-instruction.md")
1058
+ if not prompt_path.is_absolute():
1059
+ prompt_path = EVAL_ROOT / prompt_path
1060
+ if prompt_path.exists() and (prompt_file or not task_interaction.simulator_prompt):
1061
+ simulator_prompt = prompt_path.read_text(encoding="utf-8")
1062
+
1063
+ if simulator_prompt_override:
1064
+ simulator_prompt = simulator_prompt_override
1065
+
1066
+ return task_interaction.__class__(
1067
+ mode=mode,
1068
+ max_turns=max_turns,
1069
+ simulator_prompt=simulator_prompt,
1070
+ decision_patterns=decision_patterns,
1071
+ decision_reply=decision_reply,
1072
+ decision_replies=decision_replies,
1073
+ continue_prompt=continue_prompt,
1074
+ fresh_resume_marker=fresh_resume_marker,
1075
+ )
1076
+
1077
+
1078
+ def _read_required_text(path: Path) -> str:
1079
+ if not path.exists():
1080
+ raise FileNotFoundError(f"Required eval instruction file not found: {path}")
1081
+ return path.read_text(encoding="utf-8")
1082
+
1083
+
1084
+ def _build_eval_claude_md(profile_name: str, treatment_claude_md: str | None = None) -> str | None:
1085
+ sections: list[str] = []
1086
+ if profile_name == "comet-workflow":
1087
+ sections.append(_read_required_text(COMET_WORKFLOW_CLAUDE_MD_PATH))
1088
+ if treatment_claude_md:
1089
+ sections.append(treatment_claude_md.strip())
1090
+ return "\n\n".join(section for section in sections if section.strip()) or None
1091
+
1092
+
1093
+ def _comet_hook_command(test_dir: Path) -> str | None:
1094
+ scripts_dir = test_dir / ".claude" / "skills" / "comet" / "scripts"
1095
+ mjs_hook = scripts_dir / "comet-hook-guard.mjs"
1096
+ shell_hook = scripts_dir / "comet-hook-guard.sh"
1097
+ if mjs_hook.exists():
1098
+ return "node /workspace/.claude/skills/comet/scripts/comet-hook-guard.mjs"
1099
+ if shell_hook.exists():
1100
+ return "bash /workspace/.claude/skills/comet/scripts/comet-hook-guard.sh"
1101
+ return None
1102
+
1103
+
1104
+ def _ensure_claude_pre_tool_hook(test_dir: Path, command: str | None) -> None:
1105
+ if not command:
1106
+ return
1107
+ settings_path = test_dir / ".claude" / "settings.json"
1108
+ settings_path.parent.mkdir(parents=True, exist_ok=True)
1109
+ if settings_path.exists():
1110
+ settings = json.loads(settings_path.read_text(encoding="utf-8"))
1111
+ else:
1112
+ settings = {}
1113
+ hooks = settings.setdefault("hooks", {})
1114
+ pre_tool_use = hooks.setdefault("PreToolUse", [])
1115
+ hook_entry = {
1116
+ "matcher": "Write|Edit|MultiEdit",
1117
+ "hooks": [{"type": "command", "command": command}],
1118
+ }
1119
+ if not any(entry == hook_entry for entry in pre_tool_use):
1120
+ pre_tool_use.append(hook_entry)
1121
+ settings_path.write_text(json.dumps(settings, indent=2) + "\n", encoding="utf-8")
1122
+
1123
+
1124
+ def _get_or_create_experiment_id(name: str, use_coordination: bool) -> str:
1125
+ """Get shared experiment ID or create new one."""
1126
+ requested = os.environ.get(EXPERIMENT_ID_ENV)
1127
+ if requested is not None:
1128
+ if not EXPERIMENT_ID_RE.fullmatch(requested):
1129
+ raise ValueError(
1130
+ f"{EXPERIMENT_ID_ENV} must contain only letters, digits, dot, underscore, or hyphen"
1131
+ )
1132
+ return requested
1133
+
1134
+ if not use_coordination:
1135
+ timestamp = datetime.now().strftime("%Y%m%d_%H%M%S")
1136
+ return f"{name}_{timestamp}"
1137
+
1138
+ lock_file = XDIST_EXPERIMENT_FILE.with_suffix(".lock")
1139
+
1140
+ with file_lock(lock_file):
1141
+ if XDIST_EXPERIMENT_FILE.exists():
1142
+ data = json.loads(XDIST_EXPERIMENT_FILE.read_text())
1143
+ return data["experiment_id"]
1144
+
1145
+ timestamp = datetime.now().strftime("%Y%m%d_%H%M%S")
1146
+ experiment_id = f"{name}_{timestamp}"
1147
+ XDIST_EXPERIMENT_FILE.write_text(
1148
+ json.dumps(
1149
+ {
1150
+ "experiment_id": experiment_id,
1151
+ "created_at": datetime.now().isoformat(),
1152
+ }
1153
+ )
1154
+ )
1155
+ return experiment_id
1156
+
1157
+
1158
+ def _expected_cases_from_items(items) -> list[tuple[str, str, int]]:
1159
+ """Read explicit eval-case marks from the complete pytest collection."""
1160
+ cases: list[tuple[str, str, int]] = []
1161
+ for item in items:
1162
+ callspec = getattr(item, "callspec", None)
1163
+ marker = item.get_closest_marker("eval_case")
1164
+ if callspec is None or marker is None:
1165
+ continue
1166
+ task = callspec.params.get("task_name")
1167
+ treatment = callspec.params.get("treatment_name")
1168
+ repetition = marker.kwargs.get("repetition")
1169
+ if not isinstance(task, str) or not isinstance(treatment, str):
1170
+ raise pytest.UsageError("eval_case is missing task/treatment parameters")
1171
+ if isinstance(repetition, bool) or not isinstance(repetition, int) or repetition < 1:
1172
+ raise pytest.UsageError("eval_case repetition must be a positive integer")
1173
+ cases.append((task, treatment, repetition))
1174
+ return cases
1175
+
1176
+
1177
+ def _persist_expected_case_matrix(base_dir: Path, payload: dict[str, Any]) -> None:
1178
+ """Write one xdist-shared matrix; workers must agree byte-for-byte."""
1179
+ canonical = parse_expected_case_matrix(payload)
1180
+ path = base_dir / EXPECTED_CASE_MATRIX_FILENAME
1181
+ lock_path = base_dir / f".{EXPECTED_CASE_MATRIX_FILENAME}.lock"
1182
+ serialized = json.dumps(payload, indent=2, sort_keys=True) + "\n"
1183
+ with file_lock(lock_path):
1184
+ if path.exists():
1185
+ try:
1186
+ existing = parse_expected_case_matrix(json.loads(path.read_text(encoding="utf-8")))
1187
+ except (OSError, json.JSONDecodeError, ValueError) as error:
1188
+ raise RuntimeError("Existing expected case matrix is invalid") from error
1189
+ if existing != canonical:
1190
+ raise RuntimeError("pytest workers collected different expected case matrices")
1191
+ return
1192
+ temporary = path.with_name(f".{path.name}.{os.getpid()}.{time.time_ns()}.tmp")
1193
+ try:
1194
+ temporary.write_text(serialized, encoding="utf-8")
1195
+ os.replace(temporary, path)
1196
+ finally:
1197
+ temporary.unlink(missing_ok=True)
1198
+
1199
+
1200
+ def _snapshot_dynamic_skill_package(test_dir: Path, skill_hints: dict[str, Any]) -> str | None:
1201
+ """Copy a manifest target package and generated Node Skills into the workspace.
1202
+
1203
+ Validation scripts run inside Docker with ``test_dir`` mounted as /workspace,
1204
+ so they cannot inspect arbitrary host paths from the original manifest. Keep
1205
+ a package-shaped snapshot under the workspace and pass a relative path.
1206
+ """
1207
+ raw_path = skill_hints.get("path")
1208
+ if not raw_path:
1209
+ return None
1210
+ source = Path(raw_path).expanduser().resolve()
1211
+ package_dir = source.parent if source.is_file() else source
1212
+ if not package_dir.exists():
1213
+ return None
1214
+
1215
+ snapshot_root = test_dir / "_eval_target_skills"
1216
+ snapshot_root.mkdir(parents=True, exist_ok=True)
1217
+ package_dest = snapshot_root / package_dir.name
1218
+ shutil.copytree(package_dir, package_dest, dirs_exist_ok=True)
1219
+
1220
+ for node_skill in skill_hints.get("generated_node_skills") or []:
1221
+ node_source = package_dir.parent / node_skill
1222
+ if not (node_source / "SKILL.md").exists():
1223
+ continue
1224
+ shutil.copytree(node_source, snapshot_root / node_skill, dirs_exist_ok=True)
1225
+
1226
+ return str(package_dest.relative_to(test_dir)).replace("\\", "/")
1227
+
1228
+
1229
+ def _cleanup_experiment_coordination():
1230
+ """Remove coordination files after experiment."""
1231
+ import sys
1232
+
1233
+ for f in [XDIST_EXPERIMENT_FILE, XDIST_EXPERIMENT_FILE.with_suffix(".lock")]:
1234
+ try:
1235
+ f.unlink(missing_ok=True)
1236
+ except Exception as e:
1237
+ print(f"Warning: failed to clean up {f.name}: {e}", file=sys.stderr)
1238
+
1239
+
1240
+ # =============================================================================
1241
+ # SESSION-SCOPED FIXTURES
1242
+ # =============================================================================
1243
+
1244
+
1245
+ @pytest.fixture(scope="session")
1246
+ def project_root():
1247
+ """Project root directory."""
1248
+ return PROJECT_ROOT
1249
+
1250
+
1251
+ @pytest.fixture(scope="session")
1252
+ def worker_id(request):
1253
+ """Get pytest-xdist worker ID, or 'master' if not using xdist."""
1254
+ if hasattr(request.config, "workerinput"):
1255
+ return request.config.workerinput["workerid"]
1256
+ return "master"
1257
+
1258
+
1259
+ @pytest.fixture(scope="session", autouse=True)
1260
+ def verify_environment(project_root, request):
1261
+ """Verify Docker, Claude CLI, uv, bash, and API keys are available."""
1262
+ if _is_unit_tests_only(request.config):
1263
+ return
1264
+
1265
+ from scaffold.python.utils import load_eval_environment
1266
+
1267
+ load_eval_environment()
1268
+
1269
+ # Check uv (Python package manager)
1270
+ if shutil.which("uv") is None:
1271
+ pytest.skip(
1272
+ "uv is not installed or not in PATH.\n"
1273
+ "Install it: https://docs.astral.sh/uv/getting-started/installation/"
1274
+ )
1275
+
1276
+ # Check bash (required for MSYS shell scripts on Windows)
1277
+ from scaffold.python.utils import BASH_EXEC
1278
+
1279
+ if os.name == "nt" and BASH_EXEC == "bash":
1280
+ # _resolve_bash() fell back to bare "bash" — verify it actually works
1281
+ try:
1282
+ bash_check = subprocess.run(["bash", "--version"], capture_output=True, timeout=5)
1283
+ if bash_check.returncode != 0:
1284
+ raise FileNotFoundError
1285
+ except (FileNotFoundError, subprocess.TimeoutExpired):
1286
+ pytest.skip(
1287
+ "Git Bash not found. Install Git for Windows: https://git-scm.com/download/win\n"
1288
+ "Or set GIT_BASH env var to the full path of bash.exe"
1289
+ )
1290
+
1291
+ result = run_shell("docker.sh", "check", check=False)
1292
+ if result.returncode != 0:
1293
+ pytest.skip("Docker not available")
1294
+
1295
+ if not (os.environ.get("ANTHROPIC_API_KEY") or os.environ.get("ANTHROPIC_AUTH_TOKEN")):
1296
+ pytest.skip("ANTHROPIC_API_KEY or ANTHROPIC_AUTH_TOKEN not set")
1297
+
1298
+ if shutil.which("claude") is None:
1299
+ pytest.skip("Claude CLI not available")
1300
+
1301
+
1302
+ def _docker_environment_dirs_for_request(request, tasks_dir: Path) -> list[Path]:
1303
+ """Return only task environments selected by the current eval invocation."""
1304
+ if not tasks_dir.exists():
1305
+ return []
1306
+
1307
+ all_task_names = sorted(task_dir.name for task_dir in tasks_dir.iterdir() if task_dir.is_dir())
1308
+ task_filter = request.config.getoption("--task")
1309
+ manifest_path = request.config.getoption("--eval-manifest")
1310
+ if task_filter:
1311
+ task_names = [task_filter]
1312
+ elif manifest_path:
1313
+ from scaffold.python.manifests import load_eval_manifest
1314
+
1315
+ task_names = load_eval_manifest(manifest_path).recommended_tasks or all_task_names
1316
+ else:
1317
+ task_names = all_task_names
1318
+
1319
+ return [
1320
+ environment_dir
1321
+ for task_name in task_names
1322
+ if (environment_dir := tasks_dir / task_name / "environment").is_dir()
1323
+ and (environment_dir / "Dockerfile").is_file()
1324
+ ]
1325
+
1326
+
1327
+ @pytest.fixture(scope="session", autouse=True)
1328
+ def prebuild_docker_image(request):
1329
+ """Pre-build Docker image once per session to avoid race conditions."""
1330
+ if _is_unit_tests_only(request.config):
1331
+ yield
1332
+ return
1333
+
1334
+ tasks_dir = PROJECT_ROOT / "tasks"
1335
+ for env_dir in _docker_environment_dirs_for_request(request, tasks_dir):
1336
+ image = _build_docker_image_with_lock(env_dir)
1337
+ if image:
1338
+ print(f"\nPre-built Docker image: {image}")
1339
+
1340
+ yield
1341
+
1342
+ try:
1343
+ DOCKER_BUILD_LOCK.unlink(missing_ok=True)
1344
+ except Exception:
1345
+ pass
1346
+
1347
+
1348
+ # =============================================================================
1349
+ # FUNCTION-SCOPED FIXTURES
1350
+ # =============================================================================
1351
+
1352
+
1353
+ @pytest.fixture
1354
+ def test_dir(tmp_path):
1355
+ """Create isolated test directory (pytest manages cleanup)."""
1356
+ return tmp_path
1357
+
1358
+
1359
+ @pytest.fixture
1360
+ def experiment_logger():
1361
+ """Get the experiment logger for the current session."""
1362
+ return _plugin.logger if _plugin else None
1363
+
1364
+
1365
+ @pytest.fixture
1366
+ def setup_test_context(test_dir):
1367
+ """Factory fixture to set up test context with skills and CLAUDE.md."""
1368
+
1369
+ def _write_skill(
1370
+ skill_name: str,
1371
+ skill_file: str,
1372
+ scripts_dir: Path | None = None,
1373
+ source_dir: Path | None = None,
1374
+ ) -> None:
1375
+ skill_dir = test_dir / ".claude" / "skills" / skill_name
1376
+ skill_dir.mkdir(parents=True, exist_ok=True)
1377
+
1378
+ if source_dir and source_dir.is_dir():
1379
+ shutil.copytree(source_dir, skill_dir, dirs_exist_ok=True)
1380
+
1381
+ shutil.copyfile(skill_file, skill_dir / "SKILL.md")
1382
+
1383
+ if scripts_dir and scripts_dir.is_dir():
1384
+ scripts_dest = skill_dir / "scripts"
1385
+ shutil.rmtree(scripts_dest, ignore_errors=True)
1386
+ shutil.copytree(scripts_dir, scripts_dest, dirs_exist_ok=True)
1387
+
1388
+ def _copy_environment(environment_dir: Path) -> None:
1389
+ for item in environment_dir.iterdir():
1390
+ if item.name in {
1391
+ CURRENT_COMET_CLI_MARKER,
1392
+ TRUSTED_NATIVE_RUNTIME_MARKER,
1393
+ TRUSTED_NATIVE_REVIEW_FIXTURE_MARKER,
1394
+ }:
1395
+ continue
1396
+ dest = test_dir / item.name
1397
+ if item.is_dir():
1398
+ if dest.exists() and dest.is_dir():
1399
+ shutil.copytree(item, dest, dirs_exist_ok=True)
1400
+ else:
1401
+ shutil.copytree(item, dest)
1402
+ else:
1403
+ dest.parent.mkdir(parents=True, exist_ok=True)
1404
+ shutil.copy2(item, dest)
1405
+ _copy_current_comet_cli_snapshot(environment_dir, test_dir)
1406
+
1407
+ def _write_claude_md(content_file: str) -> None:
1408
+ claude_dir = test_dir / ".claude"
1409
+ claude_dir.mkdir(parents=True, exist_ok=True)
1410
+ shutil.copyfile(content_file, claude_dir / "CLAUDE.md")
1411
+ shutil.copyfile(content_file, test_dir / "CLAUDE.md")
1412
+
1413
+ def _setup(skills: dict = None, claude_md: str = None, environment_dir: Path = None):
1414
+ for skill_name, cfg in (skills or {}).items():
1415
+ if not cfg:
1416
+ continue
1417
+
1418
+ if isinstance(cfg, dict):
1419
+ sections = cfg.get("sections") or cfg.get("all", [])
1420
+ scripts_dir = cfg.get("scripts_dir")
1421
+ script_filter = cfg.get("script_filter")
1422
+ source_dir = cfg.get("source_dir")
1423
+ else:
1424
+ sections, scripts_dir, script_filter, source_dir = cfg, None, None, None
1425
+
1426
+ if not sections:
1427
+ continue
1428
+
1429
+ content = "\n\n".join(s for s in sections if s and s.strip())
1430
+ with tempfile.NamedTemporaryFile(
1431
+ mode="w", suffix=".md", delete=False, encoding="utf-8"
1432
+ ) as f:
1433
+ f.write(content)
1434
+ skill_file = f.name
1435
+
1436
+ filtered_dir = _filter_scripts(scripts_dir, script_filter)
1437
+ is_temp_dir = filtered_dir and filtered_dir != scripts_dir
1438
+
1439
+ try:
1440
+ _write_skill(skill_name, skill_file, filtered_dir, source_dir)
1441
+ finally:
1442
+ os.unlink(skill_file)
1443
+ if is_temp_dir and filtered_dir.exists():
1444
+ shutil.rmtree(filtered_dir)
1445
+
1446
+ if environment_dir and environment_dir.exists():
1447
+ _copy_environment(environment_dir)
1448
+ _copy_trusted_native_runtime_snapshot(environment_dir, test_dir, skills)
1449
+ _copy_trusted_native_review_fixture(environment_dir, test_dir)
1450
+
1451
+ if claude_md:
1452
+ with tempfile.NamedTemporaryFile(
1453
+ mode="w", suffix=".md", delete=False, encoding="utf-8"
1454
+ ) as f:
1455
+ f.write(claude_md)
1456
+ temp_file = f.name
1457
+ try:
1458
+ _write_claude_md(temp_file)
1459
+ finally:
1460
+ os.unlink(temp_file)
1461
+
1462
+ _ensure_claude_pre_tool_hook(test_dir, _comet_hook_command(test_dir))
1463
+
1464
+ return test_dir
1465
+
1466
+ return _setup
1467
+
1468
+
1469
+ @pytest.fixture
1470
+ def run_claude(test_dir, experiment_logger, request):
1471
+ """Factory fixture to run Claude in Docker and capture artifacts.
1472
+
1473
+ For tasks using ``interaction.mode=auto_user`` the single-shot ``run-claude``
1474
+ is replaced by the multi-turn ``run-claude-loop`` driver, which simulates a
1475
+ user replying at the workflow's decision points.
1476
+ """
1477
+ default_model = _selected_claude_model()
1478
+
1479
+ def _run(
1480
+ prompt: str,
1481
+ timeout: int = 600,
1482
+ model: str = None,
1483
+ interaction=None,
1484
+ image_id: str | None = None,
1485
+ ):
1486
+ mdl = model or default_model
1487
+ if os.environ.get("TRACE_TO_LANGSMITH", "").lower() == "true" and not os.environ.get(
1488
+ "CC_LANGSMITH_LOG_FILE"
1489
+ ):
1490
+ os.environ["CC_LANGSMITH_LOG_FILE"] = "/workspace/langsmith-hook.log"
1491
+ use_loop = interaction is not None and interaction.mode == "auto_user"
1492
+ if not use_loop:
1493
+ result = run_claude_in_docker(
1494
+ test_dir,
1495
+ prompt,
1496
+ timeout=timeout,
1497
+ model=mdl,
1498
+ image_id=image_id,
1499
+ )
1500
+ else:
1501
+ task_prompt_file = test_dir / ".eval-task-prompt.txt"
1502
+ task_prompt_file.write_text(prompt, encoding="utf-8")
1503
+ loop_args = [
1504
+ "run-claude-loop",
1505
+ test_dir,
1506
+ "@//workspace/.eval-task-prompt.txt",
1507
+ "--max-turns",
1508
+ str(interaction.max_turns),
1509
+ ]
1510
+ if mdl:
1511
+ loop_args += ["--model", mdl]
1512
+ if image_id:
1513
+ loop_args += ["--image-id", image_id]
1514
+ if interaction.continue_prompt:
1515
+ loop_args += ["--continue-prompt", interaction.continue_prompt]
1516
+ for pattern in interaction.decision_patterns:
1517
+ loop_args += ["--decision-pattern", pattern]
1518
+ if interaction.decision_reply:
1519
+ loop_args += ["--decision-reply", interaction.decision_reply]
1520
+ for decision_reply_step in interaction.decision_replies:
1521
+ loop_args += ["--decision-reply-step", decision_reply_step]
1522
+ if interaction.fresh_resume_marker:
1523
+ loop_args += ["--fresh-resume-marker", interaction.fresh_resume_marker]
1524
+
1525
+ prompt_file = None
1526
+ try:
1527
+ if (
1528
+ interaction.simulator_prompt
1529
+ and not interaction.decision_reply
1530
+ and not interaction.decision_replies
1531
+ ):
1532
+ prompt_file = test_dir / ".eval-simulator-prompt.txt"
1533
+ prompt_file.write_text(interaction.simulator_prompt, encoding="utf-8")
1534
+ loop_args += [
1535
+ "--simulator-prompt-file",
1536
+ "//workspace/.eval-simulator-prompt.txt",
1537
+ ]
1538
+ result = run_claude_loop_in_docker(
1539
+ test_dir,
1540
+ loop_args[2:],
1541
+ timeout=timeout + 60,
1542
+ )
1543
+ finally:
1544
+ task_prompt_file.unlink(missing_ok=True)
1545
+ if prompt_file and prompt_file.exists():
1546
+ prompt_file.unlink()
1547
+
1548
+ if experiment_logger and hasattr(request, "node"):
1549
+ treatment_name = _get_treatment_name(request.node)
1550
+ rep = _plugin.get_rep_number(treatment_name) if _plugin else 1
1551
+ save_raw(
1552
+ experiment_logger.base_dir,
1553
+ treatment_name,
1554
+ rep,
1555
+ result.stdout,
1556
+ result.stderr,
1557
+ )
1558
+
1559
+ return result
1560
+
1561
+ return _run
1562
+
1563
+
1564
+ @pytest.fixture
1565
+ def record_result(test_dir, experiment_logger, request):
1566
+ """Factory fixture to record validation results and save artifacts."""
1567
+
1568
+ def _record(
1569
+ events: dict[str, Any],
1570
+ passed: list[str],
1571
+ failed: list[str],
1572
+ run_id: str = "",
1573
+ returncode: int | None = None,
1574
+ stdout: str | None = None,
1575
+ stderr: str | None = None,
1576
+ ):
1577
+ if not experiment_logger:
1578
+ return
1579
+
1580
+ treatment_name = _get_treatment_name(request.node)
1581
+ rep = _plugin.run_counter.get(treatment_name, 1) if _plugin else 1
1582
+ base_dir = experiment_logger.base_dir
1583
+
1584
+ save_events(base_dir, treatment_name, rep, events)
1585
+ _save_artifacts(base_dir, treatment_name, rep, test_dir)
1586
+ artifact_references = build_eval_artifact_references(base_dir, treatment_name, rep)
1587
+
1588
+ scripts_used = _extract_scripts_used(events)
1589
+ failure_attribution = classify_failures(
1590
+ failed,
1591
+ events,
1592
+ events.get("profile"),
1593
+ )
1594
+
1595
+ report = _build_report_payload(
1596
+ treatment_name=treatment_name,
1597
+ rep=rep,
1598
+ run_id=run_id,
1599
+ events=events,
1600
+ passed=passed,
1601
+ failed=failed,
1602
+ scripts_used=scripts_used,
1603
+ artifact_references=artifact_references,
1604
+ failure_attribution=failure_attribution,
1605
+ returncode=returncode,
1606
+ stdout=stdout,
1607
+ stderr=stderr,
1608
+ )
1609
+ save_report(base_dir, treatment_name, rep, report)
1610
+
1611
+ experiment_logger.add_result(
1612
+ treatment_name,
1613
+ TreatmentResult(
1614
+ name=treatment_name,
1615
+ passed=len(failed) == 0,
1616
+ checks_passed=passed,
1617
+ checks_failed=failed,
1618
+ events_summary={
1619
+ "num_turns": events.get("num_turns"),
1620
+ "duration_seconds": events.get("duration_seconds"),
1621
+ "tool_calls": len(events.get("tool_calls", [])),
1622
+ "input_tokens": events.get("input_tokens"),
1623
+ "output_tokens": events.get("output_tokens"),
1624
+ "cache_read_input_tokens": events.get("cache_read_input_tokens"),
1625
+ "cache_creation_input_tokens": events.get("cache_creation_input_tokens"),
1626
+ "total_tokens": events.get("total_tokens"),
1627
+ "total_cost_usd": events.get("total_cost_usd"),
1628
+ "model_usage": events.get("model_usage", {}),
1629
+ "skills_invoked": events.get("skills_invoked", []),
1630
+ "scripts_used": scripts_used,
1631
+ "profile": events.get("profile"),
1632
+ "skill_sources": events.get("skill_sources", []),
1633
+ "eval_manifest": events.get("eval_manifest"),
1634
+ "case_manifest": events.get("case_manifest"),
1635
+ "interaction": events.get("interaction", {}),
1636
+ "artifact_references": artifact_references,
1637
+ "failure_attribution": failure_attribution,
1638
+ },
1639
+ run_id=run_id,
1640
+ ),
1641
+ )
1642
+
1643
+ return _record
1644
+
1645
+
1646
+ def _build_report_payload(
1647
+ *,
1648
+ treatment_name: str,
1649
+ rep: int,
1650
+ run_id: str,
1651
+ events: dict[str, Any],
1652
+ passed: list[str],
1653
+ failed: list[str],
1654
+ scripts_used: list[str],
1655
+ artifact_references: dict[str, str],
1656
+ failure_attribution: list[dict[str, str]],
1657
+ returncode: int | None = None,
1658
+ stdout: str | None = None,
1659
+ stderr: str | None = None,
1660
+ ) -> dict[str, Any]:
1661
+ sample_quality = infer_sample_quality(
1662
+ events=events,
1663
+ checks_failed=failed,
1664
+ failure_attribution=failure_attribution,
1665
+ stdout=stdout,
1666
+ stderr=stderr,
1667
+ returncode=returncode,
1668
+ ).to_dict()
1669
+
1670
+ return {
1671
+ "name": treatment_name,
1672
+ "rep": rep,
1673
+ "passed": len(failed) == 0,
1674
+ "run_id": run_id,
1675
+ "checks_passed": passed,
1676
+ "checks_failed": failed,
1677
+ "sample_quality": sample_quality,
1678
+ "events_summary": {
1679
+ "duration_seconds": events.get("duration_seconds"),
1680
+ "num_turns": events.get("num_turns"),
1681
+ "tool_calls": len(events.get("tool_calls", [])),
1682
+ "input_tokens": events.get("input_tokens"),
1683
+ "output_tokens": events.get("output_tokens"),
1684
+ "cache_read_input_tokens": events.get("cache_read_input_tokens"),
1685
+ "cache_creation_input_tokens": events.get("cache_creation_input_tokens"),
1686
+ "total_tokens": events.get("total_tokens"),
1687
+ "total_cost_usd": events.get("total_cost_usd"),
1688
+ "model_usage": events.get("model_usage", {}),
1689
+ "files_created": events.get("files_created", []),
1690
+ "skills_invoked": events.get("skills_invoked", []),
1691
+ "scripts_used": scripts_used,
1692
+ "profile": events.get("profile"),
1693
+ "skill_sources": events.get("skill_sources", []),
1694
+ "eval_manifest": events.get("eval_manifest"),
1695
+ "case_manifest": events.get("case_manifest"),
1696
+ "interaction": events.get("interaction", {}),
1697
+ "artifact_references": artifact_references,
1698
+ "failure_attribution": failure_attribution,
1699
+ },
1700
+ "timestamp": datetime.now().isoformat(),
1701
+ }
1702
+
1703
+
1704
+ # Fixture bundle accessor
1705
+ _current_fixtures: SimpleNamespace | None = None
1706
+
1707
+
1708
+ def get_fixtures() -> SimpleNamespace:
1709
+ """Get the current test's fixtures bundle."""
1710
+ if _current_fixtures is None:
1711
+ raise RuntimeError("get_fixtures() called outside of test context")
1712
+ return _current_fixtures
1713
+
1714
+
1715
+ @pytest.fixture(scope="function", autouse=True)
1716
+ def fixtures(
1717
+ verify_environment,
1718
+ test_dir,
1719
+ setup_test_context,
1720
+ run_claude,
1721
+ record_result,
1722
+ request,
1723
+ ):
1724
+ """Bundle test fixtures and make them accessible via get_fixtures()."""
1725
+ global _current_fixtures
1726
+ _current_fixtures = SimpleNamespace(
1727
+ test_dir=test_dir,
1728
+ setup_test_context=setup_test_context,
1729
+ run_claude=run_claude,
1730
+ record_result=record_result,
1731
+ request_config=request.config,
1732
+ )
1733
+ yield _current_fixtures
1734
+ _current_fixtures = None
1735
+
1736
+
1737
+ # =============================================================================
1738
+ # FIXTURE HELPERS
1739
+ # =============================================================================
1740
+
1741
+
1742
+ def _get_treatment_name(node) -> str:
1743
+ """Extract treatment name from pytest node."""
1744
+ nodeid = node.nodeid
1745
+ if "[" in nodeid:
1746
+ return nodeid.split("[")[1].rstrip("]")
1747
+ return nodeid.split("::")[-1]
1748
+
1749
+
1750
+ def _filter_scripts(scripts_dir: Path, script_filter: str) -> Path | None:
1751
+ """Filter scripts by extension and return a temp dir with filtered scripts."""
1752
+ if not scripts_dir or not scripts_dir.exists():
1753
+ return None
1754
+
1755
+ if script_filter is None or script_filter == "all":
1756
+ return scripts_dir
1757
+
1758
+ extensions = SCRIPT_EXTENSIONS.get(script_filter)
1759
+ if extensions is None:
1760
+ return scripts_dir
1761
+
1762
+ temp_dir = Path(tempfile.mkdtemp(prefix="scripts_"))
1763
+ copied_any = False
1764
+
1765
+ for script in scripts_dir.iterdir():
1766
+ if script.is_file() and script.suffix in extensions:
1767
+ shutil.copy2(script, temp_dir / script.name)
1768
+ copied_any = True
1769
+
1770
+ if not copied_any:
1771
+ shutil.rmtree(temp_dir)
1772
+ return None
1773
+
1774
+ return temp_dir
1775
+
1776
+
1777
+ def _build_docker_image_with_lock(environment_dir: Path) -> str | None:
1778
+ """Build Docker image with file locking to prevent race conditions."""
1779
+ if not environment_dir or not (environment_dir / "Dockerfile").exists():
1780
+ return None
1781
+
1782
+ with file_lock(DOCKER_BUILD_LOCK):
1783
+ # A cold image build downloads Debian packages and installs the Claude CLI.
1784
+ # Five minutes is insufficient after cache cleanup or on a proxied connection.
1785
+ result = run_shell("docker.sh", "build", str(environment_dir), timeout=900, check=False)
1786
+ if result.returncode == 0:
1787
+ return result.stdout.strip()
1788
+ return None
1789
+
1790
+
1791
+ @contextmanager
1792
+ def file_lock(path: Path, timeout: float = 600):
1793
+ """Cross-platform exclusive file lock for pytest-xdist coordination."""
1794
+ path.parent.mkdir(parents=True, exist_ok=True)
1795
+ with open(path, "a+b") as lock_file:
1796
+ if os.name == "nt":
1797
+ import msvcrt
1798
+
1799
+ deadline = time.monotonic() + timeout
1800
+ while True:
1801
+ lock_file.seek(0)
1802
+ try:
1803
+ msvcrt.locking(lock_file.fileno(), msvcrt.LK_NBLCK, 1)
1804
+ break
1805
+ except OSError as error:
1806
+ if error.errno not in {13, 36}:
1807
+ raise
1808
+ if time.monotonic() >= deadline:
1809
+ raise
1810
+ time.sleep(0.05)
1811
+ try:
1812
+ yield
1813
+ finally:
1814
+ lock_file.seek(0)
1815
+ msvcrt.locking(lock_file.fileno(), msvcrt.LK_UNLCK, 1)
1816
+ else:
1817
+ import fcntl
1818
+
1819
+ fcntl.flock(lock_file.fileno(), fcntl.LOCK_EX)
1820
+ try:
1821
+ yield
1822
+ finally:
1823
+ fcntl.flock(lock_file.fileno(), fcntl.LOCK_UN)
1824
+
1825
+
1826
+ def _discover_skill_scripts() -> list[str]:
1827
+ """Dynamically discover all script files from skills directories."""
1828
+ scripts = set()
1829
+ skills_dir = PROJECT_ROOT / "skills"
1830
+
1831
+ if not skills_dir.exists():
1832
+ return []
1833
+
1834
+ for scripts_dir in skills_dir.rglob("scripts"):
1835
+ if scripts_dir.is_dir():
1836
+ for script in scripts_dir.iterdir():
1837
+ if script.is_file() and script.suffix in {".py", ".ts", ".js"}:
1838
+ scripts.add(script.name)
1839
+
1840
+ return sorted(scripts)
1841
+
1842
+
1843
+ def _get_known_scripts() -> list[str]:
1844
+ """Get known scripts, discovering them on first call."""
1845
+ global _KNOWN_SCRIPTS
1846
+ if _KNOWN_SCRIPTS is None:
1847
+ _KNOWN_SCRIPTS = _discover_skill_scripts()
1848
+ return _KNOWN_SCRIPTS
1849
+
1850
+
1851
+ def _extract_scripts_used(events: dict) -> list[str]:
1852
+ """Extract which skill scripts were used from events."""
1853
+ commands = " ".join(events.get("commands_run", [])).lower()
1854
+ files_read = " ".join(events.get("files_read", [])).lower()
1855
+ all_activity = commands + " " + files_read
1856
+
1857
+ return [s for s in _get_known_scripts() if s.lower() in all_activity]
1858
+
1859
+
1860
+ def _save_artifacts(base_dir: Path, treatment_name: str, rep: int, test_dir: Path):
1861
+ """Save Claude's generated files as artifacts."""
1862
+ artifacts_dir = base_dir / "artifacts" / f"{treatment_name.lower()}_rep{rep}"
1863
+ claude_dir = artifacts_dir / "claude"
1864
+ execution_dir = artifacts_dir / "execution"
1865
+ claude_dir.mkdir(parents=True, exist_ok=True)
1866
+ execution_dir.mkdir(parents=True, exist_ok=True)
1867
+
1868
+ from scaffold.python.utils import TEST_CONTEXT_FILE, TEST_RESULTS_FILE
1869
+
1870
+ exclude_dirs = {
1871
+ ".claude",
1872
+ ".git",
1873
+ "_eval_current_comet",
1874
+ "node_modules",
1875
+ "__pycache__",
1876
+ "scaffold",
1877
+ "validation",
1878
+ "data",
1879
+ }
1880
+ exclude_files = {
1881
+ "CLAUDE.md",
1882
+ "Dockerfile",
1883
+ "requirements.txt",
1884
+ "package.json",
1885
+ "package-lock.json",
1886
+ "tsconfig.json",
1887
+ TEST_CONTEXT_FILE,
1888
+ TEST_RESULTS_FILE,
1889
+ }
1890
+
1891
+ claude_files = []
1892
+ for item in test_dir.rglob("*"):
1893
+ if not item.is_file():
1894
+ continue
1895
+ if item.name.startswith("."):
1896
+ continue
1897
+ if item.name in exclude_files:
1898
+ continue
1899
+ if any(excl in item.parts for excl in exclude_dirs):
1900
+ continue
1901
+ try:
1902
+ rel_path = item.relative_to(test_dir)
1903
+ dest = claude_dir / rel_path
1904
+ dest.parent.mkdir(parents=True, exist_ok=True)
1905
+ shutil.copy(item, dest)
1906
+ claude_files.append(item)
1907
+ except Exception as e:
1908
+ import sys
1909
+
1910
+ print(f"Warning: failed to save artifact {item.name}: {e}", file=sys.stderr)
1911
+
1912
+ for py_file in claude_files:
1913
+ if py_file.suffix == ".py" and py_file.parent == test_dir:
1914
+ try:
1915
+ success, output = run_python_in_docker(test_dir, py_file.name, timeout=300)
1916
+ status = "success" if success else "error"
1917
+ output_file = execution_dir / f"{py_file.stem}_{status}.txt"
1918
+ output_file.write_text(strip_ansi(output))
1919
+ except Exception as e:
1920
+ error_file = execution_dir / f"{py_file.stem}_error.txt"
1921
+ error_file.write_text(str(e))