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

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