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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (1301) hide show
  1. package/LICENSE +21 -21
  2. package/README.md +279 -113
  3. package/assets/manifest.json +17 -5
  4. package/assets/skills/comet/SKILL.md +17 -256
  5. package/assets/skills/comet/reference/auto-transition.md +1 -1
  6. package/assets/skills/comet/reference/classic-layout.md +34 -0
  7. package/assets/skills/comet/reference/comet-yaml-fields.md +14 -8
  8. package/assets/skills/comet/reference/context-recovery.md +14 -4
  9. package/assets/skills/comet/reference/decision-point.md +11 -0
  10. package/assets/skills/comet/reference/file-structure.md +2 -2
  11. package/assets/skills/comet/reference/intent-frame.md +3 -3
  12. package/assets/skills/comet/reference/scripts.md +47 -15
  13. package/assets/skills/comet/reference/subagent-dispatch.md +8 -7
  14. package/assets/skills/comet/rules/comet-phase-guard.en.md +34 -31
  15. package/assets/skills/comet/rules/comet-phase-guard.md +34 -32
  16. package/assets/skills/comet/rules/comet-workflow-guard.en.md +32 -0
  17. package/assets/skills/comet/rules/comet-workflow-guard.md +32 -0
  18. package/assets/skills/comet/scripts/comet-entry-runtime.mjs +8074 -0
  19. package/assets/skills/comet/scripts/comet-hook-router.mjs +12786 -0
  20. package/assets/skills/comet/scripts/comet-resume-probe.mjs +3 -0
  21. package/assets/skills/comet/scripts/comet-runtime.mjs +10449 -4105
  22. package/assets/skills/comet-any/SKILL.md +5 -5
  23. package/assets/skills/comet-any/reference/authored-zone-example.md +10 -5
  24. package/assets/skills/comet-any/reference/authoring-subagents.md +1 -1
  25. package/assets/skills/comet-any/reference/bundle-authoring.md +2 -2
  26. package/assets/skills/comet-any/reference/subagents/pause-points-author.md +14 -11
  27. package/assets/skills/comet-any/reference/subagents/reference-author.md +1 -1
  28. package/assets/skills/comet-any/reference/subagents/script-author.md +1 -1
  29. package/assets/skills/comet-any/reference/subagents/skill-core-author.md +1 -1
  30. package/assets/skills/comet-any/reference/subagents/skill-reviewer.md +4 -2
  31. package/assets/skills/comet-any/reference/subagents/workflow-entry-author.md +8 -7
  32. package/assets/skills/comet-archive/SKILL.md +69 -26
  33. package/assets/skills/comet-build/SKILL.md +77 -58
  34. package/assets/skills/comet-classic/SKILL.md +295 -0
  35. package/assets/skills/comet-design/SKILL.md +40 -36
  36. package/assets/skills/comet-hotfix/SKILL.md +57 -35
  37. package/assets/skills/comet-native/SKILL.md +133 -0
  38. package/assets/skills/comet-native/reference/artifacts.md +141 -0
  39. package/assets/skills/comet-native/reference/clarification.md +54 -0
  40. package/assets/skills/comet-native/reference/commands.md +170 -0
  41. package/assets/skills/comet-native/reference/recovery.md +96 -0
  42. package/assets/skills/comet-native/scripts/comet-native-hook-guard.mjs +4 -0
  43. package/assets/skills/comet-native/scripts/comet-native-runtime.mjs +34468 -0
  44. package/assets/skills/comet-open/SKILL.md +119 -59
  45. package/assets/skills/comet-tweak/SKILL.md +52 -27
  46. package/assets/skills/comet-verify/SKILL.md +65 -73
  47. package/assets/skills-zh/comet/SKILL.md +17 -244
  48. package/assets/skills-zh/comet/reference/auto-transition.md +1 -1
  49. package/assets/skills-zh/comet/reference/classic-layout.md +34 -0
  50. package/assets/skills-zh/comet/reference/comet-yaml-fields.md +13 -8
  51. package/assets/skills-zh/comet/reference/context-recovery.md +14 -4
  52. package/assets/skills-zh/comet/reference/decision-point.md +11 -0
  53. package/assets/skills-zh/comet/reference/file-structure.md +2 -2
  54. package/assets/skills-zh/comet/reference/intent-frame.md +3 -3
  55. package/assets/skills-zh/comet/reference/scripts.md +47 -15
  56. package/assets/skills-zh/comet/reference/subagent-dispatch.md +8 -7
  57. package/assets/skills-zh/comet-any/SKILL.md +5 -5
  58. package/assets/skills-zh/comet-any/reference/authored-zone-example.md +10 -5
  59. package/assets/skills-zh/comet-any/reference/authoring-subagents.md +1 -1
  60. package/assets/skills-zh/comet-any/reference/bundle-authoring.md +2 -2
  61. package/assets/skills-zh/comet-any/reference/subagents/pause-points-author.md +14 -12
  62. package/assets/skills-zh/comet-any/reference/subagents/reference-author.md +1 -1
  63. package/assets/skills-zh/comet-any/reference/subagents/script-author.md +1 -1
  64. package/assets/skills-zh/comet-any/reference/subagents/skill-core-author.md +1 -1
  65. package/assets/skills-zh/comet-any/reference/subagents/skill-reviewer.md +4 -2
  66. package/assets/skills-zh/comet-any/reference/subagents/workflow-entry-author.md +8 -7
  67. package/assets/skills-zh/comet-archive/SKILL.md +69 -26
  68. package/assets/skills-zh/comet-build/SKILL.md +77 -58
  69. package/assets/skills-zh/comet-classic/SKILL.md +283 -0
  70. package/assets/skills-zh/comet-design/SKILL.md +40 -36
  71. package/assets/skills-zh/comet-hotfix/SKILL.md +56 -34
  72. package/assets/skills-zh/comet-native/SKILL.md +133 -0
  73. package/assets/skills-zh/comet-native/reference/artifacts.md +141 -0
  74. package/assets/skills-zh/comet-native/reference/clarification.md +54 -0
  75. package/assets/skills-zh/comet-native/reference/commands.md +170 -0
  76. package/assets/skills-zh/comet-native/reference/recovery.md +96 -0
  77. package/assets/skills-zh/comet-open/SKILL.md +118 -58
  78. package/assets/skills-zh/comet-tweak/SKILL.md +51 -26
  79. package/assets/skills-zh/comet-verify/SKILL.md +65 -73
  80. package/dist/app/cli/comet-banner.d.ts +25 -0
  81. package/dist/app/cli/comet-banner.d.ts.map +1 -0
  82. package/dist/app/cli/comet-banner.js +265 -0
  83. package/dist/app/cli/comet-banner.js.map +1 -0
  84. package/dist/app/cli/index.js +113 -16
  85. package/dist/app/cli/index.js.map +1 -1
  86. package/dist/app/commands/classic.d.ts +5 -0
  87. package/dist/app/commands/classic.d.ts.map +1 -0
  88. package/dist/app/commands/classic.js +32 -0
  89. package/dist/app/commands/classic.js.map +1 -0
  90. package/dist/app/commands/command-result.d.ts +6 -0
  91. package/dist/app/commands/command-result.d.ts.map +1 -0
  92. package/dist/app/commands/command-result.js +4 -0
  93. package/dist/app/commands/command-result.js.map +1 -0
  94. package/dist/app/commands/doctor.d.ts +4 -0
  95. package/dist/app/commands/doctor.d.ts.map +1 -1
  96. package/dist/app/commands/doctor.js +926 -95
  97. package/dist/app/commands/doctor.js.map +1 -1
  98. package/dist/app/commands/eval.d.ts +3 -1
  99. package/dist/app/commands/eval.d.ts.map +1 -1
  100. package/dist/app/commands/eval.js +80 -22
  101. package/dist/app/commands/eval.js.map +1 -1
  102. package/dist/app/commands/i18n.d.ts +1 -1
  103. package/dist/app/commands/i18n.d.ts.map +1 -1
  104. package/dist/app/commands/i18n.js +18 -6
  105. package/dist/app/commands/i18n.js.map +1 -1
  106. package/dist/app/commands/init.d.ts +13 -3
  107. package/dist/app/commands/init.d.ts.map +1 -1
  108. package/dist/app/commands/init.js +561 -72
  109. package/dist/app/commands/init.js.map +1 -1
  110. package/dist/app/commands/native.d.ts +2 -0
  111. package/dist/app/commands/native.d.ts.map +1 -0
  112. package/dist/app/commands/native.js +10 -0
  113. package/dist/app/commands/native.js.map +1 -0
  114. package/dist/app/commands/project-scope-selection.d.ts +13 -0
  115. package/dist/app/commands/project-scope-selection.d.ts.map +1 -0
  116. package/dist/app/commands/project-scope-selection.js +35 -0
  117. package/dist/app/commands/project-scope-selection.js.map +1 -0
  118. package/dist/app/commands/resume-probe.d.ts +12 -0
  119. package/dist/app/commands/resume-probe.d.ts.map +1 -0
  120. package/dist/app/commands/resume-probe.js +68 -0
  121. package/dist/app/commands/resume-probe.js.map +1 -0
  122. package/dist/app/commands/status.d.ts.map +1 -1
  123. package/dist/app/commands/status.js +70 -104
  124. package/dist/app/commands/status.js.map +1 -1
  125. package/dist/app/commands/uninstall.d.ts +5 -0
  126. package/dist/app/commands/uninstall.d.ts.map +1 -1
  127. package/dist/app/commands/uninstall.js +264 -53
  128. package/dist/app/commands/uninstall.js.map +1 -1
  129. package/dist/app/commands/update.d.ts +29 -5
  130. package/dist/app/commands/update.d.ts.map +1 -1
  131. package/dist/app/commands/update.js +1419 -127
  132. package/dist/app/commands/update.js.map +1 -1
  133. package/dist/app/commands/workflow.d.ts +6 -0
  134. package/dist/app/commands/workflow.d.ts.map +1 -0
  135. package/dist/app/commands/workflow.js +11 -0
  136. package/dist/app/commands/workflow.js.map +1 -0
  137. package/dist/config/repository-layout.json +29 -3
  138. package/dist/domains/bundle/bundle-platform.d.ts +1 -0
  139. package/dist/domains/bundle/bundle-platform.d.ts.map +1 -1
  140. package/dist/domains/bundle/bundle-platform.js +10 -4
  141. package/dist/domains/bundle/bundle-platform.js.map +1 -1
  142. package/dist/domains/bundle/eval-manifest-runtime.d.ts +8 -0
  143. package/dist/domains/bundle/eval-manifest-runtime.d.ts.map +1 -0
  144. package/dist/domains/bundle/eval-manifest-runtime.js +118 -0
  145. package/dist/domains/bundle/eval-manifest-runtime.js.map +1 -0
  146. package/dist/domains/bundle/eval-run-result.d.ts +22 -0
  147. package/dist/domains/bundle/eval-run-result.d.ts.map +1 -0
  148. package/dist/domains/bundle/eval-run-result.js +207 -0
  149. package/dist/domains/bundle/eval-run-result.js.map +1 -0
  150. package/dist/domains/bundle/eval.d.ts.map +1 -1
  151. package/dist/domains/bundle/eval.js +21 -24
  152. package/dist/domains/bundle/eval.js.map +1 -1
  153. package/dist/domains/bundle/factory.d.ts.map +1 -1
  154. package/dist/domains/bundle/factory.js +2 -9
  155. package/dist/domains/bundle/factory.js.map +1 -1
  156. package/dist/domains/bundle/review-summary.js +1 -1
  157. package/dist/domains/bundle/review-summary.js.map +1 -1
  158. package/dist/domains/bundle/state.d.ts.map +1 -1
  159. package/dist/domains/bundle/state.js +117 -2
  160. package/dist/domains/bundle/state.js.map +1 -1
  161. package/dist/domains/bundle/types.d.ts +1 -1
  162. package/dist/domains/bundle/types.d.ts.map +1 -1
  163. package/dist/domains/comet-classic/classic-archive-pointer.d.ts +8 -0
  164. package/dist/domains/comet-classic/classic-archive-pointer.d.ts.map +1 -0
  165. package/dist/domains/comet-classic/classic-archive-pointer.js +66 -0
  166. package/dist/domains/comet-classic/classic-archive-pointer.js.map +1 -0
  167. package/dist/domains/comet-classic/classic-archive.d.ts +1 -0
  168. package/dist/domains/comet-classic/classic-archive.d.ts.map +1 -1
  169. package/dist/domains/comet-classic/classic-archive.js +205 -114
  170. package/dist/domains/comet-classic/classic-archive.js.map +1 -1
  171. package/dist/domains/comet-classic/classic-branch-binding.d.ts +51 -0
  172. package/dist/domains/comet-classic/classic-branch-binding.d.ts.map +1 -0
  173. package/dist/domains/comet-classic/classic-branch-binding.js +107 -0
  174. package/dist/domains/comet-classic/classic-branch-binding.js.map +1 -0
  175. package/dist/domains/comet-classic/classic-cli.d.ts +3 -1
  176. package/dist/domains/comet-classic/classic-cli.d.ts.map +1 -1
  177. package/dist/domains/comet-classic/classic-cli.js +12 -3
  178. package/dist/domains/comet-classic/classic-cli.js.map +1 -1
  179. package/dist/domains/comet-classic/classic-command-checks.d.ts +20 -0
  180. package/dist/domains/comet-classic/classic-command-checks.d.ts.map +1 -0
  181. package/dist/domains/comet-classic/classic-command-checks.js +94 -0
  182. package/dist/domains/comet-classic/classic-command-checks.js.map +1 -0
  183. package/dist/domains/comet-classic/classic-command-context.d.ts +12 -0
  184. package/dist/domains/comet-classic/classic-command-context.d.ts.map +1 -0
  185. package/dist/domains/comet-classic/classic-command-context.js +42 -0
  186. package/dist/domains/comet-classic/classic-command-context.js.map +1 -0
  187. package/dist/domains/comet-classic/classic-current-change.d.ts +17 -0
  188. package/dist/domains/comet-classic/classic-current-change.d.ts.map +1 -0
  189. package/dist/domains/comet-classic/classic-current-change.js +112 -0
  190. package/dist/domains/comet-classic/classic-current-change.js.map +1 -0
  191. package/dist/domains/comet-classic/classic-diagnostics.d.ts +2 -1
  192. package/dist/domains/comet-classic/classic-diagnostics.d.ts.map +1 -1
  193. package/dist/domains/comet-classic/classic-diagnostics.js +54 -1
  194. package/dist/domains/comet-classic/classic-diagnostics.js.map +1 -1
  195. package/dist/domains/comet-classic/classic-evidence.d.ts +1 -0
  196. package/dist/domains/comet-classic/classic-evidence.d.ts.map +1 -1
  197. package/dist/domains/comet-classic/classic-evidence.js +101 -37
  198. package/dist/domains/comet-classic/classic-evidence.js.map +1 -1
  199. package/dist/domains/comet-classic/classic-guard.d.ts.map +1 -1
  200. package/dist/domains/comet-classic/classic-guard.js +229 -208
  201. package/dist/domains/comet-classic/classic-guard.js.map +1 -1
  202. package/dist/domains/comet-classic/classic-handoff.d.ts.map +1 -1
  203. package/dist/domains/comet-classic/classic-handoff.js +155 -107
  204. package/dist/domains/comet-classic/classic-handoff.js.map +1 -1
  205. package/dist/domains/comet-classic/classic-hook-guard.d.ts +9 -0
  206. package/dist/domains/comet-classic/classic-hook-guard.d.ts.map +1 -1
  207. package/dist/domains/comet-classic/classic-hook-guard.js +406 -54
  208. package/dist/domains/comet-classic/classic-hook-guard.js.map +1 -1
  209. package/dist/domains/comet-classic/classic-layout-initialization.d.ts +86 -0
  210. package/dist/domains/comet-classic/classic-layout-initialization.d.ts.map +1 -0
  211. package/dist/domains/comet-classic/classic-layout-initialization.js +813 -0
  212. package/dist/domains/comet-classic/classic-layout-initialization.js.map +1 -0
  213. package/dist/domains/comet-classic/classic-layout.d.ts +47 -0
  214. package/dist/domains/comet-classic/classic-layout.d.ts.map +1 -0
  215. package/dist/domains/comet-classic/classic-layout.js +227 -0
  216. package/dist/domains/comet-classic/classic-layout.js.map +1 -0
  217. package/dist/domains/comet-classic/classic-migrate.d.ts +4 -0
  218. package/dist/domains/comet-classic/classic-migrate.d.ts.map +1 -1
  219. package/dist/domains/comet-classic/classic-migrate.js +8 -12
  220. package/dist/domains/comet-classic/classic-migrate.js.map +1 -1
  221. package/dist/domains/comet-classic/classic-openspec-command.d.ts +4 -0
  222. package/dist/domains/comet-classic/classic-openspec-command.d.ts.map +1 -0
  223. package/dist/domains/comet-classic/classic-openspec-command.js +45 -0
  224. package/dist/domains/comet-classic/classic-openspec-command.js.map +1 -0
  225. package/dist/domains/comet-classic/classic-openspec-root.d.ts +13 -0
  226. package/dist/domains/comet-classic/classic-openspec-root.d.ts.map +1 -0
  227. package/dist/domains/comet-classic/classic-openspec-root.js +47 -0
  228. package/dist/domains/comet-classic/classic-openspec-root.js.map +1 -0
  229. package/dist/domains/comet-classic/classic-paths.d.ts +11 -1
  230. package/dist/domains/comet-classic/classic-paths.d.ts.map +1 -1
  231. package/dist/domains/comet-classic/classic-paths.js +87 -35
  232. package/dist/domains/comet-classic/classic-paths.js.map +1 -1
  233. package/dist/domains/comet-classic/classic-project-config.d.ts +16 -0
  234. package/dist/domains/comet-classic/classic-project-config.d.ts.map +1 -0
  235. package/dist/domains/comet-classic/classic-project-config.js +36 -0
  236. package/dist/domains/comet-classic/classic-project-config.js.map +1 -0
  237. package/dist/domains/comet-classic/classic-protected-path.d.ts +39 -0
  238. package/dist/domains/comet-classic/classic-protected-path.d.ts.map +1 -0
  239. package/dist/domains/comet-classic/classic-protected-path.js +69 -0
  240. package/dist/domains/comet-classic/classic-protected-path.js.map +1 -0
  241. package/dist/domains/comet-classic/classic-resolver.d.ts.map +1 -1
  242. package/dist/domains/comet-classic/classic-resolver.js +4 -4
  243. package/dist/domains/comet-classic/classic-resolver.js.map +1 -1
  244. package/dist/domains/comet-classic/classic-resume-probe-command.d.ts +3 -0
  245. package/dist/domains/comet-classic/classic-resume-probe-command.d.ts.map +1 -0
  246. package/dist/domains/comet-classic/classic-resume-probe-command.js +59 -0
  247. package/dist/domains/comet-classic/classic-resume-probe-command.js.map +1 -0
  248. package/dist/domains/comet-classic/classic-resume-probe-entry.d.ts +2 -0
  249. package/dist/domains/comet-classic/classic-resume-probe-entry.d.ts.map +1 -0
  250. package/dist/domains/comet-classic/classic-resume-probe-entry.js +4 -0
  251. package/dist/domains/comet-classic/classic-resume-probe-entry.js.map +1 -0
  252. package/dist/domains/comet-classic/classic-resume-probe.d.ts +29 -0
  253. package/dist/domains/comet-classic/classic-resume-probe.d.ts.map +1 -0
  254. package/dist/domains/comet-classic/classic-resume-probe.js +406 -0
  255. package/dist/domains/comet-classic/classic-resume-probe.js.map +1 -0
  256. package/dist/domains/comet-classic/classic-root-command.d.ts +5 -0
  257. package/dist/domains/comet-classic/classic-root-command.d.ts.map +1 -0
  258. package/dist/domains/comet-classic/classic-root-command.js +84 -0
  259. package/dist/domains/comet-classic/classic-root-command.js.map +1 -0
  260. package/dist/domains/comet-classic/classic-root-move.d.ts +119 -0
  261. package/dist/domains/comet-classic/classic-root-move.d.ts.map +1 -0
  262. package/dist/domains/comet-classic/classic-root-move.js +1737 -0
  263. package/dist/domains/comet-classic/classic-root-move.js.map +1 -0
  264. package/dist/domains/comet-classic/classic-runtime-run.d.ts +2 -1
  265. package/dist/domains/comet-classic/classic-runtime-run.d.ts.map +1 -1
  266. package/dist/domains/comet-classic/classic-runtime-run.js +278 -5
  267. package/dist/domains/comet-classic/classic-runtime-run.js.map +1 -1
  268. package/dist/domains/comet-classic/classic-state-command.d.ts.map +1 -1
  269. package/dist/domains/comet-classic/classic-state-command.js +342 -87
  270. package/dist/domains/comet-classic/classic-state-command.js.map +1 -1
  271. package/dist/domains/comet-classic/classic-state-events.d.ts +1 -1
  272. package/dist/domains/comet-classic/classic-state-events.d.ts.map +1 -1
  273. package/dist/domains/comet-classic/classic-state-events.js +3 -4
  274. package/dist/domains/comet-classic/classic-state-events.js.map +1 -1
  275. package/dist/domains/comet-classic/classic-state.d.ts +6 -4
  276. package/dist/domains/comet-classic/classic-state.d.ts.map +1 -1
  277. package/dist/domains/comet-classic/classic-state.js +20 -7
  278. package/dist/domains/comet-classic/classic-state.js.map +1 -1
  279. package/dist/domains/comet-classic/classic-store.d.ts +6 -1
  280. package/dist/domains/comet-classic/classic-store.d.ts.map +1 -1
  281. package/dist/domains/comet-classic/classic-store.js +36 -23
  282. package/dist/domains/comet-classic/classic-store.js.map +1 -1
  283. package/dist/domains/comet-classic/classic-transitions.d.ts +1 -1
  284. package/dist/domains/comet-classic/classic-transitions.d.ts.map +1 -1
  285. package/dist/domains/comet-classic/classic-transitions.js +37 -3
  286. package/dist/domains/comet-classic/classic-transitions.js.map +1 -1
  287. package/dist/domains/comet-classic/classic-validate-command.d.ts.map +1 -1
  288. package/dist/domains/comet-classic/classic-validate-command.js +40 -20
  289. package/dist/domains/comet-classic/classic-validate-command.js.map +1 -1
  290. package/dist/domains/comet-classic/index.d.ts +3 -0
  291. package/dist/domains/comet-classic/index.d.ts.map +1 -1
  292. package/dist/domains/comet-classic/index.js +3 -0
  293. package/dist/domains/comet-classic/index.js.map +1 -1
  294. package/dist/domains/comet-entry/current-selection-repair.d.ts +17 -0
  295. package/dist/domains/comet-entry/current-selection-repair.d.ts.map +1 -0
  296. package/dist/domains/comet-entry/current-selection-repair.js +19 -0
  297. package/dist/domains/comet-entry/current-selection-repair.js.map +1 -0
  298. package/dist/domains/comet-entry/current-selection.d.ts +28 -0
  299. package/dist/domains/comet-entry/current-selection.d.ts.map +1 -0
  300. package/dist/domains/comet-entry/current-selection.js +114 -0
  301. package/dist/domains/comet-entry/current-selection.js.map +1 -0
  302. package/dist/domains/comet-entry/entry-runtime-entry.d.ts +2 -0
  303. package/dist/domains/comet-entry/entry-runtime-entry.d.ts.map +1 -0
  304. package/dist/domains/comet-entry/entry-runtime-entry.js +3 -0
  305. package/dist/domains/comet-entry/entry-runtime-entry.js.map +1 -0
  306. package/dist/domains/comet-entry/entry-runtime.d.ts +7 -0
  307. package/dist/domains/comet-entry/entry-runtime.d.ts.map +1 -0
  308. package/dist/domains/comet-entry/entry-runtime.js +55 -0
  309. package/dist/domains/comet-entry/entry-runtime.js.map +1 -0
  310. package/dist/domains/comet-entry/hook-adapter.d.ts +6 -0
  311. package/dist/domains/comet-entry/hook-adapter.d.ts.map +1 -0
  312. package/dist/domains/comet-entry/hook-adapter.js +202 -0
  313. package/dist/domains/comet-entry/hook-adapter.js.map +1 -0
  314. package/dist/domains/comet-entry/hook-router-entry.d.ts +8 -0
  315. package/dist/domains/comet-entry/hook-router-entry.d.ts.map +1 -0
  316. package/dist/domains/comet-entry/hook-router-entry.js +88 -0
  317. package/dist/domains/comet-entry/hook-router-entry.js.map +1 -0
  318. package/dist/domains/comet-entry/hook-router.d.ts +32 -0
  319. package/dist/domains/comet-entry/hook-router.d.ts.map +1 -0
  320. package/dist/domains/comet-entry/hook-router.js +133 -0
  321. package/dist/domains/comet-entry/hook-router.js.map +1 -0
  322. package/dist/domains/comet-entry/hook-types.d.ts +20 -0
  323. package/dist/domains/comet-entry/hook-types.d.ts.map +1 -0
  324. package/dist/domains/comet-entry/hook-types.js +2 -0
  325. package/dist/domains/comet-entry/hook-types.js.map +1 -0
  326. package/dist/domains/comet-entry/init-workflow.d.ts +19 -0
  327. package/dist/domains/comet-entry/init-workflow.d.ts.map +1 -0
  328. package/dist/domains/comet-entry/init-workflow.js +118 -0
  329. package/dist/domains/comet-entry/init-workflow.js.map +1 -0
  330. package/dist/domains/comet-entry/project-status.d.ts +3 -0
  331. package/dist/domains/comet-entry/project-status.d.ts.map +1 -0
  332. package/dist/domains/comet-entry/project-status.js +291 -0
  333. package/dist/domains/comet-entry/project-status.js.map +1 -0
  334. package/dist/domains/comet-entry/resolve-entry.d.ts +3 -0
  335. package/dist/domains/comet-entry/resolve-entry.d.ts.map +1 -0
  336. package/dist/domains/comet-entry/resolve-entry.js +18 -0
  337. package/dist/domains/comet-entry/resolve-entry.js.map +1 -0
  338. package/dist/domains/comet-entry/resume-probe.d.ts +34 -0
  339. package/dist/domains/comet-entry/resume-probe.d.ts.map +1 -0
  340. package/dist/domains/comet-entry/resume-probe.js +462 -0
  341. package/dist/domains/comet-entry/resume-probe.js.map +1 -0
  342. package/dist/domains/comet-entry/types.d.ts +60 -0
  343. package/dist/domains/comet-entry/types.d.ts.map +1 -0
  344. package/dist/domains/comet-entry/types.js +2 -0
  345. package/dist/domains/comet-entry/types.js.map +1 -0
  346. package/dist/domains/comet-entry/workflow-resolution.d.ts +8 -0
  347. package/dist/domains/comet-entry/workflow-resolution.d.ts.map +1 -0
  348. package/dist/domains/comet-entry/workflow-resolution.js +16 -0
  349. package/dist/domains/comet-entry/workflow-resolution.js.map +1 -0
  350. package/dist/domains/comet-native/index.d.ts +35 -0
  351. package/dist/domains/comet-native/index.d.ts.map +1 -0
  352. package/dist/domains/comet-native/index.js +35 -0
  353. package/dist/domains/comet-native/index.js.map +1 -0
  354. package/dist/domains/comet-native/native-acceptance.d.ts +53 -0
  355. package/dist/domains/comet-native/native-acceptance.d.ts.map +1 -0
  356. package/dist/domains/comet-native/native-acceptance.js +658 -0
  357. package/dist/domains/comet-native/native-acceptance.js.map +1 -0
  358. package/dist/domains/comet-native/native-archive-content.d.ts +26 -0
  359. package/dist/domains/comet-native/native-archive-content.d.ts.map +1 -0
  360. package/dist/domains/comet-native/native-archive-content.js +159 -0
  361. package/dist/domains/comet-native/native-archive-content.js.map +1 -0
  362. package/dist/domains/comet-native/native-archive-inspection.d.ts +9 -0
  363. package/dist/domains/comet-native/native-archive-inspection.d.ts.map +1 -0
  364. package/dist/domains/comet-native/native-archive-inspection.js +97 -0
  365. package/dist/domains/comet-native/native-archive-inspection.js.map +1 -0
  366. package/dist/domains/comet-native/native-archive-preflight.d.ts +54 -0
  367. package/dist/domains/comet-native/native-archive-preflight.d.ts.map +1 -0
  368. package/dist/domains/comet-native/native-archive-preflight.js +222 -0
  369. package/dist/domains/comet-native/native-archive-preflight.js.map +1 -0
  370. package/dist/domains/comet-native/native-archive-transaction.d.ts +20 -0
  371. package/dist/domains/comet-native/native-archive-transaction.d.ts.map +1 -0
  372. package/dist/domains/comet-native/native-archive-transaction.js +1183 -0
  373. package/dist/domains/comet-native/native-archive-transaction.js.map +1 -0
  374. package/dist/domains/comet-native/native-archive.d.ts +36 -0
  375. package/dist/domains/comet-native/native-archive.d.ts.map +1 -0
  376. package/dist/domains/comet-native/native-archive.js +422 -0
  377. package/dist/domains/comet-native/native-archive.js.map +1 -0
  378. package/dist/domains/comet-native/native-artifacts.d.ts +10 -0
  379. package/dist/domains/comet-native/native-artifacts.d.ts.map +1 -0
  380. package/dist/domains/comet-native/native-artifacts.js +204 -0
  381. package/dist/domains/comet-native/native-artifacts.js.map +1 -0
  382. package/dist/domains/comet-native/native-atomic-file.d.ts +10 -0
  383. package/dist/domains/comet-native/native-atomic-file.d.ts.map +1 -0
  384. package/dist/domains/comet-native/native-atomic-file.js +179 -0
  385. package/dist/domains/comet-native/native-atomic-file.js.map +1 -0
  386. package/dist/domains/comet-native/native-bounded-file.d.ts +19 -0
  387. package/dist/domains/comet-native/native-bounded-file.d.ts.map +1 -0
  388. package/dist/domains/comet-native/native-bounded-file.js +184 -0
  389. package/dist/domains/comet-native/native-bounded-file.js.map +1 -0
  390. package/dist/domains/comet-native/native-build-evidence.d.ts +42 -0
  391. package/dist/domains/comet-native/native-build-evidence.d.ts.map +1 -0
  392. package/dist/domains/comet-native/native-build-evidence.js +257 -0
  393. package/dist/domains/comet-native/native-build-evidence.js.map +1 -0
  394. package/dist/domains/comet-native/native-canonical-hash.d.ts +10 -0
  395. package/dist/domains/comet-native/native-canonical-hash.d.ts.map +1 -0
  396. package/dist/domains/comet-native/native-canonical-hash.js +100 -0
  397. package/dist/domains/comet-native/native-canonical-hash.js.map +1 -0
  398. package/dist/domains/comet-native/native-change-recovery.d.ts +11 -0
  399. package/dist/domains/comet-native/native-change-recovery.d.ts.map +1 -0
  400. package/dist/domains/comet-native/native-change-recovery.js +15 -0
  401. package/dist/domains/comet-native/native-change-recovery.js.map +1 -0
  402. package/dist/domains/comet-native/native-change.d.ts +66 -0
  403. package/dist/domains/comet-native/native-change.d.ts.map +1 -0
  404. package/dist/domains/comet-native/native-change.js +834 -0
  405. package/dist/domains/comet-native/native-change.js.map +1 -0
  406. package/dist/domains/comet-native/native-check-receipt-model.d.ts +63 -0
  407. package/dist/domains/comet-native/native-check-receipt-model.d.ts.map +1 -0
  408. package/dist/domains/comet-native/native-check-receipt-model.js +352 -0
  409. package/dist/domains/comet-native/native-check-receipt-model.js.map +1 -0
  410. package/dist/domains/comet-native/native-check-receipt-storage.d.ts +10 -0
  411. package/dist/domains/comet-native/native-check-receipt-storage.d.ts.map +1 -0
  412. package/dist/domains/comet-native/native-check-receipt-storage.js +200 -0
  413. package/dist/domains/comet-native/native-check-receipt-storage.js.map +1 -0
  414. package/dist/domains/comet-native/native-check-receipt.d.ts +19 -0
  415. package/dist/domains/comet-native/native-check-receipt.d.ts.map +1 -0
  416. package/dist/domains/comet-native/native-check-receipt.js +453 -0
  417. package/dist/domains/comet-native/native-check-receipt.js.map +1 -0
  418. package/dist/domains/comet-native/native-check.d.ts +24 -0
  419. package/dist/domains/comet-native/native-check.d.ts.map +1 -0
  420. package/dist/domains/comet-native/native-check.js +38 -0
  421. package/dist/domains/comet-native/native-check.js.map +1 -0
  422. package/dist/domains/comet-native/native-checkpoint-journal.d.ts +13 -0
  423. package/dist/domains/comet-native/native-checkpoint-journal.d.ts.map +1 -0
  424. package/dist/domains/comet-native/native-checkpoint-journal.js +53 -0
  425. package/dist/domains/comet-native/native-checkpoint-journal.js.map +1 -0
  426. package/dist/domains/comet-native/native-checkpoint-storage.d.ts +43 -0
  427. package/dist/domains/comet-native/native-checkpoint-storage.d.ts.map +1 -0
  428. package/dist/domains/comet-native/native-checkpoint-storage.js +487 -0
  429. package/dist/domains/comet-native/native-checkpoint-storage.js.map +1 -0
  430. package/dist/domains/comet-native/native-cli-entry.d.ts +2 -0
  431. package/dist/domains/comet-native/native-cli-entry.d.ts.map +1 -0
  432. package/dist/domains/comet-native/native-cli-entry.js +18 -0
  433. package/dist/domains/comet-native/native-cli-entry.js.map +1 -0
  434. package/dist/domains/comet-native/native-cli.d.ts +7 -0
  435. package/dist/domains/comet-native/native-cli.d.ts.map +1 -0
  436. package/dist/domains/comet-native/native-cli.js +1300 -0
  437. package/dist/domains/comet-native/native-cli.js.map +1 -0
  438. package/dist/domains/comet-native/native-config.d.ts +23 -0
  439. package/dist/domains/comet-native/native-config.d.ts.map +1 -0
  440. package/dist/domains/comet-native/native-config.js +60 -0
  441. package/dist/domains/comet-native/native-config.js.map +1 -0
  442. package/dist/domains/comet-native/native-conflict-inspection.d.ts +17 -0
  443. package/dist/domains/comet-native/native-conflict-inspection.d.ts.map +1 -0
  444. package/dist/domains/comet-native/native-conflict-inspection.js +90 -0
  445. package/dist/domains/comet-native/native-conflict-inspection.js.map +1 -0
  446. package/dist/domains/comet-native/native-conflict-radar.d.ts +75 -0
  447. package/dist/domains/comet-native/native-conflict-radar.d.ts.map +1 -0
  448. package/dist/domains/comet-native/native-conflict-radar.js +326 -0
  449. package/dist/domains/comet-native/native-conflict-radar.js.map +1 -0
  450. package/dist/domains/comet-native/native-continuation.d.ts +12 -0
  451. package/dist/domains/comet-native/native-continuation.d.ts.map +1 -0
  452. package/dist/domains/comet-native/native-continuation.js +201 -0
  453. package/dist/domains/comet-native/native-continuation.js.map +1 -0
  454. package/dist/domains/comet-native/native-contract-files.d.ts +24 -0
  455. package/dist/domains/comet-native/native-contract-files.d.ts.map +1 -0
  456. package/dist/domains/comet-native/native-contract-files.js +66 -0
  457. package/dist/domains/comet-native/native-contract-files.js.map +1 -0
  458. package/dist/domains/comet-native/native-contract.d.ts +41 -0
  459. package/dist/domains/comet-native/native-contract.d.ts.map +1 -0
  460. package/dist/domains/comet-native/native-contract.js +142 -0
  461. package/dist/domains/comet-native/native-contract.js.map +1 -0
  462. package/dist/domains/comet-native/native-controller-trust.d.ts +22 -0
  463. package/dist/domains/comet-native/native-controller-trust.d.ts.map +1 -0
  464. package/dist/domains/comet-native/native-controller-trust.js +153 -0
  465. package/dist/domains/comet-native/native-controller-trust.js.map +1 -0
  466. package/dist/domains/comet-native/native-creation-authorization.d.ts +30 -0
  467. package/dist/domains/comet-native/native-creation-authorization.d.ts.map +1 -0
  468. package/dist/domains/comet-native/native-creation-authorization.js +110 -0
  469. package/dist/domains/comet-native/native-creation-authorization.js.map +1 -0
  470. package/dist/domains/comet-native/native-diagnostics.d.ts +25 -0
  471. package/dist/domains/comet-native/native-diagnostics.d.ts.map +1 -0
  472. package/dist/domains/comet-native/native-diagnostics.js +551 -0
  473. package/dist/domains/comet-native/native-diagnostics.js.map +1 -0
  474. package/dist/domains/comet-native/native-doctor.d.ts +12 -0
  475. package/dist/domains/comet-native/native-doctor.d.ts.map +1 -0
  476. package/dist/domains/comet-native/native-doctor.js +771 -0
  477. package/dist/domains/comet-native/native-doctor.js.map +1 -0
  478. package/dist/domains/comet-native/native-evidence-retention.d.ts +37 -0
  479. package/dist/domains/comet-native/native-evidence-retention.d.ts.map +1 -0
  480. package/dist/domains/comet-native/native-evidence-retention.js +916 -0
  481. package/dist/domains/comet-native/native-evidence-retention.js.map +1 -0
  482. package/dist/domains/comet-native/native-evidence-storage.d.ts +54 -0
  483. package/dist/domains/comet-native/native-evidence-storage.d.ts.map +1 -0
  484. package/dist/domains/comet-native/native-evidence-storage.js +401 -0
  485. package/dist/domains/comet-native/native-evidence-storage.js.map +1 -0
  486. package/dist/domains/comet-native/native-file-identity.d.ts +3 -0
  487. package/dist/domains/comet-native/native-file-identity.d.ts.map +1 -0
  488. package/dist/domains/comet-native/native-file-identity.js +2 -0
  489. package/dist/domains/comet-native/native-file-identity.js.map +1 -0
  490. package/dist/domains/comet-native/native-findings.d.ts +8 -0
  491. package/dist/domains/comet-native/native-findings.d.ts.map +1 -0
  492. package/dist/domains/comet-native/native-findings.js +254 -0
  493. package/dist/domains/comet-native/native-findings.js.map +1 -0
  494. package/dist/domains/comet-native/native-guards.d.ts +8 -0
  495. package/dist/domains/comet-native/native-guards.d.ts.map +1 -0
  496. package/dist/domains/comet-native/native-guards.js +140 -0
  497. package/dist/domains/comet-native/native-guards.js.map +1 -0
  498. package/dist/domains/comet-native/native-hash.d.ts +3 -0
  499. package/dist/domains/comet-native/native-hash.d.ts.map +1 -0
  500. package/dist/domains/comet-native/native-hash.js +12 -0
  501. package/dist/domains/comet-native/native-hash.js.map +1 -0
  502. package/dist/domains/comet-native/native-hook-guard.d.ts +17 -0
  503. package/dist/domains/comet-native/native-hook-guard.d.ts.map +1 -0
  504. package/dist/domains/comet-native/native-hook-guard.js +154 -0
  505. package/dist/domains/comet-native/native-hook-guard.js.map +1 -0
  506. package/dist/domains/comet-native/native-independent-review.d.ts +28 -0
  507. package/dist/domains/comet-native/native-independent-review.d.ts.map +1 -0
  508. package/dist/domains/comet-native/native-independent-review.js +134 -0
  509. package/dist/domains/comet-native/native-independent-review.js.map +1 -0
  510. package/dist/domains/comet-native/native-lock.d.ts +47 -0
  511. package/dist/domains/comet-native/native-lock.d.ts.map +1 -0
  512. package/dist/domains/comet-native/native-lock.js +390 -0
  513. package/dist/domains/comet-native/native-lock.js.map +1 -0
  514. package/dist/domains/comet-native/native-mutation-lock.d.ts +5 -0
  515. package/dist/domains/comet-native/native-mutation-lock.d.ts.map +1 -0
  516. package/dist/domains/comet-native/native-mutation-lock.js +66 -0
  517. package/dist/domains/comet-native/native-mutation-lock.js.map +1 -0
  518. package/dist/domains/comet-native/native-paths.d.ts +10 -0
  519. package/dist/domains/comet-native/native-paths.d.ts.map +1 -0
  520. package/dist/domains/comet-native/native-paths.js +160 -0
  521. package/dist/domains/comet-native/native-paths.js.map +1 -0
  522. package/dist/domains/comet-native/native-progress-checkpoint.d.ts +13 -0
  523. package/dist/domains/comet-native/native-progress-checkpoint.d.ts.map +1 -0
  524. package/dist/domains/comet-native/native-progress-checkpoint.js +104 -0
  525. package/dist/domains/comet-native/native-progress-checkpoint.js.map +1 -0
  526. package/dist/domains/comet-native/native-protected-file.d.ts +113 -0
  527. package/dist/domains/comet-native/native-protected-file.d.ts.map +1 -0
  528. package/dist/domains/comet-native/native-protected-file.js +510 -0
  529. package/dist/domains/comet-native/native-protected-file.js.map +1 -0
  530. package/dist/domains/comet-native/native-redaction.d.ts +2 -0
  531. package/dist/domains/comet-native/native-redaction.d.ts.map +1 -0
  532. package/dist/domains/comet-native/native-redaction.js +18 -0
  533. package/dist/domains/comet-native/native-redaction.js.map +1 -0
  534. package/dist/domains/comet-native/native-repair-integration.d.ts +46 -0
  535. package/dist/domains/comet-native/native-repair-integration.d.ts.map +1 -0
  536. package/dist/domains/comet-native/native-repair-integration.js +235 -0
  537. package/dist/domains/comet-native/native-repair-integration.js.map +1 -0
  538. package/dist/domains/comet-native/native-repair-runtime.d.ts +78 -0
  539. package/dist/domains/comet-native/native-repair-runtime.d.ts.map +1 -0
  540. package/dist/domains/comet-native/native-repair-runtime.js +593 -0
  541. package/dist/domains/comet-native/native-repair-runtime.js.map +1 -0
  542. package/dist/domains/comet-native/native-repair-stagnation.d.ts +89 -0
  543. package/dist/domains/comet-native/native-repair-stagnation.d.ts.map +1 -0
  544. package/dist/domains/comet-native/native-repair-stagnation.js +308 -0
  545. package/dist/domains/comet-native/native-repair-stagnation.js.map +1 -0
  546. package/dist/domains/comet-native/native-resume-view.d.ts +14 -0
  547. package/dist/domains/comet-native/native-resume-view.d.ts.map +1 -0
  548. package/dist/domains/comet-native/native-resume-view.js +105 -0
  549. package/dist/domains/comet-native/native-resume-view.js.map +1 -0
  550. package/dist/domains/comet-native/native-review-contract.d.ts +6 -0
  551. package/dist/domains/comet-native/native-review-contract.d.ts.map +1 -0
  552. package/dist/domains/comet-native/native-review-contract.js +6 -0
  553. package/dist/domains/comet-native/native-review-contract.js.map +1 -0
  554. package/dist/domains/comet-native/native-review-identity.d.ts +50 -0
  555. package/dist/domains/comet-native/native-review-identity.d.ts.map +1 -0
  556. package/dist/domains/comet-native/native-review-identity.js +209 -0
  557. package/dist/domains/comet-native/native-review-identity.js.map +1 -0
  558. package/dist/domains/comet-native/native-review-signer.d.ts +24 -0
  559. package/dist/domains/comet-native/native-review-signer.d.ts.map +1 -0
  560. package/dist/domains/comet-native/native-review-signer.js +125 -0
  561. package/dist/domains/comet-native/native-review-signer.js.map +1 -0
  562. package/dist/domains/comet-native/native-review-trust.d.ts +35 -0
  563. package/dist/domains/comet-native/native-review-trust.d.ts.map +1 -0
  564. package/dist/domains/comet-native/native-review-trust.js +176 -0
  565. package/dist/domains/comet-native/native-review-trust.js.map +1 -0
  566. package/dist/domains/comet-native/native-revision.d.ts +20 -0
  567. package/dist/domains/comet-native/native-revision.d.ts.map +1 -0
  568. package/dist/domains/comet-native/native-revision.js +32 -0
  569. package/dist/domains/comet-native/native-revision.js.map +1 -0
  570. package/dist/domains/comet-native/native-root-move.d.ts +20 -0
  571. package/dist/domains/comet-native/native-root-move.d.ts.map +1 -0
  572. package/dist/domains/comet-native/native-root-move.js +818 -0
  573. package/dist/domains/comet-native/native-root-move.js.map +1 -0
  574. package/dist/domains/comet-native/native-run-consistency.d.ts +3 -0
  575. package/dist/domains/comet-native/native-run-consistency.d.ts.map +1 -0
  576. package/dist/domains/comet-native/native-run-consistency.js +136 -0
  577. package/dist/domains/comet-native/native-run-consistency.js.map +1 -0
  578. package/dist/domains/comet-native/native-run-store.d.ts +41 -0
  579. package/dist/domains/comet-native/native-run-store.d.ts.map +1 -0
  580. package/dist/domains/comet-native/native-run-store.js +452 -0
  581. package/dist/domains/comet-native/native-run-store.js.map +1 -0
  582. package/dist/domains/comet-native/native-runtime-package.d.ts +16 -0
  583. package/dist/domains/comet-native/native-runtime-package.d.ts.map +1 -0
  584. package/dist/domains/comet-native/native-runtime-package.js +72 -0
  585. package/dist/domains/comet-native/native-runtime-package.js.map +1 -0
  586. package/dist/domains/comet-native/native-schema-migration.d.ts +11 -0
  587. package/dist/domains/comet-native/native-schema-migration.d.ts.map +1 -0
  588. package/dist/domains/comet-native/native-schema-migration.js +900 -0
  589. package/dist/domains/comet-native/native-schema-migration.js.map +1 -0
  590. package/dist/domains/comet-native/native-selection.d.ts +12 -0
  591. package/dist/domains/comet-native/native-selection.d.ts.map +1 -0
  592. package/dist/domains/comet-native/native-selection.js +52 -0
  593. package/dist/domains/comet-native/native-selection.js.map +1 -0
  594. package/dist/domains/comet-native/native-sensitive-paths.d.ts +7 -0
  595. package/dist/domains/comet-native/native-sensitive-paths.d.ts.map +1 -0
  596. package/dist/domains/comet-native/native-sensitive-paths.js +69 -0
  597. package/dist/domains/comet-native/native-sensitive-paths.js.map +1 -0
  598. package/dist/domains/comet-native/native-snapshot.d.ts +78 -0
  599. package/dist/domains/comet-native/native-snapshot.d.ts.map +1 -0
  600. package/dist/domains/comet-native/native-snapshot.js +2609 -0
  601. package/dist/domains/comet-native/native-snapshot.js.map +1 -0
  602. package/dist/domains/comet-native/native-specs.d.ts +12 -0
  603. package/dist/domains/comet-native/native-specs.d.ts.map +1 -0
  604. package/dist/domains/comet-native/native-specs.js +270 -0
  605. package/dist/domains/comet-native/native-specs.js.map +1 -0
  606. package/dist/domains/comet-native/native-trajectory-limits.d.ts +7 -0
  607. package/dist/domains/comet-native/native-trajectory-limits.d.ts.map +1 -0
  608. package/dist/domains/comet-native/native-trajectory-limits.js +13 -0
  609. package/dist/domains/comet-native/native-trajectory-limits.js.map +1 -0
  610. package/dist/domains/comet-native/native-trajectory-recovery.d.ts +37 -0
  611. package/dist/domains/comet-native/native-trajectory-recovery.d.ts.map +1 -0
  612. package/dist/domains/comet-native/native-trajectory-recovery.js +133 -0
  613. package/dist/domains/comet-native/native-trajectory-recovery.js.map +1 -0
  614. package/dist/domains/comet-native/native-trajectory.d.ts +16 -0
  615. package/dist/domains/comet-native/native-trajectory.d.ts.map +1 -0
  616. package/dist/domains/comet-native/native-trajectory.js +27 -0
  617. package/dist/domains/comet-native/native-trajectory.js.map +1 -0
  618. package/dist/domains/comet-native/native-transaction.d.ts +45 -0
  619. package/dist/domains/comet-native/native-transaction.d.ts.map +1 -0
  620. package/dist/domains/comet-native/native-transaction.js +846 -0
  621. package/dist/domains/comet-native/native-transaction.js.map +1 -0
  622. package/dist/domains/comet-native/native-transition-evidence.d.ts +4 -0
  623. package/dist/domains/comet-native/native-transition-evidence.d.ts.map +1 -0
  624. package/dist/domains/comet-native/native-transition-evidence.js +27 -0
  625. package/dist/domains/comet-native/native-transition-evidence.js.map +1 -0
  626. package/dist/domains/comet-native/native-transition-journal.d.ts +30 -0
  627. package/dist/domains/comet-native/native-transition-journal.d.ts.map +1 -0
  628. package/dist/domains/comet-native/native-transition-journal.js +819 -0
  629. package/dist/domains/comet-native/native-transition-journal.js.map +1 -0
  630. package/dist/domains/comet-native/native-transitions.d.ts +15 -0
  631. package/dist/domains/comet-native/native-transitions.d.ts.map +1 -0
  632. package/dist/domains/comet-native/native-transitions.js +683 -0
  633. package/dist/domains/comet-native/native-transitions.js.map +1 -0
  634. package/dist/domains/comet-native/native-types.d.ts +556 -0
  635. package/dist/domains/comet-native/native-types.d.ts.map +1 -0
  636. package/dist/domains/comet-native/native-types.js +8 -0
  637. package/dist/domains/comet-native/native-types.js.map +1 -0
  638. package/dist/domains/comet-native/native-verification-evidence.d.ts +136 -0
  639. package/dist/domains/comet-native/native-verification-evidence.d.ts.map +1 -0
  640. package/dist/domains/comet-native/native-verification-evidence.js +824 -0
  641. package/dist/domains/comet-native/native-verification-evidence.js.map +1 -0
  642. package/dist/domains/comet-native/native-verification-receipt-runtime.d.ts +188 -0
  643. package/dist/domains/comet-native/native-verification-receipt-runtime.d.ts.map +1 -0
  644. package/dist/domains/comet-native/native-verification-receipt-runtime.js +1129 -0
  645. package/dist/domains/comet-native/native-verification-receipt-runtime.js.map +1 -0
  646. package/dist/domains/comet-native/native-verification-receipt.d.ts +165 -0
  647. package/dist/domains/comet-native/native-verification-receipt.d.ts.map +1 -0
  648. package/dist/domains/comet-native/native-verification-receipt.js +636 -0
  649. package/dist/domains/comet-native/native-verification-receipt.js.map +1 -0
  650. package/dist/domains/comet-native/native-verification-runtime.d.ts +61 -0
  651. package/dist/domains/comet-native/native-verification-runtime.d.ts.map +1 -0
  652. package/dist/domains/comet-native/native-verification-runtime.js +609 -0
  653. package/dist/domains/comet-native/native-verification-runtime.js.map +1 -0
  654. package/dist/domains/comet-native/native-verification-scope.d.ts +118 -0
  655. package/dist/domains/comet-native/native-verification-scope.d.ts.map +1 -0
  656. package/dist/domains/comet-native/native-verification-scope.js +1045 -0
  657. package/dist/domains/comet-native/native-verification-scope.js.map +1 -0
  658. package/dist/domains/comet-native/native-workspace.d.ts +46 -0
  659. package/dist/domains/comet-native/native-workspace.d.ts.map +1 -0
  660. package/dist/domains/comet-native/native-workspace.js +276 -0
  661. package/dist/domains/comet-native/native-workspace.js.map +1 -0
  662. package/dist/domains/dashboard/collector.d.ts.map +1 -1
  663. package/dist/domains/dashboard/collector.js +182 -75
  664. package/dist/domains/dashboard/collector.js.map +1 -1
  665. package/dist/domains/dashboard/native-adapter.d.ts +157 -0
  666. package/dist/domains/dashboard/native-adapter.d.ts.map +1 -0
  667. package/dist/domains/dashboard/native-adapter.js +302 -0
  668. package/dist/domains/dashboard/native-adapter.js.map +1 -0
  669. package/dist/domains/dashboard/native-collector.d.ts +6 -0
  670. package/dist/domains/dashboard/native-collector.d.ts.map +1 -0
  671. package/dist/domains/dashboard/native-collector.js +289 -0
  672. package/dist/domains/dashboard/native-collector.js.map +1 -0
  673. package/dist/domains/dashboard/types.d.ts +10 -0
  674. package/dist/domains/dashboard/types.d.ts.map +1 -1
  675. package/dist/domains/dashboard/verify-parser.d.ts.map +1 -1
  676. package/dist/domains/dashboard/verify-parser.js +37 -31
  677. package/dist/domains/dashboard/verify-parser.js.map +1 -1
  678. package/dist/domains/dashboard/web/assets/_commonjsHelpers-CqkleIqs.js +1 -0
  679. package/dist/domains/dashboard/web/assets/arc-BXWNV2Qv.js +1 -0
  680. package/dist/domains/dashboard/web/assets/architectureDiagram-3BPJPVTR-CjVHPivo.js +36 -0
  681. package/dist/domains/dashboard/web/assets/blockDiagram-GPEHLZMM-P2PGImSM.js +132 -0
  682. package/dist/domains/dashboard/web/assets/c4Diagram-AAUBKEIU-fTj6Xhs1.js +10 -0
  683. package/dist/domains/dashboard/web/assets/channel--JtnhJr8.js +1 -0
  684. package/dist/domains/dashboard/web/assets/chunk-2J33WTMH-BjFDZ5yo.js +1 -0
  685. package/dist/domains/dashboard/web/assets/chunk-4BX2VUAB-BAUkbZdT.js +1 -0
  686. package/dist/domains/dashboard/web/assets/chunk-55IACEB6-DBmuiYme.js +1 -0
  687. package/dist/domains/dashboard/web/assets/chunk-727SXJPM-Do9ufCgY.js +206 -0
  688. package/dist/domains/dashboard/web/assets/chunk-AQP2D5EJ-qRQWlB5d.js +231 -0
  689. package/dist/domains/dashboard/web/assets/chunk-FMBD7UC4-BzDzeJ4_.js +15 -0
  690. package/dist/domains/dashboard/web/assets/chunk-ND2GUHAM-OQcAmIvL.js +1 -0
  691. package/dist/domains/dashboard/web/assets/chunk-QZHKN3VN-BiRfH4d2.js +1 -0
  692. package/dist/domains/dashboard/web/assets/classDiagram-4FO5ZUOK-BRGmx8Iz.js +1 -0
  693. package/dist/domains/dashboard/web/assets/classDiagram-v2-Q7XG4LA2-BRGmx8Iz.js +1 -0
  694. package/dist/domains/dashboard/web/assets/cose-bilkent-S5V4N54A-CZk37fGn.js +1 -0
  695. package/dist/domains/dashboard/web/assets/cynefin-VYW2F7L2-B3F-qRTJ.js +166 -0
  696. package/dist/domains/dashboard/web/assets/cytoscape.esm-D3_iZ_3b.js +321 -0
  697. package/dist/domains/dashboard/web/assets/dagre-BM42HDAG-D5BQ0eqN.js +4 -0
  698. package/dist/domains/dashboard/web/assets/defaultLocale-DX6XiGOO.js +1 -0
  699. package/dist/domains/dashboard/web/assets/demo-BuVau32v.js +25 -0
  700. package/dist/domains/dashboard/web/assets/diagram-2AECGRRQ-33mXstha.js +43 -0
  701. package/dist/domains/dashboard/web/assets/diagram-5GNKFQAL-BWHCMFvD.js +10 -0
  702. package/dist/domains/dashboard/web/assets/diagram-KO2AKTUF-DrPGimEt.js +3 -0
  703. package/dist/domains/dashboard/web/assets/diagram-LMA3HP47-BBlsg7jG.js +24 -0
  704. package/dist/domains/dashboard/web/assets/diagram-OG6HWLK6-CsaFSpHi.js +24 -0
  705. package/dist/domains/dashboard/web/assets/erDiagram-TEJ5UH35-CoB0mzhk.js +85 -0
  706. package/dist/domains/dashboard/web/assets/flowDiagram-I6XJVG4X-lT53XfSE.js +162 -0
  707. package/dist/domains/dashboard/web/assets/ganttDiagram-6RSMTGT7-D1SQ56fl.js +292 -0
  708. package/dist/domains/dashboard/web/assets/gitGraphDiagram-PVQCEYII-D4oDMS5x.js +106 -0
  709. package/dist/domains/dashboard/web/assets/graph--OzhPTMs.js +1 -0
  710. package/dist/domains/dashboard/web/assets/index-D-AGxvI4.css +1 -0
  711. package/dist/domains/dashboard/web/assets/index-DlSYK56b.js +139 -0
  712. package/dist/domains/dashboard/web/assets/index-Msce_H_q.js +24 -0
  713. package/dist/domains/dashboard/web/assets/index-QO0z6F4w.js +10 -0
  714. package/dist/domains/dashboard/web/assets/infoDiagram-5YYISTIA-BeICn98s.js +2 -0
  715. package/dist/domains/dashboard/web/assets/init-Gi6I4Gst.js +1 -0
  716. package/dist/domains/dashboard/web/assets/ishikawaDiagram-YF4QCWOH-Dkspu33d.js +70 -0
  717. package/dist/domains/dashboard/web/assets/journeyDiagram-JHISSGLW-C-EM1sZl.js +139 -0
  718. package/dist/domains/dashboard/web/assets/kanban-definition-UN3LZRKU-BTbB0IO2.js +89 -0
  719. package/dist/domains/dashboard/web/assets/katex-HP8lGamR.js +257 -0
  720. package/dist/domains/dashboard/web/assets/layout-SsrduOYp.js +1 -0
  721. package/dist/domains/dashboard/web/assets/linear-Cp0UrqDr.js +1 -0
  722. package/dist/domains/dashboard/web/assets/marked.esm-DECB3bxB.js +64 -0
  723. package/dist/domains/dashboard/web/assets/mermaid.core-CucmqsLW.js +301 -0
  724. package/dist/domains/dashboard/web/assets/mindmap-definition-RKZ34NQL-CjEshF1X.js +96 -0
  725. package/dist/domains/dashboard/web/assets/ordinal-Cboi1Yqb.js +1 -0
  726. package/dist/domains/dashboard/web/assets/pieDiagram-4H26LBE5-DrwFnX1b.js +30 -0
  727. package/dist/domains/dashboard/web/assets/purify.es-VaSPOPhr.js +3 -0
  728. package/dist/domains/dashboard/web/assets/quadrantDiagram-W4KKPZXB-CjG6pBR2.js +7 -0
  729. package/dist/domains/dashboard/web/assets/requirementDiagram-4Y6WPE33-BpUQVqCV.js +84 -0
  730. package/dist/domains/dashboard/web/assets/sankeyDiagram-5OEKKPKP-BeGkEvzR.js +40 -0
  731. package/dist/domains/dashboard/web/assets/sequenceDiagram-3UESZ5HK-sSTU3MCO.js +162 -0
  732. package/dist/domains/dashboard/web/assets/stateDiagram-AJRCARHV-CcFBc6qh.js +1 -0
  733. package/dist/domains/dashboard/web/assets/stateDiagram-v2-BHNVJYJU-D5zZYi4x.js +1 -0
  734. package/dist/domains/dashboard/web/assets/timeline-definition-PNZ67QCA-DCN7NjEs.js +120 -0
  735. package/dist/domains/dashboard/web/assets/vennDiagram-CIIHVFJN-DZAN1_rr.js +34 -0
  736. package/dist/domains/dashboard/web/assets/wardleyDiagram-YWT4CUSO-FfkJfr4C.js +78 -0
  737. package/dist/domains/dashboard/web/assets/xychartDiagram-2RQKCTM6-CD8B-EmR.js +7 -0
  738. package/dist/domains/dashboard/web/index.html +16 -16
  739. package/dist/domains/engine/protected-run-file.d.ts +15 -0
  740. package/dist/domains/engine/protected-run-file.d.ts.map +1 -0
  741. package/dist/domains/engine/protected-run-file.js +76 -0
  742. package/dist/domains/engine/protected-run-file.js.map +1 -0
  743. package/dist/domains/engine/run-store.d.ts +12 -11
  744. package/dist/domains/engine/run-store.d.ts.map +1 -1
  745. package/dist/domains/engine/run-store.js +46 -65
  746. package/dist/domains/engine/run-store.js.map +1 -1
  747. package/dist/domains/engine/state.d.ts +4 -3
  748. package/dist/domains/engine/state.d.ts.map +1 -1
  749. package/dist/domains/engine/state.js +10 -21
  750. package/dist/domains/engine/state.js.map +1 -1
  751. package/dist/domains/engine/storage-layout.d.ts +14 -0
  752. package/dist/domains/engine/storage-layout.d.ts.map +1 -0
  753. package/dist/domains/engine/storage-layout.js +32 -0
  754. package/dist/domains/engine/storage-layout.js.map +1 -0
  755. package/dist/domains/engine/storage-run.d.ts +9 -0
  756. package/dist/domains/engine/storage-run.d.ts.map +1 -0
  757. package/dist/domains/engine/storage-run.js +116 -0
  758. package/dist/domains/engine/storage-run.js.map +1 -0
  759. package/dist/domains/engine/types.d.ts +1 -1
  760. package/dist/domains/engine/types.d.ts.map +1 -1
  761. package/dist/domains/factory/package.d.ts.map +1 -1
  762. package/dist/domains/factory/package.js +562 -91
  763. package/dist/domains/factory/package.js.map +1 -1
  764. package/dist/domains/integrations/codegraph.d.ts +13 -2
  765. package/dist/domains/integrations/codegraph.d.ts.map +1 -1
  766. package/dist/domains/integrations/codegraph.js +160 -12
  767. package/dist/domains/integrations/codegraph.js.map +1 -1
  768. package/dist/domains/integrations/openspec.d.ts +12 -2
  769. package/dist/domains/integrations/openspec.d.ts.map +1 -1
  770. package/dist/domains/integrations/openspec.js +256 -47
  771. package/dist/domains/integrations/openspec.js.map +1 -1
  772. package/dist/domains/skill/find.js +8 -7
  773. package/dist/domains/skill/find.js.map +1 -1
  774. package/dist/domains/skill/json-object.d.ts +13 -0
  775. package/dist/domains/skill/json-object.d.ts.map +1 -0
  776. package/dist/domains/skill/json-object.js +24 -0
  777. package/dist/domains/skill/json-object.js.map +1 -0
  778. package/dist/domains/skill/languages.d.ts +2 -1
  779. package/dist/domains/skill/languages.d.ts.map +1 -1
  780. package/dist/domains/skill/languages.js +4 -1
  781. package/dist/domains/skill/languages.js.map +1 -1
  782. package/dist/domains/skill/managed-markdown.d.ts +14 -0
  783. package/dist/domains/skill/managed-markdown.d.ts.map +1 -0
  784. package/dist/domains/skill/managed-markdown.js +126 -0
  785. package/dist/domains/skill/managed-markdown.js.map +1 -0
  786. package/dist/domains/skill/platform-inspect.d.ts +13 -0
  787. package/dist/domains/skill/platform-inspect.d.ts.map +1 -0
  788. package/dist/domains/skill/platform-inspect.js +193 -0
  789. package/dist/domains/skill/platform-inspect.js.map +1 -0
  790. package/dist/domains/skill/platform-install.d.ts +38 -23
  791. package/dist/domains/skill/platform-install.d.ts.map +1 -1
  792. package/dist/domains/skill/platform-install.js +809 -230
  793. package/dist/domains/skill/platform-install.js.map +1 -1
  794. package/dist/domains/skill/project-instructions.d.ts +22 -0
  795. package/dist/domains/skill/project-instructions.d.ts.map +1 -0
  796. package/dist/domains/skill/project-instructions.js +69 -0
  797. package/dist/domains/skill/project-instructions.js.map +1 -0
  798. package/dist/domains/skill/uninstall.d.ts +9 -2
  799. package/dist/domains/skill/uninstall.d.ts.map +1 -1
  800. package/dist/domains/skill/uninstall.js +734 -158
  801. package/dist/domains/skill/uninstall.js.map +1 -1
  802. package/dist/domains/workflow-contract/builtins.d.ts +6 -0
  803. package/dist/domains/workflow-contract/builtins.d.ts.map +1 -1
  804. package/dist/domains/workflow-contract/builtins.js +149 -6
  805. package/dist/domains/workflow-contract/builtins.js.map +1 -1
  806. package/dist/domains/workflow-contract/contained-atomic-write.d.ts +21 -0
  807. package/dist/domains/workflow-contract/contained-atomic-write.d.ts.map +1 -0
  808. package/dist/domains/workflow-contract/contained-atomic-write.js +235 -0
  809. package/dist/domains/workflow-contract/contained-atomic-write.js.map +1 -0
  810. package/dist/domains/workflow-contract/index.d.ts +11 -1
  811. package/dist/domains/workflow-contract/index.d.ts.map +1 -1
  812. package/dist/domains/workflow-contract/index.js +7 -1
  813. package/dist/domains/workflow-contract/index.js.map +1 -1
  814. package/dist/domains/workflow-contract/normalize.d.ts.map +1 -1
  815. package/dist/domains/workflow-contract/normalize.js +30 -11
  816. package/dist/domains/workflow-contract/normalize.js.map +1 -1
  817. package/dist/domains/workflow-contract/project-config-reader.d.ts +24 -0
  818. package/dist/domains/workflow-contract/project-config-reader.d.ts.map +1 -0
  819. package/dist/domains/workflow-contract/project-config-reader.js +54 -0
  820. package/dist/domains/workflow-contract/project-config-reader.js.map +1 -0
  821. package/dist/domains/workflow-contract/project-config-transaction.d.ts +20 -0
  822. package/dist/domains/workflow-contract/project-config-transaction.d.ts.map +1 -0
  823. package/dist/domains/workflow-contract/project-config-transaction.js +293 -0
  824. package/dist/domains/workflow-contract/project-config-transaction.js.map +1 -0
  825. package/dist/domains/workflow-contract/project-config-writer.d.ts +13 -0
  826. package/dist/domains/workflow-contract/project-config-writer.d.ts.map +1 -0
  827. package/dist/domains/workflow-contract/project-config-writer.js +142 -0
  828. package/dist/domains/workflow-contract/project-config-writer.js.map +1 -0
  829. package/dist/domains/workflow-contract/project-config.d.ts +32 -0
  830. package/dist/domains/workflow-contract/project-config.d.ts.map +1 -0
  831. package/dist/domains/workflow-contract/project-config.js +1566 -0
  832. package/dist/domains/workflow-contract/project-config.js.map +1 -0
  833. package/dist/domains/workflow-contract/protected-project-path.d.ts +34 -0
  834. package/dist/domains/workflow-contract/protected-project-path.d.ts.map +1 -0
  835. package/dist/domains/workflow-contract/protected-project-path.js +162 -0
  836. package/dist/domains/workflow-contract/protected-project-path.js.map +1 -0
  837. package/dist/domains/workflow-contract/types.d.ts +67 -2
  838. package/dist/domains/workflow-contract/types.d.ts.map +1 -1
  839. package/dist/domains/workflow-contract/validation.d.ts.map +1 -1
  840. package/dist/domains/workflow-contract/validation.js +14 -5
  841. package/dist/domains/workflow-contract/validation.js.map +1 -1
  842. package/dist/platform/fs/file-identity.d.ts +9 -0
  843. package/dist/platform/fs/file-identity.d.ts.map +1 -0
  844. package/dist/platform/fs/file-identity.js +21 -0
  845. package/dist/platform/fs/file-identity.js.map +1 -0
  846. package/dist/platform/fs/file-system.d.ts +3 -3
  847. package/dist/platform/fs/file-system.d.ts.map +1 -1
  848. package/dist/platform/fs/file-system.js +31 -17
  849. package/dist/platform/fs/file-system.js.map +1 -1
  850. package/dist/platform/fs/race-safe-read.d.ts +47 -0
  851. package/dist/platform/fs/race-safe-read.d.ts.map +1 -0
  852. package/dist/platform/fs/race-safe-read.js +132 -0
  853. package/dist/platform/fs/race-safe-read.js.map +1 -0
  854. package/dist/platform/fs/trusted-readonly-file.d.ts +31 -0
  855. package/dist/platform/fs/trusted-readonly-file.d.ts.map +1 -0
  856. package/dist/platform/fs/trusted-readonly-file.js +107 -0
  857. package/dist/platform/fs/trusted-readonly-file.js.map +1 -0
  858. package/dist/platform/install/detect.d.ts +5 -2
  859. package/dist/platform/install/detect.d.ts.map +1 -1
  860. package/dist/platform/install/detect.js +14 -2
  861. package/dist/platform/install/detect.js.map +1 -1
  862. package/dist/platform/install/platform-targets.d.ts +8 -0
  863. package/dist/platform/install/platform-targets.d.ts.map +1 -0
  864. package/dist/platform/install/platform-targets.js +31 -0
  865. package/dist/platform/install/platform-targets.js.map +1 -0
  866. package/dist/platform/install/platforms.d.ts +10 -1
  867. package/dist/platform/install/platforms.d.ts.map +1 -1
  868. package/dist/platform/install/platforms.js +27 -4
  869. package/dist/platform/install/platforms.js.map +1 -1
  870. package/dist/platform/install/project-registry.d.ts +38 -0
  871. package/dist/platform/install/project-registry.d.ts.map +1 -0
  872. package/dist/platform/install/project-registry.js +213 -0
  873. package/dist/platform/install/project-registry.js.map +1 -0
  874. package/dist/platform/install/skill-root-owner.d.ts +15 -0
  875. package/dist/platform/install/skill-root-owner.d.ts.map +1 -0
  876. package/dist/platform/install/skill-root-owner.js +68 -0
  877. package/dist/platform/install/skill-root-owner.js.map +1 -0
  878. package/dist/platform/paths/git-worktree.d.ts +10 -0
  879. package/dist/platform/paths/git-worktree.d.ts.map +1 -0
  880. package/dist/platform/paths/git-worktree.js +43 -0
  881. package/dist/platform/paths/git-worktree.js.map +1 -0
  882. package/dist/platform/paths/repository-layout.d.ts +16 -0
  883. package/dist/platform/paths/repository-layout.d.ts.map +1 -1
  884. package/dist/platform/paths/repository-layout.js.map +1 -1
  885. package/dist/platform/process/terminate-process-tree.d.ts +3 -0
  886. package/dist/platform/process/terminate-process-tree.d.ts.map +1 -0
  887. package/dist/platform/process/terminate-process-tree.js +65 -0
  888. package/dist/platform/process/terminate-process-tree.js.map +1 -0
  889. package/eval/CLAUDE.md +43 -0
  890. package/eval/README.md +538 -0
  891. package/eval/langsmith/README.md +93 -0
  892. package/eval/langsmith/skills/README.md +5 -0
  893. package/eval/langsmith/tasks/README.md +5 -0
  894. package/eval/langsmith/tests/conftest.py +187 -0
  895. package/eval/langsmith/tests/tasks/test_tasks.py +287 -0
  896. package/eval/langsmith/treatments/README.md +5 -0
  897. package/eval/local/README.md +130 -0
  898. package/eval/local/regression_baseline.json +13 -0
  899. package/eval/local/report-style-demo-assets/quality_cost.en.svg +41 -0
  900. package/eval/local/report-style-demo-assets/quality_cost.zh.svg +41 -0
  901. package/eval/local/report-style-demo-assets/rubric_delta.en.svg +56 -0
  902. package/eval/local/report-style-demo-assets/rubric_delta.zh.svg +56 -0
  903. package/eval/local/report-style-demo-assets/task_outcomes.en.svg +46 -0
  904. package/eval/local/report-style-demo-assets/task_outcomes.zh.svg +46 -0
  905. package/eval/local/report-style-demo.html +867 -0
  906. package/eval/local/scripts/compare_baselines.py +1144 -0
  907. package/eval/local/scripts/generate_report_style_demo_charts.py +322 -0
  908. package/eval/local/scripts/regression_check.py +170 -0
  909. package/eval/local/scripts/render_readme_benchmark_figures.py +416 -0
  910. package/eval/local/scripts/rescore_rubric.py +120 -0
  911. package/eval/local/skills/benchmarks/039-release/comet-classic-039/SKILL.md +282 -0
  912. package/eval/local/skills/benchmarks/039-release/comet-classic-039/reference/auto-transition.md +27 -0
  913. package/eval/local/skills/benchmarks/039-release/comet-classic-039/reference/comet-yaml-fields.md +68 -0
  914. package/eval/local/skills/benchmarks/039-release/comet-classic-039/reference/context-recovery.md +35 -0
  915. package/eval/local/skills/benchmarks/039-release/comet-classic-039/reference/debug-gate.md +17 -0
  916. package/eval/local/skills/benchmarks/039-release/comet-classic-039/reference/decision-point.md +20 -0
  917. package/eval/local/skills/benchmarks/039-release/comet-classic-039/reference/dirty-worktree.md +59 -0
  918. package/eval/local/skills/benchmarks/039-release/comet-classic-039/reference/file-structure.md +28 -0
  919. package/eval/local/skills/benchmarks/039-release/comet-classic-039/reference/subagent-dispatch.md +113 -0
  920. package/eval/local/skills/benchmarks/039-release/comet-classic-039/rules/comet-phase-guard.md +125 -0
  921. package/eval/local/skills/benchmarks/039-release/comet-classic-039/scripts/comet-archive.sh +311 -0
  922. package/eval/local/skills/benchmarks/039-release/comet-classic-039/scripts/comet-env.sh +110 -0
  923. package/eval/local/skills/benchmarks/039-release/comet-classic-039/scripts/comet-guard.sh +778 -0
  924. package/eval/local/skills/benchmarks/039-release/comet-classic-039/scripts/comet-handoff.sh +390 -0
  925. package/eval/local/skills/benchmarks/039-release/comet-classic-039/scripts/comet-hook-guard.sh +336 -0
  926. package/eval/local/skills/benchmarks/039-release/comet-classic-039/scripts/comet-state.sh +1338 -0
  927. package/eval/local/skills/benchmarks/039-release/comet-classic-039/scripts/comet-yaml-validate.sh +225 -0
  928. package/eval/local/skills/benchmarks/039-release/comet-classic-039-archive/SKILL.md +100 -0
  929. package/eval/local/skills/benchmarks/039-release/comet-classic-039-build/SKILL.md +304 -0
  930. package/eval/local/skills/benchmarks/039-release/comet-classic-039-design/SKILL.md +263 -0
  931. package/eval/local/skills/benchmarks/039-release/comet-classic-039-hotfix/SKILL.md +204 -0
  932. package/eval/local/skills/benchmarks/039-release/comet-classic-039-open/SKILL.md +220 -0
  933. package/eval/local/skills/benchmarks/039-release/comet-classic-039-tweak/SKILL.md +180 -0
  934. package/eval/local/skills/benchmarks/039-release/comet-classic-039-verify/SKILL.md +234 -0
  935. package/eval/local/skills/benchmarks/040-beta/comet/SKILL.md +261 -0
  936. package/eval/local/skills/benchmarks/040-beta/comet/reference/auto-transition.md +27 -0
  937. package/eval/local/skills/benchmarks/040-beta/comet/reference/comet-yaml-fields.md +73 -0
  938. package/eval/local/skills/benchmarks/040-beta/comet/reference/context-recovery.md +45 -0
  939. package/eval/local/skills/benchmarks/040-beta/comet/reference/debug-gate.md +33 -0
  940. package/eval/local/skills/benchmarks/040-beta/comet/reference/decision-point.md +31 -0
  941. package/eval/local/skills/benchmarks/040-beta/comet/reference/dirty-worktree.md +59 -0
  942. package/eval/local/skills/benchmarks/040-beta/comet/reference/file-structure.md +28 -0
  943. package/eval/local/skills/benchmarks/040-beta/comet/reference/intent-frame.md +74 -0
  944. package/eval/local/skills/benchmarks/040-beta/comet/reference/scripts.md +69 -0
  945. package/eval/local/skills/benchmarks/040-beta/comet/reference/subagent-dispatch.md +169 -0
  946. package/eval/local/skills/benchmarks/040-beta/comet/rules/comet-phase-guard.md +130 -0
  947. package/eval/local/skills/benchmarks/040-beta/comet/runtime/classic/checks.yaml +6 -0
  948. package/eval/local/skills/benchmarks/040-beta/comet/runtime/classic/guardrails.yaml +13 -0
  949. package/eval/local/skills/benchmarks/040-beta/comet/runtime/classic/skill.yaml +122 -0
  950. package/eval/local/skills/benchmarks/040-beta/comet/scripts/comet-archive.mjs +9515 -0
  951. package/eval/local/skills/benchmarks/040-beta/comet/scripts/comet-env.mjs +15 -0
  952. package/eval/local/skills/benchmarks/040-beta/comet/scripts/comet-guard.mjs +10173 -0
  953. package/eval/local/skills/benchmarks/040-beta/comet/scripts/comet-handoff.mjs +9491 -0
  954. package/eval/local/skills/benchmarks/040-beta/comet/scripts/comet-hook-guard.mjs +9175 -0
  955. package/eval/local/skills/benchmarks/040-beta/comet/scripts/comet-intent.mjs +404 -0
  956. package/eval/local/skills/benchmarks/040-beta/comet/scripts/comet-state.mjs +9273 -0
  957. package/eval/local/skills/benchmarks/040-beta/comet/scripts/comet-yaml-validate.mjs +7627 -0
  958. package/eval/local/skills/benchmarks/040-beta/comet-archive/SKILL.md +110 -0
  959. package/eval/local/skills/benchmarks/040-beta/comet-build/SKILL.md +315 -0
  960. package/eval/local/skills/benchmarks/040-beta/comet-design/SKILL.md +260 -0
  961. package/eval/local/skills/benchmarks/040-beta/comet-hotfix/SKILL.md +190 -0
  962. package/eval/local/skills/benchmarks/040-beta/comet-open/SKILL.md +210 -0
  963. package/eval/local/skills/benchmarks/040-beta/comet-tweak/SKILL.md +183 -0
  964. package/eval/local/skills/benchmarks/040-beta/comet-verify/SKILL.md +230 -0
  965. package/eval/local/skills/benchmarks/dependency/claude-md/comet-workflow/CLAUDE.md +12 -0
  966. package/eval/local/skills/benchmarks/dependency/openspec/openspec-apply-change/SKILL.md +156 -0
  967. package/eval/local/skills/benchmarks/dependency/openspec/openspec-archive-change/SKILL.md +114 -0
  968. package/eval/local/skills/benchmarks/dependency/openspec/openspec-bulk-archive-change/SKILL.md +246 -0
  969. package/eval/local/skills/benchmarks/dependency/openspec/openspec-continue-change/SKILL.md +118 -0
  970. package/eval/local/skills/benchmarks/dependency/openspec/openspec-explore/SKILL.md +288 -0
  971. package/eval/local/skills/benchmarks/dependency/openspec/openspec-ff-change/SKILL.md +101 -0
  972. package/eval/local/skills/benchmarks/dependency/openspec/openspec-new-change/SKILL.md +74 -0
  973. package/eval/local/skills/benchmarks/dependency/openspec/openspec-onboard/SKILL.md +554 -0
  974. package/eval/local/skills/benchmarks/dependency/openspec/openspec-propose/SKILL.md +110 -0
  975. package/eval/local/skills/benchmarks/dependency/openspec/openspec-sync-specs/SKILL.md +138 -0
  976. package/eval/local/skills/benchmarks/dependency/openspec/openspec-verify-change/SKILL.md +168 -0
  977. package/eval/local/skills/benchmarks/dependency/superpowers/brainstorming/SKILL.md +159 -0
  978. package/eval/local/skills/benchmarks/dependency/superpowers/brainstorming/scripts/frame-template.html +213 -0
  979. package/eval/local/skills/benchmarks/dependency/superpowers/brainstorming/scripts/helper.js +167 -0
  980. package/eval/local/skills/benchmarks/dependency/superpowers/brainstorming/scripts/server.cjs +723 -0
  981. package/eval/local/skills/benchmarks/dependency/superpowers/brainstorming/scripts/start-server.sh +209 -0
  982. package/eval/local/skills/benchmarks/dependency/superpowers/brainstorming/scripts/stop-server.sh +120 -0
  983. package/eval/local/skills/benchmarks/dependency/superpowers/brainstorming/spec-document-reviewer-prompt.md +49 -0
  984. package/eval/local/skills/benchmarks/dependency/superpowers/brainstorming/visual-companion.md +291 -0
  985. package/eval/local/skills/benchmarks/dependency/superpowers/dispatching-parallel-agents/SKILL.md +185 -0
  986. package/eval/local/skills/benchmarks/dependency/superpowers/executing-plans/SKILL.md +70 -0
  987. package/eval/local/skills/benchmarks/dependency/superpowers/finishing-a-development-branch/SKILL.md +241 -0
  988. package/eval/local/skills/benchmarks/dependency/superpowers/receiving-code-review/SKILL.md +213 -0
  989. package/eval/local/skills/benchmarks/dependency/superpowers/requesting-code-review/SKILL.md +103 -0
  990. package/eval/local/skills/benchmarks/dependency/superpowers/requesting-code-review/code-reviewer.md +172 -0
  991. package/eval/local/skills/benchmarks/dependency/superpowers/subagent-driven-development/SKILL.md +418 -0
  992. package/eval/local/skills/benchmarks/dependency/superpowers/subagent-driven-development/implementer-prompt.md +139 -0
  993. package/eval/local/skills/benchmarks/dependency/superpowers/subagent-driven-development/scripts/review-package +44 -0
  994. package/eval/local/skills/benchmarks/dependency/superpowers/subagent-driven-development/scripts/sdd-workspace +22 -0
  995. package/eval/local/skills/benchmarks/dependency/superpowers/subagent-driven-development/scripts/task-brief +40 -0
  996. package/eval/local/skills/benchmarks/dependency/superpowers/subagent-driven-development/task-reviewer-prompt.md +188 -0
  997. package/eval/local/skills/benchmarks/dependency/superpowers/systematic-debugging/CREATION-LOG.md +119 -0
  998. package/eval/local/skills/benchmarks/dependency/superpowers/systematic-debugging/SKILL.md +296 -0
  999. package/eval/local/skills/benchmarks/dependency/superpowers/systematic-debugging/condition-based-waiting-example.ts +158 -0
  1000. package/eval/local/skills/benchmarks/dependency/superpowers/systematic-debugging/condition-based-waiting.md +115 -0
  1001. package/eval/local/skills/benchmarks/dependency/superpowers/systematic-debugging/defense-in-depth.md +122 -0
  1002. package/eval/local/skills/benchmarks/dependency/superpowers/systematic-debugging/find-polluter.sh +63 -0
  1003. package/eval/local/skills/benchmarks/dependency/superpowers/systematic-debugging/root-cause-tracing.md +169 -0
  1004. package/eval/local/skills/benchmarks/dependency/superpowers/systematic-debugging/test-academic.md +14 -0
  1005. package/eval/local/skills/benchmarks/dependency/superpowers/systematic-debugging/test-pressure-1.md +58 -0
  1006. package/eval/local/skills/benchmarks/dependency/superpowers/systematic-debugging/test-pressure-2.md +68 -0
  1007. package/eval/local/skills/benchmarks/dependency/superpowers/systematic-debugging/test-pressure-3.md +69 -0
  1008. package/eval/local/skills/benchmarks/dependency/superpowers/test-driven-development/SKILL.md +371 -0
  1009. package/eval/local/skills/benchmarks/dependency/superpowers/test-driven-development/testing-anti-patterns.md +299 -0
  1010. package/eval/local/skills/benchmarks/dependency/superpowers/using-git-worktrees/SKILL.md +202 -0
  1011. package/eval/local/skills/benchmarks/dependency/superpowers/verification-before-completion/SKILL.md +139 -0
  1012. package/eval/local/skills/benchmarks/dependency/superpowers/writing-plans/SKILL.md +174 -0
  1013. package/eval/local/skills/benchmarks/dependency/superpowers/writing-plans/plan-document-reviewer-prompt.md +49 -0
  1014. package/eval/local/skills/benchmarks/dependency/superpowers/writing-skills/SKILL.md +689 -0
  1015. package/eval/local/skills/benchmarks/dependency/superpowers/writing-skills/anthropic-best-practices.md +1150 -0
  1016. package/eval/local/skills/benchmarks/dependency/superpowers/writing-skills/examples/CLAUDE_MD_TESTING.md +189 -0
  1017. package/eval/local/skills/benchmarks/dependency/superpowers/writing-skills/graphviz-conventions.dot +172 -0
  1018. package/eval/local/skills/benchmarks/dependency/superpowers/writing-skills/persuasion-principles.md +187 -0
  1019. package/eval/local/skills/benchmarks/dependency/superpowers/writing-skills/render-graphs.js +168 -0
  1020. package/eval/local/skills/benchmarks/dependency/superpowers/writing-skills/testing-skills-with-subagents.md +384 -0
  1021. package/eval/local/tasks/authoring-skill-smoke/environment/Dockerfile +14 -0
  1022. package/eval/local/tasks/authoring-skill-smoke/instruction.md +4 -0
  1023. package/eval/local/tasks/authoring-skill-smoke/task.toml +21 -0
  1024. package/eval/local/tasks/authoring-skill-smoke/validation/test_authoring_skill_smoke.py +54 -0
  1025. package/eval/local/tasks/comet-agent-memory-routing/environment/Dockerfile +26 -0
  1026. package/eval/local/tasks/comet-agent-memory-routing/environment/agent_system.py +40 -0
  1027. package/eval/local/tasks/comet-agent-memory-routing/environment/test_agent_system.py +29 -0
  1028. package/eval/local/tasks/comet-agent-memory-routing/instruction.md +20 -0
  1029. package/eval/local/tasks/comet-agent-memory-routing/task.toml +24 -0
  1030. package/eval/local/tasks/comet-agent-memory-routing/validation/test_agent_memory_routing.py +24 -0
  1031. package/eval/local/tasks/comet-api-cache-ttl/environment/Dockerfile +35 -0
  1032. package/eval/local/tasks/comet-api-cache-ttl/environment/cache.py +39 -0
  1033. package/eval/local/tasks/comet-api-cache-ttl/environment/test_cache.py +81 -0
  1034. package/eval/local/tasks/comet-api-cache-ttl/instruction.md +33 -0
  1035. package/eval/local/tasks/comet-api-cache-ttl/task.toml +24 -0
  1036. package/eval/local/tasks/comet-api-cache-ttl/validation/test_api_cache_ttl.py +58 -0
  1037. package/eval/local/tasks/comet-classic-layout-lifecycle/environment/.include-current-comet-cli +1 -0
  1038. package/eval/local/tasks/comet-classic-layout-lifecycle/environment/Dockerfile +45 -0
  1039. package/eval/local/tasks/comet-classic-layout-lifecycle/environment/current-comet-package.json +18 -0
  1040. package/eval/local/tasks/comet-classic-layout-lifecycle/environment/current-comet.sh +14 -0
  1041. package/eval/local/tasks/comet-classic-layout-lifecycle/environment/test_wordcount.py +29 -0
  1042. package/eval/local/tasks/comet-classic-layout-lifecycle/environment/wordcount.py +40 -0
  1043. package/eval/local/tasks/comet-classic-layout-lifecycle/instruction.md +18 -0
  1044. package/eval/local/tasks/comet-classic-layout-lifecycle/task.toml +23 -0
  1045. package/eval/local/tasks/comet-classic-layout-lifecycle/validation/test_classic_layout_lifecycle.py +604 -0
  1046. package/eval/local/tasks/comet-cross-file-refactor/environment/Dockerfile +15 -0
  1047. package/eval/local/tasks/comet-cross-file-refactor/environment/cli.py +13 -0
  1048. package/eval/local/tasks/comet-cross-file-refactor/environment/counting.py +13 -0
  1049. package/eval/local/tasks/comet-cross-file-refactor/environment/test_textkit.py +21 -0
  1050. package/eval/local/tasks/comet-cross-file-refactor/instruction.md +16 -0
  1051. package/eval/local/tasks/comet-cross-file-refactor/task.toml +20 -0
  1052. package/eval/local/tasks/comet-cross-file-refactor/validation/test_cross_file_refactor.py +20 -0
  1053. package/eval/local/tasks/comet-dependency-confusion/environment/Dockerfile +25 -0
  1054. package/eval/local/tasks/comet-dependency-confusion/environment/app.py +8 -0
  1055. package/eval/local/tasks/comet-dependency-confusion/environment/settings_loader.py +14 -0
  1056. package/eval/local/tasks/comet-dependency-confusion/environment/test_settings_service.py +19 -0
  1057. package/eval/local/tasks/comet-dependency-confusion/instruction.md +18 -0
  1058. package/eval/local/tasks/comet-dependency-confusion/task.toml +24 -0
  1059. package/eval/local/tasks/comet-dependency-confusion/validation/test_dependency_confusion.py +24 -0
  1060. package/eval/local/tasks/comet-fix-median/environment/Dockerfile +46 -0
  1061. package/eval/local/tasks/comet-fix-median/environment/stats.py +54 -0
  1062. package/eval/local/tasks/comet-fix-median/environment/test_stats.py +68 -0
  1063. package/eval/local/tasks/comet-fix-median/instruction.md +25 -0
  1064. package/eval/local/tasks/comet-fix-median/task.toml +24 -0
  1065. package/eval/local/tasks/comet-fix-median/validation/test_fix_median.py +60 -0
  1066. package/eval/local/tasks/comet-framework-selection/environment/Dockerfile +25 -0
  1067. package/eval/local/tasks/comet-framework-selection/environment/architecture.py +12 -0
  1068. package/eval/local/tasks/comet-framework-selection/environment/test_architecture.py +30 -0
  1069. package/eval/local/tasks/comet-framework-selection/instruction.md +22 -0
  1070. package/eval/local/tasks/comet-framework-selection/task.toml +24 -0
  1071. package/eval/local/tasks/comet-framework-selection/validation/test_framework_selection.py +24 -0
  1072. package/eval/local/tasks/comet-full-workflow/environment/Dockerfile +49 -0
  1073. package/eval/local/tasks/comet-full-workflow/environment/test_wordcount.py +29 -0
  1074. package/eval/local/tasks/comet-full-workflow/environment/wordcount.py +40 -0
  1075. package/eval/local/tasks/comet-full-workflow/instruction.md +18 -0
  1076. package/eval/local/tasks/comet-full-workflow/task.toml +24 -0
  1077. package/eval/local/tasks/comet-full-workflow/validation/test_full_workflow.py +171 -0
  1078. package/eval/local/tasks/comet-graph-execution-review/environment/Dockerfile +25 -0
  1079. package/eval/local/tasks/comet-graph-execution-review/environment/pipeline.py +19 -0
  1080. package/eval/local/tasks/comet-graph-execution-review/environment/test_pipeline.py +53 -0
  1081. package/eval/local/tasks/comet-graph-execution-review/instruction.md +21 -0
  1082. package/eval/local/tasks/comet-graph-execution-review/task.toml +24 -0
  1083. package/eval/local/tasks/comet-graph-execution-review/validation/test_graph_execution_review.py +24 -0
  1084. package/eval/local/tasks/comet-human-approval-flow/environment/Dockerfile +15 -0
  1085. package/eval/local/tasks/comet-human-approval-flow/environment/approvals.py +17 -0
  1086. package/eval/local/tasks/comet-human-approval-flow/environment/test_approvals.py +30 -0
  1087. package/eval/local/tasks/comet-human-approval-flow/instruction.md +15 -0
  1088. package/eval/local/tasks/comet-human-approval-flow/task.toml +20 -0
  1089. package/eval/local/tasks/comet-human-approval-flow/validation/test_human_approval_flow.py +20 -0
  1090. package/eval/local/tasks/comet-layered-streaming-fix/environment/Dockerfile +17 -0
  1091. package/eval/local/tasks/comet-layered-streaming-fix/environment/chat_app.py +19 -0
  1092. package/eval/local/tasks/comet-layered-streaming-fix/environment/test_chat_app.py +15 -0
  1093. package/eval/local/tasks/comet-layered-streaming-fix/instruction.md +14 -0
  1094. package/eval/local/tasks/comet-layered-streaming-fix/task.toml +20 -0
  1095. package/eval/local/tasks/comet-layered-streaming-fix/validation/test_layered_streaming_fix.py +20 -0
  1096. package/eval/local/tasks/comet-native-clarification/environment/Dockerfile +25 -0
  1097. package/eval/local/tasks/comet-native-clarification/environment/test_wordcount.py +25 -0
  1098. package/eval/local/tasks/comet-native-clarification/environment/wordcount.py +36 -0
  1099. package/eval/local/tasks/comet-native-clarification/instruction.md +7 -0
  1100. package/eval/local/tasks/comet-native-clarification/task.toml +40 -0
  1101. package/eval/local/tasks/comet-native-clarification/validation/test_native_clarification.py +193 -0
  1102. package/eval/local/tasks/comet-native-clarification-depth/environment/Dockerfile +25 -0
  1103. package/eval/local/tasks/comet-native-clarification-depth/environment/test_wordcount.py +25 -0
  1104. package/eval/local/tasks/comet-native-clarification-depth/environment/wordcount.py +36 -0
  1105. package/eval/local/tasks/comet-native-clarification-depth/instruction.md +17 -0
  1106. package/eval/local/tasks/comet-native-clarification-depth/task.toml +47 -0
  1107. package/eval/local/tasks/comet-native-clarification-depth/validation/test_native_clarification_depth.py +618 -0
  1108. package/eval/local/tasks/comet-native-clarification-modes/environment/Dockerfile +25 -0
  1109. package/eval/local/tasks/comet-native-clarification-modes/environment/test_wordcount.py +25 -0
  1110. package/eval/local/tasks/comet-native-clarification-modes/environment/wordcount.py +36 -0
  1111. package/eval/local/tasks/comet-native-clarification-modes/instruction.md +13 -0
  1112. package/eval/local/tasks/comet-native-clarification-modes/task.toml +39 -0
  1113. package/eval/local/tasks/comet-native-clarification-modes/validation/test_native_clarification_modes.py +235 -0
  1114. package/eval/local/tasks/comet-native-interrupted-transition/environment/.comet/config.yaml +6 -0
  1115. package/eval/local/tasks/comet-native-interrupted-transition/environment/Dockerfile +26 -0
  1116. package/eval/local/tasks/comet-native-interrupted-transition/environment/docs/comet/changes/add-character-counting/brief.md +17 -0
  1117. package/eval/local/tasks/comet-native-interrupted-transition/environment/docs/comet/changes/add-character-counting/comet-state.yaml +12 -0
  1118. package/eval/local/tasks/comet-native-interrupted-transition/environment/docs/comet/changes/add-character-counting/runtime/transition.json +69 -0
  1119. package/eval/local/tasks/comet-native-interrupted-transition/environment/docs/comet/changes/add-character-counting/specs/character-counting/spec.md +3 -0
  1120. package/eval/local/tasks/comet-native-interrupted-transition/environment/test_wordcount.py +20 -0
  1121. package/eval/local/tasks/comet-native-interrupted-transition/environment/wordcount.py +27 -0
  1122. package/eval/local/tasks/comet-native-interrupted-transition/instruction.md +7 -0
  1123. package/eval/local/tasks/comet-native-interrupted-transition/task.toml +35 -0
  1124. package/eval/local/tasks/comet-native-interrupted-transition/validation/test_native_interrupted_transition.py +63 -0
  1125. package/eval/local/tasks/comet-native-repository-fact/environment/Dockerfile +24 -0
  1126. package/eval/local/tasks/comet-native-repository-fact/environment/PRODUCT_RULES.md +3 -0
  1127. package/eval/local/tasks/comet-native-repository-fact/environment/test_wordcount.py +20 -0
  1128. package/eval/local/tasks/comet-native-repository-fact/environment/wordcount.py +27 -0
  1129. package/eval/local/tasks/comet-native-repository-fact/instruction.md +7 -0
  1130. package/eval/local/tasks/comet-native-repository-fact/task.toml +35 -0
  1131. package/eval/local/tasks/comet-native-repository-fact/validation/test_native_repository_fact.py +53 -0
  1132. package/eval/local/tasks/comet-native-wave-b-decision-resume/environment/Dockerfile +25 -0
  1133. package/eval/local/tasks/comet-native-wave-b-decision-resume/environment/test_wordcount.py +27 -0
  1134. package/eval/local/tasks/comet-native-wave-b-decision-resume/environment/wordcount.py +36 -0
  1135. package/eval/local/tasks/comet-native-wave-b-decision-resume/instruction.md +9 -0
  1136. package/eval/local/tasks/comet-native-wave-b-decision-resume/task.toml +40 -0
  1137. package/eval/local/tasks/comet-native-wave-b-decision-resume/validation/test_native_wave_b_decision_resume.py +208 -0
  1138. package/eval/local/tasks/comet-native-wave-c-verification-integrity/environment/Dockerfile +25 -0
  1139. package/eval/local/tasks/comet-native-wave-c-verification-integrity/environment/test_wordcount.py +27 -0
  1140. package/eval/local/tasks/comet-native-wave-c-verification-integrity/environment/wordcount.py +36 -0
  1141. package/eval/local/tasks/comet-native-wave-c-verification-integrity/instruction.md +11 -0
  1142. package/eval/local/tasks/comet-native-wave-c-verification-integrity/task.toml +36 -0
  1143. package/eval/local/tasks/comet-native-wave-c-verification-integrity/validation/test_native_wave_c_verification_integrity.py +344 -0
  1144. package/eval/local/tasks/comet-native-wave-d-stagnation-stop/environment/Dockerfile +25 -0
  1145. package/eval/local/tasks/comet-native-wave-d-stagnation-stop/environment/test_wordcount.py +27 -0
  1146. package/eval/local/tasks/comet-native-wave-d-stagnation-stop/environment/wordcount.py +36 -0
  1147. package/eval/local/tasks/comet-native-wave-d-stagnation-stop/instruction.md +11 -0
  1148. package/eval/local/tasks/comet-native-wave-d-stagnation-stop/task.toml +37 -0
  1149. package/eval/local/tasks/comet-native-wave-d-stagnation-stop/validation/test_native_wave_d_stagnation_stop.py +284 -0
  1150. package/eval/local/tasks/comet-native-wave-e-parallel-safety/environment/.include-trusted-native-runtime +1 -0
  1151. package/eval/local/tasks/comet-native-wave-e-parallel-safety/environment/Dockerfile +25 -0
  1152. package/eval/local/tasks/comet-native-wave-e-parallel-safety/environment/test_wordcount.py +27 -0
  1153. package/eval/local/tasks/comet-native-wave-e-parallel-safety/environment/wordcount.py +36 -0
  1154. package/eval/local/tasks/comet-native-wave-e-parallel-safety/instruction.md +9 -0
  1155. package/eval/local/tasks/comet-native-wave-e-parallel-safety/task.toml +37 -0
  1156. package/eval/local/tasks/comet-native-wave-e-parallel-safety/validation/test_native_wave_e_parallel_safety.py +309 -0
  1157. package/eval/local/tasks/comet-native-wave-f-dashboard-readonly/environment/.include-current-comet-cli +1 -0
  1158. package/eval/local/tasks/comet-native-wave-f-dashboard-readonly/environment/Dockerfile +29 -0
  1159. package/eval/local/tasks/comet-native-wave-f-dashboard-readonly/environment/current-comet-package.json +18 -0
  1160. package/eval/local/tasks/comet-native-wave-f-dashboard-readonly/environment/current-comet.sh +14 -0
  1161. package/eval/local/tasks/comet-native-wave-f-dashboard-readonly/environment/test_wordcount.py +27 -0
  1162. package/eval/local/tasks/comet-native-wave-f-dashboard-readonly/environment/wordcount.py +36 -0
  1163. package/eval/local/tasks/comet-native-wave-f-dashboard-readonly/instruction.md +7 -0
  1164. package/eval/local/tasks/comet-native-wave-f-dashboard-readonly/task.toml +36 -0
  1165. package/eval/local/tasks/comet-native-wave-f-dashboard-readonly/validation/test_native_wave_f_dashboard_readonly.py +483 -0
  1166. package/eval/local/tasks/comet-native-workflow/environment/.include-trusted-native-review-fixture +1 -0
  1167. package/eval/local/tasks/comet-native-workflow/environment/.include-trusted-native-runtime +1 -0
  1168. package/eval/local/tasks/comet-native-workflow/environment/Dockerfile +26 -0
  1169. package/eval/local/tasks/comet-native-workflow/environment/test_wordcount.py +25 -0
  1170. package/eval/local/tasks/comet-native-workflow/environment/wordcount.py +36 -0
  1171. package/eval/local/tasks/comet-native-workflow/instruction.md +36 -0
  1172. package/eval/local/tasks/comet-native-workflow/task.toml +36 -0
  1173. package/eval/local/tasks/comet-native-workflow/validation/test_native_workflow.py +680 -0
  1174. package/eval/local/tasks/comet-noise-distractor/environment/Dockerfile +15 -0
  1175. package/eval/local/tasks/comet-noise-distractor/environment/distractor.md +4 -0
  1176. package/eval/local/tasks/comet-noise-distractor/environment/invoice.py +5 -0
  1177. package/eval/local/tasks/comet-noise-distractor/environment/test_invoice.py +18 -0
  1178. package/eval/local/tasks/comet-noise-distractor/instruction.md +17 -0
  1179. package/eval/local/tasks/comet-noise-distractor/task.toml +20 -0
  1180. package/eval/local/tasks/comet-noise-distractor/validation/test_noise_distractor.py +20 -0
  1181. package/eval/local/tasks/comet-observability-env-template/environment/Dockerfile +15 -0
  1182. package/eval/local/tasks/comet-observability-env-template/environment/env_writer.py +17 -0
  1183. package/eval/local/tasks/comet-observability-env-template/environment/test_env_writer.py +17 -0
  1184. package/eval/local/tasks/comet-observability-env-template/instruction.md +20 -0
  1185. package/eval/local/tasks/comet-observability-env-template/task.toml +20 -0
  1186. package/eval/local/tasks/comet-observability-env-template/validation/test_observability_env_template.py +46 -0
  1187. package/eval/local/tasks/comet-perf-dedupe/environment/Dockerfile +35 -0
  1188. package/eval/local/tasks/comet-perf-dedupe/environment/dedupe.py +22 -0
  1189. package/eval/local/tasks/comet-perf-dedupe/environment/test_dedupe.py +43 -0
  1190. package/eval/local/tasks/comet-perf-dedupe/instruction.md +25 -0
  1191. package/eval/local/tasks/comet-perf-dedupe/task.toml +24 -0
  1192. package/eval/local/tasks/comet-perf-dedupe/validation/test_perf_dedupe.py +40 -0
  1193. package/eval/local/tasks/comet-persistence-threading/environment/Dockerfile +15 -0
  1194. package/eval/local/tasks/comet-persistence-threading/environment/session_store.py +15 -0
  1195. package/eval/local/tasks/comet-persistence-threading/environment/test_session_store.py +21 -0
  1196. package/eval/local/tasks/comet-persistence-threading/instruction.md +14 -0
  1197. package/eval/local/tasks/comet-persistence-threading/task.toml +20 -0
  1198. package/eval/local/tasks/comet-persistence-threading/validation/test_persistence_threading.py +20 -0
  1199. package/eval/local/tasks/comet-refactor-counter/environment/Dockerfile +35 -0
  1200. package/eval/local/tasks/comet-refactor-counter/environment/test_text_processor.py +57 -0
  1201. package/eval/local/tasks/comet-refactor-counter/environment/text_processor.py +49 -0
  1202. package/eval/local/tasks/comet-refactor-counter/instruction.md +31 -0
  1203. package/eval/local/tasks/comet-refactor-counter/task.toml +24 -0
  1204. package/eval/local/tasks/comet-refactor-counter/validation/test_refactor_counter.py +75 -0
  1205. package/eval/local/tasks/comet-robust-config/environment/Dockerfile +35 -0
  1206. package/eval/local/tasks/comet-robust-config/environment/config_loader.py +56 -0
  1207. package/eval/local/tasks/comet-robust-config/environment/test_config_loader.py +72 -0
  1208. package/eval/local/tasks/comet-robust-config/instruction.md +30 -0
  1209. package/eval/local/tasks/comet-robust-config/task.toml +24 -0
  1210. package/eval/local/tasks/comet-robust-config/validation/test_robust_config.py +37 -0
  1211. package/eval/local/tasks/generic-skill-smoke/environment/Dockerfile +14 -0
  1212. package/eval/local/tasks/generic-skill-smoke/instruction.md +7 -0
  1213. package/eval/local/tasks/generic-skill-smoke/task.toml +21 -0
  1214. package/eval/local/tasks/generic-skill-smoke/validation/test_generic_skill_smoke.py +41 -0
  1215. package/eval/local/tasks/index.yaml +229 -0
  1216. package/eval/local/tasks/workflow-overlay-contract/environment/Dockerfile +16 -0
  1217. package/eval/local/tasks/workflow-overlay-contract/instruction.md +5 -0
  1218. package/eval/local/tasks/workflow-overlay-contract/task.toml +21 -0
  1219. package/eval/local/tasks/workflow-overlay-contract/validation/test_workflow_overlay_contract.py +235 -0
  1220. package/eval/local/tasks/workflow-route-conformance/environment/Dockerfile +14 -0
  1221. package/eval/local/tasks/workflow-route-conformance/instruction.md +5 -0
  1222. package/eval/local/tasks/workflow-route-conformance/task.toml +21 -0
  1223. package/eval/local/tasks/workflow-route-conformance/validation/test_workflow_route_conformance.py +84 -0
  1224. package/eval/local/tests/conftest.py +1946 -0
  1225. package/eval/local/tests/scaffold/test_aligned_comparison.py +1012 -0
  1226. package/eval/local/tests/scaffold/test_attribution.py +48 -0
  1227. package/eval/local/tests/scaffold/test_compare_baselines.py +999 -0
  1228. package/eval/local/tests/scaffold/test_conftest_helpers.py +980 -0
  1229. package/eval/local/tests/scaffold/test_evidence.py +15 -0
  1230. package/eval/local/tests/scaffold/test_langsmith_conftest.py +244 -0
  1231. package/eval/local/tests/scaffold/test_logging.py +377 -0
  1232. package/eval/local/tests/scaffold/test_manifests.py +134 -0
  1233. package/eval/local/tests/scaffold/test_native_aligned_eval.py +353 -0
  1234. package/eval/local/tests/scaffold/test_native_wave_evaluations.py +2183 -0
  1235. package/eval/local/tests/scaffold/test_profiles.py +1149 -0
  1236. package/eval/local/tests/scaffold/test_regression_check.py +19 -0
  1237. package/eval/local/tests/scaffold/test_report_style_demo_charts.py +45 -0
  1238. package/eval/local/tests/scaffold/test_sample_quality.py +268 -0
  1239. package/eval/local/tests/scaffold/test_tasks.py +1013 -0
  1240. package/eval/local/tests/scaffold/test_treatments.py +353 -0
  1241. package/eval/local/tests/scaffold/test_utils.py +561 -0
  1242. package/eval/local/tests/tasks/__init__.py +1 -0
  1243. package/eval/local/tests/tasks/test_tasks.py +474 -0
  1244. package/eval/local/tests/tasks/test_validation_scripts.py +787 -0
  1245. package/eval/local/treatments/comet/comet_classic_docs_layout.yaml +121 -0
  1246. package/eval/local/treatments/comet/comet_full_039.yaml +141 -0
  1247. package/eval/local/treatments/comet/comet_full_040_beta.yaml +140 -0
  1248. package/eval/local/treatments/comet/comet_native_phase1.yaml +66 -0
  1249. package/eval/local/treatments/common/control.yaml +4 -0
  1250. package/eval/pyproject.toml +41 -0
  1251. package/eval/report-html-config.json +6 -0
  1252. package/eval/scaffold/__init__.py +67 -0
  1253. package/eval/scaffold/python/__init__.py +95 -0
  1254. package/eval/scaffold/python/aligned_comparison.py +1632 -0
  1255. package/eval/scaffold/python/attribution.py +43 -0
  1256. package/eval/scaffold/python/evidence.py +38 -0
  1257. package/eval/scaffold/python/external_data_handler.py +18 -0
  1258. package/eval/scaffold/python/generic_llm_judge.py +237 -0
  1259. package/eval/scaffold/python/judge_config.py +168 -0
  1260. package/eval/scaffold/python/llm_judge.py +188 -0
  1261. package/eval/scaffold/python/logging.py +804 -0
  1262. package/eval/scaffold/python/manifests.py +131 -0
  1263. package/eval/scaffold/python/native_eval.py +143 -0
  1264. package/eval/scaffold/python/paper_charts.py +25 -0
  1265. package/eval/scaffold/python/pass_at_k.py +106 -0
  1266. package/eval/scaffold/python/paths.py +56 -0
  1267. package/eval/scaffold/python/profiles.py +127 -0
  1268. package/eval/scaffold/python/report_outputs.py +1573 -0
  1269. package/eval/scaffold/python/sample_quality.py +382 -0
  1270. package/eval/scaffold/python/schema.py +39 -0
  1271. package/eval/scaffold/python/skill_parser.py +469 -0
  1272. package/eval/scaffold/python/tasks.py +343 -0
  1273. package/eval/scaffold/python/treatments.py +271 -0
  1274. package/eval/scaffold/python/utils.py +460 -0
  1275. package/eval/scaffold/python/validation/__init__.py +31 -0
  1276. package/eval/scaffold/python/validation/authoring_rubric.py +328 -0
  1277. package/eval/scaffold/python/validation/comet_workflow.py +227 -0
  1278. package/eval/scaffold/python/validation/core.py +264 -0
  1279. package/eval/scaffold/python/validation/dataset.py +337 -0
  1280. package/eval/scaffold/python/validation/docker.py +106 -0
  1281. package/eval/scaffold/python/validation/evaluator.py +549 -0
  1282. package/eval/scaffold/python/validation/generic_rubric.py +198 -0
  1283. package/eval/scaffold/python/validation/native_wave.py +2154 -0
  1284. package/eval/scaffold/python/validation/native_workflow.py +252 -0
  1285. package/eval/scaffold/python/validation/rubric.py +780 -0
  1286. package/eval/scaffold/python/validation/runner.py +237 -0
  1287. package/eval/scaffold/python/validation/scripts.py +58 -0
  1288. package/eval/scaffold/python/validation/tracing.py +313 -0
  1289. package/eval/scaffold/shell/common.sh +126 -0
  1290. package/eval/scaffold/shell/completion-point.sh +18 -0
  1291. package/eval/scaffold/shell/decision-point.sh +35 -0
  1292. package/eval/scaffold/shell/docker.sh +716 -0
  1293. package/eval/scaffold/shell/native-review-signer-daemon.mjs +144 -0
  1294. package/eval/scaffold/shell/native-review-verifier-daemon.mjs +178 -0
  1295. package/eval/scaffold/shell/run-claude-loop.sh +234 -0
  1296. package/eval/scaffold/shell/setup.sh +259 -0
  1297. package/eval/simulator-instruction.md +9 -0
  1298. package/package.json +64 -10
  1299. package/dist/domains/dashboard/web/assets/demo-DQyfozbi.js +0 -1
  1300. package/dist/domains/dashboard/web/assets/index-BcO3_QlT.css +0 -1
  1301. package/dist/domains/dashboard/web/assets/index-CjU3VXVu.js +0 -22
@@ -0,0 +1,2183 @@
1
+ """Unit contracts for the Native wave B-F evaluation tasks and validators."""
2
+
3
+ from __future__ import annotations
4
+
5
+ import importlib.util
6
+ import base64
7
+ import hashlib
8
+ import json
9
+ import subprocess
10
+ import sys
11
+ from pathlib import Path
12
+
13
+ import yaml
14
+ import pytest
15
+
16
+ from scaffold.python.tasks import load_task
17
+ from scaffold.python.validation.native_wave import (
18
+ build_contract_from_change,
19
+ canonical_hash,
20
+ check_archive_transaction,
21
+ check_checkpoint_cas_envelopes,
22
+ check_dashboard_projection,
23
+ check_json_state,
24
+ check_runtime_envelopes,
25
+ parse_scope_bundle,
26
+ parse_verification_bundle,
27
+ )
28
+
29
+
30
+ EVAL_ROOT = Path(__file__).resolve().parents[3]
31
+ TASKS_ROOT = EVAL_ROOT / "local" / "tasks"
32
+ WAVE_TASKS = {
33
+ "comet-native-wave-b-decision-resume": "auto_user",
34
+ "comet-native-wave-c-verification-integrity": "none",
35
+ "comet-native-wave-d-stagnation-stop": "none",
36
+ "comet-native-wave-e-parallel-safety": "none",
37
+ "comet-native-wave-f-dashboard-readonly": "none",
38
+ }
39
+
40
+
41
+ def load_validator(task_name: str, filename: str):
42
+ path = TASKS_ROOT / task_name / "validation" / filename
43
+ spec = importlib.util.spec_from_file_location(f"validator_{task_name}", path)
44
+ assert spec and spec.loader
45
+ module = importlib.util.module_from_spec(spec)
46
+ spec.loader.exec_module(module)
47
+ return module
48
+
49
+
50
+ def write_json(path: Path, value) -> None:
51
+ path.parent.mkdir(parents=True, exist_ok=True)
52
+ path.write_text(json.dumps(value, indent=2), encoding="utf-8")
53
+
54
+
55
+ SNAPSHOT_LIMITS = {
56
+ "maxFiles": 10000,
57
+ "maxFileBytes": 5 * 1024 * 1024,
58
+ "maxTotalBytes": 64 * 1024 * 1024,
59
+ "maxManifestBytes": 1024 * 1024,
60
+ }
61
+ CHECK_LIMITS = {
62
+ "maxFiles": 256,
63
+ "maxFileBytes": 1024 * 1024,
64
+ "maxTotalBytes": 8 * 1024 * 1024,
65
+ "maxIssues": 128,
66
+ }
67
+ CHECKER_HASH = "0b8e0e9570269a64123ba2794f1f5125cf454695e1d7fda8f0acddf87ec4912f"
68
+
69
+
70
+ def _file_identity(path: Path) -> dict:
71
+ payload = path.read_bytes()
72
+ return {"hash": hashlib.sha256(payload).hexdigest(), "size": len(payload)}
73
+
74
+
75
+ def _projection(entries: list[dict]) -> tuple[dict, str]:
76
+ value = {
77
+ "schema": "comet.native.content-snapshot-projection.v1",
78
+ "origin": "explicit",
79
+ "complete": True,
80
+ "limits": SNAPSHOT_LIMITS,
81
+ "entries": sorted(entries, key=lambda item: item["path"]),
82
+ "omitted": [],
83
+ "omittedCount": 0,
84
+ }
85
+ return value, canonical_hash("comet.native.content-snapshot-projection.v1", value)
86
+
87
+
88
+ def _unattributed_scope(change: dict) -> dict:
89
+ identity = {
90
+ "kind": "unattributed-change",
91
+ "source": "implementation-scope",
92
+ "path": change["path"],
93
+ "evidence": {
94
+ "after": change["after"],
95
+ "before": change["before"],
96
+ "changeKind": change["kind"],
97
+ },
98
+ }
99
+ return {
100
+ "id": f"scope:{canonical_hash('comet.native.unresolved-scope-id.v1', identity)}",
101
+ "kind": identity["kind"],
102
+ "source": identity["source"],
103
+ "path": identity["path"],
104
+ "reason": f"Changed path is not covered by a declared artifact: {change['path']}",
105
+ }
106
+
107
+
108
+ def write_scope(
109
+ workspace: Path,
110
+ change_root: Path,
111
+ contract_hash: str,
112
+ *,
113
+ partial: bool = False,
114
+ ) -> tuple[str, dict]:
115
+ project_entries = []
116
+ for name in ("wordcount.py", "test_wordcount.py"):
117
+ path = workspace / name
118
+ if path.is_file():
119
+ identity = _file_identity(path)
120
+ project_entries.append({"path": name, **identity, "type": "file"})
121
+ baseline, baseline_hash = _projection(project_entries)
122
+ current_entries = list(project_entries)
123
+ if partial:
124
+ current_entries.append(
125
+ {"path": "unrelated.txt", "hash": "9" * 64, "size": 1, "type": "file"}
126
+ )
127
+ current, current_hash = _projection(current_entries)
128
+ change = {
129
+ "path": "unrelated.txt",
130
+ "kind": "added",
131
+ "before": None,
132
+ "after": {"hash": "9" * 64, "size": 1},
133
+ "attributedTo": [],
134
+ }
135
+ unresolved = _unattributed_scope(change)
136
+ content = {
137
+ "schema": "comet.native.implementation-scope.v2",
138
+ "contractHash": contract_hash,
139
+ "baselineProjectionRef": f"runtime/evidence/snapshots/{baseline_hash}.json",
140
+ "baselineProjectionHash": baseline_hash,
141
+ "currentProjectionRef": f"runtime/evidence/snapshots/{current_hash}.json",
142
+ "currentProjectionHash": current_hash,
143
+ "complete": not partial,
144
+ "declaredArtifacts": [],
145
+ "changes": [change] if partial else [],
146
+ "unattributed": [change] if partial else [],
147
+ "unresolvedScopes": [unresolved] if partial else [],
148
+ "noCodeReason": None if partial else "No project content changed during this verification.",
149
+ }
150
+ scope_hash = canonical_hash("comet.native.implementation-scope.v2", content)
151
+ scope = {**content, "scopeHash": scope_hash}
152
+ for kind, digest, value in (
153
+ ("snapshots", baseline_hash, baseline),
154
+ ("snapshots", current_hash, current),
155
+ ("scopes", scope_hash, scope),
156
+ ):
157
+ write_json(change_root / f"runtime/evidence/{kind}/{digest}.json", value)
158
+ return f"runtime/evidence/scopes/{scope_hash}.json", scope
159
+
160
+
161
+ def write_contract_artifacts(
162
+ change_root: Path,
163
+ state: dict,
164
+ capability: str,
165
+ ) -> dict:
166
+ brief = (
167
+ "# Goal\nExercise the Native workflow.\n\n"
168
+ "# Acceptance examples\n- The focused CLI behavior is verified by a project artifact.\n"
169
+ )
170
+ spec = (
171
+ f"# {capability}\n\n## Requirement: Focused behavior\n\n"
172
+ "### Scenario: Focused CLI result\nGiven representative input, the requested output is produced.\n"
173
+ )
174
+ (change_root / f"specs/{capability}").mkdir(parents=True, exist_ok=True)
175
+ (change_root / "brief.md").write_text(brief, encoding="utf-8")
176
+ (change_root / f"specs/{capability}/spec.md").write_text(spec, encoding="utf-8")
177
+ state.update(
178
+ {
179
+ "brief": "brief.md",
180
+ "spec_changes": [
181
+ {
182
+ "capability": capability,
183
+ "operation": "create",
184
+ "source": f"specs/{capability}/spec.md",
185
+ "base_hash": None,
186
+ }
187
+ ],
188
+ }
189
+ )
190
+ return build_contract_from_change(change_root, state)
191
+
192
+
193
+ def write_check_receipt(
194
+ change_root: Path,
195
+ *,
196
+ change: str,
197
+ source_revision: int,
198
+ contract_hash: str,
199
+ scope: dict,
200
+ ) -> str:
201
+ selected = [item for item in scope["changes"] if item["after"] is not None]
202
+ checker = {
203
+ "policy": "scoped-text-safety",
204
+ "version": 1,
205
+ "hash": CHECKER_HASH,
206
+ "limits": CHECK_LIMITS,
207
+ }
208
+ input_hash = canonical_hash(
209
+ "comet.native.check-input.v1",
210
+ {
211
+ "change": change,
212
+ "sourceRevision": source_revision,
213
+ "checkerHash": checker["hash"],
214
+ "contractHash": contract_hash,
215
+ "scopeHash": scope["scopeHash"],
216
+ "snapshotHash": scope["currentProjectionHash"],
217
+ },
218
+ )
219
+ content = {
220
+ "schema": "comet.native.check-receipt.v1",
221
+ "change": change,
222
+ "sourceRevision": source_revision,
223
+ "checker": checker,
224
+ "inputHash": input_hash,
225
+ "status": "passed",
226
+ "startedAt": "2026-07-17T00:00:00.000Z",
227
+ "endedAt": "2026-07-17T00:00:01.000Z",
228
+ "contract": {
229
+ "expectedHash": contract_hash,
230
+ "beforeHash": contract_hash,
231
+ "afterHash": contract_hash,
232
+ },
233
+ "implementation": {
234
+ "scopeHash": scope["scopeHash"],
235
+ "expectedSnapshotHash": scope["currentProjectionHash"],
236
+ "beforeSnapshotHash": scope["currentProjectionHash"],
237
+ "afterSnapshotHash": scope["currentProjectionHash"],
238
+ },
239
+ "counts": {
240
+ "filesSelected": len(selected),
241
+ "filesScanned": len(selected),
242
+ "binaryFilesSkipped": 0,
243
+ "bytesScanned": sum(item["after"]["size"] for item in selected),
244
+ "issueCount": 0,
245
+ "recordedIssueCount": 0,
246
+ },
247
+ "issues": [],
248
+ "issuesTruncated": False,
249
+ "stale": False,
250
+ "staleReasons": [],
251
+ }
252
+ receipt_hash = canonical_hash("comet.native.check-receipt.v1", content)
253
+ receipt_ref = f"runtime/evidence/check-receipts/{receipt_hash}.json"
254
+ write_json(change_root / receipt_ref, {**content, "receiptHash": receipt_hash})
255
+ return receipt_ref
256
+
257
+
258
+ def write_verification_bundle(
259
+ workspace: Path,
260
+ change_root: Path,
261
+ state: dict,
262
+ contract: dict,
263
+ *,
264
+ result: str,
265
+ source_revision: int,
266
+ created_at: str,
267
+ partial: bool = False,
268
+ include_receipt: bool = False,
269
+ ) -> str:
270
+ scope_ref, scope = write_scope(
271
+ workspace, change_root, contract["contractHash"], partial=partial
272
+ )
273
+ allowance_ref = None
274
+ allowance_hash = None
275
+ if partial:
276
+ allowance_content = {
277
+ "schema": "comet.native.partial-allowance.v1",
278
+ "change": state["name"],
279
+ "scopeHash": scope["scopeHash"],
280
+ "scopeIds": [item["id"] for item in scope["unresolvedScopes"]],
281
+ "reason": "The unrelated fixture file is intentionally outside this change.",
282
+ "confirmedSummary": "Confirmed the exact partial scope for this eval.",
283
+ "sourceRevision": source_revision - 1,
284
+ "confirmedAt": "2026-07-17T00:00:00.000Z",
285
+ }
286
+ allowance_hash = canonical_hash("comet.native.partial-allowance.v1", allowance_content)
287
+ allowance = {**allowance_content, "allowanceHash": allowance_hash}
288
+ allowance_ref = f"runtime/evidence/allowances/{allowance_hash}.json"
289
+ write_json(change_root / allowance_ref, allowance)
290
+ report_ref = f"verification-{source_revision}.md"
291
+ report_text = (
292
+ "\n".join(
293
+ f"acceptance_id: {criterion['id']}\nevidence: project file"
294
+ for criterion in contract["acceptance"]
295
+ )
296
+ + "\n"
297
+ )
298
+ (change_root / report_ref).write_text(report_text, encoding="utf-8")
299
+ report_bytes = (change_root / report_ref).read_bytes()
300
+ report_hash = hashlib.sha256(report_bytes).hexdigest()
301
+ write_json(
302
+ change_root / f"runtime/evidence/reports/{report_hash}.json",
303
+ {
304
+ "schema": "comet.native.verification-report.v1",
305
+ "reportHash": report_hash,
306
+ "content": report_bytes.decode("utf-8"),
307
+ },
308
+ )
309
+ entries = []
310
+ evidence_files = ["test_wordcount.py", "wordcount.py"]
311
+ for index, criterion in enumerate(contract["acceptance"]):
312
+ entries.append(
313
+ {
314
+ "acceptanceId": criterion["id"],
315
+ "kind": criterion["kind"],
316
+ "source": criterion["source"],
317
+ "evidenceRefs": [evidence_files[index % len(evidence_files)]],
318
+ "skippedReason": None,
319
+ }
320
+ )
321
+ entries.sort(key=lambda item: item["acceptanceId"])
322
+ trace_content = {
323
+ "schema": "comet.native.acceptance-trace.v1",
324
+ "nativeRootRef": "docs/comet",
325
+ "criteriaHash": contract["acceptanceHash"],
326
+ "total": len(entries),
327
+ "evidenced": len(entries),
328
+ "skipped": 0,
329
+ "entries": entries,
330
+ }
331
+ trace = {
332
+ **trace_content,
333
+ "traceHash": canonical_hash("comet.native.acceptance-trace.v1", trace_content),
334
+ }
335
+ receipt_ref = (
336
+ write_check_receipt(
337
+ change_root,
338
+ change=state["name"],
339
+ source_revision=source_revision,
340
+ contract_hash=contract["contractHash"],
341
+ scope=scope,
342
+ )
343
+ if include_receipt
344
+ else None
345
+ )
346
+ envelope_content = {
347
+ "schema": "comet.native.verification-evidence.v1",
348
+ "change": state["name"],
349
+ "sourceRevision": source_revision,
350
+ "result": result,
351
+ "freshness": "partial" if partial else "complete",
352
+ "contractHash": contract["contractHash"],
353
+ "acceptanceCriteriaHash": contract["acceptanceHash"],
354
+ "implementationScopeRef": scope_ref,
355
+ "implementationScopeHash": scope["scopeHash"],
356
+ "reportRef": report_ref,
357
+ "reportHash": report_hash,
358
+ "acceptanceTrace": trace,
359
+ "partialAllowanceRef": allowance_ref,
360
+ "partialAllowanceHash": allowance_hash,
361
+ "receiptRef": receipt_ref,
362
+ "createdAt": created_at,
363
+ }
364
+ envelope_hash = canonical_hash("comet.native.verification-evidence.v1", envelope_content)
365
+ ref = f"runtime/evidence/verifications/{envelope_hash}.json"
366
+ write_json(change_root / ref, {**envelope_content, "envelopeHash": envelope_hash})
367
+ return ref
368
+
369
+
370
+ def write_archive_transaction(
371
+ workspace: Path,
372
+ transaction_id: str,
373
+ change: str,
374
+ preflight_hash: str,
375
+ ) -> None:
376
+ target = f"archive/2026-07-17-{change}"
377
+ write_json(
378
+ workspace / "docs/comet/runtime/transactions" / transaction_id / "transaction.json",
379
+ {
380
+ "schema": "comet.native.transaction.v2",
381
+ "id": transaction_id,
382
+ "kind": "archive",
383
+ "status": "committed",
384
+ "change": change,
385
+ "createdAt": "2026-07-17T00:00:00.000Z",
386
+ "preflightHash": preflight_hash,
387
+ "operations": [
388
+ {
389
+ "id": "archive-change",
390
+ "type": "move",
391
+ "source": f"changes/{change}",
392
+ "target": target,
393
+ "expectedSourceHash": "d" * 64,
394
+ "expectedTargetHash": None,
395
+ }
396
+ ],
397
+ },
398
+ )
399
+ events = [
400
+ ("prepared", None),
401
+ ("operation-started", "archive-change"),
402
+ ("operation-completed", "archive-change"),
403
+ ("archive-finalization-started", None),
404
+ ("archive-finalized", None),
405
+ ("commit", None),
406
+ ]
407
+ event_file = workspace / "docs/comet/runtime/transactions" / transaction_id / "events.jsonl"
408
+ event_file.write_text(
409
+ "\n".join(
410
+ json.dumps(
411
+ {
412
+ "sequence": index,
413
+ "timestamp": "2026-07-17T00:00:00.000Z",
414
+ "type": event_type,
415
+ **({"operationId": operation_id} if operation_id else {}),
416
+ }
417
+ )
418
+ for index, (event_type, operation_id) in enumerate(events, 1)
419
+ )
420
+ + "\n",
421
+ encoding="utf-8",
422
+ )
423
+
424
+
425
+ def test_wave_tasks_use_the_native_skill_contract_and_executable_validators():
426
+ runtime = EVAL_ROOT.parent / "assets/skills/comet-native/scripts/comet-native-runtime.mjs"
427
+ assert runtime.is_file()
428
+ for name, interaction_mode in WAVE_TASKS.items():
429
+ task = load_task(name)
430
+ assert task.default_treatments == ["COMET_NATIVE_PHASE1"]
431
+ assert (task.environment_dir / "Dockerfile").is_file()
432
+ assert (task.environment_dir / "wordcount.py").is_file()
433
+ assert (task.environment_dir / "test_wordcount.py").is_file()
434
+ assert task.config.evaluation.profile == "generic"
435
+ assert task.config.evaluation.required_skills == ["comet-native"]
436
+ assert task.config.evaluation.require_skill_invocation is True
437
+ assert task.config.interaction.mode == interaction_mode
438
+ assert task.load_validators()
439
+ prompt = task.render_prompt()
440
+ assert "`/comet-native` Skill" in prompt
441
+ assert "Do not fabricate" in prompt
442
+ assert ".cache/comet-native-eval" in prompt
443
+ assert "eval-evidence" not in prompt
444
+
445
+
446
+ def test_wave_tasks_are_registered_in_the_local_index():
447
+ index = yaml.safe_load((TASKS_ROOT / "index.yaml").read_text(encoding="utf-8"))
448
+ indexed = {entry["name"] for entry in index["tasks"]}
449
+ assert set(WAVE_TASKS).issubset(indexed)
450
+
451
+
452
+ def test_wave_f_requests_a_current_checkout_cli_snapshot():
453
+ environment = TASKS_ROOT / "comet-native-wave-f-dashboard-readonly/environment"
454
+ assert (environment / ".include-current-comet-cli").is_file()
455
+ dockerfile = (environment / "Dockerfile").read_text(encoding="utf-8")
456
+ wrapper = (environment / "current-comet.sh").read_text(encoding="utf-8")
457
+ prompt = load_task("comet-native-wave-f-dashboard-readonly").render_prompt()
458
+
459
+ assert "FROM node:22" in dockerfile
460
+ assert "npm install --prefix /opt/comet-cli" in dockerfile
461
+ assert "/workspace/_eval_current_comet" in wrapper
462
+ assert 'runtime="$(mktemp -d)"' in wrapper
463
+ assert '"$snapshot/node_modules"' not in wrapper
464
+ docker_harness = (EVAL_ROOT / "scaffold/shell/docker.sh").read_text(encoding="utf-8")
465
+ assert "_eval_current_comet:ro" in docker_harness
466
+ assert "current-comet.sh dashboard . --json" in prompt
467
+
468
+
469
+ def test_wave_f_current_checkout_dependency_snapshot_matches_package_runtime_dependencies():
470
+ """Keep the eval image's installed runtime dependencies in lockstep with Comet."""
471
+ package = json.loads((EVAL_ROOT.parent / "package.json").read_text(encoding="utf-8"))
472
+ snapshot = json.loads(
473
+ (
474
+ TASKS_ROOT
475
+ / "comet-native-wave-f-dashboard-readonly/environment/current-comet-package.json"
476
+ ).read_text(encoding="utf-8")
477
+ )
478
+
479
+ assert snapshot.get("private") is True
480
+ assert snapshot.get("type") == package.get("type")
481
+ assert snapshot.get("dependencies") == package.get("dependencies")
482
+
483
+
484
+ def test_current_cli_snapshot_helper_source_builds_checkout(monkeypatch, tmp_path: Path):
485
+ eval_conftest = sys.modules["conftest"]
486
+ checkout = tmp_path / "checkout"
487
+ (checkout / "bin").mkdir(parents=True)
488
+ (checkout / "bin/comet.js").write_text("import '../dist/index.js';\n", encoding="utf-8")
489
+ (checkout / "package.json").write_text('{"type":"module"}\n', encoding="utf-8")
490
+ (checkout / "assets/skills/comet").mkdir(parents=True)
491
+ (checkout / "assets/manifest.json").write_text(
492
+ '{"skills":["comet/SKILL.md"]}\n', encoding="utf-8"
493
+ )
494
+ (checkout / "assets/skills/comet/SKILL.md").write_text("# Comet\n", encoding="utf-8")
495
+ environment = tmp_path / "environment"
496
+ environment.mkdir()
497
+ (environment / ".include-current-comet-cli").write_text("include\n", encoding="utf-8")
498
+ workspace = tmp_path / "workspace"
499
+ workspace.mkdir()
500
+ monkeypatch.setattr(eval_conftest, "REPOSITORY_ROOT", checkout)
501
+
502
+ def fake_source_build(_checkout: Path, output: Path) -> str:
503
+ (output / "app/cli").mkdir(parents=True)
504
+ (output / "domains/dashboard").mkdir(parents=True)
505
+ (output / "app/cli/index.js").write_text("export {};\n", encoding="utf-8")
506
+ (output / "domains/dashboard/native-adapter.js").write_text(
507
+ "export const schema = 'native';\n", encoding="utf-8"
508
+ )
509
+ return "5.9.3"
510
+
511
+ monkeypatch.setattr(eval_conftest, "_build_current_comet_dist", fake_source_build)
512
+
513
+ eval_conftest._copy_current_comet_cli_snapshot(environment, workspace)
514
+
515
+ snapshot = workspace / "_eval_current_comet"
516
+ assert (snapshot / "bin/comet.js").is_file()
517
+ assert (snapshot / "dist/app/cli/index.js").is_file()
518
+ assert (snapshot / "dist/domains/dashboard/native-adapter.js").is_file()
519
+ assert (snapshot / "assets/manifest.json").is_file()
520
+ assert (snapshot / "assets/skills/comet/SKILL.md").is_file()
521
+ assert (snapshot / "package.json").is_file()
522
+ identity = json.loads((snapshot / "build-identity.json").read_text(encoding="utf-8"))
523
+ assert identity["schema"] == "comet.eval.current-comet-build.v1"
524
+ assert identity["sourceFileCount"] >= 4
525
+ assert identity["snapshotFileCount"] >= 6
526
+ assert identity["assetsFileCount"] == 2
527
+ assert identity["assetsHash"]
528
+ assert identity["manifestHash"]
529
+
530
+
531
+ def test_controller_snapshots_native_runtime_for_readonly_oracle(tmp_path: Path):
532
+ eval_conftest = sys.modules["conftest"]
533
+ environment = tmp_path / "environment"
534
+ environment.mkdir()
535
+ (environment / ".include-trusted-native-runtime").write_text("include\n", encoding="utf-8")
536
+ skill_source = tmp_path / "skill/comet-native"
537
+ runtime = skill_source / "scripts/comet-native-runtime.mjs"
538
+ runtime.parent.mkdir(parents=True)
539
+ runtime.write_text("export const trusted = true;\n", encoding="utf-8")
540
+ workspace = tmp_path / "workspace"
541
+ workspace.mkdir()
542
+
543
+ eval_conftest._copy_trusted_native_runtime_snapshot(
544
+ environment,
545
+ workspace,
546
+ {"comet-native": {"source_dir": skill_source}},
547
+ )
548
+
549
+ oracle = workspace / "_eval_trusted_oracles/comet-native-runtime.mjs"
550
+ identity = json.loads(
551
+ (workspace / "_eval_trusted_oracles/native-runtime-identity.json").read_text(
552
+ encoding="utf-8"
553
+ )
554
+ )
555
+ assert oracle.read_bytes() == runtime.read_bytes()
556
+ assert identity == {
557
+ "schema": "comet.eval.trusted-native-runtime.v1",
558
+ "runtimeFile": oracle.name,
559
+ "runtimeHash": hashlib.sha256(oracle.read_bytes()).hexdigest(),
560
+ }
561
+ docker_harness = (EVAL_ROOT / "scaffold/shell/docker.sh").read_text(encoding="utf-8")
562
+ assert "_eval_trusted_oracles:ro" in docker_harness
563
+
564
+
565
+ def test_controller_provisions_immutable_native_review_fixture(tmp_path: Path):
566
+ eval_conftest = sys.modules["conftest"]
567
+ environment = tmp_path / "environment"
568
+ environment.mkdir()
569
+ (environment / ".include-trusted-native-runtime").write_text(
570
+ "include\n", encoding="utf-8"
571
+ )
572
+ (environment / ".include-trusted-native-review-fixture").write_text(
573
+ "sentence-counting\n", encoding="utf-8"
574
+ )
575
+ skill_source = tmp_path / "skill/comet-native"
576
+ runtime = skill_source / "scripts/comet-native-runtime.mjs"
577
+ runtime.parent.mkdir(parents=True)
578
+ runtime.write_text(
579
+ "console.log(JSON.stringify({"
580
+ "args:process.argv.slice(2),"
581
+ "reviewer:Boolean(process.env.COMET_NATIVE_EXTERNAL_REVIEWER_KEY)"
582
+ "}));\n",
583
+ encoding="utf-8",
584
+ )
585
+ workspace = tmp_path / "workspace"
586
+ workspace.mkdir()
587
+
588
+ eval_conftest._copy_trusted_native_runtime_snapshot(
589
+ environment,
590
+ workspace,
591
+ {"comet-native": {"source_dir": skill_source}},
592
+ )
593
+ eval_conftest._copy_trusted_native_review_fixture(environment, workspace)
594
+
595
+ oracle = workspace / "_eval_trusted_oracles"
596
+ public_fixture = json.loads(
597
+ (oracle / "native-review-fixture.json").read_text(encoding="utf-8")
598
+ )
599
+ policy = json.loads((oracle / "native-review-trust.json").read_text(encoding="utf-8"))
600
+ authorization = json.loads(
601
+ (oracle / "sentence-counting-creation-authorization.json").read_text(
602
+ encoding="utf-8"
603
+ )
604
+ )
605
+ store = json.loads(
606
+ (oracle / "controller-home/native-controller-trust.json").read_text(
607
+ encoding="utf-8"
608
+ )
609
+ )
610
+ assert public_fixture["schema"] == "comet.eval.native-review-fixture.v1"
611
+ assert public_fixture["change"] == "sentence-counting"
612
+ assert public_fixture["signerMode"] == "external-verifier-sidecar"
613
+ assert policy["schema"] == "comet.native.review-trust-policy.v2"
614
+ assert authorization["schema"] == "comet.native.creation-authorization.v1"
615
+ assert authorization["policyHash"] == policy["policyHash"]
616
+ assert authorization["projectRootHash"] == canonical_hash(
617
+ "comet.native.controller-project-root.v1", "/workspace"
618
+ )
619
+ assert store["projects"] == [
620
+ {
621
+ "projectRootHash": authorization["projectRootHash"],
622
+ "controllerIdentity": store["projects"][0]["controllerIdentity"],
623
+ "legacyChanges": [],
624
+ }
625
+ ]
626
+ assert (workspace / ".comet/native-review-trust.json").read_bytes() == (
627
+ oracle / "native-review-trust.json"
628
+ ).read_bytes()
629
+ validator = load_validator("comet-native-workflow", "test_native_workflow.py")
630
+ validator._validate_signature(
631
+ policy["controllerSignature"],
632
+ store["projects"][0]["controllerIdentity"],
633
+ policy["policyHash"],
634
+ "Controller policy",
635
+ )
636
+ validator._validate_signature(
637
+ authorization["controllerSignature"],
638
+ store["projects"][0]["controllerIdentity"],
639
+ authorization["authorizationHash"],
640
+ "Controller authorization",
641
+ )
642
+
643
+ secrets_root = workspace.with_name(f".{workspace.name}-native-review-secrets")
644
+ secret_documents = [
645
+ json.loads((secrets_root / f"{role}-key.json").read_text(encoding="utf-8"))
646
+ for role in ("implementation", "reviewer", "waiver")
647
+ ]
648
+ oracle_text = "\n".join(
649
+ file.read_text(encoding="utf-8")
650
+ for file in oracle.rglob("*")
651
+ if file.is_file()
652
+ )
653
+ assert all(document["privateKey"] not in oracle_text for document in secret_documents)
654
+ assert "COMET_NATIVE_REVIEW_VERIFIER_URL" in (
655
+ oracle / "native-review-signer.mjs"
656
+ ).read_text(encoding="utf-8")
657
+ assert "privateKey" not in (
658
+ oracle / "native-review-signer.mjs"
659
+ ).read_text(encoding="utf-8")
660
+
661
+ docker_harness = (EVAL_ROOT / "scaffold/shell/docker.sh").read_text(encoding="utf-8")
662
+ assert "native-review-signer-daemon.mjs" in docker_harness
663
+ assert "native-review-verifier-daemon.mjs" in docker_harness
664
+ verifier_daemon = (
665
+ EVAL_ROOT / "scaffold/shell/native-review-verifier-daemon.mjs"
666
+ ).read_text(encoding="utf-8")
667
+ assert "manual evidence requires an external human reviewer" in verifier_daemon
668
+ signer_start = docker_harness.split('node //opt/scaffold-shell/native-review-signer-daemon.mjs')[0]
669
+ assert 'workspace_host://workspace' not in signer_start.split('docker run -d --rm --name "$signer_name"')[-1]
670
+ assert 'workspace_host://workspace' in docker_harness
671
+ assert 'NATIVE_REVIEW_CONTROLLER_VOLUME://opt/comet-controller:ro' in docker_harness
672
+ assert 'HOME=//opt/comet-controller' in docker_harness
673
+
674
+
675
+ def test_native_workflow_validator_recomputes_typed_receipt_hash(tmp_path: Path):
676
+ validator = load_validator("comet-native-workflow", "test_native_workflow.py")
677
+ archived = tmp_path / "archive"
678
+ content = {
679
+ "schema": "comet.native.verification-receipt.v2",
680
+ "kind": "manual-evidence",
681
+ "role": "acceptance-evidence",
682
+ "status": "passed",
683
+ "bindings": {
684
+ "change": "sentence-counting",
685
+ "sourceRevision": 3,
686
+ "contractHash": "1" * 64,
687
+ "scopeHash": "2" * 64,
688
+ "snapshotHash": "3" * 64,
689
+ "artifactHash": "4" * 64,
690
+ },
691
+ "acceptanceIds": ["acceptance-" + "a" * 64],
692
+ "actor": "eval-manual",
693
+ "issuedAt": "2026-07-28T00:00:00.000Z",
694
+ "evidence": {
695
+ "steps": ["Run the sentence check."],
696
+ "observations": ["The check passed."],
697
+ "responsible": "eval-manual",
698
+ },
699
+ }
700
+ digest = validator._canonical_hash(
701
+ "comet.native.verification-receipt.v2", content
702
+ )
703
+ reference = f"runtime/evidence/receipts/{digest}.json"
704
+ receipt_file = archived / reference
705
+ write_json(receipt_file, {**content, "receiptHash": digest})
706
+
707
+ assert validator._read_typed_receipt(archived, reference)["receiptHash"] == digest
708
+
709
+ forged = json.loads(receipt_file.read_text(encoding="utf-8"))
710
+ forged["evidence"]["observations"] = ["A forged result."]
711
+ write_json(receipt_file, forged)
712
+ with pytest.raises(ValueError, match="schema/hash"):
713
+ validator._read_typed_receipt(archived, reference)
714
+
715
+
716
+ def test_native_workflow_validator_performs_real_ed25519_verification():
717
+ validator = load_validator("comet-native-workflow", "test_native_workflow.py")
718
+ payload_hash = "a" * 64
719
+ script = r"""
720
+ const {generateKeyPairSync,createHash,sign}=require('node:crypto');
721
+ const pair=generateKeyPairSync('ed25519');
722
+ const publicKey=pair.publicKey.export({format:'der',type:'spki'});
723
+ const message=Buffer.concat([
724
+ Buffer.from('comet.native.review-payload.v1\0'),
725
+ Buffer.from(process.argv[1],'hex')
726
+ ]);
727
+ process.stdout.write(JSON.stringify({
728
+ identity:{
729
+ schema:'comet.native.review-identity.v1',
730
+ algorithm:'ed25519',
731
+ keyId:createHash('sha256').update(publicKey).digest('hex'),
732
+ publicKey:publicKey.toString('base64')
733
+ },
734
+ signature:sign(null,message,pair.privateKey).toString('base64')
735
+ }));
736
+ """
737
+ generated = json.loads(
738
+ subprocess.run(
739
+ ["node", "-e", script, payload_hash],
740
+ capture_output=True,
741
+ text=True,
742
+ timeout=10,
743
+ check=True,
744
+ ).stdout
745
+ )
746
+ proof = {
747
+ "schema": "comet.native.review-signature.v1",
748
+ "algorithm": "ed25519",
749
+ "keyId": generated["identity"]["keyId"],
750
+ "payloadHash": payload_hash,
751
+ "signature": generated["signature"],
752
+ }
753
+
754
+ validator._validate_signature(
755
+ proof, generated["identity"], payload_hash, "Reviewer"
756
+ )
757
+
758
+ forged_bytes = bytearray(base64.b64decode(proof["signature"]))
759
+ forged_bytes[0] ^= 1
760
+ forged = {**proof, "signature": base64.b64encode(forged_bytes).decode("ascii")}
761
+ with pytest.raises(ValueError, match="Ed25519"):
762
+ validator._validate_signature(
763
+ forged, generated["identity"], payload_hash, "Reviewer"
764
+ )
765
+
766
+
767
+ def test_native_workflow_oracle_rejects_forged_runtime_identity(tmp_path: Path):
768
+ validator = load_validator("comet-native-workflow", "test_native_workflow.py")
769
+ validator.WORKSPACE = tmp_path
770
+ oracle = tmp_path / "_eval_trusted_oracles/comet-native-runtime.mjs"
771
+ oracle.parent.mkdir(parents=True)
772
+ oracle.write_text("console.log('{}');\n", encoding="utf-8")
773
+ write_json(
774
+ oracle.parent / "native-runtime-identity.json",
775
+ {
776
+ "schema": "comet.eval.trusted-native-runtime.v1",
777
+ "runtimeFile": oracle.name,
778
+ "runtimeHash": hashlib.sha256(oracle.read_bytes()).hexdigest(),
779
+ },
780
+ )
781
+ assert validator._trusted_native_runtime() == oracle
782
+
783
+ oracle.write_text("console.log('{\"forged\":true}');\n", encoding="utf-8")
784
+ with pytest.raises(ValueError, match="does not match"):
785
+ validator._trusted_native_runtime()
786
+
787
+
788
+ def test_native_workflow_oracle_rejects_an_incomplete_reconstructed_archive(
789
+ tmp_path: Path,
790
+ ):
791
+ validator = load_validator("comet-native-workflow", "test_native_workflow.py")
792
+ validator.WORKSPACE = tmp_path
793
+ acceptance_id = "acceptance-" + "a" * 64
794
+ archived = tmp_path / "docs/comet/archive/2026-07-28-sentence-counting"
795
+ archived.mkdir(parents=True)
796
+ (archived / "comet-state.yaml").write_text(
797
+ "name: sentence-counting\nphase: archive\narchived: true\nverification_result: pass\n",
798
+ encoding="utf-8",
799
+ )
800
+ oracle = tmp_path / "_eval_trusted_oracles/comet-native-runtime.mjs"
801
+ oracle.parent.mkdir(parents=True)
802
+ oracle.write_bytes(
803
+ (
804
+ EVAL_ROOT.parent
805
+ / "assets/skills/comet-native/scripts/comet-native-runtime.mjs"
806
+ ).read_bytes()
807
+ )
808
+ write_json(
809
+ oracle.parent / "native-runtime-identity.json",
810
+ {
811
+ "schema": "comet.eval.trusted-native-runtime.v1",
812
+ "runtimeFile": oracle.name,
813
+ "runtimeHash": hashlib.sha256(oracle.read_bytes()).hexdigest(),
814
+ },
815
+ )
816
+
817
+ with pytest.raises(ValueError, match="reconstructed pre-archive state"):
818
+ validator._run_trusted_archive_oracle(
819
+ archived,
820
+ {
821
+ "name": "sentence-counting",
822
+ "phase": "archive",
823
+ "archived": True,
824
+ "verification_result": "pass",
825
+ },
826
+ [acceptance_id],
827
+ )
828
+
829
+ assert archived.is_dir()
830
+ assert not (tmp_path / "docs/comet/changes/sentence-counting").exists()
831
+ with pytest.raises(ValueError, match="rejected"):
832
+ validator._run_trusted_archive_oracle(
833
+ archived,
834
+ {
835
+ "name": "sentence-counting",
836
+ "phase": "archive",
837
+ "archived": False,
838
+ "verification_result": "pass",
839
+ },
840
+ [acceptance_id],
841
+ )
842
+
843
+
844
+ def test_controller_source_build_contains_current_native_dashboard_adapter(tmp_path: Path):
845
+ eval_conftest = sys.modules["conftest"]
846
+ output = tmp_path / "dist"
847
+
848
+ version = eval_conftest._build_current_comet_dist(EVAL_ROOT.parent, output)
849
+
850
+ assert version
851
+ assert (output / "app/cli/index.js").is_file()
852
+ assert (output / "domains/dashboard/native-adapter.js").is_file()
853
+
854
+
855
+ def test_wave_b_prompt_hides_the_normalization_decision_and_requires_disk_resume():
856
+ task = load_task("comet-native-wave-b-decision-resume")
857
+ prompt = task.render_prompt()
858
+
859
+ assert "case-insensitive" not in prompt.lower()
860
+ assert "strip surrounding punctuation" not in prompt.lower()
861
+ assert "distinct normalized word values" in prompt.lower()
862
+ assert "words that occur exactly once" in prompt.lower()
863
+ assert task.config.interaction.decision_reply == (
864
+ "Treat words case-insensitively, strip surrounding punctuation, and preserve internal apostrophes."
865
+ )
866
+ continuation = task.config.interaction.continue_prompt.lower()
867
+ assert "context-cleared continuation" in continuation
868
+ assert "invoke `/comet-native`" in continuation
869
+ assert "first bash command" in continuation
870
+ assert "before any read, edit, test, or transition" in continuation
871
+ assert "status add-unique-counting --json" in continuation
872
+ assert "archive-preview.json" in continuation
873
+ assert "archive-commit.json" in continuation
874
+ assert "--dry-run --json" in continuation
875
+ assert "--expect-preflight" in continuation
876
+ assert "redirect stdout directly" in continuation
877
+ assert "exactly once" in continuation
878
+ assert "never overwrite" in continuation
879
+ assert "do not reconstruct" in continuation
880
+ assert task.config.interaction.fresh_resume_marker == "COMET_NATIVE_COLD_RESUME_READY"
881
+ assert "deliberately omits" not in prompt.lower()
882
+ assert "redirect stdout directly" in prompt.lower()
883
+ assert "verify all three files exist" in prompt.lower()
884
+ assert "do not rely on terminal output" in prompt.lower()
885
+ assert "before invoking either archive command" in prompt.lower()
886
+ assert "must itself redirect stdout" in prompt.lower()
887
+
888
+
889
+ def test_shared_wave_helpers_recognize_state_cas_and_readonly_projection(tmp_path: Path):
890
+ status_file = tmp_path / "status.json"
891
+ write_json(
892
+ status_file,
893
+ {"command": "status", "exitCode": 0, "data": {"freshness": "stale"}},
894
+ )
895
+ assert check_json_state(status_file, "stale")["status"] == "passed"
896
+ assert check_json_state(status_file, "partial")["status"] == "failed"
897
+ assert check_runtime_envelopes([status_file])["status"] == "passed"
898
+
899
+ attempt_a = tmp_path / "checkpoint-attempt-a.json"
900
+ write_json(
901
+ attempt_a,
902
+ {
903
+ "command": "checkpoint",
904
+ "exitCode": 0,
905
+ "data": {
906
+ "change": {"name": "normalize-case", "revision": 8},
907
+ "expectedRevision": 7,
908
+ "previousRevision": 7,
909
+ "revision": 8,
910
+ "outcome": "recorded",
911
+ },
912
+ },
913
+ )
914
+ attempt_b = tmp_path / "checkpoint-attempt-b.json"
915
+ write_json(
916
+ attempt_b,
917
+ {
918
+ "command": "checkpoint",
919
+ "exitCode": 73,
920
+ "data": {
921
+ "change": "normalize-case",
922
+ "expectedRevision": 7,
923
+ "actualRevision": 8,
924
+ "outcome": "revision-conflict",
925
+ },
926
+ },
927
+ )
928
+ assert check_checkpoint_cas_envelopes([attempt_a, attempt_b])["status"] == "passed"
929
+ write_json(
930
+ attempt_b,
931
+ {
932
+ "command": "checkpoint",
933
+ "exitCode": 73,
934
+ "data": {
935
+ "change": "normalize-case",
936
+ "expectedRevision": 7,
937
+ "actualRevision": 9,
938
+ "outcome": "revision-conflict",
939
+ },
940
+ },
941
+ )
942
+ assert check_checkpoint_cas_envelopes([attempt_a, attempt_b])["status"] == "failed"
943
+
944
+ cli_file = tmp_path / "cli.json"
945
+ dashboard_file = tmp_path / "dashboard.json"
946
+ projection = {
947
+ "name": "add-unique-counting",
948
+ "phase": "build",
949
+ "nextAction": "continue",
950
+ "verificationResult": "pending",
951
+ }
952
+ write_json(cli_file, {"data": projection})
953
+ write_json(dashboard_file, {"snapshot": {"changes": [projection]}})
954
+ assert check_dashboard_projection(cli_file, dashboard_file)["status"] == "passed"
955
+
956
+ dashboard_projection = {
957
+ **projection,
958
+ "selected": True,
959
+ "findings": {
960
+ "total": 1,
961
+ "errors": 0,
962
+ "warnings": 1,
963
+ "info": 0,
964
+ "requiresUserDecision": False,
965
+ "codes": ["workspace-root-changed"],
966
+ "truncated": False,
967
+ },
968
+ "continuation": {
969
+ "disposition": "continue",
970
+ "action": "work-phase",
971
+ "command": 'comet native next add-unique-counting --summary "<summary>"',
972
+ "requiresUserDecision": False,
973
+ "requiredInputs": ["summary"],
974
+ "requiredInputsTruncated": False,
975
+ },
976
+ }
977
+ cli_projection = {**dashboard_projection}
978
+ cli_projection["findingSummary"] = cli_projection.pop("findings")
979
+ write_json(cli_file, {"data": cli_projection})
980
+ write_json(dashboard_file, {"snapshot": {"changes": [dashboard_projection]}})
981
+ assert check_dashboard_projection(cli_file, dashboard_file)["status"] == "passed"
982
+
983
+ dashboard_projection["selected"] = False
984
+ write_json(dashboard_file, {"snapshot": {"changes": [dashboard_projection]}})
985
+ assert check_dashboard_projection(cli_file, dashboard_file)["status"] == "failed"
986
+ dashboard_projection["selected"] = True
987
+ dashboard_projection["findings"] = {
988
+ **cli_projection["findingSummary"],
989
+ "warnings": 0,
990
+ }
991
+ write_json(dashboard_file, {"snapshot": {"changes": [dashboard_projection]}})
992
+ assert check_dashboard_projection(cli_file, dashboard_file)["status"] == "failed"
993
+ dashboard_projection["findings"] = cli_projection["findingSummary"]
994
+ write_json(
995
+ dashboard_file,
996
+ {"snapshot": {"changes": [dashboard_projection, {**projection, "name": "extra"}]}},
997
+ )
998
+ assert check_dashboard_projection(cli_file, dashboard_file)["status"] == "failed"
999
+
1000
+
1001
+ def test_wave_b_validator_accepts_one_confirmed_archive_and_resume_snapshot(tmp_path: Path):
1002
+ validator = load_validator(
1003
+ "comet-native-wave-b-decision-resume", "test_native_wave_b_decision_resume.py"
1004
+ )
1005
+ validator.WORKSPACE = tmp_path
1006
+ archived = tmp_path / "docs/comet/archive/2026-07-17-add-unique-counting"
1007
+ (archived / "runtime").mkdir(parents=True)
1008
+ (archived / "specs/unique-word-counting").mkdir(parents=True)
1009
+ (tmp_path / "docs/comet/changes").mkdir(parents=True)
1010
+ canonical = tmp_path / "docs/comet/specs/unique-word-counting/spec.md"
1011
+ canonical.parent.mkdir(parents=True)
1012
+ state = {
1013
+ "name": "add-unique-counting",
1014
+ "phase": "archive",
1015
+ "approval": "confirmed",
1016
+ "archived": True,
1017
+ "verification_result": "pass",
1018
+ }
1019
+ (archived / "comet-state.yaml").write_text(yaml.safe_dump(state), encoding="utf-8")
1020
+ decision = (
1021
+ "Case-fold tokens with str.lower(), strip punctuation from the start and end of each "
1022
+ "token. Internal punctuation is preserved; apostrophes are not removed."
1023
+ )
1024
+ (archived / "brief.md").write_text(f"# Decisions\n{decision}\n", encoding="utf-8")
1025
+ (archived / "specs/unique-word-counting/spec.md").write_text(decision, encoding="utf-8")
1026
+ canonical.write_text(decision, encoding="utf-8")
1027
+ write_json(
1028
+ tmp_path / ".cache/comet-native-eval/resume-status.json",
1029
+ {
1030
+ "command": "status",
1031
+ "exitCode": 0,
1032
+ "data": {"name": "add-unique-counting", "phase": "build"},
1033
+ },
1034
+ )
1035
+ preflight_hash = "a" * 64
1036
+ transaction_id = "aaaaaaaa-1111-2222-3333-bbbbbbbbbbbb"
1037
+ write_json(
1038
+ tmp_path / ".cache/comet-native-eval/archive-preview.json",
1039
+ {
1040
+ "command": "archive --dry-run",
1041
+ "exitCode": 0,
1042
+ "data": {
1043
+ "ready": True,
1044
+ "evidenceFreshness": "complete",
1045
+ "findingCodes": [],
1046
+ "preflightHash": preflight_hash,
1047
+ },
1048
+ },
1049
+ )
1050
+ write_json(
1051
+ tmp_path / ".cache/comet-native-eval/archive-commit.json",
1052
+ {
1053
+ "command": "archive",
1054
+ "exitCode": 0,
1055
+ "data": {
1056
+ "preflightHash": preflight_hash,
1057
+ "transactionId": transaction_id,
1058
+ },
1059
+ },
1060
+ )
1061
+ write_archive_transaction(
1062
+ tmp_path,
1063
+ transaction_id,
1064
+ "add-unique-counting",
1065
+ preflight_hash,
1066
+ )
1067
+ write_json(
1068
+ tmp_path / "_test_context.json",
1069
+ {
1070
+ "interaction": {
1071
+ "mode": "auto_user",
1072
+ "decision_points": 1,
1073
+ "deterministic_replies": 1,
1074
+ "fresh_resume_boundaries": 1,
1075
+ "actual_turns": 2,
1076
+ "max_turns": 4,
1077
+ }
1078
+ },
1079
+ )
1080
+
1081
+ assert validator.check_decision_and_resume()["status"] == "passed"
1082
+
1083
+
1084
+ def test_wave_c_validator_requires_bound_partial_stale_and_complete_archive(tmp_path: Path):
1085
+ validator = load_validator(
1086
+ "comet-native-wave-c-verification-integrity",
1087
+ "test_native_wave_c_verification_integrity.py",
1088
+ )
1089
+ validator.WORKSPACE = tmp_path
1090
+ for name in ("wordcount.py", "test_wordcount.py"):
1091
+ source = TASKS_ROOT / "comet-native-wave-c-verification-integrity/environment" / name
1092
+ (tmp_path / name).write_bytes(source.read_bytes())
1093
+ evidence = tmp_path / ".cache/comet-native-eval"
1094
+ archive = tmp_path / "docs/comet/archive/2026-07-17-add-longest-word"
1095
+ archive.mkdir(parents=True)
1096
+ state = {
1097
+ "name": "add-longest-word",
1098
+ "phase": "archive",
1099
+ "archived": True,
1100
+ "verification_result": "pass",
1101
+ }
1102
+ contract = write_contract_artifacts(archive, state, "longest-word")
1103
+ partial_ref = write_verification_bundle(
1104
+ tmp_path,
1105
+ archive,
1106
+ state,
1107
+ contract,
1108
+ result="pass",
1109
+ source_revision=5,
1110
+ created_at="2026-07-17T00:00:05.000Z",
1111
+ partial=True,
1112
+ )
1113
+ partial_envelope = json.loads((archive / partial_ref).read_text(encoding="utf-8"))
1114
+ partial_hash = partial_envelope["implementationScopeHash"]
1115
+ final_ref = write_verification_bundle(
1116
+ tmp_path,
1117
+ archive,
1118
+ state,
1119
+ contract,
1120
+ result="pass",
1121
+ source_revision=9,
1122
+ created_at="2026-07-17T00:00:09.000Z",
1123
+ include_receipt=True,
1124
+ )
1125
+ state["verification_evidence"] = final_ref
1126
+ (archive / "comet-state.yaml").write_text(yaml.safe_dump(state), encoding="utf-8")
1127
+ stale_hash = "b" * 64
1128
+ final_hash = "c" * 64
1129
+ transaction_id = "cccccccc-1111-2222-3333-dddddddddddd"
1130
+ write_json(
1131
+ evidence / "partial-scope.json",
1132
+ {
1133
+ "command": "next",
1134
+ "exitCode": 65,
1135
+ "data": {
1136
+ "next": "manual",
1137
+ "preparedScope": {
1138
+ "complete": False,
1139
+ "unresolvedScopeCount": 1,
1140
+ "scopeHash": partial_hash,
1141
+ },
1142
+ "findings": [{"code": "verification-scope-partial"}],
1143
+ },
1144
+ },
1145
+ )
1146
+ write_json(
1147
+ evidence / "partial-archive-preview.json",
1148
+ {
1149
+ "command": "archive --dry-run",
1150
+ "exitCode": 0,
1151
+ "data": {
1152
+ "ready": True,
1153
+ "evidenceFreshness": "partial",
1154
+ "findingCodes": [],
1155
+ "preflightHash": partial_hash,
1156
+ },
1157
+ },
1158
+ )
1159
+ write_json(
1160
+ evidence / "stale-status.json",
1161
+ {
1162
+ "command": "status",
1163
+ "exitCode": 0,
1164
+ "data": {
1165
+ "phase": "archive",
1166
+ "archiveReady": False,
1167
+ "findingSummary": {"codes": ["verification-evidence-stale"]},
1168
+ },
1169
+ },
1170
+ )
1171
+ stale_preview = {
1172
+ "ready": False,
1173
+ "evidenceFreshness": "stale",
1174
+ "findingCodes": ["verification-evidence-stale"],
1175
+ "preflightHash": stale_hash,
1176
+ }
1177
+ write_json(
1178
+ evidence / "stale-archive-preview.json",
1179
+ {"command": "archive --dry-run", "exitCode": 0, "data": stale_preview},
1180
+ )
1181
+ write_json(
1182
+ evidence / "stale-archive-commit.json",
1183
+ {
1184
+ "command": "archive",
1185
+ "exitCode": 73,
1186
+ "data": stale_preview,
1187
+ "error": {"code": "conflict", "message": "Archive preflight changed"},
1188
+ },
1189
+ )
1190
+ final_preview = {
1191
+ "ready": True,
1192
+ "evidenceFreshness": "complete",
1193
+ "findingCodes": [],
1194
+ "preflightHash": final_hash,
1195
+ }
1196
+ write_json(
1197
+ evidence / "final-archive-preview.json",
1198
+ {"command": "archive --dry-run", "exitCode": 0, "data": final_preview},
1199
+ )
1200
+ write_json(
1201
+ evidence / "archive-commit.json",
1202
+ {
1203
+ "command": "archive",
1204
+ "exitCode": 0,
1205
+ "data": {
1206
+ "preflightHash": final_hash,
1207
+ "transactionId": transaction_id,
1208
+ },
1209
+ },
1210
+ )
1211
+ write_archive_transaction(tmp_path, transaction_id, "add-longest-word", final_hash)
1212
+ (archive / "runtime/trajectory.jsonl").write_text(
1213
+ "\n".join(
1214
+ json.dumps(
1215
+ {
1216
+ "sequence": index,
1217
+ "timestamp": "2026-07-17T00:00:00.000Z",
1218
+ "runId": "verification-run",
1219
+ "type": "state_transitioned",
1220
+ "data": {
1221
+ "previousPhase": previous,
1222
+ "nextPhase": next_phase,
1223
+ },
1224
+ }
1225
+ )
1226
+ for index, (previous, next_phase) in enumerate(
1227
+ [
1228
+ ("shape", "build"),
1229
+ ("build", "verify"),
1230
+ ("verify", "archive"),
1231
+ ("archive", "build"),
1232
+ ("build", "verify"),
1233
+ ("verify", "archive"),
1234
+ ("archive", None),
1235
+ ],
1236
+ 1,
1237
+ )
1238
+ )
1239
+ + "\n",
1240
+ encoding="utf-8",
1241
+ )
1242
+ (tmp_path / "docs/comet/changes").mkdir(parents=True)
1243
+
1244
+ result = validator.check_verification_integrity()
1245
+ assert result["status"] == "passed", result
1246
+
1247
+ partial_scope_path = evidence / "partial-scope.json"
1248
+ partial_scope = json.loads(partial_scope_path.read_text(encoding="utf-8"))
1249
+ partial_scope["data"]["preparedScope"]["unresolvedScopeCount"] = 2
1250
+ write_json(partial_scope_path, partial_scope)
1251
+ result = validator.check_verification_integrity()
1252
+ assert result["status"] == "failed", result
1253
+ assert "count" in result["reason"].lower()
1254
+
1255
+
1256
+ def test_verification_parser_rejects_forged_acceptance_ids_and_hash_corruption(tmp_path: Path):
1257
+ for name in ("wordcount.py", "test_wordcount.py"):
1258
+ source = TASKS_ROOT / "comet-native-wave-c-verification-integrity/environment" / name
1259
+ (tmp_path / name).write_bytes(source.read_bytes())
1260
+ root = tmp_path / "docs/comet/changes/strict-evidence"
1261
+ root.mkdir(parents=True)
1262
+ state = {"name": "strict-evidence", "phase": "archive", "verification_result": "pass"}
1263
+ contract = write_contract_artifacts(root, state, "strict-evidence")
1264
+ ref = write_verification_bundle(
1265
+ tmp_path,
1266
+ root,
1267
+ state,
1268
+ contract,
1269
+ result="pass",
1270
+ source_revision=3,
1271
+ created_at="2026-07-17T00:00:03.000Z",
1272
+ )
1273
+ parse_verification_bundle(
1274
+ project_root=tmp_path,
1275
+ change_root=root,
1276
+ evidence_ref=ref,
1277
+ state=state,
1278
+ verify_current_files=True,
1279
+ )
1280
+
1281
+ envelope = json.loads((root / ref).read_text(encoding="utf-8"))
1282
+ envelope["acceptanceTrace"]["entries"][0]["acceptanceId"] = f"acceptance-{'0' * 64}"
1283
+ trace_content = {
1284
+ key: value for key, value in envelope["acceptanceTrace"].items() if key != "traceHash"
1285
+ }
1286
+ envelope["acceptanceTrace"]["traceHash"] = canonical_hash(
1287
+ "comet.native.acceptance-trace.v1", trace_content
1288
+ )
1289
+ content = {key: value for key, value in envelope.items() if key != "envelopeHash"}
1290
+ forged_hash = canonical_hash("comet.native.verification-evidence.v1", content)
1291
+ envelope["envelopeHash"] = forged_hash
1292
+ forged_ref = f"runtime/evidence/verifications/{forged_hash}.json"
1293
+ write_json(root / forged_ref, envelope)
1294
+ with pytest.raises(ValueError, match="contract|forged"):
1295
+ parse_verification_bundle(
1296
+ project_root=tmp_path,
1297
+ change_root=root,
1298
+ evidence_ref=forged_ref,
1299
+ state=state,
1300
+ )
1301
+
1302
+ original = json.loads((root / ref).read_text(encoding="utf-8"))
1303
+ (root / original["reportRef"]).write_text("tampered report\n", encoding="utf-8")
1304
+ with pytest.raises(ValueError, match="report content hash"):
1305
+ parse_verification_bundle(
1306
+ project_root=tmp_path,
1307
+ change_root=root,
1308
+ evidence_ref=ref,
1309
+ state=state,
1310
+ verify_current_files=True,
1311
+ )
1312
+
1313
+
1314
+ def test_scope_parser_rejects_runtime_impossible_self_consistent_unresolved_scope(
1315
+ tmp_path: Path,
1316
+ ):
1317
+ for name in ("wordcount.py", "test_wordcount.py"):
1318
+ source = TASKS_ROOT / "comet-native-wave-c-verification-integrity/environment" / name
1319
+ (tmp_path / name).write_bytes(source.read_bytes())
1320
+ root = tmp_path / "docs/comet/changes/forged-scope"
1321
+ root.mkdir(parents=True)
1322
+ scope_ref, _ = write_scope(tmp_path, root, "1" * 64, partial=True)
1323
+ parse_scope_bundle(root, scope_ref)
1324
+
1325
+ scope = json.loads((root / scope_ref).read_text(encoding="utf-8"))
1326
+ forged_identity = {
1327
+ "kind": "snapshot-omission",
1328
+ "source": "baseline",
1329
+ "path": "unrelated.txt",
1330
+ "evidence": {"reason": "unreadable", "size": 1, "type": "file"},
1331
+ }
1332
+ scope["unresolvedScopes"] = [
1333
+ {
1334
+ "id": (
1335
+ "scope:" + canonical_hash("comet.native.unresolved-scope-id.v1", forged_identity)
1336
+ ),
1337
+ "kind": forged_identity["kind"],
1338
+ "source": forged_identity["source"],
1339
+ "path": forged_identity["path"],
1340
+ "reason": "baseline snapshot omitted unrelated.txt: unreadable",
1341
+ }
1342
+ ]
1343
+ content = {key: value for key, value in scope.items() if key != "scopeHash"}
1344
+ scope_hash = canonical_hash("comet.native.implementation-scope.v2", content)
1345
+ scope["scopeHash"] = scope_hash
1346
+ forged_ref = f"runtime/evidence/scopes/{scope_hash}.json"
1347
+ write_json(root / forged_ref, scope)
1348
+
1349
+ with pytest.raises(ValueError, match="unresolved|scope"):
1350
+ parse_scope_bundle(root, forged_ref)
1351
+
1352
+
1353
+ def test_scope_parser_derives_omission_scopes_from_snapshot_facts(tmp_path: Path):
1354
+ for name in ("wordcount.py", "test_wordcount.py"):
1355
+ source = TASKS_ROOT / "comet-native-wave-c-verification-integrity/environment" / name
1356
+ (tmp_path / name).write_bytes(source.read_bytes())
1357
+ root = tmp_path / "docs/comet/changes/omitted-scope"
1358
+ root.mkdir(parents=True)
1359
+ scope_ref, _ = write_scope(tmp_path, root, "2" * 64, partial=True)
1360
+
1361
+ scope = json.loads((root / scope_ref).read_text(encoding="utf-8"))
1362
+ baseline_ref = scope["baselineProjectionRef"]
1363
+ baseline = json.loads((root / baseline_ref).read_text(encoding="utf-8"))
1364
+ baseline.update(
1365
+ {
1366
+ "complete": False,
1367
+ "omitted": [
1368
+ {
1369
+ "path": "too-large.bin",
1370
+ "size": 10,
1371
+ "type": "file",
1372
+ "reason": "file-size",
1373
+ }
1374
+ ],
1375
+ "omittedCount": 1,
1376
+ }
1377
+ )
1378
+ baseline_hash = canonical_hash("comet.native.content-snapshot-projection.v1", baseline)
1379
+ baseline_ref = f"runtime/evidence/snapshots/{baseline_hash}.json"
1380
+ write_json(root / baseline_ref, baseline)
1381
+ scope["baselineProjectionHash"] = baseline_hash
1382
+ scope["baselineProjectionRef"] = baseline_ref
1383
+ omission_identity = {
1384
+ "kind": "snapshot-omission",
1385
+ "source": "baseline",
1386
+ "path": "too-large.bin",
1387
+ "evidence": {"reason": "file-size", "size": 10, "type": "file"},
1388
+ }
1389
+ incomplete_identity = {
1390
+ "kind": "snapshot-incomplete",
1391
+ "source": "baseline",
1392
+ "path": None,
1393
+ "evidence": {"omittedCount": 1},
1394
+ }
1395
+ derived = [
1396
+ {
1397
+ "id": (
1398
+ "scope:" + canonical_hash("comet.native.unresolved-scope-id.v1", omission_identity)
1399
+ ),
1400
+ "kind": "snapshot-omission",
1401
+ "source": "baseline",
1402
+ "path": "too-large.bin",
1403
+ "reason": "baseline snapshot omitted too-large.bin: file-size",
1404
+ },
1405
+ {
1406
+ "id": (
1407
+ "scope:"
1408
+ + canonical_hash("comet.native.unresolved-scope-id.v1", incomplete_identity)
1409
+ ),
1410
+ "kind": "snapshot-incomplete",
1411
+ "source": "baseline",
1412
+ "path": None,
1413
+ "reason": "baseline snapshot is incomplete",
1414
+ },
1415
+ ]
1416
+ original_unresolved = scope["unresolvedScopes"]
1417
+ scope["unresolvedScopes"] = sorted(
1418
+ [*original_unresolved, *derived],
1419
+ key=lambda item: (
1420
+ item["kind"],
1421
+ item["source"],
1422
+ (0, "") if item["path"] is None else (1, item["path"]),
1423
+ item["id"],
1424
+ ),
1425
+ )
1426
+ content = {key: value for key, value in scope.items() if key != "scopeHash"}
1427
+ scope_hash = canonical_hash("comet.native.implementation-scope.v2", content)
1428
+ scope["scopeHash"] = scope_hash
1429
+ valid_ref = f"runtime/evidence/scopes/{scope_hash}.json"
1430
+ write_json(root / valid_ref, scope)
1431
+ parse_scope_bundle(root, valid_ref)
1432
+
1433
+ scope["unresolvedScopes"] = original_unresolved
1434
+ content = {key: value for key, value in scope.items() if key != "scopeHash"}
1435
+ scope_hash = canonical_hash("comet.native.implementation-scope.v2", content)
1436
+ scope["scopeHash"] = scope_hash
1437
+ forged_ref = f"runtime/evidence/scopes/{scope_hash}.json"
1438
+ write_json(root / forged_ref, scope)
1439
+
1440
+ with pytest.raises(ValueError, match="omission|unresolved|scope"):
1441
+ parse_scope_bundle(root, forged_ref)
1442
+
1443
+
1444
+ @pytest.mark.parametrize(
1445
+ "forgery",
1446
+ [
1447
+ "change",
1448
+ "revision",
1449
+ "checker",
1450
+ "contract",
1451
+ "implementation",
1452
+ "coverage",
1453
+ "issue-counts",
1454
+ "issue-order",
1455
+ ],
1456
+ )
1457
+ def test_verification_parser_rejects_self_consistent_forged_check_receipts(
1458
+ tmp_path: Path,
1459
+ forgery: str,
1460
+ ):
1461
+ for name in ("wordcount.py", "test_wordcount.py"):
1462
+ source = TASKS_ROOT / "comet-native-wave-c-verification-integrity/environment" / name
1463
+ (tmp_path / name).write_bytes(source.read_bytes())
1464
+ root = tmp_path / "docs/comet/changes/receipt-bound"
1465
+ root.mkdir(parents=True)
1466
+ state = {"name": "receipt-bound", "phase": "archive", "verification_result": "pass"}
1467
+ contract = write_contract_artifacts(root, state, "receipt-bound")
1468
+ ref = write_verification_bundle(
1469
+ tmp_path,
1470
+ root,
1471
+ state,
1472
+ contract,
1473
+ result="pass",
1474
+ source_revision=3,
1475
+ created_at="2026-07-17T00:00:03.000Z",
1476
+ include_receipt=True,
1477
+ )
1478
+ parse_verification_bundle(
1479
+ project_root=tmp_path,
1480
+ change_root=root,
1481
+ evidence_ref=ref,
1482
+ state=state,
1483
+ verify_current_files=True,
1484
+ )
1485
+
1486
+ envelope = json.loads((root / ref).read_text(encoding="utf-8"))
1487
+ receipt = json.loads((root / envelope["receiptRef"]).read_text(encoding="utf-8"))
1488
+ if forgery == "change":
1489
+ receipt["change"] = "other-change"
1490
+ elif forgery == "revision":
1491
+ receipt["sourceRevision"] += 1
1492
+ elif forgery == "checker":
1493
+ receipt["checker"] = {
1494
+ "policy": "forged-policy",
1495
+ "version": 2,
1496
+ "hash": "f" * 64,
1497
+ "limits": CHECK_LIMITS,
1498
+ }
1499
+ elif forgery == "contract":
1500
+ receipt["contract"] = {
1501
+ "expectedHash": "a" * 64,
1502
+ "beforeHash": "a" * 64,
1503
+ "afterHash": "a" * 64,
1504
+ }
1505
+ elif forgery == "implementation":
1506
+ receipt["implementation"] = {
1507
+ "scopeHash": "b" * 64,
1508
+ "expectedSnapshotHash": "c" * 64,
1509
+ "beforeSnapshotHash": "c" * 64,
1510
+ "afterSnapshotHash": "c" * 64,
1511
+ }
1512
+ elif forgery == "coverage":
1513
+ receipt["counts"].update({"filesSelected": 1, "filesScanned": 1})
1514
+ elif forgery == "issue-counts":
1515
+ receipt["status"] = "failed"
1516
+ receipt["counts"].update({"issueCount": 1, "recordedIssueCount": 1})
1517
+ receipt["issuesTruncated"] = True
1518
+ elif forgery == "issue-order":
1519
+ receipt["status"] = "failed"
1520
+ receipt["counts"].update({"issueCount": 2, "recordedIssueCount": 2})
1521
+ receipt["issues"] = [
1522
+ {"path": "z.py", "line": 2, "kind": "trailing-whitespace"},
1523
+ {"path": "a.py", "line": 1, "kind": "conflict-marker"},
1524
+ ]
1525
+
1526
+ receipt["inputHash"] = canonical_hash(
1527
+ "comet.native.check-input.v1",
1528
+ {
1529
+ "change": receipt["change"],
1530
+ "sourceRevision": receipt["sourceRevision"],
1531
+ "checkerHash": receipt["checker"]["hash"],
1532
+ "contractHash": receipt["contract"]["expectedHash"],
1533
+ "scopeHash": receipt["implementation"]["scopeHash"],
1534
+ "snapshotHash": receipt["implementation"]["expectedSnapshotHash"],
1535
+ },
1536
+ )
1537
+ receipt_content = {key: value for key, value in receipt.items() if key != "receiptHash"}
1538
+ receipt_hash = canonical_hash("comet.native.check-receipt.v1", receipt_content)
1539
+ receipt["receiptHash"] = receipt_hash
1540
+ receipt_ref = f"runtime/evidence/check-receipts/{receipt_hash}.json"
1541
+ write_json(root / receipt_ref, receipt)
1542
+ envelope["receiptRef"] = receipt_ref
1543
+ envelope_content = {key: value for key, value in envelope.items() if key != "envelopeHash"}
1544
+ envelope_hash = canonical_hash("comet.native.verification-evidence.v1", envelope_content)
1545
+ envelope["envelopeHash"] = envelope_hash
1546
+ forged_ref = f"runtime/evidence/verifications/{envelope_hash}.json"
1547
+ write_json(root / forged_ref, envelope)
1548
+
1549
+ with pytest.raises(ValueError, match="receipt|checker|coverage|issue"):
1550
+ parse_verification_bundle(
1551
+ project_root=tmp_path,
1552
+ change_root=root,
1553
+ evidence_ref=forged_ref,
1554
+ state=state,
1555
+ verify_current_files=True,
1556
+ )
1557
+
1558
+
1559
+ def test_verification_parser_rejects_receipt_content_hash_corruption(tmp_path: Path):
1560
+ for name in ("wordcount.py", "test_wordcount.py"):
1561
+ source = TASKS_ROOT / "comet-native-wave-c-verification-integrity/environment" / name
1562
+ (tmp_path / name).write_bytes(source.read_bytes())
1563
+ root = tmp_path / "docs/comet/changes/receipt-hash"
1564
+ root.mkdir(parents=True)
1565
+ state = {"name": "receipt-hash", "phase": "archive", "verification_result": "pass"}
1566
+ contract = write_contract_artifacts(root, state, "receipt-hash")
1567
+ ref = write_verification_bundle(
1568
+ tmp_path,
1569
+ root,
1570
+ state,
1571
+ contract,
1572
+ result="pass",
1573
+ source_revision=4,
1574
+ created_at="2026-07-17T00:00:04.000Z",
1575
+ include_receipt=True,
1576
+ )
1577
+ envelope = json.loads((root / ref).read_text(encoding="utf-8"))
1578
+ receipt_path = root / envelope["receiptRef"]
1579
+ receipt = json.loads(receipt_path.read_text(encoding="utf-8"))
1580
+ receipt["endedAt"] = "2026-07-17T00:00:02.000Z"
1581
+ write_json(receipt_path, receipt)
1582
+
1583
+ with pytest.raises(ValueError, match="receipt|content hash"):
1584
+ parse_verification_bundle(
1585
+ project_root=tmp_path,
1586
+ change_root=root,
1587
+ evidence_ref=ref,
1588
+ state=state,
1589
+ verify_current_files=True,
1590
+ )
1591
+
1592
+
1593
+ def test_archive_transaction_rejects_reordered_durable_events(tmp_path: Path):
1594
+ archive = tmp_path / "docs/comet/archive/2026-07-17-transaction-check"
1595
+ archive.mkdir(parents=True)
1596
+ transaction_id = "dddddddd-1111-2222-3333-eeeeeeeeeeee"
1597
+ preflight = "f" * 64
1598
+ write_archive_transaction(tmp_path, transaction_id, "transaction-check", preflight)
1599
+ commit = {"transactionId": transaction_id, "preflightHash": preflight}
1600
+ assert (
1601
+ check_archive_transaction(tmp_path, commit, "transaction-check", preflight)["status"]
1602
+ == "passed"
1603
+ )
1604
+ events = tmp_path / f"docs/comet/runtime/transactions/{transaction_id}/events.jsonl"
1605
+ lines = events.read_text(encoding="utf-8").splitlines()
1606
+ lines[1], lines[2] = lines[2], lines[1]
1607
+ events.write_text("\n".join(lines) + "\n", encoding="utf-8")
1608
+ assert (
1609
+ check_archive_transaction(tmp_path, commit, "transaction-check", preflight)["status"]
1610
+ == "failed"
1611
+ )
1612
+
1613
+
1614
+ def test_verification_parser_rejects_symlinked_evidence_documents(tmp_path: Path):
1615
+ for name in ("wordcount.py", "test_wordcount.py"):
1616
+ source = TASKS_ROOT / "comet-native-wave-c-verification-integrity/environment" / name
1617
+ (tmp_path / name).write_bytes(source.read_bytes())
1618
+ root = tmp_path / "docs/comet/changes/symlink-evidence"
1619
+ root.mkdir(parents=True)
1620
+ state = {"name": "symlink-evidence", "phase": "archive", "verification_result": "pass"}
1621
+ contract = write_contract_artifacts(root, state, "symlink-evidence")
1622
+ ref = write_verification_bundle(
1623
+ tmp_path,
1624
+ root,
1625
+ state,
1626
+ contract,
1627
+ result="pass",
1628
+ source_revision=3,
1629
+ created_at="2026-07-17T00:00:03.000Z",
1630
+ )
1631
+ envelope = json.loads((root / ref).read_text(encoding="utf-8"))
1632
+ report = root / envelope["reportRef"]
1633
+ outside = tmp_path / "outside-report.md"
1634
+ outside.write_bytes(report.read_bytes())
1635
+ report.unlink()
1636
+ try:
1637
+ report.symlink_to(outside)
1638
+ except OSError as error:
1639
+ pytest.skip(f"Symbolic links are unavailable: {error}")
1640
+
1641
+ with pytest.raises(ValueError, match="regular file|symbolic link"):
1642
+ parse_verification_bundle(
1643
+ project_root=tmp_path,
1644
+ change_root=root,
1645
+ evidence_ref=ref,
1646
+ state=state,
1647
+ verify_current_files=True,
1648
+ )
1649
+
1650
+
1651
+ def test_wave_d_validator_requires_third_stop_one_override_and_twelfth_hard_stop(tmp_path: Path):
1652
+ validator = load_validator(
1653
+ "comet-native-wave-d-stagnation-stop", "test_native_wave_d_stagnation_stop.py"
1654
+ )
1655
+ validator.WORKSPACE = tmp_path
1656
+ root = tmp_path / "docs/comet/changes/stalled-average"
1657
+ (root / "runtime/evidence/verifications").mkdir(parents=True)
1658
+ (root / "specs/average-word-length").mkdir(parents=True)
1659
+ (tmp_path / "docs/comet/archive").mkdir(parents=True)
1660
+ for name in ("wordcount.py", "test_wordcount.py"):
1661
+ source = TASKS_ROOT / "comet-native-wave-d-stagnation-stop/environment" / name
1662
+ (tmp_path / name).write_bytes(source.read_bytes().replace(b"\r\n", b"\n"))
1663
+ state = {
1664
+ "name": "stalled-average",
1665
+ "phase": "build",
1666
+ "verification_result": "fail",
1667
+ }
1668
+ contract = write_contract_artifacts(root, state, "average-word-length")
1669
+ envelope_refs = [
1670
+ write_verification_bundle(
1671
+ tmp_path,
1672
+ root,
1673
+ state,
1674
+ contract,
1675
+ result="fail",
1676
+ source_revision=index + 1,
1677
+ created_at=f"2026-07-17T00:00:{index:02}.000Z",
1678
+ )
1679
+ for index in range(1, 13)
1680
+ ]
1681
+ state["verification_evidence"] = envelope_refs[-1]
1682
+ (root / "comet-state.yaml").write_text(yaml.safe_dump(state), encoding="utf-8")
1683
+ first_signature = "a" * 64
1684
+ later_signatures = ["b" * 64, "c" * 64]
1685
+ repair_events = [
1686
+ {
1687
+ "signatureHash": first_signature,
1688
+ "disposition": disposition,
1689
+ "overrideSummaryHash": None,
1690
+ }
1691
+ for disposition in ("continue", "warn", "manual-stop")
1692
+ ]
1693
+ repair_events.append(
1694
+ {
1695
+ "signatureHash": first_signature,
1696
+ "disposition": "continue",
1697
+ "overrideSummaryHash": "d" * 64,
1698
+ }
1699
+ )
1700
+ for attempt in range(4, 13):
1701
+ signature = later_signatures[(attempt - 4) % 2]
1702
+ repair_events.append(
1703
+ {
1704
+ "signatureHash": signature,
1705
+ "disposition": "hard-stop" if attempt == 12 else "continue",
1706
+ "overrideSummaryHash": None,
1707
+ }
1708
+ )
1709
+ (root / "runtime/trajectory.jsonl").write_text(
1710
+ "\n".join(
1711
+ json.dumps(
1712
+ {
1713
+ "sequence": index,
1714
+ "timestamp": "2026-07-17T00:00:00.000Z",
1715
+ "runId": "repair-run",
1716
+ "type": "state_transitioned",
1717
+ "data": {
1718
+ "previousPhase": (
1719
+ "build" if projection["overrideSummaryHash"] is not None else "verify"
1720
+ ),
1721
+ "nextPhase": (
1722
+ "verify" if projection["overrideSummaryHash"] is not None else "build"
1723
+ ),
1724
+ "repairStagnation": projection,
1725
+ },
1726
+ }
1727
+ )
1728
+ for index, projection in enumerate(repair_events, 1)
1729
+ )
1730
+ + "\n",
1731
+ encoding="utf-8",
1732
+ )
1733
+ manual_repair = {
1734
+ "disposition": "manual-stop",
1735
+ "reasonCode": "repeated-failure-stop",
1736
+ "signatureHash": first_signature,
1737
+ "consecutiveFailures": 3,
1738
+ "totalRepairFailures": 3,
1739
+ "remainingIterations": 9,
1740
+ "overrideAccepted": False,
1741
+ }
1742
+ write_json(
1743
+ tmp_path / ".cache/comet-native-eval/manual-stop.json",
1744
+ {
1745
+ "command": "next",
1746
+ "exitCode": 75,
1747
+ "data": {
1748
+ "repair": manual_repair,
1749
+ "findings": [{"code": "repair-stagnation-stop"}],
1750
+ },
1751
+ "error": {"code": "blocked", "message": "Repeated failure requires manual review"},
1752
+ },
1753
+ )
1754
+ write_json(
1755
+ tmp_path / ".cache/comet-native-eval/override.json",
1756
+ {
1757
+ "command": "next",
1758
+ "exitCode": 0,
1759
+ "data": {
1760
+ "previousPhase": "build",
1761
+ "change": {"phase": "verify", "verification_result": "pending"},
1762
+ },
1763
+ },
1764
+ )
1765
+ hard_repair = {
1766
+ "disposition": "hard-stop",
1767
+ "reasonCode": "repair-iteration-limit",
1768
+ "signatureHash": later_signatures[0],
1769
+ "consecutiveFailures": 1,
1770
+ "totalRepairFailures": 12,
1771
+ "remainingIterations": 0,
1772
+ "overrideAccepted": False,
1773
+ }
1774
+ write_json(
1775
+ tmp_path / ".cache/comet-native-eval/hard-stop.json",
1776
+ {
1777
+ "command": "next",
1778
+ "exitCode": 75,
1779
+ "data": {
1780
+ "repair": hard_repair,
1781
+ "findings": [{"code": "repair-iteration-limit"}],
1782
+ },
1783
+ "error": {"code": "blocked", "message": "Repair iteration limit reached"},
1784
+ },
1785
+ )
1786
+ write_json(
1787
+ tmp_path / ".cache/comet-native-eval/hard-stop-status.json",
1788
+ {
1789
+ "command": "status",
1790
+ "exitCode": 0,
1791
+ "data": {
1792
+ "name": "stalled-average",
1793
+ "phase": "build",
1794
+ "verificationResult": "fail",
1795
+ "nextCommand": None,
1796
+ "repair": {
1797
+ "disposition": "hard-stop",
1798
+ "signatureHash": later_signatures[0],
1799
+ "overrideRecorded": False,
1800
+ },
1801
+ "findingSummary": {"codes": ["repair-iteration-limit"]},
1802
+ },
1803
+ },
1804
+ )
1805
+
1806
+ result = validator.check_stagnation_stop()
1807
+ assert result["status"] == "passed", result
1808
+
1809
+
1810
+ def test_wave_e_validator_requires_early_conflict_workspace_and_single_cas_winner(tmp_path: Path):
1811
+ validator = load_validator(
1812
+ "comet-native-wave-e-parallel-safety", "test_native_wave_e_parallel_safety.py"
1813
+ )
1814
+ validator.WORKSPACE = tmp_path
1815
+ for name in ("normalize-case", "preserve-acronyms"):
1816
+ (tmp_path / "docs/comet/changes" / name).mkdir(parents=True)
1817
+ (tmp_path / "docs/comet/archive").mkdir(parents=True)
1818
+ write_json(
1819
+ tmp_path / ".cache/comet-native-eval/conflict-status.json",
1820
+ {
1821
+ "command": "status",
1822
+ "exitCode": 0,
1823
+ "data": {
1824
+ "name": "normalize-case",
1825
+ "phase": "shape",
1826
+ "revision": 1,
1827
+ "findingSummary": {
1828
+ "codes": ["native-change-conflict", "workspace-unattributed-changes"]
1829
+ },
1830
+ },
1831
+ },
1832
+ )
1833
+ write_json(
1834
+ tmp_path / ".cache/comet-native-eval/checkpoint-attempt-a.json",
1835
+ {
1836
+ "command": "checkpoint",
1837
+ "exitCode": 0,
1838
+ "data": {
1839
+ "change": {"name": "normalize-case", "revision": 2},
1840
+ "expectedRevision": 1,
1841
+ "previousRevision": 1,
1842
+ "revision": 2,
1843
+ "outcome": "recorded",
1844
+ },
1845
+ },
1846
+ )
1847
+ write_json(
1848
+ tmp_path / ".cache/comet-native-eval/checkpoint-attempt-b.json",
1849
+ {
1850
+ "command": "checkpoint",
1851
+ "exitCode": 73,
1852
+ "data": {
1853
+ "change": "normalize-case",
1854
+ "expectedRevision": 1,
1855
+ "actualRevision": 2,
1856
+ "outcome": "revision-conflict",
1857
+ },
1858
+ },
1859
+ )
1860
+
1861
+ assert validator.check_parallel_safety()["status"] == "passed"
1862
+ assert validator.check_live_concurrent_cas()["status"] == "failed"
1863
+
1864
+
1865
+ def test_wave_e_barrier_launches_two_independent_cas_processes(tmp_path: Path):
1866
+ validator = load_validator(
1867
+ "comet-native-wave-e-parallel-safety", "test_native_wave_e_parallel_safety.py"
1868
+ )
1869
+ validator.WORKSPACE = tmp_path
1870
+ barrier_root = tmp_path / ".cache/comet-native-eval"
1871
+ barrier_root.mkdir(parents=True)
1872
+ lock = tmp_path / "cas.lock"
1873
+ script = r"""
1874
+ import json, os, pathlib, sys
1875
+ lock = pathlib.Path(sys.argv[1])
1876
+ try:
1877
+ descriptor = os.open(lock, os.O_CREAT | os.O_EXCL | os.O_WRONLY)
1878
+ os.write(descriptor, b"2")
1879
+ os.close(descriptor)
1880
+ code = 0
1881
+ data = {"change": {"name": "normalize-case", "revision": 2}, "expectedRevision": 1, "previousRevision": 1, "revision": 2, "outcome": "recorded", "pid": os.getpid()}
1882
+ except FileExistsError:
1883
+ code = 73
1884
+ data = {"change": "normalize-case", "expectedRevision": 1, "actualRevision": 2, "outcome": "revision-conflict", "pid": os.getpid()}
1885
+ payload = {"command": "checkpoint", "exitCode": code, "data": data}
1886
+ if code:
1887
+ payload["error"] = {"code": "conflict", "message": "revision conflict"}
1888
+ print(json.dumps(payload))
1889
+ raise SystemExit(code)
1890
+ """
1891
+ commands = [[sys.executable, "-c", script, str(lock), label] for label in ("A", "B")]
1892
+ results = validator.run_barrier_commands(commands, barrier_root)
1893
+ assert all(result.stdout for result in results), [
1894
+ (result.returncode, result.stderr) for result in results
1895
+ ]
1896
+ payloads = [json.loads(result.stdout) for result in results]
1897
+
1898
+ assert sorted(result.returncode for result in results) == [0, 73]
1899
+ assert len({payload["data"]["pid"] for payload in payloads}) == 2
1900
+ paths = []
1901
+ for index, payload in enumerate(payloads):
1902
+ path = tmp_path / f"attempt-{index}.json"
1903
+ write_json(path, payload)
1904
+ paths.append(path)
1905
+ assert check_checkpoint_cas_envelopes(paths)["status"] == "passed"
1906
+
1907
+
1908
+ def test_wave_e_live_cas_never_executes_agent_mutable_runtime(tmp_path: Path):
1909
+ validator = load_validator(
1910
+ "comet-native-wave-e-parallel-safety", "test_native_wave_e_parallel_safety.py"
1911
+ )
1912
+ validator.WORKSPACE = tmp_path
1913
+ state_file = tmp_path / "docs/comet/changes/normalize-case/comet-state.yaml"
1914
+ state_file.parent.mkdir(parents=True)
1915
+ state_file.write_text("name: normalize-case\nrevision: 1\n", encoding="utf-8")
1916
+ (tmp_path / ".cache/comet-native-eval").mkdir(parents=True)
1917
+
1918
+ trusted_marker = tmp_path / "trusted-runtime-ran"
1919
+ trusted_root = tmp_path / "_eval_trusted_oracles"
1920
+ trusted_root.mkdir()
1921
+ trusted_runtime = trusted_root / "comet-native-runtime.mjs"
1922
+ trusted_runtime.write_text(
1923
+ "import fs from 'node:fs';\n"
1924
+ f"fs.writeFileSync({json.dumps(str(trusted_marker))}, 'trusted');\n"
1925
+ "console.log(JSON.stringify({command:'checkpoint',exitCode:2,data:{}}));\n"
1926
+ "process.exit(2);\n",
1927
+ encoding="utf-8",
1928
+ )
1929
+ write_json(
1930
+ trusted_root / "native-runtime-identity.json",
1931
+ {
1932
+ "schema": "comet.eval.trusted-native-runtime.v1",
1933
+ "runtimeFile": trusted_runtime.name,
1934
+ "runtimeHash": hashlib.sha256(trusted_runtime.read_bytes()).hexdigest(),
1935
+ },
1936
+ )
1937
+
1938
+ mutable_marker = tmp_path / "agent-runtime-ran"
1939
+ mutable_runtime = tmp_path / ".claude/skills/comet-native/scripts/comet-native-runtime.mjs"
1940
+ mutable_runtime.parent.mkdir(parents=True)
1941
+ mutable_runtime.write_text(
1942
+ "import fs from 'node:fs';\n"
1943
+ f"fs.writeFileSync({json.dumps(str(mutable_marker))}, 'agent');\n"
1944
+ "console.log(JSON.stringify({command:'checkpoint',exitCode:2,data:{}}));\n"
1945
+ "process.exit(2);\n",
1946
+ encoding="utf-8",
1947
+ )
1948
+
1949
+ result = validator.check_live_concurrent_cas()
1950
+
1951
+ assert result["status"] == "failed"
1952
+ assert trusted_marker.is_file()
1953
+ assert not mutable_marker.exists()
1954
+
1955
+
1956
+ def test_wave_f_validator_requires_matching_projection_and_unchanged_tree(tmp_path: Path):
1957
+ validator = load_validator(
1958
+ "comet-native-wave-f-dashboard-readonly", "test_native_wave_f_dashboard_readonly.py"
1959
+ )
1960
+ validator.WORKSPACE = tmp_path
1961
+ projection = {
1962
+ "workflow": "native",
1963
+ "name": "dashboard-visible-change",
1964
+ "phase": "shape",
1965
+ "revision": 1,
1966
+ "selected": True,
1967
+ "nextCommand": 'comet native next dashboard-visible-change --summary "<summary>"',
1968
+ "verificationResult": "pending",
1969
+ "verificationFreshness": "missing",
1970
+ "archiveReady": False,
1971
+ "continuation": {
1972
+ "disposition": "continue",
1973
+ "action": "work-phase",
1974
+ "command": 'comet native next dashboard-visible-change --summary "<summary>"',
1975
+ "requiresUserDecision": False,
1976
+ "requiredInputs": [],
1977
+ "requiredInputsTruncated": False,
1978
+ },
1979
+ "findings": {
1980
+ "total": 0,
1981
+ "errors": 0,
1982
+ "warnings": 0,
1983
+ "info": 0,
1984
+ "requiresUserDecision": False,
1985
+ "codes": [],
1986
+ "truncated": False,
1987
+ },
1988
+ "archive": {
1989
+ "ready": False,
1990
+ "evidenceFreshness": "missing",
1991
+ "operationCount": 1,
1992
+ "findingCodes": ["archive-phase-required", "verification-evidence-missing"],
1993
+ "findingCodesTruncated": False,
1994
+ "preflightHash": "a" * 64,
1995
+ },
1996
+ "conflicts": {
1997
+ "visibleDefiniteConflict": 0,
1998
+ "visiblePossibleOverlap": 0,
1999
+ "peers": [],
2000
+ "peersTruncated": False,
2001
+ },
2002
+ }
2003
+ cli_projection = {
2004
+ "name": projection["name"],
2005
+ "phase": projection["phase"],
2006
+ "revision": projection["revision"],
2007
+ "selected": projection["selected"],
2008
+ "nextCommand": projection["nextCommand"],
2009
+ "verificationResult": projection["verificationResult"],
2010
+ "archiveReady": projection["archiveReady"],
2011
+ "continuation": projection["continuation"],
2012
+ "findingSummary": projection["findings"],
2013
+ }
2014
+ write_json(
2015
+ tmp_path / ".cache/comet-native-eval/cli-before.json",
2016
+ {"command": "status", "exitCode": 0, "data": cli_projection},
2017
+ )
2018
+ write_json(
2019
+ tmp_path / ".cache/comet-native-eval/cli-after.json",
2020
+ {"command": "status", "exitCode": 0, "data": cli_projection},
2021
+ )
2022
+ write_json(
2023
+ tmp_path / ".cache/comet-native-eval/dashboard.json",
2024
+ {
2025
+ "native": {
2026
+ "schema": "comet.dashboard.native.v1",
2027
+ "generatedAt": "2026-07-17T00:00:00.000Z",
2028
+ "totalChangeCount": 1,
2029
+ "visibleChangeCount": 1,
2030
+ "omittedChangeCount": 0,
2031
+ "changesTruncated": False,
2032
+ "changes": [projection],
2033
+ "conflicts": {
2034
+ "available": True,
2035
+ "definiteConflict": 0,
2036
+ "possibleOverlap": 0,
2037
+ "disjoint": 0,
2038
+ "relationshipCount": 0,
2039
+ "visibleRelationshipCount": 0,
2040
+ "omittedRelationshipCount": 0,
2041
+ "relationshipsTruncated": False,
2042
+ },
2043
+ }
2044
+ },
2045
+ )
2046
+ native_change = tmp_path / "docs/comet/changes/dashboard-visible-change"
2047
+ native_change.mkdir(parents=True)
2048
+ (native_change / "comet-state.yaml").write_text(
2049
+ "name: dashboard-visible-change\n", encoding="utf-8"
2050
+ )
2051
+ manifest = {"files": validator._current_native_manifest()}
2052
+ write_json(tmp_path / ".cache/comet-native-eval/native-tree-before.json", manifest)
2053
+ write_json(tmp_path / ".cache/comet-native-eval/native-tree-after.json", manifest)
2054
+
2055
+ readonly = validator.check_dashboard_readonly()
2056
+ assert readonly["status"] == "passed", readonly
2057
+ assert validator.check_public_native_projection()["status"] == "passed"
2058
+
2059
+
2060
+ def test_wave_f_rejects_tampered_controller_source_build(monkeypatch, tmp_path: Path):
2061
+ eval_conftest = sys.modules["conftest"]
2062
+ checkout = tmp_path / "checkout"
2063
+ (checkout / "bin").mkdir(parents=True)
2064
+ (checkout / "bin/comet.js").write_text("import '../dist/app/cli/index.js';\n", encoding="utf-8")
2065
+ (checkout / "package.json").write_text('{"type":"module"}\n', encoding="utf-8")
2066
+ (checkout / "assets").mkdir()
2067
+ (checkout / "assets/manifest.json").write_text('{"skills": []}\n', encoding="utf-8")
2068
+ environment = tmp_path / "environment"
2069
+ environment.mkdir()
2070
+ (environment / ".include-current-comet-cli").write_text("include\n", encoding="utf-8")
2071
+ workspace = tmp_path / "workspace"
2072
+ workspace.mkdir()
2073
+
2074
+ def fake_source_build(_checkout: Path, output: Path) -> str:
2075
+ (output / "app/cli").mkdir(parents=True)
2076
+ (output / "domains/dashboard").mkdir(parents=True)
2077
+ (output / "app/cli/index.js").write_text("export {};\n", encoding="utf-8")
2078
+ (output / "domains/dashboard/native-adapter.js").write_text(
2079
+ "export const schema = 'native';\n", encoding="utf-8"
2080
+ )
2081
+ return "5.9.3"
2082
+
2083
+ monkeypatch.setattr(eval_conftest, "REPOSITORY_ROOT", checkout)
2084
+ monkeypatch.setattr(eval_conftest, "_build_current_comet_dist", fake_source_build)
2085
+ eval_conftest._copy_current_comet_cli_snapshot(environment, workspace)
2086
+ validator = load_validator(
2087
+ "comet-native-wave-f-dashboard-readonly", "test_native_wave_f_dashboard_readonly.py"
2088
+ )
2089
+ validator.WORKSPACE = workspace
2090
+
2091
+ identity_check = validator.check_current_cli_build_identity()
2092
+ assert identity_check["status"] == "passed", identity_check
2093
+ adapter = workspace / "_eval_current_comet/dist/domains/dashboard/native-adapter.js"
2094
+ adapter.write_text("export const schema = 'forged';\n", encoding="utf-8")
2095
+ assert validator.check_current_cli_build_identity()["status"] == "failed"
2096
+
2097
+
2098
+ def test_wave_f_live_check_rejects_a_single_dashboard_write(monkeypatch, tmp_path: Path):
2099
+ validator = load_validator(
2100
+ "comet-native-wave-f-dashboard-readonly", "test_native_wave_f_dashboard_readonly.py"
2101
+ )
2102
+ validator.WORKSPACE = tmp_path
2103
+ (tmp_path / "_eval_current_comet/bin").mkdir(parents=True)
2104
+ (tmp_path / "_eval_current_comet/bin/comet.js").write_text("// fixture\n", encoding="utf-8")
2105
+ (tmp_path / "current-comet.sh").write_text("#!/usr/bin/env bash\n", encoding="utf-8")
2106
+ native = tmp_path / "docs/comet/changes/dashboard-visible-change"
2107
+ native.mkdir(parents=True)
2108
+ (native / "comet-state.yaml").write_text(
2109
+ "name: dashboard-visible-change\n", encoding="utf-8"
2110
+ )
2111
+ (tmp_path / ".cache/comet-native-eval").mkdir(parents=True)
2112
+ calls = 0
2113
+
2114
+ def write_once(_wrapper: Path, project_root: Path):
2115
+ nonlocal calls
2116
+ calls += 1
2117
+ if calls == 1:
2118
+ target = project_root / "docs/comet/runtime/one-time-write.json"
2119
+ target.parent.mkdir(parents=True, exist_ok=True)
2120
+ target.write_text("{}\n", encoding="utf-8")
2121
+ return {"native": {"changes": []}}
2122
+
2123
+ monkeypatch.setattr(validator, "_run_live_dashboard", write_once)
2124
+ result = validator.check_live_dashboard_and_tree()
2125
+
2126
+ assert result["status"] == "failed"
2127
+ assert "modified the live Native tree" in result["reason"]
2128
+
2129
+
2130
+ def test_wave_f_live_check_never_executes_agent_mutable_wrapper(monkeypatch, tmp_path: Path):
2131
+ validator = load_validator(
2132
+ "comet-native-wave-f-dashboard-readonly", "test_native_wave_f_dashboard_readonly.py"
2133
+ )
2134
+ validator.WORKSPACE = tmp_path
2135
+ projection = {"name": "dashboard-visible-change", "phase": "shape"}
2136
+ dashboard = {"native": {"changes": [projection]}}
2137
+
2138
+ snapshot = tmp_path / "_eval_current_comet"
2139
+ (snapshot / "bin").mkdir(parents=True)
2140
+ (snapshot / "package.json").write_text('{"type":"module"}\n', encoding="utf-8")
2141
+ (snapshot / "bin/comet.js").write_text(
2142
+ f"console.log(JSON.stringify({json.dumps(dashboard)}));\n",
2143
+ encoding="utf-8",
2144
+ )
2145
+
2146
+ mutable_marker = tmp_path / "agent-wrapper-ran"
2147
+ mutable_wrapper = tmp_path / "current-comet.sh"
2148
+ mutable_wrapper.write_text("#!/usr/bin/env bash\nexit 99\n", encoding="utf-8")
2149
+
2150
+ native_change = tmp_path / "docs/comet/changes/dashboard-visible-change"
2151
+ native_change.mkdir(parents=True)
2152
+ (native_change / "comet-state.yaml").write_text(
2153
+ "name: dashboard-visible-change\nphase: shape\n", encoding="utf-8"
2154
+ )
2155
+ (tmp_path / ".comet").mkdir()
2156
+ (tmp_path / ".comet" / "config.yaml").write_text(
2157
+ "schema: comet.project.v1\ndefault_workflow: native\nworkflows:\n - native\nnative:\n artifact_root: docs\n",
2158
+ encoding="utf-8",
2159
+ )
2160
+ evidence = tmp_path / ".cache/comet-native-eval"
2161
+ write_json(
2162
+ evidence / "cli-after.json",
2163
+ {"command": "status", "exitCode": 0, "data": projection},
2164
+ )
2165
+ write_json(
2166
+ evidence / "native-tree-after.json",
2167
+ {"files": validator._current_native_manifest()},
2168
+ )
2169
+
2170
+ real_run = validator.subprocess.run
2171
+
2172
+ def run_process(command, *args, **kwargs):
2173
+ if command[0] == "bash":
2174
+ mutable_marker.write_text("agent", encoding="utf-8")
2175
+ return validator.subprocess.CompletedProcess(command, 0, json.dumps(dashboard), "")
2176
+ return real_run(command, *args, **kwargs)
2177
+
2178
+ monkeypatch.setattr(validator.subprocess, "run", run_process)
2179
+
2180
+ result = validator.check_live_dashboard_and_tree()
2181
+
2182
+ assert result["status"] == "passed", result
2183
+ assert not mutable_marker.exists()