@quolu/lattice 0.1.0 → 0.12.2

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 (370) hide show
  1. package/README.md +87 -4
  2. package/bin/lattice-bridge.mjs +87 -0
  3. package/bin/lattice-dashboard.mjs +70 -0
  4. package/bin/lattice-mcp.mjs +9 -9
  5. package/bin/lattice.mjs +61 -8
  6. package/docs/bridge-setup.md +87 -0
  7. package/docs/schemas/lattice.plan_create_input.v1.schema.json +56 -0
  8. package/docs/schemas/lattice.plan_create_input.v2.schema.json +72 -0
  9. package/docs/schemas/lattice.plan_create_input.v3.schema.json +81 -0
  10. package/package.json +19 -7
  11. package/sensor/dist/bin/command-supervision.d.ts +1 -1
  12. package/sensor/dist/bin/command-supervision.js +4 -4
  13. package/sensor/dist/bin/command-supervision.js.map +1 -1
  14. package/sensor/dist/bin/fatal-handler.js +2 -2
  15. package/sensor/dist/bin/fatal-handler.js.map +1 -1
  16. package/sensor/dist/bin/{codegraph.js → lattice-sensor.js} +207 -328
  17. package/sensor/dist/bin/node-version-check.d.ts +7 -5
  18. package/sensor/dist/bin/node-version-check.d.ts.map +1 -1
  19. package/sensor/dist/bin/node-version-check.js +19 -14
  20. package/sensor/dist/bin/node-version-check.js.map +1 -1
  21. package/sensor/dist/context/index.d.ts +1 -1
  22. package/sensor/dist/context/index.js +6 -6
  23. package/sensor/dist/context/index.js.map +1 -1
  24. package/sensor/dist/db/index.d.ts +5 -5
  25. package/sensor/dist/db/index.d.ts.map +1 -1
  26. package/sensor/dist/db/index.js +7 -7
  27. package/sensor/dist/db/index.js.map +1 -1
  28. package/sensor/dist/db/migrations.js +1 -1
  29. package/sensor/dist/db/migrations.js.map +1 -1
  30. package/sensor/dist/db/queries.d.ts +1 -1
  31. package/sensor/dist/db/queries.js +5 -5
  32. package/sensor/dist/db/queries.js.map +1 -1
  33. package/sensor/dist/db/schema.sql +2 -2
  34. package/sensor/dist/db/sqlite-adapter.d.ts +2 -2
  35. package/sensor/dist/db/sqlite-adapter.js +3 -3
  36. package/sensor/dist/db/sqlite-adapter.js.map +1 -1
  37. package/sensor/dist/db/wal-valve.d.ts +1 -1
  38. package/sensor/dist/db/wal-valve.d.ts.map +1 -1
  39. package/sensor/dist/db/wal-valve.js +2 -2
  40. package/sensor/dist/db/wal-valve.js.map +1 -1
  41. package/sensor/dist/directory.d.ts +27 -63
  42. package/sensor/dist/directory.d.ts.map +1 -1
  43. package/sensor/dist/directory.js +78 -134
  44. package/sensor/dist/directory.js.map +1 -1
  45. package/sensor/dist/errors.d.ts +15 -15
  46. package/sensor/dist/errors.d.ts.map +1 -1
  47. package/sensor/dist/errors.js +21 -21
  48. package/sensor/dist/errors.js.map +1 -1
  49. package/sensor/dist/extraction/dynamic-import.d.ts +1 -1
  50. package/sensor/dist/extraction/dynamic-import.js +1 -1
  51. package/sensor/dist/extraction/extraction-version.d.ts +1 -1
  52. package/sensor/dist/extraction/extraction-version.js +1 -1
  53. package/sensor/dist/extraction/generated-detection.d.ts +1 -1
  54. package/sensor/dist/extraction/generated-detection.js +1 -1
  55. package/sensor/dist/extraction/grammars.d.ts +3 -3
  56. package/sensor/dist/extraction/grammars.js +5 -5
  57. package/sensor/dist/extraction/grammars.js.map +1 -1
  58. package/sensor/dist/extraction/index.d.ts +6 -6
  59. package/sensor/dist/extraction/index.js +50 -50
  60. package/sensor/dist/extraction/index.js.map +1 -1
  61. package/sensor/dist/extraction/kernel/decode.d.ts +1 -1
  62. package/sensor/dist/extraction/kernel/decode.js +1 -1
  63. package/sensor/dist/extraction/kernel/index.d.ts +3 -3
  64. package/sensor/dist/extraction/kernel/index.js +6 -6
  65. package/sensor/dist/extraction/kernel/index.js.map +1 -1
  66. package/sensor/dist/extraction/kernel/layout.d.ts +1 -1
  67. package/sensor/dist/extraction/kernel/layout.js +1 -1
  68. package/sensor/dist/extraction/kernel/loader.d.ts +6 -6
  69. package/sensor/dist/extraction/kernel/loader.js +13 -13
  70. package/sensor/dist/extraction/kernel/loader.js.map +1 -1
  71. package/sensor/dist/extraction/languages/cfquery.d.ts +1 -1
  72. package/sensor/dist/extraction/languages/cfquery.js +1 -1
  73. package/sensor/dist/extraction/languages/lua.d.ts +11 -0
  74. package/sensor/dist/extraction/languages/lua.d.ts.map +1 -1
  75. package/sensor/dist/extraction/languages/lua.js +1 -0
  76. package/sensor/dist/extraction/languages/lua.js.map +1 -1
  77. package/sensor/dist/extraction/parse-pool.d.ts +5 -5
  78. package/sensor/dist/extraction/parse-pool.d.ts.map +1 -1
  79. package/sensor/dist/extraction/parse-pool.js +4 -4
  80. package/sensor/dist/extraction/parse-worker.js +1 -1
  81. package/sensor/dist/extraction/parse-worker.js.map +1 -1
  82. package/sensor/dist/extraction/store-writer.d.ts +1 -1
  83. package/sensor/dist/extraction/store-writer.js +1 -1
  84. package/sensor/dist/extraction/svelte-extractor.d.ts +1 -1
  85. package/sensor/dist/extraction/svelte-extractor.js +1 -1
  86. package/sensor/dist/extraction/tree-sitter-helpers.js +1 -1
  87. package/sensor/dist/extraction/tree-sitter.d.ts +2 -2
  88. package/sensor/dist/extraction/tree-sitter.d.ts.map +1 -1
  89. package/sensor/dist/extraction/tree-sitter.js +71 -4
  90. package/sensor/dist/extraction/tree-sitter.js.map +1 -1
  91. package/sensor/dist/extraction/wasm-runtime-flags.d.ts +2 -2
  92. package/sensor/dist/extraction/wasm-runtime-flags.d.ts.map +1 -1
  93. package/sensor/dist/extraction/wasm-runtime-flags.js +5 -5
  94. package/sensor/dist/extraction/wasm-runtime-flags.js.map +1 -1
  95. package/sensor/dist/index.d.ts +36 -36
  96. package/sensor/dist/index.d.ts.map +1 -1
  97. package/sensor/dist/index.js +71 -71
  98. package/sensor/dist/index.js.map +1 -1
  99. package/sensor/dist/mcp/daemon-manager.js +1 -1
  100. package/sensor/dist/mcp/daemon-paths.d.ts +3 -3
  101. package/sensor/dist/mcp/daemon-paths.js +7 -7
  102. package/sensor/dist/mcp/daemon-paths.js.map +1 -1
  103. package/sensor/dist/mcp/daemon-registry.d.ts +2 -2
  104. package/sensor/dist/mcp/daemon-registry.js +5 -5
  105. package/sensor/dist/mcp/daemon.d.ts +7 -7
  106. package/sensor/dist/mcp/daemon.d.ts.map +1 -1
  107. package/sensor/dist/mcp/daemon.js +21 -21
  108. package/sensor/dist/mcp/daemon.js.map +1 -1
  109. package/sensor/dist/mcp/dynamic-boundaries.js +1 -1
  110. package/sensor/dist/mcp/engine.d.ts +9 -9
  111. package/sensor/dist/mcp/engine.d.ts.map +1 -1
  112. package/sensor/dist/mcp/engine.js +44 -44
  113. package/sensor/dist/mcp/engine.js.map +1 -1
  114. package/sensor/dist/mcp/index.d.ts +14 -14
  115. package/sensor/dist/mcp/index.d.ts.map +1 -1
  116. package/sensor/dist/mcp/index.js +41 -41
  117. package/sensor/dist/mcp/index.js.map +1 -1
  118. package/sensor/dist/mcp/liveness-watchdog.js +7 -7
  119. package/sensor/dist/mcp/liveness-watchdog.js.map +1 -1
  120. package/sensor/dist/mcp/ppid-watchdog.d.ts +3 -3
  121. package/sensor/dist/mcp/ppid-watchdog.js +2 -2
  122. package/sensor/dist/mcp/proxy.d.ts.map +1 -1
  123. package/sensor/dist/mcp/proxy.js +37 -37
  124. package/sensor/dist/mcp/proxy.js.map +1 -1
  125. package/sensor/dist/mcp/query-pool.d.ts +3 -3
  126. package/sensor/dist/mcp/query-pool.js +7 -7
  127. package/sensor/dist/mcp/query-pool.js.map +1 -1
  128. package/sensor/dist/mcp/query-worker.d.ts +2 -2
  129. package/sensor/dist/mcp/query-worker.js +7 -7
  130. package/sensor/dist/mcp/query-worker.js.map +1 -1
  131. package/sensor/dist/mcp/server-instructions.d.ts +10 -12
  132. package/sensor/dist/mcp/server-instructions.d.ts.map +1 -1
  133. package/sensor/dist/mcp/server-instructions.js +39 -37
  134. package/sensor/dist/mcp/server-instructions.js.map +1 -1
  135. package/sensor/dist/mcp/session.d.ts +2 -2
  136. package/sensor/dist/mcp/session.js +18 -18
  137. package/sensor/dist/mcp/session.js.map +1 -1
  138. package/sensor/dist/mcp/startup-handshake.d.ts +3 -3
  139. package/sensor/dist/mcp/startup-handshake.d.ts.map +1 -1
  140. package/sensor/dist/mcp/startup-handshake.js +3 -3
  141. package/sensor/dist/mcp/startup-handshake.js.map +1 -1
  142. package/sensor/dist/mcp/tools.d.ts +53 -53
  143. package/sensor/dist/mcp/tools.d.ts.map +1 -1
  144. package/sensor/dist/mcp/tools.js +180 -216
  145. package/sensor/dist/mcp/tools.js.map +1 -1
  146. package/sensor/dist/mcp/transport.d.ts +1 -1
  147. package/sensor/dist/mcp/transport.js +6 -6
  148. package/sensor/dist/mcp/transport.js.map +1 -1
  149. package/sensor/dist/mcp/version.d.ts +2 -2
  150. package/sensor/dist/mcp/version.d.ts.map +1 -1
  151. package/sensor/dist/mcp/version.js +3 -3
  152. package/sensor/dist/mcp/version.js.map +1 -1
  153. package/sensor/dist/project-config.d.ts +6 -6
  154. package/sensor/dist/project-config.d.ts.map +1 -1
  155. package/sensor/dist/project-config.js +10 -10
  156. package/sensor/dist/project-config.js.map +1 -1
  157. package/sensor/dist/resolution/callback-synthesizer.js +4 -4
  158. package/sensor/dist/resolution/callback-synthesizer.js.map +1 -1
  159. package/sensor/dist/resolution/frameworks/drupal.d.ts +3 -3
  160. package/sensor/dist/resolution/frameworks/drupal.js +3 -3
  161. package/sensor/dist/resolution/frameworks/fabric.js +1 -1
  162. package/sensor/dist/resolution/frameworks/fabric.js.map +1 -1
  163. package/sensor/dist/resolution/frameworks/java.js +1 -1
  164. package/sensor/dist/resolution/frameworks/java.js.map +1 -1
  165. package/sensor/dist/resolution/frameworks/svelte.js +1 -1
  166. package/sensor/dist/resolution/frameworks/svelte.js.map +1 -1
  167. package/sensor/dist/resolution/goframe-synthesizer.d.ts +1 -1
  168. package/sensor/dist/resolution/goframe-synthesizer.js +1 -1
  169. package/sensor/dist/resolution/index.d.ts +1 -1
  170. package/sensor/dist/resolution/index.js +9 -9
  171. package/sensor/dist/resolution/index.js.map +1 -1
  172. package/sensor/dist/resolution/name-matcher.js +2 -2
  173. package/sensor/dist/resolution/name-matcher.js.map +1 -1
  174. package/sensor/dist/resolution/resolver-pool.d.ts +2 -2
  175. package/sensor/dist/resolution/resolver-pool.js +4 -4
  176. package/sensor/dist/resolution/resolver-pool.js.map +1 -1
  177. package/sensor/dist/resolution/resolver-worker.js +2 -2
  178. package/sensor/dist/resolution/resolver-worker.js.map +1 -1
  179. package/sensor/dist/resolution/workspace-packages.js +1 -1
  180. package/sensor/dist/resolution/workspace-packages.js.map +1 -1
  181. package/sensor/dist/search/identifier-segments.d.ts +1 -1
  182. package/sensor/dist/search/identifier-segments.js +1 -1
  183. package/sensor/dist/search/query-utils.d.ts +1 -0
  184. package/sensor/dist/search/query-utils.d.ts.map +1 -1
  185. package/sensor/dist/search/query-utils.js +10 -3
  186. package/sensor/dist/search/query-utils.js.map +1 -1
  187. package/sensor/dist/sync/git-hooks.d.ts +9 -9
  188. package/sensor/dist/sync/git-hooks.d.ts.map +1 -1
  189. package/sensor/dist/sync/git-hooks.js +15 -15
  190. package/sensor/dist/sync/git-hooks.js.map +1 -1
  191. package/sensor/dist/sync/watch-policy.d.ts +2 -2
  192. package/sensor/dist/sync/watch-policy.js +5 -5
  193. package/sensor/dist/sync/watch-policy.js.map +1 -1
  194. package/sensor/dist/sync/watcher.d.ts +2 -2
  195. package/sensor/dist/sync/watcher.d.ts.map +1 -1
  196. package/sensor/dist/sync/watcher.js +16 -16
  197. package/sensor/dist/sync/watcher.js.map +1 -1
  198. package/sensor/dist/sync/worktree.d.ts +5 -5
  199. package/sensor/dist/sync/worktree.d.ts.map +1 -1
  200. package/sensor/dist/sync/worktree.js +9 -9
  201. package/sensor/dist/sync/worktree.js.map +1 -1
  202. package/sensor/dist/telemetry/index.d.ts +8 -8
  203. package/sensor/dist/telemetry/index.d.ts.map +1 -1
  204. package/sensor/dist/telemetry/index.js +16 -16
  205. package/sensor/dist/telemetry/index.js.map +1 -1
  206. package/sensor/dist/types.d.ts +2 -2
  207. package/sensor/dist/types.js +1 -1
  208. package/sensor/dist/ui/color.d.ts +2 -2
  209. package/sensor/dist/ui/color.js +2 -2
  210. package/sensor/dist/ui/glyphs.d.ts +3 -3
  211. package/sensor/dist/ui/glyphs.js +7 -7
  212. package/sensor/dist/ui/glyphs.js.map +1 -1
  213. package/sensor/dist/utils.d.ts +4 -4
  214. package/sensor/dist/utils.js +8 -8
  215. package/sensor/dist/utils.js.map +1 -1
  216. package/sensor/package.json +8 -13
  217. package/src/artifact-contracts.mjs +2 -2
  218. package/src/boundary-compiler.mjs +28 -28
  219. package/src/boundary-observation-compiler-v2.mjs +10 -10
  220. package/src/bounded-seam.mjs +144 -0
  221. package/src/bridge-cli.mjs +227 -0
  222. package/src/bridge-config.mjs +346 -0
  223. package/src/bridge-daemon.mjs +328 -0
  224. package/src/bridge-launch-agent.mjs +311 -0
  225. package/src/bridge-server.mjs +309 -0
  226. package/src/cli-help.mjs +163 -0
  227. package/src/control-compiler.mjs +30 -30
  228. package/src/dag-chain.mjs +261 -0
  229. package/src/factory-diagnostics.mjs +8 -7
  230. package/src/hash-chain.mjs +76 -0
  231. package/src/node-version-guard.mjs +5 -4
  232. package/src/project-cli.mjs +392 -0
  233. package/src/project-identity.mjs +71 -0
  234. package/src/rc1-evidence-bundle.mjs +16 -16
  235. package/src/rc1-v4-campaign.mjs +15 -14
  236. package/src/rc1-v5-artifact-set.mjs +2 -2
  237. package/src/rc1-v5-campaign.mjs +15 -14
  238. package/src/rc1-v6-artifact-set.mjs +18 -18
  239. package/src/rc1-v6-campaign.mjs +16 -16
  240. package/src/rc1-v6-causal-binding.mjs +16 -14
  241. package/src/rc1-v6-measurement.mjs +20 -38
  242. package/src/rc2-artifact-set.mjs +45 -40
  243. package/src/rc2-campaign.mjs +48 -66
  244. package/src/rc2-delivery-policy-front-end.mjs +30 -30
  245. package/src/rc2-rc1-transfer-front-end.mjs +5 -5
  246. package/src/rc3-actual-dogfood.mjs +6 -6
  247. package/src/rc3-dogfood-scaffold.mjs +12 -7
  248. package/src/rc3-scripted-campaign.mjs +75 -21
  249. package/src/rc4-stage1-dogfood.mjs +24 -7
  250. package/src/runtime-cli.mjs +2424 -45
  251. package/src/runtime-contracts.mjs +7 -7
  252. package/src/runtime-control-store.mjs +547 -0
  253. package/src/runtime-controller-protocol.mjs +517 -0
  254. package/src/runtime-direct-os-observer.mjs +284 -0
  255. package/src/runtime-engine.mjs +2 -2
  256. package/src/runtime-errors.mjs +1 -1
  257. package/src/runtime-event-store.mjs +15 -43
  258. package/src/runtime-front-end.mjs +26 -26
  259. package/src/runtime-gate-store.mjs +477 -0
  260. package/src/runtime-hold-recompile.mjs +214 -23
  261. package/src/runtime-lifecycle-lock.mjs +290 -0
  262. package/src/runtime-managed-supervisor.mjs +1276 -0
  263. package/src/runtime-multi-epoch-store.mjs +761 -0
  264. package/src/runtime-projection.mjs +62 -0
  265. package/src/seam-transform.mjs +38 -38
  266. package/src/{codegraph-adapter.mjs → sensor-adapter.mjs} +7 -7
  267. package/src/sensor-cli.mjs +107 -0
  268. package/src/sensor-runtime.mjs +48 -0
  269. package/src/timestamp-contract.mjs +8 -0
  270. package/src/todo-chain.mjs +178 -0
  271. package/src/todo-cli.mjs +1032 -0
  272. package/src/todo-contracts.mjs +501 -0
  273. package/src/todo-dashboard-registry.mjs +318 -0
  274. package/src/todo-gantt-html.mjs +416 -0
  275. package/src/todo-gantt-layout.mjs +603 -0
  276. package/src/todo-gantt-live.mjs +269 -0
  277. package/src/todo-gantt-presentation.mjs +217 -0
  278. package/src/todo-gantt-svg.mjs +249 -0
  279. package/src/todo-markdown-renderer.mjs +260 -0
  280. package/src/todo-migration.mjs +260 -0
  281. package/src/todo-narrative-anchor.mjs +130 -0
  282. package/src/todo-revision.mjs +425 -0
  283. package/src/todo-status.mjs +340 -0
  284. package/src/todo-store.mjs +3451 -0
  285. package/src/treatment-compiler.mjs +28 -28
  286. package/src/treatment-runner.mjs +42 -44
  287. package/sensor/dist/bin/codegraph.d.ts +0 -26
  288. package/sensor/dist/bin/codegraph.d.ts.map +0 -1
  289. package/sensor/dist/bin/codegraph.js.map +0 -1
  290. package/sensor/dist/bin/uninstall.d.ts +0 -14
  291. package/sensor/dist/bin/uninstall.d.ts.map +0 -1
  292. package/sensor/dist/bin/uninstall.js +0 -36
  293. package/sensor/dist/bin/uninstall.js.map +0 -1
  294. package/sensor/dist/installer/beta-signup.d.ts +0 -54
  295. package/sensor/dist/installer/beta-signup.d.ts.map +0 -1
  296. package/sensor/dist/installer/beta-signup.js +0 -178
  297. package/sensor/dist/installer/beta-signup.js.map +0 -1
  298. package/sensor/dist/installer/config-writer.d.ts +0 -28
  299. package/sensor/dist/installer/config-writer.d.ts.map +0 -1
  300. package/sensor/dist/installer/config-writer.js +0 -91
  301. package/sensor/dist/installer/config-writer.js.map +0 -1
  302. package/sensor/dist/installer/index.d.ts +0 -142
  303. package/sensor/dist/installer/index.d.ts.map +0 -1
  304. package/sensor/dist/installer/index.js +0 -622
  305. package/sensor/dist/installer/index.js.map +0 -1
  306. package/sensor/dist/installer/instructions-template.d.ts +0 -41
  307. package/sensor/dist/installer/instructions-template.d.ts.map +0 -1
  308. package/sensor/dist/installer/instructions-template.js +0 -53
  309. package/sensor/dist/installer/instructions-template.js.map +0 -1
  310. package/sensor/dist/installer/targets/antigravity.d.ts +0 -57
  311. package/sensor/dist/installer/targets/antigravity.d.ts.map +0 -1
  312. package/sensor/dist/installer/targets/antigravity.js +0 -308
  313. package/sensor/dist/installer/targets/antigravity.js.map +0 -1
  314. package/sensor/dist/installer/targets/claude.d.ts +0 -62
  315. package/sensor/dist/installer/targets/claude.d.ts.map +0 -1
  316. package/sensor/dist/installer/targets/claude.js +0 -454
  317. package/sensor/dist/installer/targets/claude.js.map +0 -1
  318. package/sensor/dist/installer/targets/codex.d.ts +0 -18
  319. package/sensor/dist/installer/targets/codex.d.ts.map +0 -1
  320. package/sensor/dist/installer/targets/codex.js +0 -185
  321. package/sensor/dist/installer/targets/codex.js.map +0 -1
  322. package/sensor/dist/installer/targets/cursor.d.ts +0 -35
  323. package/sensor/dist/installer/targets/cursor.d.ts.map +0 -1
  324. package/sensor/dist/installer/targets/cursor.js +0 -254
  325. package/sensor/dist/installer/targets/cursor.js.map +0 -1
  326. package/sensor/dist/installer/targets/gemini.d.ts +0 -26
  327. package/sensor/dist/installer/targets/gemini.d.ts.map +0 -1
  328. package/sensor/dist/installer/targets/gemini.js +0 -165
  329. package/sensor/dist/installer/targets/gemini.js.map +0 -1
  330. package/sensor/dist/installer/targets/hermes.d.ts +0 -18
  331. package/sensor/dist/installer/targets/hermes.d.ts.map +0 -1
  332. package/sensor/dist/installer/targets/hermes.js +0 -359
  333. package/sensor/dist/installer/targets/hermes.js.map +0 -1
  334. package/sensor/dist/installer/targets/kiro.d.ts +0 -27
  335. package/sensor/dist/installer/targets/kiro.d.ts.map +0 -1
  336. package/sensor/dist/installer/targets/kiro.js +0 -178
  337. package/sensor/dist/installer/targets/kiro.js.map +0 -1
  338. package/sensor/dist/installer/targets/opencode.d.ts +0 -38
  339. package/sensor/dist/installer/targets/opencode.d.ts.map +0 -1
  340. package/sensor/dist/installer/targets/opencode.js +0 -288
  341. package/sensor/dist/installer/targets/opencode.js.map +0 -1
  342. package/sensor/dist/installer/targets/registry.d.ts +0 -35
  343. package/sensor/dist/installer/targets/registry.d.ts.map +0 -1
  344. package/sensor/dist/installer/targets/registry.js +0 -91
  345. package/sensor/dist/installer/targets/registry.js.map +0 -1
  346. package/sensor/dist/installer/targets/shared.d.ts +0 -101
  347. package/sensor/dist/installer/targets/shared.d.ts.map +0 -1
  348. package/sensor/dist/installer/targets/shared.js +0 -264
  349. package/sensor/dist/installer/targets/shared.js.map +0 -1
  350. package/sensor/dist/installer/targets/toml.d.ts +0 -52
  351. package/sensor/dist/installer/targets/toml.d.ts.map +0 -1
  352. package/sensor/dist/installer/targets/toml.js +0 -147
  353. package/sensor/dist/installer/targets/toml.js.map +0 -1
  354. package/sensor/dist/installer/targets/types.d.ts +0 -108
  355. package/sensor/dist/installer/targets/types.d.ts.map +0 -1
  356. package/sensor/dist/installer/targets/types.js +0 -16
  357. package/sensor/dist/installer/targets/types.js.map +0 -1
  358. package/sensor/dist/upgrade/index.d.ts +0 -171
  359. package/sensor/dist/upgrade/index.d.ts.map +0 -1
  360. package/sensor/dist/upgrade/index.js +0 -659
  361. package/sensor/dist/upgrade/index.js.map +0 -1
  362. package/sensor/dist/upgrade/remove-binary.d.ts +0 -87
  363. package/sensor/dist/upgrade/remove-binary.d.ts.map +0 -1
  364. package/sensor/dist/upgrade/remove-binary.js +0 -289
  365. package/sensor/dist/upgrade/remove-binary.js.map +0 -1
  366. package/sensor/dist/upgrade/update-check.d.ts +0 -92
  367. package/sensor/dist/upgrade/update-check.d.ts.map +0 -1
  368. package/sensor/dist/upgrade/update-check.js +0 -258
  369. package/sensor/dist/upgrade/update-check.js.map +0 -1
  370. package/src/bootstrap.mjs +0 -88
@@ -12,7 +12,7 @@ const INPUT_KEYS = [
12
12
  'manualEvidence',
13
13
  'querySet',
14
14
  'sourceSnapshot',
15
- 'codegraphEvidence',
15
+ 'sensorEvidence',
16
16
  ];
17
17
  const EXPECTED_CANDIDATE_ID = 'shard-delivery-policy-registry-by-channel';
18
18
  const EXPECTED_ORACLE_DIGEST_BY_CANDIDATE_DIGEST = Object.freeze({
@@ -30,7 +30,7 @@ const QUERY_OPERATIONS = new Set([
30
30
  'impact',
31
31
  'affected',
32
32
  ]);
33
- const CODEGRAPH_OUTCOMES = new Set([
33
+ const SENSOR_OUTCOMES = new Set([
34
34
  'ready',
35
35
  'symbol_absent',
36
36
  'empty',
@@ -106,7 +106,7 @@ function resourceId(kind, target) {
106
106
 
107
107
  function queryMapFor(querySet) {
108
108
  if (!exactRecord(querySet, ['schema', 'queries'])
109
- || querySet.schema !== 'lattice.codegraph_query_set.v2') {
109
+ || querySet.schema !== 'lattice.sensor_query_set.v2') {
110
110
  fail('query set shapeまたはschemaが不正');
111
111
  }
112
112
  requireArray(querySet.queries, 'querySet.queries');
@@ -554,7 +554,7 @@ function validatePortableOutcomeShape(outcome, query) {
554
554
  if (!plainRecord(outcome)
555
555
  || outcome.id !== query.id
556
556
  || outcome.operation !== query.operation
557
- || !CODEGRAPH_OUTCOMES.has(outcome.outcome)) {
557
+ || !SENSOR_OUTCOMES.has(outcome.outcome)) {
558
558
  fail(`portable outcome ${query.id} identityが不正`);
559
559
  }
560
560
  if (query.operation === 'status') {
@@ -609,7 +609,7 @@ function assertFreshStatus(statusOutcome) {
609
609
  || status.index.state !== 'complete'
610
610
  || status.index.pendingRefs !== 0
611
611
  || status.index.reindexRecommended !== false) {
612
- fail('portable Codegraph statusがfresh/completeではない');
612
+ fail('portable LatticeSensor statusがfresh/completeではない');
613
613
  }
614
614
  }
615
615
 
@@ -642,13 +642,13 @@ function validateAffectedOutcome(outcome, query, filesByPath) {
642
642
  }
643
643
 
644
644
  function validatePortableEvidence({
645
- codegraphEvidence,
645
+ sensorEvidence,
646
646
  querySet,
647
647
  queryById,
648
648
  candidateSpec,
649
649
  filesByPath,
650
650
  }) {
651
- if (!exactRecord(codegraphEvidence, [
651
+ if (!exactRecord(sensorEvidence, [
652
652
  'schema',
653
653
  'projection',
654
654
  'query_set_digest',
@@ -656,22 +656,22 @@ function validatePortableEvidence({
656
656
  'per_query',
657
657
  'aggregate_digest',
658
658
  ])
659
- || codegraphEvidence.schema !== 'lattice.codegraph_portable_preimage.v1'
660
- || codegraphEvidence.projection !== 'lattice.codegraph_portable_outcome.v1'
661
- || codegraphEvidence.query_set_digest !== digestArtifact(querySet)) {
659
+ || sensorEvidence.schema !== 'lattice.sensor_portable_preimage.v1'
660
+ || sensorEvidence.projection !== 'lattice.sensor_portable_outcome.v1'
661
+ || sensorEvidence.query_set_digest !== digestArtifact(querySet)) {
662
662
  fail('portable evidence identity/query bindingが不正');
663
663
  }
664
- requireArray(codegraphEvidence.outcomes, 'portable.outcomes');
665
- requireArray(codegraphEvidence.per_query, 'portable.per_query');
666
- if (codegraphEvidence.outcomes.length !== querySet.queries.length
667
- || codegraphEvidence.per_query.length !== querySet.queries.length) {
664
+ requireArray(sensorEvidence.outcomes, 'portable.outcomes');
665
+ requireArray(sensorEvidence.per_query, 'portable.per_query');
666
+ if (sensorEvidence.outcomes.length !== querySet.queries.length
667
+ || sensorEvidence.per_query.length !== querySet.queries.length) {
668
668
  fail('portable outcome件数がquery setと一致しない');
669
669
  }
670
670
  const byId = new Map();
671
671
  for (let index = 0; index < querySet.queries.length; index += 1) {
672
672
  const query = querySet.queries[index];
673
- const outcome = codegraphEvidence.outcomes[index];
674
- const receipt = codegraphEvidence.per_query[index];
673
+ const outcome = sensorEvidence.outcomes[index];
674
+ const receipt = sensorEvidence.per_query[index];
675
675
  validatePortableOutcomeShape(outcome, query);
676
676
  if (!exactRecord(receipt, ['id', 'operation', 'outcome', 'result_digest'])
677
677
  || receipt.id !== query.id
@@ -683,12 +683,12 @@ function validatePortableEvidence({
683
683
  byId.set(query.id, outcome);
684
684
  }
685
685
  const aggregatePreimage = {
686
- projection: codegraphEvidence.projection,
687
- query_set_digest: codegraphEvidence.query_set_digest,
688
- outcomes: codegraphEvidence.outcomes,
686
+ projection: sensorEvidence.projection,
687
+ query_set_digest: sensorEvidence.query_set_digest,
688
+ outcomes: sensorEvidence.outcomes,
689
689
  };
690
- if (!DIGEST.test(codegraphEvidence.aggregate_digest)
691
- || codegraphEvidence.aggregate_digest !== digestArtifact(aggregatePreimage)) {
690
+ if (!DIGEST.test(sensorEvidence.aggregate_digest)
691
+ || sensorEvidence.aggregate_digest !== digestArtifact(aggregatePreimage)) {
692
692
  fail('portable aggregate digestがfull preimageから再計算できない');
693
693
  }
694
694
  assertFreshStatus(byId.get(candidateSpec.compiler_contract.status_query_id));
@@ -899,7 +899,7 @@ function structuralResources({
899
899
  candidateDigest,
900
900
  topology,
901
901
  outcomeById,
902
- codegraphEvidence,
902
+ sensorEvidence,
903
903
  }) {
904
904
  const groups = new Map();
905
905
  const add = (kind, target, todoId, surface, ref) => {
@@ -958,12 +958,12 @@ function structuralResources({
958
958
  const queryIds = [...group.queryIds].sort(compareText);
959
959
  const outcomes = queryIds.map((id) => outcomeById.get(id));
960
960
  if (outcomes.some((outcome) => !outcome || outcome.outcome !== 'ready')) {
961
- fail(`active resource ${group.kind}:${group.target}のCodegraph evidenceがreadyではない`);
961
+ fail(`active resource ${group.kind}:${group.target}のLatticeSensor evidenceがreadyではない`);
962
962
  }
963
963
  const evidenceDigest = digestArtifact({
964
- schema: 'lattice.rc2.codegraph_resource_evidence.v1',
964
+ schema: 'lattice.rc2.sensor_resource_evidence.v1',
965
965
  topology,
966
- portable_aggregate_digest: codegraphEvidence.aggregate_digest,
966
+ portable_aggregate_digest: sensorEvidence.aggregate_digest,
967
967
  query_ids: queryIds,
968
968
  outcomes,
969
969
  });
@@ -974,8 +974,8 @@ function structuralResources({
974
974
  todo_ids: [...group.todoIds].sort(compareText),
975
975
  provenance: [
976
976
  {
977
- source: 'codegraph',
978
- evidence_ref: `portable-codegraph#${queryIds.join(',')}`,
977
+ source: 'sensor',
978
+ evidence_ref: `portable-sensor#${queryIds.join(',')}`,
979
979
  evidence_digest: evidenceDigest,
980
980
  status: 'ready',
981
981
  },
@@ -1030,7 +1030,7 @@ export function compileDeliveryPolicyBoundaryBundleV2(inputs) {
1030
1030
  manualEvidence,
1031
1031
  querySet,
1032
1032
  sourceSnapshot,
1033
- codegraphEvidence,
1033
+ sensorEvidence,
1034
1034
  } = inputs;
1035
1035
 
1036
1036
  if (!validatePlanInput(planInput)) fail('plan inputが不正');
@@ -1040,7 +1040,7 @@ export function compileDeliveryPolicyBoundaryBundleV2(inputs) {
1040
1040
  assertTodoBindings(planInput, candidateSpec, manualByTodo);
1041
1041
  const snapshot = validateSourceSnapshot(sourceSnapshot, candidateSpec);
1042
1042
  const outcomeById = validatePortableEvidence({
1043
- codegraphEvidence,
1043
+ sensorEvidence,
1044
1044
  querySet,
1045
1045
  queryById,
1046
1046
  candidateSpec,
@@ -1055,7 +1055,7 @@ export function compileDeliveryPolicyBoundaryBundleV2(inputs) {
1055
1055
  candidateDigest,
1056
1056
  topology: snapshot.topology,
1057
1057
  outcomeById,
1058
- codegraphEvidence,
1058
+ sensorEvidence,
1059
1059
  }),
1060
1060
  ...manualResources(manualByTodo, manualEvidenceDigest),
1061
1061
  ];
@@ -30,7 +30,7 @@ const QUERY_OPERATIONS = new Set([
30
30
  'impact',
31
31
  'affected',
32
32
  ]);
33
- const V2_CODEGRAPH_STATUSES = new Set([
33
+ const V2_SENSOR_STATUSES = new Set([
34
34
  'ready',
35
35
  'symbol_absent',
36
36
  'empty',
@@ -119,7 +119,7 @@ function validateCandidateSpec(candidateSpec) {
119
119
 
120
120
  function queryMapFor(querySet) {
121
121
  if (!exactRecord(querySet, ['schema', 'queries'])
122
- || querySet.schema !== 'lattice.codegraph_query_set.v2') {
122
+ || querySet.schema !== 'lattice.sensor_query_set.v2') {
123
123
  fail('query set shapeまたはschemaが不正');
124
124
  }
125
125
  requireArray(querySet.queries, 'querySet.queries');
@@ -341,8 +341,8 @@ function structuralResources({
341
341
  }
342
342
  const queryId = [...group.queryIds][0];
343
343
  const evidence = evidenceById.get(queryId);
344
- if (!evidence || !V2_CODEGRAPH_STATUSES.has(evidence.status)) {
345
- fail(`resource ${group.kind}:${group.target}のCodegraph statusをv2へ保持できない`);
344
+ if (!evidence || !V2_SENSOR_STATUSES.has(evidence.status)) {
345
+ fail(`resource ${group.kind}:${group.target}のLatticeSensor statusをv2へ保持できない`);
346
346
  }
347
347
  return {
348
348
  resource_id: resourceId(group.kind, group.target),
@@ -351,7 +351,7 @@ function structuralResources({
351
351
  todo_ids: [...group.todoIds].sort(compareText),
352
352
  provenance: [
353
353
  {
354
- source: 'codegraph',
354
+ source: 'sensor',
355
355
  evidence_ref: `boundary-manifest.graph_evidence#${queryId}`,
356
356
  evidence_digest: evidence.result_digest,
357
357
  status: evidence.status,
@@ -4,7 +4,7 @@ import { tmpdir } from 'node:os';
4
4
  import path from 'node:path';
5
5
 
6
6
  import { digestArtifact } from './artifact-contracts.mjs';
7
- import { collectCodegraphEvidence } from './codegraph-adapter.mjs';
7
+ import { collectSensorEvidence } from './sensor-adapter.mjs';
8
8
  import { scaffoldRc3DogfoodRepo, verifyRc3DogfoodScaffold } from './rc3-dogfood-scaffold.mjs';
9
9
  import { compileRuntimePlanV1, evidenceFromCollectedOutcomes } from './runtime-front-end.mjs';
10
10
  import {
@@ -95,7 +95,7 @@ function witness(todoId, target, affectedTests) {
95
95
  writes: [target],
96
96
  resources: [],
97
97
  state_effects: [],
98
- codegraph_provenance: {
98
+ sensor_provenance: {
99
99
  queries: [{ query_id: `q-aff-${todoId}`, expect: { kind: 'affected', path: target } }],
100
100
  },
101
101
  affected_tests: affectedTests,
@@ -152,7 +152,7 @@ export async function initActualDogfoodRun({ latticeRoot, stateDir }) {
152
152
  { id: `probe-${index}`, operation: 'affected', target }
153
153
  )),
154
154
  };
155
- const probed = await collectCodegraphEvidence({ cwd: scaffold.repoRoot, querySet: probeQuerySet });
155
+ const probed = await collectSensorEvidence({ cwd: scaffold.repoRoot, querySet: probeQuerySet });
156
156
  const affectedByTarget = {};
157
157
  probed.outcomes.forEach((outcome, index) => {
158
158
  const entry = Array.isArray(outcome.targets) ? outcome.targets[0] : null;
@@ -172,7 +172,7 @@ export async function initActualDogfoodRun({ latticeRoot, stateDir }) {
172
172
  TB: witness('TB', ORACLE, affectedByTarget[ORACLE]),
173
173
  TC: witness('TC', SHARED_TEST, affectedByTarget[SHARED_TEST]),
174
174
  },
175
- codegraph_query_set: {
175
+ sensor_query_set: {
176
176
  queries: [
177
177
  { id: 'q-status', operation: 'status' },
178
178
  { id: 'q-aff-TA', operation: 'affected', target: ENTRY },
@@ -185,10 +185,10 @@ export async function initActualDogfoodRun({ latticeRoot, stateDir }) {
185
185
  };
186
186
  request.request_digest = selfDigest(request, 'request_digest');
187
187
 
188
- const collected = await collectCodegraphEvidence({ cwd: scaffold.repoRoot, querySet: request.codegraph_query_set });
188
+ const collected = await collectSensorEvidence({ cwd: scaffold.repoRoot, querySet: request.sensor_query_set });
189
189
  const compiled = compileRuntimePlanV1({
190
190
  request,
191
- codegraphEvidence: evidenceFromCollectedOutcomes({ querySet: request.codegraph_query_set, collected }),
191
+ sensorEvidence: evidenceFromCollectedOutcomes({ querySet: request.sensor_query_set, collected }),
192
192
  planRef: 'plan-rc3i-actual-e1',
193
193
  planEpoch: 1,
194
194
  predecessorRefs: [],
@@ -3,6 +3,8 @@ import { createHash } from 'node:crypto';
3
3
  import { lstat, mkdir, readFile, writeFile } from 'node:fs/promises';
4
4
  import path from 'node:path';
5
5
 
6
+ import { invokeSensorCli } from './sensor-runtime.mjs';
7
+
6
8
  import { digestArtifact } from './artifact-contracts.mjs';
7
9
 
8
10
  /**
@@ -115,15 +117,16 @@ function runRaw(command, args, cwd) {
115
117
  });
116
118
  }
117
119
 
118
- // Lattice規約と同じく`.codegraph/.gitignore`(自身以外を無視)をtracked fileとして
119
- // commitへ含め、`codegraph init`後もtreeがcleanのままになるようにする。
120
- const CODEGRAPH_BOOTSTRAP_PATH = '.codegraph/.gitignore';
120
+ // disposable repo自身のroot ignoreへ生成sensor stateを明示し、init後もtreeをcleanに保つ。
121
+ // Lattice sourceのtracked bytesとは別物なのでsource provenanceへ混ぜない。
122
+ const SENSOR_IGNORE_PATH = '.gitignore';
123
+ const SENSOR_IGNORE_BYTES = Buffer.from('.lattice/sensor/\n', 'utf8');
121
124
 
122
125
  async function readLatticeSources(latticeRoot) {
123
126
  // bytesの正はHEAD blob(base commitへ束縛するため)。working treeが
124
127
  // HEADと食い違う場合は、dirty bytesをbase shaへ誤帰属させずrejectする。
125
128
  const bytesByPath = new Map();
126
- for (const relativePath of [...RC3_DOGFOOD_SCAFFOLD_PATHS, CODEGRAPH_BOOTSTRAP_PATH]) {
129
+ for (const relativePath of RC3_DOGFOOD_SCAFFOLD_PATHS) {
127
130
  let headBytes;
128
131
  try {
129
132
  headBytes = await runRaw('git', ['show', `HEAD:${relativePath}`], latticeRoot);
@@ -181,6 +184,8 @@ export async function scaffoldRc3DogfoodRepo(options = {}) {
181
184
  }
182
185
  const repoRoot = path.join(workRoot, 'repo');
183
186
  const { bytesByPath, candidateDigest, oracleDigest } = await readLatticeSources(latticeRoot);
187
+ const targetBytesByPath = new Map(bytesByPath);
188
+ targetBytesByPath.set(SENSOR_IGNORE_PATH, SENSOR_IGNORE_BYTES);
184
189
  const latticeHead = (await run('git', ['rev-parse', 'HEAD'], latticeRoot)).stdout.trim();
185
190
  if (!GIT_SHA1.test(latticeHead)) fail('Lattice HEADを解決できない');
186
191
 
@@ -192,7 +197,7 @@ export async function scaffoldRc3DogfoodRepo(options = {}) {
192
197
  if (error?.code === 'EEXIST') fail(`repoRootが既に存在する(上書き禁止): ${repoRoot}`);
193
198
  throw error;
194
199
  }
195
- for (const [relativePath, bytes] of bytesByPath) {
200
+ for (const [relativePath, bytes] of targetBytesByPath) {
196
201
  const absolutePath = path.join(repoRoot, relativePath);
197
202
  await mkdir(path.dirname(absolutePath), { recursive: true });
198
203
  await writeFile(absolutePath, bytes);
@@ -202,7 +207,7 @@ export async function scaffoldRc3DogfoodRepo(options = {}) {
202
207
  await run('git', [...GIT_IDENTITY, 'commit', '--quiet', '-m', 'rc3 dogfood scaffold'], repoRoot);
203
208
  const baseSha = (await run('git', ['rev-parse', 'HEAD'], repoRoot)).stdout.trim();
204
209
  if (!GIT_SHA1.test(baseSha)) fail('scaffold base shaを解決できない');
205
- await run('codegraph', ['init', '.'], repoRoot);
210
+ await invokeSensorCli(run, ['init', '.'], repoRoot);
206
211
 
207
212
  const status = await run('git', ['status', '--porcelain=v1', '--untracked-files=all'], repoRoot);
208
213
  if (status.stdout !== '') fail(`scaffold直後のtreeがcleanではない: ${status.stdout.trim()}`);
@@ -224,7 +229,7 @@ export async function scaffoldRc3DogfoodRepo(options = {}) {
224
229
  target: Object.freeze({
225
230
  root_kind: 'disposable-dogfood',
226
231
  base_sha: baseSha,
227
- path_digests: Object.freeze(pathDigests(bytesByPath)),
232
+ path_digests: Object.freeze(pathDigests(targetBytesByPath)),
228
233
  }),
229
234
  predeclared_treatment: Object.freeze({
230
235
  epoch: EXPECTED_TREATMENT_EPOCH,
@@ -3,11 +3,13 @@ import { tmpdir } from 'node:os';
3
3
  import path from 'node:path';
4
4
 
5
5
  import { digestArtifact } from './artifact-contracts.mjs';
6
- import { collectCodegraphEvidence } from './codegraph-adapter.mjs';
6
+ import { collectSensorEvidence } from './sensor-adapter.mjs';
7
+ import { spawnSensorCliSync } from './sensor-runtime.mjs';
7
8
  import { scaffoldRc3DogfoodRepo, verifyRc3DogfoodScaffold } from './rc3-dogfood-scaffold.mjs';
8
9
  import { compileRuntimePlanV1, evidenceFromCollectedOutcomes } from './runtime-front-end.mjs';
9
10
  import {
10
11
  adjudicatePendingReceipts,
12
+ buildNextRunEvent,
11
13
  buildExecutorPackets,
12
14
  classifyCheckpointObservation,
13
15
  closeRunIfComplete,
@@ -45,10 +47,11 @@ import { selfDigest } from './runtime-contracts.mjs';
45
47
  */
46
48
 
47
49
  const RUN_TIMESTAMP = '2026-07-17T00:00:00.000Z';
48
- // dogfood scaffoldの実在3 file(Codegraph観測がreadyになる対象)をTODO所有面にする。
50
+ // dogfood scaffoldの実在3 file(LatticeSensor観測がreadyになる対象)をTODO所有面にする。
49
51
  const DOC_A = 'research/fixtures/delivery-policy-registry/src/delivery-policy-registry.mjs';
50
52
  const DOC_B = 'src/rc2-delivery-policy-oracle.mjs';
51
53
  const DOC_C = 'test/rc2-delivery-policy-fixture.test.mjs';
54
+ const MAX_SCRIPTED_REBINDS = 64;
52
55
 
53
56
  function fail(reason) {
54
57
  throw new TypeError(`rc3 campaign契約違反: ${reason}`);
@@ -61,7 +64,7 @@ function docWitness(todoId, docPath, affectedTests, { extraWrites = [], unknowns
61
64
  writes: [docPath, ...extraWrites],
62
65
  resources: stateEffects.map(({ resource_id: id }) => id),
63
66
  state_effects: stateEffects,
64
- codegraph_provenance: {
67
+ sensor_provenance: {
65
68
  queries: [{ query_id: `q-aff-${todoId}`, expect: { kind: 'affected', path: docPath } }],
66
69
  },
67
70
  affected_tests: affectedTests,
@@ -70,14 +73,14 @@ function docWitness(todoId, docPath, affectedTests, { extraWrites = [], unknowns
70
73
  }
71
74
 
72
75
  /**
73
- * manual witnessのaffected test宣言をfresh Codegraph観測から導出する
76
+ * manual witnessのaffected test宣言をfresh LatticeSensor観測から導出する
74
77
  * (宣言と観測のexact一致契約の下で、正解宣言を機械的に得る)。
75
78
  */
76
79
  async function probeAffectedTests(repoRoot, targets) {
77
80
  const querySet = {
78
81
  queries: targets.map((target, index) => ({ id: `probe-${index}`, operation: 'affected', target })),
79
82
  };
80
- const collected = await collectCodegraphEvidence({ cwd: repoRoot, querySet });
83
+ const collected = await collectSensorEvidence({ cwd: repoRoot, querySet });
81
84
  const byTarget = {};
82
85
  collected.outcomes.forEach((outcome, index) => {
83
86
  const entry = Array.isArray(outcome.targets) ? outcome.targets[0] : null;
@@ -112,7 +115,7 @@ function buildDocRequest({ requestId, baseSha, todos, capacity }) {
112
115
  capacity: { executors: capacity },
113
116
  todos: Object.keys(todos).map((todoId) => ({ todo_id: todoId })),
114
117
  manual_witness: todos,
115
- codegraph_query_set: { queries },
118
+ sensor_query_set: { queries },
116
119
  executor_capability: { adapters: ['isolated-worktree'] },
117
120
  claim_mode: 'exact_minimum',
118
121
  };
@@ -121,17 +124,17 @@ function buildDocRequest({ requestId, baseSha, todos, capacity }) {
121
124
  }
122
125
 
123
126
  async function compileForRepo({ request, repoRoot }) {
124
- const collected = await collectCodegraphEvidence({
127
+ const collected = await collectSensorEvidence({
125
128
  cwd: repoRoot,
126
- querySet: request.codegraph_query_set,
129
+ querySet: request.sensor_query_set,
127
130
  });
128
- const codegraphEvidence = evidenceFromCollectedOutcomes({
129
- querySet: request.codegraph_query_set,
131
+ const sensorEvidence = evidenceFromCollectedOutcomes({
132
+ querySet: request.sensor_query_set,
130
133
  collected,
131
134
  });
132
135
  return compileRuntimePlanV1({
133
136
  request,
134
- codegraphEvidence,
137
+ sensorEvidence,
135
138
  planRef: `plan-${request.request_id}-e1`,
136
139
  planEpoch: 1,
137
140
  predecessorRefs: [],
@@ -188,6 +191,43 @@ async function driveToClose({ runId, plan, events, packets, manifests, adapter,
188
191
  return null;
189
192
  }
190
193
 
194
+ /**
195
+ * legacy scripted campaign内だけで、controller rebindとactivation gateの完了を模擬する。
196
+ * productionのACK/gate検証を迂回する入口ではなく、既にscriptで完了させたactivationを
197
+ * event contractへ投影するための有界fixture helperである。
198
+ */
199
+ function activateScriptedRecompile({ runId, events, plan, planDiff, rebindPackets }) {
200
+ const entries = Object.entries(rebindPackets).sort(([left], [right]) => left.localeCompare(right));
201
+ if (entries.length > MAX_SCRIPTED_REBINDS) {
202
+ fail(`scripted rebind数が上限を超えた: ${entries.length}`);
203
+ }
204
+ let next = [...events];
205
+ for (const [todoId, packet] of entries) {
206
+ if (packet?.todo_id !== todoId || packet?.new_plan_epoch !== plan.plan_epoch) {
207
+ fail(`scripted rebind packetの帰属が不正: ${todoId}`);
208
+ }
209
+ next.push(buildNextRunEvent({
210
+ events: next,
211
+ runId,
212
+ kind: 'epoch_rebound',
213
+ planEpoch: plan.plan_epoch,
214
+ subject: { kind: 'todo', ref: todoId },
215
+ payload: packet,
216
+ recordedAt: RUN_TIMESTAMP,
217
+ }));
218
+ }
219
+ next.push(buildNextRunEvent({
220
+ events: next,
221
+ runId,
222
+ kind: 'intake_resumed',
223
+ planEpoch: plan.plan_epoch,
224
+ subject: { kind: 'runtime_plan', ref: plan.plan_ref },
225
+ payload: { plan_diff_digest: planDiff.diff_digest },
226
+ recordedAt: RUN_TIMESTAMP,
227
+ }));
228
+ return next;
229
+ }
230
+
191
231
  function decisionReplayChecks({ plan, events }) {
192
232
  const checks = [];
193
233
  events.forEach((event, index) => {
@@ -337,6 +377,13 @@ async function runLateConflict({ scaffold }) {
337
377
  executor_handle: projectRuntimeState({ events }).dispatches.TC.payload.executor_handle,
338
378
  rebind: recompiled.rebindPackets.TC,
339
379
  });
380
+ events = activateScriptedRecompile({
381
+ runId,
382
+ events,
383
+ plan: recompiled.newPlan,
384
+ planDiff: recompiled.planDiff,
385
+ rebindPackets: recompiled.rebindPackets,
386
+ });
340
387
  {
341
388
  const tcTerminal = await observeExecutor({
342
389
  runId, plan: recompiled.newPlan, events, adapter, todoId: 'TC', recordedAt: RUN_TIMESTAMP,
@@ -593,7 +640,7 @@ async function runAcceptedSeam({ latticeRoot }) {
593
640
  writes: [entryPath],
594
641
  resources: [],
595
642
  state_effects: [],
596
- codegraph_provenance: {
643
+ sensor_provenance: {
597
644
  queries: [
598
645
  { query_id: 'q-entry', expect: { kind: 'symbol', name: 'resolveDeliveryPolicy', path: entryPath } },
599
646
  { query_id: 'q-aff-entry', expect: { kind: 'affected', path: entryPath } },
@@ -609,7 +656,7 @@ async function runAcceptedSeam({ latticeRoot }) {
609
656
  capacity: { executors: 2 },
610
657
  todos: [{ todo_id: 'Temail' }, { todo_id: 'Tsms' }],
611
658
  manual_witness: { Temail: preWitness(), Tsms: preWitness() },
612
- codegraph_query_set: {
659
+ sensor_query_set: {
613
660
  queries: [
614
661
  { id: 'q-status', operation: 'status' },
615
662
  { id: 'q-entry', operation: 'query', target: 'resolveDeliveryPolicy' },
@@ -663,8 +710,8 @@ async function runAcceptedSeam({ latticeRoot }) {
663
710
  runGit(['-c', 'user.email=rc3h@lattice.invalid', '-c', 'user.name=rc3h', 'commit', '--quiet', '-m', 'accepted seam']);
664
711
  const newBase = runGit(['rev-parse', 'HEAD']).trim();
665
712
  // fresh reindex(accepted seam後は必ず再index。syncで新規fileを収載する)。
666
- const syncResult = spawnSync('codegraph', ['sync', '.'], { cwd: scaffold.repoRoot, encoding: 'utf8' });
667
- if (syncResult.status !== 0) fail(`codegraph reindex(sync)が失敗: ${syncResult.stderr}`);
713
+ const syncResult = spawnSensorCliSync(['sync', '.'], { cwd: scaffold.repoRoot, encoding: 'utf8' });
714
+ if (syncResult.status !== 0) fail(`sensor reindex(sync)が失敗: ${syncResult.stderr}`);
668
715
 
669
716
  const emailPath = 'research/fixtures/delivery-policy-registry/src/email-policy.mjs';
670
717
  const smsPath = 'research/fixtures/delivery-policy-registry/src/sms-policy.mjs';
@@ -675,7 +722,7 @@ async function runAcceptedSeam({ latticeRoot }) {
675
722
  writes: [filePath],
676
723
  resources: [],
677
724
  state_effects: [],
678
- codegraph_provenance: {
725
+ sensor_provenance: {
679
726
  queries: [
680
727
  { query_id: `q-${todoId}`, expect: { kind: 'symbol', name: symbol, path: filePath } },
681
728
  { query_id: `q-aff-${todoId}`, expect: { kind: 'affected', path: filePath } },
@@ -694,7 +741,7 @@ async function runAcceptedSeam({ latticeRoot }) {
694
741
  Temail: postWitness('Temail', 'resolveEmailPolicy', emailPath),
695
742
  Tsms: postWitness('Tsms', 'resolveSmsPolicy', smsPath),
696
743
  },
697
- codegraph_query_set: {
744
+ sensor_query_set: {
698
745
  queries: [
699
746
  { id: 'q-status', operation: 'status' },
700
747
  { id: 'q-Temail', operation: 'query', target: 'resolveEmailPolicy' },
@@ -710,13 +757,13 @@ async function runAcceptedSeam({ latticeRoot }) {
710
757
  // post-seam planはgenesisではなく、accepted transformとpre planをpredecessorに
711
758
  // 持つepoch 2 planとしてcompileする(Decision 11.2/plan barrier)。
712
759
  const transformArtifactDigest = digestArtifact(transformResult.artifact);
713
- const postCollected = await collectCodegraphEvidence({
714
- cwd: scaffold.repoRoot, querySet: postRequest.codegraph_query_set,
760
+ const postCollected = await collectSensorEvidence({
761
+ cwd: scaffold.repoRoot, querySet: postRequest.sensor_query_set,
715
762
  });
716
763
  const postCompiled = compileRuntimePlanV1({
717
764
  request: postRequest,
718
- codegraphEvidence: evidenceFromCollectedOutcomes({
719
- querySet: postRequest.codegraph_query_set, collected: postCollected,
765
+ sensorEvidence: evidenceFromCollectedOutcomes({
766
+ querySet: postRequest.sensor_query_set, collected: postCollected,
720
767
  }),
721
768
  planRef: `plan-${postRequest.request_id}-e2`,
722
769
  planEpoch: 2,
@@ -840,6 +887,13 @@ async function runIrreducibleConflict({ scaffold }) {
840
887
  });
841
888
  events = recompiled.events;
842
889
  const newPlan = recompiled.newPlan;
890
+ events = activateScriptedRecompile({
891
+ runId,
892
+ events,
893
+ plan: newPlan,
894
+ planDiff: recompiled.planDiff,
895
+ rebindPackets: recompiled.rebindPackets,
896
+ });
843
897
  // vN+1でserial redispatch(conflict pairは同時に載らない)。
844
898
  const epoch2Adapter = createScriptedExecutorAdapter({
845
899
  script: { TA: [{ kind: 'terminal' }], TB: [{ kind: 'terminal' }] },
@@ -1,10 +1,11 @@
1
1
  import { spawn } from 'node:child_process';
2
+ import { createHash } from 'node:crypto';
2
3
  import { mkdir, mkdtemp, readFile, rename, writeFile } from 'node:fs/promises';
3
4
  import { tmpdir } from 'node:os';
4
5
  import path from 'node:path';
5
6
 
6
7
  import { digestArtifact } from './artifact-contracts.mjs';
7
- import { collectCodegraphEvidence } from './codegraph-adapter.mjs';
8
+ import { collectSensorEvidence } from './sensor-adapter.mjs';
8
9
  import { compileRuntimePlanV1, evidenceFromCollectedOutcomes } from './runtime-front-end.mjs';
9
10
  import {
10
11
  adjudicatePendingReceipts,
@@ -142,7 +143,7 @@ function stateAdapter(state) {
142
143
  }
143
144
 
144
145
  /**
145
- * step 1: request読込・codegraph evidence収集・compile・全TODO dispatch
146
+ * step 1: request読込・sensor evidence収集・compile・全TODO dispatch
146
147
  * (worktree provision)まで。返り値のworktree pathsへ、親が実agentを
147
148
  * dispatchする。packetにはisolation_contractが含まれる。
148
149
  */
@@ -151,11 +152,11 @@ export async function initStage1Run({ latticeRoot, cloneRoot, requestPath, state
151
152
  const request = JSON.parse(await readFile(requestPath, 'utf8'));
152
153
  if (!validateRunRequest(request)) fail('run_requestがlattice.run_request.v1 contractを満たさない');
153
154
 
154
- const collected = await collectCodegraphEvidence({ cwd: cloneRoot, querySet: request.codegraph_query_set });
155
- const codegraphEvidence = evidenceFromCollectedOutcomes({ querySet: request.codegraph_query_set, collected });
155
+ const collected = await collectSensorEvidence({ cwd: cloneRoot, querySet: request.sensor_query_set });
156
+ const sensorEvidence = evidenceFromCollectedOutcomes({ querySet: request.sensor_query_set, collected });
156
157
  const compiled = compileRuntimePlanV1({
157
158
  request,
158
- codegraphEvidence,
159
+ sensorEvidence,
159
160
  planRef: `plan-${request.request_id}-e1`,
160
161
  planEpoch: 1,
161
162
  predecessorRefs: [],
@@ -379,6 +380,9 @@ export async function terminalStage1Receipt({ stateDir, todoId, planKey }) {
379
380
  checkpoint_digest: lastCheckpoint.checkpoint_digest,
380
381
  paths: receipt.observed_diff.map(({ path: p }) => p),
381
382
  patch: patchBytes,
383
+ // ADR 0051 Decision 4: path一致だけではpatch本文の取り違え・破損を検出できない。
384
+ // 捕獲bytesのdigestを併記し、verifierが保存bytesから再計算して束縛を検査する。
385
+ patch_sha256: createHash('sha256').update(patchBytes).digest('hex'),
382
386
  };
383
387
  let cleanup = { cleanup_ok: true, residual_paths: [] };
384
388
  try {
@@ -630,13 +634,26 @@ export async function verifyStage1ArtifactOnDisk({ artifactRoot }) {
630
634
  receiptByld.set(event.payload.receipt_id, event);
631
635
  }
632
636
  const receiptEvents = events.filter((event) => event.kind === 'receipt_recorded');
633
- const patchesOk = [...receiptByld.keys()].every((receiptId) => {
637
+ // ADR 0051 Decision 4の強化: path照合に加え、(a) checkpoint_digest/todo_idを
638
+ // receipt_recorded payloadと照合し、(b) patch bytesのsha256を再計算して保存digestと
639
+ // 突合する。(b)は世代判定=1 entryでもpatch_sha256を持つartifactは全entryへ必須
640
+ // (旧v4-landing世代=全entry不在は(a)までで検査し、per-entryのfail-openを作らない)。
641
+ const patchEntries = Object.values(patches);
642
+ const shaGeneration = patchEntries.some((entry) => entry.patch_sha256 !== undefined);
643
+ const patchesOk = patchEntries.length > 0 && [...receiptByld.keys()].every((receiptId) => {
634
644
  const patch = patches[receiptId];
635
645
  if (patch === undefined || typeof patch.patch !== 'string' || patch.patch.length === 0) return false;
636
646
  const recorded = receiptEvents.find((event) => event.payload.receipt_id === receiptId);
637
647
  if (recorded === undefined) return false;
648
+ if (patch.checkpoint_digest !== recorded.payload.checkpoint_digest) return false;
649
+ if (patch.todo_id !== recorded.payload.todo_id) return false;
638
650
  const receiptPaths = [...recorded.payload.observed_diff.map(({ path: p }) => p)].sort();
639
- return JSON.stringify([...patch.paths].sort()) === JSON.stringify(receiptPaths);
651
+ if (JSON.stringify([...patch.paths].sort()) !== JSON.stringify(receiptPaths)) return false;
652
+ if (shaGeneration) {
653
+ if (typeof patch.patch_sha256 !== 'string') return false;
654
+ return createHash('sha256').update(patch.patch).digest('hex') === patch.patch_sha256;
655
+ }
656
+ return true;
640
657
  });
641
658
  checks.push({ id: 'patches_bound_to_accepted_receipts', passed: patchesOk });
642
659
  }