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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (1297) hide show
  1. package/LICENSE +21 -21
  2. package/README.md +279 -113
  3. package/assets/manifest.json +17 -5
  4. package/assets/skills/comet/SKILL.md +17 -256
  5. package/assets/skills/comet/reference/auto-transition.md +1 -1
  6. package/assets/skills/comet/reference/classic-layout.md +34 -0
  7. package/assets/skills/comet/reference/comet-yaml-fields.md +14 -8
  8. package/assets/skills/comet/reference/context-recovery.md +14 -4
  9. package/assets/skills/comet/reference/decision-point.md +11 -0
  10. package/assets/skills/comet/reference/file-structure.md +2 -2
  11. package/assets/skills/comet/reference/intent-frame.md +3 -3
  12. package/assets/skills/comet/reference/scripts.md +47 -15
  13. package/assets/skills/comet/reference/subagent-dispatch.md +8 -7
  14. package/assets/skills/comet/rules/comet-phase-guard.en.md +34 -31
  15. package/assets/skills/comet/rules/comet-phase-guard.md +34 -32
  16. package/assets/skills/comet/rules/comet-workflow-guard.en.md +32 -0
  17. package/assets/skills/comet/rules/comet-workflow-guard.md +32 -0
  18. package/assets/skills/comet/scripts/comet-entry-runtime.mjs +8074 -0
  19. package/assets/skills/comet/scripts/comet-hook-router.mjs +12086 -0
  20. package/assets/skills/comet/scripts/comet-resume-probe.mjs +3 -0
  21. package/assets/skills/comet/scripts/comet-runtime.mjs +10449 -4105
  22. package/assets/skills/comet-any/SKILL.md +5 -5
  23. package/assets/skills/comet-any/reference/authored-zone-example.md +10 -5
  24. package/assets/skills/comet-any/reference/authoring-subagents.md +1 -1
  25. package/assets/skills/comet-any/reference/bundle-authoring.md +2 -2
  26. package/assets/skills/comet-any/reference/subagents/pause-points-author.md +14 -11
  27. package/assets/skills/comet-any/reference/subagents/reference-author.md +1 -1
  28. package/assets/skills/comet-any/reference/subagents/script-author.md +1 -1
  29. package/assets/skills/comet-any/reference/subagents/skill-core-author.md +1 -1
  30. package/assets/skills/comet-any/reference/subagents/skill-reviewer.md +4 -2
  31. package/assets/skills/comet-any/reference/subagents/workflow-entry-author.md +8 -7
  32. package/assets/skills/comet-archive/SKILL.md +69 -26
  33. package/assets/skills/comet-build/SKILL.md +77 -58
  34. package/assets/skills/comet-classic/SKILL.md +295 -0
  35. package/assets/skills/comet-design/SKILL.md +40 -36
  36. package/assets/skills/comet-hotfix/SKILL.md +57 -35
  37. package/assets/skills/comet-native/SKILL.md +132 -0
  38. package/assets/skills/comet-native/reference/artifacts.md +141 -0
  39. package/assets/skills/comet-native/reference/clarification.md +54 -0
  40. package/assets/skills/comet-native/reference/commands.md +168 -0
  41. package/assets/skills/comet-native/reference/recovery.md +96 -0
  42. package/assets/skills/comet-native/scripts/comet-native-hook-guard.mjs +4 -0
  43. package/assets/skills/comet-native/scripts/comet-native-runtime.mjs +34165 -0
  44. package/assets/skills/comet-open/SKILL.md +119 -59
  45. package/assets/skills/comet-tweak/SKILL.md +52 -27
  46. package/assets/skills/comet-verify/SKILL.md +65 -73
  47. package/assets/skills-zh/comet/SKILL.md +17 -244
  48. package/assets/skills-zh/comet/reference/auto-transition.md +1 -1
  49. package/assets/skills-zh/comet/reference/classic-layout.md +34 -0
  50. package/assets/skills-zh/comet/reference/comet-yaml-fields.md +13 -8
  51. package/assets/skills-zh/comet/reference/context-recovery.md +14 -4
  52. package/assets/skills-zh/comet/reference/decision-point.md +11 -0
  53. package/assets/skills-zh/comet/reference/file-structure.md +2 -2
  54. package/assets/skills-zh/comet/reference/intent-frame.md +3 -3
  55. package/assets/skills-zh/comet/reference/scripts.md +47 -15
  56. package/assets/skills-zh/comet/reference/subagent-dispatch.md +8 -7
  57. package/assets/skills-zh/comet-any/SKILL.md +5 -5
  58. package/assets/skills-zh/comet-any/reference/authored-zone-example.md +10 -5
  59. package/assets/skills-zh/comet-any/reference/authoring-subagents.md +1 -1
  60. package/assets/skills-zh/comet-any/reference/bundle-authoring.md +2 -2
  61. package/assets/skills-zh/comet-any/reference/subagents/pause-points-author.md +14 -12
  62. package/assets/skills-zh/comet-any/reference/subagents/reference-author.md +1 -1
  63. package/assets/skills-zh/comet-any/reference/subagents/script-author.md +1 -1
  64. package/assets/skills-zh/comet-any/reference/subagents/skill-core-author.md +1 -1
  65. package/assets/skills-zh/comet-any/reference/subagents/skill-reviewer.md +4 -2
  66. package/assets/skills-zh/comet-any/reference/subagents/workflow-entry-author.md +8 -7
  67. package/assets/skills-zh/comet-archive/SKILL.md +69 -26
  68. package/assets/skills-zh/comet-build/SKILL.md +77 -58
  69. package/assets/skills-zh/comet-classic/SKILL.md +283 -0
  70. package/assets/skills-zh/comet-design/SKILL.md +40 -36
  71. package/assets/skills-zh/comet-hotfix/SKILL.md +56 -34
  72. package/assets/skills-zh/comet-native/SKILL.md +132 -0
  73. package/assets/skills-zh/comet-native/reference/artifacts.md +141 -0
  74. package/assets/skills-zh/comet-native/reference/clarification.md +54 -0
  75. package/assets/skills-zh/comet-native/reference/commands.md +168 -0
  76. package/assets/skills-zh/comet-native/reference/recovery.md +96 -0
  77. package/assets/skills-zh/comet-open/SKILL.md +118 -58
  78. package/assets/skills-zh/comet-tweak/SKILL.md +51 -26
  79. package/assets/skills-zh/comet-verify/SKILL.md +65 -73
  80. package/dist/app/cli/comet-banner.d.ts +25 -0
  81. package/dist/app/cli/comet-banner.d.ts.map +1 -0
  82. package/dist/app/cli/comet-banner.js +265 -0
  83. package/dist/app/cli/comet-banner.js.map +1 -0
  84. package/dist/app/cli/index.js +113 -16
  85. package/dist/app/cli/index.js.map +1 -1
  86. package/dist/app/commands/classic.d.ts +5 -0
  87. package/dist/app/commands/classic.d.ts.map +1 -0
  88. package/dist/app/commands/classic.js +32 -0
  89. package/dist/app/commands/classic.js.map +1 -0
  90. package/dist/app/commands/command-result.d.ts +6 -0
  91. package/dist/app/commands/command-result.d.ts.map +1 -0
  92. package/dist/app/commands/command-result.js +4 -0
  93. package/dist/app/commands/command-result.js.map +1 -0
  94. package/dist/app/commands/doctor.d.ts +4 -0
  95. package/dist/app/commands/doctor.d.ts.map +1 -1
  96. package/dist/app/commands/doctor.js +926 -95
  97. package/dist/app/commands/doctor.js.map +1 -1
  98. package/dist/app/commands/eval.d.ts +3 -1
  99. package/dist/app/commands/eval.d.ts.map +1 -1
  100. package/dist/app/commands/eval.js +80 -22
  101. package/dist/app/commands/eval.js.map +1 -1
  102. package/dist/app/commands/i18n.d.ts +1 -1
  103. package/dist/app/commands/i18n.d.ts.map +1 -1
  104. package/dist/app/commands/i18n.js +18 -6
  105. package/dist/app/commands/i18n.js.map +1 -1
  106. package/dist/app/commands/init.d.ts +13 -3
  107. package/dist/app/commands/init.d.ts.map +1 -1
  108. package/dist/app/commands/init.js +561 -72
  109. package/dist/app/commands/init.js.map +1 -1
  110. package/dist/app/commands/native.d.ts +2 -0
  111. package/dist/app/commands/native.d.ts.map +1 -0
  112. package/dist/app/commands/native.js +10 -0
  113. package/dist/app/commands/native.js.map +1 -0
  114. package/dist/app/commands/project-scope-selection.d.ts +13 -0
  115. package/dist/app/commands/project-scope-selection.d.ts.map +1 -0
  116. package/dist/app/commands/project-scope-selection.js +35 -0
  117. package/dist/app/commands/project-scope-selection.js.map +1 -0
  118. package/dist/app/commands/resume-probe.d.ts +12 -0
  119. package/dist/app/commands/resume-probe.d.ts.map +1 -0
  120. package/dist/app/commands/resume-probe.js +68 -0
  121. package/dist/app/commands/resume-probe.js.map +1 -0
  122. package/dist/app/commands/status.d.ts.map +1 -1
  123. package/dist/app/commands/status.js +70 -104
  124. package/dist/app/commands/status.js.map +1 -1
  125. package/dist/app/commands/uninstall.d.ts +5 -0
  126. package/dist/app/commands/uninstall.d.ts.map +1 -1
  127. package/dist/app/commands/uninstall.js +264 -53
  128. package/dist/app/commands/uninstall.js.map +1 -1
  129. package/dist/app/commands/update.d.ts +29 -5
  130. package/dist/app/commands/update.d.ts.map +1 -1
  131. package/dist/app/commands/update.js +1431 -127
  132. package/dist/app/commands/update.js.map +1 -1
  133. package/dist/app/commands/workflow.d.ts +6 -0
  134. package/dist/app/commands/workflow.d.ts.map +1 -0
  135. package/dist/app/commands/workflow.js +11 -0
  136. package/dist/app/commands/workflow.js.map +1 -0
  137. package/dist/config/repository-layout.json +29 -3
  138. package/dist/domains/bundle/bundle-platform.d.ts +1 -0
  139. package/dist/domains/bundle/bundle-platform.d.ts.map +1 -1
  140. package/dist/domains/bundle/bundle-platform.js +10 -4
  141. package/dist/domains/bundle/bundle-platform.js.map +1 -1
  142. package/dist/domains/bundle/eval-manifest-runtime.d.ts +8 -0
  143. package/dist/domains/bundle/eval-manifest-runtime.d.ts.map +1 -0
  144. package/dist/domains/bundle/eval-manifest-runtime.js +118 -0
  145. package/dist/domains/bundle/eval-manifest-runtime.js.map +1 -0
  146. package/dist/domains/bundle/eval-run-result.d.ts +22 -0
  147. package/dist/domains/bundle/eval-run-result.d.ts.map +1 -0
  148. package/dist/domains/bundle/eval-run-result.js +207 -0
  149. package/dist/domains/bundle/eval-run-result.js.map +1 -0
  150. package/dist/domains/bundle/eval.d.ts.map +1 -1
  151. package/dist/domains/bundle/eval.js +21 -24
  152. package/dist/domains/bundle/eval.js.map +1 -1
  153. package/dist/domains/bundle/factory.d.ts.map +1 -1
  154. package/dist/domains/bundle/factory.js +2 -9
  155. package/dist/domains/bundle/factory.js.map +1 -1
  156. package/dist/domains/bundle/review-summary.js +1 -1
  157. package/dist/domains/bundle/review-summary.js.map +1 -1
  158. package/dist/domains/bundle/state.d.ts.map +1 -1
  159. package/dist/domains/bundle/state.js +117 -2
  160. package/dist/domains/bundle/state.js.map +1 -1
  161. package/dist/domains/bundle/types.d.ts +1 -1
  162. package/dist/domains/bundle/types.d.ts.map +1 -1
  163. package/dist/domains/comet-classic/classic-archive-pointer.d.ts +8 -0
  164. package/dist/domains/comet-classic/classic-archive-pointer.d.ts.map +1 -0
  165. package/dist/domains/comet-classic/classic-archive-pointer.js +66 -0
  166. package/dist/domains/comet-classic/classic-archive-pointer.js.map +1 -0
  167. package/dist/domains/comet-classic/classic-archive.d.ts +1 -0
  168. package/dist/domains/comet-classic/classic-archive.d.ts.map +1 -1
  169. package/dist/domains/comet-classic/classic-archive.js +205 -114
  170. package/dist/domains/comet-classic/classic-archive.js.map +1 -1
  171. package/dist/domains/comet-classic/classic-branch-binding.d.ts +51 -0
  172. package/dist/domains/comet-classic/classic-branch-binding.d.ts.map +1 -0
  173. package/dist/domains/comet-classic/classic-branch-binding.js +107 -0
  174. package/dist/domains/comet-classic/classic-branch-binding.js.map +1 -0
  175. package/dist/domains/comet-classic/classic-cli.d.ts +3 -1
  176. package/dist/domains/comet-classic/classic-cli.d.ts.map +1 -1
  177. package/dist/domains/comet-classic/classic-cli.js +12 -3
  178. package/dist/domains/comet-classic/classic-cli.js.map +1 -1
  179. package/dist/domains/comet-classic/classic-command-checks.d.ts +20 -0
  180. package/dist/domains/comet-classic/classic-command-checks.d.ts.map +1 -0
  181. package/dist/domains/comet-classic/classic-command-checks.js +94 -0
  182. package/dist/domains/comet-classic/classic-command-checks.js.map +1 -0
  183. package/dist/domains/comet-classic/classic-command-context.d.ts +12 -0
  184. package/dist/domains/comet-classic/classic-command-context.d.ts.map +1 -0
  185. package/dist/domains/comet-classic/classic-command-context.js +42 -0
  186. package/dist/domains/comet-classic/classic-command-context.js.map +1 -0
  187. package/dist/domains/comet-classic/classic-current-change.d.ts +17 -0
  188. package/dist/domains/comet-classic/classic-current-change.d.ts.map +1 -0
  189. package/dist/domains/comet-classic/classic-current-change.js +112 -0
  190. package/dist/domains/comet-classic/classic-current-change.js.map +1 -0
  191. package/dist/domains/comet-classic/classic-diagnostics.d.ts +2 -1
  192. package/dist/domains/comet-classic/classic-diagnostics.d.ts.map +1 -1
  193. package/dist/domains/comet-classic/classic-diagnostics.js +54 -1
  194. package/dist/domains/comet-classic/classic-diagnostics.js.map +1 -1
  195. package/dist/domains/comet-classic/classic-evidence.d.ts +1 -0
  196. package/dist/domains/comet-classic/classic-evidence.d.ts.map +1 -1
  197. package/dist/domains/comet-classic/classic-evidence.js +101 -37
  198. package/dist/domains/comet-classic/classic-evidence.js.map +1 -1
  199. package/dist/domains/comet-classic/classic-guard.d.ts.map +1 -1
  200. package/dist/domains/comet-classic/classic-guard.js +229 -208
  201. package/dist/domains/comet-classic/classic-guard.js.map +1 -1
  202. package/dist/domains/comet-classic/classic-handoff.d.ts.map +1 -1
  203. package/dist/domains/comet-classic/classic-handoff.js +155 -107
  204. package/dist/domains/comet-classic/classic-handoff.js.map +1 -1
  205. package/dist/domains/comet-classic/classic-hook-guard.d.ts +9 -0
  206. package/dist/domains/comet-classic/classic-hook-guard.d.ts.map +1 -1
  207. package/dist/domains/comet-classic/classic-hook-guard.js +406 -54
  208. package/dist/domains/comet-classic/classic-hook-guard.js.map +1 -1
  209. package/dist/domains/comet-classic/classic-layout-initialization.d.ts +86 -0
  210. package/dist/domains/comet-classic/classic-layout-initialization.d.ts.map +1 -0
  211. package/dist/domains/comet-classic/classic-layout-initialization.js +813 -0
  212. package/dist/domains/comet-classic/classic-layout-initialization.js.map +1 -0
  213. package/dist/domains/comet-classic/classic-layout.d.ts +47 -0
  214. package/dist/domains/comet-classic/classic-layout.d.ts.map +1 -0
  215. package/dist/domains/comet-classic/classic-layout.js +227 -0
  216. package/dist/domains/comet-classic/classic-layout.js.map +1 -0
  217. package/dist/domains/comet-classic/classic-migrate.d.ts +4 -0
  218. package/dist/domains/comet-classic/classic-migrate.d.ts.map +1 -1
  219. package/dist/domains/comet-classic/classic-migrate.js +8 -12
  220. package/dist/domains/comet-classic/classic-migrate.js.map +1 -1
  221. package/dist/domains/comet-classic/classic-openspec-command.d.ts +4 -0
  222. package/dist/domains/comet-classic/classic-openspec-command.d.ts.map +1 -0
  223. package/dist/domains/comet-classic/classic-openspec-command.js +45 -0
  224. package/dist/domains/comet-classic/classic-openspec-command.js.map +1 -0
  225. package/dist/domains/comet-classic/classic-openspec-root.d.ts +13 -0
  226. package/dist/domains/comet-classic/classic-openspec-root.d.ts.map +1 -0
  227. package/dist/domains/comet-classic/classic-openspec-root.js +47 -0
  228. package/dist/domains/comet-classic/classic-openspec-root.js.map +1 -0
  229. package/dist/domains/comet-classic/classic-paths.d.ts +11 -1
  230. package/dist/domains/comet-classic/classic-paths.d.ts.map +1 -1
  231. package/dist/domains/comet-classic/classic-paths.js +87 -35
  232. package/dist/domains/comet-classic/classic-paths.js.map +1 -1
  233. package/dist/domains/comet-classic/classic-project-config.d.ts +16 -0
  234. package/dist/domains/comet-classic/classic-project-config.d.ts.map +1 -0
  235. package/dist/domains/comet-classic/classic-project-config.js +36 -0
  236. package/dist/domains/comet-classic/classic-project-config.js.map +1 -0
  237. package/dist/domains/comet-classic/classic-protected-path.d.ts +39 -0
  238. package/dist/domains/comet-classic/classic-protected-path.d.ts.map +1 -0
  239. package/dist/domains/comet-classic/classic-protected-path.js +69 -0
  240. package/dist/domains/comet-classic/classic-protected-path.js.map +1 -0
  241. package/dist/domains/comet-classic/classic-resolver.d.ts.map +1 -1
  242. package/dist/domains/comet-classic/classic-resolver.js +4 -4
  243. package/dist/domains/comet-classic/classic-resolver.js.map +1 -1
  244. package/dist/domains/comet-classic/classic-resume-probe-command.d.ts +3 -0
  245. package/dist/domains/comet-classic/classic-resume-probe-command.d.ts.map +1 -0
  246. package/dist/domains/comet-classic/classic-resume-probe-command.js +59 -0
  247. package/dist/domains/comet-classic/classic-resume-probe-command.js.map +1 -0
  248. package/dist/domains/comet-classic/classic-resume-probe-entry.d.ts +2 -0
  249. package/dist/domains/comet-classic/classic-resume-probe-entry.d.ts.map +1 -0
  250. package/dist/domains/comet-classic/classic-resume-probe-entry.js +4 -0
  251. package/dist/domains/comet-classic/classic-resume-probe-entry.js.map +1 -0
  252. package/dist/domains/comet-classic/classic-resume-probe.d.ts +29 -0
  253. package/dist/domains/comet-classic/classic-resume-probe.d.ts.map +1 -0
  254. package/dist/domains/comet-classic/classic-resume-probe.js +406 -0
  255. package/dist/domains/comet-classic/classic-resume-probe.js.map +1 -0
  256. package/dist/domains/comet-classic/classic-root-command.d.ts +5 -0
  257. package/dist/domains/comet-classic/classic-root-command.d.ts.map +1 -0
  258. package/dist/domains/comet-classic/classic-root-command.js +84 -0
  259. package/dist/domains/comet-classic/classic-root-command.js.map +1 -0
  260. package/dist/domains/comet-classic/classic-root-move.d.ts +119 -0
  261. package/dist/domains/comet-classic/classic-root-move.d.ts.map +1 -0
  262. package/dist/domains/comet-classic/classic-root-move.js +1737 -0
  263. package/dist/domains/comet-classic/classic-root-move.js.map +1 -0
  264. package/dist/domains/comet-classic/classic-runtime-run.d.ts +2 -1
  265. package/dist/domains/comet-classic/classic-runtime-run.d.ts.map +1 -1
  266. package/dist/domains/comet-classic/classic-runtime-run.js +278 -5
  267. package/dist/domains/comet-classic/classic-runtime-run.js.map +1 -1
  268. package/dist/domains/comet-classic/classic-state-command.d.ts.map +1 -1
  269. package/dist/domains/comet-classic/classic-state-command.js +342 -87
  270. package/dist/domains/comet-classic/classic-state-command.js.map +1 -1
  271. package/dist/domains/comet-classic/classic-state-events.d.ts +1 -1
  272. package/dist/domains/comet-classic/classic-state-events.d.ts.map +1 -1
  273. package/dist/domains/comet-classic/classic-state-events.js +3 -4
  274. package/dist/domains/comet-classic/classic-state-events.js.map +1 -1
  275. package/dist/domains/comet-classic/classic-state.d.ts +6 -4
  276. package/dist/domains/comet-classic/classic-state.d.ts.map +1 -1
  277. package/dist/domains/comet-classic/classic-state.js +20 -7
  278. package/dist/domains/comet-classic/classic-state.js.map +1 -1
  279. package/dist/domains/comet-classic/classic-store.d.ts +6 -1
  280. package/dist/domains/comet-classic/classic-store.d.ts.map +1 -1
  281. package/dist/domains/comet-classic/classic-store.js +36 -23
  282. package/dist/domains/comet-classic/classic-store.js.map +1 -1
  283. package/dist/domains/comet-classic/classic-transitions.d.ts +1 -1
  284. package/dist/domains/comet-classic/classic-transitions.d.ts.map +1 -1
  285. package/dist/domains/comet-classic/classic-transitions.js +37 -3
  286. package/dist/domains/comet-classic/classic-transitions.js.map +1 -1
  287. package/dist/domains/comet-classic/classic-validate-command.d.ts.map +1 -1
  288. package/dist/domains/comet-classic/classic-validate-command.js +40 -20
  289. package/dist/domains/comet-classic/classic-validate-command.js.map +1 -1
  290. package/dist/domains/comet-classic/index.d.ts +3 -0
  291. package/dist/domains/comet-classic/index.d.ts.map +1 -1
  292. package/dist/domains/comet-classic/index.js +3 -0
  293. package/dist/domains/comet-classic/index.js.map +1 -1
  294. package/dist/domains/comet-entry/current-selection-repair.d.ts +17 -0
  295. package/dist/domains/comet-entry/current-selection-repair.d.ts.map +1 -0
  296. package/dist/domains/comet-entry/current-selection-repair.js +19 -0
  297. package/dist/domains/comet-entry/current-selection-repair.js.map +1 -0
  298. package/dist/domains/comet-entry/current-selection.d.ts +28 -0
  299. package/dist/domains/comet-entry/current-selection.d.ts.map +1 -0
  300. package/dist/domains/comet-entry/current-selection.js +114 -0
  301. package/dist/domains/comet-entry/current-selection.js.map +1 -0
  302. package/dist/domains/comet-entry/entry-runtime-entry.d.ts +2 -0
  303. package/dist/domains/comet-entry/entry-runtime-entry.d.ts.map +1 -0
  304. package/dist/domains/comet-entry/entry-runtime-entry.js +3 -0
  305. package/dist/domains/comet-entry/entry-runtime-entry.js.map +1 -0
  306. package/dist/domains/comet-entry/entry-runtime.d.ts +7 -0
  307. package/dist/domains/comet-entry/entry-runtime.d.ts.map +1 -0
  308. package/dist/domains/comet-entry/entry-runtime.js +55 -0
  309. package/dist/domains/comet-entry/entry-runtime.js.map +1 -0
  310. package/dist/domains/comet-entry/hook-adapter.d.ts +6 -0
  311. package/dist/domains/comet-entry/hook-adapter.d.ts.map +1 -0
  312. package/dist/domains/comet-entry/hook-adapter.js +202 -0
  313. package/dist/domains/comet-entry/hook-adapter.js.map +1 -0
  314. package/dist/domains/comet-entry/hook-router-entry.d.ts +8 -0
  315. package/dist/domains/comet-entry/hook-router-entry.d.ts.map +1 -0
  316. package/dist/domains/comet-entry/hook-router-entry.js +88 -0
  317. package/dist/domains/comet-entry/hook-router-entry.js.map +1 -0
  318. package/dist/domains/comet-entry/hook-router.d.ts +32 -0
  319. package/dist/domains/comet-entry/hook-router.d.ts.map +1 -0
  320. package/dist/domains/comet-entry/hook-router.js +133 -0
  321. package/dist/domains/comet-entry/hook-router.js.map +1 -0
  322. package/dist/domains/comet-entry/hook-types.d.ts +20 -0
  323. package/dist/domains/comet-entry/hook-types.d.ts.map +1 -0
  324. package/dist/domains/comet-entry/hook-types.js +2 -0
  325. package/dist/domains/comet-entry/hook-types.js.map +1 -0
  326. package/dist/domains/comet-entry/init-workflow.d.ts +19 -0
  327. package/dist/domains/comet-entry/init-workflow.d.ts.map +1 -0
  328. package/dist/domains/comet-entry/init-workflow.js +132 -0
  329. package/dist/domains/comet-entry/init-workflow.js.map +1 -0
  330. package/dist/domains/comet-entry/project-status.d.ts +3 -0
  331. package/dist/domains/comet-entry/project-status.d.ts.map +1 -0
  332. package/dist/domains/comet-entry/project-status.js +291 -0
  333. package/dist/domains/comet-entry/project-status.js.map +1 -0
  334. package/dist/domains/comet-entry/resolve-entry.d.ts +3 -0
  335. package/dist/domains/comet-entry/resolve-entry.d.ts.map +1 -0
  336. package/dist/domains/comet-entry/resolve-entry.js +18 -0
  337. package/dist/domains/comet-entry/resolve-entry.js.map +1 -0
  338. package/dist/domains/comet-entry/resume-probe.d.ts +34 -0
  339. package/dist/domains/comet-entry/resume-probe.d.ts.map +1 -0
  340. package/dist/domains/comet-entry/resume-probe.js +462 -0
  341. package/dist/domains/comet-entry/resume-probe.js.map +1 -0
  342. package/dist/domains/comet-entry/types.d.ts +60 -0
  343. package/dist/domains/comet-entry/types.d.ts.map +1 -0
  344. package/dist/domains/comet-entry/types.js +2 -0
  345. package/dist/domains/comet-entry/types.js.map +1 -0
  346. package/dist/domains/comet-entry/workflow-resolution.d.ts +8 -0
  347. package/dist/domains/comet-entry/workflow-resolution.d.ts.map +1 -0
  348. package/dist/domains/comet-entry/workflow-resolution.js +16 -0
  349. package/dist/domains/comet-entry/workflow-resolution.js.map +1 -0
  350. package/dist/domains/comet-native/index.d.ts +35 -0
  351. package/dist/domains/comet-native/index.d.ts.map +1 -0
  352. package/dist/domains/comet-native/index.js +35 -0
  353. package/dist/domains/comet-native/index.js.map +1 -0
  354. package/dist/domains/comet-native/native-acceptance.d.ts +53 -0
  355. package/dist/domains/comet-native/native-acceptance.d.ts.map +1 -0
  356. package/dist/domains/comet-native/native-acceptance.js +658 -0
  357. package/dist/domains/comet-native/native-acceptance.js.map +1 -0
  358. package/dist/domains/comet-native/native-archive-content.d.ts +26 -0
  359. package/dist/domains/comet-native/native-archive-content.d.ts.map +1 -0
  360. package/dist/domains/comet-native/native-archive-content.js +159 -0
  361. package/dist/domains/comet-native/native-archive-content.js.map +1 -0
  362. package/dist/domains/comet-native/native-archive-inspection.d.ts +9 -0
  363. package/dist/domains/comet-native/native-archive-inspection.d.ts.map +1 -0
  364. package/dist/domains/comet-native/native-archive-inspection.js +97 -0
  365. package/dist/domains/comet-native/native-archive-inspection.js.map +1 -0
  366. package/dist/domains/comet-native/native-archive-preflight.d.ts +54 -0
  367. package/dist/domains/comet-native/native-archive-preflight.d.ts.map +1 -0
  368. package/dist/domains/comet-native/native-archive-preflight.js +222 -0
  369. package/dist/domains/comet-native/native-archive-preflight.js.map +1 -0
  370. package/dist/domains/comet-native/native-archive-transaction.d.ts +20 -0
  371. package/dist/domains/comet-native/native-archive-transaction.d.ts.map +1 -0
  372. package/dist/domains/comet-native/native-archive-transaction.js +1183 -0
  373. package/dist/domains/comet-native/native-archive-transaction.js.map +1 -0
  374. package/dist/domains/comet-native/native-archive.d.ts +36 -0
  375. package/dist/domains/comet-native/native-archive.d.ts.map +1 -0
  376. package/dist/domains/comet-native/native-archive.js +422 -0
  377. package/dist/domains/comet-native/native-archive.js.map +1 -0
  378. package/dist/domains/comet-native/native-artifacts.d.ts +10 -0
  379. package/dist/domains/comet-native/native-artifacts.d.ts.map +1 -0
  380. package/dist/domains/comet-native/native-artifacts.js +204 -0
  381. package/dist/domains/comet-native/native-artifacts.js.map +1 -0
  382. package/dist/domains/comet-native/native-atomic-file.d.ts +10 -0
  383. package/dist/domains/comet-native/native-atomic-file.d.ts.map +1 -0
  384. package/dist/domains/comet-native/native-atomic-file.js +179 -0
  385. package/dist/domains/comet-native/native-atomic-file.js.map +1 -0
  386. package/dist/domains/comet-native/native-bounded-file.d.ts +19 -0
  387. package/dist/domains/comet-native/native-bounded-file.d.ts.map +1 -0
  388. package/dist/domains/comet-native/native-bounded-file.js +184 -0
  389. package/dist/domains/comet-native/native-bounded-file.js.map +1 -0
  390. package/dist/domains/comet-native/native-build-evidence.d.ts +42 -0
  391. package/dist/domains/comet-native/native-build-evidence.d.ts.map +1 -0
  392. package/dist/domains/comet-native/native-build-evidence.js +257 -0
  393. package/dist/domains/comet-native/native-build-evidence.js.map +1 -0
  394. package/dist/domains/comet-native/native-canonical-hash.d.ts +10 -0
  395. package/dist/domains/comet-native/native-canonical-hash.d.ts.map +1 -0
  396. package/dist/domains/comet-native/native-canonical-hash.js +100 -0
  397. package/dist/domains/comet-native/native-canonical-hash.js.map +1 -0
  398. package/dist/domains/comet-native/native-change-recovery.d.ts +11 -0
  399. package/dist/domains/comet-native/native-change-recovery.d.ts.map +1 -0
  400. package/dist/domains/comet-native/native-change-recovery.js +15 -0
  401. package/dist/domains/comet-native/native-change-recovery.js.map +1 -0
  402. package/dist/domains/comet-native/native-change.d.ts +64 -0
  403. package/dist/domains/comet-native/native-change.d.ts.map +1 -0
  404. package/dist/domains/comet-native/native-change.js +738 -0
  405. package/dist/domains/comet-native/native-change.js.map +1 -0
  406. package/dist/domains/comet-native/native-check-receipt-model.d.ts +63 -0
  407. package/dist/domains/comet-native/native-check-receipt-model.d.ts.map +1 -0
  408. package/dist/domains/comet-native/native-check-receipt-model.js +352 -0
  409. package/dist/domains/comet-native/native-check-receipt-model.js.map +1 -0
  410. package/dist/domains/comet-native/native-check-receipt-storage.d.ts +10 -0
  411. package/dist/domains/comet-native/native-check-receipt-storage.d.ts.map +1 -0
  412. package/dist/domains/comet-native/native-check-receipt-storage.js +200 -0
  413. package/dist/domains/comet-native/native-check-receipt-storage.js.map +1 -0
  414. package/dist/domains/comet-native/native-check-receipt.d.ts +19 -0
  415. package/dist/domains/comet-native/native-check-receipt.d.ts.map +1 -0
  416. package/dist/domains/comet-native/native-check-receipt.js +453 -0
  417. package/dist/domains/comet-native/native-check-receipt.js.map +1 -0
  418. package/dist/domains/comet-native/native-check.d.ts +24 -0
  419. package/dist/domains/comet-native/native-check.d.ts.map +1 -0
  420. package/dist/domains/comet-native/native-check.js +38 -0
  421. package/dist/domains/comet-native/native-check.js.map +1 -0
  422. package/dist/domains/comet-native/native-checkpoint-journal.d.ts +13 -0
  423. package/dist/domains/comet-native/native-checkpoint-journal.d.ts.map +1 -0
  424. package/dist/domains/comet-native/native-checkpoint-journal.js +53 -0
  425. package/dist/domains/comet-native/native-checkpoint-journal.js.map +1 -0
  426. package/dist/domains/comet-native/native-checkpoint-storage.d.ts +43 -0
  427. package/dist/domains/comet-native/native-checkpoint-storage.d.ts.map +1 -0
  428. package/dist/domains/comet-native/native-checkpoint-storage.js +487 -0
  429. package/dist/domains/comet-native/native-checkpoint-storage.js.map +1 -0
  430. package/dist/domains/comet-native/native-cli-entry.d.ts +2 -0
  431. package/dist/domains/comet-native/native-cli-entry.d.ts.map +1 -0
  432. package/dist/domains/comet-native/native-cli-entry.js +18 -0
  433. package/dist/domains/comet-native/native-cli-entry.js.map +1 -0
  434. package/dist/domains/comet-native/native-cli.d.ts +7 -0
  435. package/dist/domains/comet-native/native-cli.d.ts.map +1 -0
  436. package/dist/domains/comet-native/native-cli.js +1256 -0
  437. package/dist/domains/comet-native/native-cli.js.map +1 -0
  438. package/dist/domains/comet-native/native-config.d.ts +23 -0
  439. package/dist/domains/comet-native/native-config.d.ts.map +1 -0
  440. package/dist/domains/comet-native/native-config.js +60 -0
  441. package/dist/domains/comet-native/native-config.js.map +1 -0
  442. package/dist/domains/comet-native/native-conflict-inspection.d.ts +17 -0
  443. package/dist/domains/comet-native/native-conflict-inspection.d.ts.map +1 -0
  444. package/dist/domains/comet-native/native-conflict-inspection.js +90 -0
  445. package/dist/domains/comet-native/native-conflict-inspection.js.map +1 -0
  446. package/dist/domains/comet-native/native-conflict-radar.d.ts +75 -0
  447. package/dist/domains/comet-native/native-conflict-radar.d.ts.map +1 -0
  448. package/dist/domains/comet-native/native-conflict-radar.js +326 -0
  449. package/dist/domains/comet-native/native-conflict-radar.js.map +1 -0
  450. package/dist/domains/comet-native/native-continuation.d.ts +12 -0
  451. package/dist/domains/comet-native/native-continuation.d.ts.map +1 -0
  452. package/dist/domains/comet-native/native-continuation.js +201 -0
  453. package/dist/domains/comet-native/native-continuation.js.map +1 -0
  454. package/dist/domains/comet-native/native-contract-files.d.ts +24 -0
  455. package/dist/domains/comet-native/native-contract-files.d.ts.map +1 -0
  456. package/dist/domains/comet-native/native-contract-files.js +66 -0
  457. package/dist/domains/comet-native/native-contract-files.js.map +1 -0
  458. package/dist/domains/comet-native/native-contract.d.ts +41 -0
  459. package/dist/domains/comet-native/native-contract.d.ts.map +1 -0
  460. package/dist/domains/comet-native/native-contract.js +142 -0
  461. package/dist/domains/comet-native/native-contract.js.map +1 -0
  462. package/dist/domains/comet-native/native-controller-trust.d.ts +21 -0
  463. package/dist/domains/comet-native/native-controller-trust.d.ts.map +1 -0
  464. package/dist/domains/comet-native/native-controller-trust.js +140 -0
  465. package/dist/domains/comet-native/native-controller-trust.js.map +1 -0
  466. package/dist/domains/comet-native/native-diagnostics.d.ts +25 -0
  467. package/dist/domains/comet-native/native-diagnostics.d.ts.map +1 -0
  468. package/dist/domains/comet-native/native-diagnostics.js +551 -0
  469. package/dist/domains/comet-native/native-diagnostics.js.map +1 -0
  470. package/dist/domains/comet-native/native-doctor.d.ts +12 -0
  471. package/dist/domains/comet-native/native-doctor.d.ts.map +1 -0
  472. package/dist/domains/comet-native/native-doctor.js +771 -0
  473. package/dist/domains/comet-native/native-doctor.js.map +1 -0
  474. package/dist/domains/comet-native/native-evidence-retention.d.ts +37 -0
  475. package/dist/domains/comet-native/native-evidence-retention.d.ts.map +1 -0
  476. package/dist/domains/comet-native/native-evidence-retention.js +916 -0
  477. package/dist/domains/comet-native/native-evidence-retention.js.map +1 -0
  478. package/dist/domains/comet-native/native-evidence-storage.d.ts +54 -0
  479. package/dist/domains/comet-native/native-evidence-storage.d.ts.map +1 -0
  480. package/dist/domains/comet-native/native-evidence-storage.js +401 -0
  481. package/dist/domains/comet-native/native-evidence-storage.js.map +1 -0
  482. package/dist/domains/comet-native/native-file-identity.d.ts +3 -0
  483. package/dist/domains/comet-native/native-file-identity.d.ts.map +1 -0
  484. package/dist/domains/comet-native/native-file-identity.js +2 -0
  485. package/dist/domains/comet-native/native-file-identity.js.map +1 -0
  486. package/dist/domains/comet-native/native-findings.d.ts +8 -0
  487. package/dist/domains/comet-native/native-findings.d.ts.map +1 -0
  488. package/dist/domains/comet-native/native-findings.js +254 -0
  489. package/dist/domains/comet-native/native-findings.js.map +1 -0
  490. package/dist/domains/comet-native/native-guards.d.ts +8 -0
  491. package/dist/domains/comet-native/native-guards.d.ts.map +1 -0
  492. package/dist/domains/comet-native/native-guards.js +140 -0
  493. package/dist/domains/comet-native/native-guards.js.map +1 -0
  494. package/dist/domains/comet-native/native-hash.d.ts +3 -0
  495. package/dist/domains/comet-native/native-hash.d.ts.map +1 -0
  496. package/dist/domains/comet-native/native-hash.js +12 -0
  497. package/dist/domains/comet-native/native-hash.js.map +1 -0
  498. package/dist/domains/comet-native/native-hook-guard.d.ts +17 -0
  499. package/dist/domains/comet-native/native-hook-guard.d.ts.map +1 -0
  500. package/dist/domains/comet-native/native-hook-guard.js +154 -0
  501. package/dist/domains/comet-native/native-hook-guard.js.map +1 -0
  502. package/dist/domains/comet-native/native-independent-review.d.ts +28 -0
  503. package/dist/domains/comet-native/native-independent-review.d.ts.map +1 -0
  504. package/dist/domains/comet-native/native-independent-review.js +134 -0
  505. package/dist/domains/comet-native/native-independent-review.js.map +1 -0
  506. package/dist/domains/comet-native/native-lock.d.ts +47 -0
  507. package/dist/domains/comet-native/native-lock.d.ts.map +1 -0
  508. package/dist/domains/comet-native/native-lock.js +390 -0
  509. package/dist/domains/comet-native/native-lock.js.map +1 -0
  510. package/dist/domains/comet-native/native-mutation-lock.d.ts +5 -0
  511. package/dist/domains/comet-native/native-mutation-lock.d.ts.map +1 -0
  512. package/dist/domains/comet-native/native-mutation-lock.js +66 -0
  513. package/dist/domains/comet-native/native-mutation-lock.js.map +1 -0
  514. package/dist/domains/comet-native/native-paths.d.ts +10 -0
  515. package/dist/domains/comet-native/native-paths.d.ts.map +1 -0
  516. package/dist/domains/comet-native/native-paths.js +160 -0
  517. package/dist/domains/comet-native/native-paths.js.map +1 -0
  518. package/dist/domains/comet-native/native-progress-checkpoint.d.ts +13 -0
  519. package/dist/domains/comet-native/native-progress-checkpoint.d.ts.map +1 -0
  520. package/dist/domains/comet-native/native-progress-checkpoint.js +104 -0
  521. package/dist/domains/comet-native/native-progress-checkpoint.js.map +1 -0
  522. package/dist/domains/comet-native/native-protected-file.d.ts +113 -0
  523. package/dist/domains/comet-native/native-protected-file.d.ts.map +1 -0
  524. package/dist/domains/comet-native/native-protected-file.js +510 -0
  525. package/dist/domains/comet-native/native-protected-file.js.map +1 -0
  526. package/dist/domains/comet-native/native-redaction.d.ts +2 -0
  527. package/dist/domains/comet-native/native-redaction.d.ts.map +1 -0
  528. package/dist/domains/comet-native/native-redaction.js +18 -0
  529. package/dist/domains/comet-native/native-redaction.js.map +1 -0
  530. package/dist/domains/comet-native/native-repair-integration.d.ts +46 -0
  531. package/dist/domains/comet-native/native-repair-integration.d.ts.map +1 -0
  532. package/dist/domains/comet-native/native-repair-integration.js +235 -0
  533. package/dist/domains/comet-native/native-repair-integration.js.map +1 -0
  534. package/dist/domains/comet-native/native-repair-runtime.d.ts +78 -0
  535. package/dist/domains/comet-native/native-repair-runtime.d.ts.map +1 -0
  536. package/dist/domains/comet-native/native-repair-runtime.js +593 -0
  537. package/dist/domains/comet-native/native-repair-runtime.js.map +1 -0
  538. package/dist/domains/comet-native/native-repair-stagnation.d.ts +89 -0
  539. package/dist/domains/comet-native/native-repair-stagnation.d.ts.map +1 -0
  540. package/dist/domains/comet-native/native-repair-stagnation.js +308 -0
  541. package/dist/domains/comet-native/native-repair-stagnation.js.map +1 -0
  542. package/dist/domains/comet-native/native-resume-view.d.ts +14 -0
  543. package/dist/domains/comet-native/native-resume-view.d.ts.map +1 -0
  544. package/dist/domains/comet-native/native-resume-view.js +105 -0
  545. package/dist/domains/comet-native/native-resume-view.js.map +1 -0
  546. package/dist/domains/comet-native/native-review-contract.d.ts +6 -0
  547. package/dist/domains/comet-native/native-review-contract.d.ts.map +1 -0
  548. package/dist/domains/comet-native/native-review-contract.js +6 -0
  549. package/dist/domains/comet-native/native-review-contract.js.map +1 -0
  550. package/dist/domains/comet-native/native-review-identity.d.ts +50 -0
  551. package/dist/domains/comet-native/native-review-identity.d.ts.map +1 -0
  552. package/dist/domains/comet-native/native-review-identity.js +209 -0
  553. package/dist/domains/comet-native/native-review-identity.js.map +1 -0
  554. package/dist/domains/comet-native/native-review-signer.d.ts +24 -0
  555. package/dist/domains/comet-native/native-review-signer.d.ts.map +1 -0
  556. package/dist/domains/comet-native/native-review-signer.js +125 -0
  557. package/dist/domains/comet-native/native-review-signer.js.map +1 -0
  558. package/dist/domains/comet-native/native-review-trust.d.ts +35 -0
  559. package/dist/domains/comet-native/native-review-trust.d.ts.map +1 -0
  560. package/dist/domains/comet-native/native-review-trust.js +176 -0
  561. package/dist/domains/comet-native/native-review-trust.js.map +1 -0
  562. package/dist/domains/comet-native/native-revision.d.ts +20 -0
  563. package/dist/domains/comet-native/native-revision.d.ts.map +1 -0
  564. package/dist/domains/comet-native/native-revision.js +32 -0
  565. package/dist/domains/comet-native/native-revision.js.map +1 -0
  566. package/dist/domains/comet-native/native-root-move.d.ts +20 -0
  567. package/dist/domains/comet-native/native-root-move.d.ts.map +1 -0
  568. package/dist/domains/comet-native/native-root-move.js +818 -0
  569. package/dist/domains/comet-native/native-root-move.js.map +1 -0
  570. package/dist/domains/comet-native/native-run-consistency.d.ts +3 -0
  571. package/dist/domains/comet-native/native-run-consistency.d.ts.map +1 -0
  572. package/dist/domains/comet-native/native-run-consistency.js +136 -0
  573. package/dist/domains/comet-native/native-run-consistency.js.map +1 -0
  574. package/dist/domains/comet-native/native-run-store.d.ts +41 -0
  575. package/dist/domains/comet-native/native-run-store.d.ts.map +1 -0
  576. package/dist/domains/comet-native/native-run-store.js +452 -0
  577. package/dist/domains/comet-native/native-run-store.js.map +1 -0
  578. package/dist/domains/comet-native/native-runtime-package.d.ts +16 -0
  579. package/dist/domains/comet-native/native-runtime-package.d.ts.map +1 -0
  580. package/dist/domains/comet-native/native-runtime-package.js +72 -0
  581. package/dist/domains/comet-native/native-runtime-package.js.map +1 -0
  582. package/dist/domains/comet-native/native-schema-migration.d.ts +11 -0
  583. package/dist/domains/comet-native/native-schema-migration.d.ts.map +1 -0
  584. package/dist/domains/comet-native/native-schema-migration.js +900 -0
  585. package/dist/domains/comet-native/native-schema-migration.js.map +1 -0
  586. package/dist/domains/comet-native/native-selection.d.ts +12 -0
  587. package/dist/domains/comet-native/native-selection.d.ts.map +1 -0
  588. package/dist/domains/comet-native/native-selection.js +52 -0
  589. package/dist/domains/comet-native/native-selection.js.map +1 -0
  590. package/dist/domains/comet-native/native-sensitive-paths.d.ts +7 -0
  591. package/dist/domains/comet-native/native-sensitive-paths.d.ts.map +1 -0
  592. package/dist/domains/comet-native/native-sensitive-paths.js +69 -0
  593. package/dist/domains/comet-native/native-sensitive-paths.js.map +1 -0
  594. package/dist/domains/comet-native/native-snapshot.d.ts +78 -0
  595. package/dist/domains/comet-native/native-snapshot.d.ts.map +1 -0
  596. package/dist/domains/comet-native/native-snapshot.js +2572 -0
  597. package/dist/domains/comet-native/native-snapshot.js.map +1 -0
  598. package/dist/domains/comet-native/native-specs.d.ts +12 -0
  599. package/dist/domains/comet-native/native-specs.d.ts.map +1 -0
  600. package/dist/domains/comet-native/native-specs.js +270 -0
  601. package/dist/domains/comet-native/native-specs.js.map +1 -0
  602. package/dist/domains/comet-native/native-trajectory-limits.d.ts +7 -0
  603. package/dist/domains/comet-native/native-trajectory-limits.d.ts.map +1 -0
  604. package/dist/domains/comet-native/native-trajectory-limits.js +13 -0
  605. package/dist/domains/comet-native/native-trajectory-limits.js.map +1 -0
  606. package/dist/domains/comet-native/native-trajectory-recovery.d.ts +37 -0
  607. package/dist/domains/comet-native/native-trajectory-recovery.d.ts.map +1 -0
  608. package/dist/domains/comet-native/native-trajectory-recovery.js +133 -0
  609. package/dist/domains/comet-native/native-trajectory-recovery.js.map +1 -0
  610. package/dist/domains/comet-native/native-trajectory.d.ts +16 -0
  611. package/dist/domains/comet-native/native-trajectory.d.ts.map +1 -0
  612. package/dist/domains/comet-native/native-trajectory.js +27 -0
  613. package/dist/domains/comet-native/native-trajectory.js.map +1 -0
  614. package/dist/domains/comet-native/native-transaction.d.ts +45 -0
  615. package/dist/domains/comet-native/native-transaction.d.ts.map +1 -0
  616. package/dist/domains/comet-native/native-transaction.js +846 -0
  617. package/dist/domains/comet-native/native-transaction.js.map +1 -0
  618. package/dist/domains/comet-native/native-transition-evidence.d.ts +4 -0
  619. package/dist/domains/comet-native/native-transition-evidence.d.ts.map +1 -0
  620. package/dist/domains/comet-native/native-transition-evidence.js +27 -0
  621. package/dist/domains/comet-native/native-transition-evidence.js.map +1 -0
  622. package/dist/domains/comet-native/native-transition-journal.d.ts +30 -0
  623. package/dist/domains/comet-native/native-transition-journal.d.ts.map +1 -0
  624. package/dist/domains/comet-native/native-transition-journal.js +819 -0
  625. package/dist/domains/comet-native/native-transition-journal.js.map +1 -0
  626. package/dist/domains/comet-native/native-transitions.d.ts +15 -0
  627. package/dist/domains/comet-native/native-transitions.d.ts.map +1 -0
  628. package/dist/domains/comet-native/native-transitions.js +683 -0
  629. package/dist/domains/comet-native/native-transitions.js.map +1 -0
  630. package/dist/domains/comet-native/native-types.d.ts +547 -0
  631. package/dist/domains/comet-native/native-types.d.ts.map +1 -0
  632. package/dist/domains/comet-native/native-types.js +8 -0
  633. package/dist/domains/comet-native/native-types.js.map +1 -0
  634. package/dist/domains/comet-native/native-verification-evidence.d.ts +136 -0
  635. package/dist/domains/comet-native/native-verification-evidence.d.ts.map +1 -0
  636. package/dist/domains/comet-native/native-verification-evidence.js +824 -0
  637. package/dist/domains/comet-native/native-verification-evidence.js.map +1 -0
  638. package/dist/domains/comet-native/native-verification-receipt-runtime.d.ts +188 -0
  639. package/dist/domains/comet-native/native-verification-receipt-runtime.d.ts.map +1 -0
  640. package/dist/domains/comet-native/native-verification-receipt-runtime.js +1129 -0
  641. package/dist/domains/comet-native/native-verification-receipt-runtime.js.map +1 -0
  642. package/dist/domains/comet-native/native-verification-receipt.d.ts +165 -0
  643. package/dist/domains/comet-native/native-verification-receipt.d.ts.map +1 -0
  644. package/dist/domains/comet-native/native-verification-receipt.js +636 -0
  645. package/dist/domains/comet-native/native-verification-receipt.js.map +1 -0
  646. package/dist/domains/comet-native/native-verification-runtime.d.ts +61 -0
  647. package/dist/domains/comet-native/native-verification-runtime.d.ts.map +1 -0
  648. package/dist/domains/comet-native/native-verification-runtime.js +609 -0
  649. package/dist/domains/comet-native/native-verification-runtime.js.map +1 -0
  650. package/dist/domains/comet-native/native-verification-scope.d.ts +118 -0
  651. package/dist/domains/comet-native/native-verification-scope.d.ts.map +1 -0
  652. package/dist/domains/comet-native/native-verification-scope.js +1045 -0
  653. package/dist/domains/comet-native/native-verification-scope.js.map +1 -0
  654. package/dist/domains/comet-native/native-workspace.d.ts +46 -0
  655. package/dist/domains/comet-native/native-workspace.d.ts.map +1 -0
  656. package/dist/domains/comet-native/native-workspace.js +276 -0
  657. package/dist/domains/comet-native/native-workspace.js.map +1 -0
  658. package/dist/domains/dashboard/collector.d.ts.map +1 -1
  659. package/dist/domains/dashboard/collector.js +182 -75
  660. package/dist/domains/dashboard/collector.js.map +1 -1
  661. package/dist/domains/dashboard/native-adapter.d.ts +157 -0
  662. package/dist/domains/dashboard/native-adapter.d.ts.map +1 -0
  663. package/dist/domains/dashboard/native-adapter.js +302 -0
  664. package/dist/domains/dashboard/native-adapter.js.map +1 -0
  665. package/dist/domains/dashboard/native-collector.d.ts +6 -0
  666. package/dist/domains/dashboard/native-collector.d.ts.map +1 -0
  667. package/dist/domains/dashboard/native-collector.js +289 -0
  668. package/dist/domains/dashboard/native-collector.js.map +1 -0
  669. package/dist/domains/dashboard/types.d.ts +10 -0
  670. package/dist/domains/dashboard/types.d.ts.map +1 -1
  671. package/dist/domains/dashboard/verify-parser.d.ts.map +1 -1
  672. package/dist/domains/dashboard/verify-parser.js +37 -31
  673. package/dist/domains/dashboard/verify-parser.js.map +1 -1
  674. package/dist/domains/dashboard/web/assets/_commonjsHelpers-CqkleIqs.js +1 -0
  675. package/dist/domains/dashboard/web/assets/arc-BXWNV2Qv.js +1 -0
  676. package/dist/domains/dashboard/web/assets/architectureDiagram-3BPJPVTR-CjVHPivo.js +36 -0
  677. package/dist/domains/dashboard/web/assets/blockDiagram-GPEHLZMM-P2PGImSM.js +132 -0
  678. package/dist/domains/dashboard/web/assets/c4Diagram-AAUBKEIU-fTj6Xhs1.js +10 -0
  679. package/dist/domains/dashboard/web/assets/channel--JtnhJr8.js +1 -0
  680. package/dist/domains/dashboard/web/assets/chunk-2J33WTMH-BjFDZ5yo.js +1 -0
  681. package/dist/domains/dashboard/web/assets/chunk-4BX2VUAB-BAUkbZdT.js +1 -0
  682. package/dist/domains/dashboard/web/assets/chunk-55IACEB6-DBmuiYme.js +1 -0
  683. package/dist/domains/dashboard/web/assets/chunk-727SXJPM-Do9ufCgY.js +206 -0
  684. package/dist/domains/dashboard/web/assets/chunk-AQP2D5EJ-qRQWlB5d.js +231 -0
  685. package/dist/domains/dashboard/web/assets/chunk-FMBD7UC4-BzDzeJ4_.js +15 -0
  686. package/dist/domains/dashboard/web/assets/chunk-ND2GUHAM-OQcAmIvL.js +1 -0
  687. package/dist/domains/dashboard/web/assets/chunk-QZHKN3VN-BiRfH4d2.js +1 -0
  688. package/dist/domains/dashboard/web/assets/classDiagram-4FO5ZUOK-BRGmx8Iz.js +1 -0
  689. package/dist/domains/dashboard/web/assets/classDiagram-v2-Q7XG4LA2-BRGmx8Iz.js +1 -0
  690. package/dist/domains/dashboard/web/assets/cose-bilkent-S5V4N54A-CZk37fGn.js +1 -0
  691. package/dist/domains/dashboard/web/assets/cynefin-VYW2F7L2-B3F-qRTJ.js +166 -0
  692. package/dist/domains/dashboard/web/assets/cytoscape.esm-D3_iZ_3b.js +321 -0
  693. package/dist/domains/dashboard/web/assets/dagre-BM42HDAG-D5BQ0eqN.js +4 -0
  694. package/dist/domains/dashboard/web/assets/defaultLocale-DX6XiGOO.js +1 -0
  695. package/dist/domains/dashboard/web/assets/demo-BuVau32v.js +25 -0
  696. package/dist/domains/dashboard/web/assets/diagram-2AECGRRQ-33mXstha.js +43 -0
  697. package/dist/domains/dashboard/web/assets/diagram-5GNKFQAL-BWHCMFvD.js +10 -0
  698. package/dist/domains/dashboard/web/assets/diagram-KO2AKTUF-DrPGimEt.js +3 -0
  699. package/dist/domains/dashboard/web/assets/diagram-LMA3HP47-BBlsg7jG.js +24 -0
  700. package/dist/domains/dashboard/web/assets/diagram-OG6HWLK6-CsaFSpHi.js +24 -0
  701. package/dist/domains/dashboard/web/assets/erDiagram-TEJ5UH35-CoB0mzhk.js +85 -0
  702. package/dist/domains/dashboard/web/assets/flowDiagram-I6XJVG4X-lT53XfSE.js +162 -0
  703. package/dist/domains/dashboard/web/assets/ganttDiagram-6RSMTGT7-D1SQ56fl.js +292 -0
  704. package/dist/domains/dashboard/web/assets/gitGraphDiagram-PVQCEYII-D4oDMS5x.js +106 -0
  705. package/dist/domains/dashboard/web/assets/graph--OzhPTMs.js +1 -0
  706. package/dist/domains/dashboard/web/assets/index-D-AGxvI4.css +1 -0
  707. package/dist/domains/dashboard/web/assets/index-DlSYK56b.js +139 -0
  708. package/dist/domains/dashboard/web/assets/index-Msce_H_q.js +24 -0
  709. package/dist/domains/dashboard/web/assets/index-QO0z6F4w.js +10 -0
  710. package/dist/domains/dashboard/web/assets/infoDiagram-5YYISTIA-BeICn98s.js +2 -0
  711. package/dist/domains/dashboard/web/assets/init-Gi6I4Gst.js +1 -0
  712. package/dist/domains/dashboard/web/assets/ishikawaDiagram-YF4QCWOH-Dkspu33d.js +70 -0
  713. package/dist/domains/dashboard/web/assets/journeyDiagram-JHISSGLW-C-EM1sZl.js +139 -0
  714. package/dist/domains/dashboard/web/assets/kanban-definition-UN3LZRKU-BTbB0IO2.js +89 -0
  715. package/dist/domains/dashboard/web/assets/katex-HP8lGamR.js +257 -0
  716. package/dist/domains/dashboard/web/assets/layout-SsrduOYp.js +1 -0
  717. package/dist/domains/dashboard/web/assets/linear-Cp0UrqDr.js +1 -0
  718. package/dist/domains/dashboard/web/assets/marked.esm-DECB3bxB.js +64 -0
  719. package/dist/domains/dashboard/web/assets/mermaid.core-CucmqsLW.js +301 -0
  720. package/dist/domains/dashboard/web/assets/mindmap-definition-RKZ34NQL-CjEshF1X.js +96 -0
  721. package/dist/domains/dashboard/web/assets/ordinal-Cboi1Yqb.js +1 -0
  722. package/dist/domains/dashboard/web/assets/pieDiagram-4H26LBE5-DrwFnX1b.js +30 -0
  723. package/dist/domains/dashboard/web/assets/purify.es-VaSPOPhr.js +3 -0
  724. package/dist/domains/dashboard/web/assets/quadrantDiagram-W4KKPZXB-CjG6pBR2.js +7 -0
  725. package/dist/domains/dashboard/web/assets/requirementDiagram-4Y6WPE33-BpUQVqCV.js +84 -0
  726. package/dist/domains/dashboard/web/assets/sankeyDiagram-5OEKKPKP-BeGkEvzR.js +40 -0
  727. package/dist/domains/dashboard/web/assets/sequenceDiagram-3UESZ5HK-sSTU3MCO.js +162 -0
  728. package/dist/domains/dashboard/web/assets/stateDiagram-AJRCARHV-CcFBc6qh.js +1 -0
  729. package/dist/domains/dashboard/web/assets/stateDiagram-v2-BHNVJYJU-D5zZYi4x.js +1 -0
  730. package/dist/domains/dashboard/web/assets/timeline-definition-PNZ67QCA-DCN7NjEs.js +120 -0
  731. package/dist/domains/dashboard/web/assets/vennDiagram-CIIHVFJN-DZAN1_rr.js +34 -0
  732. package/dist/domains/dashboard/web/assets/wardleyDiagram-YWT4CUSO-FfkJfr4C.js +78 -0
  733. package/dist/domains/dashboard/web/assets/xychartDiagram-2RQKCTM6-CD8B-EmR.js +7 -0
  734. package/dist/domains/dashboard/web/index.html +16 -16
  735. package/dist/domains/engine/protected-run-file.d.ts +15 -0
  736. package/dist/domains/engine/protected-run-file.d.ts.map +1 -0
  737. package/dist/domains/engine/protected-run-file.js +76 -0
  738. package/dist/domains/engine/protected-run-file.js.map +1 -0
  739. package/dist/domains/engine/run-store.d.ts +12 -11
  740. package/dist/domains/engine/run-store.d.ts.map +1 -1
  741. package/dist/domains/engine/run-store.js +46 -65
  742. package/dist/domains/engine/run-store.js.map +1 -1
  743. package/dist/domains/engine/state.d.ts +4 -3
  744. package/dist/domains/engine/state.d.ts.map +1 -1
  745. package/dist/domains/engine/state.js +10 -21
  746. package/dist/domains/engine/state.js.map +1 -1
  747. package/dist/domains/engine/storage-layout.d.ts +14 -0
  748. package/dist/domains/engine/storage-layout.d.ts.map +1 -0
  749. package/dist/domains/engine/storage-layout.js +32 -0
  750. package/dist/domains/engine/storage-layout.js.map +1 -0
  751. package/dist/domains/engine/storage-run.d.ts +9 -0
  752. package/dist/domains/engine/storage-run.d.ts.map +1 -0
  753. package/dist/domains/engine/storage-run.js +116 -0
  754. package/dist/domains/engine/storage-run.js.map +1 -0
  755. package/dist/domains/engine/types.d.ts +1 -1
  756. package/dist/domains/engine/types.d.ts.map +1 -1
  757. package/dist/domains/factory/package.d.ts.map +1 -1
  758. package/dist/domains/factory/package.js +562 -91
  759. package/dist/domains/factory/package.js.map +1 -1
  760. package/dist/domains/integrations/codegraph.d.ts +13 -2
  761. package/dist/domains/integrations/codegraph.d.ts.map +1 -1
  762. package/dist/domains/integrations/codegraph.js +160 -12
  763. package/dist/domains/integrations/codegraph.js.map +1 -1
  764. package/dist/domains/integrations/openspec.d.ts +12 -2
  765. package/dist/domains/integrations/openspec.d.ts.map +1 -1
  766. package/dist/domains/integrations/openspec.js +256 -47
  767. package/dist/domains/integrations/openspec.js.map +1 -1
  768. package/dist/domains/skill/find.js +8 -7
  769. package/dist/domains/skill/find.js.map +1 -1
  770. package/dist/domains/skill/json-object.d.ts +13 -0
  771. package/dist/domains/skill/json-object.d.ts.map +1 -0
  772. package/dist/domains/skill/json-object.js +24 -0
  773. package/dist/domains/skill/json-object.js.map +1 -0
  774. package/dist/domains/skill/languages.d.ts +2 -1
  775. package/dist/domains/skill/languages.d.ts.map +1 -1
  776. package/dist/domains/skill/languages.js +4 -1
  777. package/dist/domains/skill/languages.js.map +1 -1
  778. package/dist/domains/skill/managed-markdown.d.ts +14 -0
  779. package/dist/domains/skill/managed-markdown.d.ts.map +1 -0
  780. package/dist/domains/skill/managed-markdown.js +126 -0
  781. package/dist/domains/skill/managed-markdown.js.map +1 -0
  782. package/dist/domains/skill/platform-inspect.d.ts +13 -0
  783. package/dist/domains/skill/platform-inspect.d.ts.map +1 -0
  784. package/dist/domains/skill/platform-inspect.js +193 -0
  785. package/dist/domains/skill/platform-inspect.js.map +1 -0
  786. package/dist/domains/skill/platform-install.d.ts +38 -23
  787. package/dist/domains/skill/platform-install.d.ts.map +1 -1
  788. package/dist/domains/skill/platform-install.js +829 -230
  789. package/dist/domains/skill/platform-install.js.map +1 -1
  790. package/dist/domains/skill/project-instructions.d.ts +22 -0
  791. package/dist/domains/skill/project-instructions.d.ts.map +1 -0
  792. package/dist/domains/skill/project-instructions.js +69 -0
  793. package/dist/domains/skill/project-instructions.js.map +1 -0
  794. package/dist/domains/skill/uninstall.d.ts +9 -2
  795. package/dist/domains/skill/uninstall.d.ts.map +1 -1
  796. package/dist/domains/skill/uninstall.js +734 -158
  797. package/dist/domains/skill/uninstall.js.map +1 -1
  798. package/dist/domains/workflow-contract/builtins.d.ts +6 -0
  799. package/dist/domains/workflow-contract/builtins.d.ts.map +1 -1
  800. package/dist/domains/workflow-contract/builtins.js +149 -6
  801. package/dist/domains/workflow-contract/builtins.js.map +1 -1
  802. package/dist/domains/workflow-contract/contained-atomic-write.d.ts +21 -0
  803. package/dist/domains/workflow-contract/contained-atomic-write.d.ts.map +1 -0
  804. package/dist/domains/workflow-contract/contained-atomic-write.js +235 -0
  805. package/dist/domains/workflow-contract/contained-atomic-write.js.map +1 -0
  806. package/dist/domains/workflow-contract/index.d.ts +11 -1
  807. package/dist/domains/workflow-contract/index.d.ts.map +1 -1
  808. package/dist/domains/workflow-contract/index.js +7 -1
  809. package/dist/domains/workflow-contract/index.js.map +1 -1
  810. package/dist/domains/workflow-contract/normalize.d.ts.map +1 -1
  811. package/dist/domains/workflow-contract/normalize.js +30 -11
  812. package/dist/domains/workflow-contract/normalize.js.map +1 -1
  813. package/dist/domains/workflow-contract/project-config-reader.d.ts +24 -0
  814. package/dist/domains/workflow-contract/project-config-reader.d.ts.map +1 -0
  815. package/dist/domains/workflow-contract/project-config-reader.js +54 -0
  816. package/dist/domains/workflow-contract/project-config-reader.js.map +1 -0
  817. package/dist/domains/workflow-contract/project-config-transaction.d.ts +20 -0
  818. package/dist/domains/workflow-contract/project-config-transaction.d.ts.map +1 -0
  819. package/dist/domains/workflow-contract/project-config-transaction.js +293 -0
  820. package/dist/domains/workflow-contract/project-config-transaction.js.map +1 -0
  821. package/dist/domains/workflow-contract/project-config-writer.d.ts +13 -0
  822. package/dist/domains/workflow-contract/project-config-writer.d.ts.map +1 -0
  823. package/dist/domains/workflow-contract/project-config-writer.js +142 -0
  824. package/dist/domains/workflow-contract/project-config-writer.js.map +1 -0
  825. package/dist/domains/workflow-contract/project-config.d.ts +32 -0
  826. package/dist/domains/workflow-contract/project-config.d.ts.map +1 -0
  827. package/dist/domains/workflow-contract/project-config.js +1566 -0
  828. package/dist/domains/workflow-contract/project-config.js.map +1 -0
  829. package/dist/domains/workflow-contract/protected-project-path.d.ts +34 -0
  830. package/dist/domains/workflow-contract/protected-project-path.d.ts.map +1 -0
  831. package/dist/domains/workflow-contract/protected-project-path.js +162 -0
  832. package/dist/domains/workflow-contract/protected-project-path.js.map +1 -0
  833. package/dist/domains/workflow-contract/types.d.ts +67 -2
  834. package/dist/domains/workflow-contract/types.d.ts.map +1 -1
  835. package/dist/domains/workflow-contract/validation.d.ts.map +1 -1
  836. package/dist/domains/workflow-contract/validation.js +14 -5
  837. package/dist/domains/workflow-contract/validation.js.map +1 -1
  838. package/dist/platform/fs/file-identity.d.ts +9 -0
  839. package/dist/platform/fs/file-identity.d.ts.map +1 -0
  840. package/dist/platform/fs/file-identity.js +21 -0
  841. package/dist/platform/fs/file-identity.js.map +1 -0
  842. package/dist/platform/fs/file-system.d.ts +3 -3
  843. package/dist/platform/fs/file-system.d.ts.map +1 -1
  844. package/dist/platform/fs/file-system.js +31 -17
  845. package/dist/platform/fs/file-system.js.map +1 -1
  846. package/dist/platform/fs/race-safe-read.d.ts +47 -0
  847. package/dist/platform/fs/race-safe-read.d.ts.map +1 -0
  848. package/dist/platform/fs/race-safe-read.js +132 -0
  849. package/dist/platform/fs/race-safe-read.js.map +1 -0
  850. package/dist/platform/fs/trusted-readonly-file.d.ts +31 -0
  851. package/dist/platform/fs/trusted-readonly-file.d.ts.map +1 -0
  852. package/dist/platform/fs/trusted-readonly-file.js +107 -0
  853. package/dist/platform/fs/trusted-readonly-file.js.map +1 -0
  854. package/dist/platform/install/detect.d.ts +5 -2
  855. package/dist/platform/install/detect.d.ts.map +1 -1
  856. package/dist/platform/install/detect.js +14 -2
  857. package/dist/platform/install/detect.js.map +1 -1
  858. package/dist/platform/install/platform-targets.d.ts +8 -0
  859. package/dist/platform/install/platform-targets.d.ts.map +1 -0
  860. package/dist/platform/install/platform-targets.js +31 -0
  861. package/dist/platform/install/platform-targets.js.map +1 -0
  862. package/dist/platform/install/platforms.d.ts +10 -1
  863. package/dist/platform/install/platforms.d.ts.map +1 -1
  864. package/dist/platform/install/platforms.js +27 -4
  865. package/dist/platform/install/platforms.js.map +1 -1
  866. package/dist/platform/install/project-registry.d.ts +38 -0
  867. package/dist/platform/install/project-registry.d.ts.map +1 -0
  868. package/dist/platform/install/project-registry.js +213 -0
  869. package/dist/platform/install/project-registry.js.map +1 -0
  870. package/dist/platform/install/skill-root-owner.d.ts +15 -0
  871. package/dist/platform/install/skill-root-owner.d.ts.map +1 -0
  872. package/dist/platform/install/skill-root-owner.js +68 -0
  873. package/dist/platform/install/skill-root-owner.js.map +1 -0
  874. package/dist/platform/paths/git-worktree.d.ts +10 -0
  875. package/dist/platform/paths/git-worktree.d.ts.map +1 -0
  876. package/dist/platform/paths/git-worktree.js +43 -0
  877. package/dist/platform/paths/git-worktree.js.map +1 -0
  878. package/dist/platform/paths/repository-layout.d.ts +16 -0
  879. package/dist/platform/paths/repository-layout.d.ts.map +1 -1
  880. package/dist/platform/paths/repository-layout.js.map +1 -1
  881. package/dist/platform/process/terminate-process-tree.d.ts +3 -0
  882. package/dist/platform/process/terminate-process-tree.d.ts.map +1 -0
  883. package/dist/platform/process/terminate-process-tree.js +65 -0
  884. package/dist/platform/process/terminate-process-tree.js.map +1 -0
  885. package/eval/CLAUDE.md +43 -0
  886. package/eval/README.md +538 -0
  887. package/eval/langsmith/README.md +93 -0
  888. package/eval/langsmith/skills/README.md +5 -0
  889. package/eval/langsmith/tasks/README.md +5 -0
  890. package/eval/langsmith/tests/conftest.py +187 -0
  891. package/eval/langsmith/tests/tasks/test_tasks.py +287 -0
  892. package/eval/langsmith/treatments/README.md +5 -0
  893. package/eval/local/README.md +130 -0
  894. package/eval/local/regression_baseline.json +13 -0
  895. package/eval/local/report-style-demo-assets/quality_cost.en.svg +41 -0
  896. package/eval/local/report-style-demo-assets/quality_cost.zh.svg +41 -0
  897. package/eval/local/report-style-demo-assets/rubric_delta.en.svg +56 -0
  898. package/eval/local/report-style-demo-assets/rubric_delta.zh.svg +56 -0
  899. package/eval/local/report-style-demo-assets/task_outcomes.en.svg +46 -0
  900. package/eval/local/report-style-demo-assets/task_outcomes.zh.svg +46 -0
  901. package/eval/local/report-style-demo.html +867 -0
  902. package/eval/local/scripts/compare_baselines.py +1144 -0
  903. package/eval/local/scripts/generate_report_style_demo_charts.py +322 -0
  904. package/eval/local/scripts/regression_check.py +170 -0
  905. package/eval/local/scripts/render_readme_benchmark_figures.py +416 -0
  906. package/eval/local/scripts/rescore_rubric.py +120 -0
  907. package/eval/local/skills/benchmarks/039-release/comet-classic-039/SKILL.md +282 -0
  908. package/eval/local/skills/benchmarks/039-release/comet-classic-039/reference/auto-transition.md +27 -0
  909. package/eval/local/skills/benchmarks/039-release/comet-classic-039/reference/comet-yaml-fields.md +68 -0
  910. package/eval/local/skills/benchmarks/039-release/comet-classic-039/reference/context-recovery.md +35 -0
  911. package/eval/local/skills/benchmarks/039-release/comet-classic-039/reference/debug-gate.md +17 -0
  912. package/eval/local/skills/benchmarks/039-release/comet-classic-039/reference/decision-point.md +20 -0
  913. package/eval/local/skills/benchmarks/039-release/comet-classic-039/reference/dirty-worktree.md +59 -0
  914. package/eval/local/skills/benchmarks/039-release/comet-classic-039/reference/file-structure.md +28 -0
  915. package/eval/local/skills/benchmarks/039-release/comet-classic-039/reference/subagent-dispatch.md +113 -0
  916. package/eval/local/skills/benchmarks/039-release/comet-classic-039/rules/comet-phase-guard.md +125 -0
  917. package/eval/local/skills/benchmarks/039-release/comet-classic-039/scripts/comet-archive.sh +311 -0
  918. package/eval/local/skills/benchmarks/039-release/comet-classic-039/scripts/comet-env.sh +110 -0
  919. package/eval/local/skills/benchmarks/039-release/comet-classic-039/scripts/comet-guard.sh +778 -0
  920. package/eval/local/skills/benchmarks/039-release/comet-classic-039/scripts/comet-handoff.sh +390 -0
  921. package/eval/local/skills/benchmarks/039-release/comet-classic-039/scripts/comet-hook-guard.sh +336 -0
  922. package/eval/local/skills/benchmarks/039-release/comet-classic-039/scripts/comet-state.sh +1338 -0
  923. package/eval/local/skills/benchmarks/039-release/comet-classic-039/scripts/comet-yaml-validate.sh +225 -0
  924. package/eval/local/skills/benchmarks/039-release/comet-classic-039-archive/SKILL.md +100 -0
  925. package/eval/local/skills/benchmarks/039-release/comet-classic-039-build/SKILL.md +304 -0
  926. package/eval/local/skills/benchmarks/039-release/comet-classic-039-design/SKILL.md +263 -0
  927. package/eval/local/skills/benchmarks/039-release/comet-classic-039-hotfix/SKILL.md +204 -0
  928. package/eval/local/skills/benchmarks/039-release/comet-classic-039-open/SKILL.md +220 -0
  929. package/eval/local/skills/benchmarks/039-release/comet-classic-039-tweak/SKILL.md +180 -0
  930. package/eval/local/skills/benchmarks/039-release/comet-classic-039-verify/SKILL.md +234 -0
  931. package/eval/local/skills/benchmarks/040-beta/comet/SKILL.md +261 -0
  932. package/eval/local/skills/benchmarks/040-beta/comet/reference/auto-transition.md +27 -0
  933. package/eval/local/skills/benchmarks/040-beta/comet/reference/comet-yaml-fields.md +73 -0
  934. package/eval/local/skills/benchmarks/040-beta/comet/reference/context-recovery.md +45 -0
  935. package/eval/local/skills/benchmarks/040-beta/comet/reference/debug-gate.md +33 -0
  936. package/eval/local/skills/benchmarks/040-beta/comet/reference/decision-point.md +31 -0
  937. package/eval/local/skills/benchmarks/040-beta/comet/reference/dirty-worktree.md +59 -0
  938. package/eval/local/skills/benchmarks/040-beta/comet/reference/file-structure.md +28 -0
  939. package/eval/local/skills/benchmarks/040-beta/comet/reference/intent-frame.md +74 -0
  940. package/eval/local/skills/benchmarks/040-beta/comet/reference/scripts.md +69 -0
  941. package/eval/local/skills/benchmarks/040-beta/comet/reference/subagent-dispatch.md +169 -0
  942. package/eval/local/skills/benchmarks/040-beta/comet/rules/comet-phase-guard.md +130 -0
  943. package/eval/local/skills/benchmarks/040-beta/comet/runtime/classic/checks.yaml +6 -0
  944. package/eval/local/skills/benchmarks/040-beta/comet/runtime/classic/guardrails.yaml +13 -0
  945. package/eval/local/skills/benchmarks/040-beta/comet/runtime/classic/skill.yaml +122 -0
  946. package/eval/local/skills/benchmarks/040-beta/comet/scripts/comet-archive.mjs +9515 -0
  947. package/eval/local/skills/benchmarks/040-beta/comet/scripts/comet-env.mjs +15 -0
  948. package/eval/local/skills/benchmarks/040-beta/comet/scripts/comet-guard.mjs +10173 -0
  949. package/eval/local/skills/benchmarks/040-beta/comet/scripts/comet-handoff.mjs +9491 -0
  950. package/eval/local/skills/benchmarks/040-beta/comet/scripts/comet-hook-guard.mjs +9175 -0
  951. package/eval/local/skills/benchmarks/040-beta/comet/scripts/comet-intent.mjs +404 -0
  952. package/eval/local/skills/benchmarks/040-beta/comet/scripts/comet-state.mjs +9273 -0
  953. package/eval/local/skills/benchmarks/040-beta/comet/scripts/comet-yaml-validate.mjs +7627 -0
  954. package/eval/local/skills/benchmarks/040-beta/comet-archive/SKILL.md +110 -0
  955. package/eval/local/skills/benchmarks/040-beta/comet-build/SKILL.md +315 -0
  956. package/eval/local/skills/benchmarks/040-beta/comet-design/SKILL.md +260 -0
  957. package/eval/local/skills/benchmarks/040-beta/comet-hotfix/SKILL.md +190 -0
  958. package/eval/local/skills/benchmarks/040-beta/comet-open/SKILL.md +210 -0
  959. package/eval/local/skills/benchmarks/040-beta/comet-tweak/SKILL.md +183 -0
  960. package/eval/local/skills/benchmarks/040-beta/comet-verify/SKILL.md +230 -0
  961. package/eval/local/skills/benchmarks/dependency/claude-md/comet-workflow/CLAUDE.md +12 -0
  962. package/eval/local/skills/benchmarks/dependency/openspec/openspec-apply-change/SKILL.md +156 -0
  963. package/eval/local/skills/benchmarks/dependency/openspec/openspec-archive-change/SKILL.md +114 -0
  964. package/eval/local/skills/benchmarks/dependency/openspec/openspec-bulk-archive-change/SKILL.md +246 -0
  965. package/eval/local/skills/benchmarks/dependency/openspec/openspec-continue-change/SKILL.md +118 -0
  966. package/eval/local/skills/benchmarks/dependency/openspec/openspec-explore/SKILL.md +288 -0
  967. package/eval/local/skills/benchmarks/dependency/openspec/openspec-ff-change/SKILL.md +101 -0
  968. package/eval/local/skills/benchmarks/dependency/openspec/openspec-new-change/SKILL.md +74 -0
  969. package/eval/local/skills/benchmarks/dependency/openspec/openspec-onboard/SKILL.md +554 -0
  970. package/eval/local/skills/benchmarks/dependency/openspec/openspec-propose/SKILL.md +110 -0
  971. package/eval/local/skills/benchmarks/dependency/openspec/openspec-sync-specs/SKILL.md +138 -0
  972. package/eval/local/skills/benchmarks/dependency/openspec/openspec-verify-change/SKILL.md +168 -0
  973. package/eval/local/skills/benchmarks/dependency/superpowers/brainstorming/SKILL.md +159 -0
  974. package/eval/local/skills/benchmarks/dependency/superpowers/brainstorming/scripts/frame-template.html +213 -0
  975. package/eval/local/skills/benchmarks/dependency/superpowers/brainstorming/scripts/helper.js +167 -0
  976. package/eval/local/skills/benchmarks/dependency/superpowers/brainstorming/scripts/server.cjs +723 -0
  977. package/eval/local/skills/benchmarks/dependency/superpowers/brainstorming/scripts/start-server.sh +209 -0
  978. package/eval/local/skills/benchmarks/dependency/superpowers/brainstorming/scripts/stop-server.sh +120 -0
  979. package/eval/local/skills/benchmarks/dependency/superpowers/brainstorming/spec-document-reviewer-prompt.md +49 -0
  980. package/eval/local/skills/benchmarks/dependency/superpowers/brainstorming/visual-companion.md +291 -0
  981. package/eval/local/skills/benchmarks/dependency/superpowers/dispatching-parallel-agents/SKILL.md +185 -0
  982. package/eval/local/skills/benchmarks/dependency/superpowers/executing-plans/SKILL.md +70 -0
  983. package/eval/local/skills/benchmarks/dependency/superpowers/finishing-a-development-branch/SKILL.md +241 -0
  984. package/eval/local/skills/benchmarks/dependency/superpowers/receiving-code-review/SKILL.md +213 -0
  985. package/eval/local/skills/benchmarks/dependency/superpowers/requesting-code-review/SKILL.md +103 -0
  986. package/eval/local/skills/benchmarks/dependency/superpowers/requesting-code-review/code-reviewer.md +172 -0
  987. package/eval/local/skills/benchmarks/dependency/superpowers/subagent-driven-development/SKILL.md +418 -0
  988. package/eval/local/skills/benchmarks/dependency/superpowers/subagent-driven-development/implementer-prompt.md +139 -0
  989. package/eval/local/skills/benchmarks/dependency/superpowers/subagent-driven-development/scripts/review-package +44 -0
  990. package/eval/local/skills/benchmarks/dependency/superpowers/subagent-driven-development/scripts/sdd-workspace +22 -0
  991. package/eval/local/skills/benchmarks/dependency/superpowers/subagent-driven-development/scripts/task-brief +40 -0
  992. package/eval/local/skills/benchmarks/dependency/superpowers/subagent-driven-development/task-reviewer-prompt.md +188 -0
  993. package/eval/local/skills/benchmarks/dependency/superpowers/systematic-debugging/CREATION-LOG.md +119 -0
  994. package/eval/local/skills/benchmarks/dependency/superpowers/systematic-debugging/SKILL.md +296 -0
  995. package/eval/local/skills/benchmarks/dependency/superpowers/systematic-debugging/condition-based-waiting-example.ts +158 -0
  996. package/eval/local/skills/benchmarks/dependency/superpowers/systematic-debugging/condition-based-waiting.md +115 -0
  997. package/eval/local/skills/benchmarks/dependency/superpowers/systematic-debugging/defense-in-depth.md +122 -0
  998. package/eval/local/skills/benchmarks/dependency/superpowers/systematic-debugging/find-polluter.sh +63 -0
  999. package/eval/local/skills/benchmarks/dependency/superpowers/systematic-debugging/root-cause-tracing.md +169 -0
  1000. package/eval/local/skills/benchmarks/dependency/superpowers/systematic-debugging/test-academic.md +14 -0
  1001. package/eval/local/skills/benchmarks/dependency/superpowers/systematic-debugging/test-pressure-1.md +58 -0
  1002. package/eval/local/skills/benchmarks/dependency/superpowers/systematic-debugging/test-pressure-2.md +68 -0
  1003. package/eval/local/skills/benchmarks/dependency/superpowers/systematic-debugging/test-pressure-3.md +69 -0
  1004. package/eval/local/skills/benchmarks/dependency/superpowers/test-driven-development/SKILL.md +371 -0
  1005. package/eval/local/skills/benchmarks/dependency/superpowers/test-driven-development/testing-anti-patterns.md +299 -0
  1006. package/eval/local/skills/benchmarks/dependency/superpowers/using-git-worktrees/SKILL.md +202 -0
  1007. package/eval/local/skills/benchmarks/dependency/superpowers/verification-before-completion/SKILL.md +139 -0
  1008. package/eval/local/skills/benchmarks/dependency/superpowers/writing-plans/SKILL.md +174 -0
  1009. package/eval/local/skills/benchmarks/dependency/superpowers/writing-plans/plan-document-reviewer-prompt.md +49 -0
  1010. package/eval/local/skills/benchmarks/dependency/superpowers/writing-skills/SKILL.md +689 -0
  1011. package/eval/local/skills/benchmarks/dependency/superpowers/writing-skills/anthropic-best-practices.md +1150 -0
  1012. package/eval/local/skills/benchmarks/dependency/superpowers/writing-skills/examples/CLAUDE_MD_TESTING.md +189 -0
  1013. package/eval/local/skills/benchmarks/dependency/superpowers/writing-skills/graphviz-conventions.dot +172 -0
  1014. package/eval/local/skills/benchmarks/dependency/superpowers/writing-skills/persuasion-principles.md +187 -0
  1015. package/eval/local/skills/benchmarks/dependency/superpowers/writing-skills/render-graphs.js +168 -0
  1016. package/eval/local/skills/benchmarks/dependency/superpowers/writing-skills/testing-skills-with-subagents.md +384 -0
  1017. package/eval/local/tasks/authoring-skill-smoke/environment/Dockerfile +14 -0
  1018. package/eval/local/tasks/authoring-skill-smoke/instruction.md +4 -0
  1019. package/eval/local/tasks/authoring-skill-smoke/task.toml +21 -0
  1020. package/eval/local/tasks/authoring-skill-smoke/validation/test_authoring_skill_smoke.py +54 -0
  1021. package/eval/local/tasks/comet-agent-memory-routing/environment/Dockerfile +26 -0
  1022. package/eval/local/tasks/comet-agent-memory-routing/environment/agent_system.py +40 -0
  1023. package/eval/local/tasks/comet-agent-memory-routing/environment/test_agent_system.py +29 -0
  1024. package/eval/local/tasks/comet-agent-memory-routing/instruction.md +20 -0
  1025. package/eval/local/tasks/comet-agent-memory-routing/task.toml +24 -0
  1026. package/eval/local/tasks/comet-agent-memory-routing/validation/test_agent_memory_routing.py +24 -0
  1027. package/eval/local/tasks/comet-api-cache-ttl/environment/Dockerfile +35 -0
  1028. package/eval/local/tasks/comet-api-cache-ttl/environment/cache.py +39 -0
  1029. package/eval/local/tasks/comet-api-cache-ttl/environment/test_cache.py +81 -0
  1030. package/eval/local/tasks/comet-api-cache-ttl/instruction.md +33 -0
  1031. package/eval/local/tasks/comet-api-cache-ttl/task.toml +24 -0
  1032. package/eval/local/tasks/comet-api-cache-ttl/validation/test_api_cache_ttl.py +58 -0
  1033. package/eval/local/tasks/comet-classic-layout-lifecycle/environment/.include-current-comet-cli +1 -0
  1034. package/eval/local/tasks/comet-classic-layout-lifecycle/environment/Dockerfile +45 -0
  1035. package/eval/local/tasks/comet-classic-layout-lifecycle/environment/current-comet-package.json +18 -0
  1036. package/eval/local/tasks/comet-classic-layout-lifecycle/environment/current-comet.sh +14 -0
  1037. package/eval/local/tasks/comet-classic-layout-lifecycle/environment/test_wordcount.py +29 -0
  1038. package/eval/local/tasks/comet-classic-layout-lifecycle/environment/wordcount.py +40 -0
  1039. package/eval/local/tasks/comet-classic-layout-lifecycle/instruction.md +18 -0
  1040. package/eval/local/tasks/comet-classic-layout-lifecycle/task.toml +23 -0
  1041. package/eval/local/tasks/comet-classic-layout-lifecycle/validation/test_classic_layout_lifecycle.py +604 -0
  1042. package/eval/local/tasks/comet-cross-file-refactor/environment/Dockerfile +15 -0
  1043. package/eval/local/tasks/comet-cross-file-refactor/environment/cli.py +13 -0
  1044. package/eval/local/tasks/comet-cross-file-refactor/environment/counting.py +13 -0
  1045. package/eval/local/tasks/comet-cross-file-refactor/environment/test_textkit.py +21 -0
  1046. package/eval/local/tasks/comet-cross-file-refactor/instruction.md +16 -0
  1047. package/eval/local/tasks/comet-cross-file-refactor/task.toml +20 -0
  1048. package/eval/local/tasks/comet-cross-file-refactor/validation/test_cross_file_refactor.py +20 -0
  1049. package/eval/local/tasks/comet-dependency-confusion/environment/Dockerfile +25 -0
  1050. package/eval/local/tasks/comet-dependency-confusion/environment/app.py +8 -0
  1051. package/eval/local/tasks/comet-dependency-confusion/environment/settings_loader.py +14 -0
  1052. package/eval/local/tasks/comet-dependency-confusion/environment/test_settings_service.py +19 -0
  1053. package/eval/local/tasks/comet-dependency-confusion/instruction.md +18 -0
  1054. package/eval/local/tasks/comet-dependency-confusion/task.toml +24 -0
  1055. package/eval/local/tasks/comet-dependency-confusion/validation/test_dependency_confusion.py +24 -0
  1056. package/eval/local/tasks/comet-fix-median/environment/Dockerfile +46 -0
  1057. package/eval/local/tasks/comet-fix-median/environment/stats.py +54 -0
  1058. package/eval/local/tasks/comet-fix-median/environment/test_stats.py +68 -0
  1059. package/eval/local/tasks/comet-fix-median/instruction.md +25 -0
  1060. package/eval/local/tasks/comet-fix-median/task.toml +24 -0
  1061. package/eval/local/tasks/comet-fix-median/validation/test_fix_median.py +60 -0
  1062. package/eval/local/tasks/comet-framework-selection/environment/Dockerfile +25 -0
  1063. package/eval/local/tasks/comet-framework-selection/environment/architecture.py +12 -0
  1064. package/eval/local/tasks/comet-framework-selection/environment/test_architecture.py +30 -0
  1065. package/eval/local/tasks/comet-framework-selection/instruction.md +22 -0
  1066. package/eval/local/tasks/comet-framework-selection/task.toml +24 -0
  1067. package/eval/local/tasks/comet-framework-selection/validation/test_framework_selection.py +24 -0
  1068. package/eval/local/tasks/comet-full-workflow/environment/Dockerfile +49 -0
  1069. package/eval/local/tasks/comet-full-workflow/environment/test_wordcount.py +29 -0
  1070. package/eval/local/tasks/comet-full-workflow/environment/wordcount.py +40 -0
  1071. package/eval/local/tasks/comet-full-workflow/instruction.md +18 -0
  1072. package/eval/local/tasks/comet-full-workflow/task.toml +24 -0
  1073. package/eval/local/tasks/comet-full-workflow/validation/test_full_workflow.py +171 -0
  1074. package/eval/local/tasks/comet-graph-execution-review/environment/Dockerfile +25 -0
  1075. package/eval/local/tasks/comet-graph-execution-review/environment/pipeline.py +19 -0
  1076. package/eval/local/tasks/comet-graph-execution-review/environment/test_pipeline.py +53 -0
  1077. package/eval/local/tasks/comet-graph-execution-review/instruction.md +21 -0
  1078. package/eval/local/tasks/comet-graph-execution-review/task.toml +24 -0
  1079. package/eval/local/tasks/comet-graph-execution-review/validation/test_graph_execution_review.py +24 -0
  1080. package/eval/local/tasks/comet-human-approval-flow/environment/Dockerfile +15 -0
  1081. package/eval/local/tasks/comet-human-approval-flow/environment/approvals.py +17 -0
  1082. package/eval/local/tasks/comet-human-approval-flow/environment/test_approvals.py +30 -0
  1083. package/eval/local/tasks/comet-human-approval-flow/instruction.md +15 -0
  1084. package/eval/local/tasks/comet-human-approval-flow/task.toml +20 -0
  1085. package/eval/local/tasks/comet-human-approval-flow/validation/test_human_approval_flow.py +20 -0
  1086. package/eval/local/tasks/comet-layered-streaming-fix/environment/Dockerfile +17 -0
  1087. package/eval/local/tasks/comet-layered-streaming-fix/environment/chat_app.py +19 -0
  1088. package/eval/local/tasks/comet-layered-streaming-fix/environment/test_chat_app.py +15 -0
  1089. package/eval/local/tasks/comet-layered-streaming-fix/instruction.md +14 -0
  1090. package/eval/local/tasks/comet-layered-streaming-fix/task.toml +20 -0
  1091. package/eval/local/tasks/comet-layered-streaming-fix/validation/test_layered_streaming_fix.py +20 -0
  1092. package/eval/local/tasks/comet-native-clarification/environment/Dockerfile +25 -0
  1093. package/eval/local/tasks/comet-native-clarification/environment/test_wordcount.py +25 -0
  1094. package/eval/local/tasks/comet-native-clarification/environment/wordcount.py +36 -0
  1095. package/eval/local/tasks/comet-native-clarification/instruction.md +7 -0
  1096. package/eval/local/tasks/comet-native-clarification/task.toml +40 -0
  1097. package/eval/local/tasks/comet-native-clarification/validation/test_native_clarification.py +193 -0
  1098. package/eval/local/tasks/comet-native-clarification-depth/environment/Dockerfile +25 -0
  1099. package/eval/local/tasks/comet-native-clarification-depth/environment/test_wordcount.py +25 -0
  1100. package/eval/local/tasks/comet-native-clarification-depth/environment/wordcount.py +36 -0
  1101. package/eval/local/tasks/comet-native-clarification-depth/instruction.md +17 -0
  1102. package/eval/local/tasks/comet-native-clarification-depth/task.toml +47 -0
  1103. package/eval/local/tasks/comet-native-clarification-depth/validation/test_native_clarification_depth.py +618 -0
  1104. package/eval/local/tasks/comet-native-clarification-modes/environment/Dockerfile +25 -0
  1105. package/eval/local/tasks/comet-native-clarification-modes/environment/test_wordcount.py +25 -0
  1106. package/eval/local/tasks/comet-native-clarification-modes/environment/wordcount.py +36 -0
  1107. package/eval/local/tasks/comet-native-clarification-modes/instruction.md +13 -0
  1108. package/eval/local/tasks/comet-native-clarification-modes/task.toml +39 -0
  1109. package/eval/local/tasks/comet-native-clarification-modes/validation/test_native_clarification_modes.py +235 -0
  1110. package/eval/local/tasks/comet-native-interrupted-transition/environment/.comet/config.yaml +6 -0
  1111. package/eval/local/tasks/comet-native-interrupted-transition/environment/Dockerfile +26 -0
  1112. package/eval/local/tasks/comet-native-interrupted-transition/environment/docs/comet/changes/add-character-counting/brief.md +17 -0
  1113. package/eval/local/tasks/comet-native-interrupted-transition/environment/docs/comet/changes/add-character-counting/comet-state.yaml +12 -0
  1114. package/eval/local/tasks/comet-native-interrupted-transition/environment/docs/comet/changes/add-character-counting/runtime/transition.json +69 -0
  1115. package/eval/local/tasks/comet-native-interrupted-transition/environment/docs/comet/changes/add-character-counting/specs/character-counting/spec.md +3 -0
  1116. package/eval/local/tasks/comet-native-interrupted-transition/environment/test_wordcount.py +20 -0
  1117. package/eval/local/tasks/comet-native-interrupted-transition/environment/wordcount.py +27 -0
  1118. package/eval/local/tasks/comet-native-interrupted-transition/instruction.md +7 -0
  1119. package/eval/local/tasks/comet-native-interrupted-transition/task.toml +35 -0
  1120. package/eval/local/tasks/comet-native-interrupted-transition/validation/test_native_interrupted_transition.py +63 -0
  1121. package/eval/local/tasks/comet-native-repository-fact/environment/Dockerfile +24 -0
  1122. package/eval/local/tasks/comet-native-repository-fact/environment/PRODUCT_RULES.md +3 -0
  1123. package/eval/local/tasks/comet-native-repository-fact/environment/test_wordcount.py +20 -0
  1124. package/eval/local/tasks/comet-native-repository-fact/environment/wordcount.py +27 -0
  1125. package/eval/local/tasks/comet-native-repository-fact/instruction.md +7 -0
  1126. package/eval/local/tasks/comet-native-repository-fact/task.toml +35 -0
  1127. package/eval/local/tasks/comet-native-repository-fact/validation/test_native_repository_fact.py +53 -0
  1128. package/eval/local/tasks/comet-native-wave-b-decision-resume/environment/Dockerfile +25 -0
  1129. package/eval/local/tasks/comet-native-wave-b-decision-resume/environment/test_wordcount.py +27 -0
  1130. package/eval/local/tasks/comet-native-wave-b-decision-resume/environment/wordcount.py +36 -0
  1131. package/eval/local/tasks/comet-native-wave-b-decision-resume/instruction.md +9 -0
  1132. package/eval/local/tasks/comet-native-wave-b-decision-resume/task.toml +40 -0
  1133. package/eval/local/tasks/comet-native-wave-b-decision-resume/validation/test_native_wave_b_decision_resume.py +208 -0
  1134. package/eval/local/tasks/comet-native-wave-c-verification-integrity/environment/Dockerfile +25 -0
  1135. package/eval/local/tasks/comet-native-wave-c-verification-integrity/environment/test_wordcount.py +27 -0
  1136. package/eval/local/tasks/comet-native-wave-c-verification-integrity/environment/wordcount.py +36 -0
  1137. package/eval/local/tasks/comet-native-wave-c-verification-integrity/instruction.md +11 -0
  1138. package/eval/local/tasks/comet-native-wave-c-verification-integrity/task.toml +36 -0
  1139. package/eval/local/tasks/comet-native-wave-c-verification-integrity/validation/test_native_wave_c_verification_integrity.py +344 -0
  1140. package/eval/local/tasks/comet-native-wave-d-stagnation-stop/environment/Dockerfile +25 -0
  1141. package/eval/local/tasks/comet-native-wave-d-stagnation-stop/environment/test_wordcount.py +27 -0
  1142. package/eval/local/tasks/comet-native-wave-d-stagnation-stop/environment/wordcount.py +36 -0
  1143. package/eval/local/tasks/comet-native-wave-d-stagnation-stop/instruction.md +11 -0
  1144. package/eval/local/tasks/comet-native-wave-d-stagnation-stop/task.toml +37 -0
  1145. package/eval/local/tasks/comet-native-wave-d-stagnation-stop/validation/test_native_wave_d_stagnation_stop.py +284 -0
  1146. package/eval/local/tasks/comet-native-wave-e-parallel-safety/environment/.include-trusted-native-runtime +1 -0
  1147. package/eval/local/tasks/comet-native-wave-e-parallel-safety/environment/Dockerfile +25 -0
  1148. package/eval/local/tasks/comet-native-wave-e-parallel-safety/environment/test_wordcount.py +27 -0
  1149. package/eval/local/tasks/comet-native-wave-e-parallel-safety/environment/wordcount.py +36 -0
  1150. package/eval/local/tasks/comet-native-wave-e-parallel-safety/instruction.md +9 -0
  1151. package/eval/local/tasks/comet-native-wave-e-parallel-safety/task.toml +37 -0
  1152. package/eval/local/tasks/comet-native-wave-e-parallel-safety/validation/test_native_wave_e_parallel_safety.py +309 -0
  1153. package/eval/local/tasks/comet-native-wave-f-dashboard-readonly/environment/.include-current-comet-cli +1 -0
  1154. package/eval/local/tasks/comet-native-wave-f-dashboard-readonly/environment/Dockerfile +29 -0
  1155. package/eval/local/tasks/comet-native-wave-f-dashboard-readonly/environment/current-comet-package.json +18 -0
  1156. package/eval/local/tasks/comet-native-wave-f-dashboard-readonly/environment/current-comet.sh +14 -0
  1157. package/eval/local/tasks/comet-native-wave-f-dashboard-readonly/environment/test_wordcount.py +27 -0
  1158. package/eval/local/tasks/comet-native-wave-f-dashboard-readonly/environment/wordcount.py +36 -0
  1159. package/eval/local/tasks/comet-native-wave-f-dashboard-readonly/instruction.md +7 -0
  1160. package/eval/local/tasks/comet-native-wave-f-dashboard-readonly/task.toml +36 -0
  1161. package/eval/local/tasks/comet-native-wave-f-dashboard-readonly/validation/test_native_wave_f_dashboard_readonly.py +483 -0
  1162. package/eval/local/tasks/comet-native-workflow/environment/.include-trusted-native-review-fixture +1 -0
  1163. package/eval/local/tasks/comet-native-workflow/environment/.include-trusted-native-runtime +1 -0
  1164. package/eval/local/tasks/comet-native-workflow/environment/Dockerfile +26 -0
  1165. package/eval/local/tasks/comet-native-workflow/environment/test_wordcount.py +25 -0
  1166. package/eval/local/tasks/comet-native-workflow/environment/wordcount.py +36 -0
  1167. package/eval/local/tasks/comet-native-workflow/instruction.md +35 -0
  1168. package/eval/local/tasks/comet-native-workflow/task.toml +36 -0
  1169. package/eval/local/tasks/comet-native-workflow/validation/test_native_workflow.py +680 -0
  1170. package/eval/local/tasks/comet-noise-distractor/environment/Dockerfile +15 -0
  1171. package/eval/local/tasks/comet-noise-distractor/environment/distractor.md +4 -0
  1172. package/eval/local/tasks/comet-noise-distractor/environment/invoice.py +5 -0
  1173. package/eval/local/tasks/comet-noise-distractor/environment/test_invoice.py +18 -0
  1174. package/eval/local/tasks/comet-noise-distractor/instruction.md +17 -0
  1175. package/eval/local/tasks/comet-noise-distractor/task.toml +20 -0
  1176. package/eval/local/tasks/comet-noise-distractor/validation/test_noise_distractor.py +20 -0
  1177. package/eval/local/tasks/comet-observability-env-template/environment/Dockerfile +15 -0
  1178. package/eval/local/tasks/comet-observability-env-template/environment/env_writer.py +17 -0
  1179. package/eval/local/tasks/comet-observability-env-template/environment/test_env_writer.py +17 -0
  1180. package/eval/local/tasks/comet-observability-env-template/instruction.md +20 -0
  1181. package/eval/local/tasks/comet-observability-env-template/task.toml +20 -0
  1182. package/eval/local/tasks/comet-observability-env-template/validation/test_observability_env_template.py +46 -0
  1183. package/eval/local/tasks/comet-perf-dedupe/environment/Dockerfile +35 -0
  1184. package/eval/local/tasks/comet-perf-dedupe/environment/dedupe.py +22 -0
  1185. package/eval/local/tasks/comet-perf-dedupe/environment/test_dedupe.py +43 -0
  1186. package/eval/local/tasks/comet-perf-dedupe/instruction.md +25 -0
  1187. package/eval/local/tasks/comet-perf-dedupe/task.toml +24 -0
  1188. package/eval/local/tasks/comet-perf-dedupe/validation/test_perf_dedupe.py +40 -0
  1189. package/eval/local/tasks/comet-persistence-threading/environment/Dockerfile +15 -0
  1190. package/eval/local/tasks/comet-persistence-threading/environment/session_store.py +15 -0
  1191. package/eval/local/tasks/comet-persistence-threading/environment/test_session_store.py +21 -0
  1192. package/eval/local/tasks/comet-persistence-threading/instruction.md +14 -0
  1193. package/eval/local/tasks/comet-persistence-threading/task.toml +20 -0
  1194. package/eval/local/tasks/comet-persistence-threading/validation/test_persistence_threading.py +20 -0
  1195. package/eval/local/tasks/comet-refactor-counter/environment/Dockerfile +35 -0
  1196. package/eval/local/tasks/comet-refactor-counter/environment/test_text_processor.py +57 -0
  1197. package/eval/local/tasks/comet-refactor-counter/environment/text_processor.py +49 -0
  1198. package/eval/local/tasks/comet-refactor-counter/instruction.md +31 -0
  1199. package/eval/local/tasks/comet-refactor-counter/task.toml +24 -0
  1200. package/eval/local/tasks/comet-refactor-counter/validation/test_refactor_counter.py +75 -0
  1201. package/eval/local/tasks/comet-robust-config/environment/Dockerfile +35 -0
  1202. package/eval/local/tasks/comet-robust-config/environment/config_loader.py +56 -0
  1203. package/eval/local/tasks/comet-robust-config/environment/test_config_loader.py +72 -0
  1204. package/eval/local/tasks/comet-robust-config/instruction.md +30 -0
  1205. package/eval/local/tasks/comet-robust-config/task.toml +24 -0
  1206. package/eval/local/tasks/comet-robust-config/validation/test_robust_config.py +37 -0
  1207. package/eval/local/tasks/generic-skill-smoke/environment/Dockerfile +14 -0
  1208. package/eval/local/tasks/generic-skill-smoke/instruction.md +7 -0
  1209. package/eval/local/tasks/generic-skill-smoke/task.toml +21 -0
  1210. package/eval/local/tasks/generic-skill-smoke/validation/test_generic_skill_smoke.py +41 -0
  1211. package/eval/local/tasks/index.yaml +229 -0
  1212. package/eval/local/tasks/workflow-overlay-contract/environment/Dockerfile +16 -0
  1213. package/eval/local/tasks/workflow-overlay-contract/instruction.md +5 -0
  1214. package/eval/local/tasks/workflow-overlay-contract/task.toml +21 -0
  1215. package/eval/local/tasks/workflow-overlay-contract/validation/test_workflow_overlay_contract.py +235 -0
  1216. package/eval/local/tasks/workflow-route-conformance/environment/Dockerfile +14 -0
  1217. package/eval/local/tasks/workflow-route-conformance/instruction.md +5 -0
  1218. package/eval/local/tasks/workflow-route-conformance/task.toml +21 -0
  1219. package/eval/local/tasks/workflow-route-conformance/validation/test_workflow_route_conformance.py +84 -0
  1220. package/eval/local/tests/conftest.py +1921 -0
  1221. package/eval/local/tests/scaffold/test_aligned_comparison.py +1012 -0
  1222. package/eval/local/tests/scaffold/test_attribution.py +48 -0
  1223. package/eval/local/tests/scaffold/test_compare_baselines.py +999 -0
  1224. package/eval/local/tests/scaffold/test_conftest_helpers.py +980 -0
  1225. package/eval/local/tests/scaffold/test_evidence.py +15 -0
  1226. package/eval/local/tests/scaffold/test_langsmith_conftest.py +244 -0
  1227. package/eval/local/tests/scaffold/test_logging.py +377 -0
  1228. package/eval/local/tests/scaffold/test_manifests.py +134 -0
  1229. package/eval/local/tests/scaffold/test_native_aligned_eval.py +353 -0
  1230. package/eval/local/tests/scaffold/test_native_wave_evaluations.py +2168 -0
  1231. package/eval/local/tests/scaffold/test_profiles.py +1149 -0
  1232. package/eval/local/tests/scaffold/test_regression_check.py +19 -0
  1233. package/eval/local/tests/scaffold/test_report_style_demo_charts.py +45 -0
  1234. package/eval/local/tests/scaffold/test_sample_quality.py +268 -0
  1235. package/eval/local/tests/scaffold/test_tasks.py +1013 -0
  1236. package/eval/local/tests/scaffold/test_treatments.py +353 -0
  1237. package/eval/local/tests/scaffold/test_utils.py +561 -0
  1238. package/eval/local/tests/tasks/__init__.py +1 -0
  1239. package/eval/local/tests/tasks/test_tasks.py +474 -0
  1240. package/eval/local/tests/tasks/test_validation_scripts.py +787 -0
  1241. package/eval/local/treatments/comet/comet_classic_docs_layout.yaml +121 -0
  1242. package/eval/local/treatments/comet/comet_full_039.yaml +141 -0
  1243. package/eval/local/treatments/comet/comet_full_040_beta.yaml +140 -0
  1244. package/eval/local/treatments/comet/comet_native_phase1.yaml +66 -0
  1245. package/eval/local/treatments/common/control.yaml +4 -0
  1246. package/eval/pyproject.toml +41 -0
  1247. package/eval/report-html-config.json +6 -0
  1248. package/eval/scaffold/__init__.py +67 -0
  1249. package/eval/scaffold/python/__init__.py +95 -0
  1250. package/eval/scaffold/python/aligned_comparison.py +1632 -0
  1251. package/eval/scaffold/python/attribution.py +43 -0
  1252. package/eval/scaffold/python/evidence.py +38 -0
  1253. package/eval/scaffold/python/external_data_handler.py +18 -0
  1254. package/eval/scaffold/python/generic_llm_judge.py +237 -0
  1255. package/eval/scaffold/python/judge_config.py +168 -0
  1256. package/eval/scaffold/python/llm_judge.py +188 -0
  1257. package/eval/scaffold/python/logging.py +804 -0
  1258. package/eval/scaffold/python/manifests.py +131 -0
  1259. package/eval/scaffold/python/native_eval.py +143 -0
  1260. package/eval/scaffold/python/paper_charts.py +25 -0
  1261. package/eval/scaffold/python/pass_at_k.py +106 -0
  1262. package/eval/scaffold/python/paths.py +56 -0
  1263. package/eval/scaffold/python/profiles.py +127 -0
  1264. package/eval/scaffold/python/report_outputs.py +1573 -0
  1265. package/eval/scaffold/python/sample_quality.py +382 -0
  1266. package/eval/scaffold/python/schema.py +39 -0
  1267. package/eval/scaffold/python/skill_parser.py +469 -0
  1268. package/eval/scaffold/python/tasks.py +343 -0
  1269. package/eval/scaffold/python/treatments.py +271 -0
  1270. package/eval/scaffold/python/utils.py +460 -0
  1271. package/eval/scaffold/python/validation/__init__.py +31 -0
  1272. package/eval/scaffold/python/validation/authoring_rubric.py +328 -0
  1273. package/eval/scaffold/python/validation/comet_workflow.py +227 -0
  1274. package/eval/scaffold/python/validation/core.py +264 -0
  1275. package/eval/scaffold/python/validation/dataset.py +337 -0
  1276. package/eval/scaffold/python/validation/docker.py +106 -0
  1277. package/eval/scaffold/python/validation/evaluator.py +549 -0
  1278. package/eval/scaffold/python/validation/generic_rubric.py +198 -0
  1279. package/eval/scaffold/python/validation/native_wave.py +2154 -0
  1280. package/eval/scaffold/python/validation/native_workflow.py +252 -0
  1281. package/eval/scaffold/python/validation/rubric.py +780 -0
  1282. package/eval/scaffold/python/validation/runner.py +237 -0
  1283. package/eval/scaffold/python/validation/scripts.py +58 -0
  1284. package/eval/scaffold/python/validation/tracing.py +313 -0
  1285. package/eval/scaffold/shell/common.sh +126 -0
  1286. package/eval/scaffold/shell/completion-point.sh +18 -0
  1287. package/eval/scaffold/shell/decision-point.sh +35 -0
  1288. package/eval/scaffold/shell/docker.sh +716 -0
  1289. package/eval/scaffold/shell/native-review-signer-daemon.mjs +144 -0
  1290. package/eval/scaffold/shell/native-review-verifier-daemon.mjs +178 -0
  1291. package/eval/scaffold/shell/run-claude-loop.sh +234 -0
  1292. package/eval/scaffold/shell/setup.sh +259 -0
  1293. package/eval/simulator-instruction.md +9 -0
  1294. package/package.json +64 -10
  1295. package/dist/domains/dashboard/web/assets/demo-DQyfozbi.js +0 -1
  1296. package/dist/domains/dashboard/web/assets/index-BcO3_QlT.css +0 -1
  1297. package/dist/domains/dashboard/web/assets/index-CjU3VXVu.js +0 -22
@@ -0,0 +1,1632 @@
1
+ """Strict, task-macro comparison for two eval experiments.
2
+
3
+ The legacy comparison report pools every run in one experiment. That is useful
4
+ for a quick dashboard, but it is not a valid pass@k comparison when treatments
5
+ were executed in separate experiments or when tasks have different numbers of
6
+ repetitions. This module pairs runs by ``(task, repetition, case hash)`` and
7
+ then computes each task's metric before taking the macro average.
8
+ """
9
+
10
+ from __future__ import annotations
11
+
12
+ import hashlib
13
+ import json
14
+ import os
15
+ import re
16
+ import stat
17
+ import statistics
18
+ from collections import Counter, defaultdict
19
+ from dataclasses import dataclass
20
+ from pathlib import Path
21
+ from typing import Any, Iterable, Sequence
22
+
23
+ from scaffold.python.logging import extract_events, parse_output
24
+ from scaffold.python.pass_at_k import compute_pass_metrics
25
+ from scaffold.python.sample_quality import quality_from_report
26
+
27
+
28
+ CASE_MANIFEST_SCHEMA_V1 = "comet.eval.case-manifest.v1"
29
+ CASE_MANIFEST_SCHEMA = "comet.eval.case-manifest.v2"
30
+ EXECUTION_IDENTITY_SCHEMA = "comet.eval.execution-identity.v1"
31
+ EXPECTED_CASE_MATRIX_SCHEMA = "comet.eval.expected-case-matrix.v1"
32
+ EXPECTED_CASE_MATRIX_FILENAME = "expected-case-matrix.json"
33
+ DURATION_SOURCE = "raw_stdout:extract_events"
34
+ MAX_RAW_STDOUT_BYTES = 64 * 1024 * 1024
35
+ MAX_EXPECTED_CASE_MATRIX_BYTES = 8 * 1024 * 1024
36
+ _EVAL_ROOT = Path(__file__).resolve().parents[2]
37
+ _REPORT_SUFFIX_RE = r"(?:-r(?P<rep>\d+))?$"
38
+ _CASE_IDENTIFIER_RE = re.compile(r"[A-Za-z0-9][A-Za-z0-9._-]{0,199}")
39
+ _HASHED_CASE_PARTS_V1 = (
40
+ "task_hash",
41
+ "instruction_hash",
42
+ "validator_hash",
43
+ "environment_hash",
44
+ "data_hash",
45
+ "prompt_hash",
46
+ )
47
+ _HASHED_CASE_PARTS_V2 = (
48
+ *_HASHED_CASE_PARTS_V1,
49
+ "runner_hash",
50
+ "controller_hash",
51
+ "execution_hash",
52
+ )
53
+ _EXECUTION_IDENTITY_HASH_KEYS = (
54
+ "image_id_hash",
55
+ "image_repo_digests_hash",
56
+ "image_ref_hash",
57
+ "claude_tool_version_hash",
58
+ "model_selection_hash",
59
+ "interaction_hash",
60
+ )
61
+ _RUNNER_FILES = (
62
+ "scaffold/shell/docker.sh",
63
+ "scaffold/shell/common.sh",
64
+ "scaffold/shell/run-claude-loop.sh",
65
+ "scaffold/shell/decision-point.sh",
66
+ "scaffold/shell/completion-point.sh",
67
+ )
68
+ _CONTROLLER_FILES = (
69
+ "local/tests/tasks/test_tasks.py",
70
+ "local/tests/conftest.py",
71
+ "scaffold/python/tasks.py",
72
+ "scaffold/python/treatments.py",
73
+ "scaffold/python/profiles.py",
74
+ "scaffold/python/manifests.py",
75
+ "scaffold/python/utils.py",
76
+ "scaffold/python/logging.py",
77
+ "scaffold/python/aligned_comparison.py",
78
+ )
79
+
80
+
81
+ @dataclass(frozen=True)
82
+ class CaseManifest:
83
+ schema: str
84
+ task: str
85
+ case_hash: str
86
+ core_hash: str
87
+ task_hash: str
88
+ instruction_hash: str
89
+ validator_hash: str
90
+ environment_hash: str
91
+ data_hash: str
92
+ prompt_hash: str
93
+ runner_hash: str | None
94
+ controller_hash: str | None
95
+ execution_hash: str | None
96
+ execution_identity: dict[str, str] | None
97
+ source: str
98
+ run_bound: bool
99
+ execution_bound: bool
100
+
101
+
102
+ @dataclass(frozen=True)
103
+ class ExpectedCase:
104
+ task: str
105
+ treatment: str
106
+ rep: int
107
+
108
+
109
+ @dataclass(frozen=True)
110
+ class ExpectedCaseMatrix:
111
+ matrix_hash: str
112
+ cases: tuple[ExpectedCase, ...]
113
+
114
+ def keys_for(self, treatment: str) -> frozenset[tuple[str, int]]:
115
+ return frozenset(
116
+ (case.task, case.rep) for case in self.cases if case.treatment == treatment
117
+ )
118
+
119
+
120
+ @dataclass(frozen=True)
121
+ class ExpectedCaseMatrixLoad:
122
+ matrix: ExpectedCaseMatrix | None
123
+ error: str | None
124
+
125
+
126
+ @dataclass(frozen=True)
127
+ class RunRecord:
128
+ task: str
129
+ rep: int
130
+ treatment: str
131
+ report: dict[str, Any]
132
+ report_path: Path
133
+ manifest: CaseManifest
134
+ manifest_valid: bool
135
+ include_in_analysis: bool
136
+ quality_reason: str
137
+
138
+
139
+ @dataclass(frozen=True)
140
+ class AlignmentIssue:
141
+ task: str
142
+ rep: int
143
+ reason: str
144
+ detail: str
145
+
146
+
147
+ @dataclass(frozen=True)
148
+ class AlignedPair:
149
+ task: str
150
+ rep: int
151
+ case_hash: str
152
+ candidate: RunRecord
153
+ baseline: RunRecord
154
+
155
+
156
+ @dataclass(frozen=True)
157
+ class AlignmentResult:
158
+ candidate_records: tuple[RunRecord, ...]
159
+ baseline_records: tuple[RunRecord, ...]
160
+ pairs: tuple[AlignedPair, ...]
161
+ issues: tuple[AlignmentIssue, ...]
162
+ tasks: tuple[str, ...]
163
+ expected_keys: int
164
+
165
+
166
+ def _sha256_bytes(value: bytes) -> str:
167
+ return "sha256:" + hashlib.sha256(value).hexdigest()
168
+
169
+
170
+ def _hash_tree(path: Path) -> str:
171
+ """Hash a file/tree without following symlinks."""
172
+ digest = hashlib.sha256()
173
+ if not path.exists() and not path.is_symlink():
174
+ digest.update(b"missing\0")
175
+ return "sha256:" + digest.hexdigest()
176
+
177
+ paths = [path] if path.is_file() or path.is_symlink() else sorted(path.rglob("*"))
178
+ for item in paths:
179
+ if item.name.startswith(".env"):
180
+ continue
181
+ if item.name == "__pycache__" or "__pycache__" in item.parts:
182
+ continue
183
+ if item.suffix in {".pyc", ".pyo"}:
184
+ continue
185
+ relative = item.name if item == path else item.relative_to(path).as_posix()
186
+ if item.is_symlink():
187
+ digest.update(f"L\0{relative}\0{item.readlink()}\0".encode("utf-8"))
188
+ elif item.is_file():
189
+ digest.update(f"F\0{relative}\0".encode("utf-8"))
190
+ digest.update(item.read_bytes())
191
+ digest.update(b"\0")
192
+ return "sha256:" + digest.hexdigest()
193
+
194
+
195
+ def _case_hash(task: str, components: dict[str, str], *, schema: str) -> str:
196
+ payload = {
197
+ "schema": schema,
198
+ "task": task,
199
+ **components,
200
+ }
201
+ return _sha256_bytes(json.dumps(payload, sort_keys=True, separators=(",", ":")).encode("utf-8"))
202
+
203
+
204
+ def _case_core_hash(task: str, components: dict[str, str]) -> str:
205
+ return _case_hash(
206
+ task,
207
+ {key: components[key] for key in _HASHED_CASE_PARTS_V1},
208
+ schema="comet.eval.case-core.v1",
209
+ )
210
+
211
+
212
+ def _hash_named_files(paths: Sequence[str]) -> str:
213
+ components = {path: _hash_tree(_EVAL_ROOT / path) for path in paths}
214
+ return _sha256_bytes(
215
+ json.dumps(components, sort_keys=True, separators=(",", ":")).encode("utf-8")
216
+ )
217
+
218
+
219
+ def _is_hash(value: Any) -> bool:
220
+ return isinstance(value, str) and re.fullmatch(r"sha256:[0-9a-f]{64}", value) is not None
221
+
222
+
223
+ def _hash_private_value(value: Any) -> str:
224
+ """Hash configuration without persisting its potentially sensitive text."""
225
+ return _sha256_bytes(
226
+ json.dumps(value, sort_keys=True, separators=(",", ":"), default=str).encode("utf-8")
227
+ )
228
+
229
+
230
+ def build_execution_identity(
231
+ docker_identity: dict[str, Any],
232
+ *,
233
+ model: str | None,
234
+ model_config: dict[str, str | None] | None = None,
235
+ interaction: Any,
236
+ ) -> dict[str, str]:
237
+ """Build the safe, report-bound execution identity.
238
+
239
+ Docker supplies hashes derived from the immutable image and the actual
240
+ ``claude --version`` output. Model and interaction text are hashed by the
241
+ controller; only bounded enums and digests enter reports.
242
+ """
243
+ if docker_identity.get("schema") != EXECUTION_IDENTITY_SCHEMA:
244
+ raise ValueError("Docker execution identity schema is invalid")
245
+ allowed = {"schema", "runtime_image_id", *_EXECUTION_IDENTITY_HASH_KEYS[:4]}
246
+ unknown = set(docker_identity) - allowed
247
+ if unknown:
248
+ raise ValueError(f"Docker execution identity has unknown keys: {sorted(unknown)}")
249
+ runtime_image_id = docker_identity.get("runtime_image_id")
250
+ if not isinstance(runtime_image_id, str) or not re.fullmatch(
251
+ r"sha256:[0-9a-f]{64}", runtime_image_id
252
+ ):
253
+ raise ValueError("Docker execution identity does not include an immutable image ID")
254
+ for key in _EXECUTION_IDENTITY_HASH_KEYS[:4]:
255
+ if not _is_hash(docker_identity.get(key)):
256
+ raise ValueError(f"Docker execution identity {key} is invalid")
257
+ if docker_identity["image_id_hash"] != _sha256_bytes(runtime_image_id.encode("utf-8")):
258
+ raise ValueError("Docker execution identity image hash does not match its runtime image")
259
+
260
+ mode = getattr(interaction, "mode", None) or "none"
261
+ if mode not in {"none", "auto_user"}:
262
+ mode = "custom"
263
+ max_turns = getattr(interaction, "max_turns", None)
264
+ if isinstance(max_turns, bool) or not isinstance(max_turns, int) or not 1 <= max_turns <= 1000:
265
+ raise ValueError("Interaction max_turns must be between 1 and 1000")
266
+ interaction_payload = {
267
+ "mode": mode,
268
+ "max_turns": max_turns,
269
+ "simulator_prompt": getattr(interaction, "simulator_prompt", None),
270
+ "decision_patterns": list(getattr(interaction, "decision_patterns", ()) or ()),
271
+ "decision_reply": getattr(interaction, "decision_reply", None),
272
+ "decision_replies": list(getattr(interaction, "decision_replies", []) or []),
273
+ "continue_prompt": getattr(interaction, "continue_prompt", None),
274
+ "fresh_resume_marker": getattr(interaction, "fresh_resume_marker", None),
275
+ }
276
+ model_source = "explicit" if model else "runtime-default"
277
+ normalized_model_config = {
278
+ key: value
279
+ for key, value in sorted((model_config or {}).items())
280
+ if isinstance(key, str) and isinstance(value, (str, type(None)))
281
+ }
282
+ return {
283
+ "schema": EXECUTION_IDENTITY_SCHEMA,
284
+ **{key: docker_identity[key] for key in _EXECUTION_IDENTITY_HASH_KEYS[:4]},
285
+ "model_selection_hash": _hash_private_value(
286
+ {
287
+ "source": model_source,
288
+ "selection": model or "runtime-default",
289
+ "runtime_config": normalized_model_config,
290
+ }
291
+ ),
292
+ "interaction_hash": _hash_private_value(interaction_payload),
293
+ "model_source": model_source,
294
+ "interaction_mode": mode,
295
+ "interaction_max_turns": str(max_turns),
296
+ }
297
+
298
+
299
+ def _validated_execution_identity(raw: Any) -> dict[str, str] | None:
300
+ if not isinstance(raw, dict):
301
+ return None
302
+ allowed = {
303
+ "schema",
304
+ *_EXECUTION_IDENTITY_HASH_KEYS,
305
+ "model_source",
306
+ "interaction_mode",
307
+ "interaction_max_turns",
308
+ }
309
+ if set(raw) != allowed or raw.get("schema") != EXECUTION_IDENTITY_SCHEMA:
310
+ return None
311
+ if not all(_is_hash(raw.get(key)) for key in _EXECUTION_IDENTITY_HASH_KEYS):
312
+ return None
313
+ if raw.get("model_source") not in {"explicit", "runtime-default"}:
314
+ return None
315
+ if raw.get("interaction_mode") not in {"none", "auto_user", "custom"}:
316
+ return None
317
+ try:
318
+ max_turns = int(raw.get("interaction_max_turns", ""))
319
+ except (TypeError, ValueError):
320
+ return None
321
+ if not 1 <= max_turns <= 1000 or str(max_turns) != raw.get("interaction_max_turns"):
322
+ return None
323
+ return {key: raw[key] for key in sorted(allowed)}
324
+
325
+
326
+ def build_case_manifest(
327
+ task: str,
328
+ tasks_dir: Path,
329
+ *,
330
+ execution_identity: dict[str, str] | None = None,
331
+ ) -> CaseManifest:
332
+ """Build a manifest for the canonical task and, for new runs, its execution."""
333
+ task_dir = tasks_dir / task
334
+ instruction_path = task_dir / "instruction.md"
335
+ task_hash = _hash_tree(task_dir / "task.toml")
336
+ instruction_hash = _hash_tree(instruction_path)
337
+ validator_components = {
338
+ "task_validation": _hash_tree(task_dir / "validation"),
339
+ "shared_validation": _hash_tree(_EVAL_ROOT / "scaffold" / "python" / "validation"),
340
+ "native_adapter": _hash_tree(_EVAL_ROOT / "scaffold" / "python" / "native_eval.py"),
341
+ }
342
+ validator_hash = _sha256_bytes(
343
+ json.dumps(validator_components, sort_keys=True, separators=(",", ":")).encode("utf-8")
344
+ )
345
+ environment_hash = _hash_tree(task_dir / "environment")
346
+ data_hash = _hash_tree(task_dir / "data")
347
+ instruction_bytes = instruction_path.read_bytes() if instruction_path.is_file() else b"missing"
348
+ prompt_components = {
349
+ "instruction": _sha256_bytes(b"canonical-task-prompt-v1\0" + instruction_bytes),
350
+ "task_renderer": _hash_tree(_EVAL_ROOT / "scaffold" / "python" / "tasks.py"),
351
+ "native_adapter": validator_components["native_adapter"],
352
+ }
353
+ prompt_hash = _sha256_bytes(
354
+ json.dumps(prompt_components, sort_keys=True, separators=(",", ":")).encode("utf-8")
355
+ )
356
+ base_components = {
357
+ "task_hash": task_hash,
358
+ "instruction_hash": instruction_hash,
359
+ "validator_hash": validator_hash,
360
+ "environment_hash": environment_hash,
361
+ "data_hash": data_hash,
362
+ "prompt_hash": prompt_hash,
363
+ }
364
+ if execution_identity is None:
365
+ schema = CASE_MANIFEST_SCHEMA_V1
366
+ components = base_components
367
+ runner_hash = controller_hash = execution_hash = None
368
+ validated_identity = None
369
+ source = "current-task-tree-fallback"
370
+ run_bound = False
371
+ execution_bound = False
372
+ else:
373
+ validated_identity = _validated_execution_identity(execution_identity)
374
+ if validated_identity is None:
375
+ raise ValueError("execution identity is not a safe canonical payload")
376
+ schema = CASE_MANIFEST_SCHEMA
377
+ runner_hash = _hash_named_files(_RUNNER_FILES)
378
+ controller_hash = _hash_named_files(_CONTROLLER_FILES)
379
+ execution_hash = _hash_private_value(validated_identity)
380
+ components = {
381
+ **base_components,
382
+ "runner_hash": runner_hash,
383
+ "controller_hash": controller_hash,
384
+ "execution_hash": execution_hash,
385
+ }
386
+ source = "report-bound-v2"
387
+ run_bound = True
388
+ execution_bound = True
389
+ case_hash = _case_hash(task, components, schema=schema)
390
+ core_hash = _case_core_hash(task, base_components)
391
+ return CaseManifest(
392
+ schema=schema,
393
+ task=task,
394
+ case_hash=case_hash,
395
+ core_hash=core_hash,
396
+ task_hash=task_hash,
397
+ instruction_hash=instruction_hash,
398
+ validator_hash=validator_hash,
399
+ environment_hash=environment_hash,
400
+ data_hash=data_hash,
401
+ prompt_hash=prompt_hash,
402
+ runner_hash=runner_hash,
403
+ controller_hash=controller_hash,
404
+ execution_hash=execution_hash,
405
+ execution_identity=validated_identity,
406
+ source=source,
407
+ run_bound=run_bound,
408
+ execution_bound=execution_bound,
409
+ )
410
+
411
+
412
+ def case_manifest_payload(manifest: CaseManifest) -> dict[str, Any]:
413
+ """Serialize a case manifest into the report-bound wire format."""
414
+ payload: dict[str, Any] = {
415
+ "schema": manifest.schema,
416
+ "task": manifest.task,
417
+ "case_hash": manifest.case_hash,
418
+ **{key: getattr(manifest, key) for key in _HASHED_CASE_PARTS_V1},
419
+ }
420
+ if manifest.schema == CASE_MANIFEST_SCHEMA:
421
+ payload.update(
422
+ {
423
+ key: getattr(manifest, key)
424
+ for key in ("runner_hash", "controller_hash", "execution_hash")
425
+ }
426
+ )
427
+ payload["execution_identity"] = manifest.execution_identity
428
+ return payload
429
+
430
+
431
+ def _embedded_case_manifest(report: dict[str, Any], task: str) -> CaseManifest | None:
432
+ events = report.get("events_summary") or {}
433
+ raw = report.get("case_manifest") or events.get("case_manifest")
434
+ if not isinstance(raw, dict):
435
+ return None
436
+ schema = raw.get("schema")
437
+ if schema not in {CASE_MANIFEST_SCHEMA_V1, CASE_MANIFEST_SCHEMA} or raw.get("task") != task:
438
+ return None
439
+ hashed_parts = (
440
+ _HASHED_CASE_PARTS_V2 if schema == CASE_MANIFEST_SCHEMA else _HASHED_CASE_PARTS_V1
441
+ )
442
+ expected_keys = {"schema", "task", "case_hash", *hashed_parts}
443
+ if schema == CASE_MANIFEST_SCHEMA:
444
+ expected_keys.add("execution_identity")
445
+ if set(raw) != expected_keys:
446
+ return None
447
+ if not all(_is_hash(raw.get(key)) for key in hashed_parts):
448
+ return None
449
+ case_hash = raw.get("case_hash")
450
+ if not isinstance(case_hash, str) or not case_hash.startswith("sha256:"):
451
+ return None
452
+ components = {key: raw[key] for key in hashed_parts}
453
+ if case_hash != _case_hash(task, components, schema=schema):
454
+ return None
455
+ execution_identity = (
456
+ _validated_execution_identity(raw.get("execution_identity"))
457
+ if schema == CASE_MANIFEST_SCHEMA
458
+ else None
459
+ )
460
+ if schema == CASE_MANIFEST_SCHEMA and (
461
+ execution_identity is None
462
+ or raw["execution_hash"] != _hash_private_value(execution_identity)
463
+ ):
464
+ return None
465
+ return CaseManifest(
466
+ schema=schema,
467
+ task=task,
468
+ case_hash=case_hash,
469
+ core_hash=_case_core_hash(task, components),
470
+ task_hash=raw["task_hash"],
471
+ instruction_hash=raw["instruction_hash"],
472
+ validator_hash=raw["validator_hash"],
473
+ environment_hash=raw["environment_hash"],
474
+ data_hash=raw["data_hash"],
475
+ prompt_hash=raw["prompt_hash"],
476
+ runner_hash=raw.get("runner_hash"),
477
+ controller_hash=raw.get("controller_hash"),
478
+ execution_hash=raw.get("execution_hash"),
479
+ execution_identity=execution_identity,
480
+ source="report-bound-v2" if schema == CASE_MANIFEST_SCHEMA else "report-bound-v1",
481
+ run_bound=True,
482
+ execution_bound=schema == CASE_MANIFEST_SCHEMA,
483
+ )
484
+
485
+
486
+ def expected_case_matrix_payload(
487
+ cases: Iterable[tuple[str, str, int] | ExpectedCase],
488
+ ) -> dict[str, Any]:
489
+ """Create a deterministic, controller-owned expected-case matrix."""
490
+ normalized: set[tuple[str, str, int]] = set()
491
+ for raw in cases:
492
+ if isinstance(raw, ExpectedCase):
493
+ task, treatment, rep = raw.task, raw.treatment, raw.rep
494
+ else:
495
+ task, treatment, rep = raw
496
+ if (
497
+ not isinstance(task, str)
498
+ or _CASE_IDENTIFIER_RE.fullmatch(task) is None
499
+ or not isinstance(treatment, str)
500
+ or _CASE_IDENTIFIER_RE.fullmatch(treatment) is None
501
+ ):
502
+ raise ValueError("Expected case task and treatment must be non-empty strings")
503
+ if isinstance(rep, bool) or not isinstance(rep, int) or rep < 1:
504
+ raise ValueError("Expected case repetition must be a positive integer")
505
+ key = (task, treatment, rep)
506
+ if key in normalized:
507
+ raise ValueError("Expected case matrix contains a duplicate case")
508
+ normalized.add(key)
509
+ serialized = [
510
+ {"task": task, "treatment": treatment, "rep": rep}
511
+ for task, treatment, rep in sorted(normalized)
512
+ ]
513
+ hash_payload = {"schema": EXPECTED_CASE_MATRIX_SCHEMA, "cases": serialized}
514
+ matrix_hash = _sha256_bytes(
515
+ json.dumps(hash_payload, sort_keys=True, separators=(",", ":")).encode("utf-8")
516
+ )
517
+ return {**hash_payload, "matrix_hash": matrix_hash}
518
+
519
+
520
+ def parse_expected_case_matrix(raw: Any) -> ExpectedCaseMatrix:
521
+ if not isinstance(raw, dict) or set(raw) != {"schema", "matrix_hash", "cases"}:
522
+ raise ValueError("expected case matrix has an invalid object shape")
523
+ if raw.get("schema") != EXPECTED_CASE_MATRIX_SCHEMA:
524
+ raise ValueError("expected case matrix schema is invalid")
525
+ cases_raw = raw.get("cases")
526
+ if not isinstance(cases_raw, list):
527
+ raise ValueError("expected case matrix cases must be a list")
528
+ cases: list[ExpectedCase] = []
529
+ seen: set[tuple[str, str, int]] = set()
530
+ for item in cases_raw:
531
+ if not isinstance(item, dict) or set(item) != {"task", "treatment", "rep"}:
532
+ raise ValueError("expected case matrix contains an invalid case")
533
+ task = item.get("task")
534
+ treatment = item.get("treatment")
535
+ rep = item.get("rep")
536
+ if (
537
+ not isinstance(task, str)
538
+ or _CASE_IDENTIFIER_RE.fullmatch(task) is None
539
+ or not isinstance(treatment, str)
540
+ or _CASE_IDENTIFIER_RE.fullmatch(treatment) is None
541
+ ):
542
+ raise ValueError("expected case matrix contains an invalid task or treatment")
543
+ if isinstance(rep, bool) or not isinstance(rep, int) or rep < 1:
544
+ raise ValueError("expected case matrix contains an invalid repetition")
545
+ key = (task, treatment, rep)
546
+ if key in seen:
547
+ raise ValueError("expected case matrix contains a duplicate case")
548
+ seen.add(key)
549
+ cases.append(ExpectedCase(task=task, treatment=treatment, rep=rep))
550
+ if [(case.task, case.treatment, case.rep) for case in cases] != sorted(seen):
551
+ raise ValueError("expected case matrix cases are not canonically ordered")
552
+ canonical = expected_case_matrix_payload(cases)
553
+ if raw.get("matrix_hash") != canonical["matrix_hash"]:
554
+ raise ValueError("expected case matrix hash does not match its cases")
555
+ return ExpectedCaseMatrix(matrix_hash=canonical["matrix_hash"], cases=tuple(cases))
556
+
557
+
558
+ def load_expected_case_matrix(experiment_dir: Path) -> ExpectedCaseMatrixLoad:
559
+ path = experiment_dir / EXPECTED_CASE_MATRIX_FILENAME
560
+ try:
561
+ before = path.lstat()
562
+ except FileNotFoundError:
563
+ return ExpectedCaseMatrixLoad(matrix=None, error=None)
564
+ except OSError:
565
+ return ExpectedCaseMatrixLoad(matrix=None, error="matrix metadata cannot be read")
566
+ if stat.S_ISLNK(before.st_mode) or not stat.S_ISREG(before.st_mode):
567
+ return ExpectedCaseMatrixLoad(matrix=None, error="matrix is not a regular file")
568
+ if before.st_size > MAX_EXPECTED_CASE_MATRIX_BYTES:
569
+ return ExpectedCaseMatrixLoad(matrix=None, error="matrix exceeds the size limit")
570
+ try:
571
+ raw = json.loads(path.read_text(encoding="utf-8"))
572
+ after = path.lstat()
573
+ if _path_identity(before) != _path_identity(after):
574
+ return ExpectedCaseMatrixLoad(matrix=None, error="matrix changed during read")
575
+ return ExpectedCaseMatrixLoad(matrix=parse_expected_case_matrix(raw), error=None)
576
+ except OSError:
577
+ return ExpectedCaseMatrixLoad(matrix=None, error="matrix cannot be read")
578
+ except UnicodeError:
579
+ return ExpectedCaseMatrixLoad(matrix=None, error="matrix is not valid UTF-8")
580
+ except json.JSONDecodeError:
581
+ return ExpectedCaseMatrixLoad(matrix=None, error="matrix is not valid JSON")
582
+ except ValueError as error:
583
+ return ExpectedCaseMatrixLoad(matrix=None, error=str(error))
584
+
585
+
586
+ def _report_identity(
587
+ report: dict[str, Any],
588
+ treatment: str,
589
+ report_path: Path | None = None,
590
+ ) -> tuple[str, int] | None:
591
+ name = str(report.get("name") or "")
592
+ match = re.match(
593
+ rf"^(?P<task>.+)-{re.escape(treatment)}{_REPORT_SUFFIX_RE}",
594
+ name,
595
+ )
596
+ if not match:
597
+ return None
598
+ combined_sample = (
599
+ re.search(r"_sample(?P<rep>\d+)_from_", report_path.stem)
600
+ if report_path is not None
601
+ else None
602
+ )
603
+ rep_text = combined_sample.group("rep") if combined_sample else match.group("rep")
604
+ raw_rep = rep_text if rep_text is not None else report.get("rep", 1)
605
+ if isinstance(raw_rep, bool):
606
+ return None
607
+ try:
608
+ rep = int(raw_rep)
609
+ except (TypeError, ValueError):
610
+ return None
611
+ if rep < 1:
612
+ return None
613
+ return match.group("task"), rep
614
+
615
+
616
+ def load_treatment_records(
617
+ experiment_dir: Path,
618
+ treatment: str,
619
+ *,
620
+ tasks_dir: Path,
621
+ ) -> tuple[RunRecord, ...]:
622
+ reports_dir = experiment_dir / "reports"
623
+ manifests: dict[str, CaseManifest] = {}
624
+ records: list[RunRecord] = []
625
+ if not reports_dir.is_dir():
626
+ return ()
627
+ for path in sorted(reports_dir.glob("*.json")):
628
+ try:
629
+ report = json.loads(path.read_text(encoding="utf-8"))
630
+ except (OSError, json.JSONDecodeError):
631
+ continue
632
+ identity = _report_identity(report, treatment, path)
633
+ if identity is None:
634
+ continue
635
+ task, rep = identity
636
+ events = report.get("events_summary") or {}
637
+ raw_manifest = report.get("case_manifest") or events.get("case_manifest")
638
+ manifest = _embedded_case_manifest(report, task)
639
+ manifest_valid = manifest is not None or raw_manifest is None
640
+ if manifest is None:
641
+ manifest = manifests.setdefault(task, build_case_manifest(task, tasks_dir))
642
+ quality = quality_from_report(report, experiment_dir=experiment_dir)
643
+ records.append(
644
+ RunRecord(
645
+ task=task,
646
+ rep=rep,
647
+ treatment=treatment,
648
+ report=report,
649
+ report_path=path,
650
+ manifest=manifest,
651
+ manifest_valid=manifest_valid,
652
+ include_in_analysis=quality.include_in_analysis,
653
+ quality_reason=quality.reason_code,
654
+ )
655
+ )
656
+ return tuple(records)
657
+
658
+
659
+ def align_records(
660
+ candidate_records: Sequence[RunRecord],
661
+ baseline_records: Sequence[RunRecord],
662
+ *,
663
+ candidate_expected: frozenset[tuple[str, int]] | None = None,
664
+ baseline_expected: frozenset[tuple[str, int]] | None = None,
665
+ initial_issues: Sequence[AlignmentIssue] = (),
666
+ ) -> AlignmentResult:
667
+ candidate_by_key: dict[tuple[str, int], list[RunRecord]] = defaultdict(list)
668
+ baseline_by_key: dict[tuple[str, int], list[RunRecord]] = defaultdict(list)
669
+ for record in candidate_records:
670
+ candidate_by_key[(record.task, record.rep)].append(record)
671
+ for record in baseline_records:
672
+ baseline_by_key[(record.task, record.rep)].append(record)
673
+
674
+ candidate_observed = set(candidate_by_key)
675
+ baseline_observed = set(baseline_by_key)
676
+ effective_candidate_expected = (
677
+ candidate_observed if candidate_expected is None else set(candidate_expected)
678
+ )
679
+ effective_baseline_expected = (
680
+ baseline_observed if baseline_expected is None else set(baseline_expected)
681
+ )
682
+ keys = sorted(
683
+ candidate_observed
684
+ | baseline_observed
685
+ | effective_candidate_expected
686
+ | effective_baseline_expected
687
+ )
688
+ tasks = tuple(sorted({task for task, _rep in keys}))
689
+ issues: list[AlignmentIssue] = list(initial_issues)
690
+ pairs: list[AlignedPair] = []
691
+ for task, rep in keys:
692
+ key = (task, rep)
693
+ candidate_matches = candidate_by_key.get((task, rep), [])
694
+ baseline_matches = baseline_by_key.get((task, rep), [])
695
+ matrix_mismatch = (
696
+ candidate_expected is not None
697
+ and baseline_expected is not None
698
+ and (key in effective_candidate_expected) != (key in effective_baseline_expected)
699
+ )
700
+ if matrix_mismatch:
701
+ omitted = (
702
+ "baseline matrix omits case"
703
+ if key in effective_candidate_expected
704
+ else "candidate matrix omits case"
705
+ )
706
+ issues.append(AlignmentIssue(task, rep, "expected-matrix-mismatch", omitted))
707
+ unexpected: list[str] = []
708
+ if candidate_expected is not None and candidate_matches and key not in candidate_expected:
709
+ unexpected.append("candidate")
710
+ if baseline_expected is not None and baseline_matches and key not in baseline_expected:
711
+ unexpected.append("baseline")
712
+ if unexpected:
713
+ issues.append(AlignmentIssue(task, rep, "unexpected-run", ", ".join(unexpected)))
714
+ continue
715
+ if len(candidate_matches) != 1 or len(baseline_matches) != 1:
716
+ if len(candidate_matches) > 1 or len(baseline_matches) > 1:
717
+ detail = f"candidate={len(candidate_matches)}, baseline={len(baseline_matches)}"
718
+ issues.append(AlignmentIssue(task, rep, "duplicate-run", detail))
719
+ elif not candidate_matches or not baseline_matches:
720
+ missing = []
721
+ if not candidate_matches:
722
+ missing.append("candidate")
723
+ if not baseline_matches:
724
+ missing.append("baseline")
725
+ issues.append(
726
+ AlignmentIssue(
727
+ task,
728
+ rep,
729
+ "missing-repetition",
730
+ f"missing {' and '.join(missing)} run",
731
+ )
732
+ )
733
+ continue
734
+
735
+ candidate = candidate_matches[0]
736
+ baseline = baseline_matches[0]
737
+ invalid_manifests = []
738
+ if not candidate.manifest_valid:
739
+ invalid_manifests.append("candidate")
740
+ if not baseline.manifest_valid:
741
+ invalid_manifests.append("baseline")
742
+ if invalid_manifests:
743
+ issues.append(
744
+ AlignmentIssue(
745
+ task,
746
+ rep,
747
+ "invalid-case-manifest",
748
+ ", ".join(invalid_manifests),
749
+ )
750
+ )
751
+ continue
752
+ excluded = []
753
+ if not candidate.include_in_analysis:
754
+ excluded.append(f"candidate:{candidate.quality_reason}")
755
+ if not baseline.include_in_analysis:
756
+ excluded.append(f"baseline:{baseline.quality_reason}")
757
+ if excluded:
758
+ issues.append(AlignmentIssue(task, rep, "quality-excluded", ", ".join(excluded)))
759
+ continue
760
+ exact_execution_identity = (
761
+ candidate.manifest.execution_bound and baseline.manifest.execution_bound
762
+ )
763
+ comparison_hash = (
764
+ candidate.manifest.case_hash
765
+ if exact_execution_identity
766
+ else candidate.manifest.core_hash
767
+ )
768
+ baseline_comparison_hash = (
769
+ baseline.manifest.case_hash if exact_execution_identity else baseline.manifest.core_hash
770
+ )
771
+ if comparison_hash != baseline_comparison_hash:
772
+ issues.append(
773
+ AlignmentIssue(
774
+ task,
775
+ rep,
776
+ "case-hash-mismatch",
777
+ f"candidate={comparison_hash}, baseline={baseline_comparison_hash}",
778
+ )
779
+ )
780
+ continue
781
+ pairs.append(
782
+ AlignedPair(
783
+ task=task,
784
+ rep=rep,
785
+ case_hash=comparison_hash,
786
+ candidate=candidate,
787
+ baseline=baseline,
788
+ )
789
+ )
790
+
791
+ case_hashes_by_task: dict[str, set[str]] = defaultdict(set)
792
+ for pair in pairs:
793
+ case_hashes_by_task[pair.task].add(pair.case_hash)
794
+ drifting_tasks = {
795
+ task: hashes for task, hashes in case_hashes_by_task.items() if len(hashes) > 1
796
+ }
797
+ if drifting_tasks:
798
+ pairs = [pair for pair in pairs if pair.task not in drifting_tasks]
799
+ for task, hashes in sorted(drifting_tasks.items()):
800
+ issues.append(
801
+ AlignmentIssue(
802
+ task,
803
+ 0,
804
+ "case-hash-drift",
805
+ ", ".join(sorted(hashes)),
806
+ )
807
+ )
808
+
809
+ return AlignmentResult(
810
+ candidate_records=tuple(candidate_records),
811
+ baseline_records=tuple(baseline_records),
812
+ pairs=tuple(pairs),
813
+ issues=tuple(issues),
814
+ tasks=tasks,
815
+ expected_keys=len(keys),
816
+ )
817
+
818
+
819
+ def _run_passed(report: dict[str, Any]) -> bool:
820
+ failed = report.get("checks_failed")
821
+ return report.get("passed") is True and isinstance(failed, list) and len(failed) == 0
822
+
823
+
824
+ def task_macro_pass_metrics(
825
+ results_by_task: dict[str, Sequence[bool]],
826
+ ks: Sequence[int],
827
+ *,
828
+ total_tasks: int,
829
+ ) -> dict[int, dict[str, float | int | None]]:
830
+ """Compute task-level pass metrics and macro-average eligible tasks.
831
+
832
+ A task with fewer than ``k`` aligned repetitions is not silently evaluated
833
+ at a smaller k. It is excluded for that k and reported through coverage.
834
+ """
835
+ output: dict[int, dict[str, float | int | None]] = {}
836
+ for k in ks:
837
+ per_task = [
838
+ compute_pass_metrics(values, k)
839
+ for values in results_by_task.values()
840
+ if len(values) >= k
841
+ ]
842
+ output[k] = {
843
+ "pass_at_k": (
844
+ statistics.fmean(float(item["pass_at_k"]) for item in per_task)
845
+ if per_task
846
+ else None
847
+ ),
848
+ "pass_pow_k": (
849
+ statistics.fmean(float(item["pass_pow_k"]) for item in per_task)
850
+ if per_task
851
+ else None
852
+ ),
853
+ "eligible_tasks": len(per_task),
854
+ "total_tasks": total_tasks,
855
+ }
856
+ return output
857
+
858
+
859
+ def _artifact_path(
860
+ report: dict[str, Any],
861
+ experiment_dir: Path,
862
+ key: str,
863
+ *,
864
+ task: str,
865
+ treatment: str,
866
+ rep: int,
867
+ report_path: Path,
868
+ ) -> Path | None:
869
+ reference = ((report.get("events_summary") or {}).get("artifact_references") or {}).get(key)
870
+ if not isinstance(reference, str) or not reference:
871
+ return None
872
+ comparison_root = experiment_dir.resolve()
873
+ raw_path = Path(reference)
874
+ candidate = Path(
875
+ os.path.abspath(raw_path if raw_path.is_absolute() else comparison_root / raw_path)
876
+ )
877
+ allowed_root = comparison_root
878
+ try:
879
+ candidate.relative_to(allowed_root)
880
+ except ValueError:
881
+ combined = re.search(
882
+ r"_sample(?P<rep>\d+)_from_(?P<source>[A-Za-z0-9._-]+)$",
883
+ report_path.stem,
884
+ )
885
+ if combined is None or int(combined.group("rep")) != rep:
886
+ return None
887
+ source = combined.group("source")
888
+ if source in {".", ".."}:
889
+ return None
890
+ allowed_root = comparison_root.parent / source
891
+ try:
892
+ candidate.relative_to(allowed_root)
893
+ except ValueError:
894
+ return None
895
+
896
+ report_name = report.get("name")
897
+ report_rep = report.get("rep", 1)
898
+ if not isinstance(report_name, str) or not report_name:
899
+ return None
900
+ if isinstance(report_rep, bool):
901
+ return None
902
+ try:
903
+ raw_rep = int(report_rep)
904
+ except (TypeError, ValueError):
905
+ return None
906
+ if raw_rep < 1:
907
+ return None
908
+ identity = _report_identity(report, treatment, report_path)
909
+ if identity != (task, rep):
910
+ return None
911
+ expected_names = {
912
+ f"{report_name}_rep{raw_rep}_stdout.json",
913
+ f"{report_name.replace('-', '_')}_rep{raw_rep}_stdout.json",
914
+ }
915
+ if candidate.name not in expected_names:
916
+ return None
917
+ try:
918
+ root_stat = allowed_root.lstat()
919
+ if stat.S_ISLNK(root_stat.st_mode) or not stat.S_ISDIR(root_stat.st_mode):
920
+ return None
921
+ except OSError:
922
+ return None
923
+ return candidate
924
+
925
+
926
+ def _path_identity(value: os.stat_result) -> tuple[int, int, int, int]:
927
+ return (value.st_dev, value.st_ino, value.st_mtime_ns, value.st_size)
928
+
929
+
930
+ def _directory_chain(root: Path, parent: Path) -> tuple[tuple[Path, os.stat_result], ...]:
931
+ relative = parent.relative_to(root)
932
+ paths = [root]
933
+ cursor = root
934
+ for part in relative.parts:
935
+ cursor = cursor / part
936
+ paths.append(cursor)
937
+ chain: list[tuple[Path, os.stat_result]] = []
938
+ for path in paths:
939
+ current = path.lstat()
940
+ if stat.S_ISLNK(current.st_mode) or not stat.S_ISDIR(current.st_mode):
941
+ raise OSError(f"raw stdout parent is not a real directory: {path}")
942
+ chain.append((path, current))
943
+ return tuple(chain)
944
+
945
+
946
+ def _verify_directory_chain(chain: Sequence[tuple[Path, os.stat_result]]) -> None:
947
+ for path, expected in chain:
948
+ current = path.lstat()
949
+ if (
950
+ stat.S_ISLNK(current.st_mode)
951
+ or not stat.S_ISDIR(current.st_mode)
952
+ or _path_identity(current)[:3] != _path_identity(expected)[:3]
953
+ ):
954
+ raise OSError(f"raw stdout parent changed during read: {path}")
955
+
956
+
957
+ def _read_raw_stdout(path: Path, allowed_root: Path) -> str | None:
958
+ try:
959
+ root = allowed_root.resolve(strict=True)
960
+ chain = _directory_chain(root, path.parent)
961
+ before = path.lstat()
962
+ if stat.S_ISLNK(before.st_mode) or not stat.S_ISREG(before.st_mode):
963
+ return None
964
+ if before.st_size > MAX_RAW_STDOUT_BYTES:
965
+ return None
966
+ _verify_directory_chain(chain)
967
+ flags = os.O_RDONLY | getattr(os, "O_BINARY", 0) | getattr(os, "O_NOFOLLOW", 0)
968
+ descriptor = os.open(path, flags)
969
+ try:
970
+ opened = os.fstat(descriptor)
971
+ after_open = path.lstat()
972
+ if (
973
+ not stat.S_ISREG(opened.st_mode)
974
+ or stat.S_ISLNK(after_open.st_mode)
975
+ or not stat.S_ISREG(after_open.st_mode)
976
+ or _path_identity(opened) != _path_identity(before)
977
+ or _path_identity(after_open) != _path_identity(before)
978
+ ):
979
+ return None
980
+ _verify_directory_chain(chain)
981
+ chunks: list[bytes] = []
982
+ remaining = MAX_RAW_STDOUT_BYTES + 1
983
+ while remaining > 0:
984
+ chunk = os.read(descriptor, min(64 * 1024, remaining))
985
+ if not chunk:
986
+ break
987
+ chunks.append(chunk)
988
+ remaining -= len(chunk)
989
+ if remaining == 0:
990
+ return None
991
+ after_read = os.fstat(descriptor)
992
+ after_path = path.lstat()
993
+ _verify_directory_chain(chain)
994
+ if (
995
+ stat.S_ISLNK(after_path.st_mode)
996
+ or not stat.S_ISREG(after_path.st_mode)
997
+ or _path_identity(after_read) != _path_identity(opened)
998
+ or _path_identity(after_path) != _path_identity(opened)
999
+ ):
1000
+ return None
1001
+ return b"".join(chunks).decode("utf-8", errors="replace")
1002
+ finally:
1003
+ os.close(descriptor)
1004
+ except OSError:
1005
+ return None
1006
+
1007
+
1008
+ def recompute_duration(
1009
+ report: dict[str, Any],
1010
+ experiment_dir: Path,
1011
+ *,
1012
+ task: str,
1013
+ treatment: str,
1014
+ rep: int,
1015
+ report_path: Path,
1016
+ ) -> float | None:
1017
+ """Recompute additive duration from raw stdout; never use stale report duration."""
1018
+ telemetry = recompute_telemetry(
1019
+ report,
1020
+ experiment_dir,
1021
+ task=task,
1022
+ treatment=treatment,
1023
+ rep=rep,
1024
+ report_path=report_path,
1025
+ )
1026
+ if telemetry is None:
1027
+ return None
1028
+ duration = telemetry.get("duration_seconds")
1029
+ if isinstance(duration, bool) or not isinstance(duration, (int, float)):
1030
+ return None
1031
+ return float(duration)
1032
+
1033
+
1034
+ def recompute_telemetry(
1035
+ report: dict[str, Any],
1036
+ experiment_dir: Path,
1037
+ *,
1038
+ task: str,
1039
+ treatment: str,
1040
+ rep: int,
1041
+ report_path: Path,
1042
+ ) -> dict[str, Any] | None:
1043
+ """Recompute cumulative task telemetry from the controller-bound raw stdout."""
1044
+ path = _artifact_path(
1045
+ report,
1046
+ experiment_dir,
1047
+ "raw_stdout",
1048
+ task=task,
1049
+ treatment=treatment,
1050
+ rep=rep,
1051
+ report_path=report_path,
1052
+ )
1053
+ if path is None:
1054
+ return None
1055
+ try:
1056
+ path.relative_to(experiment_dir.resolve())
1057
+ allowed_root = experiment_dir
1058
+ except ValueError:
1059
+ combined = re.search(
1060
+ r"_sample(?P<rep>\d+)_from_(?P<source>[A-Za-z0-9._-]+)$",
1061
+ report_path.stem,
1062
+ )
1063
+ if combined is None or int(combined.group("rep")) != rep:
1064
+ return None
1065
+ allowed_root = experiment_dir.resolve().parent / combined.group("source")
1066
+ stdout = _read_raw_stdout(path, allowed_root)
1067
+ if stdout is None:
1068
+ return None
1069
+ telemetry = extract_events(parse_output(stdout))
1070
+ if telemetry.get("subject_invocations") == 0:
1071
+ return None
1072
+ return telemetry
1073
+
1074
+
1075
+ def _hash_short(value: str) -> str:
1076
+ return value.removeprefix("sha256:")[:12]
1077
+
1078
+
1079
+ def _format_metric(value: float | int | None) -> str:
1080
+ return "N/A" if value is None else f"{float(value):.2f}"
1081
+
1082
+
1083
+ def _format_seconds(value: float | None) -> str:
1084
+ return "N/A" if value is None else f"{value:,.0f}s"
1085
+
1086
+
1087
+ def _experiment_label(directory: Path) -> str:
1088
+ """Render a stable public identifier without leaking a controller-local path."""
1089
+ return directory.name
1090
+
1091
+
1092
+ def _manifest_by_task(records: Iterable[RunRecord]) -> dict[str, CaseManifest]:
1093
+ manifests: dict[str, CaseManifest] = {}
1094
+ for record in records:
1095
+ manifests.setdefault(record.task, record.manifest)
1096
+ return manifests
1097
+
1098
+
1099
+ def _results_by_task(
1100
+ pairs: Sequence[AlignedPair],
1101
+ side: str,
1102
+ ) -> dict[str, list[bool]]:
1103
+ results: dict[str, list[bool]] = defaultdict(list)
1104
+ for pair in sorted(pairs, key=lambda item: (item.task, item.rep)):
1105
+ record = pair.candidate if side == "candidate" else pair.baseline
1106
+ results[pair.task].append(_run_passed(record.report))
1107
+ return dict(results)
1108
+
1109
+
1110
+ def _duration_summary(
1111
+ pairs: Sequence[AlignedPair],
1112
+ side: str,
1113
+ experiment_dir: Path,
1114
+ ) -> tuple[int, int, float | None, float | None, tuple[tuple[str, int], ...]]:
1115
+ values: list[float] = []
1116
+ missing: list[tuple[str, int]] = []
1117
+ for pair in pairs:
1118
+ record = pair.candidate if side == "candidate" else pair.baseline
1119
+ duration = recompute_duration(
1120
+ record.report,
1121
+ experiment_dir,
1122
+ task=record.task,
1123
+ treatment=record.treatment,
1124
+ rep=record.rep,
1125
+ report_path=record.report_path,
1126
+ )
1127
+ if duration is not None:
1128
+ values.append(duration)
1129
+ else:
1130
+ missing.append((pair.task, pair.rep))
1131
+ total = sum(values) if values else None
1132
+ average = statistics.fmean(values) if values else None
1133
+ return len(pairs), len(values), total, average, tuple(missing)
1134
+
1135
+
1136
+ _EFFICIENCY_METRICS = (
1137
+ ("subject_invocations", "Model starts/resumes", "count"),
1138
+ ("num_turns", "Agent turns", "count"),
1139
+ ("tool_calls", "Tool calls", "tool-count"),
1140
+ ("duration_seconds", "Wall duration", "seconds"),
1141
+ ("input_tokens", "Non-cache input tokens", "tokens"),
1142
+ ("output_tokens", "Output tokens", "tokens"),
1143
+ ("cache_read_input_tokens", "Cache-read input tokens", "tokens"),
1144
+ ("total_tokens", "Total tokens incl. cache", "tokens"),
1145
+ ("total_cost_usd", "Model cost", "usd"),
1146
+ ("peak_context_input_tokens", "Peak context input", "tokens"),
1147
+ ("p95_context_input_tokens", "P95 context input", "tokens"),
1148
+ ("peak_context_occupancy_pct", "Peak context occupancy", "percent"),
1149
+ )
1150
+
1151
+
1152
+ def _telemetry_value(events: dict[str, Any], key: str, kind: str) -> float | None:
1153
+ value: Any = events.get(key)
1154
+ if kind == "tool-count":
1155
+ value = len(value) if isinstance(value, list) else value
1156
+ if isinstance(value, bool) or not isinstance(value, (int, float)):
1157
+ return None
1158
+ return float(value)
1159
+
1160
+
1161
+ def _format_efficiency(value: float | None, kind: str) -> str:
1162
+ if value is None:
1163
+ return "N/A"
1164
+ if kind == "seconds":
1165
+ return f"{value:,.0f}s"
1166
+ if kind == "tokens":
1167
+ return f"{value:,.0f}"
1168
+ if kind == "usd":
1169
+ return f"${value:,.3f}"
1170
+ if kind == "percent":
1171
+ return f"{value:,.1f}%"
1172
+ return f"{value:,.2f}"
1173
+
1174
+
1175
+ def _format_reduction(candidate: float | None, baseline: float | None) -> str:
1176
+ if candidate is None or baseline in (None, 0):
1177
+ return "N/A"
1178
+ change = (baseline - candidate) / baseline * 100
1179
+ return f"{abs(change):.1f}% {'less' if change >= 0 else 'more'}"
1180
+
1181
+
1182
+ def _telemetry_by_pair(
1183
+ pairs: Sequence[AlignedPair],
1184
+ candidate_dir: Path,
1185
+ baseline_dir: Path,
1186
+ ) -> list[tuple[AlignedPair, dict[str, Any] | None, dict[str, Any] | None]]:
1187
+ output = []
1188
+ for pair in pairs:
1189
+ sides = []
1190
+ for record, directory in (
1191
+ (pair.candidate, candidate_dir),
1192
+ (pair.baseline, baseline_dir),
1193
+ ):
1194
+ sides.append(
1195
+ recompute_telemetry(
1196
+ record.report,
1197
+ directory,
1198
+ task=record.task,
1199
+ treatment=record.treatment,
1200
+ rep=record.rep,
1201
+ report_path=record.report_path,
1202
+ )
1203
+ )
1204
+ output.append((pair, sides[0], sides[1]))
1205
+ return output
1206
+
1207
+
1208
+ def _render_efficiency_table(
1209
+ telemetry: Sequence[tuple[AlignedPair, dict[str, Any] | None, dict[str, Any] | None]],
1210
+ *,
1211
+ successes_only: bool,
1212
+ ) -> list[str]:
1213
+ selected = [
1214
+ item
1215
+ for item in telemetry
1216
+ if not successes_only
1217
+ or (_run_passed(item[0].candidate.report) and _run_passed(item[0].baseline.report))
1218
+ ]
1219
+ lines = [
1220
+ "| Metric | Complete pairs | Candidate average | Baseline average | Candidate delta |",
1221
+ "|--------|----------------|-------------------|------------------|-----------------|",
1222
+ ]
1223
+ for key, label, kind in _EFFICIENCY_METRICS:
1224
+ values = []
1225
+ for _pair, candidate, baseline in selected:
1226
+ if candidate is None or baseline is None:
1227
+ continue
1228
+ candidate_value = _telemetry_value(candidate, key, kind)
1229
+ baseline_value = _telemetry_value(baseline, key, kind)
1230
+ if candidate_value is not None and baseline_value is not None:
1231
+ values.append((candidate_value, baseline_value))
1232
+ candidate_average = statistics.fmean(value[0] for value in values) if values else None
1233
+ baseline_average = statistics.fmean(value[1] for value in values) if values else None
1234
+ lines.append(
1235
+ f"| {label} | {len(values)}/{len(selected)} | "
1236
+ f"{_format_efficiency(candidate_average, kind)} | "
1237
+ f"{_format_efficiency(baseline_average, kind)} | "
1238
+ f"{_format_reduction(candidate_average, baseline_average)} |"
1239
+ )
1240
+ return lines
1241
+
1242
+
1243
+ def build_aligned_report(
1244
+ candidate_dir: Path,
1245
+ baseline_dir: Path,
1246
+ *,
1247
+ candidate_treatment: str,
1248
+ baseline_treatment: str,
1249
+ tasks_dir: Path,
1250
+ ks: Sequence[int] = (1, 2, 3),
1251
+ ) -> str:
1252
+ """Build a strict two-experiment comparison report."""
1253
+ if not ks or any(isinstance(k, bool) or k < 1 for k in ks):
1254
+ raise ValueError("ks must contain positive integers")
1255
+ normalized_ks = tuple(sorted(set(int(k) for k in ks)))
1256
+ candidate_records = load_treatment_records(
1257
+ candidate_dir,
1258
+ candidate_treatment,
1259
+ tasks_dir=tasks_dir,
1260
+ )
1261
+ baseline_records = load_treatment_records(
1262
+ baseline_dir,
1263
+ baseline_treatment,
1264
+ tasks_dir=tasks_dir,
1265
+ )
1266
+ candidate_matrix_load = load_expected_case_matrix(candidate_dir)
1267
+ baseline_matrix_load = load_expected_case_matrix(baseline_dir)
1268
+ if not candidate_records:
1269
+ raise ValueError(
1270
+ f"no {candidate_treatment} reports found in candidate experiment {candidate_dir}"
1271
+ )
1272
+ if not baseline_records:
1273
+ raise ValueError(
1274
+ f"no {baseline_treatment} reports found in baseline experiment {baseline_dir}"
1275
+ )
1276
+ matrix_issues: list[AlignmentIssue] = []
1277
+ if candidate_matrix_load.error:
1278
+ matrix_issues.append(
1279
+ AlignmentIssue(
1280
+ "*",
1281
+ 0,
1282
+ "invalid-expected-case-matrix",
1283
+ f"candidate: {candidate_matrix_load.error}",
1284
+ )
1285
+ )
1286
+ if baseline_matrix_load.error:
1287
+ matrix_issues.append(
1288
+ AlignmentIssue(
1289
+ "*",
1290
+ 0,
1291
+ "invalid-expected-case-matrix",
1292
+ f"baseline: {baseline_matrix_load.error}",
1293
+ )
1294
+ )
1295
+ candidate_expected = (
1296
+ candidate_matrix_load.matrix.keys_for(candidate_treatment)
1297
+ if candidate_matrix_load.matrix is not None
1298
+ else (frozenset() if candidate_matrix_load.error else None)
1299
+ )
1300
+ baseline_expected = (
1301
+ baseline_matrix_load.matrix.keys_for(baseline_treatment)
1302
+ if baseline_matrix_load.matrix is not None
1303
+ else (frozenset() if baseline_matrix_load.error else None)
1304
+ )
1305
+ if candidate_matrix_load.matrix is not None and not candidate_expected:
1306
+ matrix_issues.append(
1307
+ AlignmentIssue(
1308
+ "*",
1309
+ 0,
1310
+ "expected-treatment-missing",
1311
+ f"candidate matrix has no {candidate_treatment} cases",
1312
+ )
1313
+ )
1314
+ if baseline_matrix_load.matrix is not None and not baseline_expected:
1315
+ matrix_issues.append(
1316
+ AlignmentIssue(
1317
+ "*",
1318
+ 0,
1319
+ "expected-treatment-missing",
1320
+ f"baseline matrix has no {baseline_treatment} cases",
1321
+ )
1322
+ )
1323
+ alignment = align_records(
1324
+ candidate_records,
1325
+ baseline_records,
1326
+ candidate_expected=candidate_expected,
1327
+ baseline_expected=baseline_expected,
1328
+ initial_issues=matrix_issues,
1329
+ )
1330
+ candidate_results = _results_by_task(alignment.pairs, "candidate")
1331
+ baseline_results = _results_by_task(alignment.pairs, "baseline")
1332
+ candidate_metrics = task_macro_pass_metrics(
1333
+ candidate_results,
1334
+ normalized_ks,
1335
+ total_tasks=len(alignment.tasks),
1336
+ )
1337
+ baseline_metrics = task_macro_pass_metrics(
1338
+ baseline_results,
1339
+ normalized_ks,
1340
+ total_tasks=len(alignment.tasks),
1341
+ )
1342
+
1343
+ lines = [
1344
+ "# Comet Aligned Experiment Comparison Report",
1345
+ "",
1346
+ f"- Candidate: `{candidate_treatment}` from `{_experiment_label(candidate_dir)}`",
1347
+ f"- Baseline: `{baseline_treatment}` from `{_experiment_label(baseline_dir)}`",
1348
+ f"- Requested k: {', '.join(str(k) for k in normalized_ks)}",
1349
+ "",
1350
+ "## Alignment contract",
1351
+ "",
1352
+ "- Runs pair only when `task` and repetition match. Two v2 records must also match the full execution-bound `case_hash`; when either side is historical v1, only the shared task-core hash can be checked and the limitation is disclosed below.",
1353
+ "- Expected task/repetition coverage comes from each experiment's controller-written matrix when available, not from the reports that happened to survive.",
1354
+ "- Metrics are computed per task and then macro-averaged; runs are never pooled across tasks.",
1355
+ "- A task with fewer than k aligned repetitions is excluded from that k's task coverage; k is never reduced.",
1356
+ "- Duration is reparsed from raw stdout with the current additive result-event parser. Stored historical duration fields are not mixed into this metric.",
1357
+ "",
1358
+ "## Alignment summary",
1359
+ "",
1360
+ "| Candidate runs | Baseline runs | Expected task/rep keys | Strictly matched pairs | Tasks | Issues |",
1361
+ "|----------------|---------------|------------------------|------------------------|-------|--------|",
1362
+ f"| {len(candidate_records)} | {len(baseline_records)} | {alignment.expected_keys} | {len(alignment.pairs)} | {len(alignment.tasks)} | {len(alignment.issues)} |",
1363
+ "",
1364
+ ]
1365
+
1366
+ matrix_rows = []
1367
+ for side, matrix_load, treatment in (
1368
+ ("Candidate", candidate_matrix_load, candidate_treatment),
1369
+ ("Baseline", baseline_matrix_load, baseline_treatment),
1370
+ ):
1371
+ if matrix_load.matrix is None:
1372
+ status = "invalid (fail closed)" if matrix_load.error else "historical fallback"
1373
+ matrix_rows.append(f"| {side} | {status} | N/A | N/A |")
1374
+ else:
1375
+ keys = matrix_load.matrix.keys_for(treatment)
1376
+ matrix_rows.append(
1377
+ f"| {side} | report-bound | {_hash_short(matrix_load.matrix.matrix_hash)} | {len(keys)} |"
1378
+ )
1379
+ lines.extend(
1380
+ [
1381
+ "## Expected case matrix audit",
1382
+ "",
1383
+ "| Experiment | Source | Matrix hash | Target cases |",
1384
+ "|------------|--------|-------------|--------------|",
1385
+ *matrix_rows,
1386
+ "",
1387
+ ]
1388
+ )
1389
+ missing_matrices = [
1390
+ side
1391
+ for side, matrix_load in (
1392
+ ("candidate", candidate_matrix_load),
1393
+ ("baseline", baseline_matrix_load),
1394
+ )
1395
+ if matrix_load.matrix is None and matrix_load.error is None
1396
+ ]
1397
+ if missing_matrices:
1398
+ lines.extend(
1399
+ [
1400
+ "> Expected-matrix limitation: "
1401
+ + " and ".join(missing_matrices)
1402
+ + " experiment(s) predate a valid controller-written matrix. Observed-report fallback is used for that side, so a case missing from every fallback source cannot be reconstructed or claimed as historically executed.",
1403
+ "",
1404
+ ]
1405
+ )
1406
+ invalid_matrices = [
1407
+ side
1408
+ for side, matrix_load in (
1409
+ ("candidate", candidate_matrix_load),
1410
+ ("baseline", baseline_matrix_load),
1411
+ )
1412
+ if matrix_load.error is not None
1413
+ ]
1414
+ if invalid_matrices:
1415
+ lines.extend(
1416
+ [
1417
+ "> Invalid-matrix handling: "
1418
+ + " and ".join(invalid_matrices)
1419
+ + " experiment matrix failed validation. Its observed reports are excluded rather than treated as a historical fallback.",
1420
+ "",
1421
+ ]
1422
+ )
1423
+
1424
+ fallback_count = sum(
1425
+ 1 for record in (*candidate_records, *baseline_records) if not record.manifest.run_bound
1426
+ )
1427
+ if fallback_count:
1428
+ lines.extend(
1429
+ [
1430
+ f"> Audit limitation: {fallback_count} run record(s) predate report-bound case manifests. Their hashes were reconstructed from the current canonical task tree and are marked `current-task-tree-fallback`; they prove comparison-time parity, not the exact historical checkout.",
1431
+ "",
1432
+ ]
1433
+ )
1434
+ execution_unbound_count = sum(
1435
+ 1
1436
+ for record in (*candidate_records, *baseline_records)
1437
+ if not record.manifest.execution_bound
1438
+ )
1439
+ if execution_unbound_count:
1440
+ lines.extend(
1441
+ [
1442
+ f"> Execution-identity limitation: {execution_unbound_count} run record(s) use v1 or reconstructed manifests that do not bind the runner/controller sources, immutable Docker image, Claude tool version, model selection, and interaction configuration. They must not be presented as exact historical execution identity.",
1443
+ "",
1444
+ ]
1445
+ )
1446
+
1447
+ lines.extend(
1448
+ [
1449
+ "## pass@k / pass^k — task macro average",
1450
+ "",
1451
+ "Each value is the mean of the per-task estimator. Coverage is shown as eligible tasks / all aligned task names.",
1452
+ "`pass@k` uses the HumanEval at-least-one-success estimator. `pass^k` keeps Comet's observed consistency lower bound: a task contributes 1 only when all of its aligned repetitions pass.",
1453
+ "",
1454
+ "| Treatment | Metric | "
1455
+ + " | ".join(f"k={k}" for k in normalized_ks)
1456
+ + " | Matched pass/fail |",
1457
+ "|-----------|--------|"
1458
+ + "|".join("-----" for _ in normalized_ks)
1459
+ + "|-------------------|",
1460
+ ]
1461
+ )
1462
+ for treatment, results, metrics in (
1463
+ (candidate_treatment, candidate_results, candidate_metrics),
1464
+ (baseline_treatment, baseline_results, baseline_metrics),
1465
+ ):
1466
+ total_passes = sum(sum(1 for value in values if value) for values in results.values())
1467
+ total_runs = sum(len(values) for values in results.values())
1468
+ pass_at_cells = [
1469
+ f"{_format_metric(metrics[k]['pass_at_k'])} "
1470
+ f"({metrics[k]['eligible_tasks']}/{metrics[k]['total_tasks']} tasks)"
1471
+ for k in normalized_ks
1472
+ ]
1473
+ pass_pow_cells = [
1474
+ f"{_format_metric(metrics[k]['pass_pow_k'])} "
1475
+ f"({metrics[k]['eligible_tasks']}/{metrics[k]['total_tasks']} tasks)"
1476
+ for k in normalized_ks
1477
+ ]
1478
+ lines.append(
1479
+ f"| {treatment} | pass@k | "
1480
+ + " | ".join(pass_at_cells)
1481
+ + f" | {total_passes}/{total_runs} |"
1482
+ )
1483
+ lines.append(
1484
+ f"| {treatment} | pass^k | "
1485
+ + " | ".join(pass_pow_cells)
1486
+ + f" | {total_passes}/{total_runs} |"
1487
+ )
1488
+ lines.append("")
1489
+
1490
+ lines.extend(
1491
+ [
1492
+ "## Duration from raw stdout",
1493
+ "",
1494
+ "Missing raw duration is reported as missing coverage and is not replaced by, or averaged with, the stored report duration.",
1495
+ "",
1496
+ "| Treatment | Matched runs | Duration coverage | Total | Average / covered run | Source |",
1497
+ "|-----------|--------------|-------------------|-------|-----------------------|--------|",
1498
+ ]
1499
+ )
1500
+ duration_missing: list[tuple[str, tuple[tuple[str, int], ...]]] = []
1501
+ for treatment, side, directory in (
1502
+ (candidate_treatment, "candidate", candidate_dir),
1503
+ (baseline_treatment, "baseline", baseline_dir),
1504
+ ):
1505
+ matched, covered, total, average, missing = _duration_summary(
1506
+ alignment.pairs,
1507
+ side,
1508
+ directory,
1509
+ )
1510
+ lines.append(
1511
+ f"| {treatment} | {matched} | {covered}/{matched} | "
1512
+ f"{_format_seconds(total)} | {_format_seconds(average)} | {DURATION_SOURCE} |"
1513
+ )
1514
+ if missing:
1515
+ duration_missing.append((treatment, missing))
1516
+ lines.append("")
1517
+ for treatment, missing in duration_missing:
1518
+ references = ", ".join(f"`{task}#r{rep}`" for task, rep in missing)
1519
+ lines.append(f"- {treatment} missing raw duration: {references}")
1520
+ if duration_missing:
1521
+ lines.append("")
1522
+
1523
+ paired_telemetry = _telemetry_by_pair(alignment.pairs, candidate_dir, baseline_dir)
1524
+ successful_pairs = sum(
1525
+ _run_passed(pair.candidate.report) and _run_passed(pair.baseline.report)
1526
+ for pair in alignment.pairs
1527
+ )
1528
+ lines.extend(
1529
+ [
1530
+ "## Paired task efficiency from raw stdout",
1531
+ "",
1532
+ "Result telemetry is additive across the initial model start, deterministic user-answer resumes, and cold resumes. Token totals include cache-read tokens. Context input deduplicates streamed assistant events by message id.",
1533
+ "",
1534
+ f"### Strict-success intersection ({successful_pairs} paired runs)",
1535
+ "",
1536
+ "This is the primary completed-task efficiency view: both candidate and baseline passed the same task repetition.",
1537
+ "",
1538
+ *_render_efficiency_table(paired_telemetry, successes_only=True),
1539
+ "",
1540
+ f"### All aligned runs ({len(alignment.pairs)} paired runs)",
1541
+ "",
1542
+ *_render_efficiency_table(paired_telemetry, successes_only=False),
1543
+ "",
1544
+ "> Context rows require per-assistant-message usage from both sides. Low pair coverage means the historical CLI did not preserve enough context telemetry; those rows must not be promoted as a workflow comparison.",
1545
+ "",
1546
+ ]
1547
+ )
1548
+
1549
+ candidate_manifests = _manifest_by_task(candidate_records)
1550
+ baseline_manifests = _manifest_by_task(baseline_records)
1551
+ lines.extend(
1552
+ [
1553
+ "## Case manifest audit",
1554
+ "",
1555
+ "Hash cells show the first 12 hexadecimal characters. Full hashes remain in the source report when report-bound; fallback hashes are reproducible from the task tree.",
1556
+ "",
1557
+ "| Task | Candidate case | Baseline case | Source | Instruction | Validator | Environment | Prompt | Runner | Controller | Execution |",
1558
+ "|------|----------------|---------------|--------|-------------|-----------|-------------|--------|--------|------------|-----------|",
1559
+ ]
1560
+ )
1561
+ for task in alignment.tasks:
1562
+ candidate_manifest = candidate_manifests.get(task)
1563
+ baseline_manifest = baseline_manifests.get(task)
1564
+ representative = candidate_manifest or baseline_manifest
1565
+ if representative is None:
1566
+ continue
1567
+ source = "/".join(
1568
+ filter(
1569
+ None,
1570
+ (
1571
+ candidate_manifest.source if candidate_manifest else "candidate-missing",
1572
+ baseline_manifest.source if baseline_manifest else "baseline-missing",
1573
+ ),
1574
+ )
1575
+ )
1576
+ lines.append(
1577
+ f"| {task} | "
1578
+ f"{_hash_short(candidate_manifest.case_hash) if candidate_manifest else '—'} | "
1579
+ f"{_hash_short(baseline_manifest.case_hash) if baseline_manifest else '—'} | "
1580
+ f"{source} | {_hash_short(representative.instruction_hash)} | "
1581
+ f"{_hash_short(representative.validator_hash)} | "
1582
+ f"{_hash_short(representative.environment_hash)} | "
1583
+ f"{_hash_short(representative.prompt_hash)} | "
1584
+ f"{_hash_short(representative.runner_hash) if representative.runner_hash else 'v1-unbound'} | "
1585
+ f"{_hash_short(representative.controller_hash) if representative.controller_hash else 'v1-unbound'} | "
1586
+ f"{_hash_short(representative.execution_hash) if representative.execution_hash else 'v1-unbound'} |"
1587
+ )
1588
+ lines.append("")
1589
+
1590
+ lines.extend(
1591
+ [
1592
+ "## Task outcomes on strictly matched repetitions",
1593
+ "",
1594
+ "| Task | Repetitions | Candidate | Baseline |",
1595
+ "|------|-------------|-----------|----------|",
1596
+ ]
1597
+ )
1598
+ pairs_by_task: dict[str, list[AlignedPair]] = defaultdict(list)
1599
+ for pair in alignment.pairs:
1600
+ pairs_by_task[pair.task].append(pair)
1601
+ for task in alignment.tasks:
1602
+ pairs = sorted(pairs_by_task.get(task, []), key=lambda item: item.rep)
1603
+ reps = ",".join(str(pair.rep) for pair in pairs) or "—"
1604
+ candidate_passes = sum(_run_passed(pair.candidate.report) for pair in pairs)
1605
+ baseline_passes = sum(_run_passed(pair.baseline.report) for pair in pairs)
1606
+ lines.append(
1607
+ f"| {task} | {reps} | {candidate_passes}/{len(pairs)} | "
1608
+ f"{baseline_passes}/{len(pairs)} |"
1609
+ )
1610
+ lines.append("")
1611
+
1612
+ if alignment.issues:
1613
+ counts = Counter(issue.reason for issue in alignment.issues)
1614
+ lines.extend(
1615
+ [
1616
+ "## Alignment issues",
1617
+ "",
1618
+ "Issue counts: "
1619
+ + ", ".join(f"`{reason}`={count}" for reason, count in sorted(counts.items())),
1620
+ "",
1621
+ "| Task | Rep | Reason | Detail |",
1622
+ "|------|-----|--------|--------|",
1623
+ ]
1624
+ )
1625
+ for issue in alignment.issues:
1626
+ detail = issue.detail.replace("|", "/")
1627
+ lines.append(f"| {issue.task} | {issue.rep} | {issue.reason} | {detail} |")
1628
+ lines.append("")
1629
+ else:
1630
+ lines.extend(["## Alignment issues", "", "_None._", ""])
1631
+
1632
+ return "\n".join(lines)