diff --git a/CHANGELOG.md b/CHANGELOG.md index 68a3a3b9..22b9417c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -17,8 +17,9 @@ recovered work while constructing one singleton Tick. Publication follows only after the decided-Tick WAL commit. A second fresh filesystem host recovers the package, Action, Tick, state, typed outcome, and Receipt. - Repeating creation yields the typed precondition obstruction with no hidden - mutation, while a changed initial state produces the typed + Repeating creation yields the package-declared, lawpack-qualified typed + obstruction with no hidden mutation, while a changed initial state produces + the typed `echo-operation-execution-mismatch/action-basis` recovery refusal. Admission binds the accepted verification report's Target IR to the package semantic closure, selects target configuration only from the package-supported target @@ -49,12 +50,12 @@ coordinate-framed exports and adapter references independently from their provider-envelope domains. Its lowerer and verifier components were independently reproduced in copy-only, mount-free designated `linux/amd64` - containers and promoted at 230,297 bytes / - `f800df20b95c5a3dbb7682d3dbe545ac0fde29ad67430ab7038954a08b54047b` - and 247,766 bytes / - `edbef0fee8bb8b661b457674ce4d7eeb75e842f39eb823ae121ddb412ad20a56`, + containers and promoted at 230,875 bytes / + `08277d4ba7d98e0b143c06c208abc306f133bda510caa5393da08aa490334a6e` + and 248,221 bytes / + `744a511137608634b88abf7bd7e61da9bf81a5cacff7b190fc2530c346ba36cc`, respectively. The resulting 25-file package has provider identity - `sha256:d8d433725fbece1ba657cd456720c1b788344f9034b1735ab99cf209d835038a`. + `sha256:a7ab6bfbbedc3a6b61a8559dc6506cfc3d2836b46dac3cc825e5b05b16b94fa5`. This package build proves generic compiler/provider lowering and independent verification. The separate `run-edict-operation` witness now consumes that crossing through Echo-owned runtime execution. @@ -1517,6 +1518,12 @@ Applied, Rejected, Obstructed}` with receipt evidence and typed contract ### Fixed +- Generic executable-operation lowering and independent verification now + resolve source-local obstruction constructor aliases through the exact + digest-locked lawpack import before encoding or comparing the package. + Runtime duplicate outcomes therefore retain the capability-owned obstruction + coordinate instead of exposing an application-local alias or collapsing it + into the generic precondition-mismatch class. - Provider-native installation now applies the same pure structural validation used to reconstruct retained invocation evidence before mutating any Echo engine index. Empty operation or Target IR coordinates, empty Target IR diff --git a/README.md b/README.md index ca069e9c..2869d771 100644 --- a/README.md +++ b/README.md @@ -186,7 +186,10 @@ result, composition, and terminal outcome. Runtime-control installation and scheduler Tick records permit callback-free fresh-host recovery. Program bytes explicitly bind the interpreter and intrinsic profiles, while Tick evidence binds each admitted installation. A program digest cannot confer operation -identity, invocability, or authority. +identity, invocability, or authority. Each package also retains the canonical +lawpack obstruction coordinate resolved from the authored source-local import; +the scheduler reports that exact typed coordinate without interpreting +application vocabulary. That generic runtime witness is not yet the Jim/Jedit vertical. A standalone application-owned Edict operation now crosses it through a compiler-produced @@ -270,9 +273,9 @@ conflicting or obstructed Actions retain typed outcomes without hidden mutation. A standalone application-owned Edict create-if-absent operation now crosses this route as an exact compiler-produced package and independently accepted verification report through `cargo xtask run-edict-operation`. That -witness is one Action in one Tick; it does not claim external multi-Action Tick -composition, a product-ready application runner, a Jedit operation, or a Graft -operation. +witness proves its package-declared typed obstruction and one Action in one +Tick; it does not claim external multi-Action Tick composition, a product-ready +application runner, a Jedit operation, or a Graft operation. ## Contracts And Boundaries diff --git a/crates/echo-edict-provider-lowerer/README.md b/crates/echo-edict-provider-lowerer/README.md index 1171fa88..b2e0461f 100644 --- a/crates/echo-edict-provider-lowerer/README.md +++ b/crates/echo-edict-provider-lowerer/README.md @@ -45,7 +45,10 @@ exact digest-bound source, Core, lawpack, lawpack-exports, target-adapter, target-configuration, and Target IR artifacts. It derives the operation coordinate from the authored Core package and intent, validates the complete portable capability closure, and emits canonical `echo.operation-package/v1` -bytes for Echo's bounded anchored create-if-absent profile. Application +bytes for Echo's bounded anchored create-if-absent profile. Both the effect and +obstruction coordinates are resolved from source-local aliases through the +exact digest-locked lawpack import, so the package retains stable +lawpack-qualified identities. Application coordinates, intent names, effect names, failure names, type profiles, and authority profiles remain opaque artifact data; production lowering contains no application-specific dispatch or native callback. @@ -111,8 +114,8 @@ proposal constructor supports mutations and refuses a `Query`; authored reads remain a separate bounded observer/optic path and must never be represented as synthetic mutations. -The refreshed 230,285-byte checked lowerer component has SHA-256 -`9575ca8c843f3dfe4e5550ecdc40a8a8584c1aa7012b5b6f6a76e3f05f1b68f3` and has +The refreshed 230,875-byte checked lowerer component has SHA-256 +`08277d4ba7d98e0b143c06c208abc306f133bda510caa5393da08aa490334a6e` and has crossed the reproducible promotion boundary. The pinned Edict host admits its generated envelope under the owning `generated-artifact` CDDL root, and the isolated host fixture exercises the exact helper binding, typed codecs, EINT diff --git a/crates/echo-edict-provider-lowerer/src/executable_operation.rs b/crates/echo-edict-provider-lowerer/src/executable_operation.rs index 5c6d1dcf..eb75cd23 100644 --- a/crates/echo-edict-provider-lowerer/src/executable_operation.rs +++ b/crates/echo-edict-provider-lowerer/src/executable_operation.rs @@ -65,6 +65,7 @@ struct ProgramConfiguration<'a> { struct ApplicationIntent<'a> { name: &'a str, operation_coordinate: String, + obstruction_coordinate: &'a str, effect_coordinate: &'a str, failure_name: &'a str, } @@ -100,7 +101,9 @@ pub(super) fn lower(request: &LoweringRequestV1) -> Result Result( return Err(super::unsupported_semantics(coordinate)); } let effect_coordinate = required_text(node, "effect", coordinate)?; - let (failure_name, _) = + let (failure_name, obstruction_arm) = single_text_map_entry(required_map(node, "obstructionMap", coordinate)?) .ok_or_else(|| super::unsupported_semantics(coordinate))?; + let obstruction_value = required_map(obstruction_arm, "value", coordinate)?; + let obstruction_coordinate = required_text(obstruction_value, "callee", coordinate)?; + if obstruction_coordinate.is_empty() { + return Err(super::unsupported_semantics(coordinate)); + } Ok(ApplicationIntent { name: intent_name, operation_coordinate: format!("{coordinate}.{intent_name}"), + obstruction_coordinate, effect_coordinate, failure_name, }) @@ -369,7 +384,7 @@ fn validate_adapter( Ok(()) } -fn semantic_effect_coordinate( +fn semantic_lawpack_member_coordinate( source: &str, lawpack: &SemanticInput, core_effect: &str, @@ -553,6 +568,7 @@ fn encode_package( request: &LoweringRequestV1, closure: &ClosureInputs<'_>, intent: &ApplicationIntent<'_>, + obstruction_coordinate: &str, configuration: ProgramConfiguration<'_>, ) -> Result, ProviderRefusalV1> { let program = canonical_map([ @@ -670,6 +686,10 @@ fn encode_package( "obstruction_interpretation_identity", hash_value(profile_digest(OBSTRUCTION_INTERPRETATION)), ), + ( + "obstruction_coordinate", + canonical_text(obstruction_coordinate), + ), ( "operation_coordinate", canonical_text(&intent.operation_coordinate), diff --git a/crates/echo-edict-provider-lowerer/src/lib.rs b/crates/echo-edict-provider-lowerer/src/lib.rs index ded7e022..c801cf14 100644 --- a/crates/echo-edict-provider-lowerer/src/lib.rs +++ b/crates/echo-edict-provider-lowerer/src/lib.rs @@ -809,7 +809,7 @@ pub mod echo_dpo { pub const PROVIDER_SCHEMA_COORDINATE: &str = "echo.provider-artifacts.cddl@1"; /// Raw SHA-256 of the exact self-contained provider CDDL bytes. pub const PROVIDER_SCHEMA_SHA256_HEX: &str = - "c604b7bf9e20db02dac9c010a01470d711335953cb31e6a603fb1e9cb818e8fa"; + "6b9076ae02730797fddf60a93606df3de245a1c6bfbd845486799b7310d002a2"; /// Exact generated-artifact profile coordinate owning operation schemas. pub const GENERATED_ARTIFACT_PROFILE: &str = "echo.dpo.registration/v1"; /// Digest-framing domain for the generated-artifact profile. @@ -846,7 +846,7 @@ pub mod echo_dpo { const MUTATION_RULE_NAME: &str = concat!( "cmd/contract/", - "c604b7bf9e20db02dac9c010a01470d711335953cb31e6a603fb1e9cb818e8fa", + "6b9076ae02730797fddf60a93606df3de245a1c6bfbd845486799b7310d002a2", "/3389142194/a.b@1.t" ); const PROVIDER_OPERATIONS: [ProviderOperationV1<'static>; 1] = [ProviderOperationV1 { diff --git a/crates/echo-edict-provider-lowerer/tests/executable_operation_package.rs b/crates/echo-edict-provider-lowerer/tests/executable_operation_package.rs index 3ad3e2ca..6e967027 100644 --- a/crates/echo-edict-provider-lowerer/tests/executable_operation_package.rs +++ b/crates/echo-edict-provider-lowerer/tests/executable_operation_package.rs @@ -107,6 +107,14 @@ fn one_provider_binary_lowers_two_unrelated_application_vocabularies() { text_field(&beta_decoded, "operation_coordinate"), Some("notes.beta@7.createNote") ); + assert_eq!( + text_field(&alpha_decoded, "obstruction_coordinate"), + Some(ALPHA.obstruction) + ); + assert_eq!( + text_field(&beta_decoded, "obstruction_coordinate"), + Some(BETA.obstruction) + ); } #[test] @@ -272,7 +280,21 @@ fn core(names: FixtureNames<'_>) -> CanonicalValueV1 { "obstructionMap", dynamic_map([( names.failure, - owned_map([("callee", text(names.obstruction))]), + owned_map([( + "value", + owned_map([( + "callee", + text(format!( + "{}.{}", + names.alias, + names + .obstruction + .rsplit_once('.') + .expect("fixture obstruction has a member",) + .1 + )), + )]), + )]), )]), ), ])]), @@ -472,6 +494,7 @@ fn expected_package( let core_identity = hash(&request.core.reference.digest); ExecutableOperationPackageV1::new( format!("{}.{}", names.application, names.intent), + names.obstruction, EchoOperationSemanticClosureV1::new( hash(&source.reference.digest), core_identity, diff --git a/crates/echo-edict-provider-lowerer/tests/fixtures/generated_echo_dpo.rs b/crates/echo-edict-provider-lowerer/tests/fixtures/generated_echo_dpo.rs index ca57b2a5..840ad5fd 100644 --- a/crates/echo-edict-provider-lowerer/tests/fixtures/generated_echo_dpo.rs +++ b/crates/echo-edict-provider-lowerer/tests/fixtures/generated_echo_dpo.rs @@ -71,7 +71,7 @@ pub mod echo_dpo { pub const PROVIDER_SCHEMA_COORDINATE: &str = "echo.provider-artifacts.cddl@1"; /// Raw SHA-256 of the exact self-contained provider CDDL bytes. pub const PROVIDER_SCHEMA_SHA256_HEX: &str = - "c604b7bf9e20db02dac9c010a01470d711335953cb31e6a603fb1e9cb818e8fa"; + "6b9076ae02730797fddf60a93606df3de245a1c6bfbd845486799b7310d002a2"; /// Exact generated-artifact profile coordinate owning operation schemas. pub const GENERATED_ARTIFACT_PROFILE: &str = "echo.dpo.registration/v1"; /// Digest-framing domain for the generated-artifact profile. @@ -108,7 +108,7 @@ pub mod echo_dpo { const MUTATION_RULE_NAME: &str = concat!( "cmd/contract/", - "c604b7bf9e20db02dac9c010a01470d711335953cb31e6a603fb1e9cb818e8fa", + "6b9076ae02730797fddf60a93606df3de245a1c6bfbd845486799b7310d002a2", "/3389142194/a.b@1.t" ); const PROVIDER_OPERATIONS: [ProviderOperationV1<'static>; 1] = [ProviderOperationV1 { diff --git a/crates/echo-edict-provider-lowerer/tests/lowerer_contract.rs b/crates/echo-edict-provider-lowerer/tests/lowerer_contract.rs index e8b6f640..fffb1f42 100644 --- a/crates/echo-edict-provider-lowerer/tests/lowerer_contract.rs +++ b/crates/echo-edict-provider-lowerer/tests/lowerer_contract.rs @@ -45,7 +45,7 @@ const REVIEW_MEDIA_TYPE: &str = "application/json"; const GENERATED_SOURCE_PATH: &str = "generated/echo_dpo.rs"; const REVIEW_PATH: &str = "review/echo_dpo.json"; const EXPECTED_PROVIDER_SCHEMA_SHA256_HEX: &str = - "c604b7bf9e20db02dac9c010a01470d711335953cb31e6a603fb1e9cb818e8fa"; + "6b9076ae02730797fddf60a93606df3de245a1c6bfbd845486799b7310d002a2"; const EXPECTED_OPERATION_ID_LAW: &str = "echo.semantic-operation-id.fnv1-32/v1"; const EXPECTED_OPERATION_ID: u32 = 3_389_142_194; diff --git a/crates/echo-edict-provider-verifier/README.md b/crates/echo-edict-provider-verifier/README.md index d7408542..33aceab4 100644 --- a/crates/echo-edict-provider-verifier/README.md +++ b/crates/echo-edict-provider-verifier/README.md @@ -26,14 +26,16 @@ configuration, Target IR, and compiler-emitted package as digest-bound inputs, then reconstructs the expected generic package without importing or calling the lowerer. Exact equality yields an accepted `echo.operation-package-verifier-report/v1`; a rebound or otherwise -self-consistent package mutation yields a typed rejected report. Application +self-consistent package mutation yields a typed rejected report. The verifier +independently resolves source-local effect and obstruction aliases through the +exact lawpack import before comparing the canonical package. Application vocabulary is treated only as opaque authored data. The `wasm32` guest adapter vendors Edict's exact frozen `edict:target-provider/verifier@1.0.0` WIT world and performs only exhaustive -transport-to-model conversion. Its reproducibly built 247,754-byte checked +transport-to-model conversion. Its reproducibly built 248,221-byte checked component has SHA-256 -`d87f3df6cdeca0b14032a23b614e9b9ba1f53ea3955a5a0aebda6c61450c3e51`. +`744a511137608634b88abf7bd7e61da9bf81a5cacff7b190fc2530c346ba36cc`. Component identity and admitted host replay remain separate propositions: the pinned Edict host preflights the request artifacts and declared output schema, invokes the checked component, then admits and manifests each returned accepted diff --git a/crates/echo-edict-provider-verifier/src/executable_operation.rs b/crates/echo-edict-provider-verifier/src/executable_operation.rs index ef1a2e2f..7caa9763 100644 --- a/crates/echo-edict-provider-verifier/src/executable_operation.rs +++ b/crates/echo-edict-provider-verifier/src/executable_operation.rs @@ -69,6 +69,7 @@ struct ProgramConfiguration<'a> { struct ApplicationIntent<'a> { name: &'a str, operation_coordinate: String, + obstruction_coordinate: &'a str, effect_coordinate: &'a str, failure_name: &'a str, } @@ -111,7 +112,9 @@ pub(super) fn verify( let source = validate_source(&source, closure.source, &request.core)?; let semantic_effect = - semantic_effect_coordinate(source, closure.lawpack, intent.effect_coordinate)?; + semantic_lawpack_member_coordinate(source, closure.lawpack, intent.effect_coordinate)?; + let semantic_obstruction = + semantic_lawpack_member_coordinate(source, closure.lawpack, intent.obstruction_coordinate)?; validate_exports(&exports, &intent, &semantic_effect)?; validate_lawpack( &lawpack, @@ -125,7 +128,13 @@ pub(super) fn verify( validate_adapter(&adapter, closure.configuration, &intent, &semantic_effect)?; validate_target_ir(&target_ir, request, closure.lawpack, &intent)?; let configuration = validate_configuration(&configuration)?; - let expected = encode_expected_package(request, &closure, &intent, configuration)?; + let expected = encode_expected_package( + request, + &closure, + &intent, + &semantic_obstruction, + configuration, + )?; let actual = encode_canonical_cbor_v1(&package) .map_err(|_| invalid_artifact(PACKAGE_COORDINATE, "package could not be re-encoded"))?; @@ -276,12 +285,18 @@ fn validate_core<'a>( return Err(super::unsupported_semantics(coordinate)); } let effect_coordinate = required_text(node, "effect", coordinate)?; - let (failure_name, _) = + let (failure_name, obstruction_arm) = single_text_map_entry(required_map(node, "obstructionMap", coordinate)?) .ok_or_else(|| super::unsupported_semantics(coordinate))?; + let obstruction_value = required_map(obstruction_arm, "value", coordinate)?; + let obstruction_coordinate = required_text(obstruction_value, "callee", coordinate)?; + if obstruction_coordinate.is_empty() { + return Err(super::unsupported_semantics(coordinate)); + } Ok(ApplicationIntent { name: intent_name, operation_coordinate: format!("{coordinate}.{intent_name}"), + obstruction_coordinate, effect_coordinate, failure_name, }) @@ -406,7 +421,7 @@ fn validate_adapter( Ok(()) } -fn semantic_effect_coordinate( +fn semantic_lawpack_member_coordinate( source: &str, lawpack: &SemanticInput, core_effect: &str, @@ -589,6 +604,7 @@ fn encode_expected_package( request: &VerificationRequestV1, closure: &ClosureInputs<'_>, intent: &ApplicationIntent<'_>, + obstruction_coordinate: &str, configuration: ProgramConfiguration<'_>, ) -> Result, ProviderRefusalV1> { let program = canonical_map([ @@ -703,6 +719,10 @@ fn encode_expected_package( "obstruction_interpretation_identity", hash_value(profile_digest(OBSTRUCTION_INTERPRETATION)), ), + ( + "obstruction_coordinate", + canonical_text(obstruction_coordinate), + ), ( "operation_coordinate", canonical_text(&intent.operation_coordinate), diff --git a/crates/echo-edict-provider-verifier/tests/executable_operation_package.rs b/crates/echo-edict-provider-verifier/tests/executable_operation_package.rs index 3ee764fa..f74fb156 100644 --- a/crates/echo-edict-provider-verifier/tests/executable_operation_package.rs +++ b/crates/echo-edict-provider-verifier/tests/executable_operation_package.rs @@ -93,6 +93,12 @@ fn verifier_accepts_generic_lowerer_output_for_two_application_vocabularies() { for names in FIXTURES { let fixture = raw_fixture(names); let package = lower_package(names, &fixture); + let package_value = + decode_canonical_cbor_v1(&package).expect("the lowered package is canonical"); + assert_eq!( + text_field(&package_value, "obstruction_coordinate"), + Some(names.obstruction) + ); let verified = verifier::verify(verification_request(names, &fixture, package)) .expect("the independent verifier completes"); @@ -137,6 +143,30 @@ fn verifier_rejects_a_canonical_package_with_a_rebound_operation_coordinate() { assert_eq!(text_field(&report, "outcome"), Some("rejected")); } +#[test] +fn verifier_rejects_a_canonical_package_with_a_rebound_obstruction_coordinate() { + let names = FIXTURES[0]; + let fixture = raw_fixture(names); + let package = lower_package(names, &fixture); + let mut package_value = + decode_canonical_cbor_v1(&package).expect("the lowered package is canonical"); + *map_field_mut(&mut package_value, "obstruction_coordinate") = + text("forged.domain@9.NotTheAuthoredObstruction"); + let package = encode_canonical_cbor_v1(&package_value).expect("the mutation remains canonical"); + + let verified = verifier::verify(verification_request(names, &fixture, package)) + .expect("semantic mismatch is a completed verification"); + + assert_eq!(verified.diagnostics.len(), 1); + assert_eq!( + verified.diagnostics[0].code, + "echo.verifier.executable-operation-package-mismatch" + ); + let report = decode_canonical_cbor_v1(&verified.outputs[0].artifact.bytes) + .expect("the rejection report is canonical"); + assert_eq!(text_field(&report, "outcome"), Some("rejected")); +} + fn lower_package(names: FixtureNames<'_>, fixture: &RawFixture) -> Vec { let success = lowerer::lower(lowering_request(names, fixture)).expect("the generic lowerer completes"); @@ -367,7 +397,21 @@ fn core(names: FixtureNames<'_>) -> CanonicalValueV1 { "obstructionMap", dynamic_map([( names.failure, - map([("callee", text(names.obstruction))]), + map([( + "value", + map([( + "callee", + text(format!( + "{}.{}", + names.alias, + names + .obstruction + .rsplit_once('.') + .expect("fixture obstruction has a member",) + .1 + )), + )]), + )]), )]), ), ])]), diff --git a/crates/echo-wesley-gen/assets/v1/edict-provider/package/v1/components/lowerer.echo-dpo.component.wasm b/crates/echo-wesley-gen/assets/v1/edict-provider/package/v1/components/lowerer.echo-dpo.component.wasm index 64be4c68..8ba4de4e 100644 Binary files a/crates/echo-wesley-gen/assets/v1/edict-provider/package/v1/components/lowerer.echo-dpo.component.wasm and b/crates/echo-wesley-gen/assets/v1/edict-provider/package/v1/components/lowerer.echo-dpo.component.wasm differ diff --git a/crates/echo-wesley-gen/assets/v1/edict-provider/package/v1/components/verifier.echo-dpo.component.wasm b/crates/echo-wesley-gen/assets/v1/edict-provider/package/v1/components/verifier.echo-dpo.component.wasm index 7bbad1a1..284ccec0 100644 Binary files a/crates/echo-wesley-gen/assets/v1/edict-provider/package/v1/components/verifier.echo-dpo.component.wasm and b/crates/echo-wesley-gen/assets/v1/edict-provider/package/v1/components/verifier.echo-dpo.component.wasm differ diff --git a/crates/echo-wesley-gen/assets/v1/edict-provider/package/v1/generated/evidence/provenance.provider-generation.json b/crates/echo-wesley-gen/assets/v1/edict-provider/package/v1/generated/evidence/provenance.provider-generation.json index dd951446..da7bace8 100644 --- a/crates/echo-wesley-gen/assets/v1/edict-provider/package/v1/generated/evidence/provenance.provider-generation.json +++ b/crates/echo-wesley-gen/assets/v1/edict-provider/package/v1/generated/evidence/provenance.provider-generation.json @@ -1 +1 @@ -{"apiVersion":"wesley.generation-provenance-manifest/v1","contractVersions":{"generatorAbi":"wesley.extension-generator/v1","inputSchema":"wesley.extension-generation-input/v1","provenanceSchema":"wesley.generation-provenance-manifest/v1"},"emittedArtifacts":[{"coordinate":"echo.dpo-authority-facts@1","digest":"sha256:e2a6a539a7156296c18ff1bc02f80dcabf62b42bb4314d0737527869e43986d6"},{"coordinate":"echo.dpo-lawpack-authority-facts@1","digest":"sha256:ce1af559551f8b8242c4b290b620c5a28323b9e43f8bc6bb161a191001b6f4b9"},{"coordinate":"echo.dpo-lawpack@1","digest":"sha256:8c570362671a0b1cd1a992d8210e4a90ffd153ad06dcdf1e0cb36033cc971e2c"},{"coordinate":"echo.dpo.registration/v1","digest":"sha256:4ef3aaad0d2131ba7129a3e2ae178d10c44f7e9b062af2c1fe211de781462f34"},{"coordinate":"echo.dpo@1","digest":"sha256:1b105d1b1f6cdf5fecdef98b7adeb238525047d43581fe9fd8c44fd213e1788e"},{"coordinate":"echo.provider-artifacts.cddl@1","digest":"sha256:c604b7bf9e20db02dac9c010a01470d711335953cb31e6a603fb1e9cb818e8fa"}],"generationInputDigest":"sha256:49646ba46efe7b070ff1605bf7b148e6d35611a570015e9b08fa7d30206ec7c7","generator":{"coordinate":"echo-wesley-gen.provider-artifact-generator@1","digest":"sha256:04f4674a16275a9f69d2cf0ea3c0e9d5fffb079698a633f9ccd4aef73d787770","version":"0.1.0"},"settingsDigest":"sha256:0f708e76898de6fdb8186352e81d0f5c445adf94bb6c7de9204952d9fe913d4a","sourceArtifacts":[{"coordinate":"echo.semantic-schema@1","digest":"sha256:3a11315cb8aa1484ac73c44e725a50faa9ba696dcd8ca8a41a924a2810835070"},{"coordinate":"edict.provider-contract-pack.cddl@1","digest":"sha256:a5d5ea82a9e64aa78c4a44204d3e8919c1c590febb967f1d31639fdc2a20a96c"},{"coordinate":"edict.provider-contract-pack.manifest@1","digest":"sha256:f78dc8bb32f04f3e246f57e4228077c2a243827dd243525b9bd2e1d81dfa07ff"}]} \ No newline at end of file +{"apiVersion":"wesley.generation-provenance-manifest/v1","contractVersions":{"generatorAbi":"wesley.extension-generator/v1","inputSchema":"wesley.extension-generation-input/v1","provenanceSchema":"wesley.generation-provenance-manifest/v1"},"emittedArtifacts":[{"coordinate":"echo.dpo-authority-facts@1","digest":"sha256:e2a6a539a7156296c18ff1bc02f80dcabf62b42bb4314d0737527869e43986d6"},{"coordinate":"echo.dpo-lawpack-authority-facts@1","digest":"sha256:ce1af559551f8b8242c4b290b620c5a28323b9e43f8bc6bb161a191001b6f4b9"},{"coordinate":"echo.dpo-lawpack@1","digest":"sha256:8c570362671a0b1cd1a992d8210e4a90ffd153ad06dcdf1e0cb36033cc971e2c"},{"coordinate":"echo.dpo.registration/v1","digest":"sha256:4ef3aaad0d2131ba7129a3e2ae178d10c44f7e9b062af2c1fe211de781462f34"},{"coordinate":"echo.dpo@1","digest":"sha256:1b105d1b1f6cdf5fecdef98b7adeb238525047d43581fe9fd8c44fd213e1788e"},{"coordinate":"echo.provider-artifacts.cddl@1","digest":"sha256:6b9076ae02730797fddf60a93606df3de245a1c6bfbd845486799b7310d002a2"}],"generationInputDigest":"sha256:49646ba46efe7b070ff1605bf7b148e6d35611a570015e9b08fa7d30206ec7c7","generator":{"coordinate":"echo-wesley-gen.provider-artifact-generator@1","digest":"sha256:4222f5b0950a8af9642894d651113283350e0d9d7a32559e80912d9d2dd76b52","version":"0.1.0"},"settingsDigest":"sha256:0f708e76898de6fdb8186352e81d0f5c445adf94bb6c7de9204952d9fe913d4a","sourceArtifacts":[{"coordinate":"echo.semantic-schema@1","digest":"sha256:3a11315cb8aa1484ac73c44e725a50faa9ba696dcd8ca8a41a924a2810835070"},{"coordinate":"edict.provider-contract-pack.cddl@1","digest":"sha256:a5d5ea82a9e64aa78c4a44204d3e8919c1c590febb967f1d31639fdc2a20a96c"},{"coordinate":"edict.provider-contract-pack.manifest@1","digest":"sha256:f78dc8bb32f04f3e246f57e4228077c2a243827dd243525b9bd2e1d81dfa07ff"}]} \ No newline at end of file diff --git a/crates/echo-wesley-gen/assets/v1/edict-provider/package/v1/generated/evidence/review.provider-generation.json b/crates/echo-wesley-gen/assets/v1/edict-provider/package/v1/generated/evidence/review.provider-generation.json index db08f25d..e333e6dc 100644 --- a/crates/echo-wesley-gen/assets/v1/edict-provider/package/v1/generated/evidence/review.provider-generation.json +++ b/crates/echo-wesley-gen/assets/v1/edict-provider/package/v1/generated/evidence/review.provider-generation.json @@ -1 +1 @@ -{"apiVersion":"wesley.generation-review/v1","authoritative":false,"emittedArtifacts":[{"coordinate":"echo.dpo-authority-facts@1","digest":"sha256:e2a6a539a7156296c18ff1bc02f80dcabf62b42bb4314d0737527869e43986d6"},{"coordinate":"echo.dpo-lawpack-authority-facts@1","digest":"sha256:ce1af559551f8b8242c4b290b620c5a28323b9e43f8bc6bb161a191001b6f4b9"},{"coordinate":"echo.dpo-lawpack@1","digest":"sha256:8c570362671a0b1cd1a992d8210e4a90ffd153ad06dcdf1e0cb36033cc971e2c"},{"coordinate":"echo.dpo.registration/v1","digest":"sha256:4ef3aaad0d2131ba7129a3e2ae178d10c44f7e9b062af2c1fe211de781462f34"},{"coordinate":"echo.dpo@1","digest":"sha256:1b105d1b1f6cdf5fecdef98b7adeb238525047d43581fe9fd8c44fd213e1788e"},{"coordinate":"echo.provider-artifacts.cddl@1","digest":"sha256:c604b7bf9e20db02dac9c010a01470d711335953cb31e6a603fb1e9cb818e8fa"}],"generationInputDigest":"sha256:49646ba46efe7b070ff1605bf7b148e6d35611a570015e9b08fa7d30206ec7c7","generator":{"coordinate":"echo-wesley-gen.provider-artifact-generator@1","digest":"sha256:04f4674a16275a9f69d2cf0ea3c0e9d5fffb079698a633f9ccd4aef73d787770","version":"0.1.0"},"projectionRoles":["authority-facts.echo-dpo","authority-facts.echo-lawpack","generated-artifact-profile.echo-dpo-registration","lawpack.echo-dpo","schema.echo-provider-artifacts","target-profile.echo-dpo"],"provenanceManifestDigest":"sha256:8967b7e71a4dca2457285f93fa08c0c4ed5d0519fb2cf4909e4247c4386fe7a7","sourceArtifacts":[{"coordinate":"echo.semantic-schema@1","digest":"sha256:3a11315cb8aa1484ac73c44e725a50faa9ba696dcd8ca8a41a924a2810835070"},{"coordinate":"edict.provider-contract-pack.cddl@1","digest":"sha256:a5d5ea82a9e64aa78c4a44204d3e8919c1c590febb967f1d31639fdc2a20a96c"},{"coordinate":"edict.provider-contract-pack.manifest@1","digest":"sha256:f78dc8bb32f04f3e246f57e4228077c2a243827dd243525b9bd2e1d81dfa07ff"}]} \ No newline at end of file +{"apiVersion":"wesley.generation-review/v1","authoritative":false,"emittedArtifacts":[{"coordinate":"echo.dpo-authority-facts@1","digest":"sha256:e2a6a539a7156296c18ff1bc02f80dcabf62b42bb4314d0737527869e43986d6"},{"coordinate":"echo.dpo-lawpack-authority-facts@1","digest":"sha256:ce1af559551f8b8242c4b290b620c5a28323b9e43f8bc6bb161a191001b6f4b9"},{"coordinate":"echo.dpo-lawpack@1","digest":"sha256:8c570362671a0b1cd1a992d8210e4a90ffd153ad06dcdf1e0cb36033cc971e2c"},{"coordinate":"echo.dpo.registration/v1","digest":"sha256:4ef3aaad0d2131ba7129a3e2ae178d10c44f7e9b062af2c1fe211de781462f34"},{"coordinate":"echo.dpo@1","digest":"sha256:1b105d1b1f6cdf5fecdef98b7adeb238525047d43581fe9fd8c44fd213e1788e"},{"coordinate":"echo.provider-artifacts.cddl@1","digest":"sha256:6b9076ae02730797fddf60a93606df3de245a1c6bfbd845486799b7310d002a2"}],"generationInputDigest":"sha256:49646ba46efe7b070ff1605bf7b148e6d35611a570015e9b08fa7d30206ec7c7","generator":{"coordinate":"echo-wesley-gen.provider-artifact-generator@1","digest":"sha256:4222f5b0950a8af9642894d651113283350e0d9d7a32559e80912d9d2dd76b52","version":"0.1.0"},"projectionRoles":["authority-facts.echo-dpo","authority-facts.echo-lawpack","generated-artifact-profile.echo-dpo-registration","lawpack.echo-dpo","schema.echo-provider-artifacts","target-profile.echo-dpo"],"provenanceManifestDigest":"sha256:d448084da79f0cca20fa538f188e414d37192be88b127facc0056a4571da7741","sourceArtifacts":[{"coordinate":"echo.semantic-schema@1","digest":"sha256:3a11315cb8aa1484ac73c44e725a50faa9ba696dcd8ca8a41a924a2810835070"},{"coordinate":"edict.provider-contract-pack.cddl@1","digest":"sha256:a5d5ea82a9e64aa78c4a44204d3e8919c1c590febb967f1d31639fdc2a20a96c"},{"coordinate":"edict.provider-contract-pack.manifest@1","digest":"sha256:f78dc8bb32f04f3e246f57e4228077c2a243827dd243525b9bd2e1d81dfa07ff"}]} \ No newline at end of file diff --git a/crates/echo-wesley-gen/assets/v1/edict-provider/package/v1/generated/primary/schema.echo-provider-artifacts.cddl b/crates/echo-wesley-gen/assets/v1/edict-provider/package/v1/generated/primary/schema.echo-provider-artifacts.cddl index 0b0e8f47..32ecdc59 100644 --- a/crates/echo-wesley-gen/assets/v1/edict-provider/package/v1/generated/primary/schema.echo-provider-artifacts.cddl +++ b/crates/echo-wesley-gen/assets/v1/edict-provider/package/v1/generated/primary/schema.echo-provider-artifacts.cddl @@ -1064,6 +1064,7 @@ echo-operation-package = { "interpreter_profile_identity": bstr .size 32, "input_schema_identity": bstr .size 32, "intrinsic_profile_identity": bstr .size 32, + "obstruction_coordinate": echo-nonempty-tstr, "obstruction_schema_identity": bstr .size 32, "obstruction_interpretation_identity": bstr .size 32, "operation_coordinate": echo-nonempty-tstr, diff --git a/crates/echo-wesley-gen/assets/v1/edict-provider/package/v1/provider-manifest.echo.json b/crates/echo-wesley-gen/assets/v1/edict-provider/package/v1/provider-manifest.echo.json index 30d6dd51..4fabbf1c 100644 --- a/crates/echo-wesley-gen/assets/v1/edict-provider/package/v1/provider-manifest.echo.json +++ b/crates/echo-wesley-gen/assets/v1/edict-provider/package/v1/provider-manifest.echo.json @@ -3,7 +3,7 @@ "providerAbi": "edict:target-provider@1.0.0", "provider": { "coordinate": "echo.edict-provider@1", - "digest": "sha256:d8d433725fbece1ba657cd456720c1b788344f9034b1735ab99cf209d835038a" + "digest": "sha256:a7ab6bfbbedc3a6b61a8559dc6506cfc3d2836b46dac3cc825e5b05b16b94fa5" }, "artifacts": [ { @@ -21,7 +21,7 @@ }, "generator": { "coordinate": "echo-wesley-gen.provider-artifact-generator@1", - "digest": "sha256:04f4674a16275a9f69d2cf0ea3c0e9d5fffb079698a633f9ccd4aef73d787770" + "digest": "sha256:4222f5b0950a8af9642894d651113283350e0d9d7a32559e80912d9d2dd76b52" } } }, @@ -40,7 +40,7 @@ }, "generator": { "coordinate": "echo-wesley-gen.provider-artifact-generator@1", - "digest": "sha256:04f4674a16275a9f69d2cf0ea3c0e9d5fffb079698a633f9ccd4aef73d787770" + "digest": "sha256:4222f5b0950a8af9642894d651113283350e0d9d7a32559e80912d9d2dd76b52" } } }, @@ -59,7 +59,7 @@ }, "generator": { "coordinate": "echo-wesley-gen.provider-artifact-generator@1", - "digest": "sha256:04f4674a16275a9f69d2cf0ea3c0e9d5fffb079698a633f9ccd4aef73d787770" + "digest": "sha256:4222f5b0950a8af9642894d651113283350e0d9d7a32559e80912d9d2dd76b52" } } }, @@ -78,7 +78,7 @@ }, "generator": { "coordinate": "echo-wesley-gen.provider-artifact-generator@1", - "digest": "sha256:04f4674a16275a9f69d2cf0ea3c0e9d5fffb079698a633f9ccd4aef73d787770" + "digest": "sha256:4222f5b0950a8af9642894d651113283350e0d9d7a32559e80912d9d2dd76b52" } } }, @@ -87,13 +87,13 @@ "artifactKind": "lowerer", "resource": { "coordinate": "echo.dpo.lowerer/component@1", - "digest": "sha256:f800df20b95c5a3dbb7682d3dbe545ac0fde29ad67430ab7038954a08b54047b" + "digest": "sha256:08277d4ba7d98e0b143c06c208abc306f133bda510caa5393da08aa490334a6e" }, "source": { "kind": "component", "component": { "coordinate": "echo.dpo.lowerer/component@1", - "digest": "sha256:f800df20b95c5a3dbb7682d3dbe545ac0fde29ad67430ab7038954a08b54047b" + "digest": "sha256:08277d4ba7d98e0b143c06c208abc306f133bda510caa5393da08aa490334a6e" } } }, @@ -102,7 +102,7 @@ "artifactKind": "generationProvenance", "resource": { "coordinate": "echo.edict-provider-generation-provenance@1", - "digest": "sha256:eac361e4ffa9ef4f45060b449fa2ccef7b0434df4d26a0408c358ffdd264a670" + "digest": "sha256:83840aab907b1189482a92f70a405602bf76715dc8e4fbffdc543db2d6151019" }, "source": { "kind": "generated", @@ -112,7 +112,7 @@ }, "generator": { "coordinate": "echo-wesley-gen.provider-artifact-generator@1", - "digest": "sha256:04f4674a16275a9f69d2cf0ea3c0e9d5fffb079698a633f9ccd4aef73d787770" + "digest": "sha256:4222f5b0950a8af9642894d651113283350e0d9d7a32559e80912d9d2dd76b52" } } }, @@ -121,7 +121,7 @@ "artifactKind": "reviewArtifact", "resource": { "coordinate": "echo.edict-provider-generation-review@1", - "digest": "sha256:6c98d739be1a26289e13a08aff00e08ec98d2374eacad01278d263020b779cbd" + "digest": "sha256:26b954ae9e2220a339c2dfb6673615aafb1567be19aa7ee38eefa6b34e18897d" }, "source": { "kind": "generated", @@ -131,7 +131,7 @@ }, "generator": { "coordinate": "echo-wesley-gen.provider-artifact-generator@1", - "digest": "sha256:04f4674a16275a9f69d2cf0ea3c0e9d5fffb079698a633f9ccd4aef73d787770" + "digest": "sha256:4222f5b0950a8af9642894d651113283350e0d9d7a32559e80912d9d2dd76b52" } } }, @@ -140,7 +140,7 @@ "artifactKind": "artifactSchema", "resource": { "coordinate": "echo.provider-artifacts.cddl@1", - "digest": "sha256:c604b7bf9e20db02dac9c010a01470d711335953cb31e6a603fb1e9cb818e8fa" + "digest": "sha256:6b9076ae02730797fddf60a93606df3de245a1c6bfbd845486799b7310d002a2" }, "source": { "kind": "generated", @@ -150,7 +150,7 @@ }, "generator": { "coordinate": "echo-wesley-gen.provider-artifact-generator@1", - "digest": "sha256:04f4674a16275a9f69d2cf0ea3c0e9d5fffb079698a633f9ccd4aef73d787770" + "digest": "sha256:4222f5b0950a8af9642894d651113283350e0d9d7a32559e80912d9d2dd76b52" } } }, @@ -169,7 +169,7 @@ }, "generator": { "coordinate": "echo-wesley-gen.provider-artifact-generator@1", - "digest": "sha256:04f4674a16275a9f69d2cf0ea3c0e9d5fffb079698a633f9ccd4aef73d787770" + "digest": "sha256:4222f5b0950a8af9642894d651113283350e0d9d7a32559e80912d9d2dd76b52" } } }, @@ -178,13 +178,13 @@ "artifactKind": "verifier", "resource": { "coordinate": "echo.dpo.verifier/component@1", - "digest": "sha256:edbef0fee8bb8b661b457674ce4d7eeb75e842f39eb823ae121ddb412ad20a56" + "digest": "sha256:744a511137608634b88abf7bd7e61da9bf81a5cacff7b190fc2530c346ba36cc" }, "source": { "kind": "component", "component": { "coordinate": "echo.dpo.verifier/component@1", - "digest": "sha256:edbef0fee8bb8b661b457674ce4d7eeb75e842f39eb823ae121ddb412ad20a56" + "digest": "sha256:744a511137608634b88abf7bd7e61da9bf81a5cacff7b190fc2530c346ba36cc" } } } diff --git a/crates/echo-wesley-gen/src/provider_artifacts.rs b/crates/echo-wesley-gen/src/provider_artifacts.rs index 96b634d2..48f09bbb 100644 --- a/crates/echo-wesley-gen/src/provider_artifacts.rs +++ b/crates/echo-wesley-gen/src/provider_artifacts.rs @@ -241,6 +241,7 @@ echo-operation-package = { "interpreter_profile_identity": bstr .size 32, "input_schema_identity": bstr .size 32, "intrinsic_profile_identity": bstr .size 32, + "obstruction_coordinate": echo-nonempty-tstr, "obstruction_schema_identity": bstr .size 32, "obstruction_interpretation_identity": bstr .size 32, "operation_coordinate": echo-nonempty-tstr, diff --git a/crates/echo-wesley-gen/tests/provider_package.rs b/crates/echo-wesley-gen/tests/provider_package.rs index b0e16956..bf3f576c 100644 --- a/crates/echo-wesley-gen/tests/provider_package.rs +++ b/crates/echo-wesley-gen/tests/provider_package.rs @@ -65,7 +65,7 @@ const SEMANTIC_DIGEST: &str = const RELEASE_DIGEST: &str = "sha256:c39449495281b51f978468d08c21e93bcfa423176063b41675da61e4674b0066"; const PACKAGE_ARTIFACT_SHA256: &str = - "d8d433725fbece1ba657cd456720c1b788344f9034b1735ab99cf209d835038a"; + "a7ab6bfbbedc3a6b61a8559dc6506cfc3d2836b46dac3cc825e5b05b16b94fa5"; const OTHER_PACKAGE_ARTIFACT_SHA256: &str = "eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee"; diff --git a/crates/echo-wesley-gen/tests/provider_package_corpus.rs b/crates/echo-wesley-gen/tests/provider_package_corpus.rs index 6fffbc44..94cc1698 100644 --- a/crates/echo-wesley-gen/tests/provider_package_corpus.rs +++ b/crates/echo-wesley-gen/tests/provider_package_corpus.rs @@ -11,9 +11,9 @@ use std::sync::atomic::{AtomicU64, Ordering}; use sha2::{Digest as _, Sha256}; const EXPECTED_PROVIDER_DIGEST: &str = - "sha256:d8d433725fbece1ba657cd456720c1b788344f9034b1735ab99cf209d835038a"; + "sha256:a7ab6bfbbedc3a6b61a8559dc6506cfc3d2836b46dac3cc825e5b05b16b94fa5"; const EXPECTED_MANIFEST_RAW_SHA256: &str = - "911d4bdc455a8582a91db74c63f7c66fc3f6a9a3ce85342f5188bd67cf5341c4"; + "59933c7c7ae4873b6dc0f64151951d6df095e8056995a8d4d93cf7917a43ac5a"; const PACKAGE_PATHS: [&str; 25] = [ "components/lowerer.echo-dpo.component.wasm", diff --git a/crates/warp-core/src/echo_operation.rs b/crates/warp-core/src/echo_operation.rs index 73df1f60..cb4afbfd 100644 --- a/crates/warp-core/src/echo_operation.rs +++ b/crates/warp-core/src/echo_operation.rs @@ -944,6 +944,7 @@ impl EchoOperationSemanticClosureV1 { #[derive(Clone, Debug, PartialEq, Eq)] pub struct ExecutableOperationPackageV1 { operation_coordinate: String, + obstruction_coordinate: String, semantic_closure: EchoOperationSemanticClosureV1, target_profile_identity: Hash, interpreter_profile_identity: Hash, @@ -966,6 +967,7 @@ impl ExecutableOperationPackageV1 { #[must_use] pub fn new( operation_coordinate: impl Into, + obstruction_coordinate: impl Into, semantic_closure: EchoOperationSemanticClosureV1, target_profile_identity: Hash, authority_profile_identity: Hash, @@ -981,6 +983,7 @@ impl ExecutableOperationPackageV1 { let application_basis_schema_identity = profile_digest(program.application_basis_schema()); Self { operation_coordinate: operation_coordinate.into(), + obstruction_coordinate: obstruction_coordinate.into(), semantic_closure, target_profile_identity, interpreter_profile_identity: profile_digest(INTERPRETER_PROFILE), @@ -1005,6 +1008,12 @@ impl ExecutableOperationPackageV1 { &self.operation_coordinate } + /// Returns the application-authored obstruction coordinate. + #[must_use] + pub fn obstruction_coordinate(&self) -> &str { + &self.obstruction_coordinate + } + /// Returns the Edict semantic identity bound by this package. #[must_use] pub const fn semantic_identity(&self) -> Hash { @@ -1049,6 +1058,12 @@ impl ExecutableOperationPackageV1 { "operation coordinate must not be empty", )); } + if self.obstruction_coordinate.is_empty() { + return Err(artifact_error( + EchoOperationArtifactErrorKindV1::EmptyObstructionCoordinate, + "obstruction coordinate must not be empty", + )); + } if !self.budget_ceiling.is_nonzero() { return Err(artifact_error( EchoOperationArtifactErrorKindV1::InvalidBudget, @@ -1105,6 +1120,10 @@ impl ExecutableOperationPackageV1 { "obstruction_interpretation_identity", hash_value(self.obstruction_interpretation_identity), ), + ( + "obstruction_coordinate", + text_value(&self.obstruction_coordinate), + ), ( "operation_coordinate", text_value(&self.operation_coordinate), @@ -1143,6 +1162,7 @@ impl ExecutableOperationPackageV1 { "intrinsic_profile_identity", "obstruction_schema_identity", "obstruction_interpretation_identity", + "obstruction_coordinate", "operation_coordinate", "program", "result_schema_identity", @@ -1160,10 +1180,18 @@ impl ExecutableOperationPackageV1 { "operation coordinate must not be empty", )); } + let obstruction_coordinate = take_text(&mut fields, "obstruction_coordinate")?; + if obstruction_coordinate.is_empty() { + return Err(artifact_error( + EchoOperationArtifactErrorKindV1::EmptyObstructionCoordinate, + "obstruction coordinate must not be empty", + )); + } let program_bytes = take_bytes(&mut fields, "program")?; let program = EchoOperationProgramV1::from_canonical_bytes(&program_bytes)?; let package = Self { operation_coordinate, + obstruction_coordinate, semantic_closure: EchoOperationSemanticClosureV1::from_value(take_field( &mut fields, "semantic_closure", @@ -1295,6 +1323,8 @@ pub enum EchoOperationArtifactErrorKindV1 { NonCanonical, /// The public operation coordinate was empty. EmptyOperationCoordinate, + /// The application-authored obstruction coordinate was empty. + EmptyObstructionCoordinate, /// The target profile is not implemented by this Echo runtime. UnsupportedTargetProfile, /// A schema or footprint profile is not implemented by this runtime. @@ -6310,6 +6340,7 @@ mod tests { let authority_profile = digest(40); let package = ExecutableOperationPackageV1::new( operation_coordinate, + "echo.fixture.DescendedCreateIfAbsent.AlreadyExists/v1", EchoOperationSemanticClosureV1::new( digest(41), digest(42), @@ -6534,6 +6565,7 @@ mod tests { fn retained_fixture_installation() -> InstalledEchoOperationV1 { let package = ExecutableOperationPackageV1::new( "echo.fixture.Retention.v1", + "echo.fixture.Retention.Obstruction/v1", EchoOperationSemanticClosureV1::new( digest(1), digest(2), diff --git a/crates/warp-core/src/trusted_runtime_host.rs b/crates/warp-core/src/trusted_runtime_host.rs index 85480b56..235d0160 100644 --- a/crates/warp-core/src/trusted_runtime_host.rs +++ b/crates/warp-core/src/trusted_runtime_host.rs @@ -4941,10 +4941,11 @@ fn recover_runtime_state_delta_material( }); missing.sort_unstable(); missing.dedup(); - let echo_operation_action_outcomes = action_outcomes_by_submission + let mut echo_operation_action_outcomes = action_outcomes_by_submission .into_iter() .map(|(submission_id, (ingress_id, outcome))| (submission_id, ingress_id, outcome)) - .collect(); + .collect::>(); + echo_operation_action_outcomes.sort_by_key(|(_, ingress_id, _)| *ingress_id); Ok(RecoveredRuntimeStateMaterial { provenance_entries: entries, receipt_correlations: correlations, @@ -6348,6 +6349,7 @@ mod tests { let budget = crate::EchoOperationBudgetV1::new(7, 1_024, 1_024); let package = crate::ExecutableOperationPackageV1::new( operation_coordinate, + "echo.test.LegacyRecoveryIndex.Obstruction.v1", crate::EchoOperationSemanticClosureV1::new( [0x10; 32], [0x11; 32], @@ -6388,9 +6390,9 @@ mod tests { recovered_echo_operation_index_root([0x20; 32], &[installed], &[], &[]) .expect("the legacy index root is computable"), [ - 0xff, 0x77, 0x8e, 0x79, 0x1c, 0x4b, 0x7f, 0x99, 0xb7, 0xa5, 0x4c, 0x4b, 0x8d, 0xdb, - 0x36, 0x91, 0x62, 0x17, 0x8a, 0x22, 0xe2, 0xbe, 0xde, 0xc6, 0x54, 0x4c, 0x8d, 0x25, - 0xa1, 0xa0, 0x69, 0x04, + 0xf9, 0xcf, 0x53, 0xf2, 0xad, 0xaf, 0x93, 0x1a, 0xa0, 0xe6, 0x06, 0xc6, 0x5a, 0x91, + 0x6f, 0xfa, 0x0b, 0x4f, 0xf5, 0x50, 0x66, 0x32, 0x8c, 0x1c, 0x48, 0xf7, 0x22, 0xcd, + 0x1e, 0x0d, 0x40, 0x2e, ] ); } diff --git a/crates/warp-core/tests/executable_operation_pipeline_tests.rs b/crates/warp-core/tests/executable_operation_pipeline_tests.rs index 7975e3f0..4aa30dbc 100644 --- a/crates/warp-core/tests/executable_operation_pipeline_tests.rs +++ b/crates/warp-core/tests/executable_operation_pipeline_tests.rs @@ -451,6 +451,7 @@ fn operation_package_at( ) -> ExecutableOperationPackageV1 { ExecutableOperationPackageV1::new( operation_coordinate, + "echo.fixture.OperationObstruction/v1", semantic_closure(), warp_core::echo_operation_target_profile_identity_v1(), digest("fixture-authority-profile"), @@ -469,6 +470,7 @@ fn creation_operation_package( ) -> ExecutableOperationPackageV1 { ExecutableOperationPackageV1::new( CREATE_OPERATION_COORDINATE, + "echo.fixture.AlreadyExists/v1", semantic_closure(), warp_core::echo_operation_create_if_absent_target_profile_identity_v1(), digest("fixture-authority-profile"), @@ -1106,6 +1108,7 @@ fn package_admission_rejects_malformed_unsupported_mismatched_and_over_budget_by let unsupported_target_bytes = ExecutableOperationPackageV1::new( OPERATION_COORDINATE, + "echo.fixture.OperationObstruction/v1", semantic_closure(), digest("unsupported-target-profile"), digest("fixture-authority-profile"), @@ -1225,6 +1228,7 @@ fn package_admission_rejects_malformed_unsupported_mismatched_and_over_budget_by let impossible_package = ExecutableOperationPackageV1::new( OPERATION_COORDINATE, + "echo.fixture.OperationObstruction/v1", semantic_closure(), warp_core::echo_operation_target_profile_identity_v1(), digest("fixture-authority-profile"), diff --git a/docs/adr/0025-scheduler-owned-executable-operation-actions.md b/docs/adr/0025-scheduler-owned-executable-operation-actions.md index 0a5e0414..63244353 100644 --- a/docs/adr/0025-scheduler-owned-executable-operation-actions.md +++ b/docs/adr/0025-scheduler-owned-executable-operation-actions.md @@ -67,7 +67,8 @@ Action. The evaluator remains private and pure with respect to the parent worldline: - success returns one complete prepared candidate; -- obstruction returns typed evidence and no parent-visible operations; +- obstruction returns the package-declared, lawpack-qualified typed coordinate + and no parent-visible operations; - neither result mutates the parent state. The direct `prepare_echo_operation_v1` and diff --git a/schemas/edict-provider/components/v1/lowerer.echo-dpo.component.wasm b/schemas/edict-provider/components/v1/lowerer.echo-dpo.component.wasm index 64be4c68..8ba4de4e 100644 Binary files a/schemas/edict-provider/components/v1/lowerer.echo-dpo.component.wasm and b/schemas/edict-provider/components/v1/lowerer.echo-dpo.component.wasm differ diff --git a/schemas/edict-provider/components/v1/verifier.echo-dpo.component.wasm b/schemas/edict-provider/components/v1/verifier.echo-dpo.component.wasm index 7bbad1a1..284ccec0 100644 Binary files a/schemas/edict-provider/components/v1/verifier.echo-dpo.component.wasm and b/schemas/edict-provider/components/v1/verifier.echo-dpo.component.wasm differ diff --git a/schemas/edict-provider/generated/v1/evidence/provenance.provider-generation.json b/schemas/edict-provider/generated/v1/evidence/provenance.provider-generation.json index dd951446..da7bace8 100644 --- a/schemas/edict-provider/generated/v1/evidence/provenance.provider-generation.json +++ b/schemas/edict-provider/generated/v1/evidence/provenance.provider-generation.json @@ -1 +1 @@ -{"apiVersion":"wesley.generation-provenance-manifest/v1","contractVersions":{"generatorAbi":"wesley.extension-generator/v1","inputSchema":"wesley.extension-generation-input/v1","provenanceSchema":"wesley.generation-provenance-manifest/v1"},"emittedArtifacts":[{"coordinate":"echo.dpo-authority-facts@1","digest":"sha256:e2a6a539a7156296c18ff1bc02f80dcabf62b42bb4314d0737527869e43986d6"},{"coordinate":"echo.dpo-lawpack-authority-facts@1","digest":"sha256:ce1af559551f8b8242c4b290b620c5a28323b9e43f8bc6bb161a191001b6f4b9"},{"coordinate":"echo.dpo-lawpack@1","digest":"sha256:8c570362671a0b1cd1a992d8210e4a90ffd153ad06dcdf1e0cb36033cc971e2c"},{"coordinate":"echo.dpo.registration/v1","digest":"sha256:4ef3aaad0d2131ba7129a3e2ae178d10c44f7e9b062af2c1fe211de781462f34"},{"coordinate":"echo.dpo@1","digest":"sha256:1b105d1b1f6cdf5fecdef98b7adeb238525047d43581fe9fd8c44fd213e1788e"},{"coordinate":"echo.provider-artifacts.cddl@1","digest":"sha256:c604b7bf9e20db02dac9c010a01470d711335953cb31e6a603fb1e9cb818e8fa"}],"generationInputDigest":"sha256:49646ba46efe7b070ff1605bf7b148e6d35611a570015e9b08fa7d30206ec7c7","generator":{"coordinate":"echo-wesley-gen.provider-artifact-generator@1","digest":"sha256:04f4674a16275a9f69d2cf0ea3c0e9d5fffb079698a633f9ccd4aef73d787770","version":"0.1.0"},"settingsDigest":"sha256:0f708e76898de6fdb8186352e81d0f5c445adf94bb6c7de9204952d9fe913d4a","sourceArtifacts":[{"coordinate":"echo.semantic-schema@1","digest":"sha256:3a11315cb8aa1484ac73c44e725a50faa9ba696dcd8ca8a41a924a2810835070"},{"coordinate":"edict.provider-contract-pack.cddl@1","digest":"sha256:a5d5ea82a9e64aa78c4a44204d3e8919c1c590febb967f1d31639fdc2a20a96c"},{"coordinate":"edict.provider-contract-pack.manifest@1","digest":"sha256:f78dc8bb32f04f3e246f57e4228077c2a243827dd243525b9bd2e1d81dfa07ff"}]} \ No newline at end of file +{"apiVersion":"wesley.generation-provenance-manifest/v1","contractVersions":{"generatorAbi":"wesley.extension-generator/v1","inputSchema":"wesley.extension-generation-input/v1","provenanceSchema":"wesley.generation-provenance-manifest/v1"},"emittedArtifacts":[{"coordinate":"echo.dpo-authority-facts@1","digest":"sha256:e2a6a539a7156296c18ff1bc02f80dcabf62b42bb4314d0737527869e43986d6"},{"coordinate":"echo.dpo-lawpack-authority-facts@1","digest":"sha256:ce1af559551f8b8242c4b290b620c5a28323b9e43f8bc6bb161a191001b6f4b9"},{"coordinate":"echo.dpo-lawpack@1","digest":"sha256:8c570362671a0b1cd1a992d8210e4a90ffd153ad06dcdf1e0cb36033cc971e2c"},{"coordinate":"echo.dpo.registration/v1","digest":"sha256:4ef3aaad0d2131ba7129a3e2ae178d10c44f7e9b062af2c1fe211de781462f34"},{"coordinate":"echo.dpo@1","digest":"sha256:1b105d1b1f6cdf5fecdef98b7adeb238525047d43581fe9fd8c44fd213e1788e"},{"coordinate":"echo.provider-artifacts.cddl@1","digest":"sha256:6b9076ae02730797fddf60a93606df3de245a1c6bfbd845486799b7310d002a2"}],"generationInputDigest":"sha256:49646ba46efe7b070ff1605bf7b148e6d35611a570015e9b08fa7d30206ec7c7","generator":{"coordinate":"echo-wesley-gen.provider-artifact-generator@1","digest":"sha256:4222f5b0950a8af9642894d651113283350e0d9d7a32559e80912d9d2dd76b52","version":"0.1.0"},"settingsDigest":"sha256:0f708e76898de6fdb8186352e81d0f5c445adf94bb6c7de9204952d9fe913d4a","sourceArtifacts":[{"coordinate":"echo.semantic-schema@1","digest":"sha256:3a11315cb8aa1484ac73c44e725a50faa9ba696dcd8ca8a41a924a2810835070"},{"coordinate":"edict.provider-contract-pack.cddl@1","digest":"sha256:a5d5ea82a9e64aa78c4a44204d3e8919c1c590febb967f1d31639fdc2a20a96c"},{"coordinate":"edict.provider-contract-pack.manifest@1","digest":"sha256:f78dc8bb32f04f3e246f57e4228077c2a243827dd243525b9bd2e1d81dfa07ff"}]} \ No newline at end of file diff --git a/schemas/edict-provider/generated/v1/evidence/review.provider-generation.json b/schemas/edict-provider/generated/v1/evidence/review.provider-generation.json index db08f25d..e333e6dc 100644 --- a/schemas/edict-provider/generated/v1/evidence/review.provider-generation.json +++ b/schemas/edict-provider/generated/v1/evidence/review.provider-generation.json @@ -1 +1 @@ -{"apiVersion":"wesley.generation-review/v1","authoritative":false,"emittedArtifacts":[{"coordinate":"echo.dpo-authority-facts@1","digest":"sha256:e2a6a539a7156296c18ff1bc02f80dcabf62b42bb4314d0737527869e43986d6"},{"coordinate":"echo.dpo-lawpack-authority-facts@1","digest":"sha256:ce1af559551f8b8242c4b290b620c5a28323b9e43f8bc6bb161a191001b6f4b9"},{"coordinate":"echo.dpo-lawpack@1","digest":"sha256:8c570362671a0b1cd1a992d8210e4a90ffd153ad06dcdf1e0cb36033cc971e2c"},{"coordinate":"echo.dpo.registration/v1","digest":"sha256:4ef3aaad0d2131ba7129a3e2ae178d10c44f7e9b062af2c1fe211de781462f34"},{"coordinate":"echo.dpo@1","digest":"sha256:1b105d1b1f6cdf5fecdef98b7adeb238525047d43581fe9fd8c44fd213e1788e"},{"coordinate":"echo.provider-artifacts.cddl@1","digest":"sha256:c604b7bf9e20db02dac9c010a01470d711335953cb31e6a603fb1e9cb818e8fa"}],"generationInputDigest":"sha256:49646ba46efe7b070ff1605bf7b148e6d35611a570015e9b08fa7d30206ec7c7","generator":{"coordinate":"echo-wesley-gen.provider-artifact-generator@1","digest":"sha256:04f4674a16275a9f69d2cf0ea3c0e9d5fffb079698a633f9ccd4aef73d787770","version":"0.1.0"},"projectionRoles":["authority-facts.echo-dpo","authority-facts.echo-lawpack","generated-artifact-profile.echo-dpo-registration","lawpack.echo-dpo","schema.echo-provider-artifacts","target-profile.echo-dpo"],"provenanceManifestDigest":"sha256:8967b7e71a4dca2457285f93fa08c0c4ed5d0519fb2cf4909e4247c4386fe7a7","sourceArtifacts":[{"coordinate":"echo.semantic-schema@1","digest":"sha256:3a11315cb8aa1484ac73c44e725a50faa9ba696dcd8ca8a41a924a2810835070"},{"coordinate":"edict.provider-contract-pack.cddl@1","digest":"sha256:a5d5ea82a9e64aa78c4a44204d3e8919c1c590febb967f1d31639fdc2a20a96c"},{"coordinate":"edict.provider-contract-pack.manifest@1","digest":"sha256:f78dc8bb32f04f3e246f57e4228077c2a243827dd243525b9bd2e1d81dfa07ff"}]} \ No newline at end of file +{"apiVersion":"wesley.generation-review/v1","authoritative":false,"emittedArtifacts":[{"coordinate":"echo.dpo-authority-facts@1","digest":"sha256:e2a6a539a7156296c18ff1bc02f80dcabf62b42bb4314d0737527869e43986d6"},{"coordinate":"echo.dpo-lawpack-authority-facts@1","digest":"sha256:ce1af559551f8b8242c4b290b620c5a28323b9e43f8bc6bb161a191001b6f4b9"},{"coordinate":"echo.dpo-lawpack@1","digest":"sha256:8c570362671a0b1cd1a992d8210e4a90ffd153ad06dcdf1e0cb36033cc971e2c"},{"coordinate":"echo.dpo.registration/v1","digest":"sha256:4ef3aaad0d2131ba7129a3e2ae178d10c44f7e9b062af2c1fe211de781462f34"},{"coordinate":"echo.dpo@1","digest":"sha256:1b105d1b1f6cdf5fecdef98b7adeb238525047d43581fe9fd8c44fd213e1788e"},{"coordinate":"echo.provider-artifacts.cddl@1","digest":"sha256:6b9076ae02730797fddf60a93606df3de245a1c6bfbd845486799b7310d002a2"}],"generationInputDigest":"sha256:49646ba46efe7b070ff1605bf7b148e6d35611a570015e9b08fa7d30206ec7c7","generator":{"coordinate":"echo-wesley-gen.provider-artifact-generator@1","digest":"sha256:4222f5b0950a8af9642894d651113283350e0d9d7a32559e80912d9d2dd76b52","version":"0.1.0"},"projectionRoles":["authority-facts.echo-dpo","authority-facts.echo-lawpack","generated-artifact-profile.echo-dpo-registration","lawpack.echo-dpo","schema.echo-provider-artifacts","target-profile.echo-dpo"],"provenanceManifestDigest":"sha256:d448084da79f0cca20fa538f188e414d37192be88b127facc0056a4571da7741","sourceArtifacts":[{"coordinate":"echo.semantic-schema@1","digest":"sha256:3a11315cb8aa1484ac73c44e725a50faa9ba696dcd8ca8a41a924a2810835070"},{"coordinate":"edict.provider-contract-pack.cddl@1","digest":"sha256:a5d5ea82a9e64aa78c4a44204d3e8919c1c590febb967f1d31639fdc2a20a96c"},{"coordinate":"edict.provider-contract-pack.manifest@1","digest":"sha256:f78dc8bb32f04f3e246f57e4228077c2a243827dd243525b9bd2e1d81dfa07ff"}]} \ No newline at end of file diff --git a/schemas/edict-provider/generated/v1/primary/schema.echo-provider-artifacts.cddl b/schemas/edict-provider/generated/v1/primary/schema.echo-provider-artifacts.cddl index 0b0e8f47..32ecdc59 100644 --- a/schemas/edict-provider/generated/v1/primary/schema.echo-provider-artifacts.cddl +++ b/schemas/edict-provider/generated/v1/primary/schema.echo-provider-artifacts.cddl @@ -1064,6 +1064,7 @@ echo-operation-package = { "interpreter_profile_identity": bstr .size 32, "input_schema_identity": bstr .size 32, "intrinsic_profile_identity": bstr .size 32, + "obstruction_coordinate": echo-nonempty-tstr, "obstruction_schema_identity": bstr .size 32, "obstruction_interpretation_identity": bstr .size 32, "operation_coordinate": echo-nonempty-tstr, diff --git a/schemas/edict-provider/package/v1/components/lowerer.echo-dpo.component.wasm b/schemas/edict-provider/package/v1/components/lowerer.echo-dpo.component.wasm index 64be4c68..8ba4de4e 100644 Binary files a/schemas/edict-provider/package/v1/components/lowerer.echo-dpo.component.wasm and b/schemas/edict-provider/package/v1/components/lowerer.echo-dpo.component.wasm differ diff --git a/schemas/edict-provider/package/v1/components/verifier.echo-dpo.component.wasm b/schemas/edict-provider/package/v1/components/verifier.echo-dpo.component.wasm index 7bbad1a1..284ccec0 100644 Binary files a/schemas/edict-provider/package/v1/components/verifier.echo-dpo.component.wasm and b/schemas/edict-provider/package/v1/components/verifier.echo-dpo.component.wasm differ diff --git a/schemas/edict-provider/package/v1/generated/evidence/provenance.provider-generation.json b/schemas/edict-provider/package/v1/generated/evidence/provenance.provider-generation.json index dd951446..da7bace8 100644 --- a/schemas/edict-provider/package/v1/generated/evidence/provenance.provider-generation.json +++ b/schemas/edict-provider/package/v1/generated/evidence/provenance.provider-generation.json @@ -1 +1 @@ -{"apiVersion":"wesley.generation-provenance-manifest/v1","contractVersions":{"generatorAbi":"wesley.extension-generator/v1","inputSchema":"wesley.extension-generation-input/v1","provenanceSchema":"wesley.generation-provenance-manifest/v1"},"emittedArtifacts":[{"coordinate":"echo.dpo-authority-facts@1","digest":"sha256:e2a6a539a7156296c18ff1bc02f80dcabf62b42bb4314d0737527869e43986d6"},{"coordinate":"echo.dpo-lawpack-authority-facts@1","digest":"sha256:ce1af559551f8b8242c4b290b620c5a28323b9e43f8bc6bb161a191001b6f4b9"},{"coordinate":"echo.dpo-lawpack@1","digest":"sha256:8c570362671a0b1cd1a992d8210e4a90ffd153ad06dcdf1e0cb36033cc971e2c"},{"coordinate":"echo.dpo.registration/v1","digest":"sha256:4ef3aaad0d2131ba7129a3e2ae178d10c44f7e9b062af2c1fe211de781462f34"},{"coordinate":"echo.dpo@1","digest":"sha256:1b105d1b1f6cdf5fecdef98b7adeb238525047d43581fe9fd8c44fd213e1788e"},{"coordinate":"echo.provider-artifacts.cddl@1","digest":"sha256:c604b7bf9e20db02dac9c010a01470d711335953cb31e6a603fb1e9cb818e8fa"}],"generationInputDigest":"sha256:49646ba46efe7b070ff1605bf7b148e6d35611a570015e9b08fa7d30206ec7c7","generator":{"coordinate":"echo-wesley-gen.provider-artifact-generator@1","digest":"sha256:04f4674a16275a9f69d2cf0ea3c0e9d5fffb079698a633f9ccd4aef73d787770","version":"0.1.0"},"settingsDigest":"sha256:0f708e76898de6fdb8186352e81d0f5c445adf94bb6c7de9204952d9fe913d4a","sourceArtifacts":[{"coordinate":"echo.semantic-schema@1","digest":"sha256:3a11315cb8aa1484ac73c44e725a50faa9ba696dcd8ca8a41a924a2810835070"},{"coordinate":"edict.provider-contract-pack.cddl@1","digest":"sha256:a5d5ea82a9e64aa78c4a44204d3e8919c1c590febb967f1d31639fdc2a20a96c"},{"coordinate":"edict.provider-contract-pack.manifest@1","digest":"sha256:f78dc8bb32f04f3e246f57e4228077c2a243827dd243525b9bd2e1d81dfa07ff"}]} \ No newline at end of file +{"apiVersion":"wesley.generation-provenance-manifest/v1","contractVersions":{"generatorAbi":"wesley.extension-generator/v1","inputSchema":"wesley.extension-generation-input/v1","provenanceSchema":"wesley.generation-provenance-manifest/v1"},"emittedArtifacts":[{"coordinate":"echo.dpo-authority-facts@1","digest":"sha256:e2a6a539a7156296c18ff1bc02f80dcabf62b42bb4314d0737527869e43986d6"},{"coordinate":"echo.dpo-lawpack-authority-facts@1","digest":"sha256:ce1af559551f8b8242c4b290b620c5a28323b9e43f8bc6bb161a191001b6f4b9"},{"coordinate":"echo.dpo-lawpack@1","digest":"sha256:8c570362671a0b1cd1a992d8210e4a90ffd153ad06dcdf1e0cb36033cc971e2c"},{"coordinate":"echo.dpo.registration/v1","digest":"sha256:4ef3aaad0d2131ba7129a3e2ae178d10c44f7e9b062af2c1fe211de781462f34"},{"coordinate":"echo.dpo@1","digest":"sha256:1b105d1b1f6cdf5fecdef98b7adeb238525047d43581fe9fd8c44fd213e1788e"},{"coordinate":"echo.provider-artifacts.cddl@1","digest":"sha256:6b9076ae02730797fddf60a93606df3de245a1c6bfbd845486799b7310d002a2"}],"generationInputDigest":"sha256:49646ba46efe7b070ff1605bf7b148e6d35611a570015e9b08fa7d30206ec7c7","generator":{"coordinate":"echo-wesley-gen.provider-artifact-generator@1","digest":"sha256:4222f5b0950a8af9642894d651113283350e0d9d7a32559e80912d9d2dd76b52","version":"0.1.0"},"settingsDigest":"sha256:0f708e76898de6fdb8186352e81d0f5c445adf94bb6c7de9204952d9fe913d4a","sourceArtifacts":[{"coordinate":"echo.semantic-schema@1","digest":"sha256:3a11315cb8aa1484ac73c44e725a50faa9ba696dcd8ca8a41a924a2810835070"},{"coordinate":"edict.provider-contract-pack.cddl@1","digest":"sha256:a5d5ea82a9e64aa78c4a44204d3e8919c1c590febb967f1d31639fdc2a20a96c"},{"coordinate":"edict.provider-contract-pack.manifest@1","digest":"sha256:f78dc8bb32f04f3e246f57e4228077c2a243827dd243525b9bd2e1d81dfa07ff"}]} \ No newline at end of file diff --git a/schemas/edict-provider/package/v1/generated/evidence/review.provider-generation.json b/schemas/edict-provider/package/v1/generated/evidence/review.provider-generation.json index db08f25d..e333e6dc 100644 --- a/schemas/edict-provider/package/v1/generated/evidence/review.provider-generation.json +++ b/schemas/edict-provider/package/v1/generated/evidence/review.provider-generation.json @@ -1 +1 @@ -{"apiVersion":"wesley.generation-review/v1","authoritative":false,"emittedArtifacts":[{"coordinate":"echo.dpo-authority-facts@1","digest":"sha256:e2a6a539a7156296c18ff1bc02f80dcabf62b42bb4314d0737527869e43986d6"},{"coordinate":"echo.dpo-lawpack-authority-facts@1","digest":"sha256:ce1af559551f8b8242c4b290b620c5a28323b9e43f8bc6bb161a191001b6f4b9"},{"coordinate":"echo.dpo-lawpack@1","digest":"sha256:8c570362671a0b1cd1a992d8210e4a90ffd153ad06dcdf1e0cb36033cc971e2c"},{"coordinate":"echo.dpo.registration/v1","digest":"sha256:4ef3aaad0d2131ba7129a3e2ae178d10c44f7e9b062af2c1fe211de781462f34"},{"coordinate":"echo.dpo@1","digest":"sha256:1b105d1b1f6cdf5fecdef98b7adeb238525047d43581fe9fd8c44fd213e1788e"},{"coordinate":"echo.provider-artifacts.cddl@1","digest":"sha256:c604b7bf9e20db02dac9c010a01470d711335953cb31e6a603fb1e9cb818e8fa"}],"generationInputDigest":"sha256:49646ba46efe7b070ff1605bf7b148e6d35611a570015e9b08fa7d30206ec7c7","generator":{"coordinate":"echo-wesley-gen.provider-artifact-generator@1","digest":"sha256:04f4674a16275a9f69d2cf0ea3c0e9d5fffb079698a633f9ccd4aef73d787770","version":"0.1.0"},"projectionRoles":["authority-facts.echo-dpo","authority-facts.echo-lawpack","generated-artifact-profile.echo-dpo-registration","lawpack.echo-dpo","schema.echo-provider-artifacts","target-profile.echo-dpo"],"provenanceManifestDigest":"sha256:8967b7e71a4dca2457285f93fa08c0c4ed5d0519fb2cf4909e4247c4386fe7a7","sourceArtifacts":[{"coordinate":"echo.semantic-schema@1","digest":"sha256:3a11315cb8aa1484ac73c44e725a50faa9ba696dcd8ca8a41a924a2810835070"},{"coordinate":"edict.provider-contract-pack.cddl@1","digest":"sha256:a5d5ea82a9e64aa78c4a44204d3e8919c1c590febb967f1d31639fdc2a20a96c"},{"coordinate":"edict.provider-contract-pack.manifest@1","digest":"sha256:f78dc8bb32f04f3e246f57e4228077c2a243827dd243525b9bd2e1d81dfa07ff"}]} \ No newline at end of file +{"apiVersion":"wesley.generation-review/v1","authoritative":false,"emittedArtifacts":[{"coordinate":"echo.dpo-authority-facts@1","digest":"sha256:e2a6a539a7156296c18ff1bc02f80dcabf62b42bb4314d0737527869e43986d6"},{"coordinate":"echo.dpo-lawpack-authority-facts@1","digest":"sha256:ce1af559551f8b8242c4b290b620c5a28323b9e43f8bc6bb161a191001b6f4b9"},{"coordinate":"echo.dpo-lawpack@1","digest":"sha256:8c570362671a0b1cd1a992d8210e4a90ffd153ad06dcdf1e0cb36033cc971e2c"},{"coordinate":"echo.dpo.registration/v1","digest":"sha256:4ef3aaad0d2131ba7129a3e2ae178d10c44f7e9b062af2c1fe211de781462f34"},{"coordinate":"echo.dpo@1","digest":"sha256:1b105d1b1f6cdf5fecdef98b7adeb238525047d43581fe9fd8c44fd213e1788e"},{"coordinate":"echo.provider-artifacts.cddl@1","digest":"sha256:6b9076ae02730797fddf60a93606df3de245a1c6bfbd845486799b7310d002a2"}],"generationInputDigest":"sha256:49646ba46efe7b070ff1605bf7b148e6d35611a570015e9b08fa7d30206ec7c7","generator":{"coordinate":"echo-wesley-gen.provider-artifact-generator@1","digest":"sha256:4222f5b0950a8af9642894d651113283350e0d9d7a32559e80912d9d2dd76b52","version":"0.1.0"},"projectionRoles":["authority-facts.echo-dpo","authority-facts.echo-lawpack","generated-artifact-profile.echo-dpo-registration","lawpack.echo-dpo","schema.echo-provider-artifacts","target-profile.echo-dpo"],"provenanceManifestDigest":"sha256:d448084da79f0cca20fa538f188e414d37192be88b127facc0056a4571da7741","sourceArtifacts":[{"coordinate":"echo.semantic-schema@1","digest":"sha256:3a11315cb8aa1484ac73c44e725a50faa9ba696dcd8ca8a41a924a2810835070"},{"coordinate":"edict.provider-contract-pack.cddl@1","digest":"sha256:a5d5ea82a9e64aa78c4a44204d3e8919c1c590febb967f1d31639fdc2a20a96c"},{"coordinate":"edict.provider-contract-pack.manifest@1","digest":"sha256:f78dc8bb32f04f3e246f57e4228077c2a243827dd243525b9bd2e1d81dfa07ff"}]} \ No newline at end of file diff --git a/schemas/edict-provider/package/v1/generated/primary/schema.echo-provider-artifacts.cddl b/schemas/edict-provider/package/v1/generated/primary/schema.echo-provider-artifacts.cddl index 0b0e8f47..32ecdc59 100644 --- a/schemas/edict-provider/package/v1/generated/primary/schema.echo-provider-artifacts.cddl +++ b/schemas/edict-provider/package/v1/generated/primary/schema.echo-provider-artifacts.cddl @@ -1064,6 +1064,7 @@ echo-operation-package = { "interpreter_profile_identity": bstr .size 32, "input_schema_identity": bstr .size 32, "intrinsic_profile_identity": bstr .size 32, + "obstruction_coordinate": echo-nonempty-tstr, "obstruction_schema_identity": bstr .size 32, "obstruction_interpretation_identity": bstr .size 32, "operation_coordinate": echo-nonempty-tstr, diff --git a/schemas/edict-provider/package/v1/provider-manifest.echo.json b/schemas/edict-provider/package/v1/provider-manifest.echo.json index 30d6dd51..4fabbf1c 100644 --- a/schemas/edict-provider/package/v1/provider-manifest.echo.json +++ b/schemas/edict-provider/package/v1/provider-manifest.echo.json @@ -3,7 +3,7 @@ "providerAbi": "edict:target-provider@1.0.0", "provider": { "coordinate": "echo.edict-provider@1", - "digest": "sha256:d8d433725fbece1ba657cd456720c1b788344f9034b1735ab99cf209d835038a" + "digest": "sha256:a7ab6bfbbedc3a6b61a8559dc6506cfc3d2836b46dac3cc825e5b05b16b94fa5" }, "artifacts": [ { @@ -21,7 +21,7 @@ }, "generator": { "coordinate": "echo-wesley-gen.provider-artifact-generator@1", - "digest": "sha256:04f4674a16275a9f69d2cf0ea3c0e9d5fffb079698a633f9ccd4aef73d787770" + "digest": "sha256:4222f5b0950a8af9642894d651113283350e0d9d7a32559e80912d9d2dd76b52" } } }, @@ -40,7 +40,7 @@ }, "generator": { "coordinate": "echo-wesley-gen.provider-artifact-generator@1", - "digest": "sha256:04f4674a16275a9f69d2cf0ea3c0e9d5fffb079698a633f9ccd4aef73d787770" + "digest": "sha256:4222f5b0950a8af9642894d651113283350e0d9d7a32559e80912d9d2dd76b52" } } }, @@ -59,7 +59,7 @@ }, "generator": { "coordinate": "echo-wesley-gen.provider-artifact-generator@1", - "digest": "sha256:04f4674a16275a9f69d2cf0ea3c0e9d5fffb079698a633f9ccd4aef73d787770" + "digest": "sha256:4222f5b0950a8af9642894d651113283350e0d9d7a32559e80912d9d2dd76b52" } } }, @@ -78,7 +78,7 @@ }, "generator": { "coordinate": "echo-wesley-gen.provider-artifact-generator@1", - "digest": "sha256:04f4674a16275a9f69d2cf0ea3c0e9d5fffb079698a633f9ccd4aef73d787770" + "digest": "sha256:4222f5b0950a8af9642894d651113283350e0d9d7a32559e80912d9d2dd76b52" } } }, @@ -87,13 +87,13 @@ "artifactKind": "lowerer", "resource": { "coordinate": "echo.dpo.lowerer/component@1", - "digest": "sha256:f800df20b95c5a3dbb7682d3dbe545ac0fde29ad67430ab7038954a08b54047b" + "digest": "sha256:08277d4ba7d98e0b143c06c208abc306f133bda510caa5393da08aa490334a6e" }, "source": { "kind": "component", "component": { "coordinate": "echo.dpo.lowerer/component@1", - "digest": "sha256:f800df20b95c5a3dbb7682d3dbe545ac0fde29ad67430ab7038954a08b54047b" + "digest": "sha256:08277d4ba7d98e0b143c06c208abc306f133bda510caa5393da08aa490334a6e" } } }, @@ -102,7 +102,7 @@ "artifactKind": "generationProvenance", "resource": { "coordinate": "echo.edict-provider-generation-provenance@1", - "digest": "sha256:eac361e4ffa9ef4f45060b449fa2ccef7b0434df4d26a0408c358ffdd264a670" + "digest": "sha256:83840aab907b1189482a92f70a405602bf76715dc8e4fbffdc543db2d6151019" }, "source": { "kind": "generated", @@ -112,7 +112,7 @@ }, "generator": { "coordinate": "echo-wesley-gen.provider-artifact-generator@1", - "digest": "sha256:04f4674a16275a9f69d2cf0ea3c0e9d5fffb079698a633f9ccd4aef73d787770" + "digest": "sha256:4222f5b0950a8af9642894d651113283350e0d9d7a32559e80912d9d2dd76b52" } } }, @@ -121,7 +121,7 @@ "artifactKind": "reviewArtifact", "resource": { "coordinate": "echo.edict-provider-generation-review@1", - "digest": "sha256:6c98d739be1a26289e13a08aff00e08ec98d2374eacad01278d263020b779cbd" + "digest": "sha256:26b954ae9e2220a339c2dfb6673615aafb1567be19aa7ee38eefa6b34e18897d" }, "source": { "kind": "generated", @@ -131,7 +131,7 @@ }, "generator": { "coordinate": "echo-wesley-gen.provider-artifact-generator@1", - "digest": "sha256:04f4674a16275a9f69d2cf0ea3c0e9d5fffb079698a633f9ccd4aef73d787770" + "digest": "sha256:4222f5b0950a8af9642894d651113283350e0d9d7a32559e80912d9d2dd76b52" } } }, @@ -140,7 +140,7 @@ "artifactKind": "artifactSchema", "resource": { "coordinate": "echo.provider-artifacts.cddl@1", - "digest": "sha256:c604b7bf9e20db02dac9c010a01470d711335953cb31e6a603fb1e9cb818e8fa" + "digest": "sha256:6b9076ae02730797fddf60a93606df3de245a1c6bfbd845486799b7310d002a2" }, "source": { "kind": "generated", @@ -150,7 +150,7 @@ }, "generator": { "coordinate": "echo-wesley-gen.provider-artifact-generator@1", - "digest": "sha256:04f4674a16275a9f69d2cf0ea3c0e9d5fffb079698a633f9ccd4aef73d787770" + "digest": "sha256:4222f5b0950a8af9642894d651113283350e0d9d7a32559e80912d9d2dd76b52" } } }, @@ -169,7 +169,7 @@ }, "generator": { "coordinate": "echo-wesley-gen.provider-artifact-generator@1", - "digest": "sha256:04f4674a16275a9f69d2cf0ea3c0e9d5fffb079698a633f9ccd4aef73d787770" + "digest": "sha256:4222f5b0950a8af9642894d651113283350e0d9d7a32559e80912d9d2dd76b52" } } }, @@ -178,13 +178,13 @@ "artifactKind": "verifier", "resource": { "coordinate": "echo.dpo.verifier/component@1", - "digest": "sha256:edbef0fee8bb8b661b457674ce4d7eeb75e842f39eb823ae121ddb412ad20a56" + "digest": "sha256:744a511137608634b88abf7bd7e61da9bf81a5cacff7b190fc2530c346ba36cc" }, "source": { "kind": "component", "component": { "coordinate": "echo.dpo.verifier/component@1", - "digest": "sha256:edbef0fee8bb8b661b457674ce4d7eeb75e842f39eb823ae121ddb412ad20a56" + "digest": "sha256:744a511137608634b88abf7bd7e61da9bf81a5cacff7b190fc2530c346ba36cc" } } } diff --git a/xtask/src/provider_lowerer_component.rs b/xtask/src/provider_lowerer_component.rs index 41a97c40..982933c2 100644 --- a/xtask/src/provider_lowerer_component.rs +++ b/xtask/src/provider_lowerer_component.rs @@ -53,7 +53,7 @@ const PINNED_CARGO_COMMIT: &str = "840b83a10fb0e039a83f4d70ad032892c287570a"; /// Reviewed identity that the portable promotion command is permitted to install. pub(crate) const APPROVED_CHECKED_COMPONENT_SHA256: &str = - "f800df20b95c5a3dbb7682d3dbe545ac0fde29ad67430ab7038954a08b54047b"; + "08277d4ba7d98e0b143c06c208abc306f133bda510caa5393da08aa490334a6e"; pub(crate) const CHECKED_COMPONENT_REPOSITORY_PATH: &str = "schemas/edict-provider/components/v1/lowerer.echo-dpo.component.wasm"; @@ -62,7 +62,7 @@ pub(crate) const VERIFIER_CHECKED_COMPONENT_REPOSITORY_PATH: &str = "schemas/edict-provider/components/v1/verifier.echo-dpo.component.wasm"; /// Approved SHA-256 identity of the checked verifier component. pub(crate) const APPROVED_CHECKED_VERIFIER_COMPONENT_SHA256: &str = - "edbef0fee8bb8b661b457674ce4d7eeb75e842f39eb823ae121ddb412ad20a56"; + "744a511137608634b88abf7bd7e61da9bf81a5cacff7b190fc2530c346ba36cc"; #[derive(Clone, Copy, Debug, Eq, PartialEq)] struct ProviderComponentSpec { diff --git a/xtask/src/run_edict_operation.rs b/xtask/src/run_edict_operation.rs index 30bf3388..4ef8b4b8 100644 --- a/xtask/src/run_edict_operation.rs +++ b/xtask/src/run_edict_operation.rs @@ -44,7 +44,6 @@ const TARGET_IR_COORDINATE: &str = "echo.span-ir/v1"; const DIAGNOSTIC_ABI: &str = "edict.diagnostics/v1"; const NODE_ID_DERIVATION: &str = "sha256-utf8/v1"; const WARP_ID_SOURCE: &str = "action-lane/v1"; -const PRECONDITION_MISMATCH: &str = "echo.executable-operation/precondition-mismatch/v1"; /// Inputs needed to run one exact compiler-produced package. pub struct RunEdictOperationConfig { @@ -133,11 +132,12 @@ pub struct RecoveryReport { #[derive(Serialize)] #[serde(rename_all = "camelCase")] pub struct DuplicateReport { - pub obstruction: &'static str, + pub obstruction: String, } struct PackageMetadata { operation_coordinate: String, + obstruction_coordinate: String, lawpack_coordinate: String, lawpack_identity: [u8; 32], authority_profile_identity: [u8; 32], @@ -467,7 +467,7 @@ pub fn run(config: RunEdictOperationConfig) -> Result { Some(EchoOperationActionOutcomeV1::Obstructed(obstruction)) if obstruction.kind() == EchoOperationObstructionKindV1::PreconditionMismatch => { - PRECONDITION_MISMATCH + package.obstruction_coordinate.clone() } outcome => bail!("duplicate Action produced unexpected outcome: {outcome:?}"), }; @@ -604,6 +604,8 @@ fn parse_package(value: &CanonicalValueV1) -> Result { Ok(PackageMetadata { operation_coordinate: nonempty_text_field(value, "operation_coordinate", "package")? .to_owned(), + obstruction_coordinate: nonempty_text_field(value, "obstruction_coordinate", "package")? + .to_owned(), lawpack_coordinate: nonempty_text_field( semantic_closure, "lawpack_coordinate", diff --git a/xtask/tests/fixtures/edict-operation/ORIGIN.toml b/xtask/tests/fixtures/edict-operation/ORIGIN.toml index 74ab0a00..ffdb6d47 100644 --- a/xtask/tests/fixtures/edict-operation/ORIGIN.toml +++ b/xtask/tests/fixtures/edict-operation/ORIGIN.toml @@ -4,16 +4,16 @@ schema = "echo.edict-operation-fixture-origin/v1" repository = "https://github.com/flyingrobots/hello-echo" commit = "8dd96de482ffee8fa6efb2ebe508f649e1d878a7" edict_commit = "296bf1f6c76af1e011f5214b6d3de260c67ca84a" -echo_commit = "eb0abb6ea90d1968e5d10922dc6d88eb7b361460" +echo_commit = "f324ae18226f685fe8ff2f3f6c57d2592fbd0c1d" build_command = "EDICT_REPO= ECHO_REPO= ./tests/build.sh" [artifacts.executable_operation_package] path = ".build/application/executable-operation-package.cbor" -sha256 = "8a602e9bf2dfeae1a3bc033d299dc7b6b348a08c777756c7b1b855bd099dab93" +sha256 = "67dc6d23e223e78b6aa774a2f57c86db2eff4981ea793975d39c66f731f02fd1" [artifacts.verification_report] path = ".build/application/verification-report.cbor" -sha256 = "8a72bff53649a448d7f880ed27bb21a52daab3a43eb2e0579e46ac35296e34dd" +sha256 = "8a5153b4ec25ebe979f0ceab373d03969e30a64d7973b3a83e3c84877c5aa564" [artifacts.lawpack_manifest] path = "vendor/causal-cell/manifest.cbor" diff --git a/xtask/tests/fixtures/edict-operation/executable-operation-package.cbor b/xtask/tests/fixtures/edict-operation/executable-operation-package.cbor index a9927311..e6d4d055 100644 Binary files a/xtask/tests/fixtures/edict-operation/executable-operation-package.cbor and b/xtask/tests/fixtures/edict-operation/executable-operation-package.cbor differ diff --git a/xtask/tests/fixtures/edict-operation/verification-report.cbor b/xtask/tests/fixtures/edict-operation/verification-report.cbor index 4a3179e8..df5a2d02 100644 Binary files a/xtask/tests/fixtures/edict-operation/verification-report.cbor and b/xtask/tests/fixtures/edict-operation/verification-report.cbor differ diff --git a/xtask/tests/run_edict_operation.rs b/xtask/tests/run_edict_operation.rs index b979a652..8f69e07b 100644 --- a/xtask/tests/run_edict_operation.rs +++ b/xtask/tests/run_edict_operation.rs @@ -160,7 +160,7 @@ fn compiler_emitted_operation_runs_durably_without_native_callbacks() { assert_eq!(report["artifacts"]["package"]["algorithm"], "sha256"); assert_eq!( report["artifacts"]["package"]["digestHex"], - "8a602e9bf2dfeae1a3bc033d299dc7b6b348a08c777756c7b1b855bd099dab93" + "67dc6d23e223e78b6aa774a2f57c86db2eff4981ea793975d39c66f731f02fd1" ); assert_eq!( report["artifacts"]["verificationReport"]["algorithm"], @@ -168,7 +168,7 @@ fn compiler_emitted_operation_runs_durably_without_native_callbacks() { ); assert_eq!( report["artifacts"]["verificationReport"]["digestHex"], - "8a72bff53649a448d7f880ed27bb21a52daab3a43eb2e0579e46ac35296e34dd" + "8a5153b4ec25ebe979f0ceab373d03969e30a64d7973b3a83e3c84877c5aa564" ); assert_eq!( report["artifacts"]["lawpackManifest"]["algorithm"], @@ -214,7 +214,7 @@ fn compiler_emitted_operation_runs_durably_without_native_callbacks() { assert_eq!(report["recovery"]["receiptRecovered"], true); assert_eq!( report["duplicate"]["obstruction"], - "echo.executable-operation/precondition-mismatch/v1" + "causal.cell@1.AlreadyExists" ); assert_eq!( report["recovery"]["mutatedInitialStateRefusal"], @@ -490,7 +490,7 @@ fn fixed_seed_keys_preserve_the_generic_durable_witness_under_bounded_stress() { ); assert_eq!( report["duplicate"]["obstruction"], - "echo.executable-operation/precondition-mismatch/v1" + "causal.cell@1.AlreadyExists" ); } assert_eq!(retained_receipts.len(), CASES);