@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.
- package/README.md +87 -4
- package/bin/lattice-bridge.mjs +87 -0
- package/bin/lattice-dashboard.mjs +70 -0
- package/bin/lattice-mcp.mjs +9 -9
- package/bin/lattice.mjs +61 -8
- package/docs/bridge-setup.md +87 -0
- package/docs/schemas/lattice.plan_create_input.v1.schema.json +56 -0
- package/docs/schemas/lattice.plan_create_input.v2.schema.json +72 -0
- package/docs/schemas/lattice.plan_create_input.v3.schema.json +81 -0
- package/package.json +19 -7
- package/sensor/dist/bin/command-supervision.d.ts +1 -1
- package/sensor/dist/bin/command-supervision.js +4 -4
- package/sensor/dist/bin/command-supervision.js.map +1 -1
- package/sensor/dist/bin/fatal-handler.js +2 -2
- package/sensor/dist/bin/fatal-handler.js.map +1 -1
- package/sensor/dist/bin/{codegraph.js → lattice-sensor.js} +207 -328
- package/sensor/dist/bin/node-version-check.d.ts +7 -5
- package/sensor/dist/bin/node-version-check.d.ts.map +1 -1
- package/sensor/dist/bin/node-version-check.js +19 -14
- package/sensor/dist/bin/node-version-check.js.map +1 -1
- package/sensor/dist/context/index.d.ts +1 -1
- package/sensor/dist/context/index.js +6 -6
- package/sensor/dist/context/index.js.map +1 -1
- package/sensor/dist/db/index.d.ts +5 -5
- package/sensor/dist/db/index.d.ts.map +1 -1
- package/sensor/dist/db/index.js +7 -7
- package/sensor/dist/db/index.js.map +1 -1
- package/sensor/dist/db/migrations.js +1 -1
- package/sensor/dist/db/migrations.js.map +1 -1
- package/sensor/dist/db/queries.d.ts +1 -1
- package/sensor/dist/db/queries.js +5 -5
- package/sensor/dist/db/queries.js.map +1 -1
- package/sensor/dist/db/schema.sql +2 -2
- package/sensor/dist/db/sqlite-adapter.d.ts +2 -2
- package/sensor/dist/db/sqlite-adapter.js +3 -3
- package/sensor/dist/db/sqlite-adapter.js.map +1 -1
- package/sensor/dist/db/wal-valve.d.ts +1 -1
- package/sensor/dist/db/wal-valve.d.ts.map +1 -1
- package/sensor/dist/db/wal-valve.js +2 -2
- package/sensor/dist/db/wal-valve.js.map +1 -1
- package/sensor/dist/directory.d.ts +27 -63
- package/sensor/dist/directory.d.ts.map +1 -1
- package/sensor/dist/directory.js +78 -134
- package/sensor/dist/directory.js.map +1 -1
- package/sensor/dist/errors.d.ts +15 -15
- package/sensor/dist/errors.d.ts.map +1 -1
- package/sensor/dist/errors.js +21 -21
- package/sensor/dist/errors.js.map +1 -1
- package/sensor/dist/extraction/dynamic-import.d.ts +1 -1
- package/sensor/dist/extraction/dynamic-import.js +1 -1
- package/sensor/dist/extraction/extraction-version.d.ts +1 -1
- package/sensor/dist/extraction/extraction-version.js +1 -1
- package/sensor/dist/extraction/generated-detection.d.ts +1 -1
- package/sensor/dist/extraction/generated-detection.js +1 -1
- package/sensor/dist/extraction/grammars.d.ts +3 -3
- package/sensor/dist/extraction/grammars.js +5 -5
- package/sensor/dist/extraction/grammars.js.map +1 -1
- package/sensor/dist/extraction/index.d.ts +6 -6
- package/sensor/dist/extraction/index.js +50 -50
- package/sensor/dist/extraction/index.js.map +1 -1
- package/sensor/dist/extraction/kernel/decode.d.ts +1 -1
- package/sensor/dist/extraction/kernel/decode.js +1 -1
- package/sensor/dist/extraction/kernel/index.d.ts +3 -3
- package/sensor/dist/extraction/kernel/index.js +6 -6
- package/sensor/dist/extraction/kernel/index.js.map +1 -1
- package/sensor/dist/extraction/kernel/layout.d.ts +1 -1
- package/sensor/dist/extraction/kernel/layout.js +1 -1
- package/sensor/dist/extraction/kernel/loader.d.ts +6 -6
- package/sensor/dist/extraction/kernel/loader.js +13 -13
- package/sensor/dist/extraction/kernel/loader.js.map +1 -1
- package/sensor/dist/extraction/languages/cfquery.d.ts +1 -1
- package/sensor/dist/extraction/languages/cfquery.js +1 -1
- package/sensor/dist/extraction/languages/lua.d.ts +11 -0
- package/sensor/dist/extraction/languages/lua.d.ts.map +1 -1
- package/sensor/dist/extraction/languages/lua.js +1 -0
- package/sensor/dist/extraction/languages/lua.js.map +1 -1
- package/sensor/dist/extraction/parse-pool.d.ts +5 -5
- package/sensor/dist/extraction/parse-pool.d.ts.map +1 -1
- package/sensor/dist/extraction/parse-pool.js +4 -4
- package/sensor/dist/extraction/parse-worker.js +1 -1
- package/sensor/dist/extraction/parse-worker.js.map +1 -1
- package/sensor/dist/extraction/store-writer.d.ts +1 -1
- package/sensor/dist/extraction/store-writer.js +1 -1
- package/sensor/dist/extraction/svelte-extractor.d.ts +1 -1
- package/sensor/dist/extraction/svelte-extractor.js +1 -1
- package/sensor/dist/extraction/tree-sitter-helpers.js +1 -1
- package/sensor/dist/extraction/tree-sitter.d.ts +2 -2
- package/sensor/dist/extraction/tree-sitter.d.ts.map +1 -1
- package/sensor/dist/extraction/tree-sitter.js +71 -4
- package/sensor/dist/extraction/tree-sitter.js.map +1 -1
- package/sensor/dist/extraction/wasm-runtime-flags.d.ts +2 -2
- package/sensor/dist/extraction/wasm-runtime-flags.d.ts.map +1 -1
- package/sensor/dist/extraction/wasm-runtime-flags.js +5 -5
- package/sensor/dist/extraction/wasm-runtime-flags.js.map +1 -1
- package/sensor/dist/index.d.ts +36 -36
- package/sensor/dist/index.d.ts.map +1 -1
- package/sensor/dist/index.js +71 -71
- package/sensor/dist/index.js.map +1 -1
- package/sensor/dist/mcp/daemon-manager.js +1 -1
- package/sensor/dist/mcp/daemon-paths.d.ts +3 -3
- package/sensor/dist/mcp/daemon-paths.js +7 -7
- package/sensor/dist/mcp/daemon-paths.js.map +1 -1
- package/sensor/dist/mcp/daemon-registry.d.ts +2 -2
- package/sensor/dist/mcp/daemon-registry.js +5 -5
- package/sensor/dist/mcp/daemon.d.ts +7 -7
- package/sensor/dist/mcp/daemon.d.ts.map +1 -1
- package/sensor/dist/mcp/daemon.js +21 -21
- package/sensor/dist/mcp/daemon.js.map +1 -1
- package/sensor/dist/mcp/dynamic-boundaries.js +1 -1
- package/sensor/dist/mcp/engine.d.ts +9 -9
- package/sensor/dist/mcp/engine.d.ts.map +1 -1
- package/sensor/dist/mcp/engine.js +44 -44
- package/sensor/dist/mcp/engine.js.map +1 -1
- package/sensor/dist/mcp/index.d.ts +14 -14
- package/sensor/dist/mcp/index.d.ts.map +1 -1
- package/sensor/dist/mcp/index.js +41 -41
- package/sensor/dist/mcp/index.js.map +1 -1
- package/sensor/dist/mcp/liveness-watchdog.js +7 -7
- package/sensor/dist/mcp/liveness-watchdog.js.map +1 -1
- package/sensor/dist/mcp/ppid-watchdog.d.ts +3 -3
- package/sensor/dist/mcp/ppid-watchdog.js +2 -2
- package/sensor/dist/mcp/proxy.d.ts.map +1 -1
- package/sensor/dist/mcp/proxy.js +37 -37
- package/sensor/dist/mcp/proxy.js.map +1 -1
- package/sensor/dist/mcp/query-pool.d.ts +3 -3
- package/sensor/dist/mcp/query-pool.js +7 -7
- package/sensor/dist/mcp/query-pool.js.map +1 -1
- package/sensor/dist/mcp/query-worker.d.ts +2 -2
- package/sensor/dist/mcp/query-worker.js +7 -7
- package/sensor/dist/mcp/query-worker.js.map +1 -1
- package/sensor/dist/mcp/server-instructions.d.ts +10 -12
- package/sensor/dist/mcp/server-instructions.d.ts.map +1 -1
- package/sensor/dist/mcp/server-instructions.js +39 -37
- package/sensor/dist/mcp/server-instructions.js.map +1 -1
- package/sensor/dist/mcp/session.d.ts +2 -2
- package/sensor/dist/mcp/session.js +18 -18
- package/sensor/dist/mcp/session.js.map +1 -1
- package/sensor/dist/mcp/startup-handshake.d.ts +3 -3
- package/sensor/dist/mcp/startup-handshake.d.ts.map +1 -1
- package/sensor/dist/mcp/startup-handshake.js +3 -3
- package/sensor/dist/mcp/startup-handshake.js.map +1 -1
- package/sensor/dist/mcp/tools.d.ts +53 -53
- package/sensor/dist/mcp/tools.d.ts.map +1 -1
- package/sensor/dist/mcp/tools.js +180 -216
- package/sensor/dist/mcp/tools.js.map +1 -1
- package/sensor/dist/mcp/transport.d.ts +1 -1
- package/sensor/dist/mcp/transport.js +6 -6
- package/sensor/dist/mcp/transport.js.map +1 -1
- package/sensor/dist/mcp/version.d.ts +2 -2
- package/sensor/dist/mcp/version.d.ts.map +1 -1
- package/sensor/dist/mcp/version.js +3 -3
- package/sensor/dist/mcp/version.js.map +1 -1
- package/sensor/dist/project-config.d.ts +6 -6
- package/sensor/dist/project-config.d.ts.map +1 -1
- package/sensor/dist/project-config.js +10 -10
- package/sensor/dist/project-config.js.map +1 -1
- package/sensor/dist/resolution/callback-synthesizer.js +4 -4
- package/sensor/dist/resolution/callback-synthesizer.js.map +1 -1
- package/sensor/dist/resolution/frameworks/drupal.d.ts +3 -3
- package/sensor/dist/resolution/frameworks/drupal.js +3 -3
- package/sensor/dist/resolution/frameworks/fabric.js +1 -1
- package/sensor/dist/resolution/frameworks/fabric.js.map +1 -1
- package/sensor/dist/resolution/frameworks/java.js +1 -1
- package/sensor/dist/resolution/frameworks/java.js.map +1 -1
- package/sensor/dist/resolution/frameworks/svelte.js +1 -1
- package/sensor/dist/resolution/frameworks/svelte.js.map +1 -1
- package/sensor/dist/resolution/goframe-synthesizer.d.ts +1 -1
- package/sensor/dist/resolution/goframe-synthesizer.js +1 -1
- package/sensor/dist/resolution/index.d.ts +1 -1
- package/sensor/dist/resolution/index.js +9 -9
- package/sensor/dist/resolution/index.js.map +1 -1
- package/sensor/dist/resolution/name-matcher.js +2 -2
- package/sensor/dist/resolution/name-matcher.js.map +1 -1
- package/sensor/dist/resolution/resolver-pool.d.ts +2 -2
- package/sensor/dist/resolution/resolver-pool.js +4 -4
- package/sensor/dist/resolution/resolver-pool.js.map +1 -1
- package/sensor/dist/resolution/resolver-worker.js +2 -2
- package/sensor/dist/resolution/resolver-worker.js.map +1 -1
- package/sensor/dist/resolution/workspace-packages.js +1 -1
- package/sensor/dist/resolution/workspace-packages.js.map +1 -1
- package/sensor/dist/search/identifier-segments.d.ts +1 -1
- package/sensor/dist/search/identifier-segments.js +1 -1
- package/sensor/dist/search/query-utils.d.ts +1 -0
- package/sensor/dist/search/query-utils.d.ts.map +1 -1
- package/sensor/dist/search/query-utils.js +10 -3
- package/sensor/dist/search/query-utils.js.map +1 -1
- package/sensor/dist/sync/git-hooks.d.ts +9 -9
- package/sensor/dist/sync/git-hooks.d.ts.map +1 -1
- package/sensor/dist/sync/git-hooks.js +15 -15
- package/sensor/dist/sync/git-hooks.js.map +1 -1
- package/sensor/dist/sync/watch-policy.d.ts +2 -2
- package/sensor/dist/sync/watch-policy.js +5 -5
- package/sensor/dist/sync/watch-policy.js.map +1 -1
- package/sensor/dist/sync/watcher.d.ts +2 -2
- package/sensor/dist/sync/watcher.d.ts.map +1 -1
- package/sensor/dist/sync/watcher.js +16 -16
- package/sensor/dist/sync/watcher.js.map +1 -1
- package/sensor/dist/sync/worktree.d.ts +5 -5
- package/sensor/dist/sync/worktree.d.ts.map +1 -1
- package/sensor/dist/sync/worktree.js +9 -9
- package/sensor/dist/sync/worktree.js.map +1 -1
- package/sensor/dist/telemetry/index.d.ts +8 -8
- package/sensor/dist/telemetry/index.d.ts.map +1 -1
- package/sensor/dist/telemetry/index.js +16 -16
- package/sensor/dist/telemetry/index.js.map +1 -1
- package/sensor/dist/types.d.ts +2 -2
- package/sensor/dist/types.js +1 -1
- package/sensor/dist/ui/color.d.ts +2 -2
- package/sensor/dist/ui/color.js +2 -2
- package/sensor/dist/ui/glyphs.d.ts +3 -3
- package/sensor/dist/ui/glyphs.js +7 -7
- package/sensor/dist/ui/glyphs.js.map +1 -1
- package/sensor/dist/utils.d.ts +4 -4
- package/sensor/dist/utils.js +8 -8
- package/sensor/dist/utils.js.map +1 -1
- package/sensor/package.json +8 -13
- package/src/artifact-contracts.mjs +2 -2
- package/src/boundary-compiler.mjs +28 -28
- package/src/boundary-observation-compiler-v2.mjs +10 -10
- package/src/bounded-seam.mjs +144 -0
- package/src/bridge-cli.mjs +227 -0
- package/src/bridge-config.mjs +346 -0
- package/src/bridge-daemon.mjs +328 -0
- package/src/bridge-launch-agent.mjs +311 -0
- package/src/bridge-server.mjs +309 -0
- package/src/cli-help.mjs +163 -0
- package/src/control-compiler.mjs +30 -30
- package/src/dag-chain.mjs +261 -0
- package/src/factory-diagnostics.mjs +8 -7
- package/src/hash-chain.mjs +76 -0
- package/src/node-version-guard.mjs +5 -4
- package/src/project-cli.mjs +392 -0
- package/src/project-identity.mjs +71 -0
- package/src/rc1-evidence-bundle.mjs +16 -16
- package/src/rc1-v4-campaign.mjs +15 -14
- package/src/rc1-v5-artifact-set.mjs +2 -2
- package/src/rc1-v5-campaign.mjs +15 -14
- package/src/rc1-v6-artifact-set.mjs +18 -18
- package/src/rc1-v6-campaign.mjs +16 -16
- package/src/rc1-v6-causal-binding.mjs +16 -14
- package/src/rc1-v6-measurement.mjs +20 -38
- package/src/rc2-artifact-set.mjs +45 -40
- package/src/rc2-campaign.mjs +48 -66
- package/src/rc2-delivery-policy-front-end.mjs +30 -30
- package/src/rc2-rc1-transfer-front-end.mjs +5 -5
- package/src/rc3-actual-dogfood.mjs +6 -6
- package/src/rc3-dogfood-scaffold.mjs +12 -7
- package/src/rc3-scripted-campaign.mjs +75 -21
- package/src/rc4-stage1-dogfood.mjs +24 -7
- package/src/runtime-cli.mjs +2424 -45
- package/src/runtime-contracts.mjs +7 -7
- package/src/runtime-control-store.mjs +547 -0
- package/src/runtime-controller-protocol.mjs +517 -0
- package/src/runtime-direct-os-observer.mjs +284 -0
- package/src/runtime-engine.mjs +2 -2
- package/src/runtime-errors.mjs +1 -1
- package/src/runtime-event-store.mjs +15 -43
- package/src/runtime-front-end.mjs +26 -26
- package/src/runtime-gate-store.mjs +477 -0
- package/src/runtime-hold-recompile.mjs +214 -23
- package/src/runtime-lifecycle-lock.mjs +290 -0
- package/src/runtime-managed-supervisor.mjs +1276 -0
- package/src/runtime-multi-epoch-store.mjs +761 -0
- package/src/runtime-projection.mjs +62 -0
- package/src/seam-transform.mjs +38 -38
- package/src/{codegraph-adapter.mjs → sensor-adapter.mjs} +7 -7
- package/src/sensor-cli.mjs +107 -0
- package/src/sensor-runtime.mjs +48 -0
- package/src/timestamp-contract.mjs +8 -0
- package/src/todo-chain.mjs +178 -0
- package/src/todo-cli.mjs +1032 -0
- package/src/todo-contracts.mjs +501 -0
- package/src/todo-dashboard-registry.mjs +318 -0
- package/src/todo-gantt-html.mjs +416 -0
- package/src/todo-gantt-layout.mjs +603 -0
- package/src/todo-gantt-live.mjs +269 -0
- package/src/todo-gantt-presentation.mjs +217 -0
- package/src/todo-gantt-svg.mjs +249 -0
- package/src/todo-markdown-renderer.mjs +260 -0
- package/src/todo-migration.mjs +260 -0
- package/src/todo-narrative-anchor.mjs +130 -0
- package/src/todo-revision.mjs +425 -0
- package/src/todo-status.mjs +340 -0
- package/src/todo-store.mjs +3451 -0
- package/src/treatment-compiler.mjs +28 -28
- package/src/treatment-runner.mjs +42 -44
- package/sensor/dist/bin/codegraph.d.ts +0 -26
- package/sensor/dist/bin/codegraph.d.ts.map +0 -1
- package/sensor/dist/bin/codegraph.js.map +0 -1
- package/sensor/dist/bin/uninstall.d.ts +0 -14
- package/sensor/dist/bin/uninstall.d.ts.map +0 -1
- package/sensor/dist/bin/uninstall.js +0 -36
- package/sensor/dist/bin/uninstall.js.map +0 -1
- package/sensor/dist/installer/beta-signup.d.ts +0 -54
- package/sensor/dist/installer/beta-signup.d.ts.map +0 -1
- package/sensor/dist/installer/beta-signup.js +0 -178
- package/sensor/dist/installer/beta-signup.js.map +0 -1
- package/sensor/dist/installer/config-writer.d.ts +0 -28
- package/sensor/dist/installer/config-writer.d.ts.map +0 -1
- package/sensor/dist/installer/config-writer.js +0 -91
- package/sensor/dist/installer/config-writer.js.map +0 -1
- package/sensor/dist/installer/index.d.ts +0 -142
- package/sensor/dist/installer/index.d.ts.map +0 -1
- package/sensor/dist/installer/index.js +0 -622
- package/sensor/dist/installer/index.js.map +0 -1
- package/sensor/dist/installer/instructions-template.d.ts +0 -41
- package/sensor/dist/installer/instructions-template.d.ts.map +0 -1
- package/sensor/dist/installer/instructions-template.js +0 -53
- package/sensor/dist/installer/instructions-template.js.map +0 -1
- package/sensor/dist/installer/targets/antigravity.d.ts +0 -57
- package/sensor/dist/installer/targets/antigravity.d.ts.map +0 -1
- package/sensor/dist/installer/targets/antigravity.js +0 -308
- package/sensor/dist/installer/targets/antigravity.js.map +0 -1
- package/sensor/dist/installer/targets/claude.d.ts +0 -62
- package/sensor/dist/installer/targets/claude.d.ts.map +0 -1
- package/sensor/dist/installer/targets/claude.js +0 -454
- package/sensor/dist/installer/targets/claude.js.map +0 -1
- package/sensor/dist/installer/targets/codex.d.ts +0 -18
- package/sensor/dist/installer/targets/codex.d.ts.map +0 -1
- package/sensor/dist/installer/targets/codex.js +0 -185
- package/sensor/dist/installer/targets/codex.js.map +0 -1
- package/sensor/dist/installer/targets/cursor.d.ts +0 -35
- package/sensor/dist/installer/targets/cursor.d.ts.map +0 -1
- package/sensor/dist/installer/targets/cursor.js +0 -254
- package/sensor/dist/installer/targets/cursor.js.map +0 -1
- package/sensor/dist/installer/targets/gemini.d.ts +0 -26
- package/sensor/dist/installer/targets/gemini.d.ts.map +0 -1
- package/sensor/dist/installer/targets/gemini.js +0 -165
- package/sensor/dist/installer/targets/gemini.js.map +0 -1
- package/sensor/dist/installer/targets/hermes.d.ts +0 -18
- package/sensor/dist/installer/targets/hermes.d.ts.map +0 -1
- package/sensor/dist/installer/targets/hermes.js +0 -359
- package/sensor/dist/installer/targets/hermes.js.map +0 -1
- package/sensor/dist/installer/targets/kiro.d.ts +0 -27
- package/sensor/dist/installer/targets/kiro.d.ts.map +0 -1
- package/sensor/dist/installer/targets/kiro.js +0 -178
- package/sensor/dist/installer/targets/kiro.js.map +0 -1
- package/sensor/dist/installer/targets/opencode.d.ts +0 -38
- package/sensor/dist/installer/targets/opencode.d.ts.map +0 -1
- package/sensor/dist/installer/targets/opencode.js +0 -288
- package/sensor/dist/installer/targets/opencode.js.map +0 -1
- package/sensor/dist/installer/targets/registry.d.ts +0 -35
- package/sensor/dist/installer/targets/registry.d.ts.map +0 -1
- package/sensor/dist/installer/targets/registry.js +0 -91
- package/sensor/dist/installer/targets/registry.js.map +0 -1
- package/sensor/dist/installer/targets/shared.d.ts +0 -101
- package/sensor/dist/installer/targets/shared.d.ts.map +0 -1
- package/sensor/dist/installer/targets/shared.js +0 -264
- package/sensor/dist/installer/targets/shared.js.map +0 -1
- package/sensor/dist/installer/targets/toml.d.ts +0 -52
- package/sensor/dist/installer/targets/toml.d.ts.map +0 -1
- package/sensor/dist/installer/targets/toml.js +0 -147
- package/sensor/dist/installer/targets/toml.js.map +0 -1
- package/sensor/dist/installer/targets/types.d.ts +0 -108
- package/sensor/dist/installer/targets/types.d.ts.map +0 -1
- package/sensor/dist/installer/targets/types.js +0 -16
- package/sensor/dist/installer/targets/types.js.map +0 -1
- package/sensor/dist/upgrade/index.d.ts +0 -171
- package/sensor/dist/upgrade/index.d.ts.map +0 -1
- package/sensor/dist/upgrade/index.js +0 -659
- package/sensor/dist/upgrade/index.js.map +0 -1
- package/sensor/dist/upgrade/remove-binary.d.ts +0 -87
- package/sensor/dist/upgrade/remove-binary.d.ts.map +0 -1
- package/sensor/dist/upgrade/remove-binary.js +0 -289
- package/sensor/dist/upgrade/remove-binary.js.map +0 -1
- package/sensor/dist/upgrade/update-check.d.ts +0 -92
- package/sensor/dist/upgrade/update-check.d.ts.map +0 -1
- package/sensor/dist/upgrade/update-check.js +0 -258
- package/sensor/dist/upgrade/update-check.js.map +0 -1
- package/src/bootstrap.mjs +0 -88
|
@@ -12,7 +12,7 @@ const INPUT_KEYS = [
|
|
|
12
12
|
'manualEvidence',
|
|
13
13
|
'querySet',
|
|
14
14
|
'sourceSnapshot',
|
|
15
|
-
'
|
|
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
|
|
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.
|
|
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
|
-
|| !
|
|
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
|
|
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
|
-
|
|
645
|
+
sensorEvidence,
|
|
646
646
|
querySet,
|
|
647
647
|
queryById,
|
|
648
648
|
candidateSpec,
|
|
649
649
|
filesByPath,
|
|
650
650
|
}) {
|
|
651
|
-
if (!exactRecord(
|
|
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
|
-
||
|
|
660
|
-
||
|
|
661
|
-
||
|
|
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(
|
|
665
|
-
requireArray(
|
|
666
|
-
if (
|
|
667
|
-
||
|
|
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 =
|
|
674
|
-
const receipt =
|
|
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:
|
|
687
|
-
query_set_digest:
|
|
688
|
-
outcomes:
|
|
686
|
+
projection: sensorEvidence.projection,
|
|
687
|
+
query_set_digest: sensorEvidence.query_set_digest,
|
|
688
|
+
outcomes: sensorEvidence.outcomes,
|
|
689
689
|
};
|
|
690
|
-
if (!DIGEST.test(
|
|
691
|
-
||
|
|
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
|
-
|
|
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}の
|
|
961
|
+
fail(`active resource ${group.kind}:${group.target}のLatticeSensor evidenceがreadyではない`);
|
|
962
962
|
}
|
|
963
963
|
const evidenceDigest = digestArtifact({
|
|
964
|
-
schema: 'lattice.rc2.
|
|
964
|
+
schema: 'lattice.rc2.sensor_resource_evidence.v1',
|
|
965
965
|
topology,
|
|
966
|
-
portable_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: '
|
|
978
|
-
evidence_ref: `portable-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
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.
|
|
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 || !
|
|
345
|
-
fail(`resource ${group.kind}:${group.target}の
|
|
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: '
|
|
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 {
|
|
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
|
-
|
|
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
|
|
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
|
-
|
|
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
|
|
188
|
+
const collected = await collectSensorEvidence({ cwd: scaffold.repoRoot, querySet: request.sensor_query_set });
|
|
189
189
|
const compiled = compileRuntimePlanV1({
|
|
190
190
|
request,
|
|
191
|
-
|
|
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
|
-
//
|
|
119
|
-
//
|
|
120
|
-
const
|
|
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
|
|
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
|
|
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
|
|
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(
|
|
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 {
|
|
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(
|
|
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
|
-
|
|
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
|
|
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
|
|
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
|
-
|
|
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
|
|
127
|
+
const collected = await collectSensorEvidence({
|
|
125
128
|
cwd: repoRoot,
|
|
126
|
-
querySet: request.
|
|
129
|
+
querySet: request.sensor_query_set,
|
|
127
130
|
});
|
|
128
|
-
const
|
|
129
|
-
querySet: request.
|
|
131
|
+
const sensorEvidence = evidenceFromCollectedOutcomes({
|
|
132
|
+
querySet: request.sensor_query_set,
|
|
130
133
|
collected,
|
|
131
134
|
});
|
|
132
135
|
return compileRuntimePlanV1({
|
|
133
136
|
request,
|
|
134
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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 =
|
|
667
|
-
if (syncResult.status !== 0) fail(`
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
714
|
-
cwd: scaffold.repoRoot, querySet: postRequest.
|
|
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
|
-
|
|
719
|
-
querySet: postRequest.
|
|
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 {
|
|
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読込・
|
|
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
|
|
155
|
-
const
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
}
|