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

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 (714) hide show
  1. package/README.md +215 -77
  2. package/assets/manifest.json +14 -5
  3. package/assets/skills/comet/SKILL.md +17 -282
  4. package/assets/skills/comet/reference/comet-yaml-fields.md +5 -3
  5. package/assets/skills/comet/reference/context-recovery.md +3 -3
  6. package/assets/skills/comet/reference/intent-frame.md +2 -2
  7. package/assets/skills/comet/reference/scripts.md +2 -2
  8. package/assets/skills/comet/rules/comet-workflow-guard.en.md +32 -0
  9. package/assets/skills/comet/rules/comet-workflow-guard.md +32 -0
  10. package/assets/skills/comet/scripts/comet-entry-runtime.mjs +7834 -0
  11. package/assets/skills/comet/scripts/comet-hook-router.mjs +10307 -0
  12. package/assets/skills/comet/scripts/comet-runtime.mjs +782 -425
  13. package/assets/skills/comet-any/SKILL.md +4 -4
  14. package/assets/skills/comet-any/reference/authoring-subagents.md +1 -1
  15. package/assets/skills/comet-any/reference/bundle-authoring.md +1 -1
  16. package/assets/skills/comet-any/reference/subagents/reference-author.md +1 -1
  17. package/assets/skills/comet-any/reference/subagents/script-author.md +1 -1
  18. package/assets/skills/comet-any/reference/subagents/skill-core-author.md +1 -1
  19. package/assets/skills/comet-any/reference/subagents/skill-reviewer.md +2 -2
  20. package/assets/skills/comet-any/reference/subagents/workflow-entry-author.md +3 -3
  21. package/assets/skills/comet-archive/SKILL.md +7 -9
  22. package/assets/skills/comet-build/SKILL.md +17 -11
  23. package/assets/skills/comet-classic/SKILL.md +293 -0
  24. package/assets/skills/comet-design/SKILL.md +1 -1
  25. package/assets/skills/comet-hotfix/SKILL.md +20 -6
  26. package/assets/skills/comet-native/SKILL.md +257 -0
  27. package/assets/skills/comet-native/reference/artifacts.md +204 -0
  28. package/assets/skills/comet-native/reference/commands.md +118 -0
  29. package/assets/skills/comet-native/reference/recovery.md +143 -0
  30. package/assets/skills/comet-native/scripts/comet-native-hook-guard.mjs +4 -0
  31. package/assets/skills/comet-native/scripts/comet-native-runtime.mjs +28898 -0
  32. package/assets/skills/comet-open/SKILL.md +4 -4
  33. package/assets/skills/comet-tweak/SKILL.md +22 -10
  34. package/assets/skills/comet-verify/SKILL.md +2 -0
  35. package/assets/skills-zh/comet/SKILL.md +17 -270
  36. package/assets/skills-zh/comet/reference/comet-yaml-fields.md +5 -3
  37. package/assets/skills-zh/comet/reference/context-recovery.md +3 -3
  38. package/assets/skills-zh/comet/reference/intent-frame.md +2 -2
  39. package/assets/skills-zh/comet/reference/scripts.md +2 -2
  40. package/assets/skills-zh/comet-any/SKILL.md +4 -4
  41. package/assets/skills-zh/comet-any/reference/authoring-subagents.md +1 -1
  42. package/assets/skills-zh/comet-any/reference/bundle-authoring.md +1 -1
  43. package/assets/skills-zh/comet-any/reference/subagents/reference-author.md +1 -1
  44. package/assets/skills-zh/comet-any/reference/subagents/script-author.md +1 -1
  45. package/assets/skills-zh/comet-any/reference/subagents/skill-core-author.md +1 -1
  46. package/assets/skills-zh/comet-any/reference/subagents/skill-reviewer.md +2 -2
  47. package/assets/skills-zh/comet-any/reference/subagents/workflow-entry-author.md +3 -3
  48. package/assets/skills-zh/comet-archive/SKILL.md +7 -9
  49. package/assets/skills-zh/comet-build/SKILL.md +17 -11
  50. package/assets/skills-zh/comet-classic/SKILL.md +281 -0
  51. package/assets/skills-zh/comet-design/SKILL.md +1 -1
  52. package/assets/skills-zh/comet-hotfix/SKILL.md +20 -6
  53. package/assets/skills-zh/comet-native/SKILL.md +257 -0
  54. package/assets/skills-zh/comet-native/reference/artifacts.md +206 -0
  55. package/assets/skills-zh/comet-native/reference/commands.md +118 -0
  56. package/assets/skills-zh/comet-native/reference/recovery.md +143 -0
  57. package/assets/skills-zh/comet-open/SKILL.md +4 -4
  58. package/assets/skills-zh/comet-tweak/SKILL.md +22 -10
  59. package/assets/skills-zh/comet-verify/SKILL.md +2 -0
  60. package/dist/app/cli/index.js +59 -13
  61. package/dist/app/cli/index.js.map +1 -1
  62. package/dist/app/commands/command-result.d.ts +6 -0
  63. package/dist/app/commands/command-result.d.ts.map +1 -0
  64. package/dist/app/commands/command-result.js +4 -0
  65. package/dist/app/commands/command-result.js.map +1 -0
  66. package/dist/app/commands/doctor.d.ts +1 -0
  67. package/dist/app/commands/doctor.d.ts.map +1 -1
  68. package/dist/app/commands/doctor.js +201 -26
  69. package/dist/app/commands/doctor.js.map +1 -1
  70. package/dist/app/commands/eval.d.ts +3 -1
  71. package/dist/app/commands/eval.d.ts.map +1 -1
  72. package/dist/app/commands/eval.js +17 -7
  73. package/dist/app/commands/eval.js.map +1 -1
  74. package/dist/app/commands/i18n.d.ts +1 -1
  75. package/dist/app/commands/i18n.d.ts.map +1 -1
  76. package/dist/app/commands/i18n.js +6 -2
  77. package/dist/app/commands/i18n.js.map +1 -1
  78. package/dist/app/commands/init.d.ts +10 -2
  79. package/dist/app/commands/init.d.ts.map +1 -1
  80. package/dist/app/commands/init.js +331 -50
  81. package/dist/app/commands/init.js.map +1 -1
  82. package/dist/app/commands/native.d.ts +2 -0
  83. package/dist/app/commands/native.d.ts.map +1 -0
  84. package/dist/app/commands/native.js +10 -0
  85. package/dist/app/commands/native.js.map +1 -0
  86. package/dist/app/commands/project-scope-selection.d.ts.map +1 -1
  87. package/dist/app/commands/project-scope-selection.js +2 -0
  88. package/dist/app/commands/project-scope-selection.js.map +1 -1
  89. package/dist/app/commands/resume-probe.d.ts.map +1 -1
  90. package/dist/app/commands/resume-probe.js +8 -2
  91. package/dist/app/commands/resume-probe.js.map +1 -1
  92. package/dist/app/commands/status.d.ts +0 -31
  93. package/dist/app/commands/status.d.ts.map +1 -1
  94. package/dist/app/commands/status.js +49 -172
  95. package/dist/app/commands/status.js.map +1 -1
  96. package/dist/app/commands/update.d.ts +20 -4
  97. package/dist/app/commands/update.d.ts.map +1 -1
  98. package/dist/app/commands/update.js +698 -90
  99. package/dist/app/commands/update.js.map +1 -1
  100. package/dist/app/commands/workflow.d.ts +6 -0
  101. package/dist/app/commands/workflow.d.ts.map +1 -0
  102. package/dist/app/commands/workflow.js +11 -0
  103. package/dist/app/commands/workflow.js.map +1 -0
  104. package/dist/config/repository-layout.json +21 -1
  105. package/dist/domains/comet-classic/classic-archive.d.ts.map +1 -1
  106. package/dist/domains/comet-classic/classic-archive.js +3 -0
  107. package/dist/domains/comet-classic/classic-archive.js.map +1 -1
  108. package/dist/domains/comet-classic/classic-branch-binding.d.ts +51 -0
  109. package/dist/domains/comet-classic/classic-branch-binding.d.ts.map +1 -0
  110. package/dist/domains/comet-classic/classic-branch-binding.js +107 -0
  111. package/dist/domains/comet-classic/classic-branch-binding.js.map +1 -0
  112. package/dist/domains/comet-classic/classic-current-change.d.ts +3 -5
  113. package/dist/domains/comet-classic/classic-current-change.d.ts.map +1 -1
  114. package/dist/domains/comet-classic/classic-current-change.js +59 -68
  115. package/dist/domains/comet-classic/classic-current-change.js.map +1 -1
  116. package/dist/domains/comet-classic/classic-guard.d.ts.map +1 -1
  117. package/dist/domains/comet-classic/classic-guard.js +40 -10
  118. package/dist/domains/comet-classic/classic-guard.js.map +1 -1
  119. package/dist/domains/comet-classic/classic-hook-guard.d.ts +9 -0
  120. package/dist/domains/comet-classic/classic-hook-guard.d.ts.map +1 -1
  121. package/dist/domains/comet-classic/classic-hook-guard.js +109 -13
  122. package/dist/domains/comet-classic/classic-hook-guard.js.map +1 -1
  123. package/dist/domains/comet-classic/classic-project-config.d.ts.map +1 -1
  124. package/dist/domains/comet-classic/classic-project-config.js +12 -8
  125. package/dist/domains/comet-classic/classic-project-config.js.map +1 -1
  126. package/dist/domains/comet-classic/classic-runtime-run.d.ts.map +1 -1
  127. package/dist/domains/comet-classic/classic-runtime-run.js +9 -1
  128. package/dist/domains/comet-classic/classic-runtime-run.js.map +1 -1
  129. package/dist/domains/comet-classic/classic-state-command.d.ts.map +1 -1
  130. package/dist/domains/comet-classic/classic-state-command.js +94 -4
  131. package/dist/domains/comet-classic/classic-state-command.js.map +1 -1
  132. package/dist/domains/comet-classic/classic-state-events.d.ts +1 -1
  133. package/dist/domains/comet-classic/classic-state-events.d.ts.map +1 -1
  134. package/dist/domains/comet-classic/classic-state.d.ts +2 -1
  135. package/dist/domains/comet-classic/classic-state.d.ts.map +1 -1
  136. package/dist/domains/comet-classic/classic-state.js +3 -0
  137. package/dist/domains/comet-classic/classic-state.js.map +1 -1
  138. package/dist/domains/comet-classic/classic-transitions.d.ts.map +1 -1
  139. package/dist/domains/comet-classic/classic-transitions.js +1 -0
  140. package/dist/domains/comet-classic/classic-transitions.js.map +1 -1
  141. package/dist/domains/comet-classic/classic-validate-command.d.ts.map +1 -1
  142. package/dist/domains/comet-classic/classic-validate-command.js +6 -0
  143. package/dist/domains/comet-classic/classic-validate-command.js.map +1 -1
  144. package/dist/domains/comet-entry/current-selection-repair.d.ts +17 -0
  145. package/dist/domains/comet-entry/current-selection-repair.d.ts.map +1 -0
  146. package/dist/domains/comet-entry/current-selection-repair.js +19 -0
  147. package/dist/domains/comet-entry/current-selection-repair.js.map +1 -0
  148. package/dist/domains/comet-entry/current-selection.d.ts +28 -0
  149. package/dist/domains/comet-entry/current-selection.d.ts.map +1 -0
  150. package/dist/domains/comet-entry/current-selection.js +116 -0
  151. package/dist/domains/comet-entry/current-selection.js.map +1 -0
  152. package/dist/domains/comet-entry/entry-runtime-entry.d.ts +2 -0
  153. package/dist/domains/comet-entry/entry-runtime-entry.d.ts.map +1 -0
  154. package/dist/domains/comet-entry/entry-runtime-entry.js +3 -0
  155. package/dist/domains/comet-entry/entry-runtime-entry.js.map +1 -0
  156. package/dist/domains/comet-entry/entry-runtime.d.ts +7 -0
  157. package/dist/domains/comet-entry/entry-runtime.d.ts.map +1 -0
  158. package/dist/domains/comet-entry/entry-runtime.js +55 -0
  159. package/dist/domains/comet-entry/entry-runtime.js.map +1 -0
  160. package/dist/domains/comet-entry/hook-adapter.d.ts +6 -0
  161. package/dist/domains/comet-entry/hook-adapter.d.ts.map +1 -0
  162. package/dist/domains/comet-entry/hook-adapter.js +202 -0
  163. package/dist/domains/comet-entry/hook-adapter.js.map +1 -0
  164. package/dist/domains/comet-entry/hook-router-entry.d.ts +8 -0
  165. package/dist/domains/comet-entry/hook-router-entry.d.ts.map +1 -0
  166. package/dist/domains/comet-entry/hook-router-entry.js +92 -0
  167. package/dist/domains/comet-entry/hook-router-entry.js.map +1 -0
  168. package/dist/domains/comet-entry/hook-router.d.ts +32 -0
  169. package/dist/domains/comet-entry/hook-router.d.ts.map +1 -0
  170. package/dist/domains/comet-entry/hook-router.js +133 -0
  171. package/dist/domains/comet-entry/hook-router.js.map +1 -0
  172. package/dist/domains/comet-entry/hook-types.d.ts +20 -0
  173. package/dist/domains/comet-entry/hook-types.d.ts.map +1 -0
  174. package/dist/domains/comet-entry/hook-types.js +2 -0
  175. package/dist/domains/comet-entry/hook-types.js.map +1 -0
  176. package/dist/domains/comet-entry/init-workflow.d.ts +16 -0
  177. package/dist/domains/comet-entry/init-workflow.d.ts.map +1 -0
  178. package/dist/domains/comet-entry/init-workflow.js +103 -0
  179. package/dist/domains/comet-entry/init-workflow.js.map +1 -0
  180. package/dist/domains/comet-entry/project-status.d.ts +3 -0
  181. package/dist/domains/comet-entry/project-status.d.ts.map +1 -0
  182. package/dist/domains/comet-entry/project-status.js +222 -0
  183. package/dist/domains/comet-entry/project-status.js.map +1 -0
  184. package/dist/domains/comet-entry/resolve-entry.d.ts +3 -0
  185. package/dist/domains/comet-entry/resolve-entry.d.ts.map +1 -0
  186. package/dist/domains/comet-entry/resolve-entry.js +22 -0
  187. package/dist/domains/comet-entry/resolve-entry.js.map +1 -0
  188. package/dist/domains/comet-entry/resume-probe.d.ts +34 -0
  189. package/dist/domains/comet-entry/resume-probe.d.ts.map +1 -0
  190. package/dist/domains/comet-entry/resume-probe.js +458 -0
  191. package/dist/domains/comet-entry/resume-probe.js.map +1 -0
  192. package/dist/domains/comet-entry/types.d.ts +59 -0
  193. package/dist/domains/comet-entry/types.d.ts.map +1 -0
  194. package/dist/domains/comet-entry/types.js +2 -0
  195. package/dist/domains/comet-entry/types.js.map +1 -0
  196. package/dist/domains/comet-entry/workflow-resolution.d.ts +8 -0
  197. package/dist/domains/comet-entry/workflow-resolution.d.ts.map +1 -0
  198. package/dist/domains/comet-entry/workflow-resolution.js +16 -0
  199. package/dist/domains/comet-entry/workflow-resolution.js.map +1 -0
  200. package/dist/domains/comet-native/index.d.ts +35 -0
  201. package/dist/domains/comet-native/index.d.ts.map +1 -0
  202. package/dist/domains/comet-native/index.js +35 -0
  203. package/dist/domains/comet-native/index.js.map +1 -0
  204. package/dist/domains/comet-native/native-acceptance.d.ts +42 -0
  205. package/dist/domains/comet-native/native-acceptance.d.ts.map +1 -0
  206. package/dist/domains/comet-native/native-acceptance.js +503 -0
  207. package/dist/domains/comet-native/native-acceptance.js.map +1 -0
  208. package/dist/domains/comet-native/native-archive-content.d.ts +26 -0
  209. package/dist/domains/comet-native/native-archive-content.d.ts.map +1 -0
  210. package/dist/domains/comet-native/native-archive-content.js +159 -0
  211. package/dist/domains/comet-native/native-archive-content.js.map +1 -0
  212. package/dist/domains/comet-native/native-archive-inspection.d.ts +9 -0
  213. package/dist/domains/comet-native/native-archive-inspection.d.ts.map +1 -0
  214. package/dist/domains/comet-native/native-archive-inspection.js +94 -0
  215. package/dist/domains/comet-native/native-archive-inspection.js.map +1 -0
  216. package/dist/domains/comet-native/native-archive-preflight.d.ts +52 -0
  217. package/dist/domains/comet-native/native-archive-preflight.d.ts.map +1 -0
  218. package/dist/domains/comet-native/native-archive-preflight.js +214 -0
  219. package/dist/domains/comet-native/native-archive-preflight.js.map +1 -0
  220. package/dist/domains/comet-native/native-archive-transaction.d.ts +19 -0
  221. package/dist/domains/comet-native/native-archive-transaction.d.ts.map +1 -0
  222. package/dist/domains/comet-native/native-archive-transaction.js +1181 -0
  223. package/dist/domains/comet-native/native-archive-transaction.js.map +1 -0
  224. package/dist/domains/comet-native/native-archive.d.ts +36 -0
  225. package/dist/domains/comet-native/native-archive.d.ts.map +1 -0
  226. package/dist/domains/comet-native/native-archive.js +403 -0
  227. package/dist/domains/comet-native/native-archive.js.map +1 -0
  228. package/dist/domains/comet-native/native-artifacts.d.ts +10 -0
  229. package/dist/domains/comet-native/native-artifacts.d.ts.map +1 -0
  230. package/dist/domains/comet-native/native-artifacts.js +204 -0
  231. package/dist/domains/comet-native/native-artifacts.js.map +1 -0
  232. package/dist/domains/comet-native/native-atomic-file.d.ts +10 -0
  233. package/dist/domains/comet-native/native-atomic-file.d.ts.map +1 -0
  234. package/dist/domains/comet-native/native-atomic-file.js +175 -0
  235. package/dist/domains/comet-native/native-atomic-file.js.map +1 -0
  236. package/dist/domains/comet-native/native-bounded-file.d.ts +19 -0
  237. package/dist/domains/comet-native/native-bounded-file.d.ts.map +1 -0
  238. package/dist/domains/comet-native/native-bounded-file.js +180 -0
  239. package/dist/domains/comet-native/native-bounded-file.js.map +1 -0
  240. package/dist/domains/comet-native/native-build-evidence.d.ts +42 -0
  241. package/dist/domains/comet-native/native-build-evidence.d.ts.map +1 -0
  242. package/dist/domains/comet-native/native-build-evidence.js +257 -0
  243. package/dist/domains/comet-native/native-build-evidence.js.map +1 -0
  244. package/dist/domains/comet-native/native-canonical-hash.d.ts +10 -0
  245. package/dist/domains/comet-native/native-canonical-hash.d.ts.map +1 -0
  246. package/dist/domains/comet-native/native-canonical-hash.js +100 -0
  247. package/dist/domains/comet-native/native-canonical-hash.js.map +1 -0
  248. package/dist/domains/comet-native/native-change-recovery.d.ts +11 -0
  249. package/dist/domains/comet-native/native-change-recovery.d.ts.map +1 -0
  250. package/dist/domains/comet-native/native-change-recovery.js +15 -0
  251. package/dist/domains/comet-native/native-change-recovery.js.map +1 -0
  252. package/dist/domains/comet-native/native-change.d.ts +61 -0
  253. package/dist/domains/comet-native/native-change.d.ts.map +1 -0
  254. package/dist/domains/comet-native/native-change.js +696 -0
  255. package/dist/domains/comet-native/native-change.js.map +1 -0
  256. package/dist/domains/comet-native/native-check-receipt-model.d.ts +63 -0
  257. package/dist/domains/comet-native/native-check-receipt-model.d.ts.map +1 -0
  258. package/dist/domains/comet-native/native-check-receipt-model.js +347 -0
  259. package/dist/domains/comet-native/native-check-receipt-model.js.map +1 -0
  260. package/dist/domains/comet-native/native-check-receipt-storage.d.ts +10 -0
  261. package/dist/domains/comet-native/native-check-receipt-storage.d.ts.map +1 -0
  262. package/dist/domains/comet-native/native-check-receipt-storage.js +196 -0
  263. package/dist/domains/comet-native/native-check-receipt-storage.js.map +1 -0
  264. package/dist/domains/comet-native/native-check-receipt.d.ts +19 -0
  265. package/dist/domains/comet-native/native-check-receipt.d.ts.map +1 -0
  266. package/dist/domains/comet-native/native-check-receipt.js +446 -0
  267. package/dist/domains/comet-native/native-check-receipt.js.map +1 -0
  268. package/dist/domains/comet-native/native-check.d.ts +18 -0
  269. package/dist/domains/comet-native/native-check.d.ts.map +1 -0
  270. package/dist/domains/comet-native/native-check.js +29 -0
  271. package/dist/domains/comet-native/native-check.js.map +1 -0
  272. package/dist/domains/comet-native/native-checkpoint-journal.d.ts +13 -0
  273. package/dist/domains/comet-native/native-checkpoint-journal.d.ts.map +1 -0
  274. package/dist/domains/comet-native/native-checkpoint-journal.js +53 -0
  275. package/dist/domains/comet-native/native-checkpoint-journal.js.map +1 -0
  276. package/dist/domains/comet-native/native-checkpoint-storage.d.ts +43 -0
  277. package/dist/domains/comet-native/native-checkpoint-storage.d.ts.map +1 -0
  278. package/dist/domains/comet-native/native-checkpoint-storage.js +487 -0
  279. package/dist/domains/comet-native/native-checkpoint-storage.js.map +1 -0
  280. package/dist/domains/comet-native/native-cli-entry.d.ts +2 -0
  281. package/dist/domains/comet-native/native-cli-entry.d.ts.map +1 -0
  282. package/dist/domains/comet-native/native-cli-entry.js +18 -0
  283. package/dist/domains/comet-native/native-cli-entry.js.map +1 -0
  284. package/dist/domains/comet-native/native-cli.d.ts +7 -0
  285. package/dist/domains/comet-native/native-cli.d.ts.map +1 -0
  286. package/dist/domains/comet-native/native-cli.js +642 -0
  287. package/dist/domains/comet-native/native-cli.js.map +1 -0
  288. package/dist/domains/comet-native/native-config.d.ts +15 -0
  289. package/dist/domains/comet-native/native-config.d.ts.map +1 -0
  290. package/dist/domains/comet-native/native-config.js +281 -0
  291. package/dist/domains/comet-native/native-config.js.map +1 -0
  292. package/dist/domains/comet-native/native-conflict-inspection.d.ts +17 -0
  293. package/dist/domains/comet-native/native-conflict-inspection.d.ts.map +1 -0
  294. package/dist/domains/comet-native/native-conflict-inspection.js +90 -0
  295. package/dist/domains/comet-native/native-conflict-inspection.js.map +1 -0
  296. package/dist/domains/comet-native/native-conflict-radar.d.ts +75 -0
  297. package/dist/domains/comet-native/native-conflict-radar.d.ts.map +1 -0
  298. package/dist/domains/comet-native/native-conflict-radar.js +326 -0
  299. package/dist/domains/comet-native/native-conflict-radar.js.map +1 -0
  300. package/dist/domains/comet-native/native-continuation.d.ts +9 -0
  301. package/dist/domains/comet-native/native-continuation.d.ts.map +1 -0
  302. package/dist/domains/comet-native/native-continuation.js +146 -0
  303. package/dist/domains/comet-native/native-continuation.js.map +1 -0
  304. package/dist/domains/comet-native/native-contract-files.d.ts +24 -0
  305. package/dist/domains/comet-native/native-contract-files.d.ts.map +1 -0
  306. package/dist/domains/comet-native/native-contract-files.js +66 -0
  307. package/dist/domains/comet-native/native-contract-files.js.map +1 -0
  308. package/dist/domains/comet-native/native-contract.d.ts +41 -0
  309. package/dist/domains/comet-native/native-contract.d.ts.map +1 -0
  310. package/dist/domains/comet-native/native-contract.js +141 -0
  311. package/dist/domains/comet-native/native-contract.js.map +1 -0
  312. package/dist/domains/comet-native/native-diagnostics.d.ts +18 -0
  313. package/dist/domains/comet-native/native-diagnostics.d.ts.map +1 -0
  314. package/dist/domains/comet-native/native-diagnostics.js +522 -0
  315. package/dist/domains/comet-native/native-diagnostics.js.map +1 -0
  316. package/dist/domains/comet-native/native-doctor.d.ts +12 -0
  317. package/dist/domains/comet-native/native-doctor.d.ts.map +1 -0
  318. package/dist/domains/comet-native/native-doctor.js +768 -0
  319. package/dist/domains/comet-native/native-doctor.js.map +1 -0
  320. package/dist/domains/comet-native/native-evidence-retention.d.ts +37 -0
  321. package/dist/domains/comet-native/native-evidence-retention.d.ts.map +1 -0
  322. package/dist/domains/comet-native/native-evidence-retention.js +885 -0
  323. package/dist/domains/comet-native/native-evidence-retention.js.map +1 -0
  324. package/dist/domains/comet-native/native-evidence-storage.d.ts +41 -0
  325. package/dist/domains/comet-native/native-evidence-storage.d.ts.map +1 -0
  326. package/dist/domains/comet-native/native-evidence-storage.js +351 -0
  327. package/dist/domains/comet-native/native-evidence-storage.js.map +1 -0
  328. package/dist/domains/comet-native/native-findings.d.ts +8 -0
  329. package/dist/domains/comet-native/native-findings.d.ts.map +1 -0
  330. package/dist/domains/comet-native/native-findings.js +238 -0
  331. package/dist/domains/comet-native/native-findings.js.map +1 -0
  332. package/dist/domains/comet-native/native-guards.d.ts +7 -0
  333. package/dist/domains/comet-native/native-guards.d.ts.map +1 -0
  334. package/dist/domains/comet-native/native-guards.js +126 -0
  335. package/dist/domains/comet-native/native-guards.js.map +1 -0
  336. package/dist/domains/comet-native/native-hash.d.ts +3 -0
  337. package/dist/domains/comet-native/native-hash.d.ts.map +1 -0
  338. package/dist/domains/comet-native/native-hash.js +12 -0
  339. package/dist/domains/comet-native/native-hash.js.map +1 -0
  340. package/dist/domains/comet-native/native-hook-guard.d.ts +17 -0
  341. package/dist/domains/comet-native/native-hook-guard.d.ts.map +1 -0
  342. package/dist/domains/comet-native/native-hook-guard.js +154 -0
  343. package/dist/domains/comet-native/native-hook-guard.js.map +1 -0
  344. package/dist/domains/comet-native/native-lock.d.ts +47 -0
  345. package/dist/domains/comet-native/native-lock.d.ts.map +1 -0
  346. package/dist/domains/comet-native/native-lock.js +395 -0
  347. package/dist/domains/comet-native/native-lock.js.map +1 -0
  348. package/dist/domains/comet-native/native-mutation-lock.d.ts +5 -0
  349. package/dist/domains/comet-native/native-mutation-lock.d.ts.map +1 -0
  350. package/dist/domains/comet-native/native-mutation-lock.js +66 -0
  351. package/dist/domains/comet-native/native-mutation-lock.js.map +1 -0
  352. package/dist/domains/comet-native/native-paths.d.ts +10 -0
  353. package/dist/domains/comet-native/native-paths.d.ts.map +1 -0
  354. package/dist/domains/comet-native/native-paths.js +171 -0
  355. package/dist/domains/comet-native/native-paths.js.map +1 -0
  356. package/dist/domains/comet-native/native-progress-checkpoint.d.ts +13 -0
  357. package/dist/domains/comet-native/native-progress-checkpoint.d.ts.map +1 -0
  358. package/dist/domains/comet-native/native-progress-checkpoint.js +104 -0
  359. package/dist/domains/comet-native/native-progress-checkpoint.js.map +1 -0
  360. package/dist/domains/comet-native/native-protected-file.d.ts +113 -0
  361. package/dist/domains/comet-native/native-protected-file.d.ts.map +1 -0
  362. package/dist/domains/comet-native/native-protected-file.js +509 -0
  363. package/dist/domains/comet-native/native-protected-file.js.map +1 -0
  364. package/dist/domains/comet-native/native-redaction.d.ts +2 -0
  365. package/dist/domains/comet-native/native-redaction.d.ts.map +1 -0
  366. package/dist/domains/comet-native/native-redaction.js +18 -0
  367. package/dist/domains/comet-native/native-redaction.js.map +1 -0
  368. package/dist/domains/comet-native/native-repair-integration.d.ts +42 -0
  369. package/dist/domains/comet-native/native-repair-integration.d.ts.map +1 -0
  370. package/dist/domains/comet-native/native-repair-integration.js +184 -0
  371. package/dist/domains/comet-native/native-repair-integration.js.map +1 -0
  372. package/dist/domains/comet-native/native-repair-runtime.d.ts +73 -0
  373. package/dist/domains/comet-native/native-repair-runtime.d.ts.map +1 -0
  374. package/dist/domains/comet-native/native-repair-runtime.js +509 -0
  375. package/dist/domains/comet-native/native-repair-runtime.js.map +1 -0
  376. package/dist/domains/comet-native/native-repair-stagnation.d.ts +85 -0
  377. package/dist/domains/comet-native/native-repair-stagnation.d.ts.map +1 -0
  378. package/dist/domains/comet-native/native-repair-stagnation.js +256 -0
  379. package/dist/domains/comet-native/native-repair-stagnation.js.map +1 -0
  380. package/dist/domains/comet-native/native-resume-view.d.ts +14 -0
  381. package/dist/domains/comet-native/native-resume-view.d.ts.map +1 -0
  382. package/dist/domains/comet-native/native-resume-view.js +105 -0
  383. package/dist/domains/comet-native/native-resume-view.js.map +1 -0
  384. package/dist/domains/comet-native/native-revision.d.ts +20 -0
  385. package/dist/domains/comet-native/native-revision.d.ts.map +1 -0
  386. package/dist/domains/comet-native/native-revision.js +32 -0
  387. package/dist/domains/comet-native/native-revision.js.map +1 -0
  388. package/dist/domains/comet-native/native-root-move.d.ts +20 -0
  389. package/dist/domains/comet-native/native-root-move.d.ts.map +1 -0
  390. package/dist/domains/comet-native/native-root-move.js +812 -0
  391. package/dist/domains/comet-native/native-root-move.js.map +1 -0
  392. package/dist/domains/comet-native/native-run-consistency.d.ts +3 -0
  393. package/dist/domains/comet-native/native-run-consistency.d.ts.map +1 -0
  394. package/dist/domains/comet-native/native-run-consistency.js +136 -0
  395. package/dist/domains/comet-native/native-run-consistency.js.map +1 -0
  396. package/dist/domains/comet-native/native-run-store.d.ts +41 -0
  397. package/dist/domains/comet-native/native-run-store.d.ts.map +1 -0
  398. package/dist/domains/comet-native/native-run-store.js +451 -0
  399. package/dist/domains/comet-native/native-run-store.js.map +1 -0
  400. package/dist/domains/comet-native/native-runtime-package.d.ts +16 -0
  401. package/dist/domains/comet-native/native-runtime-package.d.ts.map +1 -0
  402. package/dist/domains/comet-native/native-runtime-package.js +72 -0
  403. package/dist/domains/comet-native/native-runtime-package.js.map +1 -0
  404. package/dist/domains/comet-native/native-schema-migration.d.ts +11 -0
  405. package/dist/domains/comet-native/native-schema-migration.d.ts.map +1 -0
  406. package/dist/domains/comet-native/native-schema-migration.js +899 -0
  407. package/dist/domains/comet-native/native-schema-migration.js.map +1 -0
  408. package/dist/domains/comet-native/native-selection.d.ts +12 -0
  409. package/dist/domains/comet-native/native-selection.d.ts.map +1 -0
  410. package/dist/domains/comet-native/native-selection.js +52 -0
  411. package/dist/domains/comet-native/native-selection.js.map +1 -0
  412. package/dist/domains/comet-native/native-sensitive-paths.d.ts +7 -0
  413. package/dist/domains/comet-native/native-sensitive-paths.d.ts.map +1 -0
  414. package/dist/domains/comet-native/native-sensitive-paths.js +69 -0
  415. package/dist/domains/comet-native/native-sensitive-paths.js.map +1 -0
  416. package/dist/domains/comet-native/native-snapshot.d.ts +74 -0
  417. package/dist/domains/comet-native/native-snapshot.d.ts.map +1 -0
  418. package/dist/domains/comet-native/native-snapshot.js +2308 -0
  419. package/dist/domains/comet-native/native-snapshot.js.map +1 -0
  420. package/dist/domains/comet-native/native-specs.d.ts +12 -0
  421. package/dist/domains/comet-native/native-specs.d.ts.map +1 -0
  422. package/dist/domains/comet-native/native-specs.js +270 -0
  423. package/dist/domains/comet-native/native-specs.js.map +1 -0
  424. package/dist/domains/comet-native/native-trajectory-limits.d.ts +7 -0
  425. package/dist/domains/comet-native/native-trajectory-limits.d.ts.map +1 -0
  426. package/dist/domains/comet-native/native-trajectory-limits.js +13 -0
  427. package/dist/domains/comet-native/native-trajectory-limits.js.map +1 -0
  428. package/dist/domains/comet-native/native-trajectory-recovery.d.ts +37 -0
  429. package/dist/domains/comet-native/native-trajectory-recovery.d.ts.map +1 -0
  430. package/dist/domains/comet-native/native-trajectory-recovery.js +133 -0
  431. package/dist/domains/comet-native/native-trajectory-recovery.js.map +1 -0
  432. package/dist/domains/comet-native/native-trajectory.d.ts +16 -0
  433. package/dist/domains/comet-native/native-trajectory.d.ts.map +1 -0
  434. package/dist/domains/comet-native/native-trajectory.js +27 -0
  435. package/dist/domains/comet-native/native-trajectory.js.map +1 -0
  436. package/dist/domains/comet-native/native-transaction.d.ts +45 -0
  437. package/dist/domains/comet-native/native-transaction.d.ts.map +1 -0
  438. package/dist/domains/comet-native/native-transaction.js +846 -0
  439. package/dist/domains/comet-native/native-transaction.js.map +1 -0
  440. package/dist/domains/comet-native/native-transition-evidence.d.ts +4 -0
  441. package/dist/domains/comet-native/native-transition-evidence.d.ts.map +1 -0
  442. package/dist/domains/comet-native/native-transition-evidence.js +20 -0
  443. package/dist/domains/comet-native/native-transition-evidence.js.map +1 -0
  444. package/dist/domains/comet-native/native-transition-journal.d.ts +30 -0
  445. package/dist/domains/comet-native/native-transition-journal.d.ts.map +1 -0
  446. package/dist/domains/comet-native/native-transition-journal.js +819 -0
  447. package/dist/domains/comet-native/native-transition-journal.js.map +1 -0
  448. package/dist/domains/comet-native/native-transitions.d.ts +13 -0
  449. package/dist/domains/comet-native/native-transitions.d.ts.map +1 -0
  450. package/dist/domains/comet-native/native-transitions.js +632 -0
  451. package/dist/domains/comet-native/native-transitions.js.map +1 -0
  452. package/dist/domains/comet-native/native-types.d.ts +547 -0
  453. package/dist/domains/comet-native/native-types.d.ts.map +1 -0
  454. package/dist/domains/comet-native/native-types.js +8 -0
  455. package/dist/domains/comet-native/native-types.js.map +1 -0
  456. package/dist/domains/comet-native/native-verification-evidence.d.ts +86 -0
  457. package/dist/domains/comet-native/native-verification-evidence.d.ts.map +1 -0
  458. package/dist/domains/comet-native/native-verification-evidence.js +480 -0
  459. package/dist/domains/comet-native/native-verification-evidence.js.map +1 -0
  460. package/dist/domains/comet-native/native-verification-runtime.d.ts +58 -0
  461. package/dist/domains/comet-native/native-verification-runtime.d.ts.map +1 -0
  462. package/dist/domains/comet-native/native-verification-runtime.js +321 -0
  463. package/dist/domains/comet-native/native-verification-runtime.js.map +1 -0
  464. package/dist/domains/comet-native/native-verification-scope.d.ts +117 -0
  465. package/dist/domains/comet-native/native-verification-scope.d.ts.map +1 -0
  466. package/dist/domains/comet-native/native-verification-scope.js +1040 -0
  467. package/dist/domains/comet-native/native-verification-scope.js.map +1 -0
  468. package/dist/domains/comet-native/native-workspace.d.ts +46 -0
  469. package/dist/domains/comet-native/native-workspace.d.ts.map +1 -0
  470. package/dist/domains/comet-native/native-workspace.js +276 -0
  471. package/dist/domains/comet-native/native-workspace.js.map +1 -0
  472. package/dist/domains/dashboard/collector.d.ts.map +1 -1
  473. package/dist/domains/dashboard/collector.js +9 -1
  474. package/dist/domains/dashboard/collector.js.map +1 -1
  475. package/dist/domains/dashboard/native-adapter.d.ts +157 -0
  476. package/dist/domains/dashboard/native-adapter.d.ts.map +1 -0
  477. package/dist/domains/dashboard/native-adapter.js +302 -0
  478. package/dist/domains/dashboard/native-adapter.js.map +1 -0
  479. package/dist/domains/dashboard/native-collector.d.ts +6 -0
  480. package/dist/domains/dashboard/native-collector.d.ts.map +1 -0
  481. package/dist/domains/dashboard/native-collector.js +285 -0
  482. package/dist/domains/dashboard/native-collector.js.map +1 -0
  483. package/dist/domains/dashboard/types.d.ts +5 -0
  484. package/dist/domains/dashboard/types.d.ts.map +1 -1
  485. package/dist/domains/dashboard/web/assets/{arc-TGVUG2WN.js → arc-CxdiLJ50.js} +1 -1
  486. package/dist/domains/dashboard/web/assets/{architectureDiagram-3BPJPVTR-ASHmiHoP.js → architectureDiagram-3BPJPVTR-D5YCQu4e.js} +1 -1
  487. package/dist/domains/dashboard/web/assets/{blockDiagram-GPEHLZMM-CwASxBKe.js → blockDiagram-GPEHLZMM-8NfdCOQ8.js} +1 -1
  488. package/dist/domains/dashboard/web/assets/{c4Diagram-AAUBKEIU-BU8z_WNk.js → c4Diagram-AAUBKEIU-B3cFnNT7.js} +1 -1
  489. package/dist/domains/dashboard/web/assets/channel-B6AFly29.js +1 -0
  490. package/dist/domains/dashboard/web/assets/{chunk-2J33WTMH-CBGlUx4_.js → chunk-2J33WTMH-CBNfW-Dr.js} +1 -1
  491. package/dist/domains/dashboard/web/assets/{chunk-4BX2VUAB-CS-iGcFz.js → chunk-4BX2VUAB-vWyemRBr.js} +1 -1
  492. package/dist/domains/dashboard/web/assets/{chunk-55IACEB6-BUtCVJat.js → chunk-55IACEB6-H6haOo2C.js} +1 -1
  493. package/dist/domains/dashboard/web/assets/{chunk-727SXJPM-C94tj_pf.js → chunk-727SXJPM-D02UjGND.js} +1 -1
  494. package/dist/domains/dashboard/web/assets/{chunk-AQP2D5EJ-BFOKcpdG.js → chunk-AQP2D5EJ-wKsbOw_T.js} +1 -1
  495. package/dist/domains/dashboard/web/assets/{chunk-FMBD7UC4-Dmx8B-st.js → chunk-FMBD7UC4-eYFEZimP.js} +1 -1
  496. package/dist/domains/dashboard/web/assets/{chunk-ND2GUHAM-DYV00CNn.js → chunk-ND2GUHAM-fMaIDDI2.js} +1 -1
  497. package/dist/domains/dashboard/web/assets/{chunk-QZHKN3VN-DMJJyQnw.js → chunk-QZHKN3VN-C9rhF6Hm.js} +1 -1
  498. package/dist/domains/dashboard/web/assets/classDiagram-4FO5ZUOK-BcnrxOTt.js +1 -0
  499. package/dist/domains/dashboard/web/assets/classDiagram-v2-Q7XG4LA2-BcnrxOTt.js +1 -0
  500. package/dist/domains/dashboard/web/assets/{cose-bilkent-S5V4N54A-P4nE2rea.js → cose-bilkent-S5V4N54A-CbaShPub.js} +1 -1
  501. package/dist/domains/dashboard/web/assets/{cynefin-VYW2F7L2-C-R1HXDv.js → cynefin-VYW2F7L2-DN4emAQv.js} +1 -1
  502. package/dist/domains/dashboard/web/assets/{dagre-BM42HDAG-BH8d-C9z.js → dagre-BM42HDAG-BpSzbk_V.js} +1 -1
  503. package/dist/domains/dashboard/web/assets/demo-BuVau32v.js +25 -0
  504. package/dist/domains/dashboard/web/assets/{diagram-2AECGRRQ-DpXTgQIH.js → diagram-2AECGRRQ-CfXwGGpQ.js} +1 -1
  505. package/dist/domains/dashboard/web/assets/{diagram-5GNKFQAL-DSiFJzSw.js → diagram-5GNKFQAL-DMp0Zmot.js} +1 -1
  506. package/dist/domains/dashboard/web/assets/{diagram-KO2AKTUF-DULMkben.js → diagram-KO2AKTUF-C7ZvofsM.js} +1 -1
  507. package/dist/domains/dashboard/web/assets/{diagram-LMA3HP47-Pi8m_NO9.js → diagram-LMA3HP47-BjmxFnap.js} +1 -1
  508. package/dist/domains/dashboard/web/assets/{diagram-OG6HWLK6-BSe6bCWm.js → diagram-OG6HWLK6-DFBG1Iqy.js} +1 -1
  509. package/dist/domains/dashboard/web/assets/{erDiagram-TEJ5UH35-zb-FEcbq.js → erDiagram-TEJ5UH35-MpNT7dzt.js} +1 -1
  510. package/dist/domains/dashboard/web/assets/{flowDiagram-I6XJVG4X-Dr-Gk0z2.js → flowDiagram-I6XJVG4X-_1wAR6c1.js} +1 -1
  511. package/dist/domains/dashboard/web/assets/{ganttDiagram-6RSMTGT7-qs6Zb2A6.js → ganttDiagram-6RSMTGT7-DJKjDeWl.js} +1 -1
  512. package/dist/domains/dashboard/web/assets/{gitGraphDiagram-PVQCEYII-BQ314orT.js → gitGraphDiagram-PVQCEYII-BL7yUEn-.js} +1 -1
  513. package/dist/domains/dashboard/web/assets/index-CjE9mHGb.js +24 -0
  514. package/dist/domains/dashboard/web/assets/index-D-AGxvI4.css +1 -0
  515. package/dist/domains/dashboard/web/assets/{infoDiagram-5YYISTIA-O0bQp98A.js → infoDiagram-5YYISTIA-Bt5fqrOd.js} +1 -1
  516. package/dist/domains/dashboard/web/assets/{ishikawaDiagram-YF4QCWOH-BPC7wbKh.js → ishikawaDiagram-YF4QCWOH-COCMcjBM.js} +1 -1
  517. package/dist/domains/dashboard/web/assets/{journeyDiagram-JHISSGLW-ohViOd4b.js → journeyDiagram-JHISSGLW-DGcpcWny.js} +1 -1
  518. package/dist/domains/dashboard/web/assets/{kanban-definition-UN3LZRKU-CHleNdbG.js → kanban-definition-UN3LZRKU-QSBNsWMP.js} +1 -1
  519. package/dist/domains/dashboard/web/assets/{linear-CyqiW--Q.js → linear-9uyeeBZf.js} +1 -1
  520. package/dist/domains/dashboard/web/assets/{mermaid.core-qS9XvtaK.js → mermaid.core-CkNdB471.js} +4 -4
  521. package/dist/domains/dashboard/web/assets/{mindmap-definition-RKZ34NQL-oaGkqO9l.js → mindmap-definition-RKZ34NQL-CiNxI0gP.js} +1 -1
  522. package/dist/domains/dashboard/web/assets/{pieDiagram-4H26LBE5-CPcB-AFh.js → pieDiagram-4H26LBE5-BLJ6QnRO.js} +1 -1
  523. package/dist/domains/dashboard/web/assets/{quadrantDiagram-W4KKPZXB-LFy52Qtj.js → quadrantDiagram-W4KKPZXB-CflW-eFH.js} +1 -1
  524. package/dist/domains/dashboard/web/assets/{requirementDiagram-4Y6WPE33-BdjeaYP_.js → requirementDiagram-4Y6WPE33-B9HLmRWH.js} +1 -1
  525. package/dist/domains/dashboard/web/assets/{sankeyDiagram-5OEKKPKP-DDJ4styL.js → sankeyDiagram-5OEKKPKP-6xnco5k5.js} +1 -1
  526. package/dist/domains/dashboard/web/assets/{sequenceDiagram-3UESZ5HK-BL5bFNoz.js → sequenceDiagram-3UESZ5HK-Dp1rujNZ.js} +1 -1
  527. package/dist/domains/dashboard/web/assets/{stateDiagram-AJRCARHV-BNUfikui.js → stateDiagram-AJRCARHV-C1Xc90ek.js} +1 -1
  528. package/dist/domains/dashboard/web/assets/stateDiagram-v2-BHNVJYJU-p-qmzXyE.js +1 -0
  529. package/dist/domains/dashboard/web/assets/{timeline-definition-PNZ67QCA--ps2uu6L.js → timeline-definition-PNZ67QCA-g9s-m5Z4.js} +1 -1
  530. package/dist/domains/dashboard/web/assets/{vennDiagram-CIIHVFJN-C2q8q26c.js → vennDiagram-CIIHVFJN-rkEyhyCc.js} +1 -1
  531. package/dist/domains/dashboard/web/assets/{wardleyDiagram-YWT4CUSO-BUH9gXqd.js → wardleyDiagram-YWT4CUSO-CJLrWGXc.js} +1 -1
  532. package/dist/domains/dashboard/web/assets/{xychartDiagram-2RQKCTM6-B-DielEy.js → xychartDiagram-2RQKCTM6-BxJvPNqo.js} +1 -1
  533. package/dist/domains/dashboard/web/index.html +2 -2
  534. package/dist/domains/engine/storage-layout.d.ts +14 -0
  535. package/dist/domains/engine/storage-layout.d.ts.map +1 -0
  536. package/dist/domains/engine/storage-layout.js +32 -0
  537. package/dist/domains/engine/storage-layout.js.map +1 -0
  538. package/dist/domains/engine/storage-run.d.ts +9 -0
  539. package/dist/domains/engine/storage-run.d.ts.map +1 -0
  540. package/dist/domains/engine/storage-run.js +116 -0
  541. package/dist/domains/engine/storage-run.js.map +1 -0
  542. package/dist/domains/factory/package.d.ts.map +1 -1
  543. package/dist/domains/factory/package.js +5 -3
  544. package/dist/domains/factory/package.js.map +1 -1
  545. package/dist/domains/integrations/openspec.d.ts.map +1 -1
  546. package/dist/domains/integrations/openspec.js +8 -6
  547. package/dist/domains/integrations/openspec.js.map +1 -1
  548. package/dist/domains/skill/find.d.ts.map +1 -1
  549. package/dist/domains/skill/find.js +7 -1
  550. package/dist/domains/skill/find.js.map +1 -1
  551. package/dist/domains/skill/platform-inspect.d.ts +6 -2
  552. package/dist/domains/skill/platform-inspect.d.ts.map +1 -1
  553. package/dist/domains/skill/platform-inspect.js +52 -8
  554. package/dist/domains/skill/platform-inspect.js.map +1 -1
  555. package/dist/domains/skill/platform-install.d.ts +18 -7
  556. package/dist/domains/skill/platform-install.d.ts.map +1 -1
  557. package/dist/domains/skill/platform-install.js +338 -71
  558. package/dist/domains/skill/platform-install.js.map +1 -1
  559. package/dist/domains/skill/project-instructions.d.ts.map +1 -1
  560. package/dist/domains/skill/project-instructions.js +12 -6
  561. package/dist/domains/skill/project-instructions.js.map +1 -1
  562. package/dist/domains/skill/uninstall.d.ts.map +1 -1
  563. package/dist/domains/skill/uninstall.js +15 -3
  564. package/dist/domains/skill/uninstall.js.map +1 -1
  565. package/dist/domains/workflow-contract/builtins.d.ts +6 -0
  566. package/dist/domains/workflow-contract/builtins.d.ts.map +1 -1
  567. package/dist/domains/workflow-contract/builtins.js +137 -0
  568. package/dist/domains/workflow-contract/builtins.js.map +1 -1
  569. package/dist/domains/workflow-contract/index.d.ts +3 -1
  570. package/dist/domains/workflow-contract/index.d.ts.map +1 -1
  571. package/dist/domains/workflow-contract/index.js +2 -1
  572. package/dist/domains/workflow-contract/index.js.map +1 -1
  573. package/dist/domains/workflow-contract/normalize.d.ts.map +1 -1
  574. package/dist/domains/workflow-contract/normalize.js +28 -10
  575. package/dist/domains/workflow-contract/normalize.js.map +1 -1
  576. package/dist/domains/workflow-contract/project-config.d.ts +7 -0
  577. package/dist/domains/workflow-contract/project-config.d.ts.map +1 -0
  578. package/dist/domains/workflow-contract/project-config.js +110 -0
  579. package/dist/domains/workflow-contract/project-config.js.map +1 -0
  580. package/dist/domains/workflow-contract/types.d.ts +4 -2
  581. package/dist/domains/workflow-contract/types.d.ts.map +1 -1
  582. package/dist/domains/workflow-contract/validation.d.ts.map +1 -1
  583. package/dist/domains/workflow-contract/validation.js +14 -5
  584. package/dist/domains/workflow-contract/validation.js.map +1 -1
  585. package/dist/platform/install/detect.d.ts +3 -1
  586. package/dist/platform/install/detect.d.ts.map +1 -1
  587. package/dist/platform/install/detect.js +4 -1
  588. package/dist/platform/install/detect.js.map +1 -1
  589. package/dist/platform/install/project-registry.js +2 -2
  590. package/dist/platform/install/project-registry.js.map +1 -1
  591. package/dist/platform/paths/repository-layout.d.ts +16 -0
  592. package/dist/platform/paths/repository-layout.d.ts.map +1 -1
  593. package/dist/platform/paths/repository-layout.js.map +1 -1
  594. package/eval/local/README.md +50 -0
  595. package/eval/local/scripts/compare_baselines.py +127 -1
  596. package/eval/local/scripts/regression_check.py +3 -4
  597. package/eval/local/tasks/comet-native-clarification/environment/Dockerfile +27 -0
  598. package/eval/local/tasks/comet-native-clarification/environment/test_wordcount.py +25 -0
  599. package/eval/local/tasks/comet-native-clarification/environment/wordcount.py +36 -0
  600. package/eval/local/tasks/comet-native-clarification/instruction.md +7 -0
  601. package/eval/local/tasks/comet-native-clarification/task.toml +40 -0
  602. package/eval/local/tasks/comet-native-clarification/validation/test_native_clarification.py +193 -0
  603. package/eval/local/tasks/comet-native-clarification-modes/environment/Dockerfile +27 -0
  604. package/eval/local/tasks/comet-native-clarification-modes/environment/test_wordcount.py +25 -0
  605. package/eval/local/tasks/comet-native-clarification-modes/environment/wordcount.py +36 -0
  606. package/eval/local/tasks/comet-native-clarification-modes/instruction.md +13 -0
  607. package/eval/local/tasks/comet-native-clarification-modes/task.toml +39 -0
  608. package/eval/local/tasks/comet-native-clarification-modes/validation/test_native_clarification_modes.py +235 -0
  609. package/eval/local/tasks/comet-native-interrupted-transition/environment/.comet/config.yaml +6 -0
  610. package/eval/local/tasks/comet-native-interrupted-transition/environment/Dockerfile +28 -0
  611. package/eval/local/tasks/comet-native-interrupted-transition/environment/docs/comet/changes/add-character-counting/brief.md +17 -0
  612. package/eval/local/tasks/comet-native-interrupted-transition/environment/docs/comet/changes/add-character-counting/comet-state.yaml +12 -0
  613. package/eval/local/tasks/comet-native-interrupted-transition/environment/docs/comet/changes/add-character-counting/runtime/transition.json +69 -0
  614. package/eval/local/tasks/comet-native-interrupted-transition/environment/docs/comet/changes/add-character-counting/specs/character-counting/spec.md +3 -0
  615. package/eval/local/tasks/comet-native-interrupted-transition/environment/test_wordcount.py +20 -0
  616. package/eval/local/tasks/comet-native-interrupted-transition/environment/wordcount.py +27 -0
  617. package/eval/local/tasks/comet-native-interrupted-transition/instruction.md +7 -0
  618. package/eval/local/tasks/comet-native-interrupted-transition/task.toml +35 -0
  619. package/eval/local/tasks/comet-native-interrupted-transition/validation/test_native_interrupted_transition.py +63 -0
  620. package/eval/local/tasks/comet-native-repository-fact/environment/Dockerfile +26 -0
  621. package/eval/local/tasks/comet-native-repository-fact/environment/PRODUCT_RULES.md +3 -0
  622. package/eval/local/tasks/comet-native-repository-fact/environment/test_wordcount.py +20 -0
  623. package/eval/local/tasks/comet-native-repository-fact/environment/wordcount.py +27 -0
  624. package/eval/local/tasks/comet-native-repository-fact/instruction.md +7 -0
  625. package/eval/local/tasks/comet-native-repository-fact/task.toml +35 -0
  626. package/eval/local/tasks/comet-native-repository-fact/validation/test_native_repository_fact.py +53 -0
  627. package/eval/local/tasks/comet-native-wave-b-decision-resume/environment/Dockerfile +27 -0
  628. package/eval/local/tasks/comet-native-wave-b-decision-resume/environment/test_wordcount.py +27 -0
  629. package/eval/local/tasks/comet-native-wave-b-decision-resume/environment/wordcount.py +36 -0
  630. package/eval/local/tasks/comet-native-wave-b-decision-resume/instruction.md +9 -0
  631. package/eval/local/tasks/comet-native-wave-b-decision-resume/task.toml +40 -0
  632. package/eval/local/tasks/comet-native-wave-b-decision-resume/validation/test_native_wave_b_decision_resume.py +208 -0
  633. package/eval/local/tasks/comet-native-wave-c-verification-integrity/environment/Dockerfile +27 -0
  634. package/eval/local/tasks/comet-native-wave-c-verification-integrity/environment/test_wordcount.py +27 -0
  635. package/eval/local/tasks/comet-native-wave-c-verification-integrity/environment/wordcount.py +36 -0
  636. package/eval/local/tasks/comet-native-wave-c-verification-integrity/instruction.md +11 -0
  637. package/eval/local/tasks/comet-native-wave-c-verification-integrity/task.toml +36 -0
  638. package/eval/local/tasks/comet-native-wave-c-verification-integrity/validation/test_native_wave_c_verification_integrity.py +344 -0
  639. package/eval/local/tasks/comet-native-wave-d-stagnation-stop/environment/Dockerfile +27 -0
  640. package/eval/local/tasks/comet-native-wave-d-stagnation-stop/environment/test_wordcount.py +27 -0
  641. package/eval/local/tasks/comet-native-wave-d-stagnation-stop/environment/wordcount.py +36 -0
  642. package/eval/local/tasks/comet-native-wave-d-stagnation-stop/instruction.md +11 -0
  643. package/eval/local/tasks/comet-native-wave-d-stagnation-stop/task.toml +37 -0
  644. package/eval/local/tasks/comet-native-wave-d-stagnation-stop/validation/test_native_wave_d_stagnation_stop.py +284 -0
  645. package/eval/local/tasks/comet-native-wave-e-parallel-safety/environment/.include-trusted-native-runtime +1 -0
  646. package/eval/local/tasks/comet-native-wave-e-parallel-safety/environment/Dockerfile +27 -0
  647. package/eval/local/tasks/comet-native-wave-e-parallel-safety/environment/test_wordcount.py +27 -0
  648. package/eval/local/tasks/comet-native-wave-e-parallel-safety/environment/wordcount.py +36 -0
  649. package/eval/local/tasks/comet-native-wave-e-parallel-safety/instruction.md +9 -0
  650. package/eval/local/tasks/comet-native-wave-e-parallel-safety/task.toml +37 -0
  651. package/eval/local/tasks/comet-native-wave-e-parallel-safety/validation/test_native_wave_e_parallel_safety.py +309 -0
  652. package/eval/local/tasks/comet-native-wave-f-dashboard-readonly/environment/.include-current-comet-cli +1 -0
  653. package/eval/local/tasks/comet-native-wave-f-dashboard-readonly/environment/Dockerfile +31 -0
  654. package/eval/local/tasks/comet-native-wave-f-dashboard-readonly/environment/current-comet-package.json +18 -0
  655. package/eval/local/tasks/comet-native-wave-f-dashboard-readonly/environment/current-comet.sh +14 -0
  656. package/eval/local/tasks/comet-native-wave-f-dashboard-readonly/environment/test_wordcount.py +27 -0
  657. package/eval/local/tasks/comet-native-wave-f-dashboard-readonly/environment/wordcount.py +36 -0
  658. package/eval/local/tasks/comet-native-wave-f-dashboard-readonly/instruction.md +7 -0
  659. package/eval/local/tasks/comet-native-wave-f-dashboard-readonly/task.toml +36 -0
  660. package/eval/local/tasks/comet-native-wave-f-dashboard-readonly/validation/test_native_wave_f_dashboard_readonly.py +469 -0
  661. package/eval/local/tasks/comet-native-workflow/environment/Dockerfile +27 -0
  662. package/eval/local/tasks/comet-native-workflow/environment/test_wordcount.py +25 -0
  663. package/eval/local/tasks/comet-native-workflow/environment/wordcount.py +36 -0
  664. package/eval/local/tasks/comet-native-workflow/instruction.md +14 -0
  665. package/eval/local/tasks/comet-native-workflow/task.toml +36 -0
  666. package/eval/local/tasks/comet-native-workflow/validation/test_native_workflow.py +149 -0
  667. package/eval/local/tasks/index.yaml +61 -0
  668. package/eval/local/tests/conftest.py +407 -22
  669. package/eval/local/tests/scaffold/test_aligned_comparison.py +1012 -0
  670. package/eval/local/tests/scaffold/test_conftest_helpers.py +187 -7
  671. package/eval/local/tests/scaffold/test_logging.py +135 -1
  672. package/eval/local/tests/scaffold/test_manifests.py +2 -0
  673. package/eval/local/tests/scaffold/test_native_aligned_eval.py +346 -0
  674. package/eval/local/tests/scaffold/test_native_wave_evaluations.py +1889 -0
  675. package/eval/local/tests/scaffold/test_profiles.py +33 -0
  676. package/eval/local/tests/scaffold/test_sample_quality.py +57 -0
  677. package/eval/local/tests/scaffold/test_tasks.py +377 -1
  678. package/eval/local/tests/scaffold/test_treatments.py +59 -13
  679. package/eval/local/tests/scaffold/test_utils.py +277 -4
  680. package/eval/local/tests/tasks/__init__.py +1 -0
  681. package/eval/local/tests/tasks/test_tasks.py +104 -78
  682. package/eval/local/tests/tasks/test_validation_scripts.py +37 -0
  683. package/eval/local/treatments/comet/comet_native_phase1.yaml +66 -0
  684. package/eval/scaffold/python/aligned_comparison.py +1631 -0
  685. package/eval/scaffold/python/generic_llm_judge.py +3 -1
  686. package/eval/scaffold/python/llm_judge.py +0 -3
  687. package/eval/scaffold/python/logging.py +115 -16
  688. package/eval/scaffold/python/manifests.py +2 -0
  689. package/eval/scaffold/python/native_eval.py +138 -0
  690. package/eval/scaffold/python/pass_at_k.py +0 -1
  691. package/eval/scaffold/python/report_outputs.py +226 -44
  692. package/eval/scaffold/python/sample_quality.py +45 -2
  693. package/eval/scaffold/python/tasks.py +11 -0
  694. package/eval/scaffold/python/utils.py +108 -20
  695. package/eval/scaffold/python/validation/__init__.py +15 -5
  696. package/eval/scaffold/python/validation/comet_workflow.py +10 -5
  697. package/eval/scaffold/python/validation/generic_rubric.py +1 -2
  698. package/eval/scaffold/python/validation/native_wave.py +2154 -0
  699. package/eval/scaffold/python/validation/native_workflow.py +252 -0
  700. package/eval/scaffold/python/validation/rubric.py +0 -2
  701. package/eval/scaffold/shell/completion-point.sh +18 -0
  702. package/eval/scaffold/shell/decision-point.sh +35 -0
  703. package/eval/scaffold/shell/docker.sh +150 -9
  704. package/eval/scaffold/shell/run-claude-loop.sh +57 -27
  705. package/package.json +19 -5
  706. package/dist/domains/dashboard/web/assets/channel-kp6Ng2JJ.js +0 -1
  707. package/dist/domains/dashboard/web/assets/classDiagram-4FO5ZUOK-yBDjgMY_.js +0 -1
  708. package/dist/domains/dashboard/web/assets/classDiagram-v2-Q7XG4LA2-yBDjgMY_.js +0 -1
  709. package/dist/domains/dashboard/web/assets/demo-DQyfozbi.js +0 -1
  710. package/dist/domains/dashboard/web/assets/index-BLAfkNTu.css +0 -1
  711. package/dist/domains/dashboard/web/assets/index-DtLUOcAW.js +0 -24
  712. package/dist/domains/dashboard/web/assets/stateDiagram-v2-BHNVJYJU-DGrsmWts.js +0 -1
  713. package/eval/.env.example +0 -52
  714. package/eval/langsmith/.env.example +0 -16
@@ -0,0 +1,1012 @@
1
+ """Regression tests for strict two-experiment Native vs 0.4.0 comparison."""
2
+
3
+ from __future__ import annotations
4
+
5
+ import hashlib
6
+ import json
7
+ from pathlib import Path
8
+ from types import SimpleNamespace
9
+
10
+ import pytest
11
+
12
+ from local.scripts.compare_baselines import main
13
+ from scaffold.python.aligned_comparison import (
14
+ CASE_MANIFEST_SCHEMA,
15
+ CASE_MANIFEST_SCHEMA_V1,
16
+ EXPECTED_CASE_MATRIX_FILENAME,
17
+ EXECUTION_IDENTITY_SCHEMA,
18
+ build_case_manifest,
19
+ build_aligned_report,
20
+ build_execution_identity,
21
+ case_manifest_payload,
22
+ expected_case_matrix_payload,
23
+ )
24
+ from scaffold.python.report_outputs import render_markdown_html
25
+
26
+
27
+ def _digest(value: str) -> str:
28
+ return "sha256:" + hashlib.sha256(value.encode()).hexdigest()
29
+
30
+
31
+ def _manifest(task: str, variant: str = "canonical") -> dict[str, str]:
32
+ components = {
33
+ "task_hash": _digest(f"{task}:task:{variant}"),
34
+ "instruction_hash": _digest(f"{task}:instruction:{variant}"),
35
+ "validator_hash": _digest(f"{task}:validator:{variant}"),
36
+ "environment_hash": _digest(f"{task}:environment:{variant}"),
37
+ "data_hash": _digest(f"{task}:data:{variant}"),
38
+ "prompt_hash": _digest(f"{task}:prompt:{variant}"),
39
+ }
40
+ payload = {
41
+ "schema": CASE_MANIFEST_SCHEMA_V1,
42
+ "task": task,
43
+ **components,
44
+ }
45
+ case_hash = (
46
+ "sha256:"
47
+ + hashlib.sha256(
48
+ json.dumps(payload, sort_keys=True, separators=(",", ":")).encode()
49
+ ).hexdigest()
50
+ )
51
+ return {**payload, "case_hash": case_hash}
52
+
53
+
54
+ def _v2_manifest_from_v1(v1: dict[str, str]) -> dict[str, object]:
55
+ execution_identity = {
56
+ "schema": EXECUTION_IDENTITY_SCHEMA,
57
+ "image_id_hash": _digest("image"),
58
+ "image_repo_digests_hash": _digest("repo-digests"),
59
+ "image_ref_hash": _digest("ref"),
60
+ "claude_tool_version_hash": _digest("tool"),
61
+ "model_selection_hash": _digest("model"),
62
+ "interaction_hash": _digest("interaction"),
63
+ "model_source": "explicit",
64
+ "interaction_mode": "auto_user",
65
+ "interaction_max_turns": "3",
66
+ }
67
+ execution_hash = _digest(json.dumps(execution_identity, sort_keys=True, separators=(",", ":")))
68
+ components = {
69
+ key: v1[key]
70
+ for key in (
71
+ "task_hash",
72
+ "instruction_hash",
73
+ "validator_hash",
74
+ "environment_hash",
75
+ "data_hash",
76
+ "prompt_hash",
77
+ )
78
+ }
79
+ components.update(
80
+ {
81
+ "runner_hash": _digest("runner"),
82
+ "controller_hash": _digest("controller"),
83
+ "execution_hash": execution_hash,
84
+ }
85
+ )
86
+ payload = {"schema": CASE_MANIFEST_SCHEMA, "task": v1["task"], **components}
87
+ return {
88
+ **payload,
89
+ "case_hash": _digest(json.dumps(payload, sort_keys=True, separators=(",", ":"))),
90
+ "execution_identity": execution_identity,
91
+ }
92
+
93
+
94
+ def _write_matrix(experiment: Path, cases: list[tuple[str, str, int]]) -> None:
95
+ experiment.mkdir(parents=True, exist_ok=True)
96
+ (experiment / EXPECTED_CASE_MATRIX_FILENAME).write_text(
97
+ json.dumps(expected_case_matrix_payload(cases), indent=2),
98
+ encoding="utf-8",
99
+ )
100
+
101
+
102
+ def _write_run(
103
+ experiment: Path,
104
+ *,
105
+ task: str,
106
+ treatment: str,
107
+ rep: int,
108
+ passed: bool,
109
+ manifest_variant: str = "canonical",
110
+ duration_ms: tuple[int, ...] | None = (1000,),
111
+ result_telemetry: dict | None = None,
112
+ ) -> None:
113
+ reports = experiment / "reports"
114
+ raw = experiment / "raw"
115
+ reports.mkdir(parents=True, exist_ok=True)
116
+ raw.mkdir(parents=True, exist_ok=True)
117
+ stem = f"{task.replace('-', '_')}_{treatment}_r{rep}_rep1"
118
+ stdout = raw / f"{stem}_stdout.json"
119
+ if duration_ms is not None:
120
+ stdout.write_text(
121
+ "\n".join(
122
+ json.dumps(
123
+ {
124
+ "type": "result",
125
+ "duration_ms": duration,
126
+ **(result_telemetry or {}),
127
+ }
128
+ )
129
+ for duration in duration_ms
130
+ ),
131
+ encoding="utf-8",
132
+ )
133
+ report = {
134
+ "name": f"{task}-{treatment}-r{rep}",
135
+ "rep": 1,
136
+ "passed": passed,
137
+ "checks_passed": [],
138
+ "checks_failed": [] if passed else ["validator failed"],
139
+ "sample_quality": {
140
+ "status": "included",
141
+ "reason_code": "valid_signal",
142
+ "reason": "complete",
143
+ "include_in_analysis": True,
144
+ "confidence": "high",
145
+ "evidence": ["result event present"],
146
+ },
147
+ "events_summary": {
148
+ "duration_seconds": 9999,
149
+ "case_manifest": _manifest(task, manifest_variant),
150
+ "artifact_references": {
151
+ "raw_stdout": str(stdout) if duration_ms is not None else str(stdout),
152
+ },
153
+ },
154
+ }
155
+ (reports / f"{stem}_report.json").write_text(json.dumps(report), encoding="utf-8")
156
+
157
+
158
+ def _make_experiments(tmp_path: Path) -> tuple[Path, Path, Path]:
159
+ candidate = tmp_path / "candidate"
160
+ baseline = tmp_path / "baseline"
161
+ tasks = tmp_path / "tasks"
162
+ return candidate, baseline, tasks
163
+
164
+
165
+ def test_fallback_case_manifest_never_hashes_dotenv_files(tmp_path: Path):
166
+ tasks = tmp_path / "tasks"
167
+ task = tasks / "task-a"
168
+ task.mkdir(parents=True)
169
+ (task / "task.toml").write_text('name = "task-a"\n', encoding="utf-8")
170
+ (task / "instruction.md").write_text("Do the task.\n", encoding="utf-8")
171
+ secret = task / ".envrc"
172
+ secret.write_text("TOKEN=first-secret\n", encoding="utf-8")
173
+ before = build_case_manifest("task-a", tasks)
174
+
175
+ secret.write_text("TOKEN=second-secret\n", encoding="utf-8")
176
+ after = build_case_manifest("task-a", tasks)
177
+
178
+ assert before.case_hash == after.case_hash
179
+
180
+
181
+ def test_v2_case_manifest_binds_safe_execution_identity_without_raw_configuration(
182
+ tmp_path: Path,
183
+ ):
184
+ tasks = tmp_path / "tasks"
185
+ task = tasks / "task-a"
186
+ task.mkdir(parents=True)
187
+ (task / "task.toml").write_text('name = "task-a"\n', encoding="utf-8")
188
+ (task / "instruction.md").write_text("Do the task.\n", encoding="utf-8")
189
+ runtime_image_id = "sha256:" + "1" * 64
190
+ docker_identity = {
191
+ "schema": EXECUTION_IDENTITY_SCHEMA,
192
+ "runtime_image_id": runtime_image_id,
193
+ "image_id_hash": _digest(runtime_image_id),
194
+ "image_repo_digests_hash": _digest("repo-digests"),
195
+ "image_ref_hash": _digest("build-ref"),
196
+ "claude_tool_version_hash": _digest("claude-9.9.9"),
197
+ }
198
+ interaction = SimpleNamespace(
199
+ mode="auto_user",
200
+ max_turns=7,
201
+ simulator_prompt="private simulator instruction",
202
+ decision_patterns=["private decision"],
203
+ decision_reply="private reply",
204
+ continue_prompt="private continuation",
205
+ fresh_resume_marker="private marker",
206
+ )
207
+ identity = build_execution_identity(
208
+ docker_identity,
209
+ model="private-model-alias",
210
+ model_config={"ANTHROPIC_BASE_URL": "private-routing-endpoint"},
211
+ interaction=interaction,
212
+ )
213
+ manifest = build_case_manifest("task-a", tasks, execution_identity=identity)
214
+ payload = case_manifest_payload(manifest)
215
+ serialized = json.dumps(payload, sort_keys=True)
216
+
217
+ assert payload["schema"] == CASE_MANIFEST_SCHEMA
218
+ assert payload["execution_identity"]["image_id_hash"] == _digest(runtime_image_id)
219
+ assert payload["runner_hash"].startswith("sha256:")
220
+ assert payload["controller_hash"].startswith("sha256:")
221
+ assert "runtime_image_id" not in serialized
222
+ assert "private-model-alias" not in serialized
223
+ assert "private-routing-endpoint" not in serialized
224
+ assert "private simulator instruction" not in serialized
225
+ assert "private reply" not in serialized
226
+
227
+ changed_identity = build_execution_identity(
228
+ docker_identity,
229
+ model="another-model",
230
+ model_config={"ANTHROPIC_BASE_URL": "private-routing-endpoint"},
231
+ interaction=interaction,
232
+ )
233
+ changed = build_case_manifest("task-a", tasks, execution_identity=changed_identity)
234
+ assert changed.case_hash != manifest.case_hash
235
+
236
+
237
+ def test_expected_matrix_detects_case_missing_from_both_experiments(tmp_path: Path):
238
+ candidate, baseline, tasks = _make_experiments(tmp_path)
239
+ _write_run(
240
+ candidate,
241
+ task="task-a",
242
+ treatment="COMET_NATIVE_PHASE1",
243
+ rep=1,
244
+ passed=True,
245
+ )
246
+ _write_run(
247
+ baseline,
248
+ task="task-a",
249
+ treatment="COMET_FULL_040_BETA",
250
+ rep=1,
251
+ passed=True,
252
+ )
253
+ _write_matrix(
254
+ candidate,
255
+ [
256
+ ("task-a", "COMET_NATIVE_PHASE1", 1),
257
+ ("task-b", "COMET_NATIVE_PHASE1", 1),
258
+ ("irrelevant", "CONTROL", 1),
259
+ ],
260
+ )
261
+ _write_matrix(
262
+ baseline,
263
+ [
264
+ ("task-a", "COMET_FULL_040_BETA", 1),
265
+ ("task-b", "COMET_FULL_040_BETA", 1),
266
+ ],
267
+ )
268
+
269
+ report = build_aligned_report(
270
+ candidate,
271
+ baseline,
272
+ candidate_treatment="COMET_NATIVE_PHASE1",
273
+ baseline_treatment="COMET_FULL_040_BETA",
274
+ tasks_dir=tasks,
275
+ ks=(1,),
276
+ )
277
+
278
+ assert "| 1 | 1 | 2 | 1 | 2 | 1 |" in report
279
+ assert "task-b | 1 | missing-repetition | missing candidate and baseline run" in report
280
+ assert "| Candidate | report-bound |" in report
281
+ assert "| Baseline | report-bound |" in report
282
+ assert "Expected-matrix limitation" not in report
283
+
284
+
285
+ def test_invalid_expected_matrix_fails_closed_instead_of_using_observed_runs(
286
+ tmp_path: Path,
287
+ ):
288
+ candidate, baseline, tasks = _make_experiments(tmp_path)
289
+ _write_run(
290
+ candidate,
291
+ task="task-a",
292
+ treatment="COMET_NATIVE_PHASE1",
293
+ rep=1,
294
+ passed=True,
295
+ )
296
+ _write_run(
297
+ baseline,
298
+ task="task-a",
299
+ treatment="COMET_FULL_040_BETA",
300
+ rep=1,
301
+ passed=True,
302
+ )
303
+ _write_matrix(candidate, [("task-a", "COMET_NATIVE_PHASE1", 1)])
304
+ _write_matrix(baseline, [("task-a", "COMET_FULL_040_BETA", 1)])
305
+ matrix_path = candidate / EXPECTED_CASE_MATRIX_FILENAME
306
+ tampered = json.loads(matrix_path.read_text(encoding="utf-8"))
307
+ tampered["matrix_hash"] = _digest("forged")
308
+ matrix_path.write_text(json.dumps(tampered), encoding="utf-8")
309
+
310
+ report = build_aligned_report(
311
+ candidate,
312
+ baseline,
313
+ candidate_treatment="COMET_NATIVE_PHASE1",
314
+ baseline_treatment="COMET_FULL_040_BETA",
315
+ tasks_dir=tasks,
316
+ ks=(1,),
317
+ )
318
+
319
+ assert "invalid-expected-case-matrix" in report
320
+ assert "unexpected-run" in report
321
+ assert "Invalid-matrix handling" in report
322
+ assert "observed reports are excluded" in report
323
+ assert "N/A (0/1 tasks)" in report
324
+
325
+
326
+ def test_historical_reports_disclose_expected_matrix_and_execution_limitations(
327
+ tmp_path: Path,
328
+ ):
329
+ candidate, baseline, tasks = _make_experiments(tmp_path)
330
+ _write_run(
331
+ candidate,
332
+ task="task-a",
333
+ treatment="COMET_NATIVE_PHASE1",
334
+ rep=1,
335
+ passed=True,
336
+ )
337
+ _write_run(
338
+ baseline,
339
+ task="task-a",
340
+ treatment="COMET_FULL_040_BETA",
341
+ rep=1,
342
+ passed=True,
343
+ )
344
+
345
+ report = build_aligned_report(
346
+ candidate,
347
+ baseline,
348
+ candidate_treatment="COMET_NATIVE_PHASE1",
349
+ baseline_treatment="COMET_FULL_040_BETA",
350
+ tasks_dir=tasks,
351
+ ks=(1,),
352
+ )
353
+
354
+ assert "Expected-matrix limitation" in report
355
+ assert "cannot be reconstructed or claimed as historically executed" in report
356
+ assert "Execution-identity limitation" in report
357
+ assert "must not be presented as exact historical execution identity" in report
358
+
359
+
360
+ def test_v2_run_can_compare_to_v1_by_core_hash_without_claiming_exact_identity(
361
+ tmp_path: Path,
362
+ ):
363
+ candidate, baseline, tasks = _make_experiments(tmp_path)
364
+ _write_run(
365
+ candidate,
366
+ task="task-a",
367
+ treatment="COMET_NATIVE_PHASE1",
368
+ rep=1,
369
+ passed=True,
370
+ )
371
+ _write_run(
372
+ baseline,
373
+ task="task-a",
374
+ treatment="COMET_FULL_040_BETA",
375
+ rep=1,
376
+ passed=True,
377
+ )
378
+ candidate_report = next((candidate / "reports").glob("*.json"))
379
+ candidate_payload = json.loads(candidate_report.read_text(encoding="utf-8"))
380
+ candidate_payload["events_summary"]["case_manifest"] = _v2_manifest_from_v1(_manifest("task-a"))
381
+ candidate_report.write_text(json.dumps(candidate_payload), encoding="utf-8")
382
+
383
+ report = build_aligned_report(
384
+ candidate,
385
+ baseline,
386
+ candidate_treatment="COMET_NATIVE_PHASE1",
387
+ baseline_treatment="COMET_FULL_040_BETA",
388
+ tasks_dir=tasks,
389
+ ks=(1,),
390
+ )
391
+
392
+ assert "| 1 | 1 | 1 | 1 | 1 | 0 |" in report
393
+ assert "Execution-identity limitation: 1 run record" in report
394
+
395
+
396
+ def test_task_macro_pass_at_3_does_not_pool_runs_across_tasks(tmp_path: Path):
397
+ candidate, baseline, tasks = _make_experiments(tmp_path)
398
+ for index in range(16):
399
+ task = f"task-{index:02d}"
400
+ candidate_passed = index < 8
401
+ for rep in (1, 2, 3):
402
+ _write_run(
403
+ candidate,
404
+ task=task,
405
+ treatment="COMET_NATIVE_PHASE1",
406
+ rep=rep,
407
+ passed=candidate_passed,
408
+ )
409
+ _write_run(
410
+ baseline,
411
+ task=task,
412
+ treatment="COMET_FULL_040_BETA",
413
+ rep=rep,
414
+ passed=True,
415
+ )
416
+
417
+ report = build_aligned_report(
418
+ candidate,
419
+ baseline,
420
+ candidate_treatment="COMET_NATIVE_PHASE1",
421
+ baseline_treatment="COMET_FULL_040_BETA",
422
+ tasks_dir=tasks,
423
+ )
424
+
425
+ native_pass_at = next(
426
+ line for line in report.splitlines() if "COMET_NATIVE_PHASE1 | pass@k" in line
427
+ )
428
+ assert "0.50 (16/16 tasks)" in native_pass_at
429
+ assert "0.88" not in native_pass_at
430
+ assert "COMET_FULL_040_BETA | pass@k | 1.00" in report
431
+ assert str(candidate) not in report
432
+ assert str(baseline) not in report
433
+ assert f"from `{candidate.name}`" in report
434
+ assert f"from `{baseline.name}`" in report
435
+
436
+
437
+ def test_missing_rep_is_coverage_loss_without_lowering_k(tmp_path: Path):
438
+ candidate, baseline, tasks = _make_experiments(tmp_path)
439
+ for rep in (1, 2):
440
+ _write_run(
441
+ candidate,
442
+ task="task-a",
443
+ treatment="COMET_NATIVE_PHASE1",
444
+ rep=rep,
445
+ passed=True,
446
+ )
447
+ for rep in (1, 2, 3):
448
+ _write_run(
449
+ baseline,
450
+ task="task-a",
451
+ treatment="COMET_FULL_040_BETA",
452
+ rep=rep,
453
+ passed=True,
454
+ )
455
+
456
+ report = build_aligned_report(
457
+ candidate,
458
+ baseline,
459
+ candidate_treatment="COMET_NATIVE_PHASE1",
460
+ baseline_treatment="COMET_FULL_040_BETA",
461
+ tasks_dir=tasks,
462
+ ks=(1, 2, 3),
463
+ )
464
+
465
+ native_pass_at = next(
466
+ line for line in report.splitlines() if "COMET_NATIVE_PHASE1 | pass@k" in line
467
+ )
468
+ assert "N/A (0/1 tasks)" in native_pass_at
469
+ assert "missing-repetition" in report
470
+ assert "task-a | 3 | missing-repetition | missing candidate run" in report
471
+ assert "k is never reduced" in report
472
+
473
+
474
+ def test_combined_experiment_sample_number_is_the_repetition_identity(tmp_path: Path):
475
+ candidate, baseline, tasks = _make_experiments(tmp_path)
476
+ _write_run(
477
+ candidate,
478
+ task="task-a",
479
+ treatment="COMET_NATIVE_PHASE1",
480
+ rep=3,
481
+ passed=True,
482
+ )
483
+ _write_run(
484
+ baseline,
485
+ task="task-a",
486
+ treatment="COMET_FULL_040_BETA",
487
+ rep=1,
488
+ passed=True,
489
+ )
490
+ baseline_report = next((baseline / "reports").glob("*.json"))
491
+ combined_name = (
492
+ baseline / "reports" / "task_a_COMET_FULL_040_BETA_sample3_from_experiment_previous.json"
493
+ )
494
+ baseline_report.rename(combined_name)
495
+
496
+ report = build_aligned_report(
497
+ candidate,
498
+ baseline,
499
+ candidate_treatment="COMET_NATIVE_PHASE1",
500
+ baseline_treatment="COMET_FULL_040_BETA",
501
+ tasks_dir=tasks,
502
+ ks=(1,),
503
+ )
504
+
505
+ assert "| 1 | 1 | 1 | 1 | 1 | 0 |" in report
506
+ assert "| task-a | 3 | 1/1 | 1/1 |" in report
507
+
508
+
509
+ def test_combined_experiment_duration_is_bound_to_named_source_experiment(tmp_path: Path):
510
+ candidate, combined, tasks = _make_experiments(tmp_path)
511
+ source = tmp_path / "experiment_source"
512
+ _write_run(
513
+ candidate,
514
+ task="task-a",
515
+ treatment="COMET_NATIVE_PHASE1",
516
+ rep=1,
517
+ passed=True,
518
+ )
519
+ _write_run(
520
+ source,
521
+ task="task-a",
522
+ treatment="COMET_FULL_040_BETA",
523
+ rep=1,
524
+ passed=True,
525
+ )
526
+ combined_reports = combined / "reports"
527
+ combined_reports.mkdir(parents=True)
528
+ source_report = next((source / "reports").glob("*.json"))
529
+ combined_report = combined_reports / (
530
+ "task_a_COMET_FULL_040_BETA_sample1_from_experiment_source.json"
531
+ )
532
+ source_report.rename(combined_report)
533
+
534
+ report = build_aligned_report(
535
+ candidate,
536
+ combined,
537
+ candidate_treatment="COMET_NATIVE_PHASE1",
538
+ baseline_treatment="COMET_FULL_040_BETA",
539
+ tasks_dir=tasks,
540
+ ks=(1,),
541
+ )
542
+
543
+ assert "| COMET_FULL_040_BETA | 1 | 1/1 | 1s | 1s |" in report
544
+
545
+ wrong_source = combined_reports / (
546
+ "task_a_COMET_FULL_040_BETA_sample1_from_experiment_wrong.json"
547
+ )
548
+ combined_report.rename(wrong_source)
549
+ report = build_aligned_report(
550
+ candidate,
551
+ combined,
552
+ candidate_treatment="COMET_NATIVE_PHASE1",
553
+ baseline_treatment="COMET_FULL_040_BETA",
554
+ tasks_dir=tasks,
555
+ ks=(1,),
556
+ )
557
+ assert "| COMET_FULL_040_BETA | 1 | 0/1 | N/A | N/A |" in report
558
+
559
+
560
+ def test_case_hash_mismatch_is_not_compared(tmp_path: Path):
561
+ candidate, baseline, tasks = _make_experiments(tmp_path)
562
+ _write_run(
563
+ candidate,
564
+ task="task-a",
565
+ treatment="COMET_NATIVE_PHASE1",
566
+ rep=1,
567
+ passed=True,
568
+ manifest_variant="candidate",
569
+ )
570
+ _write_run(
571
+ baseline,
572
+ task="task-a",
573
+ treatment="COMET_FULL_040_BETA",
574
+ rep=1,
575
+ passed=True,
576
+ manifest_variant="baseline",
577
+ )
578
+
579
+ report = build_aligned_report(
580
+ candidate,
581
+ baseline,
582
+ candidate_treatment="COMET_NATIVE_PHASE1",
583
+ baseline_treatment="COMET_FULL_040_BETA",
584
+ tasks_dir=tasks,
585
+ )
586
+
587
+ assert "Strictly matched pairs | Tasks | Issues" in report
588
+ assert "| 1 | 1 | 1 | 0 | 1 | 1 |" in report
589
+ assert "case-hash-mismatch" in report
590
+ assert "N/A (0/1 tasks)" in report
591
+
592
+
593
+ def test_invalid_embedded_case_manifest_fails_closed(tmp_path: Path):
594
+ candidate, baseline, tasks = _make_experiments(tmp_path)
595
+ for experiment, treatment in (
596
+ (candidate, "COMET_NATIVE_PHASE1"),
597
+ (baseline, "COMET_FULL_040_BETA"),
598
+ ):
599
+ _write_run(
600
+ experiment,
601
+ task="task-a",
602
+ treatment=treatment,
603
+ rep=1,
604
+ passed=True,
605
+ )
606
+ baseline_report = next((baseline / "reports").glob("*.json"))
607
+ payload = json.loads(baseline_report.read_text(encoding="utf-8"))
608
+ payload["events_summary"]["case_manifest"]["case_hash"] = _digest("forged")
609
+ baseline_report.write_text(json.dumps(payload), encoding="utf-8")
610
+
611
+ report = build_aligned_report(
612
+ candidate,
613
+ baseline,
614
+ candidate_treatment="COMET_NATIVE_PHASE1",
615
+ baseline_treatment="COMET_FULL_040_BETA",
616
+ tasks_dir=tasks,
617
+ ks=(1,),
618
+ )
619
+
620
+ assert "invalid-case-manifest" in report
621
+ assert "| 1 | 1 | 1 | 0 | 1 | 1 |" in report
622
+
623
+
624
+ def test_duration_is_recomputed_from_raw_stdout_with_explicit_coverage(tmp_path: Path):
625
+ candidate, baseline, tasks = _make_experiments(tmp_path)
626
+ for rep, duration in ((1, (1000, 2000)), (2, (4000,)), (3, None)):
627
+ _write_run(
628
+ candidate,
629
+ task="task-a",
630
+ treatment="COMET_NATIVE_PHASE1",
631
+ rep=rep,
632
+ passed=True,
633
+ duration_ms=duration,
634
+ )
635
+ _write_run(
636
+ baseline,
637
+ task="task-a",
638
+ treatment="COMET_FULL_040_BETA",
639
+ rep=rep,
640
+ passed=True,
641
+ duration_ms=(1000,),
642
+ )
643
+
644
+ report = build_aligned_report(
645
+ candidate,
646
+ baseline,
647
+ candidate_treatment="COMET_NATIVE_PHASE1",
648
+ baseline_treatment="COMET_FULL_040_BETA",
649
+ tasks_dir=tasks,
650
+ )
651
+
652
+ assert "| COMET_NATIVE_PHASE1 | 3 | 2/3 | 7s | 4s | raw_stdout:extract_events |" in report
653
+ assert "| COMET_FULL_040_BETA | 3 | 3/3 | 3s | 1s | raw_stdout:extract_events |" in report
654
+ assert "9999" not in report
655
+ assert "Stored historical duration fields are not mixed" in report
656
+ assert "COMET_NATIVE_PHASE1 missing raw duration: `task-a#r3`" in report
657
+
658
+
659
+ def test_aligned_report_compares_cumulative_success_efficiency(tmp_path: Path):
660
+ candidate, baseline, tasks = _make_experiments(tmp_path)
661
+ _write_run(
662
+ candidate,
663
+ task="task-a",
664
+ treatment="COMET_NATIVE_PHASE1",
665
+ rep=1,
666
+ passed=True,
667
+ result_telemetry={
668
+ "num_turns": 4,
669
+ "usage": {"input_tokens": 100, "output_tokens": 20},
670
+ "total_cost_usd": 0.1,
671
+ },
672
+ )
673
+ _write_run(
674
+ baseline,
675
+ task="task-a",
676
+ treatment="COMET_FULL_040_BETA",
677
+ rep=1,
678
+ passed=True,
679
+ result_telemetry={
680
+ "num_turns": 8,
681
+ "usage": {"input_tokens": 200, "output_tokens": 40},
682
+ "total_cost_usd": 0.2,
683
+ },
684
+ )
685
+
686
+ report = build_aligned_report(
687
+ candidate,
688
+ baseline,
689
+ candidate_treatment="COMET_NATIVE_PHASE1",
690
+ baseline_treatment="COMET_FULL_040_BETA",
691
+ tasks_dir=tasks,
692
+ )
693
+
694
+ assert "## Paired task efficiency from raw stdout" in report
695
+ assert "### Strict-success intersection (1 paired runs)" in report
696
+ assert "| Agent turns | 1/1 | 4.00 | 8.00 | 50.0% less |" in report
697
+ assert "| Total tokens incl. cache | 1/1 | 120 | 240 | 50.0% less |" in report
698
+ html = render_markdown_html(report, title="Comet Aligned Experiment Comparison Report")
699
+ assert "Model starts/resumes" in html
700
+ assert "模型启动/恢复次数" in html
701
+ assert "Total tokens incl. cache" in html
702
+ zh = html.split('<section class="localized" data-locale="zh"', 1)[1].split(
703
+ '<section class="localized" data-locale="en"',
704
+ 1,
705
+ )[0]
706
+ assert "Comet 对齐实验对比报告" in zh
707
+ assert "对齐规则" in zh
708
+ assert "对齐摘要" in zh
709
+ assert "候选模式平均值" in zh
710
+ assert "已剔除的数据" in zh
711
+ assert "Alignment contract" not in zh
712
+ assert "Candidate average" not in zh
713
+
714
+
715
+ def test_aligned_report_excludes_raw_stdout_without_a_result_event(tmp_path: Path):
716
+ candidate, baseline, tasks = _make_experiments(tmp_path)
717
+ _write_run(
718
+ candidate,
719
+ task="task-a",
720
+ treatment="COMET_NATIVE_PHASE1",
721
+ rep=1,
722
+ passed=True,
723
+ duration_ms=None,
724
+ )
725
+ _write_run(
726
+ baseline,
727
+ task="task-a",
728
+ treatment="COMET_FULL_040_BETA",
729
+ rep=1,
730
+ passed=True,
731
+ )
732
+
733
+ report = build_aligned_report(
734
+ candidate,
735
+ baseline,
736
+ candidate_treatment="COMET_NATIVE_PHASE1",
737
+ baseline_treatment="COMET_FULL_040_BETA",
738
+ tasks_dir=tasks,
739
+ )
740
+
741
+ assert "| Model starts/resumes | 0/1 | N/A | N/A | N/A |" in report
742
+
743
+
744
+ def test_duration_rejects_a_raw_artifact_from_another_task(tmp_path: Path):
745
+ candidate, baseline, tasks = _make_experiments(tmp_path)
746
+ for task in ("task-a", "task-b"):
747
+ _write_run(
748
+ candidate,
749
+ task=task,
750
+ treatment="COMET_NATIVE_PHASE1",
751
+ rep=1,
752
+ passed=True,
753
+ )
754
+ _write_run(
755
+ baseline,
756
+ task=task,
757
+ treatment="COMET_FULL_040_BETA",
758
+ rep=1,
759
+ passed=True,
760
+ )
761
+ reports = sorted((candidate / "reports").glob("*.json"))
762
+ task_a = next(path for path in reports if "task_a_" in path.name)
763
+ task_b = next(path for path in reports if "task_b_" in path.name)
764
+ task_a_payload = json.loads(task_a.read_text(encoding="utf-8"))
765
+ task_b_payload = json.loads(task_b.read_text(encoding="utf-8"))
766
+ task_a_payload["events_summary"]["artifact_references"]["raw_stdout"] = task_b_payload[
767
+ "events_summary"
768
+ ]["artifact_references"]["raw_stdout"]
769
+ task_a.write_text(json.dumps(task_a_payload), encoding="utf-8")
770
+
771
+ report = build_aligned_report(
772
+ candidate,
773
+ baseline,
774
+ candidate_treatment="COMET_NATIVE_PHASE1",
775
+ baseline_treatment="COMET_FULL_040_BETA",
776
+ tasks_dir=tasks,
777
+ ks=(1,),
778
+ )
779
+
780
+ assert "| COMET_NATIVE_PHASE1 | 2 | 1/2 |" in report
781
+ assert "COMET_NATIVE_PHASE1 missing raw duration: `task-a#r1`" in report
782
+
783
+
784
+ def test_duration_rejects_a_raw_artifact_from_another_repetition(tmp_path: Path):
785
+ candidate, baseline, tasks = _make_experiments(tmp_path)
786
+ for rep in (1, 2):
787
+ _write_run(
788
+ candidate,
789
+ task="task-a",
790
+ treatment="COMET_NATIVE_PHASE1",
791
+ rep=rep,
792
+ passed=True,
793
+ )
794
+ _write_run(
795
+ baseline,
796
+ task="task-a",
797
+ treatment="COMET_FULL_040_BETA",
798
+ rep=rep,
799
+ passed=True,
800
+ )
801
+ reports = sorted((candidate / "reports").glob("*.json"))
802
+ rep_one = next(path for path in reports if "_r1_" in path.name)
803
+ rep_two = next(path for path in reports if "_r2_" in path.name)
804
+ rep_one_payload = json.loads(rep_one.read_text(encoding="utf-8"))
805
+ rep_two_payload = json.loads(rep_two.read_text(encoding="utf-8"))
806
+ rep_one_payload["events_summary"]["artifact_references"]["raw_stdout"] = rep_two_payload[
807
+ "events_summary"
808
+ ]["artifact_references"]["raw_stdout"]
809
+ rep_one.write_text(json.dumps(rep_one_payload), encoding="utf-8")
810
+
811
+ report = build_aligned_report(
812
+ candidate,
813
+ baseline,
814
+ candidate_treatment="COMET_NATIVE_PHASE1",
815
+ baseline_treatment="COMET_FULL_040_BETA",
816
+ tasks_dir=tasks,
817
+ ks=(1,),
818
+ )
819
+
820
+ assert "| COMET_NATIVE_PHASE1 | 2 | 1/2 |" in report
821
+ assert "COMET_NATIVE_PHASE1 missing raw duration: `task-a#r1`" in report
822
+
823
+
824
+ def test_duration_rejects_raw_stdout_outside_its_experiment(tmp_path: Path):
825
+ candidate, baseline, tasks = _make_experiments(tmp_path)
826
+ _write_run(
827
+ candidate,
828
+ task="task-a",
829
+ treatment="COMET_NATIVE_PHASE1",
830
+ rep=1,
831
+ passed=True,
832
+ )
833
+ _write_run(
834
+ baseline,
835
+ task="task-a",
836
+ treatment="COMET_FULL_040_BETA",
837
+ rep=1,
838
+ passed=True,
839
+ )
840
+ candidate_report = next((candidate / "reports").glob("*.json"))
841
+ payload = json.loads(candidate_report.read_text(encoding="utf-8"))
842
+ source = Path(payload["events_summary"]["artifact_references"]["raw_stdout"])
843
+ outside = tmp_path / "outside" / source.name
844
+ outside.parent.mkdir()
845
+ outside.write_bytes(source.read_bytes())
846
+ payload["events_summary"]["artifact_references"]["raw_stdout"] = str(outside)
847
+ candidate_report.write_text(json.dumps(payload), encoding="utf-8")
848
+
849
+ report = build_aligned_report(
850
+ candidate,
851
+ baseline,
852
+ candidate_treatment="COMET_NATIVE_PHASE1",
853
+ baseline_treatment="COMET_FULL_040_BETA",
854
+ tasks_dir=tasks,
855
+ ks=(1,),
856
+ )
857
+
858
+ assert "| COMET_NATIVE_PHASE1 | 1 | 0/1 |" in report
859
+ assert "COMET_NATIVE_PHASE1 missing raw duration: `task-a#r1`" in report
860
+
861
+
862
+ def test_duration_rejects_symlinked_raw_stdout(tmp_path: Path):
863
+ candidate, baseline, tasks = _make_experiments(tmp_path)
864
+ _write_run(
865
+ candidate,
866
+ task="task-a",
867
+ treatment="COMET_NATIVE_PHASE1",
868
+ rep=1,
869
+ passed=True,
870
+ )
871
+ _write_run(
872
+ baseline,
873
+ task="task-a",
874
+ treatment="COMET_FULL_040_BETA",
875
+ rep=1,
876
+ passed=True,
877
+ )
878
+ candidate_report = next((candidate / "reports").glob("*.json"))
879
+ payload = json.loads(candidate_report.read_text(encoding="utf-8"))
880
+ raw = Path(payload["events_summary"]["artifact_references"]["raw_stdout"])
881
+ outside = tmp_path / "outside-stdout.json"
882
+ outside.write_bytes(raw.read_bytes())
883
+ raw.unlink()
884
+ try:
885
+ raw.symlink_to(outside)
886
+ except OSError as error:
887
+ pytest.skip(f"file symlink unavailable: {error}")
888
+
889
+ report = build_aligned_report(
890
+ candidate,
891
+ baseline,
892
+ candidate_treatment="COMET_NATIVE_PHASE1",
893
+ baseline_treatment="COMET_FULL_040_BETA",
894
+ tasks_dir=tasks,
895
+ ks=(1,),
896
+ )
897
+
898
+ assert "| COMET_NATIVE_PHASE1 | 1 | 0/1 |" in report
899
+
900
+
901
+ def test_missing_checks_failed_field_fails_closed(tmp_path: Path):
902
+ candidate, baseline, tasks = _make_experiments(tmp_path)
903
+ _write_run(
904
+ candidate,
905
+ task="task-a",
906
+ treatment="COMET_NATIVE_PHASE1",
907
+ rep=1,
908
+ passed=True,
909
+ )
910
+ _write_run(
911
+ baseline,
912
+ task="task-a",
913
+ treatment="COMET_FULL_040_BETA",
914
+ rep=1,
915
+ passed=True,
916
+ )
917
+ candidate_report = next((candidate / "reports").glob("*.json"))
918
+ payload = json.loads(candidate_report.read_text(encoding="utf-8"))
919
+ payload.pop("checks_failed")
920
+ candidate_report.write_text(json.dumps(payload), encoding="utf-8")
921
+
922
+ report = build_aligned_report(
923
+ candidate,
924
+ baseline,
925
+ candidate_treatment="COMET_NATIVE_PHASE1",
926
+ baseline_treatment="COMET_FULL_040_BETA",
927
+ tasks_dir=tasks,
928
+ ks=(1,),
929
+ )
930
+
931
+ assert "| task-a | 1 | 0/1 | 1/1 |" in report
932
+
933
+
934
+ def test_cli_supports_explicit_candidate_and_baseline_experiments(
935
+ tmp_path: Path,
936
+ ):
937
+ candidate, baseline, _tasks = _make_experiments(tmp_path)
938
+ _write_run(
939
+ candidate,
940
+ task="task-a",
941
+ treatment="COMET_NATIVE_PHASE1",
942
+ rep=1,
943
+ passed=True,
944
+ )
945
+ _write_run(
946
+ baseline,
947
+ task="task-a",
948
+ treatment="COMET_FULL_040_BETA",
949
+ rep=1,
950
+ passed=True,
951
+ )
952
+ output = tmp_path / "aligned.md"
953
+
954
+ result = main(
955
+ [
956
+ "--candidate-experiment",
957
+ str(candidate),
958
+ "--baseline-experiment",
959
+ str(baseline),
960
+ "--ks",
961
+ "1,3",
962
+ "--out",
963
+ str(output),
964
+ ]
965
+ )
966
+
967
+ assert result == 0
968
+ assert output.is_file()
969
+ report = output.read_text(encoding="utf-8")
970
+ assert "COMET_NATIVE_PHASE1" in report
971
+ assert "COMET_FULL_040_BETA" in report
972
+ assert "Requested k: 1, 3" in report
973
+
974
+ chinese_output = tmp_path / "aligned-zh.md"
975
+ report_config = tmp_path / "report-config.json"
976
+ report_config.write_text(
977
+ json.dumps({"report_outputs": {"markdown": True, "html": True}}),
978
+ encoding="utf-8",
979
+ )
980
+ chinese_result = main(
981
+ [
982
+ "--candidate-experiment",
983
+ str(candidate),
984
+ "--baseline-experiment",
985
+ str(baseline),
986
+ "--ks",
987
+ "1",
988
+ "--language",
989
+ "zh",
990
+ "--report-config",
991
+ str(report_config),
992
+ "--out",
993
+ str(chinese_output),
994
+ ]
995
+ )
996
+
997
+ assert chinese_result == 0
998
+ chinese_report = chinese_output.read_text(encoding="utf-8")
999
+ assert "# Comet 对齐实验对比报告" in chinese_report
1000
+ assert "## 对齐规则" in chinese_report
1001
+ assert "## 已剔除的数据" in chinese_report
1002
+ assert "Alignment contract" not in chinese_report
1003
+ chinese_html = chinese_output.with_suffix(".html").read_text(encoding="utf-8")
1004
+ assert "<title>Comet 对齐实验对比报告</title>" in chinese_html
1005
+ zh_html = chinese_html.split('<section class="localized" data-locale="zh"', 1)[1].split(
1006
+ '<section class="localized" data-locale="en"',
1007
+ 1,
1008
+ )[0]
1009
+ en_html = chinese_html.split('<section class="localized" data-locale="en"', 1)[1]
1010
+ assert "## 对齐规则" not in zh_html
1011
+ assert "对齐规则" in zh_html
1012
+ assert "Alignment contract" in en_html