lib

Core libraries for Radroots
git clone https://radroots.dev/git/lib.git
Log | Files | Refs | README

commit e0a5e2ac1742e90daa5ee5bd2a41c60bbc17046b
parent 9101d82b79c6c12ec680fdd240239f09d3a796cb
Author: triesap <tyson@radroots.org>
Date:   Tue, 28 Jul 2026 16:23:13 +0000

protocol: move generated DTO authority to protocol

- Bind codegen inputs to the five final radroots_protocol versioned modules.
- Generate deterministic inventories for 53 serialized types and 121 schemas with source hashes.
- Remove the compatibility protocol package public dto-bindgen feature and dependency.
- Enforce freshness in contract/release paths and pass no-std, WASM, lint, and full closure.

Diffstat:
MCargo.lock | 2+-
Acontracts/codegen/protocol_v1.inventory.json | 862+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Acontracts/codegen/protocol_v1.inventory.sha256 | 1+
Acontracts/codegen/protocol_v1.toml | 25+++++++++++++++++++++++++
Mcrates/event_store/contracts/source_maintenance_v1.manifest.json | 8++++----
Mcrates/event_store/contracts/source_maintenance_v1.manifest.sha256 | 2+-
Mcrates/event_store/src/generated/source_maintenance_manifest.rs | 4++--
Mcrates/protocol_contract_v1/Cargo.toml | 2--
Mcrates/protocol_contract_v1/src/lib.rs | 59-----------------------------------------------------------
Mcrates/protocol_contract_v1/tests/successor_equivalence.rs | 9++++-----
Mtools/xtask/Cargo.toml | 1+
Mtools/xtask/src/contract/source_maintenance.rs | 54+++++++++++++++++++++++++++++++++++++++++++++++++++---
Atools/xtask/src/generate/mod.rs | 10++++++++++
Atools/xtask/src/generate/protocol.rs | 490+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Mtools/xtask/src/main.rs | 15+++++++++++++++
15 files changed, 1467 insertions(+), 77 deletions(-)

diff --git a/Cargo.lock b/Cargo.lock @@ -4826,7 +4826,6 @@ dependencies = [ name = "radroots_protocol_contract_v1" version = "1.0.0-alpha.1" dependencies = [ - "dto_bindgen", "radroots_protocol", "serde", "serde_json", @@ -9028,6 +9027,7 @@ dependencies = [ "proc-macro2", "quote", "radroots_event_codec", + "radroots_protocol", "radroots_protocol_contract_v1", "semver", "serde", diff --git a/contracts/codegen/protocol_v1.inventory.json b/contracts/codegen/protocol_v1.inventory.json @@ -0,0 +1,862 @@ +{ + "schema_version": 1, + "generator": "radroots_xtask.protocol_codegen.v1", + "package": "radroots_protocol", + "source_hash_algorithm": "sha256_bytes_v1", + "sources": [ + { + "module": "capability::v1", + "path": "crates/protocol/src/capability/v1.rs", + "sha256": "8a50dc841ced8e5f4fea18cd248f2a170b8e4e51175511a82ac5c6213c768ba3", + "types": [ + { + "rust_path": "radroots_protocol::capability::v1::Availability", + "kind": "enum" + }, + { + "rust_path": "radroots_protocol::capability::v1::Maturity", + "kind": "enum" + }, + { + "rust_path": "radroots_protocol::capability::v1::MeshScopeId", + "kind": "struct" + }, + { + "rust_path": "radroots_protocol::capability::v1::ReticulumDestination", + "kind": "struct" + }, + { + "rust_path": "radroots_protocol::capability::v1::ReticulumTarget", + "kind": "struct" + }, + { + "rust_path": "radroots_protocol::capability::v1::TransportDescriptor", + "kind": "struct" + }, + { + "rust_path": "radroots_protocol::capability::v1::TransportKind", + "kind": "enum" + } + ] + }, + { + "module": "error::v1", + "path": "crates/protocol/src/error/v1.rs", + "sha256": "59553954506a56aca8c2cdef385b67e593514f846bbda3ac38907f73f58a8da6", + "types": [ + { + "rust_path": "radroots_protocol::error::v1::CapabilityId", + "kind": "struct" + }, + { + "rust_path": "radroots_protocol::error::v1::Class", + "kind": "enum" + }, + { + "rust_path": "radroots_protocol::error::v1::Code", + "kind": "struct" + }, + { + "rust_path": "radroots_protocol::error::v1::Detail", + "kind": "struct" + }, + { + "rust_path": "radroots_protocol::error::v1::DetailValue", + "kind": "enum" + }, + { + "rust_path": "radroots_protocol::error::v1::ErrorReport", + "kind": "struct" + }, + { + "rust_path": "radroots_protocol::error::v1::RecoveryAction", + "kind": "enum" + }, + { + "rust_path": "radroots_protocol::error::v1::SafeDetails", + "kind": "struct" + }, + { + "rust_path": "radroots_protocol::error::v1::SafeMessage", + "kind": "struct" + } + ] + }, + { + "module": "event::v1", + "path": "crates/protocol/src/event/v1.rs", + "sha256": "d2f7ec742d7481d914be2e659d0733c87c960d64260a62e9310a745cf26e043d", + "types": [ + { + "rust_path": "radroots_protocol::event::v1::EventClass", + "kind": "enum" + }, + { + "rust_path": "radroots_protocol::event::v1::EventDescriptor", + "kind": "struct" + }, + { + "rust_path": "radroots_protocol::event::v1::TradeState", + "kind": "enum" + } + ] + }, + { + "module": "radrootsd::transport_publish::v5", + "path": "crates/protocol/src/radrootsd/transport_publish/v5.rs", + "sha256": "c0c07645d3542f083847e601ba9af78579d22a5930dee649055a7a386bb8c42d", + "types": [ + { + "rust_path": "radroots_protocol::radrootsd::transport_publish::v5::AuthCapabilities", + "kind": "struct" + }, + { + "rust_path": "radroots_protocol::radrootsd::transport_publish::v5::Capabilities", + "kind": "struct" + }, + { + "rust_path": "radroots_protocol::radrootsd::transport_publish::v5::CapabilityAvailability", + "kind": "enum" + }, + { + "rust_path": "radroots_protocol::radrootsd::transport_publish::v5::CapabilityMaturity", + "kind": "enum" + }, + { + "rust_path": "radroots_protocol::radrootsd::transport_publish::v5::DeliveryPolicy", + "kind": "enum" + }, + { + "rust_path": "radroots_protocol::radrootsd::transport_publish::v5::DeliveryPolicyName", + "kind": "enum" + }, + { + "rust_path": "radroots_protocol::radrootsd::transport_publish::v5::EventRequest", + "kind": "struct" + }, + { + "rust_path": "radroots_protocol::radrootsd::transport_publish::v5::EventResponse", + "kind": "struct" + }, + { + "rust_path": "radroots_protocol::radrootsd::transport_publish::v5::Implementation", + "kind": "enum" + }, + { + "rust_path": "radroots_protocol::radrootsd::transport_publish::v5::Job", + "kind": "struct" + }, + { + "rust_path": "radroots_protocol::radrootsd::transport_publish::v5::JobStatus", + "kind": "enum" + }, + { + "rust_path": "radroots_protocol::radrootsd::transport_publish::v5::NostrTargetSourcePolicy", + "kind": "enum" + }, + { + "rust_path": "radroots_protocol::radrootsd::transport_publish::v5::OperationCapabilities", + "kind": "struct" + }, + { + "rust_path": "radroots_protocol::radrootsd::transport_publish::v5::OutcomeKind", + "kind": "enum" + }, + { + "rust_path": "radroots_protocol::radrootsd::transport_publish::v5::ReticulumBehavior", + "kind": "enum" + }, + { + "rust_path": "radroots_protocol::radrootsd::transport_publish::v5::SurfaceCapabilities", + "kind": "struct" + }, + { + "rust_path": "radroots_protocol::radrootsd::transport_publish::v5::Target", + "kind": "struct" + }, + { + "rust_path": "radroots_protocol::radrootsd::transport_publish::v5::TargetFingerprint", + "kind": "struct" + }, + { + "rust_path": "radroots_protocol::radrootsd::transport_publish::v5::TargetOutcome", + "kind": "struct" + }, + { + "rust_path": "radroots_protocol::radrootsd::transport_publish::v5::TargetPolicy", + "kind": "enum" + }, + { + "rust_path": "radroots_protocol::radrootsd::transport_publish::v5::TargetPolicyName", + "kind": "enum" + }, + { + "rust_path": "radroots_protocol::radrootsd::transport_publish::v5::TargetSource", + "kind": "enum" + }, + { + "rust_path": "radroots_protocol::radrootsd::transport_publish::v5::TransportCapability", + "kind": "struct" + } + ] + }, + { + "module": "runtime::v1", + "path": "crates/protocol/src/runtime/v1.rs", + "sha256": "94157d512a1ea152685529f9a3e5cb23da95db6e2271b09f1c9f835c14703743", + "types": [ + { + "rust_path": "radroots_protocol::runtime::v1::ApprovalRequirement", + "kind": "enum" + }, + { + "rust_path": "radroots_protocol::runtime::v1::DeadlinePolicy", + "kind": "enum" + }, + { + "rust_path": "radroots_protocol::runtime::v1::DryRunSupport", + "kind": "enum" + }, + { + "rust_path": "radroots_protocol::runtime::v1::IdempotencyPolicy", + "kind": "enum" + }, + { + "rust_path": "radroots_protocol::runtime::v1::Mutability", + "kind": "enum" + }, + { + "rust_path": "radroots_protocol::runtime::v1::OperationDescriptor", + "kind": "struct" + }, + { + "rust_path": "radroots_protocol::runtime::v1::PrivacyEffect", + "kind": "enum" + }, + { + "rust_path": "radroots_protocol::runtime::v1::ProjectionEffect", + "kind": "enum" + }, + { + "rust_path": "radroots_protocol::runtime::v1::Risk", + "kind": "enum" + }, + { + "rust_path": "radroots_protocol::runtime::v1::SignerRequirement", + "kind": "enum" + }, + { + "rust_path": "radroots_protocol::runtime::v1::TransportRoute", + "kind": "struct" + } + ] + } + ], + "schemas": [ + { + "schema_id": "radroots.protocol.error_report.v1", + "module": "error::v1", + "generation": 1 + }, + { + "schema_id": "radroots.protocol.event_descriptor.v1", + "module": "event::v1", + "generation": 1 + }, + { + "schema_id": "radroots.protocol.reticulum_target.v1", + "module": "capability::v1", + "generation": 1 + }, + { + "schema_id": "radroots.protocol.trade_state.v1", + "module": "event::v1", + "generation": 1 + }, + { + "schema_id": "radroots.protocol.transport_capability_descriptor.v1", + "module": "capability::v1", + "generation": 1 + }, + { + "schema_id": "radroots.protocol.transport_kind.v1", + "module": "capability::v1", + "generation": 1 + }, + { + "schema_id": "radroots.runtime.account.create.receipt.v1", + "module": "runtime::v1", + "generation": 1 + }, + { + "schema_id": "radroots.runtime.account.create.request.v1", + "module": "runtime::v1", + "generation": 1 + }, + { + "schema_id": "radroots.runtime.account.import.receipt.v1", + "module": "runtime::v1", + "generation": 1 + }, + { + "schema_id": "radroots.runtime.account.import.request.v1", + "module": "runtime::v1", + "generation": 1 + }, + { + "schema_id": "radroots.runtime.account.list.receipt.v1", + "module": "runtime::v1", + "generation": 1 + }, + { + "schema_id": "radroots.runtime.account.list.request.v1", + "module": "runtime::v1", + "generation": 1 + }, + { + "schema_id": "radroots.runtime.account.remove.receipt.v1", + "module": "runtime::v1", + "generation": 1 + }, + { + "schema_id": "radroots.runtime.account.remove.request.v1", + "module": "runtime::v1", + "generation": 1 + }, + { + "schema_id": "radroots.runtime.account.select.receipt.v1", + "module": "runtime::v1", + "generation": 1 + }, + { + "schema_id": "radroots.runtime.account.select.request.v1", + "module": "runtime::v1", + "generation": 1 + }, + { + "schema_id": "radroots.runtime.basket.create.receipt.v1", + "module": "runtime::v1", + "generation": 1 + }, + { + "schema_id": "radroots.runtime.basket.create.request.v1", + "module": "runtime::v1", + "generation": 1 + }, + { + "schema_id": "radroots.runtime.basket.get.receipt.v1", + "module": "runtime::v1", + "generation": 1 + }, + { + "schema_id": "radroots.runtime.basket.get.request.v1", + "module": "runtime::v1", + "generation": 1 + }, + { + "schema_id": "radroots.runtime.basket.item.add.receipt.v1", + "module": "runtime::v1", + "generation": 1 + }, + { + "schema_id": "radroots.runtime.basket.item.add.request.v1", + "module": "runtime::v1", + "generation": 1 + }, + { + "schema_id": "radroots.runtime.basket.item.remove.receipt.v1", + "module": "runtime::v1", + "generation": 1 + }, + { + "schema_id": "radroots.runtime.basket.item.remove.request.v1", + "module": "runtime::v1", + "generation": 1 + }, + { + "schema_id": "radroots.runtime.basket.item.update.receipt.v1", + "module": "runtime::v1", + "generation": 1 + }, + { + "schema_id": "radroots.runtime.basket.item.update.request.v1", + "module": "runtime::v1", + "generation": 1 + }, + { + "schema_id": "radroots.runtime.basket.list.receipt.v1", + "module": "runtime::v1", + "generation": 1 + }, + { + "schema_id": "radroots.runtime.basket.list.request.v1", + "module": "runtime::v1", + "generation": 1 + }, + { + "schema_id": "radroots.runtime.basket.quote.receipt.v1", + "module": "runtime::v1", + "generation": 1 + }, + { + "schema_id": "radroots.runtime.basket.quote.request.v1", + "module": "runtime::v1", + "generation": 1 + }, + { + "schema_id": "radroots.runtime.diagnostics.inspect.receipt.v1", + "module": "runtime::v1", + "generation": 1 + }, + { + "schema_id": "radroots.runtime.diagnostics.inspect.request.v1", + "module": "runtime::v1", + "generation": 1 + }, + { + "schema_id": "radroots.runtime.farm.create.receipt.v1", + "module": "runtime::v1", + "generation": 1 + }, + { + "schema_id": "radroots.runtime.farm.create.request.v1", + "module": "runtime::v1", + "generation": 1 + }, + { + "schema_id": "radroots.runtime.farm.get.receipt.v1", + "module": "runtime::v1", + "generation": 1 + }, + { + "schema_id": "radroots.runtime.farm.get.request.v1", + "module": "runtime::v1", + "generation": 1 + }, + { + "schema_id": "radroots.runtime.farm.list.receipt.v1", + "module": "runtime::v1", + "generation": 1 + }, + { + "schema_id": "radroots.runtime.farm.list.request.v1", + "module": "runtime::v1", + "generation": 1 + }, + { + "schema_id": "radroots.runtime.farm.publish.receipt.v1", + "module": "runtime::v1", + "generation": 1 + }, + { + "schema_id": "radroots.runtime.farm.publish.request.v1", + "module": "runtime::v1", + "generation": 1 + }, + { + "schema_id": "radroots.runtime.farm.update.receipt.v1", + "module": "runtime::v1", + "generation": 1 + }, + { + "schema_id": "radroots.runtime.farm.update.request.v1", + "module": "runtime::v1", + "generation": 1 + }, + { + "schema_id": "radroots.runtime.health.inspect.receipt.v1", + "module": "runtime::v1", + "generation": 1 + }, + { + "schema_id": "radroots.runtime.health.inspect.request.v1", + "module": "runtime::v1", + "generation": 1 + }, + { + "schema_id": "radroots.runtime.listing.create.receipt.v1", + "module": "runtime::v1", + "generation": 1 + }, + { + "schema_id": "radroots.runtime.listing.create.request.v1", + "module": "runtime::v1", + "generation": 1 + }, + { + "schema_id": "radroots.runtime.listing.get.receipt.v1", + "module": "runtime::v1", + "generation": 1 + }, + { + "schema_id": "radroots.runtime.listing.get.request.v1", + "module": "runtime::v1", + "generation": 1 + }, + { + "schema_id": "radroots.runtime.listing.list.receipt.v1", + "module": "runtime::v1", + "generation": 1 + }, + { + "schema_id": "radroots.runtime.listing.list.request.v1", + "module": "runtime::v1", + "generation": 1 + }, + { + "schema_id": "radroots.runtime.listing.pause.receipt.v1", + "module": "runtime::v1", + "generation": 1 + }, + { + "schema_id": "radroots.runtime.listing.pause.request.v1", + "module": "runtime::v1", + "generation": 1 + }, + { + "schema_id": "radroots.runtime.listing.publish.receipt.v1", + "module": "runtime::v1", + "generation": 1 + }, + { + "schema_id": "radroots.runtime.listing.publish.request.v1", + "module": "runtime::v1", + "generation": 1 + }, + { + "schema_id": "radroots.runtime.listing.update.receipt.v1", + "module": "runtime::v1", + "generation": 1 + }, + { + "schema_id": "radroots.runtime.listing.update.request.v1", + "module": "runtime::v1", + "generation": 1 + }, + { + "schema_id": "radroots.runtime.listing.withdraw.receipt.v1", + "module": "runtime::v1", + "generation": 1 + }, + { + "schema_id": "radroots.runtime.listing.withdraw.request.v1", + "module": "runtime::v1", + "generation": 1 + }, + { + "schema_id": "radroots.runtime.market.get.receipt.v1", + "module": "runtime::v1", + "generation": 1 + }, + { + "schema_id": "radroots.runtime.market.get.request.v1", + "module": "runtime::v1", + "generation": 1 + }, + { + "schema_id": "radroots.runtime.market.pull.receipt.v1", + "module": "runtime::v1", + "generation": 1 + }, + { + "schema_id": "radroots.runtime.market.pull.request.v1", + "module": "runtime::v1", + "generation": 1 + }, + { + "schema_id": "radroots.runtime.market.search.receipt.v1", + "module": "runtime::v1", + "generation": 1 + }, + { + "schema_id": "radroots.runtime.market.search.request.v1", + "module": "runtime::v1", + "generation": 1 + }, + { + "schema_id": "radroots.runtime.profile.inspect.receipt.v1", + "module": "runtime::v1", + "generation": 1 + }, + { + "schema_id": "radroots.runtime.profile.inspect.request.v1", + "module": "runtime::v1", + "generation": 1 + }, + { + "schema_id": "radroots.runtime.profile.reset.receipt.v1", + "module": "runtime::v1", + "generation": 1 + }, + { + "schema_id": "radroots.runtime.profile.reset.request.v1", + "module": "runtime::v1", + "generation": 1 + }, + { + "schema_id": "radroots.runtime.signer.status.receipt.v1", + "module": "runtime::v1", + "generation": 1 + }, + { + "schema_id": "radroots.runtime.signer.status.request.v1", + "module": "runtime::v1", + "generation": 1 + }, + { + "schema_id": "radroots.runtime.store.backup.receipt.v1", + "module": "runtime::v1", + "generation": 1 + }, + { + "schema_id": "radroots.runtime.store.backup.request.v1", + "module": "runtime::v1", + "generation": 1 + }, + { + "schema_id": "radroots.runtime.store.inspect.receipt.v1", + "module": "runtime::v1", + "generation": 1 + }, + { + "schema_id": "radroots.runtime.store.inspect.request.v1", + "module": "runtime::v1", + "generation": 1 + }, + { + "schema_id": "radroots.runtime.store.restore.receipt.v1", + "module": "runtime::v1", + "generation": 1 + }, + { + "schema_id": "radroots.runtime.store.restore.request.v1", + "module": "runtime::v1", + "generation": 1 + }, + { + "schema_id": "radroots.runtime.sync.pull.receipt.v1", + "module": "runtime::v1", + "generation": 1 + }, + { + "schema_id": "radroots.runtime.sync.pull.request.v1", + "module": "runtime::v1", + "generation": 1 + }, + { + "schema_id": "radroots.runtime.sync.push.receipt.v1", + "module": "runtime::v1", + "generation": 1 + }, + { + "schema_id": "radroots.runtime.sync.push.request.v1", + "module": "runtime::v1", + "generation": 1 + }, + { + "schema_id": "radroots.runtime.sync.status.receipt.v1", + "module": "runtime::v1", + "generation": 1 + }, + { + "schema_id": "radroots.runtime.sync.status.request.v1", + "module": "runtime::v1", + "generation": 1 + }, + { + "schema_id": "radroots.runtime.trade.cancellation.submit.receipt.v1", + "module": "runtime::v1", + "generation": 1 + }, + { + "schema_id": "radroots.runtime.trade.cancellation.submit.request.v1", + "module": "runtime::v1", + "generation": 1 + }, + { + "schema_id": "radroots.runtime.trade.candidate.decide.receipt.v1", + "module": "runtime::v1", + "generation": 1 + }, + { + "schema_id": "radroots.runtime.trade.candidate.decide.request.v1", + "module": "runtime::v1", + "generation": 1 + }, + { + "schema_id": "radroots.runtime.trade.evidence.inspect.receipt.v1", + "module": "runtime::v1", + "generation": 1 + }, + { + "schema_id": "radroots.runtime.trade.evidence.inspect.request.v1", + "module": "runtime::v1", + "generation": 1 + }, + { + "schema_id": "radroots.runtime.trade.evidence.refresh.receipt.v1", + "module": "runtime::v1", + "generation": 1 + }, + { + "schema_id": "radroots.runtime.trade.evidence.refresh.request.v1", + "module": "runtime::v1", + "generation": 1 + }, + { + "schema_id": "radroots.runtime.trade.get.receipt.v1", + "module": "runtime::v1", + "generation": 1 + }, + { + "schema_id": "radroots.runtime.trade.get.request.v1", + "module": "runtime::v1", + "generation": 1 + }, + { + "schema_id": "radroots.runtime.trade.list.receipt.v1", + "module": "runtime::v1", + "generation": 1 + }, + { + "schema_id": "radroots.runtime.trade.list.request.v1", + "module": "runtime::v1", + "generation": 1 + }, + { + "schema_id": "radroots.runtime.trade.operation.resume.receipt.v1", + "module": "runtime::v1", + "generation": 1 + }, + { + "schema_id": "radroots.runtime.trade.operation.resume.request.v1", + "module": "runtime::v1", + "generation": 1 + }, + { + "schema_id": "radroots.runtime.trade.private_artifact.delete.receipt.v1", + "module": "runtime::v1", + "generation": 1 + }, + { + "schema_id": "radroots.runtime.trade.private_artifact.delete.request.v1", + "module": "runtime::v1", + "generation": 1 + }, + { + "schema_id": "radroots.runtime.trade.private_artifact.open.receipt.v1", + "module": "runtime::v1", + "generation": 1 + }, + { + "schema_id": "radroots.runtime.trade.private_artifact.open.request.v1", + "module": "runtime::v1", + "generation": 1 + }, + { + "schema_id": "radroots.runtime.trade.private_artifact.seal.receipt.v1", + "module": "runtime::v1", + "generation": 1 + }, + { + "schema_id": "radroots.runtime.trade.private_artifact.seal.request.v1", + "module": "runtime::v1", + "generation": 1 + }, + { + "schema_id": "radroots.runtime.trade.proposal.submit.receipt.v1", + "module": "runtime::v1", + "generation": 1 + }, + { + "schema_id": "radroots.runtime.trade.proposal.submit.request.v1", + "module": "runtime::v1", + "generation": 1 + }, + { + "schema_id": "radroots.runtime.trade.revision.propose.receipt.v1", + "module": "runtime::v1", + "generation": 1 + }, + { + "schema_id": "radroots.runtime.trade.revision.propose.request.v1", + "module": "runtime::v1", + "generation": 1 + }, + { + "schema_id": "radroots.runtime.transport.capability.list.receipt.v1", + "module": "runtime::v1", + "generation": 1 + }, + { + "schema_id": "radroots.runtime.transport.capability.list.request.v1", + "module": "runtime::v1", + "generation": 1 + }, + { + "schema_id": "radroots.runtime.transport.config.inspect.receipt.v1", + "module": "runtime::v1", + "generation": 1 + }, + { + "schema_id": "radroots.runtime.transport.config.inspect.request.v1", + "module": "runtime::v1", + "generation": 1 + }, + { + "schema_id": "radroots.runtime.transport.config.update.receipt.v1", + "module": "runtime::v1", + "generation": 1 + }, + { + "schema_id": "radroots.runtime.transport.config.update.request.v1", + "module": "runtime::v1", + "generation": 1 + }, + { + "schema_id": "radroots.runtime.transport.delivery.inspect.receipt.v1", + "module": "runtime::v1", + "generation": 1 + }, + { + "schema_id": "radroots.runtime.transport.delivery.inspect.request.v1", + "module": "runtime::v1", + "generation": 1 + }, + { + "schema_id": "radroots.runtime.transport.delivery.retry.receipt.v1", + "module": "runtime::v1", + "generation": 1 + }, + { + "schema_id": "radroots.runtime.transport.delivery.retry.request.v1", + "module": "runtime::v1", + "generation": 1 + }, + { + "schema_id": "radroots.runtime.transport.status.inspect.receipt.v1", + "module": "runtime::v1", + "generation": 1 + }, + { + "schema_id": "radroots.runtime.transport.status.inspect.request.v1", + "module": "runtime::v1", + "generation": 1 + }, + { + "schema_id": "radroots.runtime.validation.status.receipt.v1", + "module": "runtime::v1", + "generation": 1 + }, + { + "schema_id": "radroots.runtime.validation.status.request.v1", + "module": "runtime::v1", + "generation": 1 + }, + { + "schema_id": "radrootsd.transport_publish.v5", + "module": "radrootsd::transport_publish::v5", + "generation": 5 + } + ] +} diff --git a/contracts/codegen/protocol_v1.inventory.sha256 b/contracts/codegen/protocol_v1.inventory.sha256 @@ -0,0 +1 @@ +e1abc485a0c89c70f2be99f275c535e6b2df6e8abac312ef5c7925593d320bb6 diff --git a/contracts/codegen/protocol_v1.toml b/contracts/codegen/protocol_v1.toml @@ -0,0 +1,25 @@ +schema_version = 1 +package = "radroots_protocol" +source_hash_algorithm = "sha256_bytes_v1" +inventory_path = "contracts/codegen/protocol_v1.inventory.json" +inventory_sha256_path = "contracts/codegen/protocol_v1.inventory.sha256" + +[[source]] +module = "capability::v1" +path = "crates/protocol/src/capability/v1.rs" + +[[source]] +module = "error::v1" +path = "crates/protocol/src/error/v1.rs" + +[[source]] +module = "event::v1" +path = "crates/protocol/src/event/v1.rs" + +[[source]] +module = "radrootsd::transport_publish::v5" +path = "crates/protocol/src/radrootsd/transport_publish/v5.rs" + +[[source]] +module = "runtime::v1" +path = "crates/protocol/src/runtime/v1.rs" diff --git a/crates/event_store/contracts/source_maintenance_v1.manifest.json b/crates/event_store/contracts/source_maintenance_v1.manifest.json @@ -691,8 +691,8 @@ { "role": "source_maintenance_governance", "path": "tools/xtask/src/contract/source_maintenance.rs", - "byte_length": 188436, - "sha256": "ce21d4d200142b361ee0f65bd8063a461fd01f016e92eec7f6576863a0856b05", + "byte_length": 190367, + "sha256": "17476b4253f108f49f9c4be82205c6fe2e31b5ce151f34d9775fc27c8e7b6bb7", "hash_algorithm": "sha256_bytes_v1" }, { @@ -705,8 +705,8 @@ { "role": "xtask_dispatch_and_release_preflight", "path": "tools/xtask/src/main.rs", - "byte_length": 15109, - "sha256": "bf721ecaa94225908496f247bf65011e669aa61b732594c23d64e306b4ac38cc", + "byte_length": 15786, + "sha256": "6bffd4851031c75b1b77593c498ae0758901dae06c25e1449c7f2cc58125bde8", "hash_algorithm": "sha256_bytes_v1" } ], diff --git a/crates/event_store/contracts/source_maintenance_v1.manifest.sha256 b/crates/event_store/contracts/source_maintenance_v1.manifest.sha256 @@ -1 +1 @@ -22cc195ee967cec226d47948f005fa4689da276a00c3bbce187d76b1d7dbf6b4 +10e969687cc2a034ed5c190d037f81268efc4fff45abe87959ff96875e8ba057 diff --git a/crates/event_store/src/generated/source_maintenance_manifest.rs b/crates/event_store/src/generated/source_maintenance_manifest.rs @@ -1,8 +1,8 @@ // @generated by `cargo xtask contract source-maintenance-manifest --write`; do not edit. -pub(crate) const SOURCE_MAINTENANCE_MANIFEST_JSON: &str = "{\n \"schema_version\": 1,\n \"contract_id\": \"radroots_event_store.source_maintenance_v1\",\n \"hook_id\": \"source_maintenance_v1\",\n \"manifest_schema\": {\n \"path\": \"crates/event_store/contracts/source_maintenance_v1.manifest.schema.json\",\n \"byte_length\": 12315,\n \"sha256\": \"96ea98a5abf3348b61565954cd34f2c622411d8dd34205ef04134bbe0e3d3f2b\",\n \"hash_algorithm\": \"sha256_bytes_v1\"\n },\n \"predecessor\": {\n \"hook_id\": \"food_availability_projection_v1\",\n \"manifest\": {\n \"path\": \"crates/event_store/contracts/food_availability_projection_v1.manifest.json\",\n \"byte_length\": 17455,\n \"sha256\": \"02dfe1b450fbdac16e718888215b4dd5c85d8975440fa21e8f439fb24c2b2990\",\n \"hash_algorithm\": \"sha256_bytes_v1\"\n }\n },\n \"migration\": {\n \"version\": 4,\n \"name\": \"source_maintenance\",\n \"up\": {\n \"path\": \"crates/event_store/migrations/0004_source_maintenance.up.sql\",\n \"byte_length\": 19841,\n \"sha256\": \"ab2724188f8d08c897eebea2533a635e7c74282a25e84e4c0c37e78b08837a43\",\n \"hash_algorithm\": \"sha256_bytes_v1\"\n },\n \"down\": {\n \"path\": \"crates/event_store/migrations/0004_source_maintenance.down.sql\",\n \"byte_length\": 5172,\n \"sha256\": \"fe44fd53c51545c08ea479b385e6781079dab70fc63da2a3c205d727a00ce860\",\n \"hash_algorithm\": \"sha256_bytes_v1\"\n },\n \"schema_sha256\": \"074f85b663444ac150239ecd8441ea4a96ad83a798a55e22d2e5e2f7ee943a8c\",\n \"catalog\": {\n \"objects\": [\n \"radroots_event_store_source_capacity_delete_guard\",\n \"radroots_event_store_source_capacity_insert_guard\",\n \"radroots_event_store_source_capacity_marker_close_guard\",\n \"radroots_event_store_source_capacity_update_guard\",\n \"radroots_event_store_source_capacity_v1\",\n \"radroots_event_store_source_generation_capacity_advance\",\n \"radroots_event_store_source_generation_capacity_guard\"\n ],\n \"replaced_objects\": [\n \"radroots_event_store_food_availability_image_delete_guard\",\n \"radroots_event_store_food_availability_projection_delete_guard\",\n \"radroots_event_store_source_rebuild_marker_insert_guard\"\n ],\n \"tables\": [\n \"radroots_event_store_source_capacity_v1\"\n ],\n \"fts5_tables\": []\n }\n },\n \"source_maintenance\": {\n \"version\": 1,\n \"event_contract_registry_version\": 7,\n \"capacity_authority_id\": \"radroots_event_store_source_capacity_v1\",\n \"accounting\": {\n \"algorithm\": \"sqlite_cast_blob_octet_sum_v1\",\n \"raw_event_columns\": [\n \"event_id\",\n \"pubkey\",\n \"tags_json\",\n \"content\",\n \"sig\",\n \"raw_json\"\n ],\n \"raw_tag_columns\": [\n \"event_id\",\n \"tag_name\",\n \"tag_value\",\n \"tag_json\"\n ],\n \"nullable_raw_tag_columns\": [\n \"tag_value\"\n ]\n },\n \"limits\": {\n \"raw_events\": 25000,\n \"raw_tags\": 250000,\n \"raw_event_text_bytes\": 67108864,\n \"raw_tag_text_bytes\": 33554432,\n \"retained_source_generations\": 8\n },\n \"reopen_validation\": {\n \"mode\": \"bounded_full_raw_recount_v1\",\n \"raw_event_rejection_scan_bound\": 25001,\n \"raw_tag_rejection_scan_bound\": 250001,\n \"generation_history_validation\": \"bounded_count_plus_active_ordinal_v1\",\n \"retained_generation_rejection_scan_bound\": 9\n },\n \"rebuild_seal\": {\n \"nip09_hook_id\": \"nip09_reconciliation_v1\",\n \"nip09_manifest_sha256\": \"74af832420ffbaa9805e89df3c0b34f126a443e1598f757e3372f407f9003b77\",\n \"food_hook_id\": \"food_availability_projection_v1\",\n \"food_manifest_sha256\": \"02dfe1b450fbdac16e718888215b4dd5c85d8975440fa21e8f439fb24c2b2990\",\n \"food_scope_fingerprint_sha256\": \"8b63c5ddc48a2cc7db69295238b96d5f814dba50427c80b4d0079f061e6d3de0\",\n \"active_generation_authority\": \"radroots_event_store_source_state\",\n \"marker_close_authority\": \"radroots_event_store_source_capacity_marker_close_guard\"\n }\n },\n \"entry_points\": [\n {\n \"role\": \"migration_registry\",\n \"rust_path\": \"radroots_event_store::migrations::EVENT_STORE_MIGRATIONS[3]\"\n },\n {\n \"role\": \"migration_apply_hook\",\n \"rust_path\": \"radroots_event_store::schema::apply_migration_hook\"\n },\n {\n \"role\": \"migration_validation_hook\",\n \"rust_path\": \"radroots_event_store::schema::validate_migration_hook_state\"\n },\n {\n \"role\": \"capacity_query\",\n \"rust_path\": \"radroots_event_store::RadrootsEventStore::source_capacity_v1\"\n },\n {\n \"role\": \"raw_append_preflight\",\n \"rust_path\": \"radroots_event_store::source_maintenance_v1::preflight_unique_raw_source_append_v1\"\n },\n {\n \"role\": \"raw_append_advance\",\n \"rust_path\": \"radroots_event_store::source_maintenance_v1::advance_source_capacity_after_insert_v1\"\n },\n {\n \"role\": \"generation_append_preflight\",\n \"rust_path\": \"radroots_event_store::source_maintenance_v1::preflight_source_generation_append_v1\"\n },\n {\n \"role\": \"generation_rebuild_bind\",\n \"rust_path\": \"radroots_event_store::source_maintenance_v1::bind_source_capacity_to_generation_v1\"\n },\n {\n \"role\": \"sqlite_encoding_preflight\",\n \"rust_path\": \"radroots_event_store::store::validate_main_database_encoding\"\n },\n {\n \"role\": \"source_generation_history_rollback_guard\",\n \"rust_path\": \"radroots_event_store::schema::validate_rollback_preserves_source_generation_history\"\n },\n {\n \"role\": \"result_vector_executor\",\n \"rust_path\": \"source_maintenance_v1_result_vector\"\n }\n ],\n \"source_files\": [\n {\n \"role\": \"workspace_dependency_authority\",\n \"path\": \"Cargo.toml\",\n \"byte_length\": 12385,\n \"sha256\": \"c53c5c5a464267d7df850e03fdfa99dcde0b469972cf921f9b81c18b52a9c4b2\",\n \"hash_algorithm\": \"sha256_bytes_v1\"\n },\n {\n \"role\": \"core_currency_value_authority\",\n \"path\": \"crates/core/src/currency.rs\",\n \"byte_length\": 4142,\n \"sha256\": \"42e6da2d8d2fdd6955dc2d83e98dd00266e02bc910b69923b117662c05089d14\",\n \"hash_algorithm\": \"sha256_bytes_v1\"\n },\n {\n \"role\": \"core_decimal_value_authority\",\n \"path\": \"crates/core/src/decimal.rs\",\n \"byte_length\": 7839,\n \"sha256\": \"4b1d681a92d7a9e074bee7e1f20eb1499bb05bfc6528a6c9ba69fa7d00416550\",\n \"hash_algorithm\": \"sha256_bytes_v1\"\n },\n {\n \"role\": \"core_money_value_authority\",\n \"path\": \"crates/core/src/money.rs\",\n \"byte_length\": 8025,\n \"sha256\": \"3f30bc21e21951a62fdc5d4033736ed42a883df590e8403940775bd2edfeebc5\",\n \"hash_algorithm\": \"sha256_bytes_v1\"\n },\n {\n \"role\": \"core_percent_value_authority\",\n \"path\": \"crates/core/src/percent.rs\",\n \"byte_length\": 2652,\n \"sha256\": \"42ceab109881329f3539d06a0ee0381ab4359985fe185a18d58a9c9558c5eb7f\",\n \"hash_algorithm\": \"sha256_bytes_v1\"\n },\n {\n \"role\": \"core_quantity_value_authority\",\n \"path\": \"crates/core/src/quantity.rs\",\n \"byte_length\": 6785,\n \"sha256\": \"d14e619da3829cdaf3ca7385fb892d330c286c1e21455c135c37518cbb588b5f\",\n \"hash_algorithm\": \"sha256_bytes_v1\"\n },\n {\n \"role\": \"core_quantity_price_value_authority\",\n \"path\": \"crates/core/src/quantity_price.rs\",\n \"byte_length\": 7061,\n \"sha256\": \"d60f70377099470ed283f45868a5119d7bb46143cb250b5082a4c038ba7f6cdc\",\n \"hash_algorithm\": \"sha256_bytes_v1\"\n },\n {\n \"role\": \"core_unit_value_authority\",\n \"path\": \"crates/core/src/unit.rs\",\n \"byte_length\": 10023,\n \"sha256\": \"550e9582b6a5290aac3f637b83853b21fefcbab92c432d067c83448f4b2fe3e9\",\n \"hash_algorithm\": \"sha256_bytes_v1\"\n },\n {\n \"role\": \"blossom_public_surface\",\n \"path\": \"crates/blossom/src/lib.rs\",\n \"byte_length\": 510,\n \"sha256\": \"a4dfcbd193457c50c1b0fbfc91bb547981ecd3a6e23cfc6f1030edfb511dc58c\",\n \"hash_algorithm\": \"sha256_bytes_v1\"\n },\n {\n \"role\": \"blossom_authorization_authority\",\n \"path\": \"crates/blossom/src/authorization.rs\",\n \"byte_length\": 39360,\n \"sha256\": \"461947b30516315a342b3b5697599f701d27050888f29f67f5d7a7ad4afa4c28\",\n \"hash_algorithm\": \"sha256_bytes_v1\"\n },\n {\n \"role\": \"blossom_descriptor_authority\",\n \"path\": \"crates/blossom/src/descriptor.rs\",\n \"byte_length\": 13702,\n \"sha256\": \"b2a4ffa760256e1316f70e012d200e2b5f4afd8ede771b85a5147f96b247f599\",\n \"hash_algorithm\": \"sha256_bytes_v1\"\n },\n {\n \"role\": \"blossom_error_authority\",\n \"path\": \"crates/blossom/src/error.rs\",\n \"byte_length\": 17229,\n \"sha256\": \"02af55beacf437040be17d1fc3271d6e2a62915f656ec2dbe06247deef83f95a\",\n \"hash_algorithm\": \"sha256_bytes_v1\"\n },\n {\n \"role\": \"blossom_hash_authority\",\n \"path\": \"crates/blossom/src/hash.rs\",\n \"byte_length\": 11006,\n \"sha256\": \"45eca0d81ac0f46c305a32f81aafcdd90b14679d0614f72862289a6e5d4cb08f\",\n \"hash_algorithm\": \"sha256_bytes_v1\"\n },\n {\n \"role\": \"blossom_media_type_authority\",\n \"path\": \"crates/blossom/src/media_type.rs\",\n \"byte_length\": 2368,\n \"sha256\": \"69db5c0f9fcdd7dbe1f22daa499f65603ae4ce198083dab2c73a36813fa18a46\",\n \"hash_algorithm\": \"sha256_bytes_v1\"\n },\n {\n \"role\": \"blossom_url_authority\",\n \"path\": \"crates/blossom/src/url.rs\",\n \"byte_length\": 14580,\n \"sha256\": \"342c995fcf620e5fb32461a7d8276f5668ba2662890bd32d12780cc9121c6451\",\n \"hash_algorithm\": \"sha256_bytes_v1\"\n },\n {\n \"role\": \"event_contract_facade\",\n \"path\": \"crates/event/src/contract.rs\",\n \"byte_length\": 86,\n \"sha256\": \"9994cbca9dcc7450ad133b6b927e7c06bee08ef813652452cc1e56a284c1be10\",\n \"hash_algorithm\": \"sha256_bytes_v1\"\n },\n {\n \"role\": \"event_contract_registry_v7_authority\",\n \"path\": \"crates/event/src/contract/registry_v7.rs\",\n \"byte_length\": 155738,\n \"sha256\": \"e9133e65b37810478c3e34ec4ac2005d81209a714ec2de5bd0232b9f02740dde\",\n \"hash_algorithm\": \"sha256_bytes_v1\"\n },\n {\n \"role\": \"event_envelope_authority\",\n \"path\": \"crates/event/src/envelope.rs\",\n \"byte_length\": 31165,\n \"sha256\": \"97a3bb38d630666bba497b98e856ee457d6899de230dabf6cab786a5bd55a3ce\",\n \"hash_algorithm\": \"sha256_bytes_v1\"\n },\n {\n \"role\": \"event_head_facade\",\n \"path\": \"crates/event/src/event_head.rs\",\n \"byte_length\": 68,\n \"sha256\": \"cb52f6006f7ecd862707d6b048f9fc407e0cd5ebcd3091b3c54e195ffa5cba64\",\n \"hash_algorithm\": \"sha256_bytes_v1\"\n },\n {\n \"role\": \"event_head_v1_authority\",\n \"path\": \"crates/event/src/event_head/v1.rs\",\n \"byte_length\": 7529,\n \"sha256\": \"0a4b50c4b7a93e9d88cc995cf69d9e87b341cba66d7feb51c357dfa4e5b2de37\",\n \"hash_algorithm\": \"sha256_bytes_v1\"\n },\n {\n \"role\": \"event_ids_authority\",\n \"path\": \"crates/event/src/ids.rs\",\n \"byte_length\": 46282,\n \"sha256\": \"f3c34e7dcf09fc225cb9c12f02ae932d5155c859f73f8b8573db8e5ebf298678\",\n \"hash_algorithm\": \"sha256_bytes_v1\"\n },\n {\n \"role\": \"event_trade_authority\",\n \"path\": \"crates/event/src/trade.rs\",\n \"byte_length\": 68376,\n \"sha256\": \"1012b44295cb26844206304bc24b355a49c18a023844f6b3905337c63b1417a7\",\n \"hash_algorithm\": \"sha256_bytes_v1\"\n },\n {\n \"role\": \"event_kinds_authority\",\n \"path\": \"crates/event/src/kinds.rs\",\n \"byte_length\": 34961,\n \"sha256\": \"8b3ce6193cab1f7e1587d0c1b2880a81b0aa43c77d89671b602772db37edcebf\",\n \"hash_algorithm\": \"sha256_bytes_v1\"\n },\n {\n \"role\": \"event_tags_authority\",\n \"path\": \"crates/event/src/tags.rs\",\n \"byte_length\": 4530,\n \"sha256\": \"cb8f12a639fc72d9238e32495d9e67e928e6627fb8c94ec0a58c5d95e7373cd6\",\n \"hash_algorithm\": \"sha256_bytes_v1\"\n },\n {\n \"role\": \"event_draft_authority\",\n \"path\": \"crates/event/src/draft.rs\",\n \"byte_length\": 58674,\n \"sha256\": \"fa4e802f1143eba72ba7fc334104ea0d6613c886725ff9f3e61dab2443c243b6\",\n \"hash_algorithm\": \"sha256_bytes_v1\"\n },\n {\n \"role\": \"event_calendar_authority\",\n \"path\": \"crates/event/src/calendar.rs\",\n \"byte_length\": 103814,\n \"sha256\": \"f8e0fcb4802d0dcd2a1a13b17216a0c5278950a60c09a261ab349e9ce1989d72\",\n \"hash_algorithm\": \"sha256_bytes_v1\"\n },\n {\n \"role\": \"event_classified_listing_authority\",\n \"path\": \"crates/event/src/classified_listing.rs\",\n \"byte_length\": 8226,\n \"sha256\": \"745aa08953a6243ea1afad22aa63e44f6746f2f243ab0d6b617d6ab64fa58749\",\n \"hash_algorithm\": \"sha256_bytes_v1\"\n },\n {\n \"role\": \"event_profile_authority\",\n \"path\": \"crates/event/src/profile.rs\",\n \"byte_length\": 18848,\n \"sha256\": \"7c7ac7f4926938f5cb5530be5450e5e23f18f216bdb222150fbdd451cec20d5c\",\n \"hash_algorithm\": \"sha256_bytes_v1\"\n },\n {\n \"role\": \"event_post_authority\",\n \"path\": \"crates/event/src/post.rs\",\n \"byte_length\": 22738,\n \"sha256\": \"7ed4a4c39bed40b134369d16e1fc35ab2c7d27ee300dd36d367025def2283b39\",\n \"hash_algorithm\": \"sha256_bytes_v1\"\n },\n {\n \"role\": \"event_comment_authority\",\n \"path\": \"crates/event/src/comment.rs\",\n \"byte_length\": 36375,\n \"sha256\": \"f4d1a57780eff0d315bc4e2fbad316dfb7c7ced1bcc9e8e85afe0b5ecdaf3aa8\",\n \"hash_algorithm\": \"sha256_bytes_v1\"\n },\n {\n \"role\": \"event_food_availability_authority\",\n \"path\": \"crates/event/src/food_availability.rs\",\n \"byte_length\": 45429,\n \"sha256\": \"b4357dfb6954631673b6cd58794015da29303cb54ce8405a57ad543870036c9e\",\n \"hash_algorithm\": \"sha256_bytes_v1\"\n },\n {\n \"role\": \"event_deletion_authority\",\n \"path\": \"crates/event/src/deletion.rs\",\n \"byte_length\": 31155,\n \"sha256\": \"c8b7ab79998ae62e03497f5511dd3950a41d73155edda3d8d34c65fc797e9d09\",\n \"hash_algorithm\": \"sha256_bytes_v1\"\n },\n {\n \"role\": \"event_relay_hint_authority\",\n \"path\": \"crates/event/src/relay_hint.rs\",\n \"byte_length\": 14317,\n \"sha256\": \"1a14aea5d2f2620970dc1de9e3d311d9042cab4d5805a56461548168112a0801\",\n \"hash_algorithm\": \"sha256_bytes_v1\"\n },\n {\n \"role\": \"event_media_authority\",\n \"path\": \"crates/event/src/media.rs\",\n \"byte_length\": 3521,\n \"sha256\": \"8f670e634452872a525efdad0cb9480288885c62f22a9b9915a67a7e7965651c\",\n \"hash_algorithm\": \"sha256_bytes_v1\"\n },\n {\n \"role\": \"event_social_authority\",\n \"path\": \"crates/event/src/social.rs\",\n \"byte_length\": 5483,\n \"sha256\": \"1b89c6d0954822e7f1e778479ed43694e88929bcd5310ee066f8f4ba6505045a\",\n \"hash_algorithm\": \"sha256_bytes_v1\"\n },\n {\n \"role\": \"event_wire_facade\",\n \"path\": \"crates/event/src/wire.rs\",\n \"byte_length\": 68,\n \"sha256\": \"cb52f6006f7ecd862707d6b048f9fc407e0cd5ebcd3091b3c54e195ffa5cba64\",\n \"hash_algorithm\": \"sha256_bytes_v1\"\n },\n {\n \"role\": \"event_wire_v1_authority\",\n \"path\": \"crates/event/src/wire/v1.rs\",\n \"byte_length\": 22133,\n \"sha256\": \"cc28c8cbd962b32ed2efe43e84c1e0d1ea3bd89636efff2d5553714072fce1a4\",\n \"hash_algorithm\": \"sha256_bytes_v1\"\n },\n {\n \"role\": \"event_codec_verification_facade\",\n \"path\": \"crates/event_codec/src/verification.rs\",\n \"byte_length\": 253,\n \"sha256\": \"b49a32df605035c87f295c0a151140d43d2e588c5e11b05183e5fc92993dae0e\",\n \"hash_algorithm\": \"sha256_bytes_v1\"\n },\n {\n \"role\": \"event_codec_verification_v1_authority\",\n \"path\": \"crates/event_codec/src/verification/v1.rs\",\n \"byte_length\": 8751,\n \"sha256\": \"fc4c5d45e475151c56330ba9c4db70de603e4ec48adabd6365f80d5f6a3733f4\",\n \"hash_algorithm\": \"sha256_bytes_v1\"\n },\n {\n \"role\": \"event_codec_registry_v7_admission_authority\",\n \"path\": \"crates/event_codec/src/admission/registry_v7.rs\",\n \"byte_length\": 5350,\n \"sha256\": \"755e63dd7ad1115c219e5a3ea540bef67d2770fc9f2a5aa6ba97c925c99bdced\",\n \"hash_algorithm\": \"sha256_bytes_v1\"\n },\n {\n \"role\": \"event_codec_profile_inbound_facade\",\n \"path\": \"crates/event_codec/src/profile/inbound.rs\",\n \"byte_length\": 86,\n \"sha256\": \"9994cbca9dcc7450ad133b6b927e7c06bee08ef813652452cc1e56a284c1be10\",\n \"hash_algorithm\": \"sha256_bytes_v1\"\n },\n {\n \"role\": \"event_codec_profile_registry_v7_authority\",\n \"path\": \"crates/event_codec/src/profile/inbound/registry_v7.rs\",\n \"byte_length\": 10394,\n \"sha256\": \"c37c225ea8153beb098a39c4a56203aa03382af12646f40cd3f8628663700702\",\n \"hash_algorithm\": \"sha256_bytes_v1\"\n },\n {\n \"role\": \"event_codec_post_inbound_facade\",\n \"path\": \"crates/event_codec/src/post/inbound.rs\",\n \"byte_length\": 86,\n \"sha256\": \"9994cbca9dcc7450ad133b6b927e7c06bee08ef813652452cc1e56a284c1be10\",\n \"hash_algorithm\": \"sha256_bytes_v1\"\n },\n {\n \"role\": \"event_codec_post_registry_v7_authority\",\n \"path\": \"crates/event_codec/src/post/inbound/registry_v7.rs\",\n \"byte_length\": 16016,\n \"sha256\": \"bc0bb839c28f3588f05544c846c987528ea3934c75305fef70af8e027a97cc58\",\n \"hash_algorithm\": \"sha256_bytes_v1\"\n },\n {\n \"role\": \"event_codec_reply_inbound_facade\",\n \"path\": \"crates/event_codec/src/reply/inbound.rs\",\n \"byte_length\": 86,\n \"sha256\": \"9994cbca9dcc7450ad133b6b927e7c06bee08ef813652452cc1e56a284c1be10\",\n \"hash_algorithm\": \"sha256_bytes_v1\"\n },\n {\n \"role\": \"event_codec_reply_registry_v7_authority\",\n \"path\": \"crates/event_codec/src/reply/inbound/registry_v7.rs\",\n \"byte_length\": 26812,\n \"sha256\": \"a72e9721ed13addca2a63942ac9e43c1daa8f1d1457eef08ec6a3ee5eb8872c5\",\n \"hash_algorithm\": \"sha256_bytes_v1\"\n },\n {\n \"role\": \"event_codec_comment_inbound_facade\",\n \"path\": \"crates/event_codec/src/comment/inbound.rs\",\n \"byte_length\": 86,\n \"sha256\": \"9994cbca9dcc7450ad133b6b927e7c06bee08ef813652452cc1e56a284c1be10\",\n \"hash_algorithm\": \"sha256_bytes_v1\"\n },\n {\n \"role\": \"event_codec_comment_registry_v7_authority\",\n \"path\": \"crates/event_codec/src/comment/inbound/registry_v7.rs\",\n \"byte_length\": 53783,\n \"sha256\": \"30d1b0155963b25d64685ddd042f423ef7707b111dc56ead15bd468e0433a432\",\n \"hash_algorithm\": \"sha256_bytes_v1\"\n },\n {\n \"role\": \"event_codec_deletion_facade\",\n \"path\": \"crates/event_codec/src/deletion/mod.rs\",\n \"byte_length\": 115,\n \"sha256\": \"17d56f82ddb0a86bc97abbcf3e037fe460ea31fff2548f527be4bf004dac3a95\",\n \"hash_algorithm\": \"sha256_bytes_v1\"\n },\n {\n \"role\": \"event_codec_deletion_reconciliation_v1_authority\",\n \"path\": \"crates/event_codec/src/deletion/reconciliation_v1.rs\",\n \"byte_length\": 38469,\n \"sha256\": \"3e06d1fa923ca5faabb1e95338c35650b0e20b078ff5c972e35ab845d8b7476c\",\n \"hash_algorithm\": \"sha256_bytes_v1\"\n },\n {\n \"role\": \"event_codec_food_inbound_facade\",\n \"path\": \"crates/event_codec/src/food_availability/inbound.rs\",\n \"byte_length\": 86,\n \"sha256\": \"9994cbca9dcc7450ad133b6b927e7c06bee08ef813652452cc1e56a284c1be10\",\n \"hash_algorithm\": \"sha256_bytes_v1\"\n },\n {\n \"role\": \"event_codec_food_registry_v7_authority\",\n \"path\": \"crates/event_codec/src/food_availability/inbound/registry_v7.rs\",\n \"byte_length\": 26764,\n \"sha256\": \"a5786cff942b7b0038f741afb5b9a19230ac58cb57a5ba747b32e1b95d414e15\",\n \"hash_algorithm\": \"sha256_bytes_v1\"\n },\n {\n \"role\": \"event_codec_job_traits_authority\",\n \"path\": \"crates/event_codec/src/job/traits.rs\",\n \"byte_length\": 5029,\n \"sha256\": \"353df3703de4d99fc318474952dc6c95cbce9a19756f3e235ed2d715f36c4364\",\n \"hash_algorithm\": \"sha256_bytes_v1\"\n },\n {\n \"role\": \"event_store_dependency_authority\",\n \"path\": \"crates/event_store/Cargo.toml\",\n \"byte_length\": 1569,\n \"sha256\": \"30f43004bcf0ffa9b9b6f338cba8c56be0265bc1cee708e93f7b7dc54ed60f9c\",\n \"hash_algorithm\": \"sha256_bytes_v1\"\n },\n {\n \"role\": \"event_store_error_and_limits\",\n \"path\": \"crates/event_store/src/error.rs\",\n \"byte_length\": 19517,\n \"sha256\": \"4bf24ee1aa6117597ab467b1379a05549b79024213dc7622a2d276bc26fffab4\",\n \"hash_algorithm\": \"sha256_bytes_v1\"\n },\n {\n \"role\": \"generated_descriptor_registration\",\n \"path\": \"crates/event_store/src/generated.rs\",\n \"byte_length\": 144,\n \"sha256\": \"6b0a8d6f249bd4fc3f878d37cb5e418680f0f1be2d9eec2518dedf03efc47121\",\n \"hash_algorithm\": \"sha256_bytes_v1\"\n },\n {\n \"role\": \"public_surface\",\n \"path\": \"crates/event_store/src/lib.rs\",\n \"byte_length\": 3844,\n \"sha256\": \"3cd9653bcb752fb3c4442d4904b98a0a6208011a9a238125b7b7073d7f4e312b\",\n \"hash_algorithm\": \"sha256_bytes_v1\"\n },\n {\n \"role\": \"migration_registry\",\n \"path\": \"crates/event_store/src/migrations.rs\",\n \"byte_length\": 73585,\n \"sha256\": \"a47477d04759ec6e71d14d3d05459864eae78fce0e3c2481a1b03147f04637f7\",\n \"hash_algorithm\": \"sha256_bytes_v1\"\n },\n {\n \"role\": \"predecessor_model_public_surface\",\n \"path\": \"crates/event_store/src/model.rs\",\n \"byte_length\": 33596,\n \"sha256\": \"98b1742ffb517f66f8e9edefa61d1c3cf3e22be5985202c6c340310a98c72c8e\",\n \"hash_algorithm\": \"sha256_bytes_v1\"\n },\n {\n \"role\": \"event_store_reconciliation_v1_model\",\n \"path\": \"crates/event_store/src/model/reconciliation_v1.rs\",\n \"byte_length\": 11138,\n \"sha256\": \"8a26bc373035878ef9b41767ceea7b681896e17d88bedce118de1d622125e1d6\",\n \"hash_algorithm\": \"sha256_bytes_v1\"\n },\n {\n \"role\": \"event_store_reconciliation_v1_ingest_model\",\n \"path\": \"crates/event_store/src/model/ingest_reconciliation_v1.rs\",\n \"byte_length\": 1626,\n \"sha256\": \"47bf13b3fc0f8a913a660f7d655413de0f6b90568bc4acc510aa6bd741bab47b\",\n \"hash_algorithm\": \"sha256_bytes_v1\"\n },\n {\n \"role\": \"addressable_transition_feed_model\",\n \"path\": \"crates/event_store/src/model/addressable_transition_feed_v1.rs\",\n \"byte_length\": 22279,\n \"sha256\": \"f8ea454a0e998a3d433bba52d1ff9759a04fcb91db286cf2a2b10ef7d0057694\",\n \"hash_algorithm\": \"sha256_bytes_v1\"\n },\n {\n \"role\": \"food_projection_model\",\n \"path\": \"crates/event_store/src/model/food_availability_projection_v1.rs\",\n \"byte_length\": 17437,\n \"sha256\": \"6fdfc8c5eb3dd9c451fd47b2394af123b50f7fe6d74113f8777221a8fa31ba30\",\n \"hash_algorithm\": \"sha256_bytes_v1\"\n },\n {\n \"role\": \"source_generation_rebuild_authority\",\n \"path\": \"crates/event_store/src/nip09/reconciliation_v1.rs\",\n \"byte_length\": 184402,\n \"sha256\": \"7fa01e52f51d3470ba60e6068dc05797c2a6eaf5eb317d23111a961dbe4451f9\",\n \"hash_algorithm\": \"sha256_bytes_v1\"\n },\n {\n \"role\": \"schema_migration_and_reopen_authority\",\n \"path\": \"crates/event_store/src/schema.rs\",\n \"byte_length\": 146146,\n \"sha256\": \"93b060e80d3edd73f86208e4bf698fa9d53eaf1eeb04526c9261fb8b5726fb0d\",\n \"hash_algorithm\": \"sha256_bytes_v1\"\n },\n {\n \"role\": \"public_store_and_transaction_authority\",\n \"path\": \"crates/event_store/src/store.rs\",\n \"byte_length\": 394732,\n \"sha256\": \"6710a4b3e366b724f6b3d4904e2403c15456f23111996945931d2ba20e301f52\",\n \"hash_algorithm\": \"sha256_bytes_v1\"\n },\n {\n \"role\": \"addressable_transition_feed_store\",\n \"path\": \"crates/event_store/src/store/addressable_transition_feed_v1.rs\",\n \"byte_length\": 40254,\n \"sha256\": \"de656face46735b938b7b20780687404eade47885871129cc5a7c009155d6336\",\n \"hash_algorithm\": \"sha256_bytes_v1\"\n },\n {\n \"role\": \"food_projection_store\",\n \"path\": \"crates/event_store/src/store/food_availability_projection_v1.rs\",\n \"byte_length\": 48971,\n \"sha256\": \"189b824af305f39c7f71a285f4746455ff30f1a27b24b95d8d21223b41772152\",\n \"hash_algorithm\": \"sha256_bytes_v1\"\n },\n {\n \"role\": \"predecessor_post_core_v1_extension\",\n \"path\": \"crates/event_store/src/store/post_core_extensions_v1.rs\",\n \"byte_length\": 6923,\n \"sha256\": \"2fbfc6252f9ce249468a99b5230fd6b7b59b9e47ee4f38783c5fd9379c823fd0\",\n \"hash_algorithm\": \"sha256_bytes_v1\"\n },\n {\n \"role\": \"predecessor_post_core_v1_storage\",\n \"path\": \"crates/event_store/src/store/post_core_storage_v1.rs\",\n \"byte_length\": 16876,\n \"sha256\": \"f27dc7dcd643762226f8d4df0d297027b384bcf1004277222e978965bc2d40cf\",\n \"hash_algorithm\": \"sha256_bytes_v1\"\n },\n {\n \"role\": \"raw_ingest_capacity_authority\",\n \"path\": \"crates/event_store/src/store/protocol_reconciliation_v1.rs\",\n \"byte_length\": 30145,\n \"sha256\": \"a8a26763dc39124ab7537fdcc3f89a1f0aa7e1830f4f9dec9ee4057bbb4fd228\",\n \"hash_algorithm\": \"sha256_bytes_v1\"\n },\n {\n \"role\": \"predecessor_protocol_storage\",\n \"path\": \"crates/event_store/src/store/protocol_storage_v1.rs\",\n \"byte_length\": 10929,\n \"sha256\": \"20de4436945bac0d8cbeca0ae6cd95232a92da8cd6be6ae6beacba17fe50d658\",\n \"hash_algorithm\": \"sha256_bytes_v1\"\n },\n {\n \"role\": \"source_maintenance_runtime\",\n \"path\": \"crates/event_store/src/source_maintenance_v1.rs\",\n \"byte_length\": 51762,\n \"sha256\": \"5db9c9e86fd18a2fcc08dbc3468f373bf39d8948bc6a08936b252a4dda3546e9\",\n \"hash_algorithm\": \"sha256_bytes_v1\"\n },\n {\n \"role\": \"predecessor_food_result_vector_executor\",\n \"path\": \"crates/event_store/tests/food_availability_projection_v1_result_vector.rs\",\n \"byte_length\": 34070,\n \"sha256\": \"aa098bcb0f975f690ca9535d3cbb76c6e57e6d70fd3a892c4399fd35fe8ec21c\",\n \"hash_algorithm\": \"sha256_bytes_v1\"\n },\n {\n \"role\": \"artifact_transaction_authority\",\n \"path\": \"tools/xtask/src/contract/artifact_bundle.rs\",\n \"byte_length\": 38279,\n \"sha256\": \"f326ea57b56d40135f95b6b1e15961f66eed363337180a6d12a5ea903e1a9a29\",\n \"hash_algorithm\": \"sha256_bytes_v1\"\n },\n {\n \"role\": \"predecessor_successor_governance\",\n \"path\": \"tools/xtask/src/contract/food_availability_projection.rs\",\n \"byte_length\": 197131,\n \"sha256\": \"6b71c927b41404f633dfbd0f8e321dcdab933285a196671f27046c0c15d55434\",\n \"hash_algorithm\": \"sha256_bytes_v1\"\n },\n {\n \"role\": \"transitive_predecessor_membership_governance\",\n \"path\": \"tools/xtask/src/contract/nip09_reconciliation.rs\",\n \"byte_length\": 836131,\n \"sha256\": \"af71c0172eb214f10a615fc867e309cb6d07780a0dc583858a42c617e10cea83\",\n \"hash_algorithm\": \"sha256_bytes_v1\"\n },\n {\n \"role\": \"source_maintenance_governance\",\n \"path\": \"tools/xtask/src/contract/source_maintenance.rs\",\n \"byte_length\": 188436,\n \"sha256\": \"ce21d4d200142b361ee0f65bd8063a461fd01f016e92eec7f6576863a0856b05\",\n \"hash_algorithm\": \"sha256_bytes_v1\"\n },\n {\n \"role\": \"contract_command_authority\",\n \"path\": \"tools/xtask/src/contract.rs\",\n \"byte_length\": 504182,\n \"sha256\": \"7edf6ffda5dec9e08b66ad100d9119a705c994af692fd287e90700830de12281\",\n \"hash_algorithm\": \"sha256_bytes_v1\"\n },\n {\n \"role\": \"xtask_dispatch_and_release_preflight\",\n \"path\": \"tools/xtask/src/main.rs\",\n \"byte_length\": 15109,\n \"sha256\": \"bf721ecaa94225908496f247bf65011e669aa61b732594c23d64e306b4ac38cc\",\n \"hash_algorithm\": \"sha256_bytes_v1\"\n }\n ],\n \"public_api\": {\n \"inherited_predecessor_symbols\": [\n \"RADROOTS_ADDRESSABLE_TRANSITION_CURSOR_JSON_MAX_BYTES_V1\",\n \"RADROOTS_ADDRESSABLE_TRANSITION_D_TAG_MAX_BYTES_V1\",\n \"RADROOTS_ADDRESSABLE_TRANSITION_FEED_VERSION_V1\",\n \"RADROOTS_ADDRESSABLE_TRANSITION_PAGE_LIMIT_MAX_V1\",\n \"RADROOTS_ADDRESSABLE_TRANSITION_PAGE_RAW_JSON_MAX_BYTES_V1\",\n \"RADROOTS_ADDRESSABLE_TRANSITION_PAGE_SCAN_MAX_V1\",\n \"RADROOTS_ADDRESSABLE_TRANSITION_SCOPE_KIND_MAX_V1\",\n \"RADROOTS_FOOD_AVAILABILITY_PROJECTION_APPLY_PAGE_LIMIT_V1\",\n \"RADROOTS_FOOD_AVAILABILITY_PROJECTION_VERSION_V1\",\n \"RADROOTS_FOOD_AVAILABILITY_SEARCH_QUERY_MAX_BYTES_V1\",\n \"RADROOTS_FOOD_AVAILABILITY_SEARCH_QUERY_MAX_TERMS_V1\",\n \"RadrootsAddressableTransitionCauseV1\",\n \"RadrootsAddressableTransitionCoordinateV1\",\n \"RadrootsAddressableTransitionCursorV1\",\n \"RadrootsAddressableTransitionEventReferenceV1\",\n \"RadrootsAddressableTransitionOriginV1\",\n \"RadrootsAddressableTransitionPageV1\",\n \"RadrootsAddressableTransitionRawHeadDecisionV1\",\n \"RadrootsAddressableTransitionScopeFingerprintV1\",\n \"RadrootsAddressableTransitionScopeV1\",\n \"RadrootsAddressableTransitionV1\",\n \"RadrootsAddressableTransitionVisibilityV1\",\n \"RadrootsCurrentEventVisibilityV1\",\n \"RadrootsCurrentVisibilityDecisionV1\",\n \"RadrootsFoodAvailabilitySearchQueryV1\",\n \"RadrootsFoodAvailabilityStatusFilterV1\",\n \"RadrootsNip09SuppressionEvidenceV1\",\n \"RadrootsNip09SuppressionOutcome\",\n \"RadrootsNip09SuppressionReason\",\n \"RadrootsStoreProducedCanonicalEventV1\",\n \"RadrootsStoredFoodAvailabilityImageV1\",\n \"RadrootsStoredFoodAvailabilityV1\"\n ],\n \"added_symbols\": [\n \"RADROOTS_EVENT_STORE_RAW_EVENT_COUNT_LIMIT_V1\",\n \"RADROOTS_EVENT_STORE_RAW_EVENT_TEXT_BYTES_LIMIT_V1\",\n \"RADROOTS_EVENT_STORE_RAW_TAG_COUNT_LIMIT_V1\",\n \"RADROOTS_EVENT_STORE_RAW_TAG_TEXT_BYTES_LIMIT_V1\",\n \"RADROOTS_EVENT_STORE_RETAINED_SOURCE_GENERATION_LIMIT_V1\",\n \"RadrootsEventStoreSourceCapacityResourceV1\",\n \"RadrootsEventStoreSourceCapacityV1\"\n ],\n \"methods\": [\n \"RadrootsEventStore::source_capacity_v1\",\n \"RadrootsEventStoreSourceCapacityResourceV1::as_str\",\n \"RadrootsEventStoreSourceCapacityV1::source_generation\",\n \"RadrootsEventStoreSourceCapacityV1::raw_event_count\",\n \"RadrootsEventStoreSourceCapacityV1::raw_tag_count\",\n \"RadrootsEventStoreSourceCapacityV1::raw_event_text_bytes\",\n \"RadrootsEventStoreSourceCapacityV1::raw_tag_text_bytes\",\n \"RadrootsEventStoreSourceCapacityV1::raw_high_water_seq\",\n \"RadrootsEventStoreSourceCapacityV1::retained_generation_count\",\n \"RadrootsEventStoreSourceCapacityV1::retained_generation_limit\"\n ],\n \"error_variants\": [\n \"SourceCapacityExceeded\",\n \"SourceGenerationHistoryLimitReached\",\n \"PersistedEphemeralRawEvent\",\n \"SourceCapacityStateDrift\",\n \"SqliteMainDatabaseEncodingNotUtf8\",\n \"RollbackWouldDiscardSourceGenerationHistory\"\n ],\n \"removed_symbols\": [\n \"RadrootsEventStoreReconciliationResource\",\n \"RadrootsEventStoreError::ReconciliationCapacityExceeded\"\n ],\n \"breaking_replacements\": [\n {\n \"removed\": \"RadrootsEventStoreReconciliationResource\",\n \"replacement\": \"RadrootsEventStoreSourceCapacityResourceV1\"\n },\n {\n \"removed\": \"RadrootsEventStoreError::ReconciliationCapacityExceeded\",\n \"replacement\": \"RadrootsEventStoreError::SourceCapacityExceeded\"\n }\n ]\n },\n \"result_vector\": {\n \"canonical_path\": \"contracts/conformance/vectors/event_store/source_maintenance.v1.json\",\n \"mirror_path\": \"crates/event_store/tests/fixtures/source_maintenance.v1.json\",\n \"byte_length\": 16253,\n \"sha256\": \"997aba2604a2b9d199fb87dc9d07942ca50d91863aeadcf3eeacf16d191dd71f\",\n \"hash_algorithm\": \"sha256_bytes_v1\",\n \"executor_id\": \"radroots_event_store.source_maintenance_v1.result_vector_executor.v1\",\n \"executor_path\": \"crates/event_store/tests/source_maintenance_v1_result_vector.rs\",\n \"executor_test\": \"source_maintenance_v1_result_vector\",\n \"executor_byte_length\": 23510,\n \"executor_sha256\": \"a7487afdfe19fc5fc794811d0f0e6035203e1aabcf0a33a1d398f6b3555d38f3\",\n \"executor_hash_algorithm\": \"sha256_bytes_v1\"\n }\n}\n"; +pub(crate) const SOURCE_MAINTENANCE_MANIFEST_JSON: &str = "{\n \"schema_version\": 1,\n \"contract_id\": \"radroots_event_store.source_maintenance_v1\",\n \"hook_id\": \"source_maintenance_v1\",\n \"manifest_schema\": {\n \"path\": \"crates/event_store/contracts/source_maintenance_v1.manifest.schema.json\",\n \"byte_length\": 12315,\n \"sha256\": \"96ea98a5abf3348b61565954cd34f2c622411d8dd34205ef04134bbe0e3d3f2b\",\n \"hash_algorithm\": \"sha256_bytes_v1\"\n },\n \"predecessor\": {\n \"hook_id\": \"food_availability_projection_v1\",\n \"manifest\": {\n \"path\": \"crates/event_store/contracts/food_availability_projection_v1.manifest.json\",\n \"byte_length\": 17455,\n \"sha256\": \"02dfe1b450fbdac16e718888215b4dd5c85d8975440fa21e8f439fb24c2b2990\",\n \"hash_algorithm\": \"sha256_bytes_v1\"\n }\n },\n \"migration\": {\n \"version\": 4,\n \"name\": \"source_maintenance\",\n \"up\": {\n \"path\": \"crates/event_store/migrations/0004_source_maintenance.up.sql\",\n \"byte_length\": 19841,\n \"sha256\": \"ab2724188f8d08c897eebea2533a635e7c74282a25e84e4c0c37e78b08837a43\",\n \"hash_algorithm\": \"sha256_bytes_v1\"\n },\n \"down\": {\n \"path\": \"crates/event_store/migrations/0004_source_maintenance.down.sql\",\n \"byte_length\": 5172,\n \"sha256\": \"fe44fd53c51545c08ea479b385e6781079dab70fc63da2a3c205d727a00ce860\",\n \"hash_algorithm\": \"sha256_bytes_v1\"\n },\n \"schema_sha256\": \"074f85b663444ac150239ecd8441ea4a96ad83a798a55e22d2e5e2f7ee943a8c\",\n \"catalog\": {\n \"objects\": [\n \"radroots_event_store_source_capacity_delete_guard\",\n \"radroots_event_store_source_capacity_insert_guard\",\n \"radroots_event_store_source_capacity_marker_close_guard\",\n \"radroots_event_store_source_capacity_update_guard\",\n \"radroots_event_store_source_capacity_v1\",\n \"radroots_event_store_source_generation_capacity_advance\",\n \"radroots_event_store_source_generation_capacity_guard\"\n ],\n \"replaced_objects\": [\n \"radroots_event_store_food_availability_image_delete_guard\",\n \"radroots_event_store_food_availability_projection_delete_guard\",\n \"radroots_event_store_source_rebuild_marker_insert_guard\"\n ],\n \"tables\": [\n \"radroots_event_store_source_capacity_v1\"\n ],\n \"fts5_tables\": []\n }\n },\n \"source_maintenance\": {\n \"version\": 1,\n \"event_contract_registry_version\": 7,\n \"capacity_authority_id\": \"radroots_event_store_source_capacity_v1\",\n \"accounting\": {\n \"algorithm\": \"sqlite_cast_blob_octet_sum_v1\",\n \"raw_event_columns\": [\n \"event_id\",\n \"pubkey\",\n \"tags_json\",\n \"content\",\n \"sig\",\n \"raw_json\"\n ],\n \"raw_tag_columns\": [\n \"event_id\",\n \"tag_name\",\n \"tag_value\",\n \"tag_json\"\n ],\n \"nullable_raw_tag_columns\": [\n \"tag_value\"\n ]\n },\n \"limits\": {\n \"raw_events\": 25000,\n \"raw_tags\": 250000,\n \"raw_event_text_bytes\": 67108864,\n \"raw_tag_text_bytes\": 33554432,\n \"retained_source_generations\": 8\n },\n \"reopen_validation\": {\n \"mode\": \"bounded_full_raw_recount_v1\",\n \"raw_event_rejection_scan_bound\": 25001,\n \"raw_tag_rejection_scan_bound\": 250001,\n \"generation_history_validation\": \"bounded_count_plus_active_ordinal_v1\",\n \"retained_generation_rejection_scan_bound\": 9\n },\n \"rebuild_seal\": {\n \"nip09_hook_id\": \"nip09_reconciliation_v1\",\n \"nip09_manifest_sha256\": \"74af832420ffbaa9805e89df3c0b34f126a443e1598f757e3372f407f9003b77\",\n \"food_hook_id\": \"food_availability_projection_v1\",\n \"food_manifest_sha256\": \"02dfe1b450fbdac16e718888215b4dd5c85d8975440fa21e8f439fb24c2b2990\",\n \"food_scope_fingerprint_sha256\": \"8b63c5ddc48a2cc7db69295238b96d5f814dba50427c80b4d0079f061e6d3de0\",\n \"active_generation_authority\": \"radroots_event_store_source_state\",\n \"marker_close_authority\": \"radroots_event_store_source_capacity_marker_close_guard\"\n }\n },\n \"entry_points\": [\n {\n \"role\": \"migration_registry\",\n \"rust_path\": \"radroots_event_store::migrations::EVENT_STORE_MIGRATIONS[3]\"\n },\n {\n \"role\": \"migration_apply_hook\",\n \"rust_path\": \"radroots_event_store::schema::apply_migration_hook\"\n },\n {\n \"role\": \"migration_validation_hook\",\n \"rust_path\": \"radroots_event_store::schema::validate_migration_hook_state\"\n },\n {\n \"role\": \"capacity_query\",\n \"rust_path\": \"radroots_event_store::RadrootsEventStore::source_capacity_v1\"\n },\n {\n \"role\": \"raw_append_preflight\",\n \"rust_path\": \"radroots_event_store::source_maintenance_v1::preflight_unique_raw_source_append_v1\"\n },\n {\n \"role\": \"raw_append_advance\",\n \"rust_path\": \"radroots_event_store::source_maintenance_v1::advance_source_capacity_after_insert_v1\"\n },\n {\n \"role\": \"generation_append_preflight\",\n \"rust_path\": \"radroots_event_store::source_maintenance_v1::preflight_source_generation_append_v1\"\n },\n {\n \"role\": \"generation_rebuild_bind\",\n \"rust_path\": \"radroots_event_store::source_maintenance_v1::bind_source_capacity_to_generation_v1\"\n },\n {\n \"role\": \"sqlite_encoding_preflight\",\n \"rust_path\": \"radroots_event_store::store::validate_main_database_encoding\"\n },\n {\n \"role\": \"source_generation_history_rollback_guard\",\n \"rust_path\": \"radroots_event_store::schema::validate_rollback_preserves_source_generation_history\"\n },\n {\n \"role\": \"result_vector_executor\",\n \"rust_path\": \"source_maintenance_v1_result_vector\"\n }\n ],\n \"source_files\": [\n {\n \"role\": \"workspace_dependency_authority\",\n \"path\": \"Cargo.toml\",\n \"byte_length\": 12385,\n \"sha256\": \"c53c5c5a464267d7df850e03fdfa99dcde0b469972cf921f9b81c18b52a9c4b2\",\n \"hash_algorithm\": \"sha256_bytes_v1\"\n },\n {\n \"role\": \"core_currency_value_authority\",\n \"path\": \"crates/core/src/currency.rs\",\n \"byte_length\": 4142,\n \"sha256\": \"42e6da2d8d2fdd6955dc2d83e98dd00266e02bc910b69923b117662c05089d14\",\n \"hash_algorithm\": \"sha256_bytes_v1\"\n },\n {\n \"role\": \"core_decimal_value_authority\",\n \"path\": \"crates/core/src/decimal.rs\",\n \"byte_length\": 7839,\n \"sha256\": \"4b1d681a92d7a9e074bee7e1f20eb1499bb05bfc6528a6c9ba69fa7d00416550\",\n \"hash_algorithm\": \"sha256_bytes_v1\"\n },\n {\n \"role\": \"core_money_value_authority\",\n \"path\": \"crates/core/src/money.rs\",\n \"byte_length\": 8025,\n \"sha256\": \"3f30bc21e21951a62fdc5d4033736ed42a883df590e8403940775bd2edfeebc5\",\n \"hash_algorithm\": \"sha256_bytes_v1\"\n },\n {\n \"role\": \"core_percent_value_authority\",\n \"path\": \"crates/core/src/percent.rs\",\n \"byte_length\": 2652,\n \"sha256\": \"42ceab109881329f3539d06a0ee0381ab4359985fe185a18d58a9c9558c5eb7f\",\n \"hash_algorithm\": \"sha256_bytes_v1\"\n },\n {\n \"role\": \"core_quantity_value_authority\",\n \"path\": \"crates/core/src/quantity.rs\",\n \"byte_length\": 6785,\n \"sha256\": \"d14e619da3829cdaf3ca7385fb892d330c286c1e21455c135c37518cbb588b5f\",\n \"hash_algorithm\": \"sha256_bytes_v1\"\n },\n {\n \"role\": \"core_quantity_price_value_authority\",\n \"path\": \"crates/core/src/quantity_price.rs\",\n \"byte_length\": 7061,\n \"sha256\": \"d60f70377099470ed283f45868a5119d7bb46143cb250b5082a4c038ba7f6cdc\",\n \"hash_algorithm\": \"sha256_bytes_v1\"\n },\n {\n \"role\": \"core_unit_value_authority\",\n \"path\": \"crates/core/src/unit.rs\",\n \"byte_length\": 10023,\n \"sha256\": \"550e9582b6a5290aac3f637b83853b21fefcbab92c432d067c83448f4b2fe3e9\",\n \"hash_algorithm\": \"sha256_bytes_v1\"\n },\n {\n \"role\": \"blossom_public_surface\",\n \"path\": \"crates/blossom/src/lib.rs\",\n \"byte_length\": 510,\n \"sha256\": \"a4dfcbd193457c50c1b0fbfc91bb547981ecd3a6e23cfc6f1030edfb511dc58c\",\n \"hash_algorithm\": \"sha256_bytes_v1\"\n },\n {\n \"role\": \"blossom_authorization_authority\",\n \"path\": \"crates/blossom/src/authorization.rs\",\n \"byte_length\": 39360,\n \"sha256\": \"461947b30516315a342b3b5697599f701d27050888f29f67f5d7a7ad4afa4c28\",\n \"hash_algorithm\": \"sha256_bytes_v1\"\n },\n {\n \"role\": \"blossom_descriptor_authority\",\n \"path\": \"crates/blossom/src/descriptor.rs\",\n \"byte_length\": 13702,\n \"sha256\": \"b2a4ffa760256e1316f70e012d200e2b5f4afd8ede771b85a5147f96b247f599\",\n \"hash_algorithm\": \"sha256_bytes_v1\"\n },\n {\n \"role\": \"blossom_error_authority\",\n \"path\": \"crates/blossom/src/error.rs\",\n \"byte_length\": 17229,\n \"sha256\": \"02af55beacf437040be17d1fc3271d6e2a62915f656ec2dbe06247deef83f95a\",\n \"hash_algorithm\": \"sha256_bytes_v1\"\n },\n {\n \"role\": \"blossom_hash_authority\",\n \"path\": \"crates/blossom/src/hash.rs\",\n \"byte_length\": 11006,\n \"sha256\": \"45eca0d81ac0f46c305a32f81aafcdd90b14679d0614f72862289a6e5d4cb08f\",\n \"hash_algorithm\": \"sha256_bytes_v1\"\n },\n {\n \"role\": \"blossom_media_type_authority\",\n \"path\": \"crates/blossom/src/media_type.rs\",\n \"byte_length\": 2368,\n \"sha256\": \"69db5c0f9fcdd7dbe1f22daa499f65603ae4ce198083dab2c73a36813fa18a46\",\n \"hash_algorithm\": \"sha256_bytes_v1\"\n },\n {\n \"role\": \"blossom_url_authority\",\n \"path\": \"crates/blossom/src/url.rs\",\n \"byte_length\": 14580,\n \"sha256\": \"342c995fcf620e5fb32461a7d8276f5668ba2662890bd32d12780cc9121c6451\",\n \"hash_algorithm\": \"sha256_bytes_v1\"\n },\n {\n \"role\": \"event_contract_facade\",\n \"path\": \"crates/event/src/contract.rs\",\n \"byte_length\": 86,\n \"sha256\": \"9994cbca9dcc7450ad133b6b927e7c06bee08ef813652452cc1e56a284c1be10\",\n \"hash_algorithm\": \"sha256_bytes_v1\"\n },\n {\n \"role\": \"event_contract_registry_v7_authority\",\n \"path\": \"crates/event/src/contract/registry_v7.rs\",\n \"byte_length\": 155738,\n \"sha256\": \"e9133e65b37810478c3e34ec4ac2005d81209a714ec2de5bd0232b9f02740dde\",\n \"hash_algorithm\": \"sha256_bytes_v1\"\n },\n {\n \"role\": \"event_envelope_authority\",\n \"path\": \"crates/event/src/envelope.rs\",\n \"byte_length\": 31165,\n \"sha256\": \"97a3bb38d630666bba497b98e856ee457d6899de230dabf6cab786a5bd55a3ce\",\n \"hash_algorithm\": \"sha256_bytes_v1\"\n },\n {\n \"role\": \"event_head_facade\",\n \"path\": \"crates/event/src/event_head.rs\",\n \"byte_length\": 68,\n \"sha256\": \"cb52f6006f7ecd862707d6b048f9fc407e0cd5ebcd3091b3c54e195ffa5cba64\",\n \"hash_algorithm\": \"sha256_bytes_v1\"\n },\n {\n \"role\": \"event_head_v1_authority\",\n \"path\": \"crates/event/src/event_head/v1.rs\",\n \"byte_length\": 7529,\n \"sha256\": \"0a4b50c4b7a93e9d88cc995cf69d9e87b341cba66d7feb51c357dfa4e5b2de37\",\n \"hash_algorithm\": \"sha256_bytes_v1\"\n },\n {\n \"role\": \"event_ids_authority\",\n \"path\": \"crates/event/src/ids.rs\",\n \"byte_length\": 46282,\n \"sha256\": \"f3c34e7dcf09fc225cb9c12f02ae932d5155c859f73f8b8573db8e5ebf298678\",\n \"hash_algorithm\": \"sha256_bytes_v1\"\n },\n {\n \"role\": \"event_trade_authority\",\n \"path\": \"crates/event/src/trade.rs\",\n \"byte_length\": 68376,\n \"sha256\": \"1012b44295cb26844206304bc24b355a49c18a023844f6b3905337c63b1417a7\",\n \"hash_algorithm\": \"sha256_bytes_v1\"\n },\n {\n \"role\": \"event_kinds_authority\",\n \"path\": \"crates/event/src/kinds.rs\",\n \"byte_length\": 34961,\n \"sha256\": \"8b3ce6193cab1f7e1587d0c1b2880a81b0aa43c77d89671b602772db37edcebf\",\n \"hash_algorithm\": \"sha256_bytes_v1\"\n },\n {\n \"role\": \"event_tags_authority\",\n \"path\": \"crates/event/src/tags.rs\",\n \"byte_length\": 4530,\n \"sha256\": \"cb8f12a639fc72d9238e32495d9e67e928e6627fb8c94ec0a58c5d95e7373cd6\",\n \"hash_algorithm\": \"sha256_bytes_v1\"\n },\n {\n \"role\": \"event_draft_authority\",\n \"path\": \"crates/event/src/draft.rs\",\n \"byte_length\": 58674,\n \"sha256\": \"fa4e802f1143eba72ba7fc334104ea0d6613c886725ff9f3e61dab2443c243b6\",\n \"hash_algorithm\": \"sha256_bytes_v1\"\n },\n {\n \"role\": \"event_calendar_authority\",\n \"path\": \"crates/event/src/calendar.rs\",\n \"byte_length\": 103814,\n \"sha256\": \"f8e0fcb4802d0dcd2a1a13b17216a0c5278950a60c09a261ab349e9ce1989d72\",\n \"hash_algorithm\": \"sha256_bytes_v1\"\n },\n {\n \"role\": \"event_classified_listing_authority\",\n \"path\": \"crates/event/src/classified_listing.rs\",\n \"byte_length\": 8226,\n \"sha256\": \"745aa08953a6243ea1afad22aa63e44f6746f2f243ab0d6b617d6ab64fa58749\",\n \"hash_algorithm\": \"sha256_bytes_v1\"\n },\n {\n \"role\": \"event_profile_authority\",\n \"path\": \"crates/event/src/profile.rs\",\n \"byte_length\": 18848,\n \"sha256\": \"7c7ac7f4926938f5cb5530be5450e5e23f18f216bdb222150fbdd451cec20d5c\",\n \"hash_algorithm\": \"sha256_bytes_v1\"\n },\n {\n \"role\": \"event_post_authority\",\n \"path\": \"crates/event/src/post.rs\",\n \"byte_length\": 22738,\n \"sha256\": \"7ed4a4c39bed40b134369d16e1fc35ab2c7d27ee300dd36d367025def2283b39\",\n \"hash_algorithm\": \"sha256_bytes_v1\"\n },\n {\n \"role\": \"event_comment_authority\",\n \"path\": \"crates/event/src/comment.rs\",\n \"byte_length\": 36375,\n \"sha256\": \"f4d1a57780eff0d315bc4e2fbad316dfb7c7ced1bcc9e8e85afe0b5ecdaf3aa8\",\n \"hash_algorithm\": \"sha256_bytes_v1\"\n },\n {\n \"role\": \"event_food_availability_authority\",\n \"path\": \"crates/event/src/food_availability.rs\",\n \"byte_length\": 45429,\n \"sha256\": \"b4357dfb6954631673b6cd58794015da29303cb54ce8405a57ad543870036c9e\",\n \"hash_algorithm\": \"sha256_bytes_v1\"\n },\n {\n \"role\": \"event_deletion_authority\",\n \"path\": \"crates/event/src/deletion.rs\",\n \"byte_length\": 31155,\n \"sha256\": \"c8b7ab79998ae62e03497f5511dd3950a41d73155edda3d8d34c65fc797e9d09\",\n \"hash_algorithm\": \"sha256_bytes_v1\"\n },\n {\n \"role\": \"event_relay_hint_authority\",\n \"path\": \"crates/event/src/relay_hint.rs\",\n \"byte_length\": 14317,\n \"sha256\": \"1a14aea5d2f2620970dc1de9e3d311d9042cab4d5805a56461548168112a0801\",\n \"hash_algorithm\": \"sha256_bytes_v1\"\n },\n {\n \"role\": \"event_media_authority\",\n \"path\": \"crates/event/src/media.rs\",\n \"byte_length\": 3521,\n \"sha256\": \"8f670e634452872a525efdad0cb9480288885c62f22a9b9915a67a7e7965651c\",\n \"hash_algorithm\": \"sha256_bytes_v1\"\n },\n {\n \"role\": \"event_social_authority\",\n \"path\": \"crates/event/src/social.rs\",\n \"byte_length\": 5483,\n \"sha256\": \"1b89c6d0954822e7f1e778479ed43694e88929bcd5310ee066f8f4ba6505045a\",\n \"hash_algorithm\": \"sha256_bytes_v1\"\n },\n {\n \"role\": \"event_wire_facade\",\n \"path\": \"crates/event/src/wire.rs\",\n \"byte_length\": 68,\n \"sha256\": \"cb52f6006f7ecd862707d6b048f9fc407e0cd5ebcd3091b3c54e195ffa5cba64\",\n \"hash_algorithm\": \"sha256_bytes_v1\"\n },\n {\n \"role\": \"event_wire_v1_authority\",\n \"path\": \"crates/event/src/wire/v1.rs\",\n \"byte_length\": 22133,\n \"sha256\": \"cc28c8cbd962b32ed2efe43e84c1e0d1ea3bd89636efff2d5553714072fce1a4\",\n \"hash_algorithm\": \"sha256_bytes_v1\"\n },\n {\n \"role\": \"event_codec_verification_facade\",\n \"path\": \"crates/event_codec/src/verification.rs\",\n \"byte_length\": 253,\n \"sha256\": \"b49a32df605035c87f295c0a151140d43d2e588c5e11b05183e5fc92993dae0e\",\n \"hash_algorithm\": \"sha256_bytes_v1\"\n },\n {\n \"role\": \"event_codec_verification_v1_authority\",\n \"path\": \"crates/event_codec/src/verification/v1.rs\",\n \"byte_length\": 8751,\n \"sha256\": \"fc4c5d45e475151c56330ba9c4db70de603e4ec48adabd6365f80d5f6a3733f4\",\n \"hash_algorithm\": \"sha256_bytes_v1\"\n },\n {\n \"role\": \"event_codec_registry_v7_admission_authority\",\n \"path\": \"crates/event_codec/src/admission/registry_v7.rs\",\n \"byte_length\": 5350,\n \"sha256\": \"755e63dd7ad1115c219e5a3ea540bef67d2770fc9f2a5aa6ba97c925c99bdced\",\n \"hash_algorithm\": \"sha256_bytes_v1\"\n },\n {\n \"role\": \"event_codec_profile_inbound_facade\",\n \"path\": \"crates/event_codec/src/profile/inbound.rs\",\n \"byte_length\": 86,\n \"sha256\": \"9994cbca9dcc7450ad133b6b927e7c06bee08ef813652452cc1e56a284c1be10\",\n \"hash_algorithm\": \"sha256_bytes_v1\"\n },\n {\n \"role\": \"event_codec_profile_registry_v7_authority\",\n \"path\": \"crates/event_codec/src/profile/inbound/registry_v7.rs\",\n \"byte_length\": 10394,\n \"sha256\": \"c37c225ea8153beb098a39c4a56203aa03382af12646f40cd3f8628663700702\",\n \"hash_algorithm\": \"sha256_bytes_v1\"\n },\n {\n \"role\": \"event_codec_post_inbound_facade\",\n \"path\": \"crates/event_codec/src/post/inbound.rs\",\n \"byte_length\": 86,\n \"sha256\": \"9994cbca9dcc7450ad133b6b927e7c06bee08ef813652452cc1e56a284c1be10\",\n \"hash_algorithm\": \"sha256_bytes_v1\"\n },\n {\n \"role\": \"event_codec_post_registry_v7_authority\",\n \"path\": \"crates/event_codec/src/post/inbound/registry_v7.rs\",\n \"byte_length\": 16016,\n \"sha256\": \"bc0bb839c28f3588f05544c846c987528ea3934c75305fef70af8e027a97cc58\",\n \"hash_algorithm\": \"sha256_bytes_v1\"\n },\n {\n \"role\": \"event_codec_reply_inbound_facade\",\n \"path\": \"crates/event_codec/src/reply/inbound.rs\",\n \"byte_length\": 86,\n \"sha256\": \"9994cbca9dcc7450ad133b6b927e7c06bee08ef813652452cc1e56a284c1be10\",\n \"hash_algorithm\": \"sha256_bytes_v1\"\n },\n {\n \"role\": \"event_codec_reply_registry_v7_authority\",\n \"path\": \"crates/event_codec/src/reply/inbound/registry_v7.rs\",\n \"byte_length\": 26812,\n \"sha256\": \"a72e9721ed13addca2a63942ac9e43c1daa8f1d1457eef08ec6a3ee5eb8872c5\",\n \"hash_algorithm\": \"sha256_bytes_v1\"\n },\n {\n \"role\": \"event_codec_comment_inbound_facade\",\n \"path\": \"crates/event_codec/src/comment/inbound.rs\",\n \"byte_length\": 86,\n \"sha256\": \"9994cbca9dcc7450ad133b6b927e7c06bee08ef813652452cc1e56a284c1be10\",\n \"hash_algorithm\": \"sha256_bytes_v1\"\n },\n {\n \"role\": \"event_codec_comment_registry_v7_authority\",\n \"path\": \"crates/event_codec/src/comment/inbound/registry_v7.rs\",\n \"byte_length\": 53783,\n \"sha256\": \"30d1b0155963b25d64685ddd042f423ef7707b111dc56ead15bd468e0433a432\",\n \"hash_algorithm\": \"sha256_bytes_v1\"\n },\n {\n \"role\": \"event_codec_deletion_facade\",\n \"path\": \"crates/event_codec/src/deletion/mod.rs\",\n \"byte_length\": 115,\n \"sha256\": \"17d56f82ddb0a86bc97abbcf3e037fe460ea31fff2548f527be4bf004dac3a95\",\n \"hash_algorithm\": \"sha256_bytes_v1\"\n },\n {\n \"role\": \"event_codec_deletion_reconciliation_v1_authority\",\n \"path\": \"crates/event_codec/src/deletion/reconciliation_v1.rs\",\n \"byte_length\": 38469,\n \"sha256\": \"3e06d1fa923ca5faabb1e95338c35650b0e20b078ff5c972e35ab845d8b7476c\",\n \"hash_algorithm\": \"sha256_bytes_v1\"\n },\n {\n \"role\": \"event_codec_food_inbound_facade\",\n \"path\": \"crates/event_codec/src/food_availability/inbound.rs\",\n \"byte_length\": 86,\n \"sha256\": \"9994cbca9dcc7450ad133b6b927e7c06bee08ef813652452cc1e56a284c1be10\",\n \"hash_algorithm\": \"sha256_bytes_v1\"\n },\n {\n \"role\": \"event_codec_food_registry_v7_authority\",\n \"path\": \"crates/event_codec/src/food_availability/inbound/registry_v7.rs\",\n \"byte_length\": 26764,\n \"sha256\": \"a5786cff942b7b0038f741afb5b9a19230ac58cb57a5ba747b32e1b95d414e15\",\n \"hash_algorithm\": \"sha256_bytes_v1\"\n },\n {\n \"role\": \"event_codec_job_traits_authority\",\n \"path\": \"crates/event_codec/src/job/traits.rs\",\n \"byte_length\": 5029,\n \"sha256\": \"353df3703de4d99fc318474952dc6c95cbce9a19756f3e235ed2d715f36c4364\",\n \"hash_algorithm\": \"sha256_bytes_v1\"\n },\n {\n \"role\": \"event_store_dependency_authority\",\n \"path\": \"crates/event_store/Cargo.toml\",\n \"byte_length\": 1569,\n \"sha256\": \"30f43004bcf0ffa9b9b6f338cba8c56be0265bc1cee708e93f7b7dc54ed60f9c\",\n \"hash_algorithm\": \"sha256_bytes_v1\"\n },\n {\n \"role\": \"event_store_error_and_limits\",\n \"path\": \"crates/event_store/src/error.rs\",\n \"byte_length\": 19517,\n \"sha256\": \"4bf24ee1aa6117597ab467b1379a05549b79024213dc7622a2d276bc26fffab4\",\n \"hash_algorithm\": \"sha256_bytes_v1\"\n },\n {\n \"role\": \"generated_descriptor_registration\",\n \"path\": \"crates/event_store/src/generated.rs\",\n \"byte_length\": 144,\n \"sha256\": \"6b0a8d6f249bd4fc3f878d37cb5e418680f0f1be2d9eec2518dedf03efc47121\",\n \"hash_algorithm\": \"sha256_bytes_v1\"\n },\n {\n \"role\": \"public_surface\",\n \"path\": \"crates/event_store/src/lib.rs\",\n \"byte_length\": 3844,\n \"sha256\": \"3cd9653bcb752fb3c4442d4904b98a0a6208011a9a238125b7b7073d7f4e312b\",\n \"hash_algorithm\": \"sha256_bytes_v1\"\n },\n {\n \"role\": \"migration_registry\",\n \"path\": \"crates/event_store/src/migrations.rs\",\n \"byte_length\": 73585,\n \"sha256\": \"a47477d04759ec6e71d14d3d05459864eae78fce0e3c2481a1b03147f04637f7\",\n \"hash_algorithm\": \"sha256_bytes_v1\"\n },\n {\n \"role\": \"predecessor_model_public_surface\",\n \"path\": \"crates/event_store/src/model.rs\",\n \"byte_length\": 33596,\n \"sha256\": \"98b1742ffb517f66f8e9edefa61d1c3cf3e22be5985202c6c340310a98c72c8e\",\n \"hash_algorithm\": \"sha256_bytes_v1\"\n },\n {\n \"role\": \"event_store_reconciliation_v1_model\",\n \"path\": \"crates/event_store/src/model/reconciliation_v1.rs\",\n \"byte_length\": 11138,\n \"sha256\": \"8a26bc373035878ef9b41767ceea7b681896e17d88bedce118de1d622125e1d6\",\n \"hash_algorithm\": \"sha256_bytes_v1\"\n },\n {\n \"role\": \"event_store_reconciliation_v1_ingest_model\",\n \"path\": \"crates/event_store/src/model/ingest_reconciliation_v1.rs\",\n \"byte_length\": 1626,\n \"sha256\": \"47bf13b3fc0f8a913a660f7d655413de0f6b90568bc4acc510aa6bd741bab47b\",\n \"hash_algorithm\": \"sha256_bytes_v1\"\n },\n {\n \"role\": \"addressable_transition_feed_model\",\n \"path\": \"crates/event_store/src/model/addressable_transition_feed_v1.rs\",\n \"byte_length\": 22279,\n \"sha256\": \"f8ea454a0e998a3d433bba52d1ff9759a04fcb91db286cf2a2b10ef7d0057694\",\n \"hash_algorithm\": \"sha256_bytes_v1\"\n },\n {\n \"role\": \"food_projection_model\",\n \"path\": \"crates/event_store/src/model/food_availability_projection_v1.rs\",\n \"byte_length\": 17437,\n \"sha256\": \"6fdfc8c5eb3dd9c451fd47b2394af123b50f7fe6d74113f8777221a8fa31ba30\",\n \"hash_algorithm\": \"sha256_bytes_v1\"\n },\n {\n \"role\": \"source_generation_rebuild_authority\",\n \"path\": \"crates/event_store/src/nip09/reconciliation_v1.rs\",\n \"byte_length\": 184402,\n \"sha256\": \"7fa01e52f51d3470ba60e6068dc05797c2a6eaf5eb317d23111a961dbe4451f9\",\n \"hash_algorithm\": \"sha256_bytes_v1\"\n },\n {\n \"role\": \"schema_migration_and_reopen_authority\",\n \"path\": \"crates/event_store/src/schema.rs\",\n \"byte_length\": 146146,\n \"sha256\": \"93b060e80d3edd73f86208e4bf698fa9d53eaf1eeb04526c9261fb8b5726fb0d\",\n \"hash_algorithm\": \"sha256_bytes_v1\"\n },\n {\n \"role\": \"public_store_and_transaction_authority\",\n \"path\": \"crates/event_store/src/store.rs\",\n \"byte_length\": 394732,\n \"sha256\": \"6710a4b3e366b724f6b3d4904e2403c15456f23111996945931d2ba20e301f52\",\n \"hash_algorithm\": \"sha256_bytes_v1\"\n },\n {\n \"role\": \"addressable_transition_feed_store\",\n \"path\": \"crates/event_store/src/store/addressable_transition_feed_v1.rs\",\n \"byte_length\": 40254,\n \"sha256\": \"de656face46735b938b7b20780687404eade47885871129cc5a7c009155d6336\",\n \"hash_algorithm\": \"sha256_bytes_v1\"\n },\n {\n \"role\": \"food_projection_store\",\n \"path\": \"crates/event_store/src/store/food_availability_projection_v1.rs\",\n \"byte_length\": 48971,\n \"sha256\": \"189b824af305f39c7f71a285f4746455ff30f1a27b24b95d8d21223b41772152\",\n \"hash_algorithm\": \"sha256_bytes_v1\"\n },\n {\n \"role\": \"predecessor_post_core_v1_extension\",\n \"path\": \"crates/event_store/src/store/post_core_extensions_v1.rs\",\n \"byte_length\": 6923,\n \"sha256\": \"2fbfc6252f9ce249468a99b5230fd6b7b59b9e47ee4f38783c5fd9379c823fd0\",\n \"hash_algorithm\": \"sha256_bytes_v1\"\n },\n {\n \"role\": \"predecessor_post_core_v1_storage\",\n \"path\": \"crates/event_store/src/store/post_core_storage_v1.rs\",\n \"byte_length\": 16876,\n \"sha256\": \"f27dc7dcd643762226f8d4df0d297027b384bcf1004277222e978965bc2d40cf\",\n \"hash_algorithm\": \"sha256_bytes_v1\"\n },\n {\n \"role\": \"raw_ingest_capacity_authority\",\n \"path\": \"crates/event_store/src/store/protocol_reconciliation_v1.rs\",\n \"byte_length\": 30145,\n \"sha256\": \"a8a26763dc39124ab7537fdcc3f89a1f0aa7e1830f4f9dec9ee4057bbb4fd228\",\n \"hash_algorithm\": \"sha256_bytes_v1\"\n },\n {\n \"role\": \"predecessor_protocol_storage\",\n \"path\": \"crates/event_store/src/store/protocol_storage_v1.rs\",\n \"byte_length\": 10929,\n \"sha256\": \"20de4436945bac0d8cbeca0ae6cd95232a92da8cd6be6ae6beacba17fe50d658\",\n \"hash_algorithm\": \"sha256_bytes_v1\"\n },\n {\n \"role\": \"source_maintenance_runtime\",\n \"path\": \"crates/event_store/src/source_maintenance_v1.rs\",\n \"byte_length\": 51762,\n \"sha256\": \"5db9c9e86fd18a2fcc08dbc3468f373bf39d8948bc6a08936b252a4dda3546e9\",\n \"hash_algorithm\": \"sha256_bytes_v1\"\n },\n {\n \"role\": \"predecessor_food_result_vector_executor\",\n \"path\": \"crates/event_store/tests/food_availability_projection_v1_result_vector.rs\",\n \"byte_length\": 34070,\n \"sha256\": \"aa098bcb0f975f690ca9535d3cbb76c6e57e6d70fd3a892c4399fd35fe8ec21c\",\n \"hash_algorithm\": \"sha256_bytes_v1\"\n },\n {\n \"role\": \"artifact_transaction_authority\",\n \"path\": \"tools/xtask/src/contract/artifact_bundle.rs\",\n \"byte_length\": 38279,\n \"sha256\": \"f326ea57b56d40135f95b6b1e15961f66eed363337180a6d12a5ea903e1a9a29\",\n \"hash_algorithm\": \"sha256_bytes_v1\"\n },\n {\n \"role\": \"predecessor_successor_governance\",\n \"path\": \"tools/xtask/src/contract/food_availability_projection.rs\",\n \"byte_length\": 197131,\n \"sha256\": \"6b71c927b41404f633dfbd0f8e321dcdab933285a196671f27046c0c15d55434\",\n \"hash_algorithm\": \"sha256_bytes_v1\"\n },\n {\n \"role\": \"transitive_predecessor_membership_governance\",\n \"path\": \"tools/xtask/src/contract/nip09_reconciliation.rs\",\n \"byte_length\": 836131,\n \"sha256\": \"af71c0172eb214f10a615fc867e309cb6d07780a0dc583858a42c617e10cea83\",\n \"hash_algorithm\": \"sha256_bytes_v1\"\n },\n {\n \"role\": \"source_maintenance_governance\",\n \"path\": \"tools/xtask/src/contract/source_maintenance.rs\",\n \"byte_length\": 190367,\n \"sha256\": \"17476b4253f108f49f9c4be82205c6fe2e31b5ce151f34d9775fc27c8e7b6bb7\",\n \"hash_algorithm\": \"sha256_bytes_v1\"\n },\n {\n \"role\": \"contract_command_authority\",\n \"path\": \"tools/xtask/src/contract.rs\",\n \"byte_length\": 504182,\n \"sha256\": \"7edf6ffda5dec9e08b66ad100d9119a705c994af692fd287e90700830de12281\",\n \"hash_algorithm\": \"sha256_bytes_v1\"\n },\n {\n \"role\": \"xtask_dispatch_and_release_preflight\",\n \"path\": \"tools/xtask/src/main.rs\",\n \"byte_length\": 15786,\n \"sha256\": \"6bffd4851031c75b1b77593c498ae0758901dae06c25e1449c7f2cc58125bde8\",\n \"hash_algorithm\": \"sha256_bytes_v1\"\n }\n ],\n \"public_api\": {\n \"inherited_predecessor_symbols\": [\n \"RADROOTS_ADDRESSABLE_TRANSITION_CURSOR_JSON_MAX_BYTES_V1\",\n \"RADROOTS_ADDRESSABLE_TRANSITION_D_TAG_MAX_BYTES_V1\",\n \"RADROOTS_ADDRESSABLE_TRANSITION_FEED_VERSION_V1\",\n \"RADROOTS_ADDRESSABLE_TRANSITION_PAGE_LIMIT_MAX_V1\",\n \"RADROOTS_ADDRESSABLE_TRANSITION_PAGE_RAW_JSON_MAX_BYTES_V1\",\n \"RADROOTS_ADDRESSABLE_TRANSITION_PAGE_SCAN_MAX_V1\",\n \"RADROOTS_ADDRESSABLE_TRANSITION_SCOPE_KIND_MAX_V1\",\n \"RADROOTS_FOOD_AVAILABILITY_PROJECTION_APPLY_PAGE_LIMIT_V1\",\n \"RADROOTS_FOOD_AVAILABILITY_PROJECTION_VERSION_V1\",\n \"RADROOTS_FOOD_AVAILABILITY_SEARCH_QUERY_MAX_BYTES_V1\",\n \"RADROOTS_FOOD_AVAILABILITY_SEARCH_QUERY_MAX_TERMS_V1\",\n \"RadrootsAddressableTransitionCauseV1\",\n \"RadrootsAddressableTransitionCoordinateV1\",\n \"RadrootsAddressableTransitionCursorV1\",\n \"RadrootsAddressableTransitionEventReferenceV1\",\n \"RadrootsAddressableTransitionOriginV1\",\n \"RadrootsAddressableTransitionPageV1\",\n \"RadrootsAddressableTransitionRawHeadDecisionV1\",\n \"RadrootsAddressableTransitionScopeFingerprintV1\",\n \"RadrootsAddressableTransitionScopeV1\",\n \"RadrootsAddressableTransitionV1\",\n \"RadrootsAddressableTransitionVisibilityV1\",\n \"RadrootsCurrentEventVisibilityV1\",\n \"RadrootsCurrentVisibilityDecisionV1\",\n \"RadrootsFoodAvailabilitySearchQueryV1\",\n \"RadrootsFoodAvailabilityStatusFilterV1\",\n \"RadrootsNip09SuppressionEvidenceV1\",\n \"RadrootsNip09SuppressionOutcome\",\n \"RadrootsNip09SuppressionReason\",\n \"RadrootsStoreProducedCanonicalEventV1\",\n \"RadrootsStoredFoodAvailabilityImageV1\",\n \"RadrootsStoredFoodAvailabilityV1\"\n ],\n \"added_symbols\": [\n \"RADROOTS_EVENT_STORE_RAW_EVENT_COUNT_LIMIT_V1\",\n \"RADROOTS_EVENT_STORE_RAW_EVENT_TEXT_BYTES_LIMIT_V1\",\n \"RADROOTS_EVENT_STORE_RAW_TAG_COUNT_LIMIT_V1\",\n \"RADROOTS_EVENT_STORE_RAW_TAG_TEXT_BYTES_LIMIT_V1\",\n \"RADROOTS_EVENT_STORE_RETAINED_SOURCE_GENERATION_LIMIT_V1\",\n \"RadrootsEventStoreSourceCapacityResourceV1\",\n \"RadrootsEventStoreSourceCapacityV1\"\n ],\n \"methods\": [\n \"RadrootsEventStore::source_capacity_v1\",\n \"RadrootsEventStoreSourceCapacityResourceV1::as_str\",\n \"RadrootsEventStoreSourceCapacityV1::source_generation\",\n \"RadrootsEventStoreSourceCapacityV1::raw_event_count\",\n \"RadrootsEventStoreSourceCapacityV1::raw_tag_count\",\n \"RadrootsEventStoreSourceCapacityV1::raw_event_text_bytes\",\n \"RadrootsEventStoreSourceCapacityV1::raw_tag_text_bytes\",\n \"RadrootsEventStoreSourceCapacityV1::raw_high_water_seq\",\n \"RadrootsEventStoreSourceCapacityV1::retained_generation_count\",\n \"RadrootsEventStoreSourceCapacityV1::retained_generation_limit\"\n ],\n \"error_variants\": [\n \"SourceCapacityExceeded\",\n \"SourceGenerationHistoryLimitReached\",\n \"PersistedEphemeralRawEvent\",\n \"SourceCapacityStateDrift\",\n \"SqliteMainDatabaseEncodingNotUtf8\",\n \"RollbackWouldDiscardSourceGenerationHistory\"\n ],\n \"removed_symbols\": [\n \"RadrootsEventStoreReconciliationResource\",\n \"RadrootsEventStoreError::ReconciliationCapacityExceeded\"\n ],\n \"breaking_replacements\": [\n {\n \"removed\": \"RadrootsEventStoreReconciliationResource\",\n \"replacement\": \"RadrootsEventStoreSourceCapacityResourceV1\"\n },\n {\n \"removed\": \"RadrootsEventStoreError::ReconciliationCapacityExceeded\",\n \"replacement\": \"RadrootsEventStoreError::SourceCapacityExceeded\"\n }\n ]\n },\n \"result_vector\": {\n \"canonical_path\": \"contracts/conformance/vectors/event_store/source_maintenance.v1.json\",\n \"mirror_path\": \"crates/event_store/tests/fixtures/source_maintenance.v1.json\",\n \"byte_length\": 16253,\n \"sha256\": \"997aba2604a2b9d199fb87dc9d07942ca50d91863aeadcf3eeacf16d191dd71f\",\n \"hash_algorithm\": \"sha256_bytes_v1\",\n \"executor_id\": \"radroots_event_store.source_maintenance_v1.result_vector_executor.v1\",\n \"executor_path\": \"crates/event_store/tests/source_maintenance_v1_result_vector.rs\",\n \"executor_test\": \"source_maintenance_v1_result_vector\",\n \"executor_byte_length\": 23510,\n \"executor_sha256\": \"a7487afdfe19fc5fc794811d0f0e6035203e1aabcf0a33a1d398f6b3555d38f3\",\n \"executor_hash_algorithm\": \"sha256_bytes_v1\"\n }\n}\n"; pub(crate) const SOURCE_MAINTENANCE_MANIFEST_BYTE_LENGTH: usize = 31374; pub(crate) const SOURCE_MAINTENANCE_MANIFEST_SHA256: &str = - "22cc195ee967cec226d47948f005fa4689da276a00c3bbce187d76b1d7dbf6b4"; + "10e969687cc2a034ed5c190d037f81268efc4fff45abe87959ff96875e8ba057"; pub(crate) const SOURCE_MAINTENANCE_MANIFEST_SCHEMA_VERSION: u32 = 1; pub(crate) const SOURCE_MAINTENANCE_CONTRACT_ID: &str = "radroots_event_store.source_maintenance_v1"; diff --git a/crates/protocol_contract_v1/Cargo.toml b/crates/protocol_contract_v1/Cargo.toml @@ -14,12 +14,10 @@ readme = "README" [features] default = ["std", "serde"] -dto-bindgen = ["std", "serde", "dep:dto_bindgen"] serde = ["dep:serde"] std = [] [dependencies] -dto_bindgen = { workspace = true, optional = true } serde = { workspace = true, default-features = false, features = [ "alloc", "derive", diff --git a/crates/protocol_contract_v1/src/lib.rs b/crates/protocol_contract_v1/src/lib.rs @@ -9,18 +9,12 @@ use alloc::string::{String, ToString}; pub const PROTOCOL_CONTRACT_NAME_V1: &str = "radroots.protocol"; pub const PROTOCOL_CONTRACT_VERSION_V1: u16 = 1; -#[cfg_attr(feature = "dto-bindgen", derive(dto_bindgen::Dto))] -#[cfg_attr(feature = "dto-bindgen", dto(export))] -#[cfg_attr(feature = "dto-bindgen", dto(as = "string_enum"))] #[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))] #[cfg_attr(feature = "serde", serde(rename_all = "snake_case"))] #[derive(Clone, Copy, Debug, PartialEq, Eq, PartialOrd, Ord, Hash)] pub enum TransportKindV1 { - #[cfg_attr(feature = "dto-bindgen", dto(rename = "local"))] Local, - #[cfg_attr(feature = "dto-bindgen", dto(rename = "nostr"))] Nostr, - #[cfg_attr(feature = "dto-bindgen", dto(rename = "reticulum"))] Reticulum, } @@ -45,36 +39,23 @@ impl TransportKindV1 { } } -#[cfg_attr(feature = "dto-bindgen", derive(dto_bindgen::Dto))] -#[cfg_attr(feature = "dto-bindgen", dto(export))] -#[cfg_attr(feature = "dto-bindgen", dto(as = "string_enum"))] #[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))] #[cfg_attr(feature = "serde", serde(rename_all = "snake_case"))] #[derive(Clone, Copy, Debug, PartialEq, Eq, PartialOrd, Ord, Hash)] pub enum CapabilityMaturityV1 { - #[cfg_attr(feature = "dto-bindgen", dto(rename = "preview"))] Preview, - #[cfg_attr(feature = "dto-bindgen", dto(rename = "stable"))] Stable, } -#[cfg_attr(feature = "dto-bindgen", derive(dto_bindgen::Dto))] -#[cfg_attr(feature = "dto-bindgen", dto(export))] -#[cfg_attr(feature = "dto-bindgen", dto(as = "string_enum"))] #[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))] #[cfg_attr(feature = "serde", serde(rename_all = "snake_case"))] #[derive(Clone, Copy, Debug, PartialEq, Eq, PartialOrd, Ord, Hash)] pub enum CapabilityAvailabilityV1 { - #[cfg_attr(feature = "dto-bindgen", dto(rename = "available"))] Available, - #[cfg_attr(feature = "dto-bindgen", dto(rename = "degraded"))] Degraded, - #[cfg_attr(feature = "dto-bindgen", dto(rename = "unavailable"))] Unavailable, } -#[cfg_attr(feature = "dto-bindgen", derive(dto_bindgen::Dto))] -#[cfg_attr(feature = "dto-bindgen", dto(export))] #[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))] #[cfg_attr(feature = "serde", serde(deny_unknown_fields))] #[derive(Clone, Debug, PartialEq, Eq, PartialOrd, Ord, Hash)] @@ -101,8 +82,6 @@ impl MeshScopeIdV1 { } } -#[cfg_attr(feature = "dto-bindgen", derive(dto_bindgen::Dto))] -#[cfg_attr(feature = "dto-bindgen", dto(export))] #[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))] #[cfg_attr(feature = "serde", serde(deny_unknown_fields))] #[derive(Clone, Debug, PartialEq, Eq, PartialOrd, Ord, Hash)] @@ -129,8 +108,6 @@ impl ReticulumDestinationV1 { } } -#[cfg_attr(feature = "dto-bindgen", derive(dto_bindgen::Dto))] -#[cfg_attr(feature = "dto-bindgen", dto(export))] #[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))] #[cfg_attr(feature = "serde", serde(deny_unknown_fields))] #[derive(Clone, Debug, PartialEq, Eq)] @@ -139,8 +116,6 @@ pub struct ReticulumTargetV1 { pub mesh_scope: Option<MeshScopeIdV1>, } -#[cfg_attr(feature = "dto-bindgen", derive(dto_bindgen::Dto))] -#[cfg_attr(feature = "dto-bindgen", dto(export))] #[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))] #[cfg_attr(feature = "serde", serde(deny_unknown_fields))] #[derive(Clone, Copy, Debug, PartialEq, Eq)] @@ -192,20 +167,13 @@ pub const TRANSPORT_CAPABILITY_CATALOG_V1: &[TransportCapabilityDescriptorV1] = }, ]; -#[cfg_attr(feature = "dto-bindgen", derive(dto_bindgen::Dto))] -#[cfg_attr(feature = "dto-bindgen", dto(export))] -#[cfg_attr(feature = "dto-bindgen", dto(as = "string_enum"))] #[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))] #[cfg_attr(feature = "serde", serde(rename_all = "snake_case"))] #[derive(Clone, Copy, Debug, PartialEq, Eq, PartialOrd, Ord, Hash)] pub enum ProtocolEventClassV1 { - #[cfg_attr(feature = "dto-bindgen", dto(rename = "regular"))] Regular, - #[cfg_attr(feature = "dto-bindgen", dto(rename = "replaceable"))] Replaceable, - #[cfg_attr(feature = "dto-bindgen", dto(rename = "addressable"))] Addressable, - #[cfg_attr(feature = "dto-bindgen", dto(rename = "unsigned_rumor"))] UnsignedRumor, } @@ -321,28 +289,17 @@ pub const RETIRED_PROTOCOL_EVENT_NAMES_V1: &[&str] = &[ "trade_transition_proof_result", ]; -#[cfg_attr(feature = "dto-bindgen", derive(dto_bindgen::Dto))] -#[cfg_attr(feature = "dto-bindgen", dto(export))] -#[cfg_attr(feature = "dto-bindgen", dto(as = "string_enum"))] #[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))] #[cfg_attr(feature = "serde", serde(rename_all = "snake_case"))] #[derive(Clone, Copy, Debug, PartialEq, Eq, PartialOrd, Ord, Hash)] pub enum ProtocolTradeStateV1 { - #[cfg_attr(feature = "dto-bindgen", dto(rename = "missing"))] Missing, - #[cfg_attr(feature = "dto-bindgen", dto(rename = "requested"))] Requested, - #[cfg_attr(feature = "dto-bindgen", dto(rename = "agreed_pending_validation"))] AgreedPendingValidation, - #[cfg_attr(feature = "dto-bindgen", dto(rename = "committed"))] Committed, - #[cfg_attr(feature = "dto-bindgen", dto(rename = "declined"))] Declined, - #[cfg_attr(feature = "dto-bindgen", dto(rename = "cancelled"))] Cancelled, - #[cfg_attr(feature = "dto-bindgen", dto(rename = "validation_expired"))] ValidationExpired, - #[cfg_attr(feature = "dto-bindgen", dto(rename = "invalid"))] Invalid, } @@ -559,22 +516,6 @@ fn validate_schema_metadata( Ok(()) } -#[cfg(feature = "dto-bindgen")] -pub fn dto_roots() -> alloc::vec::Vec<dto_bindgen::export::RootDescriptor> { - use dto_bindgen::export::RootDescriptor; - alloc::vec![ - RootDescriptor::new::<TransportKindV1>(), - RootDescriptor::new::<CapabilityMaturityV1>(), - RootDescriptor::new::<CapabilityAvailabilityV1>(), - RootDescriptor::new::<MeshScopeIdV1>(), - RootDescriptor::new::<ReticulumDestinationV1>(), - RootDescriptor::new::<ReticulumTargetV1>(), - RootDescriptor::new::<TransportCapabilityDescriptorV1>(), - RootDescriptor::new::<ProtocolEventClassV1>(), - RootDescriptor::new::<ProtocolTradeStateV1>(), - ] -} - #[cfg(test)] mod tests { use super::*; diff --git a/crates/protocol_contract_v1/tests/successor_equivalence.rs b/crates/protocol_contract_v1/tests/successor_equivalence.rs @@ -3,7 +3,7 @@ use std::collections::BTreeMap; use radroots_protocol::{ capability::v1 as capability, event::v1 as event, - schema::{ModuleVersion, protocol_v1_registry}, + schema::{ModuleVersion, SchemaId, protocol_v1_registry}, }; use radroots_protocol_contract_v1 as predecessor; @@ -89,10 +89,9 @@ fn schema_metadata_bytes_and_dispatch_are_preserved() { assert_eq!(successor, predecessor); let registry = protocol_v1_registry().expect("successor schema registry"); - for descriptor in registry.descriptors() { - let module = registry - .module_for(descriptor.id()) - .expect("registered module"); + for schema_id in predecessor.keys() { + let schema_id = SchemaId::parse(*schema_id).expect("predecessor schema id"); + let module = registry.module_for(&schema_id).expect("registered module"); assert!(matches!( module, ModuleVersion::CapabilityV1 | ModuleVersion::EventV1 diff --git a/tools/xtask/Cargo.toml b/tools/xtask/Cargo.toml @@ -20,6 +20,7 @@ quote = { workspace = true } radroots_event_codec = { workspace = true, features = [ "contract-manifest", ], default-features = false } +radroots_protocol = { workspace = true, features = ["std"] } radroots_protocol_contract_v1 = { workspace = true, features = ["std"] } semver = { workspace = true } serde = { workspace = true, features = ["derive"] } diff --git a/tools/xtask/src/contract/source_maintenance.rs b/tools/xtask/src/contract/source_maintenance.rs @@ -75,7 +75,7 @@ const FOOD_PREDECESSOR_RESULT_VECTOR_EXECUTOR_RELATIVE: &str = const CONTRACT_COMMAND_SOURCE_RELATIVE: &str = "tools/xtask/src/contract.rs"; const XTASK_MAIN_SOURCE_RELATIVE: &str = "tools/xtask/src/main.rs"; const XTASK_MAIN_FULL_AST_SHA256: &str = - "e9db250071c528e1483f80e973fe502b0e1e3f2cbadb86d6fa3842ad2b2f0eea"; + "7c47d54d757bb413be1326d1a0a366e1edd2863e644146552faa50a46c235c6d"; const RAW_EVENT_COLUMNS: &[&str] = &[ "event_id", @@ -1351,6 +1351,7 @@ fn validate_contract_command_reachability_sources( .map_err(|error| error.to_string())?; let root = workspace_root(); dto_roots::check(&root)?; + generate::protocol::check(&root)?; contract::load_contract_bundle(&root) .and_then(|bundle| contract::validate_contract_bundle(&bundle)) .and_then(|_| contract::validate_canonical_event_boundary(&root)) @@ -1363,6 +1364,7 @@ fn validate_contract_command_reachability_sources( "release_preflight_at", r#"fn release_preflight_at(root: &Path) -> Result<(), String> { dto_roots::check(root)?; + generate::protocol::check(root)?; contract::validate_artifact_contracts(root)?; contract::validate_release_preflight(root) }"#, @@ -4457,6 +4459,29 @@ mod tests { ), ), ( + "contract protocol freshness removal", + contract.clone(), + main.replacen(" generate::protocol::check(&root)?;\n", "", 1), + ), + ( + "contract protocol freshness discarded result", + contract.clone(), + main.replacen( + " generate::protocol::check(&root)?;", + " let _ = generate::protocol::check(&root);", + 1, + ), + ), + ( + "contract protocol freshness reordering", + contract.clone(), + main.replacen( + " dto_roots::check(&root)?;\n generate::protocol::check(&root)?;", + " generate::protocol::check(&root)?;\n dto_roots::check(&root)?;", + 1, + ), + ), + ( "contract validate dispatch bypass", contract.clone(), main.replacen( @@ -4480,6 +4505,29 @@ mod tests { main.replacen(" contract::validate_artifact_contracts(root)?;\n", "", 1), ), ( + "release protocol freshness removal", + contract.clone(), + main.replacen(" generate::protocol::check(root)?;\n", "", 1), + ), + ( + "release protocol freshness discarded result", + contract.clone(), + main.replacen( + " generate::protocol::check(root)?;", + " let _ = generate::protocol::check(root);", + 1, + ), + ), + ( + "release protocol freshness reordering", + contract.clone(), + main.replacen( + " dto_roots::check(root)?;\n generate::protocol::check(root)?;", + " generate::protocol::check(root)?;\n dto_roots::check(root)?;", + 1, + ), + ), + ( "release validation discarded result", contract.clone(), main.replacen( @@ -4492,8 +4540,8 @@ mod tests { "release validation reordering", contract.clone(), main.replacen( - " dto_roots::check(root)?;\n contract::validate_artifact_contracts(root)?;", - " contract::validate_artifact_contracts(root)?;\n dto_roots::check(root)?;", + " generate::protocol::check(root)?;\n contract::validate_artifact_contracts(root)?;", + " contract::validate_artifact_contracts(root)?;\n generate::protocol::check(root)?;", 1, ), ), diff --git a/tools/xtask/src/generate/mod.rs b/tools/xtask/src/generate/mod.rs @@ -0,0 +1,10 @@ +use std::path::Path; + +pub(crate) mod protocol; + +pub(crate) fn run(args: &[String], workspace_root: &Path) -> Result<(), String> { + match args { + [target, mode] if target == "protocol" => protocol::run(mode, workspace_root), + _ => Err("usage: cargo xtask generate protocol --check|--write".to_owned()), + } +} diff --git a/tools/xtask/src/generate/protocol.rs b/tools/xtask/src/generate/protocol.rs @@ -0,0 +1,490 @@ +use std::{ + collections::{BTreeMap, BTreeSet}, + fs, + io::{ErrorKind, Write}, + path::{Component, Path, PathBuf}, +}; + +use quote::ToTokens; +use serde::{Deserialize, Serialize}; +use sha2::{Digest, Sha256}; +use syn::{Item, Type, Visibility}; +use tempfile::NamedTempFile; + +const CONFIG_PATH: &str = "contracts/codegen/protocol_v1.toml"; +const PACKAGE: &str = "radroots_protocol"; +const HASH_ALGORITHM: &str = "sha256_bytes_v1"; +const EXPECTED_SOURCES: &[(&str, &str)] = &[ + ("capability::v1", "crates/protocol/src/capability/v1.rs"), + ("error::v1", "crates/protocol/src/error/v1.rs"), + ("event::v1", "crates/protocol/src/event/v1.rs"), + ( + "radrootsd::transport_publish::v5", + "crates/protocol/src/radrootsd/transport_publish/v5.rs", + ), + ("runtime::v1", "crates/protocol/src/runtime/v1.rs"), +]; + +#[derive(Debug, Deserialize)] +#[serde(deny_unknown_fields)] +struct Config { + schema_version: u16, + package: String, + source_hash_algorithm: String, + inventory_path: String, + inventory_sha256_path: String, + source: Vec<SourceConfig>, +} + +#[derive(Clone, Debug, Deserialize, Eq, Ord, PartialEq, PartialOrd)] +#[serde(deny_unknown_fields)] +struct SourceConfig { + module: String, + path: String, +} + +#[derive(Debug, Serialize)] +struct Inventory { + schema_version: u16, + generator: &'static str, + package: &'static str, + source_hash_algorithm: &'static str, + sources: Vec<SourceInventory>, + schemas: Vec<SchemaInventory>, +} + +#[derive(Debug, Serialize)] +struct SourceInventory { + module: String, + path: String, + sha256: String, + types: Vec<TypeInventory>, +} + +#[derive(Debug, Serialize)] +struct TypeInventory { + rust_path: String, + kind: &'static str, +} + +#[derive(Clone, Debug, Serialize)] +struct SchemaInventory { + schema_id: String, + module: String, + generation: u16, +} + +struct GeneratedFile { + path: PathBuf, + display_path: String, + bytes: Vec<u8>, +} + +pub(crate) fn run(mode: &str, workspace_root: &Path) -> Result<(), String> { + let config = load_config(workspace_root)?; + validate_config(&config)?; + let schemas = protocol_schemas()?; + let generated = render_outputs(workspace_root, &config, schemas)?; + match mode { + "--check" => check_outputs(&generated), + "--write" => write_outputs(&generated), + _ => Err("usage: cargo xtask generate protocol --check|--write".to_owned()), + } +} + +pub(crate) fn check(workspace_root: &Path) -> Result<(), String> { + run("--check", workspace_root) +} + +fn load_config(workspace_root: &Path) -> Result<Config, String> { + let path = safe_workspace_file(workspace_root, CONFIG_PATH, false, "protocol codegen input")?; + let source = fs::read_to_string(&path) + .map_err(|error| format!("failed to read `{CONFIG_PATH}`: {error}"))?; + toml::from_str(&source).map_err(|error| format!("invalid `{CONFIG_PATH}`: {error}")) +} + +fn validate_config(config: &Config) -> Result<(), String> { + if config.schema_version != 1 { + return Err("protocol codegen schema_version must be 1".to_owned()); + } + if config.package != PACKAGE { + return Err(format!("protocol codegen package must be `{PACKAGE}`")); + } + if config.source_hash_algorithm != HASH_ALGORITHM { + return Err(format!( + "protocol codegen source_hash_algorithm must be `{HASH_ALGORITHM}`" + )); + } + if config.inventory_path != "contracts/codegen/protocol_v1.inventory.json" + || config.inventory_sha256_path != "contracts/codegen/protocol_v1.inventory.sha256" + { + return Err("protocol codegen output paths are fixed by contract".to_owned()); + } + + let mut actual = config + .source + .iter() + .map(|source| (source.module.as_str(), source.path.as_str())) + .collect::<Vec<_>>(); + actual.sort_unstable(); + if actual != EXPECTED_SOURCES { + return Err(format!( + "protocol codegen source inventory drifted: expected {EXPECTED_SOURCES:?}, found {actual:?}" + )); + } + if config + .source + .iter() + .map(|source| &source.module) + .collect::<BTreeSet<_>>() + .len() + != config.source.len() + { + return Err("protocol codegen modules must be unique".to_owned()); + } + Ok(()) +} + +fn protocol_schemas() -> Result<Vec<SchemaInventory>, String> { + let registry = radroots_protocol::schema::protocol_v1_registry() + .map_err(|error| format!("invalid protocol schema registry: {error}"))?; + Ok(registry + .descriptors() + .iter() + .map(|descriptor| SchemaInventory { + schema_id: descriptor.id().as_str().to_owned(), + module: descriptor.module().path().to_owned(), + generation: descriptor.module().generation(), + }) + .collect()) +} + +fn render_outputs( + workspace_root: &Path, + config: &Config, + schemas: Vec<SchemaInventory>, +) -> Result<Vec<GeneratedFile>, String> { + let mut sources = config.source.clone(); + sources.sort(); + let mut inventories = Vec::with_capacity(sources.len()); + for source in sources { + let path = safe_workspace_file(workspace_root, &source.path, false, "protocol DTO source")?; + let bytes = fs::read(&path).map_err(|error| { + format!( + "failed to read protocol DTO source `{}`: {error}", + source.path + ) + })?; + let text = std::str::from_utf8(&bytes).map_err(|error| { + format!( + "protocol DTO source `{}` is not UTF-8: {error}", + source.path + ) + })?; + inventories.push(SourceInventory { + module: source.module.clone(), + path: source.path.clone(), + sha256: sha256_hex(&bytes), + types: serialized_public_types(&source.module, &source.path, text)?, + }); + } + + let inventory = Inventory { + schema_version: 1, + generator: "radroots_xtask.protocol_codegen.v1", + package: PACKAGE, + source_hash_algorithm: HASH_ALGORITHM, + sources: inventories, + schemas, + }; + let mut inventory_bytes = serde_json::to_vec_pretty(&inventory) + .map_err(|error| format!("failed to serialize protocol DTO inventory: {error}"))?; + inventory_bytes.push(b'\n'); + let digest_bytes = format!("{}\n", sha256_hex(&inventory_bytes)).into_bytes(); + + Ok(vec![ + GeneratedFile { + path: safe_workspace_file( + workspace_root, + &config.inventory_path, + true, + "protocol DTO inventory output", + )?, + display_path: config.inventory_path.clone(), + bytes: inventory_bytes, + }, + GeneratedFile { + path: safe_workspace_file( + workspace_root, + &config.inventory_sha256_path, + true, + "protocol DTO inventory digest output", + )?, + display_path: config.inventory_sha256_path.clone(), + bytes: digest_bytes, + }, + ]) +} + +fn serialized_public_types( + module: &str, + source_path: &str, + source: &str, +) -> Result<Vec<TypeInventory>, String> { + let syntax = syn::parse_file(source) + .map_err(|error| format!("failed to parse protocol DTO source `{source_path}`: {error}"))?; + let manual_serializers = syntax + .items + .iter() + .filter_map(manual_serialize_target) + .collect::<BTreeSet<_>>(); + let mut types = BTreeMap::new(); + for item in &syntax.items { + let (name, kind, visibility, attributes) = match item { + Item::Enum(item) => (&item.ident, "enum", &item.vis, &item.attrs), + Item::Struct(item) => (&item.ident, "struct", &item.vis, &item.attrs), + _ => continue, + }; + if !matches!(visibility, Visibility::Public(_)) { + continue; + } + let name = name.to_string(); + let derives_serialize = attributes.iter().any(|attribute| { + attribute + .meta + .to_token_stream() + .to_string() + .contains("Serialize") + }); + if derives_serialize || manual_serializers.contains(&name) { + types.insert( + name.clone(), + TypeInventory { + rust_path: format!("radroots_protocol::{module}::{name}"), + kind, + }, + ); + } + } + if types.is_empty() { + return Err(format!( + "protocol DTO source `{source_path}` exposes no serialized public types" + )); + } + Ok(types.into_values().collect()) +} + +fn manual_serialize_target(item: &Item) -> Option<String> { + let Item::Impl(item) = item else { + return None; + }; + let (_, trait_path, _) = item.trait_.as_ref()?; + if trait_path.segments.last()?.ident != "Serialize" { + return None; + } + let Type::Path(self_type) = item.self_ty.as_ref() else { + return None; + }; + Some(self_type.path.segments.last()?.ident.to_string()) +} + +fn check_outputs(generated: &[GeneratedFile]) -> Result<(), String> { + let stale = generated + .iter() + .filter_map(|output| match fs::read(&output.path) { + Ok(actual) if actual == output.bytes => None, + Ok(_) => Some(format!("stale `{}`", output.display_path)), + Err(error) if error.kind() == ErrorKind::NotFound => { + Some(format!("missing `{}`", output.display_path)) + } + Err(error) => Some(format!("unreadable `{}`: {error}", output.display_path)), + }) + .collect::<Vec<_>>(); + if stale.is_empty() { + Ok(()) + } else { + Err(format!( + "generated protocol DTO inventory is not fresh:\n- {}\nrun `cargo xtask generate protocol --write`", + stale.join("\n- ") + )) + } +} + +fn write_outputs(generated: &[GeneratedFile]) -> Result<(), String> { + let mut staged = Vec::new(); + for output in generated { + if fs::read(&output.path).is_ok_and(|actual| actual == output.bytes) { + continue; + } + let parent = output + .path + .parent() + .ok_or_else(|| format!("generated output has no parent: `{}`", output.display_path))?; + let mut temporary = NamedTempFile::new_in(parent) + .map_err(|error| format!("failed to stage `{}`: {error}", output.display_path))?; + temporary + .write_all(&output.bytes) + .map_err(|error| format!("failed to stage `{}`: {error}", output.display_path))?; + set_generated_permissions(temporary.path()).map_err(|error| { + format!( + "failed to set generated permissions for `{}`: {error}", + output.display_path + ) + })?; + temporary + .as_file() + .sync_all() + .map_err(|error| format!("failed to sync `{}`: {error}", output.display_path))?; + staged.push((output, temporary)); + } + for (output, temporary) in staged { + temporary.persist(&output.path).map_err(|error| { + format!( + "failed to commit `{}`: {}", + output.display_path, error.error + ) + })?; + } + check_outputs(generated) +} + +#[cfg(unix)] +fn set_generated_permissions(path: &Path) -> std::io::Result<()> { + use std::os::unix::fs::PermissionsExt; + + fs::set_permissions(path, fs::Permissions::from_mode(0o644)) +} + +#[cfg(not(unix))] +fn set_generated_permissions(_path: &Path) -> std::io::Result<()> { + Ok(()) +} + +fn safe_workspace_file( + workspace_root: &Path, + relative: &str, + allow_missing: bool, + role: &str, +) -> Result<PathBuf, String> { + let path = Path::new(relative); + if relative.is_empty() + || relative.contains('\\') + || path.is_absolute() + || !path + .components() + .all(|component| matches!(component, Component::Normal(_))) + { + return Err(format!( + "{role} path must be normalized and workspace-relative: `{relative}`" + )); + } + let mut current = workspace_root.to_path_buf(); + let count = path.components().count(); + for (index, component) in path.components().enumerate() { + let Component::Normal(segment) = component else { + return Err(format!("{role} path is not normalized: `{relative}`")); + }; + current.push(segment); + match current.symlink_metadata() { + Ok(metadata) if metadata.file_type().is_symlink() => { + return Err(format!( + "{role} path contains a symlink: `{}`", + current.display() + )); + } + Ok(metadata) if index + 1 == count && !metadata.is_file() => { + return Err(format!("{role} must be a regular file: `{relative}`")); + } + Ok(_) => {} + Err(error) + if error.kind() == ErrorKind::NotFound && allow_missing && index + 1 == count => {} + Err(error) => { + return Err(format!("failed to inspect {role} `{relative}`: {error}")); + } + } + } + Ok(current) +} + +fn sha256_hex(bytes: &[u8]) -> String { + hex::encode(Sha256::digest(bytes)) +} + +#[cfg(test)] +mod tests { + use super::*; + use tempfile::TempDir; + + #[test] + fn public_serialized_type_inventory_is_sorted_and_excludes_native_types() { + let types = serialized_public_types( + "demo::v1", + "demo.rs", + r#" +#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))] +pub struct Zebra { pub value: String } +pub struct NativeError; +pub struct Alpha(String); +impl serde::Serialize for Alpha {} +struct PrivateWire; +"#, + ) + .expect("inventory"); + assert_eq!( + types + .iter() + .map(|item| item.rust_path.as_str()) + .collect::<Vec<_>>(), + [ + "radroots_protocol::demo::v1::Alpha", + "radroots_protocol::demo::v1::Zebra" + ] + ); + } + + #[test] + fn generated_bytes_and_freshness_check_are_deterministic() { + let workspace = TempDir::new().expect("workspace"); + let root = workspace.path(); + fs::create_dir_all(root.join("src")).expect("source directory"); + fs::create_dir_all(root.join("out")).expect("output directory"); + fs::write( + root.join("src/types.rs"), + "#[derive(serde::Serialize)] pub struct Demo { pub value: String }\n", + ) + .expect("source"); + let config = Config { + schema_version: 1, + package: PACKAGE.to_owned(), + source_hash_algorithm: HASH_ALGORITHM.to_owned(), + inventory_path: "out/inventory.json".to_owned(), + inventory_sha256_path: "out/inventory.sha256".to_owned(), + source: vec![SourceConfig { + module: "demo::v1".to_owned(), + path: "src/types.rs".to_owned(), + }], + }; + let schemas = vec![SchemaInventory { + schema_id: "demo.message.v1".to_owned(), + module: "demo::v1".to_owned(), + generation: 1, + }]; + let first = render_outputs(root, &config, schemas.clone()).expect("first render"); + let second = render_outputs(root, &config, schemas).expect("second render"); + assert_eq!(first[0].bytes, second[0].bytes); + assert_eq!(first[1].bytes, second[1].bytes); + write_outputs(&first).expect("write"); + check_outputs(&second).expect("fresh"); + fs::write(root.join("out/inventory.json"), "stale\n").expect("drift"); + let error = check_outputs(&second).expect_err("reject drift"); + assert!(error.contains("stale `out/inventory.json`")); + } + + #[test] + fn normalized_paths_reject_escape_and_symlinks() { + let workspace = TempDir::new().expect("workspace"); + for path in ["", "../escape", "/absolute", "a/./b", "a\\b"] { + assert!(safe_workspace_file(workspace.path(), path, true, "fixture").is_err()); + } + } +} diff --git a/tools/xtask/src/main.rs b/tools/xtask/src/main.rs @@ -10,6 +10,8 @@ mod coverage; #[cfg_attr(coverage_nightly, coverage(off))] mod dto_roots; #[cfg_attr(coverage_nightly, coverage(off))] +mod generate; +#[cfg_attr(coverage_nightly, coverage(off))] mod hygiene; use std::env; @@ -29,6 +31,7 @@ fn usage() { eprintln!(" cargo xtask contract source-maintenance-manifest [--write]"); eprintln!(" cargo xtask contract knowledge-manifest [--write]"); eprintln!(" cargo xtask dto-roots --check|--write"); + eprintln!(" cargo xtask generate protocol --check|--write"); eprintln!(" cargo xtask release preflight"); eprintln!(" cargo xtask coverage run-crate --crate <crate> [--out <dir>]"); eprintln!(" cargo xtask coverage required-crates"); @@ -68,6 +71,7 @@ fn validate_contract() -> Result<(), String> { .map_err(|error| error.to_string())?; let root = workspace_root(); dto_roots::check(&root)?; + generate::protocol::check(&root)?; contract::load_contract_bundle(&root) .and_then(|bundle| contract::validate_contract_bundle(&bundle)) .and_then(|_| contract::validate_canonical_event_boundary(&root)) @@ -82,6 +86,7 @@ fn release_preflight() -> Result<(), String> { fn release_preflight_at(root: &Path) -> Result<(), String> { dto_roots::check(root)?; + generate::protocol::check(root)?; contract::validate_artifact_contracts(root)?; contract::validate_release_preflight(root) } @@ -161,6 +166,7 @@ fn run(args: &[String]) -> Result<(), String> { Some("contract") => run_contract(&args[1..]), Some("coverage") => coverage::run(&args[1..]), Some("dto-roots") => dto_roots::run(&args[1..], &workspace_root()), + Some("generate") => generate::run(&args[1..], &workspace_root()), Some("hygiene") => hygiene::run(&args[1..], &workspace_root()), Some("release") => run_release(&args[1..]), _ => Err("unknown command".to_string()), @@ -274,6 +280,9 @@ mod tests { let invalid_dto_roots = run(&["dto-roots".to_string()]).expect_err("dto-roots requires an explicit mode"); assert!(invalid_dto_roots.contains("--check|--write")); + let invalid_generate = + run(&["generate".to_string()]).expect_err("generate requires a target and mode"); + assert!(invalid_generate.contains("generate protocol --check|--write")); let removed_sdk = run(&["sdk".to_string(), "validate".to_string()]) .expect_err("removed sdk command namespace"); @@ -308,6 +317,12 @@ mod tests { run_contract(&["validate".to_string()]).expect("validate contract"); run(&["dto-roots".to_string(), "--check".to_string()]) .expect("validate DTO root freshness"); + run(&[ + "generate".to_string(), + "protocol".to_string(), + "--check".to_string(), + ]) + .expect("validate protocol DTO inventory freshness"); coverage::run(&["help".to_string()]).expect("coverage help"); coverage::run(&["required-crates".to_string()]).expect("coverage required crates"); coverage::run(&["workspace-crates".to_string()]).expect("coverage workspace crates");