From fe752e9b88f42497af9364d5547a1e029fae7215 Mon Sep 17 00:00:00 2001 From: James Ross Date: Tue, 20 Oct 2026 09:52:53 -0700 Subject: [PATCH 1/3] build(host): run the native host on current Echo main Moves warp-core, echo-wasm-abi, and echo-registry-api from Echo 90f63ae (2026-07-17, 1054 commits behind) to Echo main 0faaf58. - Regenerated src/generated/contract.rs with Echo main's echo-wesley-gen --contract-host. Generated rules now take observed executors. - Executors read the graph through ExecutionGraphView via an ObservedGraph GraphFacts adapter, so every fact a plan reads is recorded in Echo's observed footprint. Footprints decode vars with eint_vars_for_op over the plain GraphView, as Echo's own contract-host fixtures do. - Receipts now carry InstalledInvocationEvidence; the host requires the LegacyContract variant and checks its op id and kind as before. - Regenerated the ReplaceRange oracle corpus: only sourceSet.digestHex (which hashes Cargo.toml and Cargo.lock) and its sidecar changed. The schema, codec vectors, and every oracle case are byte-identical. --- .../replace-range-v1.oracle.json | 2 +- .../replace-range-v1.oracle.sha256 | 2 +- native/jedit-echo-host/Cargo.lock | 296 +++++++++++++++++- native/jedit-echo-host/Cargo.toml | 6 +- native/jedit-echo-host/src/contract.rs | 104 ++++-- .../jedit-echo-host/src/generated/contract.rs | 29 +- native/jedit-echo-host/src/host.rs | 18 +- 7 files changed, 398 insertions(+), 59 deletions(-) diff --git a/contracts/jedit/lawpacks/replace-range-v1/replace-range-v1.oracle.json b/contracts/jedit/lawpacks/replace-range-v1/replace-range-v1.oracle.json index f0b878ec..5aa04c0f 100644 --- a/contracts/jedit/lawpacks/replace-range-v1/replace-range-v1.oracle.json +++ b/contracts/jedit/lawpacks/replace-range-v1/replace-range-v1.oracle.json @@ -31,7 +31,7 @@ "native/jedit-echo-host/tests/support/replace_range_oracle_tests.rs", "native/jedit-echo-host/tests/support/replace_range_source_set.rs" ], - "digestHex": "2adf83f798205f52636ad64ca45178f33a8e1cc663874f8a6113484c945e3052" + "digestHex": "1628a34afa7f709e159b373198fc3e632f7ea2c1fb694b63a1f4fde1c6c1509e" }, "evidenceGrade": "deterministic-self-validation", "independenceLimit": "independent finite-corpus evidence begins only when a separately implemented Echo evaluator agrees", diff --git a/contracts/jedit/lawpacks/replace-range-v1/replace-range-v1.oracle.sha256 b/contracts/jedit/lawpacks/replace-range-v1/replace-range-v1.oracle.sha256 index 381eeb90..5388b44c 100644 --- a/contracts/jedit/lawpacks/replace-range-v1/replace-range-v1.oracle.sha256 +++ b/contracts/jedit/lawpacks/replace-range-v1/replace-range-v1.oracle.sha256 @@ -1 +1 @@ -b9b4707dd5e07897cbe7af36d88928401887e6af5d167d1a88a8d6181b4dbb0e +7c38a873435d7dd8d785a121ed64ff17fbbdc6875ec20b49c460f538843548dc diff --git a/native/jedit-echo-host/Cargo.lock b/native/jedit-echo-host/Cargo.lock index cc731a24..9db2ef61 100644 --- a/native/jedit-echo-host/Cargo.lock +++ b/native/jedit-echo-host/Cargo.lock @@ -2,6 +2,12 @@ # It is not intended for manual editing. version = 4 +[[package]] +name = "ambient-authority" +version = "0.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e9d4ee0d472d1cd2e28c97dfa124b3d8d992e10eb0a035f33f5d12e3a177ba3b" + [[package]] name = "anyhow" version = "1.0.103" @@ -55,6 +61,12 @@ dependencies = [ "generic-array", ] +[[package]] +name = "bunny-num" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2d5c3288a3b7dcf4517c717a864c648777af349a15c86e25db48f86ec099f864" + [[package]] name = "bytemuck" version = "1.25.1" @@ -81,6 +93,48 @@ version = "1.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fc652a48c352aef3ea3aed32080501cf3ef6ed5da78602a020c991775b0aff04" +[[package]] +name = "cap-fs-ext" +version = "4.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d78e5a3368ae89b7cb68186411452b4b9fac8b41be9c19bf3f47c2d2c8e36e6b" +dependencies = [ + "cap-primitives", + "cap-std", + "io-lifetimes 3.0.1", + "windows-sys 0.61.2", +] + +[[package]] +name = "cap-primitives" +version = "4.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b5f74729fd2f44701d1a8eb47e906cdb3ccd9ec0f02baad85a744b791940b18" +dependencies = [ + "ambient-authority", + "fs-set-times", + "io-extras", + "io-lifetimes 3.0.1", + "ipnet", + "maybe-owned", + "rustix", + "rustix-linux-procfs", + "windows-sys 0.61.2", + "winx", +] + +[[package]] +name = "cap-std" +version = "4.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7281235d6e96d3544ca18bba9049be92f4190f8d923e3caef1b5f66cfa752608" +dependencies = [ + "cap-primitives", + "io-extras", + "io-lifetimes 3.0.1", + "rustix", +] + [[package]] name = "cc" version = "1.2.67" @@ -174,20 +228,29 @@ dependencies = [ "crypto-common", ] +[[package]] +name = "echo-edict-canonical" +version = "0.1.0" +source = "git+https://github.com/flyingrobots/echo?rev=0faaf58a15a4b03036cf36b465d79af76c952193#0faaf58a15a4b03036cf36b465d79af76c952193" +dependencies = [ + "hex", + "sha2", +] + [[package]] name = "echo-registry-api" version = "0.1.0" -source = "git+https://github.com/flyingrobots/echo?rev=90f63ae27c673fb7d398aba12c98cfbcf1ef24c3#90f63ae27c673fb7d398aba12c98cfbcf1ef24c3" +source = "git+https://github.com/flyingrobots/echo?rev=0faaf58a15a4b03036cf36b465d79af76c952193#0faaf58a15a4b03036cf36b465d79af76c952193" [[package]] name = "echo-runtime-schema" version = "0.1.0" -source = "git+https://github.com/flyingrobots/echo?rev=90f63ae27c673fb7d398aba12c98cfbcf1ef24c3#90f63ae27c673fb7d398aba12c98cfbcf1ef24c3" +source = "git+https://github.com/flyingrobots/echo?rev=0faaf58a15a4b03036cf36b465d79af76c952193#0faaf58a15a4b03036cf36b465d79af76c952193" [[package]] name = "echo-wasm-abi" version = "0.1.0" -source = "git+https://github.com/flyingrobots/echo?rev=90f63ae27c673fb7d398aba12c98cfbcf1ef24c3#90f63ae27c673fb7d398aba12c98cfbcf1ef24c3" +source = "git+https://github.com/flyingrobots/echo?rev=0faaf58a15a4b03036cf36b465d79af76c952193#0faaf58a15a4b03036cf36b465d79af76c952193" dependencies = [ "blake3", "ciborium", @@ -205,7 +268,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "39cab71617ae0d63f51a36d69f866391735b51691dbda63cf6f96d042b63efeb" dependencies = [ "libc", - "windows-sys", + "windows-sys 0.61.2", ] [[package]] @@ -220,6 +283,17 @@ version = "0.1.9" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5baebc0774151f905a1a2cc41989300b1e6fbb29aff0ceffa1064fdd3088d582" +[[package]] +name = "fs-set-times" +version = "0.20.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94e7099f6313ecacbe1256e8ff9d617b75d1bcb16a6fddef94866d225a01a14a" +dependencies = [ + "io-lifetimes 2.0.4", + "rustix", + "windows-sys 0.59.0", +] + [[package]] name = "generic-array" version = "0.14.7" @@ -258,6 +332,34 @@ version = "0.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" +[[package]] +name = "io-extras" +version = "0.19.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "20fd6de4ccfcc187e38bc21cfa543cb5a302cb86a8b114eb7f0bf0dc9f8ac00f" +dependencies = [ + "io-lifetimes 3.0.1", + "windows-sys 0.60.2", +] + +[[package]] +name = "io-lifetimes" +version = "2.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "06432fb54d3be7964ecd3649233cddf80db2832f47fec34c01f65b3d9d774983" + +[[package]] +name = "io-lifetimes" +version = "3.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2f0fb0570afe1fed943c5c3d4102d5358592d8625fda6a0007fdbe65a92fba96" + +[[package]] +name = "ipnet" +version = "2.12.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "791930b43c0d5973160d90a8f3894509f2b273430f5c5c73b668636d0287c5c0" + [[package]] name = "itoa" version = "1.0.18" @@ -301,6 +403,12 @@ version = "0.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "32a66949e030da00e8c7d4434b251670a91556f4144941d37452769c25d58a53" +[[package]] +name = "maybe-owned" +version = "0.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4facc753ae494aeb6e3c22f839b158aebd4f9270f55cd3c79906c45476c47ab4" + [[package]] name = "memchr" version = "2.8.3" @@ -371,7 +479,17 @@ dependencies = [ "errno", "libc", "linux-raw-sys", - "windows-sys", + "windows-sys 0.61.2", +] + +[[package]] +name = "rustix-linux-procfs" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2fc84bf7e9aa16c4f2c758f27412dc9841341e16aa682d9c7ac308fe3ee12056" +dependencies = [ + "once_cell", + "rustix", ] [[package]] @@ -471,7 +589,7 @@ dependencies = [ "getrandom", "once_cell", "rustix", - "windows-sys", + "windows-sys 0.61.2", ] [[package]] @@ -535,16 +653,20 @@ checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" [[package]] name = "warp-core" version = "0.1.1" -source = "git+https://github.com/flyingrobots/echo?rev=90f63ae27c673fb7d398aba12c98cfbcf1ef24c3#90f63ae27c673fb7d398aba12c98cfbcf1ef24c3" +source = "git+https://github.com/flyingrobots/echo?rev=0faaf58a15a4b03036cf36b465d79af76c952193#0faaf58a15a4b03036cf36b465d79af76c952193" dependencies = [ "blake3", "bytemuck", "bytes", + "cap-fs-ext", + "cap-std", + "echo-edict-canonical", "echo-registry-api", "echo-runtime-schema", "echo-wasm-abi", "hex", "rustc-hash", + "sha2", "thiserror 1.0.69", "warp-math", ] @@ -552,8 +674,9 @@ dependencies = [ [[package]] name = "warp-math" version = "0.1.0" -source = "git+https://github.com/flyingrobots/echo?rev=90f63ae27c673fb7d398aba12c98cfbcf1ef24c3#90f63ae27c673fb7d398aba12c98cfbcf1ef24c3" +source = "git+https://github.com/flyingrobots/echo?rev=0faaf58a15a4b03036cf36b465d79af76c952193#0faaf58a15a4b03036cf36b465d79af76c952193" dependencies = [ + "bunny-num", "libm", ] @@ -563,6 +686,24 @@ version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f0805222e57f7521d6a62e36fa9163bc891acd422f971defe97d64e70d0a4fe5" +[[package]] +name = "windows-sys" +version = "0.59.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e38bc4d79ed67fd075bcc251a1c39b32a1776bbe92e5bef1f0bf1f8c531853b" +dependencies = [ + "windows-targets 0.52.6", +] + +[[package]] +name = "windows-sys" +version = "0.60.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f2f500e4d28234f72040990ec9d39e3a6b950f9f22d3dba18416c35882612bcb" +dependencies = [ + "windows-targets 0.53.5", +] + [[package]] name = "windows-sys" version = "0.61.2" @@ -572,6 +713,145 @@ dependencies = [ "windows-link", ] +[[package]] +name = "windows-targets" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973" +dependencies = [ + "windows_aarch64_gnullvm 0.52.6", + "windows_aarch64_msvc 0.52.6", + "windows_i686_gnu 0.52.6", + "windows_i686_gnullvm 0.52.6", + "windows_i686_msvc 0.52.6", + "windows_x86_64_gnu 0.52.6", + "windows_x86_64_gnullvm 0.52.6", + "windows_x86_64_msvc 0.52.6", +] + +[[package]] +name = "windows-targets" +version = "0.53.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4945f9f551b88e0d65f3db0bc25c33b8acea4d9e41163edf90dcd0b19f9069f3" +dependencies = [ + "windows-link", + "windows_aarch64_gnullvm 0.53.1", + "windows_aarch64_msvc 0.53.1", + "windows_i686_gnu 0.53.1", + "windows_i686_gnullvm 0.53.1", + "windows_i686_msvc 0.53.1", + "windows_x86_64_gnu 0.53.1", + "windows_x86_64_gnullvm 0.53.1", + "windows_x86_64_msvc 0.53.1", +] + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a9d8416fa8b42f5c947f8482c43e7d89e73a173cead56d044f6a56104a6d1b53" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b9d782e804c2f632e395708e99a94275910eb9100b2114651e04744e9b125006" + +[[package]] +name = "windows_i686_gnu" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" + +[[package]] +name = "windows_i686_gnu" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "960e6da069d81e09becb0ca57a65220ddff016ff2d6af6a223cf372a506593a3" + +[[package]] +name = "windows_i686_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" + +[[package]] +name = "windows_i686_gnullvm" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fa7359d10048f68ab8b09fa71c3daccfb0e9b559aed648a8f95469c27057180c" + +[[package]] +name = "windows_i686_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" + +[[package]] +name = "windows_i686_msvc" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e7ac75179f18232fe9c285163565a57ef8d3c89254a30685b57d83a38d326c2" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c3842cdd74a865a8066ab39c8a7a473c0778a3f29370b5fd6b4b9aa7df4a499" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ffa179e2d07eee8ad8f57493436566c7cc30ac536a3379fdf008f47f6bb7ae1" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d6bbff5f0aada427a1e5a6da5f1f98158182f26556f345ac9e04d36d0ebed650" + +[[package]] +name = "winx" +version = "0.36.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f3fd376f71958b862e7afb20cfe5a22830e1963462f3a17f49d82a6c1d1f42d" +dependencies = [ + "bitflags", + "windows-sys 0.59.0", +] + [[package]] name = "zerocopy" version = "0.8.54" diff --git a/native/jedit-echo-host/Cargo.toml b/native/jedit-echo-host/Cargo.toml index cff590b7..74ea85c6 100644 --- a/native/jedit-echo-host/Cargo.toml +++ b/native/jedit-echo-host/Cargo.toml @@ -10,13 +10,13 @@ publish = false anyhow = "1" blake3 = "1" bytes = "1" -echo-registry-api = { git = "https://github.com/flyingrobots/echo", rev = "90f63ae27c673fb7d398aba12c98cfbcf1ef24c3" } -echo-wasm-abi = { git = "https://github.com/flyingrobots/echo", rev = "90f63ae27c673fb7d398aba12c98cfbcf1ef24c3" } +echo-registry-api = { git = "https://github.com/flyingrobots/echo", rev = "0faaf58a15a4b03036cf36b465d79af76c952193" } +echo-wasm-abi = { git = "https://github.com/flyingrobots/echo", rev = "0faaf58a15a4b03036cf36b465d79af76c952193" } hex = "0.4" serde = { version = "1", features = ["derive"] } serde_json = "1" thiserror = "2" -warp-core = { git = "https://github.com/flyingrobots/echo", rev = "90f63ae27c673fb7d398aba12c98cfbcf1ef24c3", features = ["native_rule_bootstrap", "trusted_runtime"] } +warp-core = { git = "https://github.com/flyingrobots/echo", rev = "0faaf58a15a4b03036cf36b465d79af76c952193", features = ["native_rule_bootstrap", "trusted_runtime"] } [dev-dependencies] sha2 = "0.10" diff --git a/native/jedit-echo-host/src/contract.rs b/native/jedit-echo-host/src/contract.rs index 169ab418..e77c0263 100644 --- a/native/jedit-echo-host/src/contract.rs +++ b/native/jedit-echo-host/src/contract.rs @@ -1,8 +1,12 @@ use echo_registry_api::ContractArtifactVerificationPolicy; +use std::cell::RefCell; + +use echo_wasm_abi::codec::Decode; use warp_core::{ - ContractMutationHandler, ContractPackageIdentity, ContractQueryObserverContext, - ContractQueryObserverError, ContractQueryObserverResult, Footprint, GraphView, - InstalledContractPackage, NodeId, TickDelta, + AttachmentValue, ContractMutationHandler, ContractPackageIdentity, + ContractQueryObserverContext, ContractQueryObserverError, ContractQueryObserverResult, + ExecutionGraphView, Footprint, GraphView, InstalledContractPackage, NodeId, NodeRecord, + TickDelta, WarpId, }; use crate::generated::contract::__echo_wesley_generated::{ @@ -22,7 +26,7 @@ use crate::generated::contract::{ use crate::identity::parse_node_id; use crate::import_anchor::{plan_import_anchor, AnchorPlan, ImportHostBasis}; use crate::records::CheckpointReason; -use crate::rope::{plan_checkpoint, plan_create, plan_replace, read_window}; +use crate::rope::{plan_checkpoint, plan_create, plan_replace, read_window, GraphFacts}; const PACKAGE_NAME: &str = "jedit-echo-text"; const PACKAGE_VERSION: &str = "0.1.0-wesley-compat"; @@ -80,11 +84,15 @@ pub fn installed_package() -> InstalledContractPackage<'static> { } } -fn create_buffer_executor(view: GraphView<'_>, scope: &NodeId, delta: &mut TickDelta) { +fn create_buffer_executor( + view: &mut ExecutionGraphView<'_, '_>, + scope: &NodeId, + delta: &mut TickDelta, +) { let Some(vars) = create_buffer_worldline_contract_vars(view, scope) else { return; }; - if let Ok((plan, anchor)) = create_plan(view, vars) { + if let Ok((plan, anchor)) = create_plan(&ObservedGraph::new(view), vars) { plan.emit(delta); anchor.emit(delta); } @@ -92,8 +100,10 @@ fn create_buffer_executor(view: GraphView<'_>, scope: &NodeId, delta: &mut TickD fn create_buffer_footprint(view: GraphView<'_>, scope: &NodeId) -> Footprint { let mut footprint = create_buffer_worldline_contract_runtime_ingress_footprint(view, scope); - if let Some(vars) = create_buffer_worldline_contract_vars(view, scope) { - if let Ok((plan, anchor)) = create_plan(view, vars) { + if let Some(vars) = + footprint_vars::(view, scope, OP_CREATE_BUFFER_WORLDLINE) + { + if let Ok((plan, anchor)) = create_plan(&view, vars) { plan.extend_footprint(&mut footprint); anchor.extend_footprint(&mut footprint); } @@ -101,8 +111,8 @@ fn create_buffer_footprint(view: GraphView<'_>, scope: &NodeId) -> Footprint { footprint } -fn create_plan( - view: GraphView<'_>, +fn create_plan( + view: &T, vars: CreateBufferWorldlineVars, ) -> crate::error::HostResult<(crate::rope::MutationPlan, AnchorPlan)> { let host_basis = import_host_basis( @@ -112,13 +122,13 @@ fn create_plan( )?; let projection_path = vars.input.projectionPath; let plan = plan_create( - &view, + view, &vars.input.bufferKey, &vars.input.initialText, projection_path.clone(), )?; let anchor = plan_import_anchor( - &view, + view, plan.buffer_id, plan.head_id, projection_path, @@ -167,31 +177,37 @@ pub fn generated_import_host_basis( } } -fn replace_range_executor(view: GraphView<'_>, scope: &NodeId, delta: &mut TickDelta) { +fn replace_range_executor( + view: &mut ExecutionGraphView<'_, '_>, + scope: &NodeId, + delta: &mut TickDelta, +) { let Some(vars) = replace_range_as_tick_contract_vars(view, scope) else { return; }; - if let Ok(plan) = replace_plan(view, vars) { + if let Ok(plan) = replace_plan(&ObservedGraph::new(view), vars) { plan.emit(delta); } } fn replace_range_footprint(view: GraphView<'_>, scope: &NodeId) -> Footprint { let mut footprint = replace_range_as_tick_contract_runtime_ingress_footprint(view, scope); - if let Some(vars) = replace_range_as_tick_contract_vars(view, scope) { - if let Ok(plan) = replace_plan(view, vars) { + if let Some(vars) = + footprint_vars::(view, scope, OP_REPLACE_RANGE_AS_TICK) + { + if let Ok(plan) = replace_plan(&view, vars) { plan.extend_footprint(&mut footprint); } } footprint } -fn replace_plan( - view: GraphView<'_>, +fn replace_plan( + view: &T, vars: ReplaceRangeAsTickVars, ) -> crate::error::HostResult { plan_replace( - &view, + view, parse_node_id(&vars.input.bufferId)?, parse_node_id(&vars.input.basisHeadId)?, non_negative(vars.input.startByte, "startByte")?, @@ -200,37 +216,73 @@ fn replace_plan( ) } -fn declare_checkpoint_executor(view: GraphView<'_>, scope: &NodeId, delta: &mut TickDelta) { +fn declare_checkpoint_executor( + view: &mut ExecutionGraphView<'_, '_>, + scope: &NodeId, + delta: &mut TickDelta, +) { let Some(vars) = declare_checkpoint_contract_vars(view, scope) else { return; }; - if let Ok(plan) = declare_checkpoint_plan(view, vars) { + if let Ok(plan) = declare_checkpoint_plan(&ObservedGraph::new(view), vars) { plan.emit(delta); } } fn declare_checkpoint_footprint(view: GraphView<'_>, scope: &NodeId) -> Footprint { let mut footprint = declare_checkpoint_contract_runtime_ingress_footprint(view, scope); - if let Some(vars) = declare_checkpoint_contract_vars(view, scope) { - if let Ok(plan) = declare_checkpoint_plan(view, vars) { + if let Some(vars) = footprint_vars::(view, scope, OP_DECLARE_CHECKPOINT) + { + if let Ok(plan) = declare_checkpoint_plan(&view, vars) { plan.extend_footprint(&mut footprint); } } footprint } -fn declare_checkpoint_plan( - view: GraphView<'_>, +fn declare_checkpoint_plan( + view: &T, vars: DeclareCheckpointVars, ) -> crate::error::HostResult { plan_checkpoint( - &view, + view, parse_node_id(&vars.input.bufferId)?, parse_node_id(&vars.input.basisHeadId)?, checkpoint_reason(&vars.input.reason)?, ) } +/// Decodes a mutation's generated vars for footprint computation, which runs +/// over Echo's unrecorded `GraphView` before execution. +fn footprint_vars(view: GraphView<'_>, scope: &NodeId, op_id: u32) -> Option { + let vars = warp_core::eint_vars_for_op(view, scope, op_id)?; + echo_wasm_abi::codec::decode_from_bytes(vars).ok() +} + +/// Graph facts read through Echo's recording execution view, so every fact an +/// executor's plan reads is part of that execution's observed footprint. +struct ObservedGraph<'view, 'store, 'frame>(RefCell<&'view mut ExecutionGraphView<'store, 'frame>>); + +impl<'view, 'store, 'frame> ObservedGraph<'view, 'store, 'frame> { + fn new(view: &'view mut ExecutionGraphView<'store, 'frame>) -> Self { + Self(RefCell::new(view)) + } +} + +impl GraphFacts for ObservedGraph<'_, '_, '_> { + fn warp_id(&self) -> WarpId { + self.0.borrow().warp_id() + } + + fn node(&self, id: &NodeId) -> Option<&NodeRecord> { + self.0.borrow_mut().node(id) + } + + fn attachment(&self, id: &NodeId) -> Option<&AttachmentValue> { + self.0.borrow_mut().node_attachment(id) + } +} + fn checkpoint_reason(reason: &str) -> crate::error::HostResult { match reason { CHECKPOINT_REASON_MANUAL_SAVE => Ok(CheckpointReason::ManualSave), diff --git a/native/jedit-echo-host/src/generated/contract.rs b/native/jedit-echo-host/src/generated/contract.rs index 08216d4e..a92f4559 100644 --- a/native/jedit-echo-host/src/generated/contract.rs +++ b/native/jedit-echo-host/src/generated/contract.rs @@ -436,7 +436,8 @@ pub mod __echo_wesley_generated { PackEnvelope(echo_wasm_abi::EnvelopeError), } use warp_core::{ - ConflictPolicy, Footprint, GraphView, NodeId, PatternGraph, RewriteRule, TickDelta, + ConflictPolicy, ExecutionGraphView, Footprint, GraphView, NodeId, ObservedExecuteFn, + PatternGraph, RewriteRule, RuleExecutor, }; fn generated_vars_digest(vars_bytes: &[u8]) -> Vec { echo_wasm_abi::query_vars_digest_v1(vars_bytes) @@ -547,10 +548,10 @@ pub mod __echo_wesley_generated { /// Decode this mutation's generated vars from a scheduler-materialized /// EINT runtime ingress event. pub fn declare_checkpoint_contract_vars( - view: GraphView<'_>, + view: &mut ExecutionGraphView<'_, '_>, scope: &NodeId, ) -> Option { - let vars = warp_core::eint_vars_for_op(view, scope, super::OP_DECLARE_CHECKPOINT)?; + let vars = warp_core::observed_eint_vars_for_op(view, scope, super::OP_DECLARE_CHECKPOINT)?; echo_wasm_abi::codec::decode_from_bytes(vars).ok() } /// Base footprint for reading this mutation's runtime ingress event. @@ -566,7 +567,7 @@ pub mod __echo_wesley_generated { /// Build a `warp-core` command rule for this generated contract /// mutation using a host-supplied executor and footprint function. pub fn declare_checkpoint_contract_rule( - executor: for<'a> fn(GraphView<'a>, &NodeId, &mut TickDelta), + executor: ObservedExecuteFn, compute_footprint: for<'a> fn(GraphView<'a>, &NodeId) -> Footprint, ) -> RewriteRule { RewriteRule { @@ -574,7 +575,7 @@ pub mod __echo_wesley_generated { name: OP_DECLARE_CHECKPOINT_CONTRACT_RULE_NAME, left: PatternGraph { nodes: Vec::new() }, matcher: declare_checkpoint_contract_matches, - executor, + executor: RuleExecutor::observed(executor), compute_footprint, factor_mask: 0, conflict_policy: ConflictPolicy::Abort, @@ -872,10 +873,11 @@ pub mod __echo_wesley_generated { /// Decode this mutation's generated vars from a scheduler-materialized /// EINT runtime ingress event. pub fn create_buffer_worldline_contract_vars( - view: GraphView<'_>, + view: &mut ExecutionGraphView<'_, '_>, scope: &NodeId, ) -> Option { - let vars = warp_core::eint_vars_for_op(view, scope, super::OP_CREATE_BUFFER_WORLDLINE)?; + let vars = + warp_core::observed_eint_vars_for_op(view, scope, super::OP_CREATE_BUFFER_WORLDLINE)?; echo_wasm_abi::codec::decode_from_bytes(vars).ok() } /// Base footprint for reading this mutation's runtime ingress event. @@ -891,7 +893,7 @@ pub mod __echo_wesley_generated { /// Build a `warp-core` command rule for this generated contract /// mutation using a host-supplied executor and footprint function. pub fn create_buffer_worldline_contract_rule( - executor: for<'a> fn(GraphView<'a>, &NodeId, &mut TickDelta), + executor: ObservedExecuteFn, compute_footprint: for<'a> fn(GraphView<'a>, &NodeId) -> Footprint, ) -> RewriteRule { RewriteRule { @@ -899,7 +901,7 @@ pub mod __echo_wesley_generated { name: OP_CREATE_BUFFER_WORLDLINE_CONTRACT_RULE_NAME, left: PatternGraph { nodes: Vec::new() }, matcher: create_buffer_worldline_contract_matches, - executor, + executor: RuleExecutor::observed(executor), compute_footprint, factor_mask: 0, conflict_policy: ConflictPolicy::Abort, @@ -1012,10 +1014,11 @@ pub mod __echo_wesley_generated { /// Decode this mutation's generated vars from a scheduler-materialized /// EINT runtime ingress event. pub fn replace_range_as_tick_contract_vars( - view: GraphView<'_>, + view: &mut ExecutionGraphView<'_, '_>, scope: &NodeId, ) -> Option { - let vars = warp_core::eint_vars_for_op(view, scope, super::OP_REPLACE_RANGE_AS_TICK)?; + let vars = + warp_core::observed_eint_vars_for_op(view, scope, super::OP_REPLACE_RANGE_AS_TICK)?; echo_wasm_abi::codec::decode_from_bytes(vars).ok() } /// Base footprint for reading this mutation's runtime ingress event. @@ -1031,7 +1034,7 @@ pub mod __echo_wesley_generated { /// Build a `warp-core` command rule for this generated contract /// mutation using a host-supplied executor and footprint function. pub fn replace_range_as_tick_contract_rule( - executor: for<'a> fn(GraphView<'a>, &NodeId, &mut TickDelta), + executor: ObservedExecuteFn, compute_footprint: for<'a> fn(GraphView<'a>, &NodeId) -> Footprint, ) -> RewriteRule { RewriteRule { @@ -1039,7 +1042,7 @@ pub mod __echo_wesley_generated { name: OP_REPLACE_RANGE_AS_TICK_CONTRACT_RULE_NAME, left: PatternGraph { nodes: Vec::new() }, matcher: replace_range_as_tick_contract_matches, - executor, + executor: RuleExecutor::observed(executor), compute_footprint, factor_mask: 0, conflict_policy: ConflictPolicy::Abort, diff --git a/native/jedit-echo-host/src/host.rs b/native/jedit-echo-host/src/host.rs index a78caa77..c832087d 100644 --- a/native/jedit-echo-host/src/host.rs +++ b/native/jedit-echo-host/src/host.rs @@ -3,8 +3,8 @@ use std::path::Path; use warp_core::{ make_head_id, make_intent_kind, make_node_id, make_type_id, ContractOperationKind, EngineBuilder, GraphStore, InboxPolicy, IngressEnvelope, IngressTarget, - InstalledContractPackage, IntentOutcome, IntentOutcomeReceipt, NodeId, NodeRecord, - ObservationAt, ObservationCoordinate, ObservationFrame, ObservationPayload, + InstalledContractPackage, InstalledInvocationEvidence, IntentOutcome, IntentOutcomeReceipt, + NodeId, NodeRecord, ObservationAt, ObservationCoordinate, ObservationFrame, ObservationPayload, ObservationProjection, ObservationReadBudget, PlaybackMode, SchedulerKind, TrustedRuntimeHost, TrustedRuntimeWalConfig, WorldlineId, WorldlineRuntime, WorldlineState, WriterHead, WriterHeadKey, @@ -368,11 +368,15 @@ impl JeditEchoHost { .observe_intent_outcome(&submission.submission_id) { IntentOutcome::Applied { receipt, .. } => { - let contract = receipt.contract.as_ref().ok_or_else(|| { - HostError::IntentNotApplied( - "receipt lacks installed-package evidence".to_owned(), - ) - })?; + let contract = receipt + .contract + .as_ref() + .and_then(InstalledInvocationEvidence::legacy_contract) + .ok_or_else(|| { + HostError::IntentNotApplied( + "receipt lacks generated-contract package evidence".to_owned(), + ) + })?; if contract.op_id != operation_id || contract.op_kind != ContractOperationKind::Mutation { From e5146d3eae2e1f40fe6b9e529e13197657a7aadc Mon Sep 17 00:00:00 2001 From: James Ross Date: Tue, 20 Oct 2026 10:07:07 -0700 Subject: [PATCH 2/3] build(edict): build ReplaceRange with current Edict and Echo Moves the package chain from Edict 2b4832e and Echo b314f7f to Edict main 2ddc069 and Echo main 0faaf58. - Toolchain lock: new Edict and Echo commits and Echo main's provider identity (new provider digest, manifest, lowerer, and verifier components; target profile and verifier contract unchanged). - edict.lawpack.json: compatibility and conformance-corpus digests follow the regenerated ReplaceRange oracle (host now on Echo main). - vendor/jedit-text republished by Edict main; only the manifest changed, so ReplaceRange.edict imports the new manifest digest. - Build and executable-subject locks written by assert-build-output.mjs --write-locks from the real build; package identity is now sha256:37b51045160d164b520b3c36af7521659fd199f08e09314bd52c312dd825c47d. - The conformance runtime builds against Echo main. Verified with Node 22.23.1 and Rust 1.96.0: tests/build.sh (both runtime witnesses) and all 12 proof-harness regressions pass. --- CHANGELOG.md | 16 +++++++ edict/replace-range/README.md | 6 +-- edict/replace-range/edict.build-lock.json | 42 +++++++++--------- .../edict.executable-subject-lock.json | 8 ++-- edict/replace-range/edict.lawpack.json | 4 +- edict/replace-range/edict.toolchain-lock.json | 12 ++--- edict/replace-range/src/ReplaceRange.edict | 2 +- edict/replace-range/tests/runtime/Cargo.lock | 12 ++--- edict/replace-range/tests/runtime/Cargo.toml | 4 +- .../jedit-text/edict.lawpack-output.json | 4 +- .../vendor/jedit-text/manifest.cbor | Bin 787 -> 787 bytes .../vendor/jedit-text/manifest.sha256 | 2 +- 12 files changed, 64 insertions(+), 48 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 18cb40d2..12a0cb66 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,22 @@ ## Unreleased +- Jim now runs on current Echo and Edict. The native host had been pinned to + Echo `90f63ae` (2026-07-17), 1054 commits behind main, so Jim never exercised + the Echo being built. It now builds against Echo main `0faaf58`, with contract + bindings regenerated by that Echo's `echo-wesley-gen`. Executors read the + graph through Echo's recording `ExecutionGraphView`, so every fact a plan + reads is part of the execution's observed footprint, and receipts carry + `InstalledInvocationEvidence`, of which the host accepts only the generated + contract variant. The ReplaceRange schema, codec vectors, and oracle cases are + byte-identical; only the oracle's source-set digest, which hashes the host's + `Cargo.toml` and `Cargo.lock`, changed. The Edict package chain moves from + Edict `2b4832e` and Echo `b314f7f` to Edict main `2ddc069` and Echo main: the + `jedit.text` lawpack is republished for the new oracle digests, and the + toolchain, build, and executable-subject locks are regenerated from a real + build. The conformance runtime and every proof-harness regression pass on + the new pins. + - CI now runs ShellCheck (`scripts/ci/shellcheck.sh`, in the `quality` job) over every tracked shell script and over the pre-commit and pre-push launchers that `scripts/install-hooks.sh` generates, installed into a throwaway repository. diff --git a/edict/replace-range/README.md b/edict/replace-range/README.md index 79eaaca2..f2a6b56c 100644 --- a/edict/replace-range/README.md +++ b/edict/replace-range/README.md @@ -34,12 +34,12 @@ and five host-resource refusals. It performs no native replacement and links no native rope planner. The package-chain harness runs both the boundary and flat-text targets, and the build closure includes both test sources. -The toolchain pins Edict main `2b4832efe62de75e1f204cec72f9fe7d00ef9551` -and Echo main `b314f7fd071985edad1f9876df383a85fb491205`. The generated +The toolchain pins Edict main `2ddc0692ae894c786e8f37b497719191ad7d4d69` +and Echo main `0faaf58a15a4b03036cf36b465d79af76c952193`. The generated build and executable-subject locks bind the changed source, vendor publication, provider and test closure. Public macOS and Linux builds emit identical package and verifier-report bytes. The package identity is -`sha256:4c2b7859f291e97b6b38fb265086e6cb0581ed030d54d38152b0585152120397`. +`sha256:37b51045160d164b520b3c36af7521659fd199f08e09314bd52c312dd825c47d`. The Docker package-chain gate checks the exact clean Git toolchains, rebuilds through the public CLI, verifies the locks, runs both runtime targets and refuses mutation of authoritative inputs. diff --git a/edict/replace-range/edict.build-lock.json b/edict/replace-range/edict.build-lock.json index 9e9c8f28..be08abb3 100644 --- a/edict/replace-range/edict.build-lock.json +++ b/edict/replace-range/edict.build-lock.json @@ -2,10 +2,10 @@ "schema": "jedit.edict-build-lock/v1", "applicationCoordinate": "jedit.text.replace_range@1", "operationCoordinate": "jedit.text.replace_range@1.replaceRange", - "toolchainLockSha256": "db54615c1294bd128401715630421e49b2633776ace7ede1bfb0c3c198a11d2a", + "toolchainLockSha256": "e4a4433bf7d3e794aea6b76f2a337fc10d19b5ca1247f9750ec915464c891b17", "sourceClosure": { "schema": "jedit.edict-source-closure/v1", - "digest": "sha256:c692181d166000e86e2bc2564e60814435f7ae7202b057fc9e7fb62974fee12b", + "digest": "sha256:b6d49fa83402a2423ff94a7b987536564311d437657a57311904638bdc560d63", "files": [ { "path": "application/edict.application.json", @@ -13,15 +13,15 @@ }, { "path": "application/edict.lawpack.json", - "sha256": "ce13d5993e9b80517538e85bad39ed825ecaf466692063ffd99d17248a68cc66" + "sha256": "849792dee00318bad0d824d131fb07d1d62fcbcaa432763d38d0aea050e02cd1" }, { "path": "application/edict.toolchain-lock.json", - "sha256": "db54615c1294bd128401715630421e49b2633776ace7ede1bfb0c3c198a11d2a" + "sha256": "e4a4433bf7d3e794aea6b76f2a337fc10d19b5ca1247f9750ec915464c891b17" }, { "path": "application/src/ReplaceRange.edict", - "sha256": "61978fd2b7463da772c52a121891523b1669816440a25111af5834d121b86b60" + "sha256": "d8facf1cc053bf3d6211fc221e81373aee612e170f355d1e87dd26245a84fcb4" }, { "path": "application/tests/assert-build-output.mjs", @@ -41,11 +41,11 @@ }, { "path": "application/tests/runtime/Cargo.toml", - "sha256": "17b7943ca35ed8485ce8b6d3660b79486a655604b5098a7c5ee8a98f230f8790" + "sha256": "e2629430b688e86d5cf8c144a330448be404e6d9bafd4a80dd3151c8593ba8dd" }, { "path": "application/tests/runtime/Cargo.lock", - "sha256": "597f102c65285960e80d22277adfa903f67e84fb54ae33ccb2578981e4f7cfb2" + "sha256": "fb1799281b6c2364fdbd11e4a619f9ed732196c4d545cf80f7f43175d3224d66" }, { "path": "application/tests/runtime/compiled_boundary.rs", @@ -61,7 +61,7 @@ }, { "path": "application/vendor/jedit-text/edict.lawpack-output.json", - "sha256": "81a65d2569a3d8513fcefb2de87c816c7364c280205aec42c83f64377f9755f4" + "sha256": "ff7d3a8445db5e6274b384e89c80fd21aa7b4be123f5f4372669a488434579be" }, { "path": "application/vendor/jedit-text/exports.cbor", @@ -73,11 +73,11 @@ }, { "path": "application/vendor/jedit-text/manifest.cbor", - "sha256": "4f05a239948e6e7a7efd08f6b20a9249319769eaeac1e67bd8902206299d71bc" + "sha256": "69e32a6681da65021cff02f62a7f9ba27e065cdb698638dc1dda60796166d1ef" }, { "path": "application/vendor/jedit-text/manifest.sha256", - "sha256": "e0cacb05c16d70f33f2381c5785e906f1763aa555b667b6e52b84f43b709a842" + "sha256": "888c9e652200ebd6c131e55c7aea97cf2e9d0c6dcd96d5dc5021dfd98a3b00bb" }, { "path": "project/.github/workflows/ci.yml", @@ -95,22 +95,22 @@ }, "lawpackRelease": { "coordinate": "jedit.text@1", - "digest": "sha256:f385072314ea57af5b66cad9eb4119b51e456df2050ea0c9a6302c7693212dc1" + "digest": "sha256:c3db3ca3741d1719cb276ca3d16105fc7a22b5bb8bbcbab5e00b580b20da4788" }, "provider": { "coordinate": "echo.edict-provider@1", - "digest": "sha256:cba96816605f54dc5e675ab6f473adf858bdaebdceae985f955e930711c8a4f9" + "digest": "sha256:36ce20c612c8c46bbe450c93e6fb2235f38e4ec2b14f04f128eee91805cdb26a" }, "artifacts": { "core": { "coordinate": "jedit.text.replace_range@1", "domain": "edict.core.module/v1", - "digest": "sha256:f878c563d3e22720366faba02c1c964ecf2fb8250acf346e6454d7cd340068ef" + "digest": "sha256:0ecfafc97a781847089f29aaeef78d2ba9e69c479a450fd3eb2f5712a3757684" }, "targetIr": { "coordinate": "echo.span-ir/v1", "domain": "edict.target-ir.artifact/v1", - "digest": "sha256:4b4049ae9730091d9450a489a22c88519fd8f84c5b74895f07cf86a250afcf86" + "digest": "sha256:bb55f38e2484267c897568ba1bf71b845262d288a00dd1fc50080b07262e967b" }, "resultProjection": { "coordinate": "jedit.text.replace_range@1.replaceRange", @@ -120,25 +120,25 @@ "executablePackage": { "coordinate": "executable-operation-package.echo", "domain": "echo.operation-package/v1", - "digest": "sha256:4c2b7859f291e97b6b38fb265086e6cb0581ed030d54d38152b0585152120397", - "rawSha256": "31ed2bf3121d8ada879e2f1dee15e793a0106cd8c034beaad4dd3c4995e9629a" + "digest": "sha256:37b51045160d164b520b3c36af7521659fd199f08e09314bd52c312dd825c47d", + "rawSha256": "897ecb5fca894e70a633fec95686b2a27d8ceb5760bf61b8634625199374f93d" }, "verificationReportArtifact": { "coordinate": "verifier-report.echo-operation", "domain": "echo.operation-package-verifier-report/v1", - "digest": "sha256:fc4452e6aa91f541641cf4c070317ec7f24b05b48aeb1c6d8911a7f20a547c04", - "rawSha256": "3dab6a7de887acb0422a881c58130932819d16ecf8577a503d33031036732c86" + "digest": "sha256:891914e52c17dfab9120ba8c4ee794ba776cd6e0380cdde35aa1f7d42d0598ec", + "rawSha256": "83add48f7dda80985b72845055099f529e440fd536695c3be5cbc74d275fbe77" }, "verificationReport": { "coordinate": "jedit.edict-verification-evidence/v1", "domain": "jedit.edict-verification-evidence/v1", - "digest": "sha256:4005c65e03fdc960883fff68b2eea292cb1a50bd78d95eb4ced41b0d03bf471d", - "rawSha256": "70e100bfd97fc2c09ac45582b01297dddace8cf07b67c79ae5a205d7b3f0b906" + "digest": "sha256:10ea17f73a0c4c58074a88973598d581fdd4c3e3bf70c6d5ed582de528ceff3c", + "rawSha256": "e46c2125acf0383f59c3d0914efe8ac99b715c7abbd2c20281c86d118bbb956e" }, "executableSubject": { "coordinate": "echo.executable-subject/v1", "domain": "echo.executable-subject/v1", - "digest": "sha256:ea65a7bfa2055644c99783ef5097bdaa84c03245866f20126816b4c33f75d8cf" + "digest": "sha256:31b437e8e2504bd38c42354be26fe3f10092acb6d3053eb00aead2c1bba8531e" } } } diff --git a/edict/replace-range/edict.executable-subject-lock.json b/edict/replace-range/edict.executable-subject-lock.json index 0c84e5bb..67b382a5 100644 --- a/edict/replace-range/edict.executable-subject-lock.json +++ b/edict/replace-range/edict.executable-subject-lock.json @@ -2,16 +2,16 @@ "schema": "jedit.edict-executable-subject-lock/v1", "reference": { "coordinate": "echo.executable-subject/v1", - "digest": "sha256:ea65a7bfa2055644c99783ef5097bdaa84c03245866f20126816b4c33f75d8cf" + "digest": "sha256:31b437e8e2504bd38c42354be26fe3f10092acb6d3053eb00aead2c1bba8531e" }, - "rawSha256": "7d08ef912c7f294c949abddf255423b3f7145d2accf64794dec5acf225e85cf7", + "rawSha256": "35ba08f56b4efa8ac03ee292a2cdfbc604b024c9d3805c839d4190f8c9e628ae", "package": { "coordinate": "executable-operation-package.echo", - "digest": "sha256:4c2b7859f291e97b6b38fb265086e6cb0581ed030d54d38152b0585152120397" + "digest": "sha256:37b51045160d164b520b3c36af7521659fd199f08e09314bd52c312dd825c47d" }, "targetIr": { "coordinate": "echo.span-ir/v1", - "digest": "sha256:4b4049ae9730091d9450a489a22c88519fd8f84c5b74895f07cf86a250afcf86" + "digest": "sha256:bb55f38e2484267c897568ba1bf71b845262d288a00dd1fc50080b07262e967b" }, "resultProjection": { "coordinate": "jedit.text.replace_range@1.replaceRange", diff --git a/edict/replace-range/edict.lawpack.json b/edict/replace-range/edict.lawpack.json index 8db4e6ea..4f9cd6de 100644 --- a/edict/replace-range/edict.lawpack.json +++ b/edict/replace-range/edict.lawpack.json @@ -186,11 +186,11 @@ }, "compatibility": { "id": "jedit.text.compatibility/v1", - "digest": "sha256:2adf83f798205f52636ad64ca45178f33a8e1cc663874f8a6113484c945e3052" + "digest": "sha256:1628a34afa7f709e159b373198fc3e632f7ea2c1fb694b63a1f4fde1c6c1509e" }, "conformanceFixtureCorpus": { "id": "jedit.text.ReplaceRange.oracle@1", - "digest": "sha256:b9b4707dd5e07897cbe7af36d88928401887e6af5d167d1a88a8d6181b4dbb0e" + "digest": "sha256:7c38a873435d7dd8d785a121ed64ff17fbbdc6875ec20b49c460f538843548dc" }, "localResources": [ { diff --git a/edict/replace-range/edict.toolchain-lock.json b/edict/replace-range/edict.toolchain-lock.json index 7b446c76..b8e81020 100644 --- a/edict/replace-range/edict.toolchain-lock.json +++ b/edict/replace-range/edict.toolchain-lock.json @@ -29,26 +29,26 @@ ] }, "edict": { - "commit": "2b4832efe62de75e1f204cec72f9fe7d00ef9551", + "commit": "2ddc0692ae894c786e8f37b497719191ad7d4d69", "cliVersion": "0.11.0-alpha.1" }, "echo": { - "commit": "b314f7fd071985edad1f9876df383a85fb491205", + "commit": "0faaf58a15a4b03036cf36b465d79af76c952193", "provider": { "coordinate": "echo.edict-provider@1", - "digest": "sha256:cba96816605f54dc5e675ab6f473adf858bdaebdceae985f955e930711c8a4f9", - "manifestSha256": "d9ec3c528d0b27434606ecef27a552eb466034866cbb3cb04d169241f772a6df", + "digest": "sha256:36ce20c612c8c46bbe450c93e6fb2235f38e4ec2b14f04f128eee91805cdb26a", + "manifestSha256": "8bb6c675598fc457513a953c2aee65316f80315583df418a5ef96788321cd649", "targetProfile": { "coordinate": "echo.dpo@1", "digest": "sha256:2e2494121aecf5e6a2d920f5fb85408825d394765fad41484c416397c920fb04" }, "lowerer": { "coordinate": "echo.dpo.lowerer/component@1", - "sha256": "79066cfc740da4463fd20baec36fe18c6cfb346917fed475b4ef7119fda9408a" + "sha256": "cd81874f971f290f74987b39479ef89ddb5060e56df54044d2359e6e89b2430c" }, "verifier": { "coordinate": "echo.dpo.verifier/component@1", - "sha256": "577c69937594c0aff2461dd60d43507e1f6ce0903ca2b17ff02919d73efd9b28", + "sha256": "3451e95a7d084d4874c30833f90f5c21012e8341f35ed0f0888d4d268a768b11", "contract": { "coordinate": "echo.dpo.verifier/v1", "digest": "sha256:ca96b190728de3d668072ec1bd37d24e5197e7bd9bd54f70966d8c566b9b67f2" diff --git a/edict/replace-range/src/ReplaceRange.edict b/edict/replace-range/src/ReplaceRange.edict index 565bd877..d487ae1d 100644 --- a/edict/replace-range/src/ReplaceRange.edict +++ b/edict/replace-range/src/ReplaceRange.edict @@ -1,6 +1,6 @@ package jedit.text.replace_range@1; -use lawpack jedit.text@1 digest "sha256:f385072314ea57af5b66cad9eb4119b51e456df2050ea0c9a6302c7693212dc1" as text; +use lawpack jedit.text@1 digest "sha256:c3db3ca3741d1719cb276ca3d16105fc7a22b5bb8bbcbab5e00b580b20da4788" as text; type ReplaceRangeInput = { bufferId: text.BufferId, diff --git a/edict/replace-range/tests/runtime/Cargo.lock b/edict/replace-range/tests/runtime/Cargo.lock index 8025a9d4..5567ec87 100644 --- a/edict/replace-range/tests/runtime/Cargo.lock +++ b/edict/replace-range/tests/runtime/Cargo.lock @@ -218,7 +218,7 @@ dependencies = [ [[package]] name = "echo-edict-canonical" version = "0.1.0" -source = "git+https://github.com/flyingrobots/echo?rev=b314f7fd071985edad1f9876df383a85fb491205#b314f7fd071985edad1f9876df383a85fb491205" +source = "git+https://github.com/flyingrobots/echo?rev=0faaf58a15a4b03036cf36b465d79af76c952193#0faaf58a15a4b03036cf36b465d79af76c952193" dependencies = [ "hex", "sha2", @@ -227,17 +227,17 @@ dependencies = [ [[package]] name = "echo-registry-api" version = "0.1.0" -source = "git+https://github.com/flyingrobots/echo?rev=b314f7fd071985edad1f9876df383a85fb491205#b314f7fd071985edad1f9876df383a85fb491205" +source = "git+https://github.com/flyingrobots/echo?rev=0faaf58a15a4b03036cf36b465d79af76c952193#0faaf58a15a4b03036cf36b465d79af76c952193" [[package]] name = "echo-runtime-schema" version = "0.1.0" -source = "git+https://github.com/flyingrobots/echo?rev=b314f7fd071985edad1f9876df383a85fb491205#b314f7fd071985edad1f9876df383a85fb491205" +source = "git+https://github.com/flyingrobots/echo?rev=0faaf58a15a4b03036cf36b465d79af76c952193#0faaf58a15a4b03036cf36b465d79af76c952193" [[package]] name = "echo-wasm-abi" version = "0.1.0" -source = "git+https://github.com/flyingrobots/echo?rev=b314f7fd071985edad1f9876df383a85fb491205#b314f7fd071985edad1f9876df383a85fb491205" +source = "git+https://github.com/flyingrobots/echo?rev=0faaf58a15a4b03036cf36b465d79af76c952193#0faaf58a15a4b03036cf36b465d79af76c952193" dependencies = [ "blake3", "ciborium", @@ -573,7 +573,7 @@ checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" [[package]] name = "warp-core" version = "0.1.1" -source = "git+https://github.com/flyingrobots/echo?rev=b314f7fd071985edad1f9876df383a85fb491205#b314f7fd071985edad1f9876df383a85fb491205" +source = "git+https://github.com/flyingrobots/echo?rev=0faaf58a15a4b03036cf36b465d79af76c952193#0faaf58a15a4b03036cf36b465d79af76c952193" dependencies = [ "blake3", "bytemuck", @@ -594,7 +594,7 @@ dependencies = [ [[package]] name = "warp-math" version = "0.1.0" -source = "git+https://github.com/flyingrobots/echo?rev=b314f7fd071985edad1f9876df383a85fb491205#b314f7fd071985edad1f9876df383a85fb491205" +source = "git+https://github.com/flyingrobots/echo?rev=0faaf58a15a4b03036cf36b465d79af76c952193#0faaf58a15a4b03036cf36b465d79af76c952193" dependencies = [ "bunny-num", "libm", diff --git a/edict/replace-range/tests/runtime/Cargo.toml b/edict/replace-range/tests/runtime/Cargo.toml index 4ae0432f..a78b7066 100644 --- a/edict/replace-range/tests/runtime/Cargo.toml +++ b/edict/replace-range/tests/runtime/Cargo.toml @@ -8,8 +8,8 @@ publish = false [workspace] [dev-dependencies] -echo-edict-canonical = { git = "https://github.com/flyingrobots/echo", rev = "b314f7fd071985edad1f9876df383a85fb491205" } -warp-core = { git = "https://github.com/flyingrobots/echo", rev = "b314f7fd071985edad1f9876df383a85fb491205", features = ["trusted_runtime"] } +echo-edict-canonical = { git = "https://github.com/flyingrobots/echo", rev = "0faaf58a15a4b03036cf36b465d79af76c952193" } +warp-core = { git = "https://github.com/flyingrobots/echo", rev = "0faaf58a15a4b03036cf36b465d79af76c952193", features = ["trusted_runtime"] } [[test]] name = "compiled_boundary" diff --git a/edict/replace-range/vendor/jedit-text/edict.lawpack-output.json b/edict/replace-range/vendor/jedit-text/edict.lawpack-output.json index 97825429..7748d1eb 100644 --- a/edict/replace-range/vendor/jedit-text/edict.lawpack-output.json +++ b/edict/replace-range/vendor/jedit-text/edict.lawpack-output.json @@ -7,13 +7,13 @@ "path": "manifest.cbor", "kind": "manifest", "coordinate": "edict.lawpack/v1", - "digest": "sha256:f385072314ea57af5b66cad9eb4119b51e456df2050ea0c9a6302c7693212dc1" + "digest": "sha256:c3db3ca3741d1719cb276ca3d16105fc7a22b5bb8bbcbab5e00b580b20da4788" }, { "path": "manifest.sha256", "kind": "manifestDigest", "coordinate": "edict.lawpack/v1", - "digest": "sha256:f385072314ea57af5b66cad9eb4119b51e456df2050ea0c9a6302c7693212dc1" + "digest": "sha256:c3db3ca3741d1719cb276ca3d16105fc7a22b5bb8bbcbab5e00b580b20da4788" }, { "path": "exports.cbor", diff --git a/edict/replace-range/vendor/jedit-text/manifest.cbor b/edict/replace-range/vendor/jedit-text/manifest.cbor index 0e9e2ef1aefa4cd597191231732725a1ddfc6e01..d8da62bc98d99aa8a21914e96a1cde7d591ae00a 100644 GIT binary patch delta 78 zcmV-U0I~m*29pM`O#vVlD5FaHe{h}^n>R6-{61qZexkwqX-i|F^!?$+!BC#FZ2^V> kAbdEeb3 kAi1<~ebwN2m&@m`HrR8i=UY7#mHy4lr0ENB{r; diff --git a/edict/replace-range/vendor/jedit-text/manifest.sha256 b/edict/replace-range/vendor/jedit-text/manifest.sha256 index 3b2b10e7..73cff4fb 100644 --- a/edict/replace-range/vendor/jedit-text/manifest.sha256 +++ b/edict/replace-range/vendor/jedit-text/manifest.sha256 @@ -1 +1 @@ -sha256:f385072314ea57af5b66cad9eb4119b51e456df2050ea0c9a6302c7693212dc1 +sha256:c3db3ca3741d1719cb276ca3d16105fc7a22b5bb8bbcbab5e00b580b20da4788 From 5075ec7274f4b72baddbd2467e7a1a42b6cd8ec9 Mon Sep 17 00:00:00 2001 From: James Ross Date: Tue, 20 Oct 2026 15:00:33 -0700 Subject: [PATCH 3/3] docs: describe the oracle source set completely The source-set digest covers every path the oracle declares, not only the host's Cargo.toml and Cargo.lock. --- CHANGELOG.md | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 3d7b3e05..bb241f22 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -10,8 +10,9 @@ reads is part of the execution's observed footprint, and receipts carry `InstalledInvocationEvidence`, of which the host accepts only the generated contract variant. The ReplaceRange schema, codec vectors, and oracle cases are - byte-identical; only the oracle's source-set digest, which hashes the host's - `Cargo.toml` and `Cargo.lock`, changed. The Edict package chain moves from + byte-identical; only the oracle's source-set digest and its sidecar changed. + That digest covers every path the oracle's `sourceSet` declares, including the + host's `Cargo.toml` and `Cargo.lock`. The Edict package chain moves from Edict `2b4832e` and Echo `b314f7f` to Edict main `2ddc069` and Echo main: the `jedit.text` lawpack is republished for the new oracle digests, and the toolchain, build, and executable-subject locks are regenerated from a real