@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
|
@@ -4,14 +4,14 @@ import {
|
|
|
4
4
|
canonicalizeArtifact,
|
|
5
5
|
digestArtifact,
|
|
6
6
|
} from './artifact-contracts.mjs';
|
|
7
|
-
import {
|
|
7
|
+
import { portableSensorOutcome } from './sensor-adapter.mjs';
|
|
8
8
|
|
|
9
9
|
const IDENTIFIER = /^[0-9A-Za-z](?:[0-9A-Za-z._-]{0,127})$/;
|
|
10
10
|
const SHA256 = /^[0-9a-f]{64}$/;
|
|
11
11
|
const CONDITIONS = new Set(['control', 'treatment']);
|
|
12
12
|
const OPERATIONS = new Set(['status', 'query', 'callers', 'callees', 'impact', 'affected']);
|
|
13
|
-
const PROJECTION = 'lattice.
|
|
14
|
-
const SANITIZER = 'lattice.
|
|
13
|
+
const PROJECTION = 'lattice.sensor_portable_outcome.v1';
|
|
14
|
+
const SANITIZER = 'lattice.sensor_diagnostic_sanitizer.v1';
|
|
15
15
|
const STATUS_REMOVALS = Object.freeze([
|
|
16
16
|
'projectPath',
|
|
17
17
|
'indexPath',
|
|
@@ -69,7 +69,7 @@ function sameArtifact(left, right) {
|
|
|
69
69
|
|
|
70
70
|
function validateQuerySet(querySet) {
|
|
71
71
|
if (!exactRecord(querySet, ['schema', 'queries'])
|
|
72
|
-
|| querySet.schema !== 'lattice.
|
|
72
|
+
|| querySet.schema !== 'lattice.sensor_query_set.v2'
|
|
73
73
|
|| !Array.isArray(querySet.queries)
|
|
74
74
|
|| querySet.queries.length === 0
|
|
75
75
|
|| querySet.queries.length > 256) {
|
|
@@ -194,8 +194,8 @@ function rawReceipt(rawEvidence) {
|
|
|
194
194
|
const canonical = canonicalizeArtifact(rawEvidence);
|
|
195
195
|
const bytes = Buffer.from(canonical, 'utf8');
|
|
196
196
|
return {
|
|
197
|
-
schema: 'lattice.
|
|
198
|
-
media_type: 'application/vnd.lattice.
|
|
197
|
+
schema: 'lattice.sensor_raw_opaque_receipt.v1',
|
|
198
|
+
media_type: 'application/vnd.lattice.sensor-evidence+json',
|
|
199
199
|
encoding: 'canonical-json-base64',
|
|
200
200
|
payload_base64: bytes.toString('base64'),
|
|
201
201
|
payload_digest: sha256(bytes),
|
|
@@ -207,13 +207,13 @@ function diagnosticArtifact(rawEvidence, sourceRawDigest) {
|
|
|
207
207
|
const { payload, operations } = sanitizeDiagnostic(rawEvidence);
|
|
208
208
|
if (containsAbsolutePath(payload)) fail('sanitized diagnosticに絶対pathが残る');
|
|
209
209
|
const manifest = {
|
|
210
|
-
schema: 'lattice.
|
|
210
|
+
schema: 'lattice.sensor_sanitization_manifest.v1',
|
|
211
211
|
sanitizer: SANITIZER,
|
|
212
212
|
rules_digest: digestArtifact(SANITIZATION_RULES),
|
|
213
213
|
operations,
|
|
214
214
|
};
|
|
215
215
|
return {
|
|
216
|
-
schema: 'lattice.
|
|
216
|
+
schema: 'lattice.sensor_sanitized_diagnostic.v1',
|
|
217
217
|
source_raw_digest: sourceRawDigest,
|
|
218
218
|
sanitization_manifest: manifest,
|
|
219
219
|
sanitization_manifest_digest: digestArtifact(manifest),
|
|
@@ -224,7 +224,7 @@ function diagnosticArtifact(rawEvidence, sourceRawDigest) {
|
|
|
224
224
|
|
|
225
225
|
function buildPortable(querySet, rawEvidence) {
|
|
226
226
|
const querySetDigest = digestArtifact(querySet);
|
|
227
|
-
const outcomes = rawEvidence.outcomes.map((outcome) =>
|
|
227
|
+
const outcomes = rawEvidence.outcomes.map((outcome) => portableSensorOutcome(outcome));
|
|
228
228
|
if (containsAbsolutePath(outcomes)) fail('portable outcomeに絶対pathが残る');
|
|
229
229
|
const perQuery = outcomes.map((outcome, index) => ({
|
|
230
230
|
id: querySet.queries[index].id,
|
|
@@ -233,7 +233,7 @@ function buildPortable(querySet, rawEvidence) {
|
|
|
233
233
|
result_digest: digestArtifact(outcome),
|
|
234
234
|
}));
|
|
235
235
|
const portable = {
|
|
236
|
-
schema: 'lattice.
|
|
236
|
+
schema: 'lattice.sensor_portable_preimage.v1',
|
|
237
237
|
projection: PROJECTION,
|
|
238
238
|
query_set_digest: querySetDigest,
|
|
239
239
|
outcomes,
|
|
@@ -247,7 +247,7 @@ function buildPortable(querySet, rawEvidence) {
|
|
|
247
247
|
/** full portable payloadだけからaggregate digestを再計算する。 */
|
|
248
248
|
export function recomputePortableAggregate(portable) {
|
|
249
249
|
if (!isPlainObject(portable)
|
|
250
|
-
|| portable.schema !== 'lattice.
|
|
250
|
+
|| portable.schema !== 'lattice.sensor_portable_preimage.v1'
|
|
251
251
|
|| portable.projection !== PROJECTION
|
|
252
252
|
|| typeof portable.query_set_digest !== 'string'
|
|
253
253
|
|| !SHA256.test(portable.query_set_digest)
|
|
@@ -270,8 +270,8 @@ function decodeRawReceipt(receipt) {
|
|
|
270
270
|
'payload_digest',
|
|
271
271
|
'canonical_bytes',
|
|
272
272
|
])
|
|
273
|
-
|| receipt.schema !== 'lattice.
|
|
274
|
-
|| receipt.media_type !== 'application/vnd.lattice.
|
|
273
|
+
|| receipt.schema !== 'lattice.sensor_raw_opaque_receipt.v1'
|
|
274
|
+
|| receipt.media_type !== 'application/vnd.lattice.sensor-evidence+json'
|
|
275
275
|
|| receipt.encoding !== 'canonical-json-base64'
|
|
276
276
|
|| typeof receipt.payload_base64 !== 'string'
|
|
277
277
|
|| typeof receipt.payload_digest !== 'string'
|
|
@@ -302,7 +302,7 @@ function validatePortable(portable, querySet, rawEvidence) {
|
|
|
302
302
|
'per_query',
|
|
303
303
|
'aggregate_digest',
|
|
304
304
|
])
|
|
305
|
-
|| portable.schema !== 'lattice.
|
|
305
|
+
|| portable.schema !== 'lattice.sensor_portable_preimage.v1'
|
|
306
306
|
|| portable.projection !== PROJECTION
|
|
307
307
|
|| portable.query_set_digest !== digestArtifact(querySet)
|
|
308
308
|
|| !Array.isArray(portable.outcomes)
|
|
@@ -337,7 +337,7 @@ function validateDiagnostic(diagnostic, rawEvidence, rawDigest) {
|
|
|
337
337
|
'payload',
|
|
338
338
|
'payload_digest',
|
|
339
339
|
])
|
|
340
|
-
|| diagnostic.schema !== 'lattice.
|
|
340
|
+
|| diagnostic.schema !== 'lattice.sensor_sanitized_diagnostic.v1'
|
|
341
341
|
|| diagnostic.source_raw_digest !== rawDigest
|
|
342
342
|
|| diagnostic.sanitization_manifest_digest
|
|
343
343
|
!== digestArtifact(diagnostic.sanitization_manifest)
|
|
@@ -349,7 +349,7 @@ function validateDiagnostic(diagnostic, rawEvidence, rawDigest) {
|
|
|
349
349
|
}
|
|
350
350
|
|
|
351
351
|
/**
|
|
352
|
-
* 1 fresh
|
|
352
|
+
* 1 fresh LatticeSensor runをraw/diagnostic/portableの独立componentへcompileする。
|
|
353
353
|
*/
|
|
354
354
|
export function createRc1EvidenceBundle({
|
|
355
355
|
condition,
|
package/src/rc1-v4-campaign.mjs
CHANGED
|
@@ -20,7 +20,8 @@ import {
|
|
|
20
20
|
compileBoundaryCondition,
|
|
21
21
|
RC1_BOUNDARY_COMPILER_CONTRACT,
|
|
22
22
|
} from './boundary-compiler.mjs';
|
|
23
|
-
import {
|
|
23
|
+
import { collectSensorEvidence } from './sensor-adapter.mjs';
|
|
24
|
+
import { invokeSensorCli } from './sensor-runtime.mjs';
|
|
24
25
|
import { runIsolatedTransform } from './isolation-runner.mjs';
|
|
25
26
|
import { evaluateRc1Hypothesis } from './rc1-comparison.mjs';
|
|
26
27
|
import {
|
|
@@ -145,21 +146,21 @@ async function applyAcceptedPatch(worktreePath, patch) {
|
|
|
145
146
|
await run('git', ['apply', '--binary', '-'], { cwd: worktreePath, input: patch });
|
|
146
147
|
}
|
|
147
148
|
|
|
148
|
-
async function
|
|
149
|
+
async function captureLatticeSensorBootstrap(worktreePath) {
|
|
149
150
|
try {
|
|
150
|
-
return await readFile(path.join(worktreePath, '.
|
|
151
|
+
return await readFile(path.join(worktreePath, '.lattice/sensor', '.gitignore'));
|
|
151
152
|
} catch (error) {
|
|
152
153
|
if (error?.code === 'ENOENT') return null;
|
|
153
154
|
throw error;
|
|
154
155
|
}
|
|
155
156
|
}
|
|
156
157
|
|
|
157
|
-
async function
|
|
158
|
-
const
|
|
159
|
-
await rm(
|
|
158
|
+
async function restoreLatticeSensorBootstrap(worktreePath, bootstrap) {
|
|
159
|
+
const sensorPath = path.join(worktreePath, '.lattice/sensor');
|
|
160
|
+
await rm(sensorPath, { recursive: true, force: true });
|
|
160
161
|
if (bootstrap === null) return;
|
|
161
|
-
await mkdir(
|
|
162
|
-
await writeFile(path.join(
|
|
162
|
+
await mkdir(sensorPath, { recursive: true });
|
|
163
|
+
await writeFile(path.join(sensorPath, '.gitignore'), bootstrap);
|
|
163
164
|
}
|
|
164
165
|
|
|
165
166
|
async function observeFreshIndex({
|
|
@@ -181,16 +182,16 @@ async function observeFreshIndex({
|
|
|
181
182
|
transform: async ({ worktreePath }) => {
|
|
182
183
|
if (condition === 'treatment') await applyAcceptedPatch(worktreePath, patch);
|
|
183
184
|
snapshot = await fixedSnapshot(worktreePath);
|
|
184
|
-
const
|
|
185
|
+
const sensorBootstrap = await captureLatticeSensorBootstrap(worktreePath);
|
|
185
186
|
try {
|
|
186
187
|
const indexStartedAt = performance.now();
|
|
187
|
-
await run
|
|
188
|
+
await invokeSensorCli(run, ['init', '.'], { cwd: worktreePath });
|
|
188
189
|
indexElapsedMs = roundedMilliseconds(indexStartedAt);
|
|
189
190
|
const queryStartedAt = performance.now();
|
|
190
|
-
rawEvidence = await
|
|
191
|
+
rawEvidence = await collectSensorEvidence({ cwd: worktreePath, querySet });
|
|
191
192
|
queryElapsedMs = roundedMilliseconds(queryStartedAt);
|
|
192
193
|
} finally {
|
|
193
|
-
await
|
|
194
|
+
await restoreLatticeSensorBootstrap(worktreePath, sensorBootstrap);
|
|
194
195
|
}
|
|
195
196
|
},
|
|
196
197
|
verifyCommands: [],
|
|
@@ -223,7 +224,7 @@ function compileOne({ inputs, observation, manualEvidence, planVersion }) {
|
|
|
223
224
|
candidateSpec: inputs.candidateSpec,
|
|
224
225
|
manualEvidence,
|
|
225
226
|
querySet: inputs.querySet,
|
|
226
|
-
|
|
227
|
+
sensorEvidence: observation.rawEvidence,
|
|
227
228
|
codeSnapshotDigest: observation.codeSnapshotDigest,
|
|
228
229
|
planVersion,
|
|
229
230
|
});
|
|
@@ -310,7 +311,7 @@ function evidenceSummary(bundles, querySet) {
|
|
|
310
311
|
validateRc1EvidenceBundle(bundle)
|
|
311
312
|
&& bundle.diagnostic.payload.cwd === '<repo-root>'
|
|
312
313
|
&& bundle.diagnostic.sanitization_manifest.schema
|
|
313
|
-
=== 'lattice.
|
|
314
|
+
=== 'lattice.sensor_sanitization_manifest.v1'
|
|
314
315
|
)),
|
|
315
316
|
};
|
|
316
317
|
}
|
|
@@ -313,7 +313,7 @@ function compilerReplayValid(context) {
|
|
|
313
313
|
? inputs.normalManualEvidence
|
|
314
314
|
: inputs.negativeManualEvidence,
|
|
315
315
|
querySet: inputs.querySet,
|
|
316
|
-
|
|
316
|
+
sensorEvidence: rawEvidence,
|
|
317
317
|
codeSnapshotDigest: run.code_snapshot_digest,
|
|
318
318
|
planVersion: `rc1-v5-${condition}${variant === 'negative' ? '-negative' : ''}`,
|
|
319
319
|
});
|
|
@@ -521,7 +521,7 @@ function evidenceSummary(bundles, querySet) {
|
|
|
521
521
|
validateRc1EvidenceBundle(bundle)
|
|
522
522
|
&& bundle.diagnostic.payload.cwd === '<repo-root>'
|
|
523
523
|
&& bundle.diagnostic.sanitization_manifest.schema
|
|
524
|
-
=== 'lattice.
|
|
524
|
+
=== 'lattice.sensor_sanitization_manifest.v1'
|
|
525
525
|
)),
|
|
526
526
|
};
|
|
527
527
|
}
|
package/src/rc1-v5-campaign.mjs
CHANGED
|
@@ -20,7 +20,8 @@ import {
|
|
|
20
20
|
compileBoundaryCondition,
|
|
21
21
|
RC1_BOUNDARY_COMPILER_CONTRACT,
|
|
22
22
|
} from './boundary-compiler.mjs';
|
|
23
|
-
import {
|
|
23
|
+
import { collectSensorEvidence } from './sensor-adapter.mjs';
|
|
24
|
+
import { invokeSensorCli } from './sensor-runtime.mjs';
|
|
24
25
|
import { runIsolatedTransform } from './isolation-runner.mjs';
|
|
25
26
|
import {
|
|
26
27
|
createRc1EvidenceBundle,
|
|
@@ -150,21 +151,21 @@ async function applyAcceptedPatch(worktreePath, patch) {
|
|
|
150
151
|
await run('git', ['apply', '--binary', '-'], { cwd: worktreePath, input: patch });
|
|
151
152
|
}
|
|
152
153
|
|
|
153
|
-
async function
|
|
154
|
+
async function captureLatticeSensorBootstrap(worktreePath) {
|
|
154
155
|
try {
|
|
155
|
-
return await readFile(path.join(worktreePath, '.
|
|
156
|
+
return await readFile(path.join(worktreePath, '.lattice/sensor', '.gitignore'));
|
|
156
157
|
} catch (error) {
|
|
157
158
|
if (error?.code === 'ENOENT') return null;
|
|
158
159
|
throw error;
|
|
159
160
|
}
|
|
160
161
|
}
|
|
161
162
|
|
|
162
|
-
async function
|
|
163
|
-
const
|
|
164
|
-
await rm(
|
|
163
|
+
async function restoreLatticeSensorBootstrap(worktreePath, bootstrap) {
|
|
164
|
+
const sensorPath = path.join(worktreePath, '.lattice/sensor');
|
|
165
|
+
await rm(sensorPath, { recursive: true, force: true });
|
|
165
166
|
if (bootstrap === null) return;
|
|
166
|
-
await mkdir(
|
|
167
|
-
await writeFile(path.join(
|
|
167
|
+
await mkdir(sensorPath, { recursive: true });
|
|
168
|
+
await writeFile(path.join(sensorPath, '.gitignore'), bootstrap);
|
|
168
169
|
}
|
|
169
170
|
|
|
170
171
|
async function observeFreshIndex({
|
|
@@ -186,16 +187,16 @@ async function observeFreshIndex({
|
|
|
186
187
|
transform: async ({ worktreePath }) => {
|
|
187
188
|
if (condition === 'treatment') await applyAcceptedPatch(worktreePath, patch);
|
|
188
189
|
snapshot = await fixedSnapshot(worktreePath);
|
|
189
|
-
const
|
|
190
|
+
const sensorBootstrap = await captureLatticeSensorBootstrap(worktreePath);
|
|
190
191
|
try {
|
|
191
192
|
const indexStartedAt = performance.now();
|
|
192
|
-
await run
|
|
193
|
+
await invokeSensorCli(run, ['init', '.'], { cwd: worktreePath });
|
|
193
194
|
indexElapsedMs = roundedMilliseconds(indexStartedAt);
|
|
194
195
|
const queryStartedAt = performance.now();
|
|
195
|
-
rawEvidence = await
|
|
196
|
+
rawEvidence = await collectSensorEvidence({ cwd: worktreePath, querySet });
|
|
196
197
|
queryElapsedMs = roundedMilliseconds(queryStartedAt);
|
|
197
198
|
} finally {
|
|
198
|
-
await
|
|
199
|
+
await restoreLatticeSensorBootstrap(worktreePath, sensorBootstrap);
|
|
199
200
|
}
|
|
200
201
|
},
|
|
201
202
|
verifyCommands: [],
|
|
@@ -228,7 +229,7 @@ function compileOne({ inputs, observation, manualEvidence, planVersion }) {
|
|
|
228
229
|
candidateSpec: inputs.candidateSpec,
|
|
229
230
|
manualEvidence,
|
|
230
231
|
querySet: inputs.querySet,
|
|
231
|
-
|
|
232
|
+
sensorEvidence: observation.rawEvidence,
|
|
232
233
|
codeSnapshotDigest: observation.codeSnapshotDigest,
|
|
233
234
|
planVersion,
|
|
234
235
|
});
|
|
@@ -314,7 +315,7 @@ function evidenceSummary(bundles, querySet) {
|
|
|
314
315
|
validateRc1EvidenceBundle(bundle)
|
|
315
316
|
&& bundle.diagnostic.payload.cwd === '<repo-root>'
|
|
316
317
|
&& bundle.diagnostic.sanitization_manifest.schema
|
|
317
|
-
=== 'lattice.
|
|
318
|
+
=== 'lattice.sensor_sanitization_manifest.v1'
|
|
318
319
|
)),
|
|
319
320
|
};
|
|
320
321
|
}
|
|
@@ -35,13 +35,13 @@ const INPUT_PATHS = Object.freeze({
|
|
|
35
35
|
querySet: 'inputs/query-set-v2.json',
|
|
36
36
|
oracle: 'inputs/behavior-oracle-v2.json',
|
|
37
37
|
runtimeIdentity: 'inputs/oracle-runtime-identity.json',
|
|
38
|
-
|
|
38
|
+
sensorIdentity: 'inputs/lattice-sensor-identity.json',
|
|
39
39
|
});
|
|
40
40
|
const RUN_IDS = Object.freeze(['control-1', 'control-2', 'treatment-1', 'treatment-2']);
|
|
41
41
|
const IDENTITY_PATHS = Object.freeze({
|
|
42
42
|
compiler: 'identity/boundary-compiler.mjs',
|
|
43
43
|
oracleExecutor: 'identity/black-box-oracle.mjs',
|
|
44
|
-
|
|
44
|
+
sensorExecutable: 'identity/lattice-sensor-executable',
|
|
45
45
|
});
|
|
46
46
|
const INVALIDATED_CONTEXTS = Object.freeze([
|
|
47
47
|
{
|
|
@@ -123,7 +123,7 @@ function compilationSummary(compiled) {
|
|
|
123
123
|
};
|
|
124
124
|
}
|
|
125
125
|
|
|
126
|
-
function fixedInputIdentity(inputs, runtimeIdentity,
|
|
126
|
+
function fixedInputIdentity(inputs, runtimeIdentity, sensorIdentity) {
|
|
127
127
|
return {
|
|
128
128
|
plan_input: digestArtifact(inputs.planInput),
|
|
129
129
|
candidate_spec: digestArtifact(inputs.candidateSpec),
|
|
@@ -132,7 +132,7 @@ function fixedInputIdentity(inputs, runtimeIdentity, codegraphIdentity) {
|
|
|
132
132
|
query_set: digestArtifact(inputs.querySet),
|
|
133
133
|
behavior_oracle: digestArtifact(inputs.oracle),
|
|
134
134
|
oracle_runtime: digestArtifact(runtimeIdentity),
|
|
135
|
-
|
|
135
|
+
sensor_identity: digestArtifact(sensorIdentity),
|
|
136
136
|
capacity_writers: inputs.planInput.capacity.writers,
|
|
137
137
|
};
|
|
138
138
|
}
|
|
@@ -230,7 +230,7 @@ export function compileRc1V6Comparison({
|
|
|
230
230
|
baseSha,
|
|
231
231
|
inputs,
|
|
232
232
|
runtimeIdentity,
|
|
233
|
-
|
|
233
|
+
sensorIdentity,
|
|
234
234
|
compilerSourceDigest,
|
|
235
235
|
control,
|
|
236
236
|
treatment,
|
|
@@ -244,7 +244,7 @@ export function compileRc1V6Comparison({
|
|
|
244
244
|
return {
|
|
245
245
|
schema: 'lattice.rc1.control_treatment_comparison.v4',
|
|
246
246
|
base_sha: baseSha,
|
|
247
|
-
fixed_inputs: fixedInputIdentity(inputs, runtimeIdentity,
|
|
247
|
+
fixed_inputs: fixedInputIdentity(inputs, runtimeIdentity, sensorIdentity),
|
|
248
248
|
independent_variable: {
|
|
249
249
|
kind: 'accepted_production_and_test_seam',
|
|
250
250
|
transform_artifact_digest: transform.artifact_digest,
|
|
@@ -256,7 +256,7 @@ export function compileRc1V6Comparison({
|
|
|
256
256
|
source_digest: compilerSourceDigest,
|
|
257
257
|
condition_selector: RC1_BOUNDARY_COMPILER_CONTRACT.condition_selector,
|
|
258
258
|
},
|
|
259
|
-
|
|
259
|
+
sensor_identity: structuredClone(sensorIdentity),
|
|
260
260
|
oracle_runtime_identity: structuredClone(runtimeIdentity),
|
|
261
261
|
conditions: {
|
|
262
262
|
control: compiledConditionSummary(control, controlBundles),
|
|
@@ -283,8 +283,8 @@ export function evaluateRc1V6Hypothesis(comparison) {
|
|
|
283
283
|
&& SHA256.test(comparison?.compiler?.source_digest),
|
|
284
284
|
},
|
|
285
285
|
{
|
|
286
|
-
id: '
|
|
287
|
-
passed: comparison?.
|
|
286
|
+
id: 'sensor_identity_fixed',
|
|
287
|
+
passed: comparison?.sensor_identity?.schema === 'lattice.rc1.sensor_identity.v1',
|
|
288
288
|
},
|
|
289
289
|
{
|
|
290
290
|
id: 'runtime_identity_fixed',
|
|
@@ -391,7 +391,7 @@ export function rc1V6ArtifactMediaType(relativePath) {
|
|
|
391
391
|
throw new TypeError(`RC1 v6 artifact pathがexact setに存在しない: ${relativePath}`);
|
|
392
392
|
}
|
|
393
393
|
if (relativePath.endsWith('.json')) return 'application/json';
|
|
394
|
-
if (relativePath.endsWith('.mjs') || relativePath === IDENTITY_PATHS.
|
|
394
|
+
if (relativePath.endsWith('.mjs') || relativePath === IDENTITY_PATHS.sensorExecutable) {
|
|
395
395
|
return 'application/javascript';
|
|
396
396
|
}
|
|
397
397
|
if (relativePath.endsWith('.patch')) return 'text/x-diff';
|
|
@@ -568,7 +568,7 @@ function executionValid(value, expected) {
|
|
|
568
568
|
'base_sha',
|
|
569
569
|
'elapsed_ms',
|
|
570
570
|
'compiler_source_digest',
|
|
571
|
-
'
|
|
571
|
+
'sensor_identity_digest',
|
|
572
572
|
'runtime_identity_digest',
|
|
573
573
|
'run_descriptor_digests',
|
|
574
574
|
'transform_artifact_digest',
|
|
@@ -583,7 +583,7 @@ function executionValid(value, expected) {
|
|
|
583
583
|
&& Number.isFinite(value.elapsed_ms)
|
|
584
584
|
&& value.elapsed_ms >= 0
|
|
585
585
|
&& value.compiler_source_digest === expected.compilerSourceDigest
|
|
586
|
-
&& value.
|
|
586
|
+
&& value.sensor_identity_digest === digestArtifact(expected.sensorIdentity)
|
|
587
587
|
&& value.runtime_identity_digest === digestArtifact(expected.runtimeIdentity)
|
|
588
588
|
&& sameArtifact(value.run_descriptor_digests, expected.runDescriptorDigests)
|
|
589
589
|
&& value.transform_artifact_digest === expected.transformArtifactDigest
|
|
@@ -619,8 +619,8 @@ export function verifyRc1V6CampaignArtifactSet(options) {
|
|
|
619
619
|
const compilerSourceDigest = sha256(context.payloads.get(IDENTITY_PATHS.compiler));
|
|
620
620
|
const identitySourceBinding = sha256(context.payloads.get(IDENTITY_PATHS.oracleExecutor))
|
|
621
621
|
=== inputs.runtimeIdentity?.executor_source_digest
|
|
622
|
-
&& sha256(context.payloads.get(IDENTITY_PATHS.
|
|
623
|
-
=== inputs.
|
|
622
|
+
&& sha256(context.payloads.get(IDENTITY_PATHS.sensorExecutable))
|
|
623
|
+
=== inputs.sensorIdentity?.executable_digest;
|
|
624
624
|
check('identity_source_binding', identitySourceBinding);
|
|
625
625
|
const baseInputsValid = validatePlanInput(inputs.planInput)
|
|
626
626
|
&& validateRc1BlackBoxOracle(inputs.oracle)
|
|
@@ -656,14 +656,14 @@ export function verifyRc1V6CampaignArtifactSet(options) {
|
|
|
656
656
|
base_sha: context.manifest.base_sha,
|
|
657
657
|
patch_digest: null,
|
|
658
658
|
snapshot: controlSnapshot,
|
|
659
|
-
|
|
659
|
+
sensor_identity: inputs.sensorIdentity,
|
|
660
660
|
query_set_digest: digestArtifact(inputs.querySet),
|
|
661
661
|
},
|
|
662
662
|
treatment: {
|
|
663
663
|
base_sha: context.manifest.base_sha,
|
|
664
664
|
patch_digest: behaviorEvidence.patch_digest,
|
|
665
665
|
snapshot: treatmentSnapshot,
|
|
666
|
-
|
|
666
|
+
sensor_identity: inputs.sensorIdentity,
|
|
667
667
|
query_set_digest: digestArtifact(inputs.querySet),
|
|
668
668
|
},
|
|
669
669
|
};
|
|
@@ -740,7 +740,7 @@ export function verifyRc1V6CampaignArtifactSet(options) {
|
|
|
740
740
|
baseSha: context.manifest.base_sha,
|
|
741
741
|
inputs,
|
|
742
742
|
runtimeIdentity: inputs.runtimeIdentity,
|
|
743
|
-
|
|
743
|
+
sensorIdentity: inputs.sensorIdentity,
|
|
744
744
|
compilerSourceDigest,
|
|
745
745
|
control: savedControl,
|
|
746
746
|
treatment: savedTreatment,
|
|
@@ -765,7 +765,7 @@ export function verifyRc1V6CampaignArtifactSet(options) {
|
|
|
765
765
|
check('execution_evidence', transform !== null && executionValid(execution, {
|
|
766
766
|
baseSha: context.manifest.base_sha,
|
|
767
767
|
compilerSourceDigest,
|
|
768
|
-
|
|
768
|
+
sensorIdentity: inputs.sensorIdentity,
|
|
769
769
|
runtimeIdentity: inputs.runtimeIdentity,
|
|
770
770
|
runDescriptorDigests: runs.map(({ evidence_bundle_descriptor_digest: digest }) => digest),
|
|
771
771
|
transformArtifactDigest: transform.artifact_digest,
|
package/src/rc1-v6-campaign.mjs
CHANGED
|
@@ -39,7 +39,7 @@ import { createRc1V6EvidenceBundleDescriptor } from './rc1-v6-causal-binding.mjs
|
|
|
39
39
|
import { runRc1V5Campaign } from './rc1-v5-campaign.mjs';
|
|
40
40
|
import {
|
|
41
41
|
bindRc1V6EvidenceBundle,
|
|
42
|
-
|
|
42
|
+
captureRc1V6LatticeSensorExecutable,
|
|
43
43
|
compileRc1V6BoundaryCondition,
|
|
44
44
|
createRc1V6ConditionRun,
|
|
45
45
|
sourceSnapshotFromRc1BehaviorSurface,
|
|
@@ -294,24 +294,24 @@ export async function runRc1V6Campaign(options = {}) {
|
|
|
294
294
|
.stdout.toString('utf8').trim();
|
|
295
295
|
if (!GIT_SHA1.test(baseSha)) throw new TypeError('RC1 v6 campaign base SHA is invalid');
|
|
296
296
|
const startedAt = performance.now();
|
|
297
|
-
const [
|
|
298
|
-
|
|
297
|
+
const [sensorCapture, compilerSourceBytes, oracleExecutorBytes] = await Promise.all([
|
|
298
|
+
captureRc1V6LatticeSensorExecutable(),
|
|
299
299
|
readFile(new URL('./boundary-compiler.mjs', import.meta.url)),
|
|
300
300
|
readFile(new URL('./rc1-black-box-oracle.mjs', import.meta.url)),
|
|
301
301
|
]);
|
|
302
|
-
const
|
|
302
|
+
const sensorIdentity = sensorCapture.identity;
|
|
303
303
|
const runtimeIdentity = await createRc1V6OracleRuntimeIdentity();
|
|
304
304
|
if (runtimeIdentity.executor_source_digest !== sha256(oracleExecutorBytes)) {
|
|
305
305
|
throw new TypeError('RC1 v6 oracle runtime identityが保存executor bytesと一致しない');
|
|
306
306
|
}
|
|
307
307
|
const v5 = await runRc1V5Campaign({ repoRoot, baseRef: baseSha, inputs: fixedInputs });
|
|
308
|
-
const [
|
|
308
|
+
const [finalLatticeSensorCapture, finalCompilerSourceBytes, finalOracleExecutorBytes] =
|
|
309
309
|
await Promise.all([
|
|
310
|
-
|
|
310
|
+
captureRc1V6LatticeSensorExecutable(),
|
|
311
311
|
readFile(new URL('./boundary-compiler.mjs', import.meta.url)),
|
|
312
312
|
readFile(new URL('./rc1-black-box-oracle.mjs', import.meta.url)),
|
|
313
313
|
]);
|
|
314
|
-
if (!isDeepStrictEqual(
|
|
314
|
+
if (!isDeepStrictEqual(sensorCapture, finalLatticeSensorCapture)
|
|
315
315
|
|| !compilerSourceBytes.equals(finalCompilerSourceBytes)
|
|
316
316
|
|| !oracleExecutorBytes.equals(finalOracleExecutorBytes)) {
|
|
317
317
|
throw new TypeError('RC1 v6実行主体のidentityがcampaign中にdriftした');
|
|
@@ -343,7 +343,7 @@ export async function runRc1V6Campaign(options = {}) {
|
|
|
343
343
|
base_sha: baseSha,
|
|
344
344
|
patch_digest: bundle.condition === 'treatment' ? v5.transform.artifact.patch.digest : null,
|
|
345
345
|
snapshot: bundle.condition === 'treatment' ? treatmentSnapshot : controlSnapshot,
|
|
346
|
-
|
|
346
|
+
sensor_identity: sensorIdentity,
|
|
347
347
|
query_set_digest: digestArtifact(fixedInputs.querySet),
|
|
348
348
|
}));
|
|
349
349
|
const runs = evidenceBundles.map(createRc1V6ConditionRun);
|
|
@@ -355,14 +355,14 @@ export async function runRc1V6Campaign(options = {}) {
|
|
|
355
355
|
base_sha: baseSha,
|
|
356
356
|
patch_digest: null,
|
|
357
357
|
snapshot: controlSnapshot,
|
|
358
|
-
|
|
358
|
+
sensor_identity: sensorIdentity,
|
|
359
359
|
query_set_digest: digestArtifact(fixedInputs.querySet),
|
|
360
360
|
};
|
|
361
361
|
const treatmentExpected = {
|
|
362
362
|
base_sha: baseSha,
|
|
363
363
|
patch_digest: v5.transform.artifact.patch.digest,
|
|
364
364
|
snapshot: treatmentSnapshot,
|
|
365
|
-
|
|
365
|
+
sensor_identity: sensorIdentity,
|
|
366
366
|
query_set_digest: digestArtifact(fixedInputs.querySet),
|
|
367
367
|
};
|
|
368
368
|
const control = compileCondition({
|
|
@@ -419,7 +419,7 @@ export async function runRc1V6Campaign(options = {}) {
|
|
|
419
419
|
baseSha,
|
|
420
420
|
inputs: fixedInputs,
|
|
421
421
|
runtimeIdentity,
|
|
422
|
-
|
|
422
|
+
sensorIdentity,
|
|
423
423
|
compilerSourceDigest,
|
|
424
424
|
control,
|
|
425
425
|
treatment,
|
|
@@ -443,7 +443,7 @@ export async function runRc1V6Campaign(options = {}) {
|
|
|
443
443
|
base_sha: baseSha,
|
|
444
444
|
elapsed_ms: roundedMilliseconds(startedAt),
|
|
445
445
|
compiler_source_digest: compilerSourceDigest,
|
|
446
|
-
|
|
446
|
+
sensor_identity_digest: digestArtifact(sensorIdentity),
|
|
447
447
|
runtime_identity_digest: digestArtifact(runtimeIdentity),
|
|
448
448
|
run_descriptor_digests: runs.map(({ evidence_bundle_descriptor_digest: digest }) => digest),
|
|
449
449
|
transform_artifact_digest: transform.artifact_digest,
|
|
@@ -458,11 +458,11 @@ export async function runRc1V6Campaign(options = {}) {
|
|
|
458
458
|
base_sha: baseSha,
|
|
459
459
|
inputs: fixedInputs,
|
|
460
460
|
runtime_identity: runtimeIdentity,
|
|
461
|
-
|
|
461
|
+
sensor_identity: sensorIdentity,
|
|
462
462
|
identity_sources: {
|
|
463
463
|
compiler: compilerSourceBytes,
|
|
464
464
|
oracle_executor: oracleExecutorBytes,
|
|
465
|
-
|
|
465
|
+
sensor_executable: sensorCapture.executable_bytes,
|
|
466
466
|
},
|
|
467
467
|
evidence_bundles: evidenceBundles,
|
|
468
468
|
runs,
|
|
@@ -490,10 +490,10 @@ function artifactFiles(result, rejectedPlanBytes, phaseDecisionBytes) {
|
|
|
490
490
|
files.set(relativePath, jsonBytes(result.inputs[key]));
|
|
491
491
|
}
|
|
492
492
|
files.set('inputs/oracle-runtime-identity.json', jsonBytes(result.runtime_identity));
|
|
493
|
-
files.set('inputs/
|
|
493
|
+
files.set('inputs/lattice-sensor-identity.json', jsonBytes(result.sensor_identity));
|
|
494
494
|
files.set('identity/boundary-compiler.mjs', Buffer.from(result.identity_sources.compiler));
|
|
495
495
|
files.set('identity/black-box-oracle.mjs', Buffer.from(result.identity_sources.oracle_executor));
|
|
496
|
-
files.set('identity/
|
|
496
|
+
files.set('identity/lattice-sensor-executable', Buffer.from(result.identity_sources.sensor_executable));
|
|
497
497
|
for (const bundle of result.evidence_bundles) {
|
|
498
498
|
files.set(`evidence/${bundle.run_id}.json`, jsonBytes(bundle));
|
|
499
499
|
}
|
|
@@ -262,17 +262,19 @@ function validSourceSnapshot(value) {
|
|
|
262
262
|
return value.files.every(({ path }, index) => index === 0 || value.files[index - 1].path < path);
|
|
263
263
|
}
|
|
264
264
|
|
|
265
|
-
function
|
|
265
|
+
function validLatticeSensorIdentity(value) {
|
|
266
266
|
return exactRecord(value, [
|
|
267
267
|
'schema',
|
|
268
268
|
'version',
|
|
269
269
|
'executable_ref',
|
|
270
270
|
'executable_digest',
|
|
271
271
|
])
|
|
272
|
-
&& value.schema === 'lattice.rc1.
|
|
272
|
+
&& value.schema === 'lattice.rc1.sensor_identity.v1'
|
|
273
273
|
&& typeof value.version === 'string'
|
|
274
274
|
&& /^\d+\.\d+\.\d+(?:[-+][A-Za-z0-9.-]+)?$/.test(value.version)
|
|
275
|
-
|
|
275
|
+
// `sensor` is accepted only as an immutable pre-cutover artifact value.
|
|
276
|
+
// New captures always emit `lattice-sensor`.
|
|
277
|
+
&& (value.executable_ref === 'lattice-sensor' || value.executable_ref === 'sensor')
|
|
276
278
|
&& SHA256.test(value.executable_digest);
|
|
277
279
|
}
|
|
278
280
|
|
|
@@ -297,7 +299,7 @@ export function createRc1V6EvidenceBundleDescriptor(bundle) {
|
|
|
297
299
|
}
|
|
298
300
|
|
|
299
301
|
/**
|
|
300
|
-
* v6
|
|
302
|
+
* v6 LatticeSensor runを、独立したsource/tool期待値と保存raw evidenceへcross-bindする。
|
|
301
303
|
*/
|
|
302
304
|
export function verifyRc1V6RunEvidence(options) {
|
|
303
305
|
if (!exactRecord(options, ['run', 'bundle', 'expected'])) {
|
|
@@ -336,14 +338,14 @@ export function verifyRc1V6RunEvidence(options) {
|
|
|
336
338
|
'base_sha',
|
|
337
339
|
'patch_digest',
|
|
338
340
|
'snapshot',
|
|
339
|
-
'
|
|
341
|
+
'sensor_identity',
|
|
340
342
|
'query_set_digest',
|
|
341
343
|
])
|
|
342
344
|
&& GIT_SHA1.test(expected.base_sha)
|
|
343
345
|
&& (expected.patch_digest === null
|
|
344
346
|
|| (typeof expected.patch_digest === 'string' && SHA256.test(expected.patch_digest)))
|
|
345
347
|
&& validSourceSnapshot(expected.snapshot)
|
|
346
|
-
&&
|
|
348
|
+
&& validLatticeSensorIdentity(expected.sensor_identity)
|
|
347
349
|
&& SHA256.test(expected.query_set_digest);
|
|
348
350
|
const measurement = bundleValid ? bundle.measurement : null;
|
|
349
351
|
const measurementValid = exactRecord(measurement, [
|
|
@@ -352,19 +354,19 @@ export function verifyRc1V6RunEvidence(options) {
|
|
|
352
354
|
'patch_digest',
|
|
353
355
|
'snapshot',
|
|
354
356
|
'snapshot_digest',
|
|
355
|
-
'
|
|
356
|
-
'
|
|
357
|
+
'sensor_identity',
|
|
358
|
+
'sensor_identity_digest',
|
|
357
359
|
'query_set_digest',
|
|
358
360
|
'raw_evidence_digest',
|
|
359
361
|
])
|
|
360
|
-
&& measurement.schema === 'lattice.rc1.
|
|
362
|
+
&& measurement.schema === 'lattice.rc1.sensor_measurement.v1'
|
|
361
363
|
&& GIT_SHA1.test(measurement.base_sha)
|
|
362
364
|
&& (measurement.patch_digest === null
|
|
363
365
|
|| (typeof measurement.patch_digest === 'string' && SHA256.test(measurement.patch_digest)))
|
|
364
366
|
&& validSourceSnapshot(measurement.snapshot)
|
|
365
367
|
&& SHA256.test(measurement.snapshot_digest)
|
|
366
|
-
&&
|
|
367
|
-
&& SHA256.test(measurement.
|
|
368
|
+
&& validLatticeSensorIdentity(measurement.sensor_identity)
|
|
369
|
+
&& SHA256.test(measurement.sensor_identity_digest)
|
|
368
370
|
&& SHA256.test(measurement.query_set_digest)
|
|
369
371
|
&& SHA256.test(measurement.raw_evidence_digest);
|
|
370
372
|
|
|
@@ -394,10 +396,10 @@ export function verifyRc1V6RunEvidence(options) {
|
|
|
394
396
|
&& isDeepStrictEqual(measurement.snapshot, expected.snapshot),
|
|
395
397
|
},
|
|
396
398
|
{
|
|
397
|
-
id: '
|
|
399
|
+
id: 'sensor_identity',
|
|
398
400
|
passed: measurementValid && expectedValid
|
|
399
|
-
&& measurement.
|
|
400
|
-
&& isDeepStrictEqual(measurement.
|
|
401
|
+
&& measurement.sensor_identity_digest === safeDigest(measurement.sensor_identity)
|
|
402
|
+
&& isDeepStrictEqual(measurement.sensor_identity, expected.sensor_identity),
|
|
401
403
|
},
|
|
402
404
|
{
|
|
403
405
|
id: 'source_projection',
|