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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (687) hide show
  1. package/README.md +209 -74
  2. package/assets/manifest.json +14 -5
  3. package/assets/skills/comet/SKILL.md +17 -282
  4. package/assets/skills/comet/reference/comet-yaml-fields.md +1 -1
  5. package/assets/skills/comet/reference/context-recovery.md +3 -3
  6. package/assets/skills/comet/reference/intent-frame.md +2 -2
  7. package/assets/skills/comet/reference/scripts.md +2 -2
  8. package/assets/skills/comet/rules/comet-workflow-guard.en.md +32 -0
  9. package/assets/skills/comet/rules/comet-workflow-guard.md +32 -0
  10. package/assets/skills/comet/scripts/comet-entry-runtime.mjs +7834 -0
  11. package/assets/skills/comet/scripts/comet-hook-router.mjs +10307 -0
  12. package/assets/skills/comet/scripts/comet-runtime.mjs +612 -499
  13. package/assets/skills/comet-any/SKILL.md +4 -4
  14. package/assets/skills/comet-any/reference/authoring-subagents.md +1 -1
  15. package/assets/skills/comet-any/reference/bundle-authoring.md +1 -1
  16. package/assets/skills/comet-any/reference/subagents/reference-author.md +1 -1
  17. package/assets/skills/comet-any/reference/subagents/script-author.md +1 -1
  18. package/assets/skills/comet-any/reference/subagents/skill-core-author.md +1 -1
  19. package/assets/skills/comet-any/reference/subagents/skill-reviewer.md +2 -2
  20. package/assets/skills/comet-any/reference/subagents/workflow-entry-author.md +3 -3
  21. package/assets/skills/comet-archive/SKILL.md +1 -2
  22. package/assets/skills/comet-build/SKILL.md +1 -1
  23. package/assets/skills/comet-classic/SKILL.md +293 -0
  24. package/assets/skills/comet-design/SKILL.md +1 -1
  25. package/assets/skills/comet-hotfix/SKILL.md +4 -4
  26. package/assets/skills/comet-native/SKILL.md +257 -0
  27. package/assets/skills/comet-native/reference/artifacts.md +204 -0
  28. package/assets/skills/comet-native/reference/commands.md +118 -0
  29. package/assets/skills/comet-native/reference/recovery.md +143 -0
  30. package/assets/skills/comet-native/scripts/comet-native-hook-guard.mjs +4 -0
  31. package/assets/skills/comet-native/scripts/comet-native-runtime.mjs +28898 -0
  32. package/assets/skills/comet-open/SKILL.md +4 -4
  33. package/assets/skills/comet-tweak/SKILL.md +7 -7
  34. package/assets/skills-zh/comet/SKILL.md +17 -270
  35. package/assets/skills-zh/comet/reference/comet-yaml-fields.md +1 -1
  36. package/assets/skills-zh/comet/reference/context-recovery.md +3 -3
  37. package/assets/skills-zh/comet/reference/intent-frame.md +2 -2
  38. package/assets/skills-zh/comet/reference/scripts.md +2 -2
  39. package/assets/skills-zh/comet-any/SKILL.md +4 -4
  40. package/assets/skills-zh/comet-any/reference/authoring-subagents.md +1 -1
  41. package/assets/skills-zh/comet-any/reference/bundle-authoring.md +1 -1
  42. package/assets/skills-zh/comet-any/reference/subagents/reference-author.md +1 -1
  43. package/assets/skills-zh/comet-any/reference/subagents/script-author.md +1 -1
  44. package/assets/skills-zh/comet-any/reference/subagents/skill-core-author.md +1 -1
  45. package/assets/skills-zh/comet-any/reference/subagents/skill-reviewer.md +2 -2
  46. package/assets/skills-zh/comet-any/reference/subagents/workflow-entry-author.md +3 -3
  47. package/assets/skills-zh/comet-archive/SKILL.md +1 -2
  48. package/assets/skills-zh/comet-build/SKILL.md +1 -1
  49. package/assets/skills-zh/comet-classic/SKILL.md +281 -0
  50. package/assets/skills-zh/comet-design/SKILL.md +1 -1
  51. package/assets/skills-zh/comet-hotfix/SKILL.md +4 -4
  52. package/assets/skills-zh/comet-native/SKILL.md +257 -0
  53. package/assets/skills-zh/comet-native/reference/artifacts.md +206 -0
  54. package/assets/skills-zh/comet-native/reference/commands.md +118 -0
  55. package/assets/skills-zh/comet-native/reference/recovery.md +143 -0
  56. package/assets/skills-zh/comet-open/SKILL.md +4 -4
  57. package/assets/skills-zh/comet-tweak/SKILL.md +7 -7
  58. package/dist/app/cli/index.js +59 -13
  59. package/dist/app/cli/index.js.map +1 -1
  60. package/dist/app/commands/command-result.d.ts +6 -0
  61. package/dist/app/commands/command-result.d.ts.map +1 -0
  62. package/dist/app/commands/command-result.js +4 -0
  63. package/dist/app/commands/command-result.js.map +1 -0
  64. package/dist/app/commands/doctor.d.ts +1 -0
  65. package/dist/app/commands/doctor.d.ts.map +1 -1
  66. package/dist/app/commands/doctor.js +201 -26
  67. package/dist/app/commands/doctor.js.map +1 -1
  68. package/dist/app/commands/eval.d.ts +3 -1
  69. package/dist/app/commands/eval.d.ts.map +1 -1
  70. package/dist/app/commands/eval.js +17 -7
  71. package/dist/app/commands/eval.js.map +1 -1
  72. package/dist/app/commands/i18n.d.ts +1 -1
  73. package/dist/app/commands/i18n.d.ts.map +1 -1
  74. package/dist/app/commands/i18n.js +6 -2
  75. package/dist/app/commands/i18n.js.map +1 -1
  76. package/dist/app/commands/init.d.ts +10 -2
  77. package/dist/app/commands/init.d.ts.map +1 -1
  78. package/dist/app/commands/init.js +331 -50
  79. package/dist/app/commands/init.js.map +1 -1
  80. package/dist/app/commands/native.d.ts +2 -0
  81. package/dist/app/commands/native.d.ts.map +1 -0
  82. package/dist/app/commands/native.js +10 -0
  83. package/dist/app/commands/native.js.map +1 -0
  84. package/dist/app/commands/project-scope-selection.d.ts.map +1 -1
  85. package/dist/app/commands/project-scope-selection.js +2 -0
  86. package/dist/app/commands/project-scope-selection.js.map +1 -1
  87. package/dist/app/commands/resume-probe.d.ts.map +1 -1
  88. package/dist/app/commands/resume-probe.js +8 -2
  89. package/dist/app/commands/resume-probe.js.map +1 -1
  90. package/dist/app/commands/status.d.ts +0 -32
  91. package/dist/app/commands/status.d.ts.map +1 -1
  92. package/dist/app/commands/status.js +44 -177
  93. package/dist/app/commands/status.js.map +1 -1
  94. package/dist/app/commands/update.d.ts +20 -4
  95. package/dist/app/commands/update.d.ts.map +1 -1
  96. package/dist/app/commands/update.js +698 -90
  97. package/dist/app/commands/update.js.map +1 -1
  98. package/dist/app/commands/workflow.d.ts +6 -0
  99. package/dist/app/commands/workflow.d.ts.map +1 -0
  100. package/dist/app/commands/workflow.js +11 -0
  101. package/dist/app/commands/workflow.js.map +1 -0
  102. package/dist/config/repository-layout.json +21 -1
  103. package/dist/domains/comet-classic/classic-archive.d.ts.map +1 -1
  104. package/dist/domains/comet-classic/classic-archive.js +3 -0
  105. package/dist/domains/comet-classic/classic-archive.js.map +1 -1
  106. package/dist/domains/comet-classic/classic-current-change.d.ts +3 -5
  107. package/dist/domains/comet-classic/classic-current-change.d.ts.map +1 -1
  108. package/dist/domains/comet-classic/classic-current-change.js +31 -57
  109. package/dist/domains/comet-classic/classic-current-change.js.map +1 -1
  110. package/dist/domains/comet-classic/classic-hook-guard.d.ts +9 -0
  111. package/dist/domains/comet-classic/classic-hook-guard.d.ts.map +1 -1
  112. package/dist/domains/comet-classic/classic-hook-guard.js +84 -11
  113. package/dist/domains/comet-classic/classic-hook-guard.js.map +1 -1
  114. package/dist/domains/comet-classic/classic-project-config.d.ts.map +1 -1
  115. package/dist/domains/comet-classic/classic-project-config.js +12 -8
  116. package/dist/domains/comet-classic/classic-project-config.js.map +1 -1
  117. package/dist/domains/comet-classic/classic-runtime-run.d.ts.map +1 -1
  118. package/dist/domains/comet-classic/classic-runtime-run.js +9 -1
  119. package/dist/domains/comet-classic/classic-runtime-run.js.map +1 -1
  120. package/dist/domains/comet-entry/current-selection-repair.d.ts +17 -0
  121. package/dist/domains/comet-entry/current-selection-repair.d.ts.map +1 -0
  122. package/dist/domains/comet-entry/current-selection-repair.js +19 -0
  123. package/dist/domains/comet-entry/current-selection-repair.js.map +1 -0
  124. package/dist/domains/comet-entry/current-selection.d.ts +28 -0
  125. package/dist/domains/comet-entry/current-selection.d.ts.map +1 -0
  126. package/dist/domains/comet-entry/current-selection.js +116 -0
  127. package/dist/domains/comet-entry/current-selection.js.map +1 -0
  128. package/dist/domains/comet-entry/entry-runtime-entry.d.ts +2 -0
  129. package/dist/domains/comet-entry/entry-runtime-entry.d.ts.map +1 -0
  130. package/dist/domains/comet-entry/entry-runtime-entry.js +3 -0
  131. package/dist/domains/comet-entry/entry-runtime-entry.js.map +1 -0
  132. package/dist/domains/comet-entry/entry-runtime.d.ts +7 -0
  133. package/dist/domains/comet-entry/entry-runtime.d.ts.map +1 -0
  134. package/dist/domains/comet-entry/entry-runtime.js +55 -0
  135. package/dist/domains/comet-entry/entry-runtime.js.map +1 -0
  136. package/dist/domains/comet-entry/hook-adapter.d.ts +6 -0
  137. package/dist/domains/comet-entry/hook-adapter.d.ts.map +1 -0
  138. package/dist/domains/comet-entry/hook-adapter.js +202 -0
  139. package/dist/domains/comet-entry/hook-adapter.js.map +1 -0
  140. package/dist/domains/comet-entry/hook-router-entry.d.ts +8 -0
  141. package/dist/domains/comet-entry/hook-router-entry.d.ts.map +1 -0
  142. package/dist/domains/comet-entry/hook-router-entry.js +92 -0
  143. package/dist/domains/comet-entry/hook-router-entry.js.map +1 -0
  144. package/dist/domains/comet-entry/hook-router.d.ts +32 -0
  145. package/dist/domains/comet-entry/hook-router.d.ts.map +1 -0
  146. package/dist/domains/comet-entry/hook-router.js +133 -0
  147. package/dist/domains/comet-entry/hook-router.js.map +1 -0
  148. package/dist/domains/comet-entry/hook-types.d.ts +20 -0
  149. package/dist/domains/comet-entry/hook-types.d.ts.map +1 -0
  150. package/dist/domains/comet-entry/hook-types.js +2 -0
  151. package/dist/domains/comet-entry/hook-types.js.map +1 -0
  152. package/dist/domains/comet-entry/init-workflow.d.ts +16 -0
  153. package/dist/domains/comet-entry/init-workflow.d.ts.map +1 -0
  154. package/dist/domains/comet-entry/init-workflow.js +103 -0
  155. package/dist/domains/comet-entry/init-workflow.js.map +1 -0
  156. package/dist/domains/comet-entry/project-status.d.ts +3 -0
  157. package/dist/domains/comet-entry/project-status.d.ts.map +1 -0
  158. package/dist/domains/comet-entry/project-status.js +222 -0
  159. package/dist/domains/comet-entry/project-status.js.map +1 -0
  160. package/dist/domains/comet-entry/resolve-entry.d.ts +3 -0
  161. package/dist/domains/comet-entry/resolve-entry.d.ts.map +1 -0
  162. package/dist/domains/comet-entry/resolve-entry.js +22 -0
  163. package/dist/domains/comet-entry/resolve-entry.js.map +1 -0
  164. package/dist/domains/comet-entry/resume-probe.d.ts +34 -0
  165. package/dist/domains/comet-entry/resume-probe.d.ts.map +1 -0
  166. package/dist/domains/comet-entry/resume-probe.js +458 -0
  167. package/dist/domains/comet-entry/resume-probe.js.map +1 -0
  168. package/dist/domains/comet-entry/types.d.ts +59 -0
  169. package/dist/domains/comet-entry/types.d.ts.map +1 -0
  170. package/dist/domains/comet-entry/types.js +2 -0
  171. package/dist/domains/comet-entry/types.js.map +1 -0
  172. package/dist/domains/comet-entry/workflow-resolution.d.ts +8 -0
  173. package/dist/domains/comet-entry/workflow-resolution.d.ts.map +1 -0
  174. package/dist/domains/comet-entry/workflow-resolution.js +16 -0
  175. package/dist/domains/comet-entry/workflow-resolution.js.map +1 -0
  176. package/dist/domains/comet-native/index.d.ts +35 -0
  177. package/dist/domains/comet-native/index.d.ts.map +1 -0
  178. package/dist/domains/comet-native/index.js +35 -0
  179. package/dist/domains/comet-native/index.js.map +1 -0
  180. package/dist/domains/comet-native/native-acceptance.d.ts +42 -0
  181. package/dist/domains/comet-native/native-acceptance.d.ts.map +1 -0
  182. package/dist/domains/comet-native/native-acceptance.js +503 -0
  183. package/dist/domains/comet-native/native-acceptance.js.map +1 -0
  184. package/dist/domains/comet-native/native-archive-content.d.ts +26 -0
  185. package/dist/domains/comet-native/native-archive-content.d.ts.map +1 -0
  186. package/dist/domains/comet-native/native-archive-content.js +159 -0
  187. package/dist/domains/comet-native/native-archive-content.js.map +1 -0
  188. package/dist/domains/comet-native/native-archive-inspection.d.ts +9 -0
  189. package/dist/domains/comet-native/native-archive-inspection.d.ts.map +1 -0
  190. package/dist/domains/comet-native/native-archive-inspection.js +94 -0
  191. package/dist/domains/comet-native/native-archive-inspection.js.map +1 -0
  192. package/dist/domains/comet-native/native-archive-preflight.d.ts +52 -0
  193. package/dist/domains/comet-native/native-archive-preflight.d.ts.map +1 -0
  194. package/dist/domains/comet-native/native-archive-preflight.js +214 -0
  195. package/dist/domains/comet-native/native-archive-preflight.js.map +1 -0
  196. package/dist/domains/comet-native/native-archive-transaction.d.ts +19 -0
  197. package/dist/domains/comet-native/native-archive-transaction.d.ts.map +1 -0
  198. package/dist/domains/comet-native/native-archive-transaction.js +1181 -0
  199. package/dist/domains/comet-native/native-archive-transaction.js.map +1 -0
  200. package/dist/domains/comet-native/native-archive.d.ts +36 -0
  201. package/dist/domains/comet-native/native-archive.d.ts.map +1 -0
  202. package/dist/domains/comet-native/native-archive.js +403 -0
  203. package/dist/domains/comet-native/native-archive.js.map +1 -0
  204. package/dist/domains/comet-native/native-artifacts.d.ts +10 -0
  205. package/dist/domains/comet-native/native-artifacts.d.ts.map +1 -0
  206. package/dist/domains/comet-native/native-artifacts.js +204 -0
  207. package/dist/domains/comet-native/native-artifacts.js.map +1 -0
  208. package/dist/domains/comet-native/native-atomic-file.d.ts +10 -0
  209. package/dist/domains/comet-native/native-atomic-file.d.ts.map +1 -0
  210. package/dist/domains/comet-native/native-atomic-file.js +175 -0
  211. package/dist/domains/comet-native/native-atomic-file.js.map +1 -0
  212. package/dist/domains/comet-native/native-bounded-file.d.ts +19 -0
  213. package/dist/domains/comet-native/native-bounded-file.d.ts.map +1 -0
  214. package/dist/domains/comet-native/native-bounded-file.js +180 -0
  215. package/dist/domains/comet-native/native-bounded-file.js.map +1 -0
  216. package/dist/domains/comet-native/native-build-evidence.d.ts +42 -0
  217. package/dist/domains/comet-native/native-build-evidence.d.ts.map +1 -0
  218. package/dist/domains/comet-native/native-build-evidence.js +257 -0
  219. package/dist/domains/comet-native/native-build-evidence.js.map +1 -0
  220. package/dist/domains/comet-native/native-canonical-hash.d.ts +10 -0
  221. package/dist/domains/comet-native/native-canonical-hash.d.ts.map +1 -0
  222. package/dist/domains/comet-native/native-canonical-hash.js +100 -0
  223. package/dist/domains/comet-native/native-canonical-hash.js.map +1 -0
  224. package/dist/domains/comet-native/native-change-recovery.d.ts +11 -0
  225. package/dist/domains/comet-native/native-change-recovery.d.ts.map +1 -0
  226. package/dist/domains/comet-native/native-change-recovery.js +15 -0
  227. package/dist/domains/comet-native/native-change-recovery.js.map +1 -0
  228. package/dist/domains/comet-native/native-change.d.ts +61 -0
  229. package/dist/domains/comet-native/native-change.d.ts.map +1 -0
  230. package/dist/domains/comet-native/native-change.js +696 -0
  231. package/dist/domains/comet-native/native-change.js.map +1 -0
  232. package/dist/domains/comet-native/native-check-receipt-model.d.ts +63 -0
  233. package/dist/domains/comet-native/native-check-receipt-model.d.ts.map +1 -0
  234. package/dist/domains/comet-native/native-check-receipt-model.js +347 -0
  235. package/dist/domains/comet-native/native-check-receipt-model.js.map +1 -0
  236. package/dist/domains/comet-native/native-check-receipt-storage.d.ts +10 -0
  237. package/dist/domains/comet-native/native-check-receipt-storage.d.ts.map +1 -0
  238. package/dist/domains/comet-native/native-check-receipt-storage.js +196 -0
  239. package/dist/domains/comet-native/native-check-receipt-storage.js.map +1 -0
  240. package/dist/domains/comet-native/native-check-receipt.d.ts +19 -0
  241. package/dist/domains/comet-native/native-check-receipt.d.ts.map +1 -0
  242. package/dist/domains/comet-native/native-check-receipt.js +446 -0
  243. package/dist/domains/comet-native/native-check-receipt.js.map +1 -0
  244. package/dist/domains/comet-native/native-check.d.ts +18 -0
  245. package/dist/domains/comet-native/native-check.d.ts.map +1 -0
  246. package/dist/domains/comet-native/native-check.js +29 -0
  247. package/dist/domains/comet-native/native-check.js.map +1 -0
  248. package/dist/domains/comet-native/native-checkpoint-journal.d.ts +13 -0
  249. package/dist/domains/comet-native/native-checkpoint-journal.d.ts.map +1 -0
  250. package/dist/domains/comet-native/native-checkpoint-journal.js +53 -0
  251. package/dist/domains/comet-native/native-checkpoint-journal.js.map +1 -0
  252. package/dist/domains/comet-native/native-checkpoint-storage.d.ts +43 -0
  253. package/dist/domains/comet-native/native-checkpoint-storage.d.ts.map +1 -0
  254. package/dist/domains/comet-native/native-checkpoint-storage.js +487 -0
  255. package/dist/domains/comet-native/native-checkpoint-storage.js.map +1 -0
  256. package/dist/domains/comet-native/native-cli-entry.d.ts +2 -0
  257. package/dist/domains/comet-native/native-cli-entry.d.ts.map +1 -0
  258. package/dist/domains/comet-native/native-cli-entry.js +18 -0
  259. package/dist/domains/comet-native/native-cli-entry.js.map +1 -0
  260. package/dist/domains/comet-native/native-cli.d.ts +7 -0
  261. package/dist/domains/comet-native/native-cli.d.ts.map +1 -0
  262. package/dist/domains/comet-native/native-cli.js +642 -0
  263. package/dist/domains/comet-native/native-cli.js.map +1 -0
  264. package/dist/domains/comet-native/native-config.d.ts +15 -0
  265. package/dist/domains/comet-native/native-config.d.ts.map +1 -0
  266. package/dist/domains/comet-native/native-config.js +281 -0
  267. package/dist/domains/comet-native/native-config.js.map +1 -0
  268. package/dist/domains/comet-native/native-conflict-inspection.d.ts +17 -0
  269. package/dist/domains/comet-native/native-conflict-inspection.d.ts.map +1 -0
  270. package/dist/domains/comet-native/native-conflict-inspection.js +90 -0
  271. package/dist/domains/comet-native/native-conflict-inspection.js.map +1 -0
  272. package/dist/domains/comet-native/native-conflict-radar.d.ts +75 -0
  273. package/dist/domains/comet-native/native-conflict-radar.d.ts.map +1 -0
  274. package/dist/domains/comet-native/native-conflict-radar.js +326 -0
  275. package/dist/domains/comet-native/native-conflict-radar.js.map +1 -0
  276. package/dist/domains/comet-native/native-continuation.d.ts +9 -0
  277. package/dist/domains/comet-native/native-continuation.d.ts.map +1 -0
  278. package/dist/domains/comet-native/native-continuation.js +146 -0
  279. package/dist/domains/comet-native/native-continuation.js.map +1 -0
  280. package/dist/domains/comet-native/native-contract-files.d.ts +24 -0
  281. package/dist/domains/comet-native/native-contract-files.d.ts.map +1 -0
  282. package/dist/domains/comet-native/native-contract-files.js +66 -0
  283. package/dist/domains/comet-native/native-contract-files.js.map +1 -0
  284. package/dist/domains/comet-native/native-contract.d.ts +41 -0
  285. package/dist/domains/comet-native/native-contract.d.ts.map +1 -0
  286. package/dist/domains/comet-native/native-contract.js +141 -0
  287. package/dist/domains/comet-native/native-contract.js.map +1 -0
  288. package/dist/domains/comet-native/native-diagnostics.d.ts +18 -0
  289. package/dist/domains/comet-native/native-diagnostics.d.ts.map +1 -0
  290. package/dist/domains/comet-native/native-diagnostics.js +522 -0
  291. package/dist/domains/comet-native/native-diagnostics.js.map +1 -0
  292. package/dist/domains/comet-native/native-doctor.d.ts +12 -0
  293. package/dist/domains/comet-native/native-doctor.d.ts.map +1 -0
  294. package/dist/domains/comet-native/native-doctor.js +768 -0
  295. package/dist/domains/comet-native/native-doctor.js.map +1 -0
  296. package/dist/domains/comet-native/native-evidence-retention.d.ts +37 -0
  297. package/dist/domains/comet-native/native-evidence-retention.d.ts.map +1 -0
  298. package/dist/domains/comet-native/native-evidence-retention.js +885 -0
  299. package/dist/domains/comet-native/native-evidence-retention.js.map +1 -0
  300. package/dist/domains/comet-native/native-evidence-storage.d.ts +41 -0
  301. package/dist/domains/comet-native/native-evidence-storage.d.ts.map +1 -0
  302. package/dist/domains/comet-native/native-evidence-storage.js +351 -0
  303. package/dist/domains/comet-native/native-evidence-storage.js.map +1 -0
  304. package/dist/domains/comet-native/native-findings.d.ts +8 -0
  305. package/dist/domains/comet-native/native-findings.d.ts.map +1 -0
  306. package/dist/domains/comet-native/native-findings.js +238 -0
  307. package/dist/domains/comet-native/native-findings.js.map +1 -0
  308. package/dist/domains/comet-native/native-guards.d.ts +7 -0
  309. package/dist/domains/comet-native/native-guards.d.ts.map +1 -0
  310. package/dist/domains/comet-native/native-guards.js +126 -0
  311. package/dist/domains/comet-native/native-guards.js.map +1 -0
  312. package/dist/domains/comet-native/native-hash.d.ts +3 -0
  313. package/dist/domains/comet-native/native-hash.d.ts.map +1 -0
  314. package/dist/domains/comet-native/native-hash.js +12 -0
  315. package/dist/domains/comet-native/native-hash.js.map +1 -0
  316. package/dist/domains/comet-native/native-hook-guard.d.ts +17 -0
  317. package/dist/domains/comet-native/native-hook-guard.d.ts.map +1 -0
  318. package/dist/domains/comet-native/native-hook-guard.js +154 -0
  319. package/dist/domains/comet-native/native-hook-guard.js.map +1 -0
  320. package/dist/domains/comet-native/native-lock.d.ts +47 -0
  321. package/dist/domains/comet-native/native-lock.d.ts.map +1 -0
  322. package/dist/domains/comet-native/native-lock.js +395 -0
  323. package/dist/domains/comet-native/native-lock.js.map +1 -0
  324. package/dist/domains/comet-native/native-mutation-lock.d.ts +5 -0
  325. package/dist/domains/comet-native/native-mutation-lock.d.ts.map +1 -0
  326. package/dist/domains/comet-native/native-mutation-lock.js +66 -0
  327. package/dist/domains/comet-native/native-mutation-lock.js.map +1 -0
  328. package/dist/domains/comet-native/native-paths.d.ts +10 -0
  329. package/dist/domains/comet-native/native-paths.d.ts.map +1 -0
  330. package/dist/domains/comet-native/native-paths.js +171 -0
  331. package/dist/domains/comet-native/native-paths.js.map +1 -0
  332. package/dist/domains/comet-native/native-progress-checkpoint.d.ts +13 -0
  333. package/dist/domains/comet-native/native-progress-checkpoint.d.ts.map +1 -0
  334. package/dist/domains/comet-native/native-progress-checkpoint.js +104 -0
  335. package/dist/domains/comet-native/native-progress-checkpoint.js.map +1 -0
  336. package/dist/domains/comet-native/native-protected-file.d.ts +113 -0
  337. package/dist/domains/comet-native/native-protected-file.d.ts.map +1 -0
  338. package/dist/domains/comet-native/native-protected-file.js +509 -0
  339. package/dist/domains/comet-native/native-protected-file.js.map +1 -0
  340. package/dist/domains/comet-native/native-redaction.d.ts +2 -0
  341. package/dist/domains/comet-native/native-redaction.d.ts.map +1 -0
  342. package/dist/domains/comet-native/native-redaction.js +18 -0
  343. package/dist/domains/comet-native/native-redaction.js.map +1 -0
  344. package/dist/domains/comet-native/native-repair-integration.d.ts +42 -0
  345. package/dist/domains/comet-native/native-repair-integration.d.ts.map +1 -0
  346. package/dist/domains/comet-native/native-repair-integration.js +184 -0
  347. package/dist/domains/comet-native/native-repair-integration.js.map +1 -0
  348. package/dist/domains/comet-native/native-repair-runtime.d.ts +73 -0
  349. package/dist/domains/comet-native/native-repair-runtime.d.ts.map +1 -0
  350. package/dist/domains/comet-native/native-repair-runtime.js +509 -0
  351. package/dist/domains/comet-native/native-repair-runtime.js.map +1 -0
  352. package/dist/domains/comet-native/native-repair-stagnation.d.ts +85 -0
  353. package/dist/domains/comet-native/native-repair-stagnation.d.ts.map +1 -0
  354. package/dist/domains/comet-native/native-repair-stagnation.js +256 -0
  355. package/dist/domains/comet-native/native-repair-stagnation.js.map +1 -0
  356. package/dist/domains/comet-native/native-resume-view.d.ts +14 -0
  357. package/dist/domains/comet-native/native-resume-view.d.ts.map +1 -0
  358. package/dist/domains/comet-native/native-resume-view.js +105 -0
  359. package/dist/domains/comet-native/native-resume-view.js.map +1 -0
  360. package/dist/domains/comet-native/native-revision.d.ts +20 -0
  361. package/dist/domains/comet-native/native-revision.d.ts.map +1 -0
  362. package/dist/domains/comet-native/native-revision.js +32 -0
  363. package/dist/domains/comet-native/native-revision.js.map +1 -0
  364. package/dist/domains/comet-native/native-root-move.d.ts +20 -0
  365. package/dist/domains/comet-native/native-root-move.d.ts.map +1 -0
  366. package/dist/domains/comet-native/native-root-move.js +812 -0
  367. package/dist/domains/comet-native/native-root-move.js.map +1 -0
  368. package/dist/domains/comet-native/native-run-consistency.d.ts +3 -0
  369. package/dist/domains/comet-native/native-run-consistency.d.ts.map +1 -0
  370. package/dist/domains/comet-native/native-run-consistency.js +136 -0
  371. package/dist/domains/comet-native/native-run-consistency.js.map +1 -0
  372. package/dist/domains/comet-native/native-run-store.d.ts +41 -0
  373. package/dist/domains/comet-native/native-run-store.d.ts.map +1 -0
  374. package/dist/domains/comet-native/native-run-store.js +451 -0
  375. package/dist/domains/comet-native/native-run-store.js.map +1 -0
  376. package/dist/domains/comet-native/native-runtime-package.d.ts +16 -0
  377. package/dist/domains/comet-native/native-runtime-package.d.ts.map +1 -0
  378. package/dist/domains/comet-native/native-runtime-package.js +72 -0
  379. package/dist/domains/comet-native/native-runtime-package.js.map +1 -0
  380. package/dist/domains/comet-native/native-schema-migration.d.ts +11 -0
  381. package/dist/domains/comet-native/native-schema-migration.d.ts.map +1 -0
  382. package/dist/domains/comet-native/native-schema-migration.js +899 -0
  383. package/dist/domains/comet-native/native-schema-migration.js.map +1 -0
  384. package/dist/domains/comet-native/native-selection.d.ts +12 -0
  385. package/dist/domains/comet-native/native-selection.d.ts.map +1 -0
  386. package/dist/domains/comet-native/native-selection.js +52 -0
  387. package/dist/domains/comet-native/native-selection.js.map +1 -0
  388. package/dist/domains/comet-native/native-sensitive-paths.d.ts +7 -0
  389. package/dist/domains/comet-native/native-sensitive-paths.d.ts.map +1 -0
  390. package/dist/domains/comet-native/native-sensitive-paths.js +69 -0
  391. package/dist/domains/comet-native/native-sensitive-paths.js.map +1 -0
  392. package/dist/domains/comet-native/native-snapshot.d.ts +74 -0
  393. package/dist/domains/comet-native/native-snapshot.d.ts.map +1 -0
  394. package/dist/domains/comet-native/native-snapshot.js +2308 -0
  395. package/dist/domains/comet-native/native-snapshot.js.map +1 -0
  396. package/dist/domains/comet-native/native-specs.d.ts +12 -0
  397. package/dist/domains/comet-native/native-specs.d.ts.map +1 -0
  398. package/dist/domains/comet-native/native-specs.js +270 -0
  399. package/dist/domains/comet-native/native-specs.js.map +1 -0
  400. package/dist/domains/comet-native/native-trajectory-limits.d.ts +7 -0
  401. package/dist/domains/comet-native/native-trajectory-limits.d.ts.map +1 -0
  402. package/dist/domains/comet-native/native-trajectory-limits.js +13 -0
  403. package/dist/domains/comet-native/native-trajectory-limits.js.map +1 -0
  404. package/dist/domains/comet-native/native-trajectory-recovery.d.ts +37 -0
  405. package/dist/domains/comet-native/native-trajectory-recovery.d.ts.map +1 -0
  406. package/dist/domains/comet-native/native-trajectory-recovery.js +133 -0
  407. package/dist/domains/comet-native/native-trajectory-recovery.js.map +1 -0
  408. package/dist/domains/comet-native/native-trajectory.d.ts +16 -0
  409. package/dist/domains/comet-native/native-trajectory.d.ts.map +1 -0
  410. package/dist/domains/comet-native/native-trajectory.js +27 -0
  411. package/dist/domains/comet-native/native-trajectory.js.map +1 -0
  412. package/dist/domains/comet-native/native-transaction.d.ts +45 -0
  413. package/dist/domains/comet-native/native-transaction.d.ts.map +1 -0
  414. package/dist/domains/comet-native/native-transaction.js +846 -0
  415. package/dist/domains/comet-native/native-transaction.js.map +1 -0
  416. package/dist/domains/comet-native/native-transition-evidence.d.ts +4 -0
  417. package/dist/domains/comet-native/native-transition-evidence.d.ts.map +1 -0
  418. package/dist/domains/comet-native/native-transition-evidence.js +20 -0
  419. package/dist/domains/comet-native/native-transition-evidence.js.map +1 -0
  420. package/dist/domains/comet-native/native-transition-journal.d.ts +30 -0
  421. package/dist/domains/comet-native/native-transition-journal.d.ts.map +1 -0
  422. package/dist/domains/comet-native/native-transition-journal.js +819 -0
  423. package/dist/domains/comet-native/native-transition-journal.js.map +1 -0
  424. package/dist/domains/comet-native/native-transitions.d.ts +13 -0
  425. package/dist/domains/comet-native/native-transitions.d.ts.map +1 -0
  426. package/dist/domains/comet-native/native-transitions.js +632 -0
  427. package/dist/domains/comet-native/native-transitions.js.map +1 -0
  428. package/dist/domains/comet-native/native-types.d.ts +547 -0
  429. package/dist/domains/comet-native/native-types.d.ts.map +1 -0
  430. package/dist/domains/comet-native/native-types.js +8 -0
  431. package/dist/domains/comet-native/native-types.js.map +1 -0
  432. package/dist/domains/comet-native/native-verification-evidence.d.ts +86 -0
  433. package/dist/domains/comet-native/native-verification-evidence.d.ts.map +1 -0
  434. package/dist/domains/comet-native/native-verification-evidence.js +480 -0
  435. package/dist/domains/comet-native/native-verification-evidence.js.map +1 -0
  436. package/dist/domains/comet-native/native-verification-runtime.d.ts +58 -0
  437. package/dist/domains/comet-native/native-verification-runtime.d.ts.map +1 -0
  438. package/dist/domains/comet-native/native-verification-runtime.js +321 -0
  439. package/dist/domains/comet-native/native-verification-runtime.js.map +1 -0
  440. package/dist/domains/comet-native/native-verification-scope.d.ts +117 -0
  441. package/dist/domains/comet-native/native-verification-scope.d.ts.map +1 -0
  442. package/dist/domains/comet-native/native-verification-scope.js +1040 -0
  443. package/dist/domains/comet-native/native-verification-scope.js.map +1 -0
  444. package/dist/domains/comet-native/native-workspace.d.ts +46 -0
  445. package/dist/domains/comet-native/native-workspace.d.ts.map +1 -0
  446. package/dist/domains/comet-native/native-workspace.js +276 -0
  447. package/dist/domains/comet-native/native-workspace.js.map +1 -0
  448. package/dist/domains/dashboard/collector.d.ts.map +1 -1
  449. package/dist/domains/dashboard/collector.js +9 -1
  450. package/dist/domains/dashboard/collector.js.map +1 -1
  451. package/dist/domains/dashboard/native-adapter.d.ts +157 -0
  452. package/dist/domains/dashboard/native-adapter.d.ts.map +1 -0
  453. package/dist/domains/dashboard/native-adapter.js +302 -0
  454. package/dist/domains/dashboard/native-adapter.js.map +1 -0
  455. package/dist/domains/dashboard/native-collector.d.ts +6 -0
  456. package/dist/domains/dashboard/native-collector.d.ts.map +1 -0
  457. package/dist/domains/dashboard/native-collector.js +285 -0
  458. package/dist/domains/dashboard/native-collector.js.map +1 -0
  459. package/dist/domains/dashboard/types.d.ts +5 -0
  460. package/dist/domains/dashboard/types.d.ts.map +1 -1
  461. package/dist/domains/dashboard/web/assets/{arc-TGVUG2WN.js → arc-CxdiLJ50.js} +1 -1
  462. package/dist/domains/dashboard/web/assets/{architectureDiagram-3BPJPVTR-ASHmiHoP.js → architectureDiagram-3BPJPVTR-D5YCQu4e.js} +1 -1
  463. package/dist/domains/dashboard/web/assets/{blockDiagram-GPEHLZMM-CwASxBKe.js → blockDiagram-GPEHLZMM-8NfdCOQ8.js} +1 -1
  464. package/dist/domains/dashboard/web/assets/{c4Diagram-AAUBKEIU-BU8z_WNk.js → c4Diagram-AAUBKEIU-B3cFnNT7.js} +1 -1
  465. package/dist/domains/dashboard/web/assets/channel-B6AFly29.js +1 -0
  466. package/dist/domains/dashboard/web/assets/{chunk-2J33WTMH-CBGlUx4_.js → chunk-2J33WTMH-CBNfW-Dr.js} +1 -1
  467. package/dist/domains/dashboard/web/assets/{chunk-4BX2VUAB-CS-iGcFz.js → chunk-4BX2VUAB-vWyemRBr.js} +1 -1
  468. package/dist/domains/dashboard/web/assets/{chunk-55IACEB6-BUtCVJat.js → chunk-55IACEB6-H6haOo2C.js} +1 -1
  469. package/dist/domains/dashboard/web/assets/{chunk-727SXJPM-C94tj_pf.js → chunk-727SXJPM-D02UjGND.js} +1 -1
  470. package/dist/domains/dashboard/web/assets/{chunk-AQP2D5EJ-BFOKcpdG.js → chunk-AQP2D5EJ-wKsbOw_T.js} +1 -1
  471. package/dist/domains/dashboard/web/assets/{chunk-FMBD7UC4-Dmx8B-st.js → chunk-FMBD7UC4-eYFEZimP.js} +1 -1
  472. package/dist/domains/dashboard/web/assets/{chunk-ND2GUHAM-DYV00CNn.js → chunk-ND2GUHAM-fMaIDDI2.js} +1 -1
  473. package/dist/domains/dashboard/web/assets/{chunk-QZHKN3VN-DMJJyQnw.js → chunk-QZHKN3VN-C9rhF6Hm.js} +1 -1
  474. package/dist/domains/dashboard/web/assets/classDiagram-4FO5ZUOK-BcnrxOTt.js +1 -0
  475. package/dist/domains/dashboard/web/assets/classDiagram-v2-Q7XG4LA2-BcnrxOTt.js +1 -0
  476. package/dist/domains/dashboard/web/assets/{cose-bilkent-S5V4N54A-P4nE2rea.js → cose-bilkent-S5V4N54A-CbaShPub.js} +1 -1
  477. package/dist/domains/dashboard/web/assets/{cynefin-VYW2F7L2-C-R1HXDv.js → cynefin-VYW2F7L2-DN4emAQv.js} +1 -1
  478. package/dist/domains/dashboard/web/assets/{dagre-BM42HDAG-BH8d-C9z.js → dagre-BM42HDAG-BpSzbk_V.js} +1 -1
  479. package/dist/domains/dashboard/web/assets/demo-BuVau32v.js +25 -0
  480. package/dist/domains/dashboard/web/assets/{diagram-2AECGRRQ-DpXTgQIH.js → diagram-2AECGRRQ-CfXwGGpQ.js} +1 -1
  481. package/dist/domains/dashboard/web/assets/{diagram-5GNKFQAL-DSiFJzSw.js → diagram-5GNKFQAL-DMp0Zmot.js} +1 -1
  482. package/dist/domains/dashboard/web/assets/{diagram-KO2AKTUF-DULMkben.js → diagram-KO2AKTUF-C7ZvofsM.js} +1 -1
  483. package/dist/domains/dashboard/web/assets/{diagram-LMA3HP47-Pi8m_NO9.js → diagram-LMA3HP47-BjmxFnap.js} +1 -1
  484. package/dist/domains/dashboard/web/assets/{diagram-OG6HWLK6-BSe6bCWm.js → diagram-OG6HWLK6-DFBG1Iqy.js} +1 -1
  485. package/dist/domains/dashboard/web/assets/{erDiagram-TEJ5UH35-zb-FEcbq.js → erDiagram-TEJ5UH35-MpNT7dzt.js} +1 -1
  486. package/dist/domains/dashboard/web/assets/{flowDiagram-I6XJVG4X-Dr-Gk0z2.js → flowDiagram-I6XJVG4X-_1wAR6c1.js} +1 -1
  487. package/dist/domains/dashboard/web/assets/{ganttDiagram-6RSMTGT7-qs6Zb2A6.js → ganttDiagram-6RSMTGT7-DJKjDeWl.js} +1 -1
  488. package/dist/domains/dashboard/web/assets/{gitGraphDiagram-PVQCEYII-BQ314orT.js → gitGraphDiagram-PVQCEYII-BL7yUEn-.js} +1 -1
  489. package/dist/domains/dashboard/web/assets/index-CjE9mHGb.js +24 -0
  490. package/dist/domains/dashboard/web/assets/index-D-AGxvI4.css +1 -0
  491. package/dist/domains/dashboard/web/assets/{infoDiagram-5YYISTIA-O0bQp98A.js → infoDiagram-5YYISTIA-Bt5fqrOd.js} +1 -1
  492. package/dist/domains/dashboard/web/assets/{ishikawaDiagram-YF4QCWOH-BPC7wbKh.js → ishikawaDiagram-YF4QCWOH-COCMcjBM.js} +1 -1
  493. package/dist/domains/dashboard/web/assets/{journeyDiagram-JHISSGLW-ohViOd4b.js → journeyDiagram-JHISSGLW-DGcpcWny.js} +1 -1
  494. package/dist/domains/dashboard/web/assets/{kanban-definition-UN3LZRKU-CHleNdbG.js → kanban-definition-UN3LZRKU-QSBNsWMP.js} +1 -1
  495. package/dist/domains/dashboard/web/assets/{linear-CyqiW--Q.js → linear-9uyeeBZf.js} +1 -1
  496. package/dist/domains/dashboard/web/assets/{mermaid.core-qS9XvtaK.js → mermaid.core-CkNdB471.js} +4 -4
  497. package/dist/domains/dashboard/web/assets/{mindmap-definition-RKZ34NQL-oaGkqO9l.js → mindmap-definition-RKZ34NQL-CiNxI0gP.js} +1 -1
  498. package/dist/domains/dashboard/web/assets/{pieDiagram-4H26LBE5-CPcB-AFh.js → pieDiagram-4H26LBE5-BLJ6QnRO.js} +1 -1
  499. package/dist/domains/dashboard/web/assets/{quadrantDiagram-W4KKPZXB-LFy52Qtj.js → quadrantDiagram-W4KKPZXB-CflW-eFH.js} +1 -1
  500. package/dist/domains/dashboard/web/assets/{requirementDiagram-4Y6WPE33-BdjeaYP_.js → requirementDiagram-4Y6WPE33-B9HLmRWH.js} +1 -1
  501. package/dist/domains/dashboard/web/assets/{sankeyDiagram-5OEKKPKP-DDJ4styL.js → sankeyDiagram-5OEKKPKP-6xnco5k5.js} +1 -1
  502. package/dist/domains/dashboard/web/assets/{sequenceDiagram-3UESZ5HK-BL5bFNoz.js → sequenceDiagram-3UESZ5HK-Dp1rujNZ.js} +1 -1
  503. package/dist/domains/dashboard/web/assets/{stateDiagram-AJRCARHV-BNUfikui.js → stateDiagram-AJRCARHV-C1Xc90ek.js} +1 -1
  504. package/dist/domains/dashboard/web/assets/stateDiagram-v2-BHNVJYJU-p-qmzXyE.js +1 -0
  505. package/dist/domains/dashboard/web/assets/{timeline-definition-PNZ67QCA--ps2uu6L.js → timeline-definition-PNZ67QCA-g9s-m5Z4.js} +1 -1
  506. package/dist/domains/dashboard/web/assets/{vennDiagram-CIIHVFJN-C2q8q26c.js → vennDiagram-CIIHVFJN-rkEyhyCc.js} +1 -1
  507. package/dist/domains/dashboard/web/assets/{wardleyDiagram-YWT4CUSO-BUH9gXqd.js → wardleyDiagram-YWT4CUSO-CJLrWGXc.js} +1 -1
  508. package/dist/domains/dashboard/web/assets/{xychartDiagram-2RQKCTM6-B-DielEy.js → xychartDiagram-2RQKCTM6-BxJvPNqo.js} +1 -1
  509. package/dist/domains/dashboard/web/index.html +2 -2
  510. package/dist/domains/engine/storage-layout.d.ts +14 -0
  511. package/dist/domains/engine/storage-layout.d.ts.map +1 -0
  512. package/dist/domains/engine/storage-layout.js +32 -0
  513. package/dist/domains/engine/storage-layout.js.map +1 -0
  514. package/dist/domains/engine/storage-run.d.ts +9 -0
  515. package/dist/domains/engine/storage-run.d.ts.map +1 -0
  516. package/dist/domains/engine/storage-run.js +116 -0
  517. package/dist/domains/engine/storage-run.js.map +1 -0
  518. package/dist/domains/factory/package.d.ts.map +1 -1
  519. package/dist/domains/factory/package.js +5 -3
  520. package/dist/domains/factory/package.js.map +1 -1
  521. package/dist/domains/integrations/openspec.d.ts.map +1 -1
  522. package/dist/domains/integrations/openspec.js +8 -6
  523. package/dist/domains/integrations/openspec.js.map +1 -1
  524. package/dist/domains/skill/platform-inspect.d.ts +6 -2
  525. package/dist/domains/skill/platform-inspect.d.ts.map +1 -1
  526. package/dist/domains/skill/platform-inspect.js +52 -8
  527. package/dist/domains/skill/platform-inspect.js.map +1 -1
  528. package/dist/domains/skill/platform-install.d.ts +18 -7
  529. package/dist/domains/skill/platform-install.d.ts.map +1 -1
  530. package/dist/domains/skill/platform-install.js +338 -71
  531. package/dist/domains/skill/platform-install.js.map +1 -1
  532. package/dist/domains/skill/project-instructions.d.ts.map +1 -1
  533. package/dist/domains/skill/project-instructions.js +12 -6
  534. package/dist/domains/skill/project-instructions.js.map +1 -1
  535. package/dist/domains/skill/uninstall.d.ts.map +1 -1
  536. package/dist/domains/skill/uninstall.js +15 -3
  537. package/dist/domains/skill/uninstall.js.map +1 -1
  538. package/dist/domains/workflow-contract/builtins.d.ts +6 -0
  539. package/dist/domains/workflow-contract/builtins.d.ts.map +1 -1
  540. package/dist/domains/workflow-contract/builtins.js +137 -0
  541. package/dist/domains/workflow-contract/builtins.js.map +1 -1
  542. package/dist/domains/workflow-contract/index.d.ts +3 -1
  543. package/dist/domains/workflow-contract/index.d.ts.map +1 -1
  544. package/dist/domains/workflow-contract/index.js +2 -1
  545. package/dist/domains/workflow-contract/index.js.map +1 -1
  546. package/dist/domains/workflow-contract/normalize.d.ts.map +1 -1
  547. package/dist/domains/workflow-contract/normalize.js +28 -10
  548. package/dist/domains/workflow-contract/normalize.js.map +1 -1
  549. package/dist/domains/workflow-contract/project-config.d.ts +7 -0
  550. package/dist/domains/workflow-contract/project-config.d.ts.map +1 -0
  551. package/dist/domains/workflow-contract/project-config.js +110 -0
  552. package/dist/domains/workflow-contract/project-config.js.map +1 -0
  553. package/dist/domains/workflow-contract/types.d.ts +4 -2
  554. package/dist/domains/workflow-contract/types.d.ts.map +1 -1
  555. package/dist/domains/workflow-contract/validation.d.ts.map +1 -1
  556. package/dist/domains/workflow-contract/validation.js +14 -5
  557. package/dist/domains/workflow-contract/validation.js.map +1 -1
  558. package/dist/platform/install/detect.d.ts +3 -1
  559. package/dist/platform/install/detect.d.ts.map +1 -1
  560. package/dist/platform/install/detect.js +4 -1
  561. package/dist/platform/install/detect.js.map +1 -1
  562. package/dist/platform/install/project-registry.js +2 -2
  563. package/dist/platform/install/project-registry.js.map +1 -1
  564. package/dist/platform/paths/repository-layout.d.ts +16 -0
  565. package/dist/platform/paths/repository-layout.d.ts.map +1 -1
  566. package/dist/platform/paths/repository-layout.js.map +1 -1
  567. package/eval/local/README.md +50 -0
  568. package/eval/local/scripts/compare_baselines.py +127 -1
  569. package/eval/local/scripts/regression_check.py +3 -4
  570. package/eval/local/tasks/comet-native-clarification/environment/Dockerfile +27 -0
  571. package/eval/local/tasks/comet-native-clarification/environment/test_wordcount.py +25 -0
  572. package/eval/local/tasks/comet-native-clarification/environment/wordcount.py +36 -0
  573. package/eval/local/tasks/comet-native-clarification/instruction.md +7 -0
  574. package/eval/local/tasks/comet-native-clarification/task.toml +40 -0
  575. package/eval/local/tasks/comet-native-clarification/validation/test_native_clarification.py +193 -0
  576. package/eval/local/tasks/comet-native-clarification-modes/environment/Dockerfile +27 -0
  577. package/eval/local/tasks/comet-native-clarification-modes/environment/test_wordcount.py +25 -0
  578. package/eval/local/tasks/comet-native-clarification-modes/environment/wordcount.py +36 -0
  579. package/eval/local/tasks/comet-native-clarification-modes/instruction.md +13 -0
  580. package/eval/local/tasks/comet-native-clarification-modes/task.toml +39 -0
  581. package/eval/local/tasks/comet-native-clarification-modes/validation/test_native_clarification_modes.py +235 -0
  582. package/eval/local/tasks/comet-native-interrupted-transition/environment/.comet/config.yaml +6 -0
  583. package/eval/local/tasks/comet-native-interrupted-transition/environment/Dockerfile +28 -0
  584. package/eval/local/tasks/comet-native-interrupted-transition/environment/docs/comet/changes/add-character-counting/brief.md +17 -0
  585. package/eval/local/tasks/comet-native-interrupted-transition/environment/docs/comet/changes/add-character-counting/comet-state.yaml +12 -0
  586. package/eval/local/tasks/comet-native-interrupted-transition/environment/docs/comet/changes/add-character-counting/runtime/transition.json +69 -0
  587. package/eval/local/tasks/comet-native-interrupted-transition/environment/docs/comet/changes/add-character-counting/specs/character-counting/spec.md +3 -0
  588. package/eval/local/tasks/comet-native-interrupted-transition/environment/test_wordcount.py +20 -0
  589. package/eval/local/tasks/comet-native-interrupted-transition/environment/wordcount.py +27 -0
  590. package/eval/local/tasks/comet-native-interrupted-transition/instruction.md +7 -0
  591. package/eval/local/tasks/comet-native-interrupted-transition/task.toml +35 -0
  592. package/eval/local/tasks/comet-native-interrupted-transition/validation/test_native_interrupted_transition.py +63 -0
  593. package/eval/local/tasks/comet-native-repository-fact/environment/Dockerfile +26 -0
  594. package/eval/local/tasks/comet-native-repository-fact/environment/PRODUCT_RULES.md +3 -0
  595. package/eval/local/tasks/comet-native-repository-fact/environment/test_wordcount.py +20 -0
  596. package/eval/local/tasks/comet-native-repository-fact/environment/wordcount.py +27 -0
  597. package/eval/local/tasks/comet-native-repository-fact/instruction.md +7 -0
  598. package/eval/local/tasks/comet-native-repository-fact/task.toml +35 -0
  599. package/eval/local/tasks/comet-native-repository-fact/validation/test_native_repository_fact.py +53 -0
  600. package/eval/local/tasks/comet-native-wave-b-decision-resume/environment/Dockerfile +27 -0
  601. package/eval/local/tasks/comet-native-wave-b-decision-resume/environment/test_wordcount.py +27 -0
  602. package/eval/local/tasks/comet-native-wave-b-decision-resume/environment/wordcount.py +36 -0
  603. package/eval/local/tasks/comet-native-wave-b-decision-resume/instruction.md +9 -0
  604. package/eval/local/tasks/comet-native-wave-b-decision-resume/task.toml +40 -0
  605. package/eval/local/tasks/comet-native-wave-b-decision-resume/validation/test_native_wave_b_decision_resume.py +208 -0
  606. package/eval/local/tasks/comet-native-wave-c-verification-integrity/environment/Dockerfile +27 -0
  607. package/eval/local/tasks/comet-native-wave-c-verification-integrity/environment/test_wordcount.py +27 -0
  608. package/eval/local/tasks/comet-native-wave-c-verification-integrity/environment/wordcount.py +36 -0
  609. package/eval/local/tasks/comet-native-wave-c-verification-integrity/instruction.md +11 -0
  610. package/eval/local/tasks/comet-native-wave-c-verification-integrity/task.toml +36 -0
  611. package/eval/local/tasks/comet-native-wave-c-verification-integrity/validation/test_native_wave_c_verification_integrity.py +344 -0
  612. package/eval/local/tasks/comet-native-wave-d-stagnation-stop/environment/Dockerfile +27 -0
  613. package/eval/local/tasks/comet-native-wave-d-stagnation-stop/environment/test_wordcount.py +27 -0
  614. package/eval/local/tasks/comet-native-wave-d-stagnation-stop/environment/wordcount.py +36 -0
  615. package/eval/local/tasks/comet-native-wave-d-stagnation-stop/instruction.md +11 -0
  616. package/eval/local/tasks/comet-native-wave-d-stagnation-stop/task.toml +37 -0
  617. package/eval/local/tasks/comet-native-wave-d-stagnation-stop/validation/test_native_wave_d_stagnation_stop.py +284 -0
  618. package/eval/local/tasks/comet-native-wave-e-parallel-safety/environment/.include-trusted-native-runtime +1 -0
  619. package/eval/local/tasks/comet-native-wave-e-parallel-safety/environment/Dockerfile +27 -0
  620. package/eval/local/tasks/comet-native-wave-e-parallel-safety/environment/test_wordcount.py +27 -0
  621. package/eval/local/tasks/comet-native-wave-e-parallel-safety/environment/wordcount.py +36 -0
  622. package/eval/local/tasks/comet-native-wave-e-parallel-safety/instruction.md +9 -0
  623. package/eval/local/tasks/comet-native-wave-e-parallel-safety/task.toml +37 -0
  624. package/eval/local/tasks/comet-native-wave-e-parallel-safety/validation/test_native_wave_e_parallel_safety.py +309 -0
  625. package/eval/local/tasks/comet-native-wave-f-dashboard-readonly/environment/.include-current-comet-cli +1 -0
  626. package/eval/local/tasks/comet-native-wave-f-dashboard-readonly/environment/Dockerfile +31 -0
  627. package/eval/local/tasks/comet-native-wave-f-dashboard-readonly/environment/current-comet-package.json +18 -0
  628. package/eval/local/tasks/comet-native-wave-f-dashboard-readonly/environment/current-comet.sh +14 -0
  629. package/eval/local/tasks/comet-native-wave-f-dashboard-readonly/environment/test_wordcount.py +27 -0
  630. package/eval/local/tasks/comet-native-wave-f-dashboard-readonly/environment/wordcount.py +36 -0
  631. package/eval/local/tasks/comet-native-wave-f-dashboard-readonly/instruction.md +7 -0
  632. package/eval/local/tasks/comet-native-wave-f-dashboard-readonly/task.toml +36 -0
  633. package/eval/local/tasks/comet-native-wave-f-dashboard-readonly/validation/test_native_wave_f_dashboard_readonly.py +469 -0
  634. package/eval/local/tasks/comet-native-workflow/environment/Dockerfile +27 -0
  635. package/eval/local/tasks/comet-native-workflow/environment/test_wordcount.py +25 -0
  636. package/eval/local/tasks/comet-native-workflow/environment/wordcount.py +36 -0
  637. package/eval/local/tasks/comet-native-workflow/instruction.md +14 -0
  638. package/eval/local/tasks/comet-native-workflow/task.toml +36 -0
  639. package/eval/local/tasks/comet-native-workflow/validation/test_native_workflow.py +149 -0
  640. package/eval/local/tasks/index.yaml +61 -0
  641. package/eval/local/tests/conftest.py +407 -22
  642. package/eval/local/tests/scaffold/test_aligned_comparison.py +1012 -0
  643. package/eval/local/tests/scaffold/test_conftest_helpers.py +187 -7
  644. package/eval/local/tests/scaffold/test_logging.py +135 -1
  645. package/eval/local/tests/scaffold/test_manifests.py +2 -0
  646. package/eval/local/tests/scaffold/test_native_aligned_eval.py +346 -0
  647. package/eval/local/tests/scaffold/test_native_wave_evaluations.py +1889 -0
  648. package/eval/local/tests/scaffold/test_profiles.py +33 -0
  649. package/eval/local/tests/scaffold/test_sample_quality.py +57 -0
  650. package/eval/local/tests/scaffold/test_tasks.py +377 -1
  651. package/eval/local/tests/scaffold/test_treatments.py +59 -13
  652. package/eval/local/tests/scaffold/test_utils.py +277 -4
  653. package/eval/local/tests/tasks/__init__.py +1 -0
  654. package/eval/local/tests/tasks/test_tasks.py +104 -78
  655. package/eval/local/tests/tasks/test_validation_scripts.py +37 -0
  656. package/eval/local/treatments/comet/comet_native_phase1.yaml +66 -0
  657. package/eval/scaffold/python/aligned_comparison.py +1631 -0
  658. package/eval/scaffold/python/generic_llm_judge.py +3 -1
  659. package/eval/scaffold/python/llm_judge.py +0 -3
  660. package/eval/scaffold/python/logging.py +115 -16
  661. package/eval/scaffold/python/manifests.py +2 -0
  662. package/eval/scaffold/python/native_eval.py +138 -0
  663. package/eval/scaffold/python/pass_at_k.py +0 -1
  664. package/eval/scaffold/python/report_outputs.py +226 -44
  665. package/eval/scaffold/python/sample_quality.py +45 -2
  666. package/eval/scaffold/python/tasks.py +11 -0
  667. package/eval/scaffold/python/utils.py +108 -20
  668. package/eval/scaffold/python/validation/__init__.py +15 -5
  669. package/eval/scaffold/python/validation/comet_workflow.py +10 -5
  670. package/eval/scaffold/python/validation/generic_rubric.py +1 -2
  671. package/eval/scaffold/python/validation/native_wave.py +2154 -0
  672. package/eval/scaffold/python/validation/native_workflow.py +252 -0
  673. package/eval/scaffold/python/validation/rubric.py +0 -2
  674. package/eval/scaffold/shell/completion-point.sh +18 -0
  675. package/eval/scaffold/shell/decision-point.sh +35 -0
  676. package/eval/scaffold/shell/docker.sh +150 -9
  677. package/eval/scaffold/shell/run-claude-loop.sh +57 -27
  678. package/package.json +19 -5
  679. package/dist/domains/dashboard/web/assets/channel-kp6Ng2JJ.js +0 -1
  680. package/dist/domains/dashboard/web/assets/classDiagram-4FO5ZUOK-yBDjgMY_.js +0 -1
  681. package/dist/domains/dashboard/web/assets/classDiagram-v2-Q7XG4LA2-yBDjgMY_.js +0 -1
  682. package/dist/domains/dashboard/web/assets/demo-DQyfozbi.js +0 -1
  683. package/dist/domains/dashboard/web/assets/index-BLAfkNTu.css +0 -1
  684. package/dist/domains/dashboard/web/assets/index-DtLUOcAW.js +0 -24
  685. package/dist/domains/dashboard/web/assets/stateDiagram-v2-BHNVJYJU-DGrsmWts.js +0 -1
  686. package/eval/.env.example +0 -52
  687. package/eval/langsmith/.env.example +0 -16
@@ -0,0 +1,1040 @@
1
+ import { createHash } from 'node:crypto';
2
+ import path from 'path';
3
+ import { canonicalHash, canonicalJson } from './native-canonical-hash.js';
4
+ import { parseNativeContentSnapshotManifest } from './native-snapshot.js';
5
+ export const NATIVE_IMPLEMENTATION_SCOPE_SCHEMA = 'comet.native.implementation-scope.v2';
6
+ export const NATIVE_SNAPSHOT_PROJECTION_SCHEMA = 'comet.native.content-snapshot-projection.v1';
7
+ const SNAPSHOT_PROJECTION_HASH_TAG = 'comet.native.content-snapshot-projection.v1';
8
+ const IMPLEMENTATION_SCOPE_HASH_TAG = 'comet.native.implementation-scope.v2';
9
+ const UNRESOLVED_SCOPE_ID_TAG = 'comet.native.unresolved-scope-id.v1';
10
+ const SCOPE_DETAIL_OVERFLOW_HASH_TAG = 'comet.native.scope-detail-overflow.v1';
11
+ const SNAPSHOT_PROJECTION_OVERFLOW_HASH_TAG = 'comet.native.snapshot-projection-overflow.v2';
12
+ const SHA256_HASH_PATTERN = /^[a-f0-9]{64}$/u;
13
+ export const MAX_NATIVE_IMPLEMENTATION_EVIDENCE_DOCUMENT_BYTES = 1024 * 1024;
14
+ export const MAX_NATIVE_DETAILED_SCOPE_CHANGES = 128;
15
+ export const MAX_NATIVE_DETAILED_UNRESOLVED_SCOPES = 128;
16
+ function compareText(left, right) {
17
+ if (left < right)
18
+ return -1;
19
+ if (left > right)
20
+ return 1;
21
+ return 0;
22
+ }
23
+ export function nativeSnapshotProjectionRef(hash) {
24
+ if (!SHA256_HASH_PATTERN.test(hash)) {
25
+ throw new Error('Native snapshot projection hash must be a SHA-256 hash');
26
+ }
27
+ return `runtime/evidence/snapshots/${hash}.json`;
28
+ }
29
+ function compareNullableText(left, right) {
30
+ if (left === right)
31
+ return 0;
32
+ if (left === null)
33
+ return -1;
34
+ if (right === null)
35
+ return 1;
36
+ return compareText(left, right);
37
+ }
38
+ function projectRelativePath(value, label) {
39
+ if (typeof value !== 'string' ||
40
+ value.length === 0 ||
41
+ value.includes('\\') ||
42
+ value.includes('\0') ||
43
+ value.endsWith('/') ||
44
+ /^[a-zA-Z]:/u.test(value)) {
45
+ throw new Error(`${label} must be a normalized project-relative path`);
46
+ }
47
+ const normalized = path.posix.normalize(value);
48
+ if (normalized !== value ||
49
+ normalized === '.' ||
50
+ normalized === '..' ||
51
+ normalized.startsWith('../') ||
52
+ path.posix.isAbsolute(normalized)) {
53
+ throw new Error(`${label} must stay inside the project root`);
54
+ }
55
+ return value;
56
+ }
57
+ function snapshotOmissionPath(value, label) {
58
+ return value === '.' ? value : projectRelativePath(value, label);
59
+ }
60
+ function nonNegativeSafeInteger(value, label) {
61
+ if (!Number.isSafeInteger(value) || value < 0) {
62
+ throw new Error(`${label} must be a non-negative safe integer`);
63
+ }
64
+ return value;
65
+ }
66
+ function normalizeEntry(entry, label) {
67
+ if (entry.type !== 'file')
68
+ throw new Error(`${label} must describe a file`);
69
+ if (typeof entry.hash !== 'string' || entry.hash.length === 0) {
70
+ throw new Error(`${label} hash must be non-empty`);
71
+ }
72
+ return {
73
+ path: projectRelativePath(entry.path, `${label} path`),
74
+ hash: entry.hash,
75
+ size: nonNegativeSafeInteger(entry.size, `${label} size`),
76
+ type: 'file',
77
+ };
78
+ }
79
+ function normalizeOmission(omission, label) {
80
+ return {
81
+ path: snapshotOmissionPath(omission.path, `${label} path`),
82
+ size: omission.size === null ? null : nonNegativeSafeInteger(omission.size, `${label} size`),
83
+ type: omission.type,
84
+ reason: omission.reason,
85
+ };
86
+ }
87
+ function compareEntries(left, right) {
88
+ return (compareText(left.path, right.path) ||
89
+ compareText(left.hash, right.hash) ||
90
+ left.size - right.size);
91
+ }
92
+ function compareOmissions(left, right) {
93
+ return (compareText(left.path, right.path) ||
94
+ compareText(left.reason, right.reason) ||
95
+ compareText(left.type, right.type) ||
96
+ (left.size ?? -1) - (right.size ?? -1));
97
+ }
98
+ function serializedEvidenceBytes(value) {
99
+ return Buffer.byteLength(JSON.stringify(value, null, 2) + '\n', 'utf8');
100
+ }
101
+ function updateFramedHash(hash, kind, value) {
102
+ const encoded = `${kind}\n${canonicalJson(value)}`;
103
+ hash.update(`${Buffer.byteLength(encoded, 'utf8')}:`);
104
+ hash.update(encoded);
105
+ }
106
+ /**
107
+ * Snapshot manifests have their own byte limit, but their timestamp-free evidence projection has
108
+ * slightly different metadata. Compact it before returning the bundle so persistence can never be
109
+ * the first place that discovers a one-megabyte projection overflow.
110
+ */
111
+ function fitSnapshotProjectionBudget(value) {
112
+ if (serializedEvidenceBytes(value) <= MAX_NATIVE_IMPLEMENTATION_EVIDENCE_DOCUMENT_BYTES) {
113
+ return value;
114
+ }
115
+ const entries = [...value.entries];
116
+ const omitted = [...value.omitted];
117
+ let omittedCount = value.omittedCount;
118
+ let overflowCount = value.omissionOverflow?.count ?? 0;
119
+ const overflowHash = createHash('sha256');
120
+ overflowHash.update(`${SNAPSHOT_PROJECTION_OVERFLOW_HASH_TAG}\n`);
121
+ if (value.omissionOverflow) {
122
+ updateFramedHash(overflowHash, 'existing-overflow', value.omissionOverflow);
123
+ }
124
+ const foldOmission = (omission, alreadyCounted) => {
125
+ if (!alreadyCounted)
126
+ omittedCount += 1;
127
+ overflowCount += 1;
128
+ updateFramedHash(overflowHash, 'omission', omission);
129
+ };
130
+ const foldEntry = (entry) => {
131
+ omittedCount += 1;
132
+ overflowCount += 1;
133
+ // The projection overflow is part of snapshot freshness. Bind the full entry, including its
134
+ // content hash, rather than reducing it to omission-style path/size metadata.
135
+ updateFramedHash(overflowHash, 'entry', entry);
136
+ };
137
+ const takeCompactableOmission = () => {
138
+ for (let index = omitted.length - 1; index >= 0; index -= 1) {
139
+ const omission = omitted[index];
140
+ if (omission.reason === 'git-enumeration-limit' ||
141
+ omission.reason === 'git-selection-changed' ||
142
+ omission.reason === 'physical-enumeration-limit' ||
143
+ omission.reason === 'physical-selection-changed') {
144
+ continue;
145
+ }
146
+ omitted.splice(index, 1);
147
+ return omission;
148
+ }
149
+ return null;
150
+ };
151
+ const candidate = () => ({
152
+ ...value,
153
+ complete: omittedCount === 0,
154
+ entries,
155
+ omitted,
156
+ omittedCount,
157
+ omissionOverflow: {
158
+ ref: `native-snapshot://omitted-overflow/${'0'.repeat(64)}`,
159
+ hash: '0'.repeat(64),
160
+ count: overflowCount,
161
+ },
162
+ });
163
+ let projection = candidate();
164
+ while (serializedEvidenceBytes(projection) > MAX_NATIVE_IMPLEMENTATION_EVIDENCE_DOCUMENT_BYTES) {
165
+ const compactableOmissionCount = omitted.filter((omission) => omission.reason !== 'git-enumeration-limit' &&
166
+ omission.reason !== 'git-selection-changed' &&
167
+ omission.reason !== 'physical-enumeration-limit' &&
168
+ omission.reason !== 'physical-selection-changed').length;
169
+ if (compactableOmissionCount > 0) {
170
+ const removeCount = Math.max(1, Math.ceil(omitted.length / 4));
171
+ for (let removed = 0; removed < removeCount; removed += 1) {
172
+ const omission = takeCompactableOmission();
173
+ if (omission === null)
174
+ break;
175
+ foldOmission(omission, true);
176
+ }
177
+ }
178
+ else if (entries.length > 0) {
179
+ const removeCount = Math.max(1, Math.ceil(entries.length / 4));
180
+ for (const entry of entries.splice(-removeCount)) {
181
+ foldEntry(entry);
182
+ }
183
+ }
184
+ else {
185
+ throw new Error('Native snapshot projection metadata exceeds its evidence byte budget');
186
+ }
187
+ projection = candidate();
188
+ }
189
+ const digest = overflowHash.digest('hex');
190
+ return {
191
+ ...projection,
192
+ omissionOverflow: {
193
+ ref: `native-snapshot://omitted-overflow/${digest}`,
194
+ hash: digest,
195
+ count: overflowCount,
196
+ },
197
+ };
198
+ }
199
+ function snapshotProjection(manifest) {
200
+ const parsed = parseNativeContentSnapshotManifest(manifest);
201
+ const entries = parsed.entries.map((entry, index) => normalizeEntry(entry, `Snapshot entry ${index}`));
202
+ entries.sort(compareEntries);
203
+ if (new Set(entries.map((entry) => entry.path)).size !== entries.length) {
204
+ throw new Error('Snapshot entries must not contain duplicate paths');
205
+ }
206
+ const omitted = parsed.omitted.map((omission, index) => normalizeOmission(omission, `Snapshot omission ${index}`));
207
+ omitted.sort(compareOmissions);
208
+ return fitSnapshotProjectionBudget({
209
+ schema: NATIVE_SNAPSHOT_PROJECTION_SCHEMA,
210
+ origin: parsed.origin,
211
+ ...(parsed.capture ? { capture: parsed.capture } : {}),
212
+ complete: parsed.complete,
213
+ limits: {
214
+ maxFiles: parsed.limits.maxFiles,
215
+ maxFileBytes: parsed.limits.maxFileBytes,
216
+ maxTotalBytes: parsed.limits.maxTotalBytes,
217
+ maxManifestBytes: parsed.limits.maxManifestBytes,
218
+ },
219
+ entries,
220
+ omitted,
221
+ omittedCount: parsed.omittedCount,
222
+ ...(parsed.omissionOverflow
223
+ ? {
224
+ omissionOverflow: {
225
+ ref: parsed.omissionOverflow.ref,
226
+ hash: parsed.omissionOverflow.hash,
227
+ count: parsed.omissionOverflow.count,
228
+ },
229
+ }
230
+ : {}),
231
+ });
232
+ }
233
+ function normalizeDeclaredArtifacts(artifacts) {
234
+ const byPath = new Map();
235
+ for (const [index, artifact] of artifacts.entries()) {
236
+ if (artifact.kind !== 'file' && artifact.kind !== 'directory') {
237
+ throw new Error(`Declared artifact ${index} kind is invalid`);
238
+ }
239
+ const normalized = {
240
+ path: projectRelativePath(artifact.path, `Declared artifact ${index} path`),
241
+ kind: artifact.kind,
242
+ };
243
+ const existing = byPath.get(normalized.path);
244
+ if (existing && existing.kind !== normalized.kind) {
245
+ throw new Error(`Declared artifact path has conflicting kinds: ${normalized.path}`);
246
+ }
247
+ byPath.set(normalized.path, normalized);
248
+ }
249
+ return [...byPath.values()].sort((left, right) => compareText(left.path, right.path) || compareText(left.kind, right.kind));
250
+ }
251
+ function artifactOwnsPath(artifact, changedPath) {
252
+ if (artifact.kind === 'file')
253
+ return artifact.path === changedPath;
254
+ return changedPath === artifact.path || changedPath.startsWith(`${artifact.path}/`);
255
+ }
256
+ function fileIdentity(entry) {
257
+ return entry ? { hash: entry.hash, size: entry.size } : null;
258
+ }
259
+ function visitDerivedChanges(baseline, current, visitor) {
260
+ let beforeIndex = 0;
261
+ let afterIndex = 0;
262
+ while (beforeIndex < baseline.entries.length || afterIndex < current.entries.length) {
263
+ const beforeCandidate = baseline.entries[beforeIndex];
264
+ const afterCandidate = current.entries[afterIndex];
265
+ const order = beforeCandidate === undefined
266
+ ? 1
267
+ : afterCandidate === undefined
268
+ ? -1
269
+ : compareText(beforeCandidate.path, afterCandidate.path);
270
+ const before = order <= 0 ? beforeCandidate : undefined;
271
+ const after = order >= 0 ? afterCandidate : undefined;
272
+ if (order <= 0)
273
+ beforeIndex += 1;
274
+ if (order >= 0)
275
+ afterIndex += 1;
276
+ if (before && after && before.hash === after.hash && before.size === after.size)
277
+ continue;
278
+ if (before && !after && !current.complete)
279
+ continue;
280
+ const changedPath = before?.path ?? after?.path;
281
+ if (changedPath === undefined)
282
+ continue;
283
+ visitor({
284
+ path: changedPath,
285
+ kind: before ? (after ? 'modified' : 'removed') : 'added',
286
+ before: fileIdentity(before),
287
+ after: fileIdentity(after),
288
+ });
289
+ }
290
+ }
291
+ function materializeChange(core, declaredArtifacts) {
292
+ return {
293
+ ...core,
294
+ attributedTo: declaredArtifacts.filter((artifact) => artifactOwnsPath(artifact, core.path)),
295
+ };
296
+ }
297
+ function unresolvedScope(identity, reason) {
298
+ return {
299
+ id: `scope:${canonicalHash(UNRESOLVED_SCOPE_ID_TAG, identity)}`,
300
+ kind: identity.kind,
301
+ source: identity.source,
302
+ path: identity.path,
303
+ reason,
304
+ };
305
+ }
306
+ function omissionScopes(source, projection) {
307
+ const scopes = projection.omitted.map((omission) => unresolvedScope({
308
+ kind: 'snapshot-omission',
309
+ source,
310
+ path: omission.path,
311
+ evidence: {
312
+ reason: omission.reason,
313
+ size: omission.size,
314
+ type: omission.type,
315
+ },
316
+ }, `${source} snapshot omitted ${omission.path}: ${omission.reason}`));
317
+ if (!projection.complete) {
318
+ scopes.push(unresolvedScope({
319
+ kind: 'snapshot-incomplete',
320
+ source,
321
+ path: null,
322
+ evidence: { omittedCount: projection.omittedCount },
323
+ }, `${source} snapshot is incomplete`));
324
+ }
325
+ if (projection.omissionOverflow) {
326
+ scopes.push(unresolvedScope({
327
+ kind: 'snapshot-omission-overflow',
328
+ source,
329
+ path: null,
330
+ evidence: {
331
+ count: projection.omissionOverflow.count,
332
+ hash: projection.omissionOverflow.hash,
333
+ ref: projection.omissionOverflow.ref,
334
+ },
335
+ }, `${source} snapshot has ${projection.omissionOverflow.count} unlisted omissions`));
336
+ }
337
+ return scopes;
338
+ }
339
+ function omissionSummaryScopes(source, projection) {
340
+ return omissionScopes(source, { ...projection, omitted: [] }).filter((scope) => scope.kind !== 'snapshot-omission');
341
+ }
342
+ function compareUnresolvedScopes(left, right) {
343
+ return (compareText(left.kind, right.kind) ||
344
+ compareText(left.source, right.source) ||
345
+ compareNullableText(left.path, right.path) ||
346
+ compareText(left.id, right.id));
347
+ }
348
+ function uniqueUnresolvedScopes(scopes) {
349
+ const byId = new Map(scopes.map((scope) => [scope.id, scope]));
350
+ return [...byId.values()].sort(compareUnresolvedScopes);
351
+ }
352
+ function normalizeGitChangedPaths(paths) {
353
+ return [
354
+ ...new Set(paths.map((value, index) => projectRelativePath(value, `Git path ${index}`))),
355
+ ].sort(compareText);
356
+ }
357
+ function normalizeScopeAuthority(input) {
358
+ if (typeof input.contractHash !== 'string' || !SHA256_HASH_PATTERN.test(input.contractHash)) {
359
+ throw new Error('Contract hash must be a SHA-256 hash');
360
+ }
361
+ return {
362
+ contractHash: input.contractHash,
363
+ declaredArtifacts: normalizeDeclaredArtifacts(input.declaredArtifacts),
364
+ noCodeReason: input.noCodeReason?.trim() || null,
365
+ ...(input.gitChangedPaths === undefined
366
+ ? {}
367
+ : { gitChangedPaths: normalizeGitChangedPaths(input.gitChangedPaths) }),
368
+ };
369
+ }
370
+ function scanScopeChanges(baseline, current, declaredArtifacts, gitChangedPaths) {
371
+ const candidates = [];
372
+ const gitChangedPathSet = gitChangedPaths === undefined ? null : new Set(gitChangedPaths);
373
+ const gitPathsPresentInChanges = [];
374
+ let candidateBytes = 0;
375
+ let candidateBudgetExhausted = false;
376
+ let totalChanges = 0;
377
+ let totalUnattributed = 0;
378
+ visitDerivedChanges(baseline, current, (core) => {
379
+ const attributed = declaredArtifacts.some((artifact) => artifactOwnsPath(artifact, core.path));
380
+ totalChanges += 1;
381
+ if (!attributed)
382
+ totalUnattributed += 1;
383
+ if (gitChangedPathSet?.has(core.path))
384
+ gitPathsPresentInChanges.push(core.path);
385
+ if (!candidateBudgetExhausted && candidates.length < MAX_NATIVE_DETAILED_SCOPE_CHANGES) {
386
+ const candidate = materializeChange(core, declaredArtifacts);
387
+ const nextBytes = serializedEvidenceBytes(candidate);
388
+ if (candidateBytes + nextBytes <= MAX_NATIVE_IMPLEMENTATION_EVIDENCE_DOCUMENT_BYTES) {
389
+ candidates.push(candidate);
390
+ candidateBytes += nextBytes;
391
+ }
392
+ else {
393
+ candidateBudgetExhausted = true;
394
+ }
395
+ }
396
+ });
397
+ return { candidates, gitPathsPresentInChanges, totalChanges, totalUnattributed };
398
+ }
399
+ function scopeDetailOverflow(hash, counts) {
400
+ return unresolvedScope({
401
+ kind: 'scope-detail-overflow',
402
+ source: 'implementation-scope',
403
+ path: null,
404
+ evidence: {
405
+ changeCount: counts.changes,
406
+ hash,
407
+ unattributedCount: counts.unattributed,
408
+ unresolvedCount: counts.unresolved,
409
+ },
410
+ }, `Implementation scope summarized ${counts.changes} additional change details and ${counts.unresolved} unresolved details (${counts.unattributed} unattributed); overflow hash ${hash}`);
411
+ }
412
+ function parseScopeDetailOverflow(scope) {
413
+ const match = /^Implementation scope summarized ([0-9]+) additional change details and ([0-9]+) unresolved details \(([0-9]+) unattributed\); overflow hash ([a-f0-9]{64})$/u.exec(scope.reason);
414
+ if (!match)
415
+ throw new Error('Implementation scope detail overflow is invalid');
416
+ const counts = {
417
+ changes: nonNegativeSafeInteger(Number(match[1]), 'Scope overflow change count'),
418
+ unresolved: nonNegativeSafeInteger(Number(match[2]), 'Scope overflow unresolved count'),
419
+ unattributed: nonNegativeSafeInteger(Number(match[3]), 'Scope overflow unattributed count'),
420
+ };
421
+ const hash = scopeHashValue(match[4], 'Scope detail overflow hash');
422
+ if (JSON.stringify(scope) !== JSON.stringify(scopeDetailOverflow(hash, counts))) {
423
+ throw new Error('Implementation scope detail overflow is inconsistent');
424
+ }
425
+ return { ...counts, hash };
426
+ }
427
+ function hashScopeDetailOverflow(options) {
428
+ const hash = createHash('sha256');
429
+ hash.update(`${SCOPE_DETAIL_OVERFLOW_HASH_TAG}\n`);
430
+ let changeIndex = 0;
431
+ visitDerivedChanges(options.baseline, options.current, (core) => {
432
+ if (changeIndex >= options.detailedChangeCount) {
433
+ updateFramedHash(hash, 'change', core);
434
+ let attributionCount = 0;
435
+ for (const artifact of options.declaredArtifacts) {
436
+ if (!artifactOwnsPath(artifact, core.path))
437
+ continue;
438
+ attributionCount += 1;
439
+ updateFramedHash(hash, 'change-attribution', artifact);
440
+ }
441
+ updateFramedHash(hash, 'change-end', { attributionCount });
442
+ if (attributionCount === 0) {
443
+ updateFramedHash(hash, 'unattributed-change', {
444
+ after: core.after,
445
+ before: core.before,
446
+ changeKind: core.kind,
447
+ path: core.path,
448
+ });
449
+ }
450
+ }
451
+ changeIndex += 1;
452
+ });
453
+ let omissionIndex = 0;
454
+ for (const [source, projection] of [
455
+ ['baseline', options.baseline],
456
+ ['current', options.current],
457
+ ]) {
458
+ for (const omission of projection.omitted) {
459
+ if (omissionIndex >= options.detailedOmissionCount) {
460
+ updateFramedHash(hash, 'snapshot-omission', { source, ...omission });
461
+ }
462
+ omissionIndex += 1;
463
+ }
464
+ }
465
+ return hash.digest('hex');
466
+ }
467
+ function buildScopeFromProjections(baseline, current, authority) {
468
+ const { contractHash, declaredArtifacts, noCodeReason } = authority;
469
+ const changeScan = scanScopeChanges(baseline, current, declaredArtifacts, authority.gitChangedPaths);
470
+ const baselineProjectionHash = canonicalHash(SNAPSHOT_PROJECTION_HASH_TAG, baseline);
471
+ const currentProjectionHash = canonicalHash(SNAPSHOT_PROJECTION_HASH_TAG, current);
472
+ const omissionCandidates = [];
473
+ for (const [source, projection] of [
474
+ ['baseline', baseline],
475
+ ['current', current],
476
+ ]) {
477
+ for (const omission of projection.omitted) {
478
+ if (omissionCandidates.length >= MAX_NATIVE_DETAILED_UNRESOLVED_SCOPES)
479
+ break;
480
+ omissionCandidates.push(unresolvedScope({
481
+ kind: 'snapshot-omission',
482
+ source,
483
+ path: omission.path,
484
+ evidence: {
485
+ reason: omission.reason,
486
+ size: omission.size,
487
+ type: omission.type,
488
+ },
489
+ }, `${source} snapshot omitted ${omission.path}: ${omission.reason}`));
490
+ }
491
+ }
492
+ const totalOmissionDetails = baseline.omitted.length + current.omitted.length;
493
+ const essentialScopes = [
494
+ ...omissionSummaryScopes('baseline', baseline),
495
+ ...omissionSummaryScopes('current', current),
496
+ ...(changeScan.totalChanges === 0 && noCodeReason === null
497
+ ? [
498
+ unresolvedScope({
499
+ kind: 'missing-no-code-reason',
500
+ source: 'implementation-scope',
501
+ path: null,
502
+ evidence: {
503
+ baselineProjectionHash,
504
+ currentProjectionHash,
505
+ },
506
+ }, 'A non-empty no-code reason is required when the snapshots contain no changes'),
507
+ ]
508
+ : []),
509
+ ];
510
+ const buildGitAdvisory = () => {
511
+ if (authority.gitChangedPaths === undefined)
512
+ return undefined;
513
+ const snapshotChangePaths = new Set(changeScan.gitPathsPresentInChanges);
514
+ return {
515
+ advisoryOnly: true,
516
+ changedPaths: authority.gitChangedPaths,
517
+ pathsPresentInSnapshotChanges: authority.gitChangedPaths.filter((value) => snapshotChangePaths.has(value)),
518
+ pathsAbsentFromSnapshotChanges: authority.gitChangedPaths.filter((value) => !snapshotChangePaths.has(value)),
519
+ };
520
+ };
521
+ const buildScopeContent = (options) => {
522
+ const changes = changeScan.candidates.slice(0, options.detailedChangeCount);
523
+ const unattributed = changes.filter((change) => change.attributedTo.length === 0);
524
+ const overflowChanges = changeScan.totalChanges - changes.length;
525
+ const overflowUnattributed = changeScan.totalUnattributed - unattributed.length;
526
+ const overflowOmissions = totalOmissionDetails - options.detailedOmissionCount;
527
+ const overflowUnresolved = overflowUnattributed + overflowOmissions;
528
+ const unresolved = [
529
+ ...unattributed.map((change) => unresolvedScope({
530
+ kind: 'unattributed-change',
531
+ source: 'implementation-scope',
532
+ path: change.path,
533
+ evidence: {
534
+ after: change.after,
535
+ before: change.before,
536
+ changeKind: change.kind,
537
+ },
538
+ }, `Changed path is not covered by a declared artifact: ${change.path}`)),
539
+ ...omissionCandidates.slice(0, options.detailedOmissionCount),
540
+ ...essentialScopes,
541
+ ...(overflowChanges > 0 || overflowUnresolved > 0
542
+ ? [
543
+ scopeDetailOverflow(options.overflowHash, {
544
+ changes: overflowChanges,
545
+ unattributed: overflowUnattributed,
546
+ unresolved: overflowUnresolved,
547
+ }),
548
+ ]
549
+ : []),
550
+ ];
551
+ const unresolvedScopes = uniqueUnresolvedScopes(unresolved);
552
+ const gitAdvisory = options.includeGitAdvisory ? buildGitAdvisory() : undefined;
553
+ return {
554
+ schema: NATIVE_IMPLEMENTATION_SCOPE_SCHEMA,
555
+ contractHash,
556
+ baselineProjectionRef: nativeSnapshotProjectionRef(baselineProjectionHash),
557
+ baselineProjectionHash,
558
+ currentProjectionRef: nativeSnapshotProjectionRef(currentProjectionHash),
559
+ currentProjectionHash,
560
+ complete: unresolvedScopes.length === 0,
561
+ declaredArtifacts,
562
+ changes,
563
+ unattributed,
564
+ unresolvedScopes,
565
+ noCodeReason,
566
+ ...(gitAdvisory ? { gitAdvisory } : {}),
567
+ };
568
+ };
569
+ let detailedChangeCount = changeScan.candidates.length;
570
+ let detailedOmissionCount = omissionCandidates.length;
571
+ let includeGitAdvisory = authority.gitChangedPaths !== undefined;
572
+ const placeholderHash = '0'.repeat(64);
573
+ while (true) {
574
+ const candidate = buildScopeContent({
575
+ detailedChangeCount,
576
+ detailedOmissionCount,
577
+ includeGitAdvisory,
578
+ overflowHash: placeholderHash,
579
+ });
580
+ if (serializedEvidenceBytes({ ...candidate, scopeHash: placeholderHash }) <=
581
+ MAX_NATIVE_IMPLEMENTATION_EVIDENCE_DOCUMENT_BYTES) {
582
+ break;
583
+ }
584
+ if (includeGitAdvisory) {
585
+ includeGitAdvisory = false;
586
+ continue;
587
+ }
588
+ if (detailedOmissionCount > 0) {
589
+ detailedOmissionCount -= Math.max(1, Math.ceil(detailedOmissionCount / 4));
590
+ continue;
591
+ }
592
+ if (detailedChangeCount > 0) {
593
+ const removable = detailedChangeCount;
594
+ detailedChangeCount -= Math.max(1, Math.ceil(removable / 4));
595
+ continue;
596
+ }
597
+ throw new Error('Native implementation scope metadata exceeds its evidence byte budget');
598
+ }
599
+ const hasOverflow = changeScan.totalChanges > detailedChangeCount || totalOmissionDetails > detailedOmissionCount;
600
+ const overflowHash = hasOverflow
601
+ ? hashScopeDetailOverflow({
602
+ baseline,
603
+ current,
604
+ declaredArtifacts,
605
+ detailedChangeCount,
606
+ detailedOmissionCount,
607
+ })
608
+ : placeholderHash;
609
+ const scopeContent = buildScopeContent({
610
+ detailedChangeCount,
611
+ detailedOmissionCount,
612
+ includeGitAdvisory,
613
+ overflowHash,
614
+ });
615
+ const scope = {
616
+ ...scopeContent,
617
+ scopeHash: canonicalHash(IMPLEMENTATION_SCOPE_HASH_TAG, scopeContent),
618
+ };
619
+ if (serializedEvidenceBytes(scope) > MAX_NATIVE_IMPLEMENTATION_EVIDENCE_DOCUMENT_BYTES) {
620
+ throw new Error('Native implementation scope exceeded its evidence byte budget after fitting');
621
+ }
622
+ return scope;
623
+ }
624
+ /**
625
+ * Build the authority bundle consumed by Native evidence storage.
626
+ * Snapshot timestamps are parsed but deliberately excluded from the normalized projections.
627
+ */
628
+ export function buildNativeImplementationScopeBundle(input) {
629
+ const baseline = snapshotProjection(input.baseline);
630
+ const current = snapshotProjection(input.current);
631
+ const authority = normalizeScopeAuthority(input);
632
+ return {
633
+ authority,
634
+ baseline,
635
+ current,
636
+ scope: buildScopeFromProjections(baseline, current, authority),
637
+ };
638
+ }
639
+ /** Derive the implementation scope while preserving the existing pure-call interface. */
640
+ export function buildNativeImplementationScope(input) {
641
+ return buildNativeImplementationScopeBundle(input).scope;
642
+ }
643
+ const SCOPE_KEYS = new Set([
644
+ 'schema',
645
+ 'contractHash',
646
+ 'baselineProjectionRef',
647
+ 'baselineProjectionHash',
648
+ 'currentProjectionRef',
649
+ 'currentProjectionHash',
650
+ 'complete',
651
+ 'declaredArtifacts',
652
+ 'changes',
653
+ 'unattributed',
654
+ 'unresolvedScopes',
655
+ 'noCodeReason',
656
+ 'gitAdvisory',
657
+ 'scopeHash',
658
+ ]);
659
+ function scopeRecord(value, label) {
660
+ if (!value || typeof value !== 'object' || Array.isArray(value)) {
661
+ throw new Error(`${label} must be an object`);
662
+ }
663
+ return value;
664
+ }
665
+ function exactScopeKeys(value, required, optional, label) {
666
+ const allowed = new Set([...required, ...optional]);
667
+ const unknown = Object.keys(value).filter((key) => !allowed.has(key));
668
+ const missing = required.filter((key) => !(key in value));
669
+ if (unknown.length > 0)
670
+ throw new Error(`${label} has unknown field(s): ${unknown.join(', ')}`);
671
+ if (missing.length > 0)
672
+ throw new Error(`${label} is missing field(s): ${missing.join(', ')}`);
673
+ }
674
+ function scopeHashValue(value, label) {
675
+ if (typeof value !== 'string' || !SHA256_HASH_PATTERN.test(value)) {
676
+ throw new Error(`${label} must be a SHA-256 hash`);
677
+ }
678
+ return value;
679
+ }
680
+ function snapshotProjectionRefValue(value, hash, label) {
681
+ const expected = nativeSnapshotProjectionRef(hash);
682
+ if (value !== expected)
683
+ throw new Error(`${label} ref/hash mismatch`);
684
+ return expected;
685
+ }
686
+ /** Parse the timestamp-free, content-addressed projection persisted beside a scope. */
687
+ export function parseNativeSnapshotProjection(value, expectedHash) {
688
+ const root = scopeRecord(value, 'Native snapshot projection');
689
+ exactScopeKeys(root, ['schema', 'origin', 'complete', 'limits', 'entries', 'omitted', 'omittedCount'], ['capture', 'omissionOverflow'], 'Native snapshot projection');
690
+ if (root.schema !== NATIVE_SNAPSHOT_PROJECTION_SCHEMA) {
691
+ throw new Error('Native snapshot projection schema is invalid');
692
+ }
693
+ const parsedManifest = parseNativeContentSnapshotManifest({
694
+ schema: 'comet.native.content-snapshot.v1',
695
+ origin: root.origin,
696
+ ...(root.capture === undefined ? {} : { capture: root.capture }),
697
+ createdAt: '1970-01-01T00:00:00.000Z',
698
+ complete: root.complete,
699
+ limits: root.limits,
700
+ entries: root.entries,
701
+ omitted: root.omitted,
702
+ omittedCount: root.omittedCount,
703
+ ...(root.omissionOverflow === undefined ? {} : { omissionOverflow: root.omissionOverflow }),
704
+ });
705
+ const projection = snapshotProjection(parsedManifest);
706
+ if (canonicalHash(SNAPSHOT_PROJECTION_HASH_TAG, root) !==
707
+ canonicalHash(SNAPSHOT_PROJECTION_HASH_TAG, projection)) {
708
+ throw new Error('Native snapshot projection is not canonical');
709
+ }
710
+ const projectionHash = canonicalHash(SNAPSHOT_PROJECTION_HASH_TAG, projection);
711
+ if (expectedHash !== undefined &&
712
+ scopeHashValue(expectedHash, 'Snapshot projection hash') !== projectionHash) {
713
+ throw new Error('Native snapshot projection content hash mismatch');
714
+ }
715
+ return projection;
716
+ }
717
+ function parseDeclaredArtifact(value, index) {
718
+ const artifact = scopeRecord(value, `Declared artifact ${index}`);
719
+ exactScopeKeys(artifact, ['path', 'kind'], [], `Declared artifact ${index}`);
720
+ if (artifact.kind !== 'file' && artifact.kind !== 'directory') {
721
+ throw new Error(`Declared artifact ${index} kind is invalid`);
722
+ }
723
+ return {
724
+ path: projectRelativePath(artifact.path, `Declared artifact ${index} path`),
725
+ kind: artifact.kind,
726
+ };
727
+ }
728
+ function parseFileIdentity(value, label) {
729
+ if (value === null)
730
+ return null;
731
+ const identity = scopeRecord(value, label);
732
+ exactScopeKeys(identity, ['hash', 'size'], [], label);
733
+ return {
734
+ hash: scopeHashValue(identity.hash, `${label} hash`),
735
+ size: nonNegativeSafeInteger(identity.size, `${label} size`),
736
+ };
737
+ }
738
+ function parseImplementationChange(value, index) {
739
+ const change = scopeRecord(value, `Implementation change ${index}`);
740
+ exactScopeKeys(change, ['path', 'kind', 'before', 'after', 'attributedTo'], [], `Implementation change ${index}`);
741
+ if (change.kind !== 'added' && change.kind !== 'modified' && change.kind !== 'removed') {
742
+ throw new Error(`Implementation change ${index} kind is invalid`);
743
+ }
744
+ if (!Array.isArray(change.attributedTo)) {
745
+ throw new Error(`Implementation change ${index} attributedTo must be an array`);
746
+ }
747
+ const attributedTo = change.attributedTo.map(parseDeclaredArtifact);
748
+ const normalizedAttribution = normalizeDeclaredArtifacts(attributedTo);
749
+ if (JSON.stringify(attributedTo) !== JSON.stringify(normalizedAttribution)) {
750
+ throw new Error(`Implementation change ${index} attribution must be sorted and unique`);
751
+ }
752
+ const before = parseFileIdentity(change.before, `Implementation change ${index} before`);
753
+ const after = parseFileIdentity(change.after, `Implementation change ${index} after`);
754
+ if ((change.kind === 'added' && (before !== null || after === null)) ||
755
+ (change.kind === 'removed' && (before === null || after !== null)) ||
756
+ (change.kind === 'modified' &&
757
+ (before === null || after === null || JSON.stringify(before) === JSON.stringify(after)))) {
758
+ throw new Error(`Implementation change ${index} before/after state is invalid`);
759
+ }
760
+ return {
761
+ path: projectRelativePath(change.path, `Implementation change ${index} path`),
762
+ kind: change.kind,
763
+ before,
764
+ after,
765
+ attributedTo,
766
+ };
767
+ }
768
+ function parseUnresolvedScope(value, index) {
769
+ const scope = scopeRecord(value, `Unresolved scope ${index}`);
770
+ exactScopeKeys(scope, ['id', 'kind', 'source', 'path', 'reason'], [], `Unresolved scope ${index}`);
771
+ const kinds = new Set([
772
+ 'unattributed-change',
773
+ 'snapshot-omission',
774
+ 'snapshot-incomplete',
775
+ 'snapshot-omission-overflow',
776
+ 'scope-detail-overflow',
777
+ 'missing-no-code-reason',
778
+ ]);
779
+ if (typeof scope.kind !== 'string' || !kinds.has(scope.kind)) {
780
+ throw new Error(`Unresolved scope ${index} kind is invalid`);
781
+ }
782
+ if (scope.source !== 'baseline' &&
783
+ scope.source !== 'current' &&
784
+ scope.source !== 'implementation-scope') {
785
+ throw new Error(`Unresolved scope ${index} source is invalid`);
786
+ }
787
+ if (typeof scope.id !== 'string' || !/^scope:[a-f0-9]{64}$/u.test(scope.id)) {
788
+ throw new Error(`Unresolved scope ${index} id is invalid`);
789
+ }
790
+ if (scope.path !== null && typeof scope.path !== 'string') {
791
+ throw new Error(`Unresolved scope ${index} path is invalid`);
792
+ }
793
+ if (typeof scope.reason !== 'string' ||
794
+ scope.reason.length === 0 ||
795
+ scope.reason.trim() !== scope.reason) {
796
+ throw new Error(`Unresolved scope ${index} reason is invalid`);
797
+ }
798
+ return {
799
+ id: scope.id,
800
+ kind: scope.kind,
801
+ source: scope.source,
802
+ path: scope.path === null
803
+ ? null
804
+ : scope.kind === 'snapshot-omission'
805
+ ? snapshotOmissionPath(scope.path, `Unresolved scope ${index} path`)
806
+ : projectRelativePath(scope.path, `Unresolved scope ${index} path`),
807
+ reason: scope.reason,
808
+ };
809
+ }
810
+ function parseSortedPaths(value, label) {
811
+ if (!Array.isArray(value) || value.some((entry) => typeof entry !== 'string')) {
812
+ throw new Error(`${label} must be an array of paths`);
813
+ }
814
+ const paths = value.map((entry, index) => projectRelativePath(entry, `${label} ${index}`));
815
+ const normalized = [...new Set(paths)].sort(compareText);
816
+ if (JSON.stringify(paths) !== JSON.stringify(normalized)) {
817
+ throw new Error(`${label} must be sorted and unique`);
818
+ }
819
+ return paths;
820
+ }
821
+ /**
822
+ * Parse a persisted scope and re-check its self-contained invariants.
823
+ * Storage additionally calls `rebuildNativeImplementationScopeBundle` so snapshot-derived facts
824
+ * are verified against the two projections instead of trusted from this document.
825
+ */
826
+ export function parseNativeImplementationScope(value) {
827
+ const root = scopeRecord(value, 'Native implementation scope');
828
+ const required = [...SCOPE_KEYS].filter((key) => key !== 'gitAdvisory');
829
+ exactScopeKeys(root, required, ['gitAdvisory'], 'Native implementation scope');
830
+ if (root.schema !== NATIVE_IMPLEMENTATION_SCOPE_SCHEMA) {
831
+ throw new Error('Native implementation scope schema is invalid');
832
+ }
833
+ const contractHash = scopeHashValue(root.contractHash, 'Implementation scope contractHash');
834
+ const baselineProjectionHash = scopeHashValue(root.baselineProjectionHash, 'Implementation scope baselineProjectionHash');
835
+ const baselineProjectionRef = snapshotProjectionRefValue(root.baselineProjectionRef, baselineProjectionHash, 'Implementation scope baseline projection');
836
+ const currentProjectionHash = scopeHashValue(root.currentProjectionHash, 'Implementation scope currentProjectionHash');
837
+ const currentProjectionRef = snapshotProjectionRefValue(root.currentProjectionRef, currentProjectionHash, 'Implementation scope current projection');
838
+ if (typeof root.complete !== 'boolean') {
839
+ throw new Error('Implementation scope complete flag is invalid');
840
+ }
841
+ if (!Array.isArray(root.declaredArtifacts) ||
842
+ !Array.isArray(root.changes) ||
843
+ !Array.isArray(root.unattributed) ||
844
+ !Array.isArray(root.unresolvedScopes)) {
845
+ throw new Error('Implementation scope collections are invalid');
846
+ }
847
+ const declaredArtifacts = root.declaredArtifacts.map(parseDeclaredArtifact);
848
+ if (JSON.stringify(declaredArtifacts) !==
849
+ JSON.stringify(normalizeDeclaredArtifacts(declaredArtifacts))) {
850
+ throw new Error('Implementation scope declared artifacts must be sorted and unique');
851
+ }
852
+ const changes = root.changes.map(parseImplementationChange);
853
+ const sortedChanges = [...changes].sort((left, right) => compareText(left.path, right.path));
854
+ if (JSON.stringify(changes) !== JSON.stringify(sortedChanges) ||
855
+ new Set(changes.map((change) => change.path)).size !== changes.length) {
856
+ throw new Error('Implementation scope changes must be sorted and unique');
857
+ }
858
+ const declaredByIdentity = new Set(declaredArtifacts.map((artifact) => `${artifact.kind}:${artifact.path}`));
859
+ if (changes.some((change) => change.attributedTo.some((artifact) => !declaredByIdentity.has(`${artifact.kind}:${artifact.path}`)))) {
860
+ throw new Error('Implementation scope change references an undeclared artifact');
861
+ }
862
+ if (changes.some((change) => JSON.stringify(change.attributedTo) !==
863
+ JSON.stringify(declaredArtifacts.filter((artifact) => artifactOwnsPath(artifact, change.path))))) {
864
+ throw new Error('Implementation scope change attribution is inconsistent');
865
+ }
866
+ const unattributed = root.unattributed.map(parseImplementationChange);
867
+ const expectedUnattributed = changes.filter((change) => change.attributedTo.length === 0);
868
+ if (JSON.stringify(unattributed) !== JSON.stringify(expectedUnattributed)) {
869
+ throw new Error('Implementation scope unattributed changes are inconsistent');
870
+ }
871
+ const unresolvedScopes = root.unresolvedScopes.map(parseUnresolvedScope);
872
+ const detailOverflowScopes = unresolvedScopes.filter((scope) => scope.kind === 'scope-detail-overflow');
873
+ if (detailOverflowScopes.length > 1) {
874
+ throw new Error('Implementation scope has multiple detail overflow records');
875
+ }
876
+ const detailOverflow = detailOverflowScopes[0] === undefined
877
+ ? null
878
+ : parseScopeDetailOverflow(detailOverflowScopes[0]);
879
+ if (detailOverflow &&
880
+ (detailOverflow.changes + detailOverflow.unresolved === 0 ||
881
+ detailOverflow.unattributed > detailOverflow.changes ||
882
+ detailOverflow.unattributed > detailOverflow.unresolved)) {
883
+ throw new Error('Implementation scope detail overflow counts are inconsistent');
884
+ }
885
+ const noCodeReason = root.noCodeReason;
886
+ const expectedDerivedScopes = [
887
+ ...expectedUnattributed.map((change) => unresolvedScope({
888
+ kind: 'unattributed-change',
889
+ source: 'implementation-scope',
890
+ path: change.path,
891
+ evidence: {
892
+ after: change.after,
893
+ before: change.before,
894
+ changeKind: change.kind,
895
+ },
896
+ }, `Changed path is not covered by a declared artifact: ${change.path}`)),
897
+ ...(changes.length + (detailOverflow?.changes ?? 0) === 0 && noCodeReason === null
898
+ ? [
899
+ unresolvedScope({
900
+ kind: 'missing-no-code-reason',
901
+ source: 'implementation-scope',
902
+ path: null,
903
+ evidence: { baselineProjectionHash, currentProjectionHash },
904
+ }, 'A non-empty no-code reason is required when the snapshots contain no changes'),
905
+ ]
906
+ : []),
907
+ ];
908
+ const actualDerivedScopes = unresolvedScopes.filter((scope) => scope.kind === 'unattributed-change' || scope.kind === 'missing-no-code-reason');
909
+ if (JSON.stringify(unresolvedScopes) !==
910
+ JSON.stringify([...unresolvedScopes].sort(compareUnresolvedScopes)) ||
911
+ new Set(unresolvedScopes.map((scope) => scope.id)).size !== unresolvedScopes.length ||
912
+ JSON.stringify(actualDerivedScopes) !==
913
+ JSON.stringify(expectedDerivedScopes.sort(compareUnresolvedScopes)) ||
914
+ root.complete !== (unresolvedScopes.length === 0)) {
915
+ throw new Error('Implementation scope unresolved scopes are inconsistent');
916
+ }
917
+ if (root.noCodeReason !== null &&
918
+ (typeof root.noCodeReason !== 'string' ||
919
+ root.noCodeReason.length === 0 ||
920
+ root.noCodeReason.trim() !== root.noCodeReason)) {
921
+ throw new Error('Implementation scope no-code reason is invalid');
922
+ }
923
+ let gitAdvisory;
924
+ if (root.gitAdvisory !== undefined) {
925
+ const advisory = scopeRecord(root.gitAdvisory, 'Implementation scope Git advisory');
926
+ exactScopeKeys(advisory, [
927
+ 'advisoryOnly',
928
+ 'changedPaths',
929
+ 'pathsPresentInSnapshotChanges',
930
+ 'pathsAbsentFromSnapshotChanges',
931
+ ], [], 'Implementation scope Git advisory');
932
+ if (advisory.advisoryOnly !== true) {
933
+ throw new Error('Implementation scope Git advisory must remain advisory-only');
934
+ }
935
+ const changedPaths = parseSortedPaths(advisory.changedPaths, 'Git changed paths');
936
+ const pathsPresentInSnapshotChanges = parseSortedPaths(advisory.pathsPresentInSnapshotChanges, 'Git present paths');
937
+ const pathsAbsentFromSnapshotChanges = parseSortedPaths(advisory.pathsAbsentFromSnapshotChanges, 'Git absent paths');
938
+ const partition = [...pathsPresentInSnapshotChanges, ...pathsAbsentFromSnapshotChanges].sort(compareText);
939
+ const detailedChangePaths = new Set(changes.map((change) => change.path));
940
+ if (JSON.stringify(partition) !== JSON.stringify(changedPaths) ||
941
+ ((detailOverflow?.changes ?? 0) === 0 &&
942
+ pathsPresentInSnapshotChanges.some((entry) => !detailedChangePaths.has(entry))) ||
943
+ pathsAbsentFromSnapshotChanges.some((entry) => detailedChangePaths.has(entry))) {
944
+ throw new Error('Implementation scope Git advisory partition is invalid');
945
+ }
946
+ gitAdvisory = {
947
+ advisoryOnly: true,
948
+ changedPaths,
949
+ pathsPresentInSnapshotChanges,
950
+ pathsAbsentFromSnapshotChanges,
951
+ };
952
+ }
953
+ const content = {
954
+ schema: NATIVE_IMPLEMENTATION_SCOPE_SCHEMA,
955
+ contractHash,
956
+ baselineProjectionRef,
957
+ baselineProjectionHash,
958
+ currentProjectionRef,
959
+ currentProjectionHash,
960
+ complete: root.complete,
961
+ declaredArtifacts,
962
+ changes,
963
+ unattributed,
964
+ unresolvedScopes,
965
+ noCodeReason,
966
+ ...(gitAdvisory ? { gitAdvisory } : {}),
967
+ };
968
+ const scopeHash = scopeHashValue(root.scopeHash, 'Implementation scope scopeHash');
969
+ if (canonicalHash(IMPLEMENTATION_SCOPE_HASH_TAG, content) !== scopeHash) {
970
+ throw new Error('Implementation scope content hash mismatch');
971
+ }
972
+ return { ...content, scopeHash };
973
+ }
974
+ function parseScopeAuthority(value) {
975
+ const root = scopeRecord(value, 'Native implementation scope authority');
976
+ exactScopeKeys(root, ['contractHash', 'declaredArtifacts', 'noCodeReason'], ['gitChangedPaths'], 'Native implementation scope authority');
977
+ if (!Array.isArray(root.declaredArtifacts)) {
978
+ throw new Error('Native implementation scope authority declarations must be an array');
979
+ }
980
+ const declaredArtifacts = root.declaredArtifacts.map(parseDeclaredArtifact);
981
+ if (JSON.stringify(declaredArtifacts) !==
982
+ JSON.stringify(normalizeDeclaredArtifacts(declaredArtifacts))) {
983
+ throw new Error('Native implementation scope authority declarations must be canonical');
984
+ }
985
+ if (root.noCodeReason !== null &&
986
+ (typeof root.noCodeReason !== 'string' ||
987
+ root.noCodeReason.length === 0 ||
988
+ root.noCodeReason.trim() !== root.noCodeReason)) {
989
+ throw new Error('Native implementation scope authority no-code reason is invalid');
990
+ }
991
+ let gitChangedPaths;
992
+ if (root.gitChangedPaths !== undefined) {
993
+ gitChangedPaths = parseSortedPaths(root.gitChangedPaths, 'Native implementation scope authority Git paths');
994
+ }
995
+ const authority = normalizeScopeAuthority({
996
+ contractHash: root.contractHash,
997
+ declaredArtifacts,
998
+ noCodeReason: root.noCodeReason,
999
+ ...(gitChangedPaths === undefined ? {} : { gitChangedPaths }),
1000
+ });
1001
+ if (authority.contractHash !== root.contractHash) {
1002
+ throw new Error('Native implementation scope authority contract hash is not canonical');
1003
+ }
1004
+ return authority;
1005
+ }
1006
+ /**
1007
+ * Rebuild and verify a bundle at the storage seam. The supplied scope is never authoritative:
1008
+ * normalized projections plus the independently retained build authority must reproduce it.
1009
+ */
1010
+ export function parseNativeImplementationScopeBundle(value) {
1011
+ const root = scopeRecord(value, 'Native implementation scope bundle');
1012
+ exactScopeKeys(root, ['authority', 'baseline', 'current', 'scope'], [], 'Native implementation scope bundle');
1013
+ const authority = parseScopeAuthority(root.authority);
1014
+ const baseline = parseNativeSnapshotProjection(root.baseline);
1015
+ const current = parseNativeSnapshotProjection(root.current);
1016
+ const suppliedScope = parseNativeImplementationScope(root.scope);
1017
+ const rebuiltScope = buildScopeFromProjections(baseline, current, authority);
1018
+ if (JSON.stringify(suppliedScope) !== JSON.stringify(rebuiltScope)) {
1019
+ throw new Error('Native implementation scope does not match its authoritative bundle');
1020
+ }
1021
+ return { authority, baseline, current, scope: rebuiltScope };
1022
+ }
1023
+ /** Rebuild a persisted scope from the two content-addressed projections it names. */
1024
+ export function rebuildNativeImplementationScopeBundle(input) {
1025
+ const suppliedScope = parseNativeImplementationScope(input.scope);
1026
+ return parseNativeImplementationScopeBundle({
1027
+ authority: {
1028
+ contractHash: suppliedScope.contractHash,
1029
+ declaredArtifacts: suppliedScope.declaredArtifacts,
1030
+ noCodeReason: suppliedScope.noCodeReason,
1031
+ ...(suppliedScope.gitAdvisory
1032
+ ? { gitChangedPaths: suppliedScope.gitAdvisory.changedPaths }
1033
+ : {}),
1034
+ },
1035
+ baseline: input.baseline,
1036
+ current: input.current,
1037
+ scope: suppliedScope,
1038
+ });
1039
+ }
1040
+ //# sourceMappingURL=native-verification-scope.js.map