@quolu/lattice 0.1.0

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 (769) hide show
  1. package/LICENSE +25 -0
  2. package/README.md +20 -0
  3. package/bin/lattice-mcp.mjs +134 -0
  4. package/bin/lattice.mjs +78 -0
  5. package/package.json +47 -0
  6. package/sensor/LICENSE +21 -0
  7. package/sensor/NOTICE +30 -0
  8. package/sensor/dist/bin/codegraph.d.ts +26 -0
  9. package/sensor/dist/bin/codegraph.d.ts.map +1 -0
  10. package/sensor/dist/bin/codegraph.js +2279 -0
  11. package/sensor/dist/bin/codegraph.js.map +1 -0
  12. package/sensor/dist/bin/command-supervision.d.ts +49 -0
  13. package/sensor/dist/bin/command-supervision.d.ts.map +1 -0
  14. package/sensor/dist/bin/command-supervision.js +95 -0
  15. package/sensor/dist/bin/command-supervision.js.map +1 -0
  16. package/sensor/dist/bin/fatal-handler.d.ts +20 -0
  17. package/sensor/dist/bin/fatal-handler.d.ts.map +1 -0
  18. package/sensor/dist/bin/fatal-handler.js +118 -0
  19. package/sensor/dist/bin/fatal-handler.js.map +1 -0
  20. package/sensor/dist/bin/node-version-check.d.ts +37 -0
  21. package/sensor/dist/bin/node-version-check.d.ts.map +1 -0
  22. package/sensor/dist/bin/node-version-check.js +79 -0
  23. package/sensor/dist/bin/node-version-check.js.map +1 -0
  24. package/sensor/dist/bin/uninstall.d.ts +14 -0
  25. package/sensor/dist/bin/uninstall.d.ts.map +1 -0
  26. package/sensor/dist/bin/uninstall.js +36 -0
  27. package/sensor/dist/bin/uninstall.js.map +1 -0
  28. package/sensor/dist/context/formatter.d.ts +30 -0
  29. package/sensor/dist/context/formatter.d.ts.map +1 -0
  30. package/sensor/dist/context/formatter.js +263 -0
  31. package/sensor/dist/context/formatter.js.map +1 -0
  32. package/sensor/dist/context/index.d.ts +119 -0
  33. package/sensor/dist/context/index.d.ts.map +1 -0
  34. package/sensor/dist/context/index.js +1326 -0
  35. package/sensor/dist/context/index.js.map +1 -0
  36. package/sensor/dist/context/markers.d.ts +19 -0
  37. package/sensor/dist/context/markers.d.ts.map +1 -0
  38. package/sensor/dist/context/markers.js +22 -0
  39. package/sensor/dist/context/markers.js.map +1 -0
  40. package/sensor/dist/db/index.d.ts +264 -0
  41. package/sensor/dist/db/index.d.ts.map +1 -0
  42. package/sensor/dist/db/index.js +603 -0
  43. package/sensor/dist/db/index.js.map +1 -0
  44. package/sensor/dist/db/migrations.d.ts +44 -0
  45. package/sensor/dist/db/migrations.d.ts.map +1 -0
  46. package/sensor/dist/db/migrations.js +241 -0
  47. package/sensor/dist/db/migrations.js.map +1 -0
  48. package/sensor/dist/db/queries.d.ts +563 -0
  49. package/sensor/dist/db/queries.d.ts.map +1 -0
  50. package/sensor/dist/db/queries.js +2179 -0
  51. package/sensor/dist/db/queries.js.map +1 -0
  52. package/sensor/dist/db/schema.sql +196 -0
  53. package/sensor/dist/db/sqlite-adapter.d.ts +55 -0
  54. package/sensor/dist/db/sqlite-adapter.d.ts.map +1 -0
  55. package/sensor/dist/db/sqlite-adapter.js +135 -0
  56. package/sensor/dist/db/sqlite-adapter.js.map +1 -0
  57. package/sensor/dist/db/wal-valve.d.ts +106 -0
  58. package/sensor/dist/db/wal-valve.d.ts.map +1 -0
  59. package/sensor/dist/db/wal-valve.js +208 -0
  60. package/sensor/dist/db/wal-valve.js.map +1 -0
  61. package/sensor/dist/directory.d.ts +183 -0
  62. package/sensor/dist/directory.d.ts.map +1 -0
  63. package/sensor/dist/directory.js +797 -0
  64. package/sensor/dist/directory.js.map +1 -0
  65. package/sensor/dist/errors.d.ts +136 -0
  66. package/sensor/dist/errors.d.ts.map +1 -0
  67. package/sensor/dist/errors.js +219 -0
  68. package/sensor/dist/errors.js.map +1 -0
  69. package/sensor/dist/extraction/astro-extractor.d.ts +79 -0
  70. package/sensor/dist/extraction/astro-extractor.d.ts.map +1 -0
  71. package/sensor/dist/extraction/astro-extractor.js +320 -0
  72. package/sensor/dist/extraction/astro-extractor.js.map +1 -0
  73. package/sensor/dist/extraction/cfml-extractor.d.ts +107 -0
  74. package/sensor/dist/extraction/cfml-extractor.d.ts.map +1 -0
  75. package/sensor/dist/extraction/cfml-extractor.js +494 -0
  76. package/sensor/dist/extraction/cfml-extractor.js.map +1 -0
  77. package/sensor/dist/extraction/dfm-extractor.d.ts +31 -0
  78. package/sensor/dist/extraction/dfm-extractor.d.ts.map +1 -0
  79. package/sensor/dist/extraction/dfm-extractor.js +151 -0
  80. package/sensor/dist/extraction/dfm-extractor.js.map +1 -0
  81. package/sensor/dist/extraction/dynamic-import.d.ts +82 -0
  82. package/sensor/dist/extraction/dynamic-import.d.ts.map +1 -0
  83. package/sensor/dist/extraction/dynamic-import.js +313 -0
  84. package/sensor/dist/extraction/dynamic-import.js.map +1 -0
  85. package/sensor/dist/extraction/extraction-version.d.ts +25 -0
  86. package/sensor/dist/extraction/extraction-version.d.ts.map +1 -0
  87. package/sensor/dist/extraction/extraction-version.js +28 -0
  88. package/sensor/dist/extraction/extraction-version.js.map +1 -0
  89. package/sensor/dist/extraction/function-ref.d.ts +118 -0
  90. package/sensor/dist/extraction/function-ref.d.ts.map +1 -0
  91. package/sensor/dist/extraction/function-ref.js +727 -0
  92. package/sensor/dist/extraction/function-ref.js.map +1 -0
  93. package/sensor/dist/extraction/generated-detection.d.ts +30 -0
  94. package/sensor/dist/extraction/generated-detection.d.ts.map +1 -0
  95. package/sensor/dist/extraction/generated-detection.js +83 -0
  96. package/sensor/dist/extraction/generated-detection.js.map +1 -0
  97. package/sensor/dist/extraction/grammars.d.ts +138 -0
  98. package/sensor/dist/extraction/grammars.d.ts.map +1 -0
  99. package/sensor/dist/extraction/grammars.js +648 -0
  100. package/sensor/dist/extraction/grammars.js.map +1 -0
  101. package/sensor/dist/extraction/index.d.ts +251 -0
  102. package/sensor/dist/extraction/index.d.ts.map +1 -0
  103. package/sensor/dist/extraction/index.js +2563 -0
  104. package/sensor/dist/extraction/index.js.map +1 -0
  105. package/sensor/dist/extraction/kernel/decode.d.ts +9 -0
  106. package/sensor/dist/extraction/kernel/decode.d.ts.map +1 -0
  107. package/sensor/dist/extraction/kernel/decode.js +156 -0
  108. package/sensor/dist/extraction/kernel/decode.js.map +1 -0
  109. package/sensor/dist/extraction/kernel/index.d.ts +62 -0
  110. package/sensor/dist/extraction/kernel/index.d.ts.map +1 -0
  111. package/sensor/dist/extraction/kernel/index.js +165 -0
  112. package/sensor/dist/extraction/kernel/index.js.map +1 -0
  113. package/sensor/dist/extraction/kernel/layout.d.ts +92 -0
  114. package/sensor/dist/extraction/kernel/layout.d.ts.map +1 -0
  115. package/sensor/dist/extraction/kernel/layout.js +95 -0
  116. package/sensor/dist/extraction/kernel/layout.js.map +1 -0
  117. package/sensor/dist/extraction/kernel/loader.d.ts +61 -0
  118. package/sensor/dist/extraction/kernel/loader.d.ts.map +1 -0
  119. package/sensor/dist/extraction/kernel/loader.js +146 -0
  120. package/sensor/dist/extraction/kernel/loader.js.map +1 -0
  121. package/sensor/dist/extraction/languages/arkts.d.ts +3 -0
  122. package/sensor/dist/extraction/languages/arkts.d.ts.map +1 -0
  123. package/sensor/dist/extraction/languages/arkts.js +127 -0
  124. package/sensor/dist/extraction/languages/arkts.js.map +1 -0
  125. package/sensor/dist/extraction/languages/c-cpp.d.ts +111 -0
  126. package/sensor/dist/extraction/languages/c-cpp.d.ts.map +1 -0
  127. package/sensor/dist/extraction/languages/c-cpp.js +878 -0
  128. package/sensor/dist/extraction/languages/c-cpp.js.map +1 -0
  129. package/sensor/dist/extraction/languages/cfquery.d.ts +12 -0
  130. package/sensor/dist/extraction/languages/cfquery.d.ts.map +1 -0
  131. package/sensor/dist/extraction/languages/cfquery.js +28 -0
  132. package/sensor/dist/extraction/languages/cfquery.js.map +1 -0
  133. package/sensor/dist/extraction/languages/cfscript.d.ts +3 -0
  134. package/sensor/dist/extraction/languages/cfscript.d.ts.map +1 -0
  135. package/sensor/dist/extraction/languages/cfscript.js +73 -0
  136. package/sensor/dist/extraction/languages/cfscript.js.map +1 -0
  137. package/sensor/dist/extraction/languages/cobol.d.ts +33 -0
  138. package/sensor/dist/extraction/languages/cobol.d.ts.map +1 -0
  139. package/sensor/dist/extraction/languages/cobol.js +499 -0
  140. package/sensor/dist/extraction/languages/cobol.js.map +1 -0
  141. package/sensor/dist/extraction/languages/csharp.d.ts +25 -0
  142. package/sensor/dist/extraction/languages/csharp.d.ts.map +1 -0
  143. package/sensor/dist/extraction/languages/csharp.js +175 -0
  144. package/sensor/dist/extraction/languages/csharp.js.map +1 -0
  145. package/sensor/dist/extraction/languages/dart.d.ts +3 -0
  146. package/sensor/dist/extraction/languages/dart.d.ts.map +1 -0
  147. package/sensor/dist/extraction/languages/dart.js +374 -0
  148. package/sensor/dist/extraction/languages/dart.js.map +1 -0
  149. package/sensor/dist/extraction/languages/erlang.d.ts +3 -0
  150. package/sensor/dist/extraction/languages/erlang.d.ts.map +1 -0
  151. package/sensor/dist/extraction/languages/erlang.js +350 -0
  152. package/sensor/dist/extraction/languages/erlang.js.map +1 -0
  153. package/sensor/dist/extraction/languages/go.d.ts +3 -0
  154. package/sensor/dist/extraction/languages/go.d.ts.map +1 -0
  155. package/sensor/dist/extraction/languages/go.js +111 -0
  156. package/sensor/dist/extraction/languages/go.js.map +1 -0
  157. package/sensor/dist/extraction/languages/index.d.ts +10 -0
  158. package/sensor/dist/extraction/languages/index.d.ts.map +1 -0
  159. package/sensor/dist/extraction/languages/index.js +71 -0
  160. package/sensor/dist/extraction/languages/index.js.map +1 -0
  161. package/sensor/dist/extraction/languages/java.d.ts +3 -0
  162. package/sensor/dist/extraction/languages/java.d.ts.map +1 -0
  163. package/sensor/dist/extraction/languages/java.js +315 -0
  164. package/sensor/dist/extraction/languages/java.js.map +1 -0
  165. package/sensor/dist/extraction/languages/javascript.d.ts +3 -0
  166. package/sensor/dist/extraction/languages/javascript.d.ts.map +1 -0
  167. package/sensor/dist/extraction/languages/javascript.js +106 -0
  168. package/sensor/dist/extraction/languages/javascript.js.map +1 -0
  169. package/sensor/dist/extraction/languages/kotlin.d.ts +3 -0
  170. package/sensor/dist/extraction/languages/kotlin.d.ts.map +1 -0
  171. package/sensor/dist/extraction/languages/kotlin.js +379 -0
  172. package/sensor/dist/extraction/languages/kotlin.js.map +1 -0
  173. package/sensor/dist/extraction/languages/lua.d.ts +3 -0
  174. package/sensor/dist/extraction/languages/lua.d.ts.map +1 -0
  175. package/sensor/dist/extraction/languages/lua.js +150 -0
  176. package/sensor/dist/extraction/languages/lua.js.map +1 -0
  177. package/sensor/dist/extraction/languages/luau.d.ts +3 -0
  178. package/sensor/dist/extraction/languages/luau.d.ts.map +1 -0
  179. package/sensor/dist/extraction/languages/luau.js +37 -0
  180. package/sensor/dist/extraction/languages/luau.js.map +1 -0
  181. package/sensor/dist/extraction/languages/nix.d.ts +3 -0
  182. package/sensor/dist/extraction/languages/nix.d.ts.map +1 -0
  183. package/sensor/dist/extraction/languages/nix.js +294 -0
  184. package/sensor/dist/extraction/languages/nix.js.map +1 -0
  185. package/sensor/dist/extraction/languages/objc.d.ts +3 -0
  186. package/sensor/dist/extraction/languages/objc.d.ts.map +1 -0
  187. package/sensor/dist/extraction/languages/objc.js +175 -0
  188. package/sensor/dist/extraction/languages/objc.js.map +1 -0
  189. package/sensor/dist/extraction/languages/pascal.d.ts +3 -0
  190. package/sensor/dist/extraction/languages/pascal.d.ts.map +1 -0
  191. package/sensor/dist/extraction/languages/pascal.js +77 -0
  192. package/sensor/dist/extraction/languages/pascal.js.map +1 -0
  193. package/sensor/dist/extraction/languages/php.d.ts +3 -0
  194. package/sensor/dist/extraction/languages/php.d.ts.map +1 -0
  195. package/sensor/dist/extraction/languages/php.js +196 -0
  196. package/sensor/dist/extraction/languages/php.js.map +1 -0
  197. package/sensor/dist/extraction/languages/python.d.ts +3 -0
  198. package/sensor/dist/extraction/languages/python.d.ts.map +1 -0
  199. package/sensor/dist/extraction/languages/python.js +56 -0
  200. package/sensor/dist/extraction/languages/python.js.map +1 -0
  201. package/sensor/dist/extraction/languages/r.d.ts +3 -0
  202. package/sensor/dist/extraction/languages/r.d.ts.map +1 -0
  203. package/sensor/dist/extraction/languages/r.js +314 -0
  204. package/sensor/dist/extraction/languages/r.js.map +1 -0
  205. package/sensor/dist/extraction/languages/ruby.d.ts +3 -0
  206. package/sensor/dist/extraction/languages/ruby.d.ts.map +1 -0
  207. package/sensor/dist/extraction/languages/ruby.js +149 -0
  208. package/sensor/dist/extraction/languages/ruby.js.map +1 -0
  209. package/sensor/dist/extraction/languages/rust.d.ts +3 -0
  210. package/sensor/dist/extraction/languages/rust.d.ts.map +1 -0
  211. package/sensor/dist/extraction/languages/rust.js +142 -0
  212. package/sensor/dist/extraction/languages/rust.js.map +1 -0
  213. package/sensor/dist/extraction/languages/scala.d.ts +3 -0
  214. package/sensor/dist/extraction/languages/scala.d.ts.map +1 -0
  215. package/sensor/dist/extraction/languages/scala.js +209 -0
  216. package/sensor/dist/extraction/languages/scala.js.map +1 -0
  217. package/sensor/dist/extraction/languages/solidity.d.ts +3 -0
  218. package/sensor/dist/extraction/languages/solidity.d.ts.map +1 -0
  219. package/sensor/dist/extraction/languages/solidity.js +293 -0
  220. package/sensor/dist/extraction/languages/solidity.js.map +1 -0
  221. package/sensor/dist/extraction/languages/swift.d.ts +3 -0
  222. package/sensor/dist/extraction/languages/swift.d.ts.map +1 -0
  223. package/sensor/dist/extraction/languages/swift.js +152 -0
  224. package/sensor/dist/extraction/languages/swift.js.map +1 -0
  225. package/sensor/dist/extraction/languages/terraform.d.ts +3 -0
  226. package/sensor/dist/extraction/languages/terraform.d.ts.map +1 -0
  227. package/sensor/dist/extraction/languages/terraform.js +641 -0
  228. package/sensor/dist/extraction/languages/terraform.js.map +1 -0
  229. package/sensor/dist/extraction/languages/typescript.d.ts +16 -0
  230. package/sensor/dist/extraction/languages/typescript.d.ts.map +1 -0
  231. package/sensor/dist/extraction/languages/typescript.js +167 -0
  232. package/sensor/dist/extraction/languages/typescript.js.map +1 -0
  233. package/sensor/dist/extraction/languages/vbnet.d.ts +11 -0
  234. package/sensor/dist/extraction/languages/vbnet.d.ts.map +1 -0
  235. package/sensor/dist/extraction/languages/vbnet.js +141 -0
  236. package/sensor/dist/extraction/languages/vbnet.js.map +1 -0
  237. package/sensor/dist/extraction/liquid-extractor.d.ts +59 -0
  238. package/sensor/dist/extraction/liquid-extractor.d.ts.map +1 -0
  239. package/sensor/dist/extraction/liquid-extractor.js +357 -0
  240. package/sensor/dist/extraction/liquid-extractor.js.map +1 -0
  241. package/sensor/dist/extraction/mybatis-extractor.d.ts +68 -0
  242. package/sensor/dist/extraction/mybatis-extractor.d.ts.map +1 -0
  243. package/sensor/dist/extraction/mybatis-extractor.js +300 -0
  244. package/sensor/dist/extraction/mybatis-extractor.js.map +1 -0
  245. package/sensor/dist/extraction/parse-pool.d.ts +160 -0
  246. package/sensor/dist/extraction/parse-pool.d.ts.map +1 -0
  247. package/sensor/dist/extraction/parse-pool.js +402 -0
  248. package/sensor/dist/extraction/parse-pool.js.map +1 -0
  249. package/sensor/dist/extraction/parse-worker.d.ts +8 -0
  250. package/sensor/dist/extraction/parse-worker.d.ts.map +1 -0
  251. package/sensor/dist/extraction/parse-worker.js +138 -0
  252. package/sensor/dist/extraction/parse-worker.js.map +1 -0
  253. package/sensor/dist/extraction/razor-extractor.d.ts +42 -0
  254. package/sensor/dist/extraction/razor-extractor.d.ts.map +1 -0
  255. package/sensor/dist/extraction/razor-extractor.js +285 -0
  256. package/sensor/dist/extraction/razor-extractor.js.map +1 -0
  257. package/sensor/dist/extraction/spawn-invokes.d.ts +101 -0
  258. package/sensor/dist/extraction/spawn-invokes.d.ts.map +1 -0
  259. package/sensor/dist/extraction/spawn-invokes.js +327 -0
  260. package/sensor/dist/extraction/spawn-invokes.js.map +1 -0
  261. package/sensor/dist/extraction/store-worker.d.ts +24 -0
  262. package/sensor/dist/extraction/store-worker.d.ts.map +1 -0
  263. package/sensor/dist/extraction/store-worker.js +110 -0
  264. package/sensor/dist/extraction/store-worker.js.map +1 -0
  265. package/sensor/dist/extraction/store-writer.d.ts +63 -0
  266. package/sensor/dist/extraction/store-writer.d.ts.map +1 -0
  267. package/sensor/dist/extraction/store-writer.js +174 -0
  268. package/sensor/dist/extraction/store-writer.js.map +1 -0
  269. package/sensor/dist/extraction/svelte-extractor.d.ts +56 -0
  270. package/sensor/dist/extraction/svelte-extractor.d.ts.map +1 -0
  271. package/sensor/dist/extraction/svelte-extractor.js +275 -0
  272. package/sensor/dist/extraction/svelte-extractor.js.map +1 -0
  273. package/sensor/dist/extraction/tree-sitter-helpers.d.ts +28 -0
  274. package/sensor/dist/extraction/tree-sitter-helpers.d.ts.map +1 -0
  275. package/sensor/dist/extraction/tree-sitter-helpers.js +153 -0
  276. package/sensor/dist/extraction/tree-sitter-helpers.js.map +1 -0
  277. package/sensor/dist/extraction/tree-sitter-types.d.ts +258 -0
  278. package/sensor/dist/extraction/tree-sitter-types.d.ts.map +1 -0
  279. package/sensor/dist/extraction/tree-sitter-types.js +10 -0
  280. package/sensor/dist/extraction/tree-sitter-types.js.map +1 -0
  281. package/sensor/dist/extraction/tree-sitter.d.ts +724 -0
  282. package/sensor/dist/extraction/tree-sitter.d.ts.map +1 -0
  283. package/sensor/dist/extraction/tree-sitter.js +6721 -0
  284. package/sensor/dist/extraction/tree-sitter.js.map +1 -0
  285. package/sensor/dist/extraction/vue-extractor.d.ts +51 -0
  286. package/sensor/dist/extraction/vue-extractor.d.ts.map +1 -0
  287. package/sensor/dist/extraction/vue-extractor.js +254 -0
  288. package/sensor/dist/extraction/vue-extractor.js.map +1 -0
  289. package/sensor/dist/extraction/wasm/tree-sitter-arkts.wasm +0 -0
  290. package/sensor/dist/extraction/wasm/tree-sitter-c_sharp.wasm +0 -0
  291. package/sensor/dist/extraction/wasm/tree-sitter-cfml.wasm +0 -0
  292. package/sensor/dist/extraction/wasm/tree-sitter-cfquery.wasm +0 -0
  293. package/sensor/dist/extraction/wasm/tree-sitter-cfscript.wasm +0 -0
  294. package/sensor/dist/extraction/wasm/tree-sitter-cobol.wasm +0 -0
  295. package/sensor/dist/extraction/wasm/tree-sitter-erlang.wasm +0 -0
  296. package/sensor/dist/extraction/wasm/tree-sitter-go.wasm +0 -0
  297. package/sensor/dist/extraction/wasm/tree-sitter-java.wasm +0 -0
  298. package/sensor/dist/extraction/wasm/tree-sitter-javascript.wasm +0 -0
  299. package/sensor/dist/extraction/wasm/tree-sitter-lua.wasm +0 -0
  300. package/sensor/dist/extraction/wasm/tree-sitter-luau.wasm +0 -0
  301. package/sensor/dist/extraction/wasm/tree-sitter-nix.wasm +0 -0
  302. package/sensor/dist/extraction/wasm/tree-sitter-pascal.wasm +0 -0
  303. package/sensor/dist/extraction/wasm/tree-sitter-python.wasm +0 -0
  304. package/sensor/dist/extraction/wasm/tree-sitter-r.wasm +0 -0
  305. package/sensor/dist/extraction/wasm/tree-sitter-scala.wasm +0 -0
  306. package/sensor/dist/extraction/wasm/tree-sitter-terraform.wasm +0 -0
  307. package/sensor/dist/extraction/wasm/tree-sitter-tsx.wasm +0 -0
  308. package/sensor/dist/extraction/wasm/tree-sitter-typescript.wasm +0 -0
  309. package/sensor/dist/extraction/wasm/tree-sitter-vbnet.wasm +0 -0
  310. package/sensor/dist/extraction/wasm-runtime-flags.d.ts +53 -0
  311. package/sensor/dist/extraction/wasm-runtime-flags.d.ts.map +1 -0
  312. package/sensor/dist/extraction/wasm-runtime-flags.js +130 -0
  313. package/sensor/dist/extraction/wasm-runtime-flags.js.map +1 -0
  314. package/sensor/dist/graph/index.d.ts +8 -0
  315. package/sensor/dist/graph/index.d.ts.map +1 -0
  316. package/sensor/dist/graph/index.js +13 -0
  317. package/sensor/dist/graph/index.js.map +1 -0
  318. package/sensor/dist/graph/queries.d.ts +106 -0
  319. package/sensor/dist/graph/queries.d.ts.map +1 -0
  320. package/sensor/dist/graph/queries.js +339 -0
  321. package/sensor/dist/graph/queries.js.map +1 -0
  322. package/sensor/dist/graph/traversal.d.ts +127 -0
  323. package/sensor/dist/graph/traversal.d.ts.map +1 -0
  324. package/sensor/dist/graph/traversal.js +599 -0
  325. package/sensor/dist/graph/traversal.js.map +1 -0
  326. package/sensor/dist/index.d.ts +653 -0
  327. package/sensor/dist/index.d.ts.map +1 -0
  328. package/sensor/dist/index.js +1646 -0
  329. package/sensor/dist/index.js.map +1 -0
  330. package/sensor/dist/installer/beta-signup.d.ts +54 -0
  331. package/sensor/dist/installer/beta-signup.d.ts.map +1 -0
  332. package/sensor/dist/installer/beta-signup.js +178 -0
  333. package/sensor/dist/installer/beta-signup.js.map +1 -0
  334. package/sensor/dist/installer/config-writer.d.ts +28 -0
  335. package/sensor/dist/installer/config-writer.d.ts.map +1 -0
  336. package/sensor/dist/installer/config-writer.js +91 -0
  337. package/sensor/dist/installer/config-writer.js.map +1 -0
  338. package/sensor/dist/installer/index.d.ts +142 -0
  339. package/sensor/dist/installer/index.d.ts.map +1 -0
  340. package/sensor/dist/installer/index.js +622 -0
  341. package/sensor/dist/installer/index.js.map +1 -0
  342. package/sensor/dist/installer/instructions-template.d.ts +41 -0
  343. package/sensor/dist/installer/instructions-template.d.ts.map +1 -0
  344. package/sensor/dist/installer/instructions-template.js +53 -0
  345. package/sensor/dist/installer/instructions-template.js.map +1 -0
  346. package/sensor/dist/installer/targets/antigravity.d.ts +57 -0
  347. package/sensor/dist/installer/targets/antigravity.d.ts.map +1 -0
  348. package/sensor/dist/installer/targets/antigravity.js +308 -0
  349. package/sensor/dist/installer/targets/antigravity.js.map +1 -0
  350. package/sensor/dist/installer/targets/claude.d.ts +62 -0
  351. package/sensor/dist/installer/targets/claude.d.ts.map +1 -0
  352. package/sensor/dist/installer/targets/claude.js +454 -0
  353. package/sensor/dist/installer/targets/claude.js.map +1 -0
  354. package/sensor/dist/installer/targets/codex.d.ts +18 -0
  355. package/sensor/dist/installer/targets/codex.d.ts.map +1 -0
  356. package/sensor/dist/installer/targets/codex.js +185 -0
  357. package/sensor/dist/installer/targets/codex.js.map +1 -0
  358. package/sensor/dist/installer/targets/cursor.d.ts +35 -0
  359. package/sensor/dist/installer/targets/cursor.d.ts.map +1 -0
  360. package/sensor/dist/installer/targets/cursor.js +254 -0
  361. package/sensor/dist/installer/targets/cursor.js.map +1 -0
  362. package/sensor/dist/installer/targets/gemini.d.ts +26 -0
  363. package/sensor/dist/installer/targets/gemini.d.ts.map +1 -0
  364. package/sensor/dist/installer/targets/gemini.js +165 -0
  365. package/sensor/dist/installer/targets/gemini.js.map +1 -0
  366. package/sensor/dist/installer/targets/hermes.d.ts +18 -0
  367. package/sensor/dist/installer/targets/hermes.d.ts.map +1 -0
  368. package/sensor/dist/installer/targets/hermes.js +359 -0
  369. package/sensor/dist/installer/targets/hermes.js.map +1 -0
  370. package/sensor/dist/installer/targets/kiro.d.ts +27 -0
  371. package/sensor/dist/installer/targets/kiro.d.ts.map +1 -0
  372. package/sensor/dist/installer/targets/kiro.js +178 -0
  373. package/sensor/dist/installer/targets/kiro.js.map +1 -0
  374. package/sensor/dist/installer/targets/opencode.d.ts +38 -0
  375. package/sensor/dist/installer/targets/opencode.d.ts.map +1 -0
  376. package/sensor/dist/installer/targets/opencode.js +288 -0
  377. package/sensor/dist/installer/targets/opencode.js.map +1 -0
  378. package/sensor/dist/installer/targets/registry.d.ts +35 -0
  379. package/sensor/dist/installer/targets/registry.d.ts.map +1 -0
  380. package/sensor/dist/installer/targets/registry.js +91 -0
  381. package/sensor/dist/installer/targets/registry.js.map +1 -0
  382. package/sensor/dist/installer/targets/shared.d.ts +101 -0
  383. package/sensor/dist/installer/targets/shared.d.ts.map +1 -0
  384. package/sensor/dist/installer/targets/shared.js +264 -0
  385. package/sensor/dist/installer/targets/shared.js.map +1 -0
  386. package/sensor/dist/installer/targets/toml.d.ts +52 -0
  387. package/sensor/dist/installer/targets/toml.d.ts.map +1 -0
  388. package/sensor/dist/installer/targets/toml.js +147 -0
  389. package/sensor/dist/installer/targets/toml.js.map +1 -0
  390. package/sensor/dist/installer/targets/types.d.ts +108 -0
  391. package/sensor/dist/installer/targets/types.d.ts.map +1 -0
  392. package/sensor/dist/installer/targets/types.js +16 -0
  393. package/sensor/dist/installer/targets/types.js.map +1 -0
  394. package/sensor/dist/mcp/daemon-manager.d.ts +42 -0
  395. package/sensor/dist/mcp/daemon-manager.d.ts.map +1 -0
  396. package/sensor/dist/mcp/daemon-manager.js +129 -0
  397. package/sensor/dist/mcp/daemon-manager.js.map +1 -0
  398. package/sensor/dist/mcp/daemon-paths.d.ts +73 -0
  399. package/sensor/dist/mcp/daemon-paths.d.ts.map +1 -0
  400. package/sensor/dist/mcp/daemon-paths.js +170 -0
  401. package/sensor/dist/mcp/daemon-paths.js.map +1 -0
  402. package/sensor/dist/mcp/daemon-registry.d.ts +54 -0
  403. package/sensor/dist/mcp/daemon-registry.d.ts.map +1 -0
  404. package/sensor/dist/mcp/daemon-registry.js +241 -0
  405. package/sensor/dist/mcp/daemon-registry.js.map +1 -0
  406. package/sensor/dist/mcp/daemon.d.ts +290 -0
  407. package/sensor/dist/mcp/daemon.d.ts.map +1 -0
  408. package/sensor/dist/mcp/daemon.js +867 -0
  409. package/sensor/dist/mcp/daemon.js.map +1 -0
  410. package/sensor/dist/mcp/dynamic-boundaries.d.ts +41 -0
  411. package/sensor/dist/mcp/dynamic-boundaries.d.ts.map +1 -0
  412. package/sensor/dist/mcp/dynamic-boundaries.js +360 -0
  413. package/sensor/dist/mcp/dynamic-boundaries.js.map +1 -0
  414. package/sensor/dist/mcp/early-ppid.d.ts +26 -0
  415. package/sensor/dist/mcp/early-ppid.d.ts.map +1 -0
  416. package/sensor/dist/mcp/early-ppid.js +29 -0
  417. package/sensor/dist/mcp/early-ppid.js.map +1 -0
  418. package/sensor/dist/mcp/engine.d.ts +130 -0
  419. package/sensor/dist/mcp/engine.d.ts.map +1 -0
  420. package/sensor/dist/mcp/engine.js +375 -0
  421. package/sensor/dist/mcp/engine.js.map +1 -0
  422. package/sensor/dist/mcp/index.d.ts +113 -0
  423. package/sensor/dist/mcp/index.d.ts.map +1 -0
  424. package/sensor/dist/mcp/index.js +551 -0
  425. package/sensor/dist/mcp/index.js.map +1 -0
  426. package/sensor/dist/mcp/liveness-watchdog.d.ts +35 -0
  427. package/sensor/dist/mcp/liveness-watchdog.d.ts.map +1 -0
  428. package/sensor/dist/mcp/liveness-watchdog.js +267 -0
  429. package/sensor/dist/mcp/liveness-watchdog.js.map +1 -0
  430. package/sensor/dist/mcp/ppid-watchdog.d.ts +62 -0
  431. package/sensor/dist/mcp/ppid-watchdog.d.ts.map +1 -0
  432. package/sensor/dist/mcp/ppid-watchdog.js +64 -0
  433. package/sensor/dist/mcp/ppid-watchdog.js.map +1 -0
  434. package/sensor/dist/mcp/proxy.d.ts +99 -0
  435. package/sensor/dist/mcp/proxy.d.ts.map +1 -0
  436. package/sensor/dist/mcp/proxy.js +737 -0
  437. package/sensor/dist/mcp/proxy.js.map +1 -0
  438. package/sensor/dist/mcp/query-pool.d.ts +108 -0
  439. package/sensor/dist/mcp/query-pool.d.ts.map +1 -0
  440. package/sensor/dist/mcp/query-pool.js +315 -0
  441. package/sensor/dist/mcp/query-pool.js.map +1 -0
  442. package/sensor/dist/mcp/query-worker.d.ts +24 -0
  443. package/sensor/dist/mcp/query-worker.d.ts.map +1 -0
  444. package/sensor/dist/mcp/query-worker.js +87 -0
  445. package/sensor/dist/mcp/query-worker.js.map +1 -0
  446. package/sensor/dist/mcp/server-instructions.d.ts +34 -0
  447. package/sensor/dist/mcp/server-instructions.d.ts.map +1 -0
  448. package/sensor/dist/mcp/server-instructions.js +106 -0
  449. package/sensor/dist/mcp/server-instructions.js.map +1 -0
  450. package/sensor/dist/mcp/session.d.ts +92 -0
  451. package/sensor/dist/mcp/session.d.ts.map +1 -0
  452. package/sensor/dist/mcp/session.js +355 -0
  453. package/sensor/dist/mcp/session.js.map +1 -0
  454. package/sensor/dist/mcp/startup-handshake.d.ts +44 -0
  455. package/sensor/dist/mcp/startup-handshake.d.ts.map +1 -0
  456. package/sensor/dist/mcp/startup-handshake.js +73 -0
  457. package/sensor/dist/mcp/startup-handshake.js.map +1 -0
  458. package/sensor/dist/mcp/stdin-teardown.d.ts +27 -0
  459. package/sensor/dist/mcp/stdin-teardown.d.ts.map +1 -0
  460. package/sensor/dist/mcp/stdin-teardown.js +49 -0
  461. package/sensor/dist/mcp/stdin-teardown.js.map +1 -0
  462. package/sensor/dist/mcp/tools.d.ts +651 -0
  463. package/sensor/dist/mcp/tools.d.ts.map +1 -0
  464. package/sensor/dist/mcp/tools.js +4574 -0
  465. package/sensor/dist/mcp/tools.js.map +1 -0
  466. package/sensor/dist/mcp/transport.d.ts +188 -0
  467. package/sensor/dist/mcp/transport.d.ts.map +1 -0
  468. package/sensor/dist/mcp/transport.js +377 -0
  469. package/sensor/dist/mcp/transport.js.map +1 -0
  470. package/sensor/dist/mcp/version.d.ts +30 -0
  471. package/sensor/dist/mcp/version.d.ts.map +1 -0
  472. package/sensor/dist/mcp/version.js +85 -0
  473. package/sensor/dist/mcp/version.js.map +1 -0
  474. package/sensor/dist/project-config.d.ts +94 -0
  475. package/sensor/dist/project-config.d.ts.map +1 -0
  476. package/sensor/dist/project-config.js +374 -0
  477. package/sensor/dist/project-config.js.map +1 -0
  478. package/sensor/dist/resolution/c-fnptr-synthesizer.d.ts +6 -0
  479. package/sensor/dist/resolution/c-fnptr-synthesizer.d.ts.map +1 -0
  480. package/sensor/dist/resolution/c-fnptr-synthesizer.js +1070 -0
  481. package/sensor/dist/resolution/c-fnptr-synthesizer.js.map +1 -0
  482. package/sensor/dist/resolution/callback-synthesizer.d.ts +59 -0
  483. package/sensor/dist/resolution/callback-synthesizer.d.ts.map +1 -0
  484. package/sensor/dist/resolution/callback-synthesizer.js +3961 -0
  485. package/sensor/dist/resolution/callback-synthesizer.js.map +1 -0
  486. package/sensor/dist/resolution/cooperative-yield.d.ts +40 -0
  487. package/sensor/dist/resolution/cooperative-yield.d.ts.map +1 -0
  488. package/sensor/dist/resolution/cooperative-yield.js +44 -0
  489. package/sensor/dist/resolution/cooperative-yield.js.map +1 -0
  490. package/sensor/dist/resolution/frameworks/astro.d.ts +9 -0
  491. package/sensor/dist/resolution/frameworks/astro.d.ts.map +1 -0
  492. package/sensor/dist/resolution/frameworks/astro.js +169 -0
  493. package/sensor/dist/resolution/frameworks/astro.js.map +1 -0
  494. package/sensor/dist/resolution/frameworks/cargo-workspace.d.ts +18 -0
  495. package/sensor/dist/resolution/frameworks/cargo-workspace.d.ts.map +1 -0
  496. package/sensor/dist/resolution/frameworks/cargo-workspace.js +225 -0
  497. package/sensor/dist/resolution/frameworks/cargo-workspace.js.map +1 -0
  498. package/sensor/dist/resolution/frameworks/cics.d.ts +20 -0
  499. package/sensor/dist/resolution/frameworks/cics.d.ts.map +1 -0
  500. package/sensor/dist/resolution/frameworks/cics.js +90 -0
  501. package/sensor/dist/resolution/frameworks/cics.js.map +1 -0
  502. package/sensor/dist/resolution/frameworks/csharp.d.ts +8 -0
  503. package/sensor/dist/resolution/frameworks/csharp.d.ts.map +1 -0
  504. package/sensor/dist/resolution/frameworks/csharp.js +241 -0
  505. package/sensor/dist/resolution/frameworks/csharp.js.map +1 -0
  506. package/sensor/dist/resolution/frameworks/drupal.d.ts +51 -0
  507. package/sensor/dist/resolution/frameworks/drupal.d.ts.map +1 -0
  508. package/sensor/dist/resolution/frameworks/drupal.js +367 -0
  509. package/sensor/dist/resolution/frameworks/drupal.js.map +1 -0
  510. package/sensor/dist/resolution/frameworks/expo-modules.d.ts +3 -0
  511. package/sensor/dist/resolution/frameworks/expo-modules.d.ts.map +1 -0
  512. package/sensor/dist/resolution/frameworks/expo-modules.js +148 -0
  513. package/sensor/dist/resolution/frameworks/expo-modules.js.map +1 -0
  514. package/sensor/dist/resolution/frameworks/express.d.ts +8 -0
  515. package/sensor/dist/resolution/frameworks/express.d.ts.map +1 -0
  516. package/sensor/dist/resolution/frameworks/express.js +308 -0
  517. package/sensor/dist/resolution/frameworks/express.js.map +1 -0
  518. package/sensor/dist/resolution/frameworks/fabric.d.ts +3 -0
  519. package/sensor/dist/resolution/frameworks/fabric.d.ts.map +1 -0
  520. package/sensor/dist/resolution/frameworks/fabric.js +354 -0
  521. package/sensor/dist/resolution/frameworks/fabric.js.map +1 -0
  522. package/sensor/dist/resolution/frameworks/go.d.ts +8 -0
  523. package/sensor/dist/resolution/frameworks/go.d.ts.map +1 -0
  524. package/sensor/dist/resolution/frameworks/go.js +184 -0
  525. package/sensor/dist/resolution/frameworks/go.js.map +1 -0
  526. package/sensor/dist/resolution/frameworks/goframe.d.ts +41 -0
  527. package/sensor/dist/resolution/frameworks/goframe.d.ts.map +1 -0
  528. package/sensor/dist/resolution/frameworks/goframe.js +112 -0
  529. package/sensor/dist/resolution/frameworks/goframe.js.map +1 -0
  530. package/sensor/dist/resolution/frameworks/index.d.ts +50 -0
  531. package/sensor/dist/resolution/frameworks/index.d.ts.map +1 -0
  532. package/sensor/dist/resolution/frameworks/index.js +175 -0
  533. package/sensor/dist/resolution/frameworks/index.js.map +1 -0
  534. package/sensor/dist/resolution/frameworks/java.d.ts +8 -0
  535. package/sensor/dist/resolution/frameworks/java.d.ts.map +1 -0
  536. package/sensor/dist/resolution/frameworks/java.js +517 -0
  537. package/sensor/dist/resolution/frameworks/java.js.map +1 -0
  538. package/sensor/dist/resolution/frameworks/laravel.d.ts +13 -0
  539. package/sensor/dist/resolution/frameworks/laravel.d.ts.map +1 -0
  540. package/sensor/dist/resolution/frameworks/laravel.js +257 -0
  541. package/sensor/dist/resolution/frameworks/laravel.js.map +1 -0
  542. package/sensor/dist/resolution/frameworks/nestjs.d.ts +26 -0
  543. package/sensor/dist/resolution/frameworks/nestjs.d.ts.map +1 -0
  544. package/sensor/dist/resolution/frameworks/nestjs.js +698 -0
  545. package/sensor/dist/resolution/frameworks/nestjs.js.map +1 -0
  546. package/sensor/dist/resolution/frameworks/play.d.ts +19 -0
  547. package/sensor/dist/resolution/frameworks/play.d.ts.map +1 -0
  548. package/sensor/dist/resolution/frameworks/play.js +111 -0
  549. package/sensor/dist/resolution/frameworks/play.js.map +1 -0
  550. package/sensor/dist/resolution/frameworks/python.d.ts +10 -0
  551. package/sensor/dist/resolution/frameworks/python.d.ts.map +1 -0
  552. package/sensor/dist/resolution/frameworks/python.js +400 -0
  553. package/sensor/dist/resolution/frameworks/python.js.map +1 -0
  554. package/sensor/dist/resolution/frameworks/react-native.d.ts +3 -0
  555. package/sensor/dist/resolution/frameworks/react-native.d.ts.map +1 -0
  556. package/sensor/dist/resolution/frameworks/react-native.js +410 -0
  557. package/sensor/dist/resolution/frameworks/react-native.js.map +1 -0
  558. package/sensor/dist/resolution/frameworks/react.d.ts +8 -0
  559. package/sensor/dist/resolution/frameworks/react.d.ts.map +1 -0
  560. package/sensor/dist/resolution/frameworks/react.js +334 -0
  561. package/sensor/dist/resolution/frameworks/react.js.map +1 -0
  562. package/sensor/dist/resolution/frameworks/ruby.d.ts +8 -0
  563. package/sensor/dist/resolution/frameworks/ruby.d.ts.map +1 -0
  564. package/sensor/dist/resolution/frameworks/ruby.js +302 -0
  565. package/sensor/dist/resolution/frameworks/ruby.js.map +1 -0
  566. package/sensor/dist/resolution/frameworks/rust.d.ts +8 -0
  567. package/sensor/dist/resolution/frameworks/rust.d.ts.map +1 -0
  568. package/sensor/dist/resolution/frameworks/rust.js +304 -0
  569. package/sensor/dist/resolution/frameworks/rust.js.map +1 -0
  570. package/sensor/dist/resolution/frameworks/svelte.d.ts +9 -0
  571. package/sensor/dist/resolution/frameworks/svelte.d.ts.map +1 -0
  572. package/sensor/dist/resolution/frameworks/svelte.js +253 -0
  573. package/sensor/dist/resolution/frameworks/svelte.js.map +1 -0
  574. package/sensor/dist/resolution/frameworks/swift-objc.d.ts +37 -0
  575. package/sensor/dist/resolution/frameworks/swift-objc.d.ts.map +1 -0
  576. package/sensor/dist/resolution/frameworks/swift-objc.js +252 -0
  577. package/sensor/dist/resolution/frameworks/swift-objc.js.map +1 -0
  578. package/sensor/dist/resolution/frameworks/swift.d.ts +10 -0
  579. package/sensor/dist/resolution/frameworks/swift.d.ts.map +1 -0
  580. package/sensor/dist/resolution/frameworks/swift.js +400 -0
  581. package/sensor/dist/resolution/frameworks/swift.js.map +1 -0
  582. package/sensor/dist/resolution/frameworks/terraform.d.ts +38 -0
  583. package/sensor/dist/resolution/frameworks/terraform.d.ts.map +1 -0
  584. package/sensor/dist/resolution/frameworks/terraform.js +277 -0
  585. package/sensor/dist/resolution/frameworks/terraform.js.map +1 -0
  586. package/sensor/dist/resolution/frameworks/vue.d.ts +9 -0
  587. package/sensor/dist/resolution/frameworks/vue.d.ts.map +1 -0
  588. package/sensor/dist/resolution/frameworks/vue.js +303 -0
  589. package/sensor/dist/resolution/frameworks/vue.js.map +1 -0
  590. package/sensor/dist/resolution/go-module.d.ts +26 -0
  591. package/sensor/dist/resolution/go-module.d.ts.map +1 -0
  592. package/sensor/dist/resolution/go-module.js +78 -0
  593. package/sensor/dist/resolution/go-module.js.map +1 -0
  594. package/sensor/dist/resolution/goframe-synthesizer.d.ts +29 -0
  595. package/sensor/dist/resolution/goframe-synthesizer.d.ts.map +1 -0
  596. package/sensor/dist/resolution/goframe-synthesizer.js +163 -0
  597. package/sensor/dist/resolution/goframe-synthesizer.js.map +1 -0
  598. package/sensor/dist/resolution/import-resolver.d.ts +84 -0
  599. package/sensor/dist/resolution/import-resolver.d.ts.map +1 -0
  600. package/sensor/dist/resolution/import-resolver.js +2172 -0
  601. package/sensor/dist/resolution/import-resolver.js.map +1 -0
  602. package/sensor/dist/resolution/index.d.ts +309 -0
  603. package/sensor/dist/resolution/index.d.ts.map +1 -0
  604. package/sensor/dist/resolution/index.js +2050 -0
  605. package/sensor/dist/resolution/index.js.map +1 -0
  606. package/sensor/dist/resolution/lru-cache.d.ts +24 -0
  607. package/sensor/dist/resolution/lru-cache.d.ts.map +1 -0
  608. package/sensor/dist/resolution/lru-cache.js +62 -0
  609. package/sensor/dist/resolution/lru-cache.js.map +1 -0
  610. package/sensor/dist/resolution/name-matcher.d.ts +126 -0
  611. package/sensor/dist/resolution/name-matcher.d.ts.map +1 -0
  612. package/sensor/dist/resolution/name-matcher.js +1968 -0
  613. package/sensor/dist/resolution/name-matcher.js.map +1 -0
  614. package/sensor/dist/resolution/path-aliases.d.ts +68 -0
  615. package/sensor/dist/resolution/path-aliases.d.ts.map +1 -0
  616. package/sensor/dist/resolution/path-aliases.js +238 -0
  617. package/sensor/dist/resolution/path-aliases.js.map +1 -0
  618. package/sensor/dist/resolution/resolver-pool.d.ts +66 -0
  619. package/sensor/dist/resolution/resolver-pool.d.ts.map +1 -0
  620. package/sensor/dist/resolution/resolver-pool.js +244 -0
  621. package/sensor/dist/resolution/resolver-pool.js.map +1 -0
  622. package/sensor/dist/resolution/resolver-worker.d.ts +17 -0
  623. package/sensor/dist/resolution/resolver-worker.d.ts.map +1 -0
  624. package/sensor/dist/resolution/resolver-worker.js +114 -0
  625. package/sensor/dist/resolution/resolver-worker.js.map +1 -0
  626. package/sensor/dist/resolution/strip-comments.d.ts +27 -0
  627. package/sensor/dist/resolution/strip-comments.d.ts.map +1 -0
  628. package/sensor/dist/resolution/strip-comments.js +492 -0
  629. package/sensor/dist/resolution/strip-comments.js.map +1 -0
  630. package/sensor/dist/resolution/swift-objc-bridge.d.ts +134 -0
  631. package/sensor/dist/resolution/swift-objc-bridge.d.ts.map +1 -0
  632. package/sensor/dist/resolution/swift-objc-bridge.js +256 -0
  633. package/sensor/dist/resolution/swift-objc-bridge.js.map +1 -0
  634. package/sensor/dist/resolution/types.d.ts +265 -0
  635. package/sensor/dist/resolution/types.d.ts.map +1 -0
  636. package/sensor/dist/resolution/types.js +8 -0
  637. package/sensor/dist/resolution/types.js.map +1 -0
  638. package/sensor/dist/resolution/workspace-packages.d.ts +58 -0
  639. package/sensor/dist/resolution/workspace-packages.d.ts.map +1 -0
  640. package/sensor/dist/resolution/workspace-packages.js +346 -0
  641. package/sensor/dist/resolution/workspace-packages.js.map +1 -0
  642. package/sensor/dist/search/identifier-segments.d.ts +60 -0
  643. package/sensor/dist/search/identifier-segments.d.ts.map +1 -0
  644. package/sensor/dist/search/identifier-segments.js +176 -0
  645. package/sensor/dist/search/identifier-segments.js.map +1 -0
  646. package/sensor/dist/search/query-parser.d.ts +57 -0
  647. package/sensor/dist/search/query-parser.d.ts.map +1 -0
  648. package/sensor/dist/search/query-parser.js +177 -0
  649. package/sensor/dist/search/query-parser.js.map +1 -0
  650. package/sensor/dist/search/query-utils.d.ts +87 -0
  651. package/sensor/dist/search/query-utils.d.ts.map +1 -0
  652. package/sensor/dist/search/query-utils.js +449 -0
  653. package/sensor/dist/search/query-utils.js.map +1 -0
  654. package/sensor/dist/sync/git-hooks.d.ts +45 -0
  655. package/sensor/dist/sync/git-hooks.d.ts.map +1 -0
  656. package/sensor/dist/sync/git-hooks.js +227 -0
  657. package/sensor/dist/sync/git-hooks.js.map +1 -0
  658. package/sensor/dist/sync/index.d.ts +19 -0
  659. package/sensor/dist/sync/index.d.ts.map +1 -0
  660. package/sensor/dist/sync/index.js +35 -0
  661. package/sensor/dist/sync/index.js.map +1 -0
  662. package/sensor/dist/sync/watch-policy.d.ts +48 -0
  663. package/sensor/dist/sync/watch-policy.d.ts.map +1 -0
  664. package/sensor/dist/sync/watch-policy.js +124 -0
  665. package/sensor/dist/sync/watch-policy.js.map +1 -0
  666. package/sensor/dist/sync/watcher.d.ts +372 -0
  667. package/sensor/dist/sync/watcher.d.ts.map +1 -0
  668. package/sensor/dist/sync/watcher.js +879 -0
  669. package/sensor/dist/sync/watcher.js.map +1 -0
  670. package/sensor/dist/sync/worktree.d.ts +63 -0
  671. package/sensor/dist/sync/worktree.d.ts.map +1 -0
  672. package/sensor/dist/sync/worktree.js +182 -0
  673. package/sensor/dist/sync/worktree.js.map +1 -0
  674. package/sensor/dist/telemetry/index.d.ts +157 -0
  675. package/sensor/dist/telemetry/index.d.ts.map +1 -0
  676. package/sensor/dist/telemetry/index.js +556 -0
  677. package/sensor/dist/telemetry/index.js.map +1 -0
  678. package/sensor/dist/types.d.ts +458 -0
  679. package/sensor/dist/types.d.ts.map +1 -0
  680. package/sensor/dist/types.js +117 -0
  681. package/sensor/dist/types.js.map +1 -0
  682. package/sensor/dist/ui/color.d.ts +21 -0
  683. package/sensor/dist/ui/color.d.ts.map +1 -0
  684. package/sensor/dist/ui/color.js +42 -0
  685. package/sensor/dist/ui/color.js.map +1 -0
  686. package/sensor/dist/ui/glyphs.d.ts +67 -0
  687. package/sensor/dist/ui/glyphs.d.ts.map +1 -0
  688. package/sensor/dist/ui/glyphs.js +125 -0
  689. package/sensor/dist/ui/glyphs.js.map +1 -0
  690. package/sensor/dist/ui/shimmer-progress.d.ts +11 -0
  691. package/sensor/dist/ui/shimmer-progress.d.ts.map +1 -0
  692. package/sensor/dist/ui/shimmer-progress.js +164 -0
  693. package/sensor/dist/ui/shimmer-progress.js.map +1 -0
  694. package/sensor/dist/ui/shimmer-worker.d.ts +2 -0
  695. package/sensor/dist/ui/shimmer-worker.d.ts.map +1 -0
  696. package/sensor/dist/ui/shimmer-worker.js +126 -0
  697. package/sensor/dist/ui/shimmer-worker.js.map +1 -0
  698. package/sensor/dist/ui/types.d.ts +15 -0
  699. package/sensor/dist/ui/types.d.ts.map +1 -0
  700. package/sensor/dist/ui/types.js +3 -0
  701. package/sensor/dist/ui/types.js.map +1 -0
  702. package/sensor/dist/upgrade/index.d.ts +171 -0
  703. package/sensor/dist/upgrade/index.d.ts.map +1 -0
  704. package/sensor/dist/upgrade/index.js +659 -0
  705. package/sensor/dist/upgrade/index.js.map +1 -0
  706. package/sensor/dist/upgrade/remove-binary.d.ts +87 -0
  707. package/sensor/dist/upgrade/remove-binary.d.ts.map +1 -0
  708. package/sensor/dist/upgrade/remove-binary.js +289 -0
  709. package/sensor/dist/upgrade/remove-binary.js.map +1 -0
  710. package/sensor/dist/upgrade/update-check.d.ts +92 -0
  711. package/sensor/dist/upgrade/update-check.d.ts.map +1 -0
  712. package/sensor/dist/upgrade/update-check.js +258 -0
  713. package/sensor/dist/upgrade/update-check.js.map +1 -0
  714. package/sensor/dist/utils.d.ts +224 -0
  715. package/sensor/dist/utils.d.ts.map +1 -0
  716. package/sensor/dist/utils.js +583 -0
  717. package/sensor/dist/utils.js.map +1 -0
  718. package/sensor/package.json +61 -0
  719. package/src/artifact-contracts-v2.mjs +325 -0
  720. package/src/artifact-contracts.mjs +895 -0
  721. package/src/bootstrap.mjs +88 -0
  722. package/src/boundary-compiler.mjs +712 -0
  723. package/src/boundary-observation-compiler-v2.mjs +339 -0
  724. package/src/codegraph-adapter.mjs +422 -0
  725. package/src/control-compiler.mjs +532 -0
  726. package/src/factory-diagnostics.mjs +187 -0
  727. package/src/isolation-runner.mjs +333 -0
  728. package/src/node-version-guard.mjs +43 -0
  729. package/src/rc1-black-box-oracle.mjs +906 -0
  730. package/src/rc1-comparison.mjs +154 -0
  731. package/src/rc1-evidence-bundle.mjs +456 -0
  732. package/src/rc1-v4-campaign.mjs +707 -0
  733. package/src/rc1-v4-transform.mjs +467 -0
  734. package/src/rc1-v5-artifact-set.mjs +855 -0
  735. package/src/rc1-v5-behavior-evidence.mjs +594 -0
  736. package/src/rc1-v5-campaign.mjs +796 -0
  737. package/src/rc1-v5-transform.mjs +421 -0
  738. package/src/rc1-v6-artifact-set.mjs +807 -0
  739. package/src/rc1-v6-behavior-evidence.mjs +273 -0
  740. package/src/rc1-v6-campaign.mjs +623 -0
  741. package/src/rc1-v6-causal-binding.mjs +471 -0
  742. package/src/rc1-v6-measurement.mjs +331 -0
  743. package/src/rc2-artifact-set.mjs +1579 -0
  744. package/src/rc2-campaign.mjs +1520 -0
  745. package/src/rc2-delivery-policy-front-end.mjs +1079 -0
  746. package/src/rc2-delivery-policy-oracle.mjs +134 -0
  747. package/src/rc2-delivery-policy-transform.mjs +1127 -0
  748. package/src/rc2-rc1-transfer-front-end.mjs +511 -0
  749. package/src/rc3-actual-dogfood.mjs +648 -0
  750. package/src/rc3-dogfood-scaffold.mjs +310 -0
  751. package/src/rc3-scripted-campaign.mjs +1301 -0
  752. package/src/rc4-stage1-dogfood.mjs +652 -0
  753. package/src/runtime-cli.mjs +504 -0
  754. package/src/runtime-contracts.mjs +631 -0
  755. package/src/runtime-decision-verifier.mjs +607 -0
  756. package/src/runtime-diff-observer.mjs +265 -0
  757. package/src/runtime-engine.mjs +674 -0
  758. package/src/runtime-errors.mjs +356 -0
  759. package/src/runtime-event-store.mjs +217 -0
  760. package/src/runtime-front-end.mjs +764 -0
  761. package/src/runtime-hold-recompile.mjs +606 -0
  762. package/src/runtime-projection.mjs +180 -0
  763. package/src/runtime-scripted-executor.mjs +163 -0
  764. package/src/runtime-worktree-executor.mjs +199 -0
  765. package/src/schedulability-compiler-v2.mjs +303 -0
  766. package/src/schedulability-verifier-v2.mjs +317 -0
  767. package/src/seam-transform.mjs +554 -0
  768. package/src/treatment-compiler.mjs +728 -0
  769. package/src/treatment-runner.mjs +658 -0
@@ -0,0 +1,1579 @@
1
+ import { createHash } from 'node:crypto';
2
+ import { isDeepStrictEqual } from 'node:util';
3
+
4
+ import {
5
+ canonicalizeArtifact,
6
+ digestArtifact,
7
+ } from './artifact-contracts.mjs';
8
+ import { compileBoundaryCondition } from './boundary-compiler.mjs';
9
+ import { compileDeliveryPolicyBoundaryBundleV2 } from './rc2-delivery-policy-front-end.mjs';
10
+ import { expectedRc2DeliveryPolicyOracleReceipt } from './rc2-delivery-policy-oracle.mjs';
11
+ import { compileRc1TransferBundleV2 } from './rc2-rc1-transfer-front-end.mjs';
12
+ import {
13
+ validateRc1EvidenceBundle,
14
+ } from './rc1-evidence-bundle.mjs';
15
+ import { compileSchedulabilityGraphV2 } from './schedulability-compiler-v2.mjs';
16
+ import { verifySchedulabilityPlanV2 } from './schedulability-verifier-v2.mjs';
17
+
18
+ const SHA256 = /^[0-9a-f]{64}$/;
19
+ const GIT_SHA1 = /^[0-9a-f]{40}$/;
20
+ const RAW_EVIDENCE_CHUNK_BYTES = 12_000;
21
+ const RC2_ORACLE_PATH = 'src/rc2-delivery-policy-oracle.mjs';
22
+ const RC2_ORACLE_IDENTITY_REF = 'identity/rc2-delivery-policy-oracle.mjs';
23
+ const RC2_TRANSFORM_PATH = 'src/rc2-delivery-policy-transform.mjs';
24
+ const RC2_TRANSFORM_IDENTITY_REF = 'identity/rc2-delivery-policy-transform.mjs';
25
+ const LEGACY_WITNESS = Object.freeze({
26
+ epoch: 'delivery-policy-legacy-v1',
27
+ candidateDigest: '30ee67852f7ab5fb0d9bf82f2a4c55b6569a76507b0df5b329290c84d29b49f5',
28
+ oracleSourceDigest: 'c4012dfc00cc5b0194bd1a87be4a4e0b20d45e784d49a987768eea1b9932fafe',
29
+ });
30
+ const SEMANTIC_WITNESS = Object.freeze({
31
+ epoch: 'delivery-policy-semantic-v2',
32
+ candidateDigest: '4cc5d7bb428a8899353d18524c25105742fa90f89ee55d36064c4be3c52e2907',
33
+ oracleSourceDigest: 'c68a7ff9a7c9c4a181ceda6396d5fcbf27084de18680018d244a27998041652c',
34
+ });
35
+ const WITNESS_BY_VERSION = Object.freeze({
36
+ v1: LEGACY_WITNESS,
37
+ v2: LEGACY_WITNESS,
38
+ v3: SEMANTIC_WITNESS,
39
+ v4: SEMANTIC_WITNESS,
40
+ });
41
+
42
+ const PRIMARY_INPUT_PATHS = Object.freeze({
43
+ planInput: 'inputs/primary/plan-input.json',
44
+ candidateSpec: 'inputs/primary/candidate-spec-v1.json',
45
+ normalManualEvidence: 'inputs/primary/manual-evidence.normal.json',
46
+ partialManualEvidence: 'inputs/primary/manual-evidence.partial-state-negative.json',
47
+ unknownManualEvidence: 'inputs/primary/manual-evidence.third-only-unknown.json',
48
+ querySet: 'inputs/primary/query-set-v2.json',
49
+ });
50
+
51
+ const RC1_INPUT_PATHS = Object.freeze({
52
+ planInput: 'inputs/rc1/plan-input.json',
53
+ candidateSpec: 'inputs/rc1/candidate-spec-v2.json',
54
+ normalManualEvidence: 'inputs/rc1/manual-evidence.normal.json',
55
+ negativeManualEvidence: 'inputs/rc1/manual-evidence.shared-state-negative.json',
56
+ querySet: 'inputs/rc1/query-set-v2.json',
57
+ oracle: 'inputs/rc1/behavior-oracle-v2.json',
58
+ });
59
+
60
+ const CODEGRAPH_CONFIG_PATH = 'identity/codegraph-config.json';
61
+ // ratified config epochのallowlist。artifactのconfig bytesはこのいずれかと完全一致し、
62
+ // かつidentity.jsonのproject_config_digestと自己整合でなければreject(第三のbytesはfail closed)。
63
+ const CODEGRAPH_CONFIG_EPOCHS = Object.freeze([
64
+ // ADR 0040 epoch(RC2 v2〜v4 canonical artifactが保存する当時のratified config)
65
+ Buffer.from('{"exclude":["research/campaigns/**/artifacts/**/identity/"]}\n', 'utf8'),
66
+ // ADR 0044 Decision 10.3 epoch(research/runs/ event store除外、RC3-B以降のfresh実行)
67
+ Buffer.from(
68
+ '{"exclude":["research/campaigns/**/artifacts/**/identity/","research/runs/"]}\n',
69
+ 'utf8',
70
+ ),
71
+ ]);
72
+
73
+ const V1_IDENTITY_PATHS = Object.freeze([
74
+ 'identity/codegraph-adapter.mjs',
75
+ 'identity/codegraph-executable',
76
+ 'identity/rc1-black-box-oracle.mjs',
77
+ 'identity/rc1-boundary-compiler.mjs',
78
+ 'identity/rc1-evidence-bundle.mjs',
79
+ 'identity/rc2-artifact-set.mjs',
80
+ 'identity/rc2-campaign.mjs',
81
+ 'identity/rc2-delivery-policy-front-end.mjs',
82
+ 'identity/rc2-delivery-policy-oracle.mjs',
83
+ 'identity/rc2-delivery-policy-transform.mjs',
84
+ 'identity/rc2-rc1-transfer-front-end.mjs',
85
+ 'identity/schedulability-compiler-v2.mjs',
86
+ 'identity/schedulability-verifier-v2.mjs',
87
+ ]);
88
+
89
+ const V2_IDENTITY_PATHS = Object.freeze([
90
+ ...V1_IDENTITY_PATHS,
91
+ CODEGRAPH_CONFIG_PATH,
92
+ ]);
93
+
94
+ const V3_IDENTITY_PATHS = V2_IDENTITY_PATHS;
95
+ const V4_IDENTITY_PATHS = V3_IDENTITY_PATHS;
96
+
97
+ const V1_PREDECESSOR_PATHS = Object.freeze([
98
+ 'predecessors/adr-0031.md',
99
+ 'predecessors/adr-0032.md',
100
+ 'predecessors/adr-0037.md',
101
+ 'predecessors/adr-0038.md',
102
+ 'predecessors/rc1-v6-artifact-manifest.json',
103
+ 'predecessors/rc1-v6-plan.md',
104
+ 'predecessors/rc1-v6-seam.patch',
105
+ 'predecessors/rc1-v6-transform-artifact.json',
106
+ 'predecessors/rc1-v6-transform-receipt.json',
107
+ ]);
108
+
109
+ const V2_PREDECESSOR_PATHS = Object.freeze([
110
+ ...V1_PREDECESSOR_PATHS,
111
+ 'predecessors/adr-0040.md',
112
+ 'predecessors/rc2-v1-artifact-manifest.json',
113
+ 'predecessors/rc2-v1-new-plan-version.json',
114
+ ]);
115
+
116
+ const V3_PREDECESSOR_PATHS = Object.freeze([
117
+ ...V2_PREDECESSOR_PATHS,
118
+ 'predecessors/adr-0041.md',
119
+ 'predecessors/rc2-semantic-reseal-characterization.md',
120
+ 'predecessors/rc2-v2-artifact-manifest.json',
121
+ 'predecessors/rc2-v2-new-plan-version.json',
122
+ ]);
123
+
124
+ const V4_PREDECESSOR_PATHS = Object.freeze([
125
+ ...V3_PREDECESSOR_PATHS,
126
+ 'predecessors/adr-0042.md',
127
+ 'predecessors/rc2-v3-version-downgrade-refutation.md',
128
+ 'predecessors/rc2-v3-artifact-manifest.json',
129
+ 'predecessors/rc2-v3-new-plan-version.json',
130
+ ]);
131
+
132
+ const BYTE_PRESERVING_JSON_PATHS = new Set([
133
+ 'predecessors/rc1-v6-artifact-manifest.json',
134
+ 'predecessors/rc1-v6-transform-artifact.json',
135
+ 'predecessors/rc1-v6-transform-receipt.json',
136
+ CODEGRAPH_CONFIG_PATH,
137
+ ]);
138
+
139
+ const TRANSFORM_PATHS = Object.freeze([
140
+ 'transform/accepted-artifact.json',
141
+ 'transform/accepted-receipt.json',
142
+ 'transform/behavior-evidence.json',
143
+ 'transform/mutation-evidence.json',
144
+ 'transform/rejected-incomplete-artifact.json',
145
+ 'transform/rejected-incomplete-receipt.json',
146
+ 'transform/rejected-scope-artifact.json',
147
+ 'transform/rejected-scope-receipt.json',
148
+ 'transform/seam.patch',
149
+ ]);
150
+
151
+ const RUN_IDS = Object.freeze([
152
+ 'primary-control-1',
153
+ 'primary-control-2',
154
+ 'primary-treatment-1',
155
+ 'primary-treatment-2',
156
+ 'rc1-transfer-control-1',
157
+ 'rc1-transfer-treatment-1',
158
+ ]);
159
+
160
+ const COMPILED_PATHS = Object.freeze([
161
+ 'compiled/primary-control-1-normal.json',
162
+ 'compiled/primary-control-2-normal.json',
163
+ 'compiled/primary-treatment-1-normal.json',
164
+ 'compiled/primary-treatment-2-normal.json',
165
+ 'compiled/primary-treatment-capacity-2.json',
166
+ 'compiled/primary-treatment-partial-state.json',
167
+ 'compiled/primary-treatment-third-only-unknown.json',
168
+ 'compiled/rc1-transfer-control-negative.json',
169
+ 'compiled/rc1-transfer-control-normal.json',
170
+ 'compiled/rc1-transfer-treatment-negative.json',
171
+ 'compiled/rc1-transfer-treatment-normal.json',
172
+ ]);
173
+
174
+ const SUMMARY_PATHS = Object.freeze([
175
+ 'comparison.json',
176
+ 'cost.json',
177
+ 'execution-evidence.json',
178
+ 'hypothesis-evaluation.json',
179
+ 'identity.json',
180
+ 'new-plan-version.json',
181
+ 'plan-diff.json',
182
+ ]);
183
+
184
+ const RC2_V1_ARTIFACT_PATHS = Object.freeze([
185
+ ...Object.values(PRIMARY_INPUT_PATHS),
186
+ ...Object.values(RC1_INPUT_PATHS),
187
+ ...V1_IDENTITY_PATHS,
188
+ ...V1_PREDECESSOR_PATHS,
189
+ ...TRANSFORM_PATHS,
190
+ ...RUN_IDS.map((runId) => `evidence/${runId}.json`),
191
+ ...COMPILED_PATHS,
192
+ ...SUMMARY_PATHS,
193
+ ].sort());
194
+
195
+ const RC2_V2_ARTIFACT_PATHS = Object.freeze([
196
+ ...Object.values(PRIMARY_INPUT_PATHS),
197
+ ...Object.values(RC1_INPUT_PATHS),
198
+ ...V2_IDENTITY_PATHS,
199
+ ...V2_PREDECESSOR_PATHS,
200
+ ...TRANSFORM_PATHS,
201
+ ...RUN_IDS.map((runId) => `evidence/${runId}.json`),
202
+ ...COMPILED_PATHS,
203
+ ...SUMMARY_PATHS,
204
+ ].sort());
205
+
206
+ const RC2_V3_ARTIFACT_PATHS = Object.freeze([
207
+ ...Object.values(PRIMARY_INPUT_PATHS),
208
+ ...Object.values(RC1_INPUT_PATHS),
209
+ ...V3_IDENTITY_PATHS,
210
+ ...V3_PREDECESSOR_PATHS,
211
+ ...TRANSFORM_PATHS,
212
+ ...RUN_IDS.map((runId) => `evidence/${runId}.json`),
213
+ ...COMPILED_PATHS,
214
+ ...SUMMARY_PATHS,
215
+ ].sort());
216
+
217
+ export const RC2_ARTIFACT_PATHS = Object.freeze([
218
+ ...Object.values(PRIMARY_INPUT_PATHS),
219
+ ...Object.values(RC1_INPUT_PATHS),
220
+ ...V4_IDENTITY_PATHS,
221
+ ...V4_PREDECESSOR_PATHS,
222
+ ...TRANSFORM_PATHS,
223
+ ...RUN_IDS.map((runId) => `evidence/${runId}.json`),
224
+ ...COMPILED_PATHS,
225
+ ...SUMMARY_PATHS,
226
+ ].sort());
227
+
228
+ function plainRecord(value) {
229
+ return value !== null
230
+ && typeof value === 'object'
231
+ && !Array.isArray(value)
232
+ && Object.getPrototypeOf(value) === Object.prototype;
233
+ }
234
+
235
+ function exactRecord(value, keys) {
236
+ if (!plainRecord(value)) return false;
237
+ const actual = Object.keys(value).sort();
238
+ const expected = [...keys].sort();
239
+ return actual.length === expected.length
240
+ && actual.every((key, index) => key === expected[index]);
241
+ }
242
+
243
+ function sha256(bytes) {
244
+ return createHash('sha256').update(bytes).digest('hex');
245
+ }
246
+
247
+ function jsonBytes(value) {
248
+ return Buffer.from(canonicalizeArtifact(value), 'utf8');
249
+ }
250
+
251
+ function sameArtifact(left, right) {
252
+ try {
253
+ return digestArtifact(left) === digestArtifact(right);
254
+ } catch {
255
+ return false;
256
+ }
257
+ }
258
+
259
+ function mediaType(relativePath) {
260
+ if (relativePath.endsWith('.json')) return 'application/json';
261
+ if (relativePath.endsWith('.mjs')) return 'application/javascript';
262
+ if (relativePath.endsWith('.patch')) return 'text/x-diff';
263
+ if (relativePath.endsWith('.md')) return 'text/markdown';
264
+ return 'application/octet-stream';
265
+ }
266
+
267
+ function payloadMap(payloads) {
268
+ if (!Array.isArray(payloads)) return null;
269
+ const result = new Map();
270
+ for (const payload of payloads) {
271
+ if (!exactRecord(payload, ['path', 'bytes'])
272
+ || typeof payload.path !== 'string'
273
+ || !Buffer.isBuffer(payload.bytes)
274
+ || result.has(payload.path)) {
275
+ return null;
276
+ }
277
+ result.set(payload.path, payload.bytes);
278
+ }
279
+ return result;
280
+ }
281
+
282
+ function parseCanonicalJson(bytes) {
283
+ try {
284
+ const value = JSON.parse(bytes.toString('utf8'));
285
+ return jsonBytes(value).equals(bytes) ? value : null;
286
+ } catch {
287
+ return null;
288
+ }
289
+ }
290
+
291
+ function parseOpaqueJson(bytes) {
292
+ try {
293
+ return JSON.parse(bytes.toString('utf8'));
294
+ } catch {
295
+ return null;
296
+ }
297
+ }
298
+
299
+ function artifactContract(manifest) {
300
+ if (manifest?.schema === 'lattice.rc2.artifact_manifest.v1') {
301
+ return {
302
+ artifactVersion: 'v1',
303
+ artifactPaths: RC2_V1_ARTIFACT_PATHS,
304
+ identityPaths: V1_IDENTITY_PATHS,
305
+ predecessorPaths: V1_PREDECESSOR_PATHS,
306
+ witness: WITNESS_BY_VERSION.v1,
307
+ };
308
+ }
309
+ if (manifest?.schema === 'lattice.rc2.artifact_manifest.v2') {
310
+ return {
311
+ artifactVersion: 'v2',
312
+ artifactPaths: RC2_V2_ARTIFACT_PATHS,
313
+ identityPaths: V2_IDENTITY_PATHS,
314
+ predecessorPaths: V2_PREDECESSOR_PATHS,
315
+ witness: WITNESS_BY_VERSION.v2,
316
+ };
317
+ }
318
+ if (manifest?.schema === 'lattice.rc2.artifact_manifest.v3') {
319
+ return {
320
+ artifactVersion: 'v3',
321
+ artifactPaths: RC2_V3_ARTIFACT_PATHS,
322
+ identityPaths: V3_IDENTITY_PATHS,
323
+ predecessorPaths: V3_PREDECESSOR_PATHS,
324
+ witness: WITNESS_BY_VERSION.v3,
325
+ };
326
+ }
327
+ if (manifest?.schema === 'lattice.rc2.artifact_manifest.v4') {
328
+ return {
329
+ artifactVersion: 'v4',
330
+ artifactPaths: RC2_ARTIFACT_PATHS,
331
+ identityPaths: V4_IDENTITY_PATHS,
332
+ predecessorPaths: V4_PREDECESSOR_PATHS,
333
+ witness: WITNESS_BY_VERSION.v4,
334
+ };
335
+ }
336
+ return null;
337
+ }
338
+
339
+ function artifactContext(options) {
340
+ if (!exactRecord(options, ['manifest', 'payloads'])) return null;
341
+ const payloads = payloadMap(options.payloads);
342
+ const manifest = options.manifest;
343
+ const contract = artifactContract(manifest);
344
+ if (!payloads
345
+ || contract === null
346
+ || !exactRecord(manifest, ['schema', 'base_sha', 'result_digest', 'files'])
347
+ || !GIT_SHA1.test(manifest.base_sha)
348
+ || !SHA256.test(manifest.result_digest)
349
+ || !Array.isArray(manifest.files)) {
350
+ return null;
351
+ }
352
+ const manifestPaths = manifest.files.map(({ path: relativePath }) => relativePath).sort();
353
+ if (!sameArtifact(manifestPaths, contract.artifactPaths)
354
+ || !sameArtifact([...payloads.keys()].sort(), contract.artifactPaths)) {
355
+ return null;
356
+ }
357
+ for (const entry of manifest.files) {
358
+ const bytes = payloads.get(entry.path);
359
+ if (!exactRecord(entry, ['path', 'media_type', 'bytes', 'sha256'])
360
+ || !Buffer.isBuffer(bytes)
361
+ || entry.media_type !== mediaType(entry.path)
362
+ || entry.bytes !== bytes.byteLength
363
+ || entry.sha256 !== sha256(bytes)) {
364
+ return null;
365
+ }
366
+ }
367
+ const json = new Map();
368
+ for (const relativePath of contract.artifactPaths.filter((entry) => entry.endsWith('.json'))) {
369
+ const parsed = BYTE_PRESERVING_JSON_PATHS.has(relativePath)
370
+ ? parseOpaqueJson(payloads.get(relativePath))
371
+ : parseCanonicalJson(payloads.get(relativePath));
372
+ if (parsed === null) return null;
373
+ json.set(relativePath, parsed);
374
+ }
375
+ return { manifest, payloads, json, ...contract };
376
+ }
377
+
378
+ function objectFromPaths(context, paths) {
379
+ return Object.fromEntries(Object.entries(paths).map(([key, relativePath]) => (
380
+ [key, context.json.get(relativePath)]
381
+ )));
382
+ }
383
+
384
+ function stripDigest(value, key) {
385
+ if (!plainRecord(value) || !Object.hasOwn(value, key)) return null;
386
+ const result = structuredClone(value);
387
+ delete result[key];
388
+ return result;
389
+ }
390
+
391
+ function verifyIdentity(context) {
392
+ const identity = context.json.get('identity.json');
393
+ const projectConfigBound = context.artifactVersion !== 'v1';
394
+ const expectedIdentitySchema = `lattice.rc2.execution_identity.${context.artifactVersion}`;
395
+ const expectedCodegraphSchema = projectConfigBound
396
+ ? 'lattice.rc2.codegraph_identity.v2'
397
+ : 'lattice.rc2.codegraph_identity.v1';
398
+ const codegraphKeys = projectConfigBound
399
+ ? [
400
+ 'schema',
401
+ 'version',
402
+ 'executable_ref',
403
+ 'executable_digest',
404
+ 'project_config_ref',
405
+ 'project_config_digest',
406
+ ]
407
+ : ['schema', 'version', 'executable_ref', 'executable_digest'];
408
+ if (!exactRecord(identity, [
409
+ 'schema',
410
+ 'sources',
411
+ 'codegraph_identity',
412
+ 'codegraph_identity_digest',
413
+ 'before_digest',
414
+ 'after_digest',
415
+ ])
416
+ || identity.schema !== expectedIdentitySchema
417
+ || !Array.isArray(identity.sources)
418
+ || identity.sources.length !== V1_IDENTITY_PATHS.length - 1
419
+ || !exactRecord(identity.codegraph_identity, codegraphKeys)
420
+ || identity.codegraph_identity.schema !== expectedCodegraphSchema
421
+ || !SHA256.test(identity.codegraph_identity.executable_digest)
422
+ || identity.codegraph_identity.executable_digest
423
+ !== sha256(context.payloads.get('identity/codegraph-executable'))
424
+ || (projectConfigBound && (
425
+ identity.codegraph_identity.project_config_ref !== CODEGRAPH_CONFIG_PATH
426
+ || !SHA256.test(identity.codegraph_identity.project_config_digest)
427
+ || identity.codegraph_identity.project_config_digest
428
+ !== sha256(context.payloads.get(CODEGRAPH_CONFIG_PATH))
429
+ ))
430
+ || identity.codegraph_identity_digest !== digestArtifact(identity.codegraph_identity)) {
431
+ return false;
432
+ }
433
+ const expectedSourceRefs = V1_IDENTITY_PATHS
434
+ .filter((relativePath) => relativePath !== 'identity/codegraph-executable');
435
+ const actualRefs = identity.sources.map(({ artifact_ref: ref }) => ref).sort();
436
+ if (!sameArtifact(actualRefs, expectedSourceRefs)) return false;
437
+ for (const source of identity.sources) {
438
+ if (!exactRecord(source, ['runtime_path', 'artifact_ref', 'digest'])
439
+ || typeof source.runtime_path !== 'string'
440
+ || !expectedSourceRefs.includes(source.artifact_ref)
441
+ || source.digest !== sha256(context.payloads.get(source.artifact_ref))) {
442
+ return false;
443
+ }
444
+ }
445
+ const snapshot = {
446
+ sources: identity.sources.map(({ runtime_path: runtimePath, artifact_ref: artifactRef, digest }) => ({
447
+ runtime_path: runtimePath,
448
+ artifact_ref: artifactRef,
449
+ digest,
450
+ })),
451
+ codegraph_identity: identity.codegraph_identity,
452
+ };
453
+ const digest = digestArtifact(snapshot);
454
+ return identity.before_digest === digest && identity.after_digest === digest;
455
+ }
456
+
457
+ function verifyCodegraphConfig(context) {
458
+ if (context.artifactVersion === 'v1') return false;
459
+ const bytes = context.payloads.get(CODEGRAPH_CONFIG_PATH);
460
+ const identity = context.json.get('identity.json');
461
+ return Buffer.isBuffer(bytes)
462
+ && CODEGRAPH_CONFIG_EPOCHS.some((epochBytes) => bytes.equals(epochBytes))
463
+ && identity?.codegraph_identity?.project_config_ref === CODEGRAPH_CONFIG_PATH
464
+ && identity.codegraph_identity.project_config_digest === sha256(bytes);
465
+ }
466
+
467
+ function verifySurfaceSnapshot(snapshot, expectedPaths, expectedPresentPaths) {
468
+ if (!exactRecord(snapshot, ['schema', 'files', 'digest'])
469
+ || snapshot.schema !== 'lattice.rc2.delivery_policy_surface_snapshot.v1'
470
+ || !Array.isArray(snapshot.files)
471
+ || !isDeepStrictEqual(snapshot.files.map(({ path: relativePath }) => relativePath), expectedPaths)
472
+ || snapshot.files.some((file) => (
473
+ !exactRecord(file, ['path', 'state', 'content_digest'])
474
+ || (expectedPresentPaths.has(file.path)
475
+ ? file.state !== 'present' || !SHA256.test(file.content_digest)
476
+ : file.state !== 'absent' || file.content_digest !== null)
477
+ ))) {
478
+ return false;
479
+ }
480
+ return snapshot.digest === digestArtifact({ schema: snapshot.schema, files: snapshot.files });
481
+ }
482
+
483
+ function expectedMutationContract(candidate) {
484
+ if (!plainRecord(candidate)
485
+ || candidate.schema !== 'lattice.rc2.boundary_candidate_spec.v1'
486
+ || typeof candidate.candidate_id !== 'string'
487
+ || !plainRecord(candidate.fixed_oracle)
488
+ || candidate.fixed_oracle.path !== RC2_ORACLE_PATH
489
+ || !SHA256.test(candidate.fixed_oracle.source_digest)
490
+ || !Array.isArray(candidate.fixed_oracle.case_ids)
491
+ || !Array.isArray(candidate.todos)
492
+ || candidate.todos.length !== 3
493
+ || !Array.isArray(candidate.stable_surfaces)) {
494
+ return null;
495
+ }
496
+ const compositionSurfaces = candidate.stable_surfaces.filter(({ role }) => (
497
+ role === 'composition-test'
498
+ ));
499
+ if (compositionSurfaces.length !== 1) return null;
500
+ const composition = compositionSurfaces[0];
501
+ if (typeof composition.target !== 'string' || typeof composition.path !== 'string') return null;
502
+
503
+ const contracts = [];
504
+ const rows = [];
505
+ const surfacePaths = new Set([candidate.fixed_oracle.path]);
506
+ const controlPaths = new Set([candidate.fixed_oracle.path]);
507
+ for (const todo of candidate.todos) {
508
+ if (!plainRecord(todo)
509
+ || typeof todo.todo_id !== 'string'
510
+ || !Array.isArray(todo.case_ids)
511
+ || todo.case_ids.length !== 2
512
+ || !plainRecord(todo.current)
513
+ || !plainRecord(todo.proposed)
514
+ || !plainRecord(todo.current.production)
515
+ || !plainRecord(todo.proposed.production)
516
+ || !Array.isArray(todo.current.tests)
517
+ || !Array.isArray(todo.proposed.tests)
518
+ || todo.proposed.tests.length !== 1) {
519
+ return null;
520
+ }
521
+ const production = todo.proposed.production;
522
+ const test = todo.proposed.tests[0];
523
+ if (typeof production.symbol !== 'string'
524
+ || typeof production.path !== 'string'
525
+ || typeof test.symbol !== 'string'
526
+ || typeof test.path !== 'string'
527
+ || todo.case_ids.some((caseId) => typeof caseId !== 'string')) {
528
+ return null;
529
+ }
530
+ contracts.push({ testId: test.symbol, path: test.path });
531
+ rows.push(...todo.case_ids.map((caseId) => ({
532
+ caseId,
533
+ todoId: todo.todo_id,
534
+ resolver: production.symbol,
535
+ productionPath: production.path,
536
+ ownerTestId: test.symbol,
537
+ })));
538
+ for (const mode of [todo.current, todo.proposed]) {
539
+ if (typeof mode.production?.path !== 'string'
540
+ || mode.tests.some(({ path: testPath }) => typeof testPath !== 'string')) {
541
+ return null;
542
+ }
543
+ surfacePaths.add(mode.production.path);
544
+ mode.tests.forEach(({ path: testPath }) => surfacePaths.add(testPath));
545
+ }
546
+ controlPaths.add(todo.current.production.path);
547
+ todo.current.tests.forEach(({ path: testPath }) => controlPaths.add(testPath));
548
+ }
549
+ contracts.push({ testId: composition.target, path: composition.path });
550
+ if (new Set(contracts.map(({ testId }) => testId)).size !== contracts.length
551
+ || new Set(contracts.map(({ path: testPath }) => testPath)).size !== contracts.length
552
+ || !isDeepStrictEqual(rows.map(({ caseId }) => caseId), candidate.fixed_oracle.case_ids)
553
+ || new Set(candidate.fixed_oracle.case_ids).size !== candidate.fixed_oracle.case_ids.length) {
554
+ return null;
555
+ }
556
+ return {
557
+ contracts,
558
+ rows,
559
+ surfacePaths: [...surfacePaths].sort(),
560
+ controlPaths,
561
+ };
562
+ }
563
+
564
+ function verifyMutationEvidence(mutation, expected, outputDigest, candidateDigest, caseSetDigest) {
565
+ if (!exactRecord(mutation, [
566
+ 'schema',
567
+ 'candidate_digest',
568
+ 'case_set_digest',
569
+ 'rows',
570
+ 'matrix_digest',
571
+ 'evidence_digest',
572
+ ])
573
+ || mutation.schema !== 'lattice.rc2.delivery_policy_mutation_evidence.v1'
574
+ || mutation.candidate_digest !== candidateDigest
575
+ || mutation.case_set_digest !== caseSetDigest
576
+ || !Array.isArray(mutation.rows)
577
+ || mutation.rows.length !== expected.rows.length) {
578
+ return false;
579
+ }
580
+ for (let rowIndex = 0; rowIndex < expected.rows.length; rowIndex += 1) {
581
+ const row = mutation.rows[rowIndex];
582
+ const expectedRow = expected.rows[rowIndex];
583
+ if (!exactRecord(row, [
584
+ 'case_id',
585
+ 'owner_todo_id',
586
+ 'resolver_symbol',
587
+ 'mutated_path',
588
+ 'oracle_mismatch_id',
589
+ 'cells',
590
+ 'restore_digest',
591
+ ])
592
+ || row.case_id !== expectedRow.caseId
593
+ || row.owner_todo_id !== expectedRow.todoId
594
+ || row.resolver_symbol !== expectedRow.resolver
595
+ || row.mutated_path !== expectedRow.productionPath
596
+ || row.oracle_mismatch_id !== expectedRow.caseId
597
+ || row.restore_digest !== outputDigest
598
+ || !Array.isArray(row.cells)
599
+ || row.cells.length !== expected.contracts.length) {
600
+ return false;
601
+ }
602
+ for (let cellIndex = 0; cellIndex < expected.contracts.length; cellIndex += 1) {
603
+ const cell = row.cells[cellIndex];
604
+ const contract = expected.contracts[cellIndex];
605
+ const owner = contract.testId === expectedRow.ownerTestId;
606
+ if (!exactRecord(cell, [
607
+ 'test_id', 'path', 'outcome', 'exit_code', 'stdout_digest', 'stderr_digest',
608
+ ])
609
+ || cell.test_id !== contract.testId
610
+ || cell.path !== contract.path
611
+ || !Number.isSafeInteger(cell.exit_code)
612
+ || cell.exit_code < 0
613
+ || !SHA256.test(cell.stdout_digest)
614
+ || !SHA256.test(cell.stderr_digest)
615
+ || (owner
616
+ ? cell.outcome !== 'failed' || cell.exit_code === 0
617
+ : cell.outcome !== 'passed' || cell.exit_code !== 0)) {
618
+ return false;
619
+ }
620
+ }
621
+ }
622
+ const mutationBase = stripDigest(mutation, 'evidence_digest');
623
+ return mutation.matrix_digest === digestArtifact({ rows: mutation.rows })
624
+ && mutationBase !== null
625
+ && mutation.evidence_digest === digestArtifact(mutationBase);
626
+ }
627
+
628
+ function verifyTransformSemantics(context, accepted, behavior, mutation) {
629
+ try {
630
+ const candidate = context.json.get(PRIMARY_INPUT_PATHS.candidateSpec);
631
+ const expected = expectedMutationContract(candidate);
632
+ const oracleReceipt = expectedRc2DeliveryPolicyOracleReceipt();
633
+ const candidateDigest = digestArtifact(candidate);
634
+ const oracleIdentityBytes = context.payloads.get(RC2_ORACLE_IDENTITY_REF);
635
+ const transformIdentityBytes = context.payloads.get(RC2_TRANSFORM_IDENTITY_REF);
636
+ if (expected === null
637
+ || !Buffer.isBuffer(oracleIdentityBytes)
638
+ || !Buffer.isBuffer(transformIdentityBytes)
639
+ || !exactRecord(behavior, [
640
+ 'schema',
641
+ 'candidate_digest',
642
+ 'adapter_source_digest',
643
+ 'control_snapshot',
644
+ 'output_snapshot',
645
+ 'fixed_oracle',
646
+ 'pre_oracle',
647
+ 'post_oracle',
648
+ 'case_set_digest',
649
+ 'equivalent',
650
+ 'evidence_digest',
651
+ ])
652
+ || behavior.schema !== 'lattice.rc2.delivery_policy_behavior_evidence.v1'
653
+ || !exactRecord(behavior.fixed_oracle, ['path', 'source_base64', 'source_digest'])
654
+ || behavior.fixed_oracle.path !== RC2_ORACLE_PATH
655
+ || typeof behavior.fixed_oracle.source_base64 !== 'string') {
656
+ return false;
657
+ }
658
+ const oracleBytes = Buffer.from(behavior.fixed_oracle.source_base64, 'base64');
659
+ if (oracleBytes.toString('base64') !== behavior.fixed_oracle.source_base64
660
+ || !oracleBytes.equals(oracleIdentityBytes)
661
+ || sha256(oracleBytes) !== behavior.fixed_oracle.source_digest
662
+ || behavior.fixed_oracle.source_digest !== candidate.fixed_oracle.source_digest
663
+ || behavior.fixed_oracle.source_digest !== accepted?.source?.fixed_oracle?.source_digest
664
+ || accepted.source.fixed_oracle.path !== RC2_ORACLE_PATH
665
+ || candidateDigest !== context.witness.candidateDigest
666
+ || behavior.fixed_oracle.source_digest !== context.witness.oracleSourceDigest
667
+ || behavior.candidate_digest !== candidateDigest
668
+ || mutation?.candidate_digest !== candidateDigest
669
+ || accepted?.candidate?.candidate_id !== candidate.candidate_id
670
+ || accepted.candidate.digest !== candidateDigest
671
+ || behavior.adapter_source_digest !== sha256(transformIdentityBytes)
672
+ || accepted?.source?.adapter?.path !== RC2_TRANSFORM_PATH
673
+ || accepted.source.adapter.digest !== behavior.adapter_source_digest
674
+ || !isDeepStrictEqual(behavior.pre_oracle, oracleReceipt)
675
+ || !isDeepStrictEqual(behavior.post_oracle, oracleReceipt)) {
676
+ return false;
677
+ }
678
+ const expectedCaseSetDigest = digestArtifact({
679
+ case_results: oracleReceipt.case_results.map(({ id, output_digest: outputDigest }) => ({
680
+ id,
681
+ output_digest: outputDigest,
682
+ })),
683
+ });
684
+ const outputPaths = new Set(expected.surfacePaths);
685
+ if (behavior.case_set_digest !== expectedCaseSetDigest
686
+ || mutation.case_set_digest !== expectedCaseSetDigest
687
+ || accepted.behavior?.case_set_digest !== expectedCaseSetDigest
688
+ || accepted.behavior?.pre_oracle_digest !== digestArtifact(oracleReceipt)
689
+ || accepted.behavior?.post_oracle_digest !== digestArtifact(oracleReceipt)
690
+ || accepted.behavior?.equivalent !== true
691
+ || behavior.equivalent !== true
692
+ || !verifySurfaceSnapshot(behavior.control_snapshot, expected.surfacePaths, expected.controlPaths)
693
+ || !verifySurfaceSnapshot(behavior.output_snapshot, expected.surfacePaths, outputPaths)
694
+ || !isDeepStrictEqual(accepted.output?.files, behavior.output_snapshot.files)
695
+ || accepted.output.snapshot_digest !== behavior.output_snapshot.digest
696
+ || accepted.source.control_snapshot_digest !== behavior.control_snapshot.digest
697
+ || behavior.control_snapshot.files.find(({ path: relativePath }) => (
698
+ relativePath === RC2_ORACLE_PATH
699
+ ))?.content_digest !== behavior.fixed_oracle.source_digest
700
+ || behavior.output_snapshot.files.find(({ path: relativePath }) => (
701
+ relativePath === RC2_ORACLE_PATH
702
+ ))?.content_digest !== behavior.fixed_oracle.source_digest) {
703
+ return false;
704
+ }
705
+ const behaviorBase = stripDigest(behavior, 'evidence_digest');
706
+ if (behaviorBase === null
707
+ || behavior.evidence_digest !== digestArtifact(behaviorBase)
708
+ || accepted.behavior.evidence_digest !== behavior.evidence_digest
709
+ || !verifyMutationEvidence(
710
+ mutation,
711
+ expected,
712
+ behavior.output_snapshot.digest,
713
+ candidateDigest,
714
+ expectedCaseSetDigest,
715
+ )) {
716
+ return false;
717
+ }
718
+ return accepted.mutation?.evidence_digest === mutation.evidence_digest
719
+ && accepted.mutation.matrix_digest === mutation.matrix_digest
720
+ && accepted.mutation.row_count === expected.rows.length
721
+ && accepted.mutation.cell_count === expected.rows.length * expected.contracts.length;
722
+ } catch {
723
+ return false;
724
+ }
725
+ }
726
+
727
+ function verifyTransform(context) {
728
+ const accepted = context.json.get('transform/accepted-artifact.json');
729
+ const acceptedReceipt = context.json.get('transform/accepted-receipt.json');
730
+ const behavior = context.json.get('transform/behavior-evidence.json');
731
+ const mutation = context.json.get('transform/mutation-evidence.json');
732
+ const incomplete = context.json.get('transform/rejected-incomplete-artifact.json');
733
+ const incompleteReceipt = context.json.get('transform/rejected-incomplete-receipt.json');
734
+ const scope = context.json.get('transform/rejected-scope-artifact.json');
735
+ const scopeReceipt = context.json.get('transform/rejected-scope-receipt.json');
736
+ const patch = context.payloads.get('transform/seam.patch');
737
+ const behaviorBase = stripDigest(behavior, 'evidence_digest');
738
+ const mutationBase = stripDigest(mutation, 'evidence_digest');
739
+ const acceptedReceiptBase = stripDigest(acceptedReceipt, 'receipt_digest');
740
+ const incompleteReceiptBase = stripDigest(incompleteReceipt, 'receipt_digest');
741
+ const scopeReceiptBase = stripDigest(scopeReceipt, 'receipt_digest');
742
+ return accepted?.schema === 'lattice.rc2.delivery_policy_transform_artifact.v1'
743
+ && accepted.status === 'accepted'
744
+ && exactRecord(accepted.candidate, ['candidate_id', 'digest'])
745
+ && accepted.candidate.digest === context.witness.candidateDigest
746
+ && exactRecord(accepted.source, [
747
+ 'adapter',
748
+ 'base_sha',
749
+ 'control_snapshot_digest',
750
+ 'fixed_oracle',
751
+ ])
752
+ && exactRecord(accepted.source.adapter, ['path', 'digest'])
753
+ && exactRecord(accepted.source.fixed_oracle, ['path', 'source_digest'])
754
+ && accepted.source.base_sha === context.manifest.base_sha
755
+ && accepted.source.fixed_oracle.source_digest === context.witness.oracleSourceDigest
756
+ && accepted.patch?.digest === sha256(patch)
757
+ && accepted.patch?.bytes === patch.byteLength
758
+ && accepted.output?.snapshot_digest === behavior?.output_snapshot?.digest
759
+ && accepted.source?.control_snapshot_digest === behavior?.control_snapshot?.digest
760
+ && accepted.source?.fixed_oracle?.source_digest === behavior?.fixed_oracle?.source_digest
761
+ && accepted.behavior?.evidence_digest === behavior?.evidence_digest
762
+ && behaviorBase !== null
763
+ && behavior.evidence_digest === digestArtifact(behaviorBase)
764
+ && accepted.mutation?.evidence_digest === mutation?.evidence_digest
765
+ && mutationBase !== null
766
+ && mutation.evidence_digest === digestArtifact(mutationBase)
767
+ && acceptedReceipt?.status === 'accepted'
768
+ && acceptedReceipt.transform_artifact_digest === digestArtifact(accepted)
769
+ && acceptedReceipt.behavior_evidence_digest === behavior.evidence_digest
770
+ && acceptedReceipt.mutation_evidence_digest === mutation.evidence_digest
771
+ && acceptedReceiptBase !== null
772
+ && acceptedReceipt.receipt_digest === digestArtifact(acceptedReceiptBase)
773
+ && incomplete?.status === 'rejected'
774
+ && incomplete?.rejection?.kind === 'incomplete_transform'
775
+ && incomplete.output === null
776
+ && sameArtifact(incomplete.candidate, accepted.candidate)
777
+ && sameArtifact(incomplete.source, accepted.source)
778
+ && incompleteReceipt?.status === 'rejected'
779
+ && incompleteReceipt.transform_artifact_digest === digestArtifact(incomplete)
780
+ && incompleteReceiptBase !== null
781
+ && incompleteReceipt.receipt_digest === digestArtifact(incompleteReceiptBase)
782
+ && scope?.status === 'rejected'
783
+ && scope?.rejection?.kind === 'scope_violation'
784
+ && scope.output === null
785
+ && sameArtifact(scope.candidate, accepted.candidate)
786
+ && sameArtifact(scope.source, accepted.source)
787
+ && scopeReceipt?.status === 'rejected'
788
+ && scopeReceipt.transform_artifact_digest === digestArtifact(scope)
789
+ && scopeReceiptBase !== null
790
+ && scopeReceipt.receipt_digest === digestArtifact(scopeReceiptBase)
791
+ && verifyTransformSemantics(context, accepted, behavior, mutation);
792
+ }
793
+
794
+ function decodeRawEvidence(evidence) {
795
+ try {
796
+ return JSON.parse(Buffer.from(evidence.raw.payload_base64, 'base64').toString('utf8'));
797
+ } catch {
798
+ return null;
799
+ }
800
+ }
801
+
802
+ function rehydrateStoredEvidence(evidence) {
803
+ if (!plainRecord(evidence)) return null;
804
+ const raw = evidence.raw;
805
+ if (!exactRecord(raw, [
806
+ 'schema',
807
+ 'source_schema',
808
+ 'media_type',
809
+ 'source_encoding',
810
+ 'storage_encoding',
811
+ 'canonical_bytes',
812
+ 'payload_digest',
813
+ 'payload_base64_chunks',
814
+ ])
815
+ || raw.schema !== 'lattice.rc2.chunked_codegraph_raw_receipt.v1'
816
+ || raw.source_schema !== 'lattice.codegraph_raw_opaque_receipt.v1'
817
+ || raw.source_encoding !== 'canonical-json-base64'
818
+ || raw.storage_encoding !== 'ordered-base64-chunks'
819
+ || !Number.isSafeInteger(raw.canonical_bytes)
820
+ || raw.canonical_bytes < 0
821
+ || !SHA256.test(raw.payload_digest)
822
+ || !Array.isArray(raw.payload_base64_chunks)
823
+ || raw.payload_base64_chunks.length === 0
824
+ || raw.payload_base64_chunks.some((chunk) => (
825
+ typeof chunk !== 'string'
826
+ || chunk.length === 0
827
+ || Buffer.byteLength(chunk, 'utf8') > RAW_EVIDENCE_CHUNK_BYTES
828
+ ))
829
+ || raw.payload_base64_chunks.slice(0, -1).some((chunk) => (
830
+ Buffer.byteLength(chunk, 'utf8') !== RAW_EVIDENCE_CHUNK_BYTES
831
+ ))) {
832
+ return null;
833
+ }
834
+ const payloadBase64 = raw.payload_base64_chunks.join('');
835
+ const payload = Buffer.from(payloadBase64, 'base64');
836
+ if (payload.toString('base64') !== payloadBase64
837
+ || payload.byteLength !== raw.canonical_bytes
838
+ || sha256(payload) !== raw.payload_digest) {
839
+ return null;
840
+ }
841
+ const restored = {
842
+ ...structuredClone(evidence),
843
+ raw: {
844
+ schema: raw.source_schema,
845
+ media_type: raw.media_type,
846
+ encoding: raw.source_encoding,
847
+ canonical_bytes: raw.canonical_bytes,
848
+ payload_digest: raw.payload_digest,
849
+ payload_base64: payloadBase64,
850
+ },
851
+ };
852
+ return validateRc1EvidenceBundle(restored) ? restored : null;
853
+ }
854
+
855
+ function rehydrateStoredRun(run) {
856
+ if (!plainRecord(run)) return null;
857
+ const evidence = rehydrateStoredEvidence(run.evidence);
858
+ if (evidence === null) return null;
859
+ return { ...structuredClone(run), evidence };
860
+ }
861
+
862
+ function runMap(context) {
863
+ return new Map(RUN_IDS.map((runId) => [
864
+ runId,
865
+ rehydrateStoredRun(context.json.get(`evidence/${runId}.json`)),
866
+ ]));
867
+ }
868
+
869
+ function expectedRunFamily(runId) {
870
+ return runId.startsWith('primary-') ? 'primary' : 'rc1_transfer';
871
+ }
872
+
873
+ function expectedRunCondition(runId) {
874
+ return runId.includes('-treatment-') ? 'treatment' : 'control';
875
+ }
876
+
877
+ function verifyRuns(context) {
878
+ const runs = runMap(context);
879
+ const primaryInputs = objectFromPaths(context, PRIMARY_INPUT_PATHS);
880
+ const rc1Inputs = objectFromPaths(context, RC1_INPUT_PATHS);
881
+ const identity = context.json.get('identity.json');
882
+ const accepted = context.json.get('transform/accepted-artifact.json');
883
+ const rc1Transform = context.json.get('predecessors/rc1-v6-transform-artifact.json');
884
+ const isolationDigests = new Set();
885
+ for (const [runId, run] of runs) {
886
+ const family = expectedRunFamily(runId);
887
+ const condition = expectedRunCondition(runId);
888
+ const inputs = family === 'primary' ? primaryInputs : rc1Inputs;
889
+ const expectedPatch = condition === 'control'
890
+ ? null
891
+ : (family === 'primary' ? accepted?.patch?.digest : rc1Transform?.patch?.digest);
892
+ if (!plainRecord(run)
893
+ || run.schema !== 'lattice.rc2.fresh_codegraph_run.v1'
894
+ || run.run_id !== runId
895
+ || run.family !== family
896
+ || run.condition !== condition
897
+ || run.fresh_index !== true
898
+ || !SHA256.test(run.isolation_instance_digest)
899
+ || isolationDigests.has(run.isolation_instance_digest)
900
+ || !validateRc1EvidenceBundle(run.evidence)
901
+ || run.evidence.run_id !== runId
902
+ || run.evidence.condition !== condition
903
+ || run.evidence.query_set_digest !== digestArtifact(inputs.querySet)
904
+ || run.measurement?.schema !== 'lattice.rc2.codegraph_measurement.v1'
905
+ || run.measurement.base_sha !== context.manifest.base_sha
906
+ || run.measurement.patch_digest !== expectedPatch
907
+ || run.measurement.snapshot_digest !== digestArtifact(run.measurement.snapshot)
908
+ || run.measurement.codegraph_identity_digest !== identity.codegraph_identity_digest
909
+ || !sameArtifact(run.measurement.codegraph_identity, identity.codegraph_identity)
910
+ || run.measurement.query_set_digest !== digestArtifact(inputs.querySet)
911
+ || run.measurement.raw_evidence_digest !== run.evidence.raw.payload_digest
912
+ || run.source_invariant?.outcome !== 'passed'
913
+ || run.cleanup?.outcome !== 'passed'
914
+ || run.oracle_receipt?.outcome !== 'passed'
915
+ || run.cost?.index?.state !== 'measured'
916
+ || run.cost?.query?.state !== 'measured'
917
+ || run.cost?.oracle?.state !== 'measured') {
918
+ return false;
919
+ }
920
+ isolationDigests.add(run.isolation_instance_digest);
921
+ }
922
+ return isolationDigests.size === RUN_IDS.length;
923
+ }
924
+
925
+ function verdictFor(bundle, compiled) {
926
+ return {
927
+ schema_version: 'lattice.boundary_verdict.v2',
928
+ normalized_graph_digest: bundle.graph_digest,
929
+ verdicts: compiled.pairwise_verdicts,
930
+ };
931
+ }
932
+
933
+ function compiledRecord({ condition, runId, bundle, compiled }) {
934
+ if (compiled.outcome !== 'compiled') throw new TypeError(`${condition} did not compile`);
935
+ const verdict = verdictFor(bundle, compiled);
936
+ const verification = verifySchedulabilityPlanV2(bundle.graph, compiled.plan);
937
+ const stable = { bundle, verdict, plan: compiled.plan, verification };
938
+ return {
939
+ schema: 'lattice.rc2.compiled_condition.v1',
940
+ condition,
941
+ run_id: runId,
942
+ outcome: 'compiled',
943
+ ...stable,
944
+ artifact_digest: digestArtifact(stable),
945
+ };
946
+ }
947
+
948
+ function compilePrimaryRecord({ run, inputs, manualEvidence, planInput, condition }) {
949
+ const bundle = compileDeliveryPolicyBoundaryBundleV2({
950
+ planInput,
951
+ candidateSpec: inputs.candidateSpec,
952
+ manualEvidence,
953
+ querySet: inputs.querySet,
954
+ sourceSnapshot: run.measurement.snapshot,
955
+ codegraphEvidence: run.evidence.portable,
956
+ });
957
+ return compiledRecord({
958
+ condition,
959
+ runId: run.run_id,
960
+ bundle,
961
+ compiled: compileSchedulabilityGraphV2(bundle.graph),
962
+ });
963
+ }
964
+
965
+ function compileUnknownRecord({ run, inputs }) {
966
+ const bundle = compileDeliveryPolicyBoundaryBundleV2({
967
+ planInput: inputs.planInput,
968
+ candidateSpec: inputs.candidateSpec,
969
+ manualEvidence: inputs.unknownManualEvidence,
970
+ querySet: inputs.querySet,
971
+ sourceSnapshot: run.measurement.snapshot,
972
+ codegraphEvidence: run.evidence.portable,
973
+ });
974
+ const outcome = compileSchedulabilityGraphV2(bundle.graph);
975
+ const verification = verifySchedulabilityPlanV2(bundle.graph, {
976
+ schema_version: 'lattice.plan_graph.v2',
977
+ waves: [],
978
+ minimum_feasible_waves: 0,
979
+ });
980
+ return {
981
+ schema: 'lattice.rc2.non_dispatchable_condition.v1',
982
+ condition: 'primary-treatment-third-only-unknown',
983
+ run_id: run.run_id,
984
+ bundle,
985
+ outcome,
986
+ verification,
987
+ };
988
+ }
989
+
990
+ function recompileLegacy(run, inputs, manualEvidence, label) {
991
+ const rawEvidence = decodeRawEvidence(run.evidence);
992
+ if (rawEvidence === null) throw new TypeError('RC1 raw evidence is not decodable');
993
+ return compileBoundaryCondition({
994
+ planInput: inputs.planInput,
995
+ candidateSpec: inputs.candidateSpec,
996
+ manualEvidence,
997
+ querySet: inputs.querySet,
998
+ codegraphEvidence: rawEvidence,
999
+ codeSnapshotDigest: run.measurement.snapshot_digest,
1000
+ planVersion: `rc2-${run.condition}-transfer-${label}`,
1001
+ });
1002
+ }
1003
+
1004
+ function compileTransferRecord({ run, inputs, manualEvidence, label }) {
1005
+ const legacy = recompileLegacy(run, inputs, manualEvidence, label);
1006
+ if (!sameArtifact(legacy.boundary_manifest, run.legacy_boundary_manifests?.[label])) {
1007
+ throw new TypeError(`RC1 ${run.condition} ${label} fresh manifest mismatch`);
1008
+ }
1009
+ const transferred = compileRc1TransferBundleV2({
1010
+ planInput: inputs.planInput,
1011
+ candidateSpec: inputs.candidateSpec,
1012
+ manualEvidence,
1013
+ querySet: inputs.querySet,
1014
+ boundaryManifest: legacy.boundary_manifest,
1015
+ });
1016
+ const verification = verifySchedulabilityPlanV2(transferred.bundle.graph, transferred.plan);
1017
+ const stable = {
1018
+ bundle: transferred.bundle,
1019
+ verdict: transferred.verdict,
1020
+ plan: transferred.plan,
1021
+ verification,
1022
+ };
1023
+ return {
1024
+ schema: 'lattice.rc2.compiled_condition.v1',
1025
+ condition: `rc1-transfer-${run.condition}-${label}`,
1026
+ run_id: run.run_id,
1027
+ outcome: 'compiled',
1028
+ ...stable,
1029
+ artifact_digest: digestArtifact(stable),
1030
+ };
1031
+ }
1032
+
1033
+ function recomputeConditions(context) {
1034
+ const runs = runMap(context);
1035
+ const primaryInputs = objectFromPaths(context, PRIMARY_INPUT_PATHS);
1036
+ const rc1Inputs = objectFromPaths(context, RC1_INPUT_PATHS);
1037
+ const control = [1, 2].map((index) => compilePrimaryRecord({
1038
+ run: runs.get(`primary-control-${index}`),
1039
+ inputs: primaryInputs,
1040
+ manualEvidence: primaryInputs.normalManualEvidence,
1041
+ planInput: primaryInputs.planInput,
1042
+ condition: 'primary-control-normal',
1043
+ }));
1044
+ const treatment = [1, 2].map((index) => compilePrimaryRecord({
1045
+ run: runs.get(`primary-treatment-${index}`),
1046
+ inputs: primaryInputs,
1047
+ manualEvidence: primaryInputs.normalManualEvidence,
1048
+ planInput: primaryInputs.planInput,
1049
+ condition: 'primary-treatment-normal',
1050
+ }));
1051
+ const treatmentRun = runs.get('primary-treatment-1');
1052
+ const capacityPlan = structuredClone(primaryInputs.planInput);
1053
+ capacityPlan.capacity.writers = 2;
1054
+ const partialState = compilePrimaryRecord({
1055
+ run: treatmentRun,
1056
+ inputs: primaryInputs,
1057
+ manualEvidence: primaryInputs.partialManualEvidence,
1058
+ planInput: primaryInputs.planInput,
1059
+ condition: 'primary-treatment-partial-state',
1060
+ });
1061
+ const capacity2 = compilePrimaryRecord({
1062
+ run: treatmentRun,
1063
+ inputs: primaryInputs,
1064
+ manualEvidence: primaryInputs.normalManualEvidence,
1065
+ planInput: capacityPlan,
1066
+ condition: 'primary-treatment-capacity-2',
1067
+ });
1068
+ const unknown = compileUnknownRecord({ run: treatmentRun, inputs: primaryInputs });
1069
+ const transferControlRun = runs.get('rc1-transfer-control-1');
1070
+ const transferTreatmentRun = runs.get('rc1-transfer-treatment-1');
1071
+ const transfer = {
1072
+ control: {
1073
+ normal: compileTransferRecord({
1074
+ run: transferControlRun,
1075
+ inputs: rc1Inputs,
1076
+ manualEvidence: rc1Inputs.normalManualEvidence,
1077
+ label: 'normal',
1078
+ }),
1079
+ negative: compileTransferRecord({
1080
+ run: transferControlRun,
1081
+ inputs: rc1Inputs,
1082
+ manualEvidence: rc1Inputs.negativeManualEvidence,
1083
+ label: 'negative',
1084
+ }),
1085
+ },
1086
+ treatment: {
1087
+ normal: compileTransferRecord({
1088
+ run: transferTreatmentRun,
1089
+ inputs: rc1Inputs,
1090
+ manualEvidence: rc1Inputs.normalManualEvidence,
1091
+ label: 'normal',
1092
+ }),
1093
+ negative: compileTransferRecord({
1094
+ run: transferTreatmentRun,
1095
+ inputs: rc1Inputs,
1096
+ manualEvidence: rc1Inputs.negativeManualEvidence,
1097
+ label: 'negative',
1098
+ }),
1099
+ },
1100
+ };
1101
+ return {
1102
+ primary: { control, treatment, partial_state: partialState, capacity_2: capacity2,
1103
+ third_only_unknown: unknown },
1104
+ rc1_transfer: transfer,
1105
+ };
1106
+ }
1107
+
1108
+ const COMPILED_RECORD_PATHS = Object.freeze({
1109
+ 'compiled/primary-control-1-normal.json': ['primary', 'control', 0],
1110
+ 'compiled/primary-control-2-normal.json': ['primary', 'control', 1],
1111
+ 'compiled/primary-treatment-1-normal.json': ['primary', 'treatment', 0],
1112
+ 'compiled/primary-treatment-2-normal.json': ['primary', 'treatment', 1],
1113
+ 'compiled/primary-treatment-partial-state.json': ['primary', 'partial_state'],
1114
+ 'compiled/primary-treatment-capacity-2.json': ['primary', 'capacity_2'],
1115
+ 'compiled/primary-treatment-third-only-unknown.json': ['primary', 'third_only_unknown'],
1116
+ 'compiled/rc1-transfer-control-normal.json': ['rc1_transfer', 'control', 'normal'],
1117
+ 'compiled/rc1-transfer-control-negative.json': ['rc1_transfer', 'control', 'negative'],
1118
+ 'compiled/rc1-transfer-treatment-normal.json': ['rc1_transfer', 'treatment', 'normal'],
1119
+ 'compiled/rc1-transfer-treatment-negative.json': ['rc1_transfer', 'treatment', 'negative'],
1120
+ });
1121
+
1122
+ function nestedValue(value, keys) {
1123
+ return keys.reduce((current, key) => current?.[key], value);
1124
+ }
1125
+
1126
+ function verifyCompiledConditions(context, recomputed) {
1127
+ return Object.entries(COMPILED_RECORD_PATHS).every(([relativePath, keys]) => (
1128
+ sameArtifact(context.json.get(relativePath), nestedValue(recomputed, keys))
1129
+ ));
1130
+ }
1131
+
1132
+ function distinctConflictPairs(record) {
1133
+ return new Set(record.bundle.graph.conflicts.map(({ todo_ids: todoIds }) => (
1134
+ [...todoIds].sort().join('\u0000')
1135
+ ))).size;
1136
+ }
1137
+
1138
+ function conditionMetrics(record) {
1139
+ return {
1140
+ conflict_records: record.bundle.graph.conflicts.length,
1141
+ distinct_conflict_pairs: distinctConflictPairs(record),
1142
+ minimum_feasible_waves: record.plan.minimum_feasible_waves,
1143
+ };
1144
+ }
1145
+
1146
+ function expectedComparison(context, recomputed) {
1147
+ const identity = context.json.get('identity.json');
1148
+ const transform = context.json.get('transform/accepted-artifact.json');
1149
+ const newPlan = context.json.get('new-plan-version.json');
1150
+ const planDiff = context.json.get('plan-diff.json');
1151
+ return {
1152
+ schema: 'lattice.rc2.control_treatment_comparison.v1',
1153
+ base_sha: context.manifest.base_sha,
1154
+ identity_digest: digestArtifact(identity),
1155
+ independent_variable: {
1156
+ kind: 'accepted_registry_shard_patch',
1157
+ transform_artifact_digest: digestArtifact(transform),
1158
+ patch_digest: transform.patch.digest,
1159
+ },
1160
+ condition_artifact_digests: {
1161
+ primary_control: recomputed.primary.control.map(({ artifact_digest: digest }) => digest),
1162
+ primary_treatment: recomputed.primary.treatment.map(({ artifact_digest: digest }) => digest),
1163
+ primary_partial_state: recomputed.primary.partial_state.artifact_digest,
1164
+ primary_capacity_2: recomputed.primary.capacity_2.artifact_digest,
1165
+ primary_unknown: digestArtifact(recomputed.primary.third_only_unknown),
1166
+ rc1_transfer_control_normal: recomputed.rc1_transfer.control.normal.artifact_digest,
1167
+ rc1_transfer_control_negative: recomputed.rc1_transfer.control.negative.artifact_digest,
1168
+ rc1_transfer_treatment_normal: recomputed.rc1_transfer.treatment.normal.artifact_digest,
1169
+ rc1_transfer_treatment_negative: recomputed.rc1_transfer.treatment.negative.artifact_digest,
1170
+ },
1171
+ metrics: {
1172
+ primary_control: conditionMetrics(recomputed.primary.control[0]),
1173
+ primary_treatment: conditionMetrics(recomputed.primary.treatment[0]),
1174
+ primary_partial_state: conditionMetrics(recomputed.primary.partial_state),
1175
+ primary_capacity_2: conditionMetrics(recomputed.primary.capacity_2),
1176
+ rc1_transfer_control_normal: conditionMetrics(recomputed.rc1_transfer.control.normal),
1177
+ rc1_transfer_control_negative: conditionMetrics(recomputed.rc1_transfer.control.negative),
1178
+ rc1_transfer_treatment_normal: conditionMetrics(recomputed.rc1_transfer.treatment.normal),
1179
+ rc1_transfer_treatment_negative: conditionMetrics(recomputed.rc1_transfer.treatment.negative),
1180
+ },
1181
+ version_barrier: {
1182
+ new_plan_version_digest: digestArtifact(newPlan),
1183
+ plan_diff_digest: digestArtifact(planDiff),
1184
+ causal_predecessors_digest: digestArtifact(planDiff.causal_predecessors),
1185
+ },
1186
+ };
1187
+ }
1188
+
1189
+ function expectedHypothesis(comparison, recomputed, transform) {
1190
+ const checks = [
1191
+ { id: 'accepted_transform_only', passed: transform.status === 'accepted' },
1192
+ {
1193
+ id: 'primary_repeat_reproducible',
1194
+ passed: new Set(recomputed.primary.control.map(({ artifact_digest: digest }) => digest)).size === 1
1195
+ && new Set(recomputed.primary.treatment.map(({ artifact_digest: digest }) => digest)).size === 1,
1196
+ },
1197
+ {
1198
+ id: 'primary_conflicts_removed',
1199
+ passed: comparison.metrics.primary_control.conflict_records === 12
1200
+ && comparison.metrics.primary_control.distinct_conflict_pairs === 3
1201
+ && comparison.metrics.primary_treatment.conflict_records === 0,
1202
+ },
1203
+ {
1204
+ id: 'primary_waves_reduced',
1205
+ passed: comparison.metrics.primary_control.minimum_feasible_waves === 3
1206
+ && comparison.metrics.primary_treatment.minimum_feasible_waves === 1,
1207
+ },
1208
+ {
1209
+ id: 'partial_state_preserved',
1210
+ passed: comparison.metrics.primary_partial_state.conflict_records === 1
1211
+ && comparison.metrics.primary_partial_state.minimum_feasible_waves === 2,
1212
+ },
1213
+ {
1214
+ id: 'capacity_control_preserved',
1215
+ passed: comparison.metrics.primary_capacity_2.conflict_records === 0
1216
+ && comparison.metrics.primary_capacity_2.minimum_feasible_waves === 2,
1217
+ },
1218
+ {
1219
+ id: 'third_only_unknown_closed',
1220
+ passed: recomputed.primary.third_only_unknown.outcome.outcome === 'unknown'
1221
+ && recomputed.primary.third_only_unknown.verification.outcome === 'unknown',
1222
+ },
1223
+ {
1224
+ id: 'rc1_transfer_isomorphic',
1225
+ passed: comparison.metrics.rc1_transfer_control_normal.conflict_records === 3
1226
+ && comparison.metrics.rc1_transfer_control_normal.minimum_feasible_waves === 2
1227
+ && comparison.metrics.rc1_transfer_treatment_normal.conflict_records === 0
1228
+ && comparison.metrics.rc1_transfer_treatment_normal.minimum_feasible_waves === 1
1229
+ && comparison.metrics.rc1_transfer_control_negative.minimum_feasible_waves === 2
1230
+ && comparison.metrics.rc1_transfer_treatment_negative.minimum_feasible_waves === 2,
1231
+ },
1232
+ {
1233
+ id: 'all_minimum_verified',
1234
+ passed: Object.values(COMPILED_RECORD_PATHS).every((keys) => {
1235
+ const record = nestedValue(recomputed, keys);
1236
+ return record.outcome !== 'compiled' || record.verification.outcome === 'verified';
1237
+ }),
1238
+ },
1239
+ ];
1240
+ return {
1241
+ schema: 'lattice.rc2.hypothesis_evaluation.v1',
1242
+ checks,
1243
+ supported: checks.every(({ passed }) => passed),
1244
+ failed_conditions: checks.filter(({ passed }) => !passed).map(({ id }) => id),
1245
+ };
1246
+ }
1247
+
1248
+ function expectedPredecessorKinds(context) {
1249
+ const expected = new Map();
1250
+ for (const ref of context.predecessorPaths) {
1251
+ expected.set(
1252
+ ref,
1253
+ ref === 'predecessors/rc1-v6-plan.md'
1254
+ ? 'rc1_v6_phase_archive'
1255
+ : 'immutable_predecessor',
1256
+ );
1257
+ }
1258
+ expected.set('transform/accepted-artifact.json', 'accepted_transform');
1259
+ expected.set('transform/behavior-evidence.json', 'behavior_envelope');
1260
+ expected.set('transform/mutation-evidence.json', 'mutation_evidence');
1261
+ for (const runId of RUN_IDS) expected.set(`evidence/${runId}.json`, 'evidence_bundle');
1262
+ for (const ref of Object.values(PRIMARY_INPUT_PATHS)) expected.set(ref, 'fixed_input');
1263
+ expected.set('identity.json', 'execution_identity');
1264
+ expected.set('identity/schedulability-compiler-v2.mjs', 'compiler_identity');
1265
+ expected.set('identity/schedulability-verifier-v2.mjs', 'verifier_identity');
1266
+ if (context.artifactVersion !== 'v1') {
1267
+ expected.set(CODEGRAPH_CONFIG_PATH, 'codegraph_project_config');
1268
+ }
1269
+ return expected;
1270
+ }
1271
+
1272
+ function verifyV1PredecessorPair(context) {
1273
+ if (context.artifactVersion === 'v1') return true;
1274
+ const manifest = context.json.get('predecessors/rc2-v1-artifact-manifest.json');
1275
+ const plan = context.json.get('predecessors/rc2-v1-new-plan-version.json');
1276
+ if (!exactRecord(manifest, ['schema', 'base_sha', 'result_digest', 'files'])
1277
+ || manifest.schema !== 'lattice.rc2.artifact_manifest.v1'
1278
+ || !GIT_SHA1.test(manifest.base_sha)
1279
+ || !SHA256.test(manifest.result_digest)
1280
+ || !Array.isArray(manifest.files)
1281
+ || !sameArtifact(
1282
+ manifest.files.map(({ path: relativePath }) => relativePath).sort(),
1283
+ RC2_V1_ARTIFACT_PATHS,
1284
+ )
1285
+ || new Set(manifest.files.map(({ path: relativePath }) => relativePath)).size
1286
+ !== RC2_V1_ARTIFACT_PATHS.length
1287
+ || plan?.schema !== 'lattice.rc2.plan_version.v1'
1288
+ || plan.version !== 'rc2-delivery-policy-v2') {
1289
+ return false;
1290
+ }
1291
+ const planBytes = context.payloads.get('predecessors/rc2-v1-new-plan-version.json');
1292
+ const entry = manifest.files.find(({ path: relativePath }) => (
1293
+ relativePath === 'new-plan-version.json'
1294
+ ));
1295
+ return exactRecord(entry, ['path', 'media_type', 'bytes', 'sha256'])
1296
+ && entry.media_type === 'application/json'
1297
+ && entry.bytes === planBytes.byteLength
1298
+ && entry.sha256 === sha256(planBytes);
1299
+ }
1300
+
1301
+ function verifyV2PredecessorPair(context) {
1302
+ if (!['v3', 'v4'].includes(context.artifactVersion)) return true;
1303
+ const manifest = context.json.get('predecessors/rc2-v2-artifact-manifest.json');
1304
+ const plan = context.json.get('predecessors/rc2-v2-new-plan-version.json');
1305
+ if (!exactRecord(manifest, ['schema', 'base_sha', 'result_digest', 'files'])
1306
+ || manifest.schema !== 'lattice.rc2.artifact_manifest.v2'
1307
+ || !GIT_SHA1.test(manifest.base_sha)
1308
+ || !SHA256.test(manifest.result_digest)
1309
+ || !Array.isArray(manifest.files)
1310
+ || !sameArtifact(
1311
+ manifest.files.map(({ path: relativePath }) => relativePath).sort(),
1312
+ RC2_V2_ARTIFACT_PATHS,
1313
+ )
1314
+ || new Set(manifest.files.map(({ path: relativePath }) => relativePath)).size
1315
+ !== RC2_V2_ARTIFACT_PATHS.length
1316
+ || plan?.schema !== 'lattice.rc2.plan_version.v1'
1317
+ || plan.version !== 'rc2-delivery-policy-v3') {
1318
+ return false;
1319
+ }
1320
+ const planBytes = context.payloads.get('predecessors/rc2-v2-new-plan-version.json');
1321
+ const entry = manifest.files.find(({ path: relativePath }) => (
1322
+ relativePath === 'new-plan-version.json'
1323
+ ));
1324
+ return exactRecord(entry, ['path', 'media_type', 'bytes', 'sha256'])
1325
+ && entry.media_type === 'application/json'
1326
+ && entry.bytes === planBytes.byteLength
1327
+ && entry.sha256 === sha256(planBytes);
1328
+ }
1329
+
1330
+ function verifyV3PredecessorPair(context) {
1331
+ if (context.artifactVersion !== 'v4') return true;
1332
+ const manifest = context.json.get('predecessors/rc2-v3-artifact-manifest.json');
1333
+ const plan = context.json.get('predecessors/rc2-v3-new-plan-version.json');
1334
+ if (!exactRecord(manifest, ['schema', 'base_sha', 'result_digest', 'files'])
1335
+ || manifest.schema !== 'lattice.rc2.artifact_manifest.v3'
1336
+ || !GIT_SHA1.test(manifest.base_sha)
1337
+ || !SHA256.test(manifest.result_digest)
1338
+ || !Array.isArray(manifest.files)
1339
+ || !sameArtifact(
1340
+ manifest.files.map(({ path: relativePath }) => relativePath).sort(),
1341
+ RC2_V3_ARTIFACT_PATHS,
1342
+ )
1343
+ || new Set(manifest.files.map(({ path: relativePath }) => relativePath)).size
1344
+ !== RC2_V3_ARTIFACT_PATHS.length
1345
+ || plan?.schema !== 'lattice.rc2.plan_version.v1'
1346
+ || plan.version !== 'rc2-delivery-policy-v4') {
1347
+ return false;
1348
+ }
1349
+ const planBytes = context.payloads.get('predecessors/rc2-v3-new-plan-version.json');
1350
+ const entry = manifest.files.find(({ path: relativePath }) => (
1351
+ relativePath === 'new-plan-version.json'
1352
+ ));
1353
+ return exactRecord(entry, ['path', 'media_type', 'bytes', 'sha256'])
1354
+ && entry.media_type === 'application/json'
1355
+ && entry.bytes === planBytes.byteLength
1356
+ && entry.sha256 === sha256(planBytes);
1357
+ }
1358
+
1359
+ function verifyPredecessors(context) {
1360
+ const planDiff = context.json.get('plan-diff.json');
1361
+ const newPlan = context.json.get('new-plan-version.json');
1362
+ const expected = expectedPredecessorKinds(context);
1363
+ if (!Array.isArray(planDiff?.causal_predecessors)
1364
+ || !sameArtifact(planDiff.causal_predecessors, newPlan?.causal_predecessors)
1365
+ || planDiff.causal_predecessors.length !== expected.size) {
1366
+ return false;
1367
+ }
1368
+ const refs = new Set();
1369
+ for (const predecessor of planDiff.causal_predecessors) {
1370
+ if (!exactRecord(predecessor, ['kind', 'ref', 'digest'])
1371
+ || predecessor.kind !== expected.get(predecessor.ref)
1372
+ || !context.artifactPaths.includes(predecessor.ref)
1373
+ || refs.has(predecessor.ref)
1374
+ || predecessor.digest !== sha256(context.payloads.get(predecessor.ref))) {
1375
+ return false;
1376
+ }
1377
+ refs.add(predecessor.ref);
1378
+ }
1379
+ return refs.size === expected.size
1380
+ && [...expected.keys()].every((relativePath) => refs.has(relativePath))
1381
+ && verifyV1PredecessorPair(context)
1382
+ && verifyV2PredecessorPair(context)
1383
+ && verifyV3PredecessorPair(context);
1384
+ }
1385
+
1386
+ function verifyVersionBarrier(context, recomputed) {
1387
+ const primaryInputs = objectFromPaths(context, PRIMARY_INPUT_PATHS);
1388
+ const newPlan = context.json.get('new-plan-version.json');
1389
+ const planDiff = context.json.get('plan-diff.json');
1390
+ const control = recomputed.primary.control[0];
1391
+ const treatment = recomputed.primary.treatment[0];
1392
+ const expectedInvalidations = [
1393
+ 'old_plan',
1394
+ 'agent_context',
1395
+ 'partial_patch',
1396
+ 'interface_assumption',
1397
+ 'boundary_evidence',
1398
+ ];
1399
+ const predecessorPath = {
1400
+ v1: null,
1401
+ v2: 'predecessors/rc2-v1-new-plan-version.json',
1402
+ v3: 'predecessors/rc2-v2-new-plan-version.json',
1403
+ v4: 'predecessors/rc2-v3-new-plan-version.json',
1404
+ }[context.artifactVersion];
1405
+ const predecessorPlan = predecessorPath === null ? null : context.json.get(predecessorPath);
1406
+ const versionedPredecessor = predecessorPlan !== null;
1407
+ const predecessorVersion = versionedPredecessor
1408
+ ? predecessorPlan?.version
1409
+ : primaryInputs.planInput.plan_version;
1410
+ const expectedVersion = {
1411
+ v1: 'rc2-delivery-policy-v2',
1412
+ v2: 'rc2-delivery-policy-v3',
1413
+ v3: 'rc2-delivery-policy-v4',
1414
+ v4: 'rc2-delivery-policy-v5',
1415
+ }[context.artifactVersion];
1416
+ const expectedOldDigest = versionedPredecessor
1417
+ ? digestArtifact(predecessorPlan)
1418
+ : digestArtifact(control.plan);
1419
+ return newPlan?.schema === 'lattice.rc2.plan_version.v1'
1420
+ && newPlan.version === expectedVersion
1421
+ && newPlan.predecessor_version === predecessorVersion
1422
+ && sameArtifact(newPlan.plan, treatment.plan)
1423
+ && newPlan.plan_digest === digestArtifact(treatment.plan)
1424
+ && newPlan.bundle_digest === digestArtifact(treatment.bundle)
1425
+ && newPlan.verdict_digest === digestArtifact(treatment.verdict)
1426
+ && sameArtifact(
1427
+ [...newPlan.affected_todos].sort(),
1428
+ primaryInputs.planInput.todos.map(({ id }) => id).sort(),
1429
+ )
1430
+ && planDiff?.schema === 'lattice.rc2.plan_diff.v1'
1431
+ && planDiff.old_plan?.version === predecessorVersion
1432
+ && planDiff.old_plan?.digest === expectedOldDigest
1433
+ && planDiff.new_plan?.version === newPlan.version
1434
+ && planDiff.new_plan?.digest === digestArtifact(newPlan)
1435
+ && sameArtifact(planDiff.affected_todos, newPlan.affected_todos)
1436
+ && planDiff.invalidated_contexts?.map(({ kind }) => kind)
1437
+ .every((kind, index) => kind === expectedInvalidations[index])
1438
+ && planDiff.invalidated_contexts.length === expectedInvalidations.length
1439
+ && (!versionedPredecessor || (
1440
+ predecessorPlan?.plan_digest === digestArtifact(predecessorPlan.plan)
1441
+ && sameArtifact(predecessorPlan.plan, treatment.plan)
1442
+ && planDiff.invalidated_contexts.find(({ kind }) => kind === 'interface_assumption')?.ref
1443
+ === `${predecessorVersion}-interface-assumption`
1444
+ && planDiff.invalidated_contexts.find(({ kind }) => kind === 'boundary_evidence')?.ref
1445
+ === `${predecessorVersion}-boundary-evidence`
1446
+ ));
1447
+ }
1448
+
1449
+ function verifyCost(context) {
1450
+ const cost = context.json.get('cost.json');
1451
+ if (cost?.schema !== 'lattice.rc2.stage_cost.v1'
1452
+ || !Array.isArray(cost.measurements)
1453
+ || cost.measurements.length < 20
1454
+ || cost.measurements.some((measurement) => (
1455
+ !exactRecord(measurement, ['stage', 'state', 'elapsed_ms'])
1456
+ || typeof measurement.stage !== 'string'
1457
+ || measurement.state !== 'measured'
1458
+ || typeof measurement.elapsed_ms !== 'number'
1459
+ || !Number.isFinite(measurement.elapsed_ms)
1460
+ || measurement.elapsed_ms < 0
1461
+ ))
1462
+ || cost.aggregate?.measured_count !== cost.measurements.length
1463
+ || cost.aggregate?.not_measured_count !== 0) {
1464
+ return false;
1465
+ }
1466
+ const elapsed = Math.round(cost.measurements
1467
+ .reduce((sum, measurement) => sum + measurement.elapsed_ms, 0) * 1_000) / 1_000;
1468
+ const transform = context.json.get('transform/accepted-artifact.json');
1469
+ return cost.aggregate.elapsed_ms === elapsed
1470
+ && cost.intervention?.patch_bytes === transform.patch.bytes
1471
+ && cost.intervention?.files === transform.scope.changed_paths.length
1472
+ && Number.isSafeInteger(cost.intervention?.review_lines)
1473
+ && cost.intervention.review_lines > 0
1474
+ && cost.rework?.rejected_attempts === 2
1475
+ && cost.rework?.retries === 0
1476
+ && cost.rework?.rollbacks === 0
1477
+ && Array.isArray(cost.unverified)
1478
+ && cost.unverified.length > 0;
1479
+ }
1480
+
1481
+ function expectedExecutionEvidence(context, recomputed, comparison, hypothesis) {
1482
+ const identity = context.json.get('identity.json');
1483
+ const transform = context.json.get('transform/accepted-artifact.json');
1484
+ const newPlan = context.json.get('new-plan-version.json');
1485
+ const planDiff = context.json.get('plan-diff.json');
1486
+ const cost = context.json.get('cost.json');
1487
+ return {
1488
+ schema: 'lattice.rc2.campaign_execution_evidence.v1',
1489
+ base_sha: context.manifest.base_sha,
1490
+ identity_digest: digestArtifact(identity),
1491
+ transform_artifact_digest: digestArtifact(transform),
1492
+ run_digests: RUN_IDS.map((runId) => digestArtifact(
1493
+ context.json.get(`evidence/${runId}.json`),
1494
+ )),
1495
+ compiled_condition_digests: Object.values(COMPILED_RECORD_PATHS).map((keys) => (
1496
+ digestArtifact(nestedValue(recomputed, keys))
1497
+ )),
1498
+ new_plan_version_digest: digestArtifact(newPlan),
1499
+ plan_diff_digest: digestArtifact(planDiff),
1500
+ comparison_digest: digestArtifact(comparison),
1501
+ hypothesis_evaluation_digest: digestArtifact(hypothesis),
1502
+ cost_digest: digestArtifact(cost),
1503
+ };
1504
+ }
1505
+
1506
+ /** 保存payloadだけからRC2のcausal relationとschedule minimumを再計算する。 */
1507
+ export function verifyRc2CampaignArtifactSet(options = {}) {
1508
+ const checks = [];
1509
+ const check = (id, passed) => checks.push({ id, passed: passed === true });
1510
+ const context = artifactContext(options);
1511
+ check('exact_artifact_set', context !== null);
1512
+ if (context === null) {
1513
+ return {
1514
+ schema: 'lattice.rc2.artifact_set_verification.v1',
1515
+ valid: false,
1516
+ checks,
1517
+ failed_conditions: ['exact_artifact_set'],
1518
+ };
1519
+ }
1520
+
1521
+ check('identity_binding', verifyIdentity(context));
1522
+ if (context.artifactVersion !== 'v1') {
1523
+ check('codegraph_config_binding', verifyCodegraphConfig(context));
1524
+ }
1525
+ check('transform_binding', verifyTransform(context));
1526
+ check('fresh_run_binding', verifyRuns(context));
1527
+
1528
+ let recomputed;
1529
+ try {
1530
+ recomputed = recomputeConditions(context);
1531
+ } catch {
1532
+ recomputed = null;
1533
+ }
1534
+ check('compiled_conditions', recomputed !== null
1535
+ && verifyCompiledConditions(context, recomputed));
1536
+ check('minimum_verification', recomputed !== null
1537
+ && Object.values(COMPILED_RECORD_PATHS).every((keys) => {
1538
+ const record = nestedValue(recomputed, keys);
1539
+ return record.outcome !== 'compiled' || record.verification.outcome === 'verified';
1540
+ }));
1541
+ check('repeat_reproducibility', recomputed !== null
1542
+ && new Set(recomputed.primary.control.map(({ artifact_digest: digest }) => digest)).size === 1
1543
+ && new Set(recomputed.primary.treatment.map(({ artifact_digest: digest }) => digest)).size === 1);
1544
+ check('rc1_transfer_binding', recomputed !== null
1545
+ && recomputed.rc1_transfer.control.normal.bundle.graph.conflicts.length === 3
1546
+ && recomputed.rc1_transfer.treatment.normal.bundle.graph.conflicts.length === 0);
1547
+ check('predecessor_binding', verifyPredecessors(context));
1548
+ check('version_barrier', recomputed !== null && verifyVersionBarrier(context, recomputed));
1549
+ check('cost_arithmetic', verifyCost(context));
1550
+
1551
+ let comparison;
1552
+ let hypothesis;
1553
+ if (recomputed !== null) {
1554
+ comparison = expectedComparison(context, recomputed);
1555
+ hypothesis = expectedHypothesis(
1556
+ comparison,
1557
+ recomputed,
1558
+ context.json.get('transform/accepted-artifact.json'),
1559
+ );
1560
+ }
1561
+ check('comparison_recalculation', recomputed !== null
1562
+ && sameArtifact(comparison, context.json.get('comparison.json')));
1563
+ check('hypothesis_recalculation', recomputed !== null
1564
+ && hypothesis.supported
1565
+ && sameArtifact(hypothesis, context.json.get('hypothesis-evaluation.json'))
1566
+ && context.manifest.result_digest === digestArtifact(hypothesis));
1567
+ check('execution_binding', recomputed !== null
1568
+ && sameArtifact(
1569
+ expectedExecutionEvidence(context, recomputed, comparison, hypothesis),
1570
+ context.json.get('execution-evidence.json'),
1571
+ ));
1572
+
1573
+ return {
1574
+ schema: 'lattice.rc2.artifact_set_verification.v1',
1575
+ valid: checks.every(({ passed }) => passed),
1576
+ checks,
1577
+ failed_conditions: checks.filter(({ passed }) => !passed).map(({ id }) => id),
1578
+ };
1579
+ }