lib

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

commit 57a5f78b2e6f0a0ffde75c1694a269d8e0e157e5
parent 3f87f83d46f1fd561186fd91264d2bc528625d82
Author: triesap <tyson@radroots.org>
Date:   Wed, 29 Jul 2026 02:24:01 +0000

event: refine event contract author-role ownership

- own canonical AuthorRole requirements inside event contracts
- keep signer and account provenance outside the event package
- migrate manifests, authority, and trade consumers without compatibility aliases
- prove complete stable role labels and refresh governed source evidence

Diffstat:
Mcrates/authority/src/actor.rs | 95+++++++++++++++++++++++++++++++++----------------------------------------------
Mcrates/authority/src/authorization.rs | 17++++++++++-------
Mcrates/authority/src/error.rs | 6+++---
Mcrates/event/src/contract/registry_v7.rs | 271++++++++++++++++++++++++++++++++++++++++++++++---------------------------------
Mcrates/event/src/contract/registry_v7/tests.rs | 37+++++++++++++++++++++++++++++++------
Mcrates/event/tests/package_boundary.rs | 18++++++++++++++++++
Mcrates/event_codec/src/manifest.rs | 26++++++--------------------
Mcrates/event_codec/src/manifest/registry_v7.rs | 24++++++++++++------------
Mcrates/event_store/contracts/source_maintenance_v1.manifest.json | 4++--
Mcrates/event_store/contracts/source_maintenance_v1.manifest.sha256 | 2+-
Mcrates/event_store/src/generated/source_maintenance_manifest.rs | 4++--
Mcrates/trade/src/operational_listing/draft.rs | 16++++++++--------
12 files changed, 291 insertions(+), 229 deletions(-)

diff --git a/crates/authority/src/actor.rs b/crates/authority/src/actor.rs @@ -2,7 +2,7 @@ use crate::RadrootsAuthorityError; use core::{fmt, str::FromStr}; -use radroots_event::contract::RadrootsActorRole; +use radroots_event::contract::AuthorRole; use radroots_identity::PublicKey; #[cfg(not(feature = "std"))] @@ -118,14 +118,14 @@ impl RadrootsActorSelector { #[derive(Clone, Debug, PartialEq, Eq)] pub struct RadrootsActorResolutionRequest { selector: RadrootsActorSelector, - required_role: RadrootsActorRole, + required_role: AuthorRole, contract_id: Option<String>, } impl RadrootsActorResolutionRequest { pub fn new( selector: RadrootsActorSelector, - required_role: RadrootsActorRole, + required_role: AuthorRole, contract_id: Option<String>, ) -> Self { Self { @@ -139,7 +139,7 @@ impl RadrootsActorResolutionRequest { &self.selector } - pub fn required_role(&self) -> RadrootsActorRole { + pub fn required_role(&self) -> AuthorRole { self.required_role } @@ -151,7 +151,7 @@ impl RadrootsActorResolutionRequest { #[derive(Clone, Debug, PartialEq, Eq)] pub struct RadrootsActorContext { pubkey: PublicKey, - roles: BTreeSet<RadrootsActorRole>, + roles: BTreeSet<AuthorRole>, account_id: Option<RadrootsActorAccountId>, source: RadrootsActorSource, } @@ -162,7 +162,7 @@ impl RadrootsActorContext { roles: I, ) -> Result<Self, RadrootsAuthorityError> where - I: IntoIterator<Item = RadrootsActorRole>, + I: IntoIterator<Item = AuthorRole>, { Self::with_provenance(pubkey, None, RadrootsActorSource::ExplicitPubkey, roles) } @@ -173,7 +173,7 @@ impl RadrootsActorContext { roles: I, ) -> Result<Self, RadrootsAuthorityError> where - I: IntoIterator<Item = RadrootsActorRole>, + I: IntoIterator<Item = AuthorRole>, { Self::with_provenance( pubkey, @@ -189,7 +189,7 @@ impl RadrootsActorContext { roles: I, ) -> Result<Self, RadrootsAuthorityError> where - I: IntoIterator<Item = RadrootsActorRole>, + I: IntoIterator<Item = AuthorRole>, { Self::with_provenance( pubkey, @@ -205,7 +205,7 @@ impl RadrootsActorContext { roles: I, ) -> Result<Self, RadrootsAuthorityError> where - I: IntoIterator<Item = RadrootsActorRole>, + I: IntoIterator<Item = AuthorRole>, { Self::with_provenance( pubkey, @@ -217,7 +217,7 @@ impl RadrootsActorContext { pub fn test<I>(pubkey: impl AsRef<str>, roles: I) -> Result<Self, RadrootsAuthorityError> where - I: IntoIterator<Item = RadrootsActorRole>, + I: IntoIterator<Item = AuthorRole>, { Self::with_provenance(pubkey, None, RadrootsActorSource::Test, roles) } @@ -229,7 +229,7 @@ impl RadrootsActorContext { roles: I, ) -> Result<Self, RadrootsAuthorityError> where - I: IntoIterator<Item = RadrootsActorRole>, + I: IntoIterator<Item = AuthorRole>, { let pubkey = PublicKey::from_hex(pubkey.as_ref()) .map_err(|_| RadrootsAuthorityError::InvalidActorPubkey)?; @@ -245,7 +245,7 @@ impl RadrootsActorContext { &self.pubkey } - pub fn roles(&self) -> &BTreeSet<RadrootsActorRole> { + pub fn roles(&self) -> &BTreeSet<AuthorRole> { &self.roles } @@ -257,17 +257,14 @@ impl RadrootsActorContext { self.source } - pub fn satisfies(&self, required_role: RadrootsActorRole) -> bool { + pub fn satisfies(&self, required_role: AuthorRole) -> bool { role_satisfies(&self.roles, required_role) } } -pub fn role_satisfies( - actor_roles: &BTreeSet<RadrootsActorRole>, - required_role: RadrootsActorRole, -) -> bool { +pub fn role_satisfies(actor_roles: &BTreeSet<AuthorRole>, required_role: AuthorRole) -> bool { match required_role { - RadrootsActorRole::Any => true, + AuthorRole::Any => true, role => actor_roles.contains(&role), } } @@ -284,37 +281,33 @@ mod tests { fn any_is_satisfied_by_any_actor_context() { let actor = RadrootsActorContext::test(VALID_PUBKEY, []).expect("actor"); - assert!(actor.satisfies(RadrootsActorRole::Any)); + assert!(actor.satisfies(AuthorRole::Any)); } #[test] fn specific_roles_require_explicit_membership() { - let actor = - RadrootsActorContext::test(VALID_PUBKEY, [RadrootsActorRole::Farmer]).expect("actor"); + let actor = RadrootsActorContext::test(VALID_PUBKEY, [AuthorRole::Farmer]).expect("actor"); - assert!(actor.satisfies(RadrootsActorRole::Farmer)); - assert!(!actor.satisfies(RadrootsActorRole::Seller)); + assert!(actor.satisfies(AuthorRole::Farmer)); + assert!(!actor.satisfies(AuthorRole::Seller)); } #[test] fn farmer_does_not_globally_satisfy_seller() { - let actor = - RadrootsActorContext::test(VALID_PUBKEY, [RadrootsActorRole::Farmer]).expect("actor"); + let actor = RadrootsActorContext::test(VALID_PUBKEY, [AuthorRole::Farmer]).expect("actor"); - assert!(!actor.satisfies(RadrootsActorRole::Seller)); + assert!(!actor.satisfies(AuthorRole::Seller)); } #[test] fn multi_role_actors_satisfy_each_assigned_role() { - let actor = RadrootsActorContext::test( - VALID_PUBKEY, - [RadrootsActorRole::Farmer, RadrootsActorRole::Seller], - ) - .expect("actor"); + let actor = + RadrootsActorContext::test(VALID_PUBKEY, [AuthorRole::Farmer, AuthorRole::Seller]) + .expect("actor"); - assert!(actor.satisfies(RadrootsActorRole::Farmer)); - assert!(actor.satisfies(RadrootsActorRole::Seller)); - assert!(!actor.satisfies(RadrootsActorRole::Buyer)); + assert!(actor.satisfies(AuthorRole::Farmer)); + assert!(actor.satisfies(AuthorRole::Seller)); + assert!(!actor.satisfies(AuthorRole::Buyer)); } #[test] @@ -322,7 +315,7 @@ mod tests { let actor = RadrootsActorContext::local_account( VALID_PUBKEY, "acct-field-01", - [RadrootsActorRole::Farmer], + [AuthorRole::Farmer], ) .expect("actor"); @@ -330,7 +323,7 @@ mod tests { assert_eq!(actor.pubkey().to_hex(), VALID_PUBKEY); assert_eq!( actor.roles().iter().copied().collect::<Vec<_>>(), - vec![RadrootsActorRole::Farmer] + vec![AuthorRole::Farmer] ); let account_id = actor.account_id().expect("account id"); assert_eq!(account_id.as_str(), "acct-field-01"); @@ -339,9 +332,8 @@ mod tests { #[test] fn explicit_pubkey_context_has_no_account_id() { - let actor = - RadrootsActorContext::explicit_pubkey(VALID_PUBKEY, [RadrootsActorRole::Seller]) - .expect("actor"); + let actor = RadrootsActorContext::explicit_pubkey(VALID_PUBKEY, [AuthorRole::Seller]) + .expect("actor"); assert_eq!(actor.source(), RadrootsActorSource::ExplicitPubkey); assert_eq!(actor.account_id(), None); @@ -349,8 +341,7 @@ mod tests { #[test] fn test_context_has_no_account_id() { - let actor = - RadrootsActorContext::test(VALID_PUBKEY, [RadrootsActorRole::Farmer]).expect("actor"); + let actor = RadrootsActorContext::test(VALID_PUBKEY, [AuthorRole::Farmer]).expect("actor"); assert_eq!(actor.source(), RadrootsActorSource::Test); assert_eq!(actor.account_id(), None); @@ -358,18 +349,12 @@ mod tests { #[test] fn remote_signer_and_service_contexts_carry_account_ids() { - let remote = RadrootsActorContext::remote_signer( - VALID_PUBKEY, - "acct-remote", - [RadrootsActorRole::Buyer], - ) - .expect("remote actor"); - let service = RadrootsActorContext::service( - OTHER_VALID_PUBKEY, - "acct-service", - [RadrootsActorRole::Any], - ) - .expect("service actor"); + let remote = + RadrootsActorContext::remote_signer(VALID_PUBKEY, "acct-remote", [AuthorRole::Buyer]) + .expect("remote actor"); + let service = + RadrootsActorContext::service(OTHER_VALID_PUBKEY, "acct-service", [AuthorRole::Any]) + .expect("service actor"); assert_eq!(remote.source(), RadrootsActorSource::RemoteSigner); assert_eq!( @@ -431,7 +416,7 @@ mod tests { let selector = RadrootsActorSelector::account_id("acct-field-01").expect("selector"); let request = RadrootsActorResolutionRequest::new( selector, - RadrootsActorRole::Seller, + AuthorRole::Seller, Some("radroots.operational_listing.published.v1".to_owned()), ); @@ -439,7 +424,7 @@ mod tests { request.selector(), &RadrootsActorSelector::account_id("acct-field-01").expect("selector") ); - assert_eq!(request.required_role(), RadrootsActorRole::Seller); + assert_eq!(request.required_role(), AuthorRole::Seller); assert_eq!( request.contract_id(), Some("radroots.operational_listing.published.v1") diff --git a/crates/authority/src/authorization.rs b/crates/authority/src/authorization.rs @@ -18,12 +18,12 @@ pub fn authorize_actor_for_contract( actor: &RadrootsActorContext, contract: &RadrootsEventContract, ) -> Result<(), RadrootsAuthorityError> { - if actor.satisfies(contract.author_role) { + if actor.satisfies(contract.required_author_role()) { Ok(()) } else { Err(RadrootsAuthorityError::ActorRoleUnsatisfied { contract_id: contract.id.to_owned(), - required_role: contract.author_role, + required_role: contract.required_author_role(), }) } } @@ -171,7 +171,7 @@ mod tests { use crate::RadrootsSignerError; use core::cell::Cell; use radroots_event::contract::{ - RADROOTS_EVENT_CONTRACT_REGISTRY_VERSION, RadrootsActorRole, event_contract, + AuthorRole, RADROOTS_EVENT_CONTRACT_REGISTRY_VERSION, event_contract, }; use radroots_event::kinds::{KIND_CLASSIFIED_LISTING, KIND_POST, KIND_TRADE_PROPOSAL}; use radroots_identity::PublicKey; @@ -188,11 +188,11 @@ mod tests { } fn seller_actor(pubkey: &str) -> RadrootsActorContext { - RadrootsActorContext::explicit_pubkey(pubkey, [RadrootsActorRole::Seller]).expect("seller") + RadrootsActorContext::explicit_pubkey(pubkey, [AuthorRole::Seller]).expect("seller") } fn buyer_actor(pubkey: &str) -> RadrootsActorContext { - RadrootsActorContext::explicit_pubkey(pubkey, [RadrootsActorRole::Buyer]).expect("buyer") + RadrootsActorContext::explicit_pubkey(pubkey, [AuthorRole::Buyer]).expect("buyer") } fn operational_listing_event_draft(pubkey: &str) -> RadrootsEventDraft { @@ -403,7 +403,10 @@ mod tests { let seller = seller_actor(hex_64('a').as_str()); let buyer = buyer_actor(OTHER_VALID_PUBKEY); - assert_eq!(operational_listing.author_role, RadrootsActorRole::Seller); + assert_eq!( + operational_listing.required_author_role(), + AuthorRole::Seller + ); assert!(authorize_actor_for_contract(&seller, operational_listing).is_ok()); assert!(matches!( authorize_actor_for_contract(&buyer, operational_listing), @@ -414,7 +417,7 @@ mod tests { authorize_actor_for_contract(&seller, trade_proposal), Err(RadrootsAuthorityError::ActorRoleUnsatisfied { .. }) )); - assert_eq!(trade_decision.author_role, RadrootsActorRole::Seller); + assert_eq!(trade_decision.required_author_role(), AuthorRole::Seller); assert!(authorize_actor_for_contract(&seller, trade_decision).is_ok()); assert!(matches!( authorize_actor_for_contract(&buyer, trade_decision), diff --git a/crates/authority/src/error.rs b/crates/authority/src/error.rs @@ -35,7 +35,7 @@ pub enum RadrootsAuthorityError { ActorRoleUnsatisfied { contract_id: String, - required_role: radroots_event::contract::RadrootsActorRole, + required_role: radroots_event::contract::AuthorRole, }, ActorPubkeyMismatch { @@ -248,7 +248,7 @@ impl std::error::Error for RadrootsSignerError {} #[cfg(test)] mod tests { use super::*; - use radroots_event::contract::RadrootsActorRole; + use radroots_event::contract::AuthorRole; use std::error::Error as _; #[test] @@ -295,7 +295,7 @@ mod tests { ( RadrootsAuthorityError::ActorRoleUnsatisfied { contract_id: "radroots.operational_listing.published.v1".to_owned(), - required_role: RadrootsActorRole::Seller, + required_role: AuthorRole::Seller, }, "actor does not satisfy role Seller for contract `radroots.operational_listing.published.v1`", ), diff --git a/crates/event/src/contract/registry_v7.rs b/crates/event/src/contract/registry_v7.rs @@ -73,8 +73,12 @@ pub enum RadrootsEventStability { Experimental, } +/// Event-contract role required of an author. +/// +/// This is event authoring policy, not signer provenance, authentication +/// state, account persistence, or proof that a host granted the role. #[derive(Clone, Copy, Debug, PartialEq, Eq, PartialOrd, Ord, Hash)] -pub enum RadrootsActorRole { +pub enum AuthorRole { Any, Application, Buyer, @@ -86,6 +90,36 @@ pub enum RadrootsActorRole { Service, } +impl AuthorRole { + pub const ALL: [Self; 9] = [ + Self::Any, + Self::Application, + Self::Buyer, + Self::Farmer, + Self::Member, + Self::Moderator, + Self::Relay, + Self::Seller, + Self::Service, + ]; + + /// Stable registry label used by versioned manifest encoders. + #[must_use] + pub const fn as_str(self) -> &'static str { + match self { + Self::Any => "any", + Self::Application => "application", + Self::Buyer => "buyer", + Self::Farmer => "farmer", + Self::Member => "member", + Self::Moderator => "moderator", + Self::Relay => "relay", + Self::Seller => "seller", + Self::Service => "service", + } + } +} + #[derive(Clone, Copy, Debug, PartialEq, Eq)] pub enum RadrootsReducer { CalendarProjection, @@ -358,7 +392,7 @@ pub struct RadrootsEventContract { pub class: RadrootsEventClass, pub stability: RadrootsEventStability, pub privacy: RadrootsEventPrivacy, - pub author_role: RadrootsActorRole, + required_author_role: AuthorRole, pub content_schema: RadrootsContentSchema, pub authoring_policy: RadrootsEventAuthoringPolicy, pub discriminator: RadrootsEventDiscriminator, @@ -366,6 +400,17 @@ pub struct RadrootsEventContract { pub reducers: &'static [RadrootsReducer], } +impl RadrootsEventContract { + /// Returns the event-authoring role required by this contract. + /// + /// Hosts decide whether a concrete signer or actor has this role; the + /// event package only owns the contract requirement. + #[must_use] + pub const fn required_author_role(&self) -> AuthorRole { + self.required_author_role + } +} + static CONTRACT_FAMILIES: &[RadrootsContractFamilyMetadata] = &[ RadrootsContractFamilyMetadata { family: RadrootsContractFamily::Account, @@ -1346,7 +1391,7 @@ macro_rules! event_contract_with_stability { $payload_type:literal, $class:expr, $standard_privacy:expr, - $author_role:expr, + $required_author_role:expr, $content_schema:expr, $discriminator:expr, $tags:expr, @@ -1361,7 +1406,7 @@ macro_rules! event_contract_with_stability { class: $class, stability: $stability, privacy: $standard_privacy, - author_role: $author_role, + required_author_role: $required_author_role, content_schema: $content_schema, authoring_policy: RadrootsEventAuthoringPolicy::GenericDraft, discriminator: $discriminator, @@ -1379,7 +1424,7 @@ macro_rules! event_contract_with_authoring_policy { $payload_type:literal, $class:expr, $standard_privacy:expr, - $author_role:expr, + $required_author_role:expr, $content_schema:expr, $authoring_policy:expr, $discriminator:expr, @@ -1395,7 +1440,7 @@ macro_rules! event_contract_with_authoring_policy { $payload_type, $class, $standard_privacy, - $author_role, + $required_author_role, $content_schema, $discriminator, $tags, @@ -1413,7 +1458,7 @@ macro_rules! event_contract { $payload_type:literal, $class:expr, $standard_privacy:expr, - $author_role:expr, + $required_author_role:expr, $content_schema:expr, $discriminator:expr, $tags:expr, @@ -1426,7 +1471,7 @@ macro_rules! event_contract { $payload_type, $class, $standard_privacy, - $author_role, + $required_author_role, $content_schema, $discriminator, $tags, @@ -1444,7 +1489,7 @@ macro_rules! experimental_event_contract { $payload_type:literal, $class:expr, $standard_privacy:expr, - $author_role:expr, + $required_author_role:expr, $content_schema:expr, $discriminator:expr, $tags:expr, @@ -1457,7 +1502,7 @@ macro_rules! experimental_event_contract { $payload_type, $class, $standard_privacy, - $author_role, + $required_author_role, $content_schema, $discriminator, $tags, @@ -2238,7 +2283,7 @@ static EVENT_CONTRACTS_REGISTRY_V7: &[RadrootsEventContract] = &[ "RadrootsAuthoredProfile / RadrootsInboundProfileMetadata", RadrootsEventClass::Replaceable, RadrootsEventPrivacy::Public, - RadrootsActorRole::Any, + AuthorRole::Any, RadrootsContentSchema::JsonObject, RadrootsEventAuthoringPolicy::TypedOnly, RadrootsEventDiscriminator::KindOnly, @@ -2252,7 +2297,7 @@ static EVENT_CONTRACTS_REGISTRY_V7: &[RadrootsEventContract] = &[ "RadrootsPost", RadrootsEventClass::Regular, RadrootsEventPrivacy::Public, - RadrootsActorRole::Any, + AuthorRole::Any, RadrootsContentSchema::PlainText, RadrootsEventAuthoringPolicy::ReadOnly, RadrootsEventDiscriminator::KindOnly, @@ -2266,7 +2311,7 @@ static EVENT_CONTRACTS_REGISTRY_V7: &[RadrootsEventContract] = &[ "RadrootsAuthoredUpdate / RadrootsInboundPostProjection", RadrootsEventClass::Regular, RadrootsEventPrivacy::Public, - RadrootsActorRole::Any, + AuthorRole::Any, RadrootsContentSchema::PlainText, RadrootsEventAuthoringPolicy::TypedOnly, RadrootsEventDiscriminator::AdmissionOnly, @@ -2280,7 +2325,7 @@ static EVENT_CONTRACTS_REGISTRY_V7: &[RadrootsEventContract] = &[ "RadrootsAuthoredPhotoUpdate / RadrootsInboundPostProjection", RadrootsEventClass::Regular, RadrootsEventPrivacy::Public, - RadrootsActorRole::Any, + AuthorRole::Any, RadrootsContentSchema::PlainText, RadrootsEventAuthoringPolicy::TypedOnly, RadrootsEventDiscriminator::AdmissionOnly, @@ -2294,7 +2339,7 @@ static EVENT_CONTRACTS_REGISTRY_V7: &[RadrootsEventContract] = &[ "RadrootsAuthoredAsk / RadrootsInboundPostProjection", RadrootsEventClass::Regular, RadrootsEventPrivacy::Public, - RadrootsActorRole::Any, + AuthorRole::Any, RadrootsContentSchema::PlainText, RadrootsEventAuthoringPolicy::TypedOnly, RadrootsEventDiscriminator::AdmissionOnly, @@ -2308,7 +2353,7 @@ static EVENT_CONTRACTS_REGISTRY_V7: &[RadrootsEventContract] = &[ "RadrootsAuthoredNip10Reply / RadrootsInboundNip10ReplyProjection", RadrootsEventClass::Regular, RadrootsEventPrivacy::Public, - RadrootsActorRole::Any, + AuthorRole::Any, RadrootsContentSchema::PlainText, RadrootsEventAuthoringPolicy::TypedOnly, RadrootsEventDiscriminator::AdmissionOnly, @@ -2322,7 +2367,7 @@ static EVENT_CONTRACTS_REGISTRY_V7: &[RadrootsEventContract] = &[ "RadrootsFollowList", RadrootsEventClass::Replaceable, RadrootsEventPrivacy::Public, - RadrootsActorRole::Any, + AuthorRole::Any, RadrootsContentSchema::JsonObject, RadrootsEventDiscriminator::KindOnly, P_TAGS, @@ -2335,7 +2380,7 @@ static EVENT_CONTRACTS_REGISTRY_V7: &[RadrootsEventContract] = &[ "RadrootsAuthoredNip09DeletionRequest / RadrootsInboundNip09DeletionProjection", RadrootsEventClass::Regular, RadrootsEventPrivacy::Public, - RadrootsActorRole::Any, + AuthorRole::Any, RadrootsContentSchema::PlainText, RadrootsEventAuthoringPolicy::TypedOnly, RadrootsEventDiscriminator::AdmissionOnly, @@ -2349,7 +2394,7 @@ static EVENT_CONTRACTS_REGISTRY_V7: &[RadrootsEventContract] = &[ "RadrootsRepost", RadrootsEventClass::Regular, RadrootsEventPrivacy::Public, - RadrootsActorRole::Any, + AuthorRole::Any, RadrootsContentSchema::JsonObject, RadrootsEventDiscriminator::KindOnly, EVENT_POINTER_TAGS, @@ -2362,7 +2407,7 @@ static EVENT_CONTRACTS_REGISTRY_V7: &[RadrootsEventContract] = &[ "RadrootsReaction", RadrootsEventClass::Regular, RadrootsEventPrivacy::Public, - RadrootsActorRole::Any, + AuthorRole::Any, RadrootsContentSchema::PlainText, RadrootsEventDiscriminator::KindOnly, EVENT_POINTER_TAGS, @@ -2375,7 +2420,7 @@ static EVENT_CONTRACTS_REGISTRY_V7: &[RadrootsEventContract] = &[ "RadrootsSeal", RadrootsEventClass::Regular, RadrootsEventPrivacy::Encrypted, - RadrootsActorRole::Any, + AuthorRole::Any, RadrootsContentSchema::Encrypted, RadrootsEventDiscriminator::KindOnly, NO_TAGS, @@ -2388,7 +2433,7 @@ static EVENT_CONTRACTS_REGISTRY_V7: &[RadrootsEventContract] = &[ "RadrootsMessage", RadrootsEventClass::Regular, RadrootsEventPrivacy::Encrypted, - RadrootsActorRole::Any, + AuthorRole::Any, RadrootsContentSchema::Encrypted, RadrootsEventDiscriminator::KindOnly, P_TAGS, @@ -2401,7 +2446,7 @@ static EVENT_CONTRACTS_REGISTRY_V7: &[RadrootsEventContract] = &[ "RadrootsMessageFile", RadrootsEventClass::Regular, RadrootsEventPrivacy::Encrypted, - RadrootsActorRole::Any, + AuthorRole::Any, RadrootsContentSchema::Encrypted, RadrootsEventDiscriminator::KindOnly, P_TAGS, @@ -2414,7 +2459,7 @@ static EVENT_CONTRACTS_REGISTRY_V7: &[RadrootsEventContract] = &[ "RadrootsGenericRepost", RadrootsEventClass::Regular, RadrootsEventPrivacy::Public, - RadrootsActorRole::Any, + AuthorRole::Any, RadrootsContentSchema::JsonObject, RadrootsEventDiscriminator::KindOnly, EVENT_POINTER_TAGS, @@ -2427,7 +2472,7 @@ static EVENT_CONTRACTS_REGISTRY_V7: &[RadrootsEventContract] = &[ "RadrootsFarmCrdtChange", RadrootsEventClass::Regular, RadrootsEventPrivacy::Encrypted, - RadrootsActorRole::Farmer, + AuthorRole::Farmer, RadrootsContentSchema::JsonObject, RadrootsEventDiscriminator::KindOnly, NO_TAGS, @@ -2440,7 +2485,7 @@ static EVENT_CONTRACTS_REGISTRY_V7: &[RadrootsEventContract] = &[ "RadrootsGiftWrap", RadrootsEventClass::Regular, RadrootsEventPrivacy::Encrypted, - RadrootsActorRole::Any, + AuthorRole::Any, RadrootsContentSchema::Encrypted, RadrootsEventDiscriminator::KindOnly, P_TAGS, @@ -2453,7 +2498,7 @@ static EVENT_CONTRACTS_REGISTRY_V7: &[RadrootsEventContract] = &[ "RadrootsFileMetadata", RadrootsEventClass::Regular, RadrootsEventPrivacy::Public, - RadrootsActorRole::Any, + AuthorRole::Any, RadrootsContentSchema::JsonObject, RadrootsEventDiscriminator::KindOnly, FILE_METADATA_TAGS, @@ -2466,7 +2511,7 @@ static EVENT_CONTRACTS_REGISTRY_V7: &[RadrootsEventContract] = &[ "RadrootsAuthoredNip22Comment / RadrootsInboundNip22CommentProjection", RadrootsEventClass::Regular, RadrootsEventPrivacy::Public, - RadrootsActorRole::Any, + AuthorRole::Any, RadrootsContentSchema::PlainText, RadrootsEventAuthoringPolicy::TypedOnly, RadrootsEventDiscriminator::AdmissionOnly, @@ -2480,7 +2525,7 @@ static EVENT_CONTRACTS_REGISTRY_V7: &[RadrootsEventContract] = &[ "RadrootsReport", RadrootsEventClass::Regular, RadrootsEventPrivacy::Public, - RadrootsActorRole::Moderator, + AuthorRole::Moderator, RadrootsContentSchema::PlainText, RadrootsEventDiscriminator::KindOnly, EVENT_POINTER_TAGS, @@ -2493,7 +2538,7 @@ static EVENT_CONTRACTS_REGISTRY_V7: &[RadrootsEventContract] = &[ "RadrootsGroupPutUser", RadrootsEventClass::Regular, RadrootsEventPrivacy::Public, - RadrootsActorRole::Moderator, + AuthorRole::Moderator, RadrootsContentSchema::JsonObject, RadrootsEventDiscriminator::KindOnly, GROUP_ACTION_TAGS, @@ -2506,7 +2551,7 @@ static EVENT_CONTRACTS_REGISTRY_V7: &[RadrootsEventContract] = &[ "RadrootsGroupRemoveUser", RadrootsEventClass::Regular, RadrootsEventPrivacy::Public, - RadrootsActorRole::Moderator, + AuthorRole::Moderator, RadrootsContentSchema::JsonObject, RadrootsEventDiscriminator::KindOnly, GROUP_ACTION_TAGS, @@ -2519,7 +2564,7 @@ static EVENT_CONTRACTS_REGISTRY_V7: &[RadrootsEventContract] = &[ "RadrootsGroupEditMetadata", RadrootsEventClass::Regular, RadrootsEventPrivacy::Public, - RadrootsActorRole::Moderator, + AuthorRole::Moderator, RadrootsContentSchema::JsonObject, RadrootsEventDiscriminator::KindOnly, GROUP_ACTION_TAGS, @@ -2532,7 +2577,7 @@ static EVENT_CONTRACTS_REGISTRY_V7: &[RadrootsEventContract] = &[ "RadrootsGroupDeleteEvent", RadrootsEventClass::Regular, RadrootsEventPrivacy::Public, - RadrootsActorRole::Moderator, + AuthorRole::Moderator, RadrootsContentSchema::JsonObject, RadrootsEventDiscriminator::KindOnly, GROUP_ACTION_TAGS, @@ -2545,7 +2590,7 @@ static EVENT_CONTRACTS_REGISTRY_V7: &[RadrootsEventContract] = &[ "RadrootsGroupCreateGroup", RadrootsEventClass::Regular, RadrootsEventPrivacy::Public, - RadrootsActorRole::Moderator, + AuthorRole::Moderator, RadrootsContentSchema::JsonObject, RadrootsEventDiscriminator::KindOnly, GROUP_ACTION_TAGS, @@ -2558,7 +2603,7 @@ static EVENT_CONTRACTS_REGISTRY_V7: &[RadrootsEventContract] = &[ "RadrootsGroupDeleteGroup", RadrootsEventClass::Regular, RadrootsEventPrivacy::Public, - RadrootsActorRole::Moderator, + AuthorRole::Moderator, RadrootsContentSchema::JsonObject, RadrootsEventDiscriminator::KindOnly, GROUP_ACTION_TAGS, @@ -2571,7 +2616,7 @@ static EVENT_CONTRACTS_REGISTRY_V7: &[RadrootsEventContract] = &[ "RadrootsGroupCreateInvite", RadrootsEventClass::Regular, RadrootsEventPrivacy::Public, - RadrootsActorRole::Moderator, + AuthorRole::Moderator, RadrootsContentSchema::JsonObject, RadrootsEventDiscriminator::KindOnly, GROUP_ACTION_TAGS, @@ -2584,7 +2629,7 @@ static EVENT_CONTRACTS_REGISTRY_V7: &[RadrootsEventContract] = &[ "RadrootsGroupJoinRequest", RadrootsEventClass::Regular, RadrootsEventPrivacy::Public, - RadrootsActorRole::Member, + AuthorRole::Member, RadrootsContentSchema::JsonObject, RadrootsEventDiscriminator::KindOnly, GROUP_ACTION_TAGS, @@ -2597,7 +2642,7 @@ static EVENT_CONTRACTS_REGISTRY_V7: &[RadrootsEventContract] = &[ "RadrootsGroupLeaveRequest", RadrootsEventClass::Regular, RadrootsEventPrivacy::Public, - RadrootsActorRole::Member, + AuthorRole::Member, RadrootsContentSchema::JsonObject, RadrootsEventDiscriminator::KindOnly, GROUP_ACTION_TAGS, @@ -2610,7 +2655,7 @@ static EVENT_CONTRACTS_REGISTRY_V7: &[RadrootsEventContract] = &[ "RadrootsGeochat", RadrootsEventClass::Ephemeral, RadrootsEventPrivacy::Public, - RadrootsActorRole::Any, + AuthorRole::Any, RadrootsContentSchema::PlainText, RadrootsEventDiscriminator::KindOnly, NO_TAGS, @@ -2623,7 +2668,7 @@ static EVENT_CONTRACTS_REGISTRY_V7: &[RadrootsEventContract] = &[ "RadrootsRelayAuth", RadrootsEventClass::Ephemeral, RadrootsEventPrivacy::Public, - RadrootsActorRole::Relay, + AuthorRole::Relay, RadrootsContentSchema::JsonObject, RadrootsEventDiscriminator::KindOnly, NO_TAGS, @@ -2636,7 +2681,7 @@ static EVENT_CONTRACTS_REGISTRY_V7: &[RadrootsEventContract] = &[ "RadrootsHttpAuth", RadrootsEventClass::Ephemeral, RadrootsEventPrivacy::Public, - RadrootsActorRole::Application, + AuthorRole::Application, RadrootsContentSchema::JsonObject, RadrootsEventDiscriminator::KindOnly, NO_TAGS, @@ -2649,7 +2694,7 @@ static EVENT_CONTRACTS_REGISTRY_V7: &[RadrootsEventContract] = &[ "RadrootsList", RadrootsEventClass::Replaceable, RadrootsEventPrivacy::Public, - RadrootsActorRole::Any, + AuthorRole::Any, RadrootsContentSchema::JsonObject, RadrootsEventDiscriminator::KindOnly, LIST_TAGS, @@ -2662,7 +2707,7 @@ static EVENT_CONTRACTS_REGISTRY_V7: &[RadrootsEventContract] = &[ "RadrootsList", RadrootsEventClass::Replaceable, RadrootsEventPrivacy::Public, - RadrootsActorRole::Any, + AuthorRole::Any, RadrootsContentSchema::JsonObject, RadrootsEventDiscriminator::KindOnly, LIST_TAGS, @@ -2675,7 +2720,7 @@ static EVENT_CONTRACTS_REGISTRY_V7: &[RadrootsEventContract] = &[ "RadrootsList", RadrootsEventClass::Replaceable, RadrootsEventPrivacy::Public, - RadrootsActorRole::Any, + AuthorRole::Any, RadrootsContentSchema::JsonObject, RadrootsEventDiscriminator::KindOnly, LIST_TAGS, @@ -2688,7 +2733,7 @@ static EVENT_CONTRACTS_REGISTRY_V7: &[RadrootsEventContract] = &[ "RadrootsList", RadrootsEventClass::Replaceable, RadrootsEventPrivacy::Public, - RadrootsActorRole::Any, + AuthorRole::Any, RadrootsContentSchema::JsonObject, RadrootsEventDiscriminator::KindOnly, LIST_TAGS, @@ -2701,7 +2746,7 @@ static EVENT_CONTRACTS_REGISTRY_V7: &[RadrootsEventContract] = &[ "RadrootsList", RadrootsEventClass::Replaceable, RadrootsEventPrivacy::Public, - RadrootsActorRole::Any, + AuthorRole::Any, RadrootsContentSchema::JsonObject, RadrootsEventDiscriminator::KindOnly, LIST_TAGS, @@ -2714,7 +2759,7 @@ static EVENT_CONTRACTS_REGISTRY_V7: &[RadrootsEventContract] = &[ "RadrootsList", RadrootsEventClass::Replaceable, RadrootsEventPrivacy::Public, - RadrootsActorRole::Any, + AuthorRole::Any, RadrootsContentSchema::JsonObject, RadrootsEventDiscriminator::KindOnly, LIST_TAGS, @@ -2727,7 +2772,7 @@ static EVENT_CONTRACTS_REGISTRY_V7: &[RadrootsEventContract] = &[ "RadrootsList", RadrootsEventClass::Replaceable, RadrootsEventPrivacy::Public, - RadrootsActorRole::Any, + AuthorRole::Any, RadrootsContentSchema::JsonObject, RadrootsEventDiscriminator::KindOnly, LIST_TAGS, @@ -2740,7 +2785,7 @@ static EVENT_CONTRACTS_REGISTRY_V7: &[RadrootsEventContract] = &[ "RadrootsList", RadrootsEventClass::Replaceable, RadrootsEventPrivacy::Public, - RadrootsActorRole::Any, + AuthorRole::Any, RadrootsContentSchema::JsonObject, RadrootsEventDiscriminator::KindOnly, LIST_TAGS, @@ -2753,7 +2798,7 @@ static EVENT_CONTRACTS_REGISTRY_V7: &[RadrootsEventContract] = &[ "RadrootsList", RadrootsEventClass::Replaceable, RadrootsEventPrivacy::Public, - RadrootsActorRole::Any, + AuthorRole::Any, RadrootsContentSchema::JsonObject, RadrootsEventDiscriminator::KindOnly, LIST_TAGS, @@ -2766,7 +2811,7 @@ static EVENT_CONTRACTS_REGISTRY_V7: &[RadrootsEventContract] = &[ "RadrootsList", RadrootsEventClass::Replaceable, RadrootsEventPrivacy::Public, - RadrootsActorRole::Any, + AuthorRole::Any, RadrootsContentSchema::JsonObject, RadrootsEventDiscriminator::KindOnly, LIST_TAGS, @@ -2779,7 +2824,7 @@ static EVENT_CONTRACTS_REGISTRY_V7: &[RadrootsEventContract] = &[ "RadrootsList", RadrootsEventClass::Replaceable, RadrootsEventPrivacy::Public, - RadrootsActorRole::Any, + AuthorRole::Any, RadrootsContentSchema::JsonObject, RadrootsEventDiscriminator::KindOnly, LIST_TAGS, @@ -2792,7 +2837,7 @@ static EVENT_CONTRACTS_REGISTRY_V7: &[RadrootsEventContract] = &[ "RadrootsList", RadrootsEventClass::Replaceable, RadrootsEventPrivacy::Public, - RadrootsActorRole::Any, + AuthorRole::Any, RadrootsContentSchema::JsonObject, RadrootsEventDiscriminator::KindOnly, LIST_TAGS, @@ -2805,7 +2850,7 @@ static EVENT_CONTRACTS_REGISTRY_V7: &[RadrootsEventContract] = &[ "RadrootsList", RadrootsEventClass::Replaceable, RadrootsEventPrivacy::Public, - RadrootsActorRole::Any, + AuthorRole::Any, RadrootsContentSchema::JsonObject, RadrootsEventDiscriminator::KindOnly, LIST_TAGS, @@ -2818,7 +2863,7 @@ static EVENT_CONTRACTS_REGISTRY_V7: &[RadrootsEventContract] = &[ "RadrootsList", RadrootsEventClass::Replaceable, RadrootsEventPrivacy::Public, - RadrootsActorRole::Any, + AuthorRole::Any, RadrootsContentSchema::JsonObject, RadrootsEventDiscriminator::KindOnly, LIST_TAGS, @@ -2831,7 +2876,7 @@ static EVENT_CONTRACTS_REGISTRY_V7: &[RadrootsEventContract] = &[ "RadrootsList", RadrootsEventClass::Replaceable, RadrootsEventPrivacy::Public, - RadrootsActorRole::Any, + AuthorRole::Any, RadrootsContentSchema::JsonObject, RadrootsEventDiscriminator::KindOnly, LIST_TAGS, @@ -2844,7 +2889,7 @@ static EVENT_CONTRACTS_REGISTRY_V7: &[RadrootsEventContract] = &[ "RadrootsList", RadrootsEventClass::Replaceable, RadrootsEventPrivacy::Public, - RadrootsActorRole::Any, + AuthorRole::Any, RadrootsContentSchema::JsonObject, RadrootsEventDiscriminator::KindOnly, LIST_TAGS, @@ -2857,7 +2902,7 @@ static EVENT_CONTRACTS_REGISTRY_V7: &[RadrootsEventContract] = &[ "RadrootsListSet", RadrootsEventClass::Addressable, RadrootsEventPrivacy::Public, - RadrootsActorRole::Any, + AuthorRole::Any, RadrootsContentSchema::JsonObject, RadrootsEventDiscriminator::KindOnly, LIST_SET_TAGS, @@ -2870,7 +2915,7 @@ static EVENT_CONTRACTS_REGISTRY_V7: &[RadrootsEventContract] = &[ "RadrootsListSet", RadrootsEventClass::Addressable, RadrootsEventPrivacy::Public, - RadrootsActorRole::Farmer, + AuthorRole::Farmer, RadrootsContentSchema::JsonObject, RadrootsEventDiscriminator::Composite(FARM_MEMBERS_LIST_DISCRIMINATOR), LIST_SET_TAGS, @@ -2883,7 +2928,7 @@ static EVENT_CONTRACTS_REGISTRY_V7: &[RadrootsEventContract] = &[ "RadrootsListSet", RadrootsEventClass::Addressable, RadrootsEventPrivacy::Public, - RadrootsActorRole::Farmer, + AuthorRole::Farmer, RadrootsContentSchema::JsonObject, RadrootsEventDiscriminator::Composite(FARM_OWNERS_LIST_DISCRIMINATOR), LIST_SET_TAGS, @@ -2896,7 +2941,7 @@ static EVENT_CONTRACTS_REGISTRY_V7: &[RadrootsEventContract] = &[ "RadrootsListSet", RadrootsEventClass::Addressable, RadrootsEventPrivacy::Public, - RadrootsActorRole::Farmer, + AuthorRole::Farmer, RadrootsContentSchema::JsonObject, RadrootsEventDiscriminator::Composite(FARM_WORKERS_LIST_DISCRIMINATOR), LIST_SET_TAGS, @@ -2909,7 +2954,7 @@ static EVENT_CONTRACTS_REGISTRY_V7: &[RadrootsEventContract] = &[ "RadrootsListSet", RadrootsEventClass::Addressable, RadrootsEventPrivacy::Public, - RadrootsActorRole::Farmer, + AuthorRole::Farmer, RadrootsContentSchema::JsonObject, RadrootsEventDiscriminator::Composite(FARM_PLOTS_LIST_DISCRIMINATOR), LIST_SET_TAGS, @@ -2922,7 +2967,7 @@ static EVENT_CONTRACTS_REGISTRY_V7: &[RadrootsEventContract] = &[ "RadrootsListSet", RadrootsEventClass::Addressable, RadrootsEventPrivacy::Public, - RadrootsActorRole::Farmer, + AuthorRole::Farmer, RadrootsContentSchema::JsonObject, RadrootsEventDiscriminator::Composite(FARM_LISTINGS_LIST_DISCRIMINATOR), LIST_SET_TAGS, @@ -2935,7 +2980,7 @@ static EVENT_CONTRACTS_REGISTRY_V7: &[RadrootsEventContract] = &[ "RadrootsListSet", RadrootsEventClass::Addressable, RadrootsEventPrivacy::Public, - RadrootsActorRole::Member, + AuthorRole::Member, RadrootsContentSchema::JsonObject, RadrootsEventDiscriminator::DTagExact("member_of.farms"), LIST_SET_TAGS, @@ -2948,7 +2993,7 @@ static EVENT_CONTRACTS_REGISTRY_V7: &[RadrootsEventContract] = &[ "RadrootsListSet", RadrootsEventClass::Addressable, RadrootsEventPrivacy::Public, - RadrootsActorRole::Any, + AuthorRole::Any, RadrootsContentSchema::JsonObject, RadrootsEventDiscriminator::KindOnly, LIST_SET_TAGS, @@ -2961,7 +3006,7 @@ static EVENT_CONTRACTS_REGISTRY_V7: &[RadrootsEventContract] = &[ "RadrootsListSet", RadrootsEventClass::Addressable, RadrootsEventPrivacy::Public, - RadrootsActorRole::Any, + AuthorRole::Any, RadrootsContentSchema::JsonObject, RadrootsEventDiscriminator::KindOnly, LIST_SET_TAGS, @@ -2974,7 +3019,7 @@ static EVENT_CONTRACTS_REGISTRY_V7: &[RadrootsEventContract] = &[ "RadrootsListSet", RadrootsEventClass::Addressable, RadrootsEventPrivacy::Public, - RadrootsActorRole::Any, + AuthorRole::Any, RadrootsContentSchema::JsonObject, RadrootsEventDiscriminator::KindOnly, LIST_SET_TAGS, @@ -2987,7 +3032,7 @@ static EVENT_CONTRACTS_REGISTRY_V7: &[RadrootsEventContract] = &[ "RadrootsListSet", RadrootsEventClass::Addressable, RadrootsEventPrivacy::Public, - RadrootsActorRole::Any, + AuthorRole::Any, RadrootsContentSchema::JsonObject, RadrootsEventDiscriminator::KindOnly, LIST_SET_TAGS, @@ -3000,7 +3045,7 @@ static EVENT_CONTRACTS_REGISTRY_V7: &[RadrootsEventContract] = &[ "RadrootsListSet", RadrootsEventClass::Addressable, RadrootsEventPrivacy::Public, - RadrootsActorRole::Any, + AuthorRole::Any, RadrootsContentSchema::JsonObject, RadrootsEventDiscriminator::KindOnly, LIST_SET_TAGS, @@ -3013,7 +3058,7 @@ static EVENT_CONTRACTS_REGISTRY_V7: &[RadrootsEventContract] = &[ "RadrootsListSet", RadrootsEventClass::Addressable, RadrootsEventPrivacy::Public, - RadrootsActorRole::Any, + AuthorRole::Any, RadrootsContentSchema::JsonObject, RadrootsEventDiscriminator::KindOnly, LIST_SET_TAGS, @@ -3026,7 +3071,7 @@ static EVENT_CONTRACTS_REGISTRY_V7: &[RadrootsEventContract] = &[ "RadrootsListSet", RadrootsEventClass::Addressable, RadrootsEventPrivacy::Public, - RadrootsActorRole::Any, + AuthorRole::Any, RadrootsContentSchema::JsonObject, RadrootsEventDiscriminator::KindOnly, LIST_SET_TAGS, @@ -3039,7 +3084,7 @@ static EVENT_CONTRACTS_REGISTRY_V7: &[RadrootsEventContract] = &[ "RadrootsListSet", RadrootsEventClass::Addressable, RadrootsEventPrivacy::Public, - RadrootsActorRole::Any, + AuthorRole::Any, RadrootsContentSchema::JsonObject, RadrootsEventDiscriminator::KindOnly, LIST_SET_TAGS, @@ -3052,7 +3097,7 @@ static EVENT_CONTRACTS_REGISTRY_V7: &[RadrootsEventContract] = &[ "RadrootsListSet", RadrootsEventClass::Addressable, RadrootsEventPrivacy::Public, - RadrootsActorRole::Any, + AuthorRole::Any, RadrootsContentSchema::JsonObject, RadrootsEventDiscriminator::KindOnly, LIST_SET_TAGS, @@ -3065,7 +3110,7 @@ static EVENT_CONTRACTS_REGISTRY_V7: &[RadrootsEventContract] = &[ "RadrootsListSet", RadrootsEventClass::Addressable, RadrootsEventPrivacy::Public, - RadrootsActorRole::Any, + AuthorRole::Any, RadrootsContentSchema::JsonObject, RadrootsEventDiscriminator::KindOnly, LIST_SET_TAGS, @@ -3078,7 +3123,7 @@ static EVENT_CONTRACTS_REGISTRY_V7: &[RadrootsEventContract] = &[ "RadrootsArticle", RadrootsEventClass::Addressable, RadrootsEventPrivacy::Public, - RadrootsActorRole::Any, + AuthorRole::Any, RadrootsContentSchema::Markdown, RadrootsEventDiscriminator::KindOnly, ARTICLE_TAGS, @@ -3091,7 +3136,7 @@ static EVENT_CONTRACTS_REGISTRY_V7: &[RadrootsEventContract] = &[ "RadrootsWikiMergeRequest", RadrootsEventClass::Regular, RadrootsEventPrivacy::Public, - RadrootsActorRole::Any, + AuthorRole::Any, RadrootsContentSchema::PlainText, RadrootsEventDiscriminator::KindOnly, WIKI_MERGE_REQUEST_TAGS, @@ -3104,7 +3149,7 @@ static EVENT_CONTRACTS_REGISTRY_V7: &[RadrootsEventContract] = &[ "RadrootsWikiArticle", RadrootsEventClass::Addressable, RadrootsEventPrivacy::Public, - RadrootsActorRole::Any, + AuthorRole::Any, RadrootsContentSchema::Djot, RadrootsEventDiscriminator::KindOnly, WIKI_ARTICLE_TAGS, @@ -3117,7 +3162,7 @@ static EVENT_CONTRACTS_REGISTRY_V7: &[RadrootsEventContract] = &[ "RadrootsWikiRedirect", RadrootsEventClass::Addressable, RadrootsEventPrivacy::Public, - RadrootsActorRole::Any, + AuthorRole::Any, RadrootsContentSchema::Empty, RadrootsEventDiscriminator::KindOnly, WIKI_REDIRECT_TAGS, @@ -3130,7 +3175,7 @@ static EVENT_CONTRACTS_REGISTRY_V7: &[RadrootsEventContract] = &[ "RadrootsAdmittedCalendarDateEvent", RadrootsEventClass::Addressable, RadrootsEventPrivacy::Public, - RadrootsActorRole::Any, + AuthorRole::Any, RadrootsContentSchema::PlainText, RadrootsEventDiscriminator::KindOnly, CALENDAR_DATE_EVENT_TAGS, @@ -3143,7 +3188,7 @@ static EVENT_CONTRACTS_REGISTRY_V7: &[RadrootsEventContract] = &[ "RadrootsAdmittedCalendarTimeEvent", RadrootsEventClass::Addressable, RadrootsEventPrivacy::Public, - RadrootsActorRole::Any, + AuthorRole::Any, RadrootsContentSchema::PlainText, RadrootsEventDiscriminator::KindOnly, CALENDAR_TIME_EVENT_TAGS, @@ -3156,7 +3201,7 @@ static EVENT_CONTRACTS_REGISTRY_V7: &[RadrootsEventContract] = &[ "RadrootsAdmittedCalendar", RadrootsEventClass::Addressable, RadrootsEventPrivacy::Public, - RadrootsActorRole::Any, + AuthorRole::Any, RadrootsContentSchema::PlainText, RadrootsEventDiscriminator::KindOnly, CALENDAR_COLLECTION_TAGS, @@ -3169,7 +3214,7 @@ static EVENT_CONTRACTS_REGISTRY_V7: &[RadrootsEventContract] = &[ "RadrootsAdmittedCalendarEventRsvp", RadrootsEventClass::Addressable, RadrootsEventPrivacy::Public, - RadrootsActorRole::Any, + AuthorRole::Any, RadrootsContentSchema::PlainText, RadrootsEventDiscriminator::KindOnly, CALENDAR_RSVP_TAGS, @@ -3182,7 +3227,7 @@ static EVENT_CONTRACTS_REGISTRY_V7: &[RadrootsEventContract] = &[ "RadrootsListSet", RadrootsEventClass::Addressable, RadrootsEventPrivacy::Public, - RadrootsActorRole::Any, + AuthorRole::Any, RadrootsContentSchema::JsonObject, RadrootsEventDiscriminator::KindOnly, LIST_SET_TAGS, @@ -3195,7 +3240,7 @@ static EVENT_CONTRACTS_REGISTRY_V7: &[RadrootsEventContract] = &[ "RadrootsListSet", RadrootsEventClass::Addressable, RadrootsEventPrivacy::Public, - RadrootsActorRole::Any, + AuthorRole::Any, RadrootsContentSchema::JsonObject, RadrootsEventDiscriminator::KindOnly, LIST_SET_TAGS, @@ -3208,7 +3253,7 @@ static EVENT_CONTRACTS_REGISTRY_V7: &[RadrootsEventContract] = &[ "RadrootsFarm", RadrootsEventClass::Addressable, RadrootsEventPrivacy::Public, - RadrootsActorRole::Farmer, + AuthorRole::Farmer, RadrootsContentSchema::JsonObject, RadrootsEventDiscriminator::KindOnly, FARM_TAGS, @@ -3221,7 +3266,7 @@ static EVENT_CONTRACTS_REGISTRY_V7: &[RadrootsEventContract] = &[ "RadrootsPlot", RadrootsEventClass::Addressable, RadrootsEventPrivacy::Public, - RadrootsActorRole::Farmer, + AuthorRole::Farmer, RadrootsContentSchema::JsonObject, RadrootsEventDiscriminator::KindOnly, FARM_TAGS, @@ -3234,7 +3279,7 @@ static EVENT_CONTRACTS_REGISTRY_V7: &[RadrootsEventContract] = &[ "RadrootsCoop", RadrootsEventClass::Addressable, RadrootsEventPrivacy::Public, - RadrootsActorRole::Farmer, + AuthorRole::Farmer, RadrootsContentSchema::JsonObject, RadrootsEventDiscriminator::KindOnly, FARM_TAGS, @@ -3247,7 +3292,7 @@ static EVENT_CONTRACTS_REGISTRY_V7: &[RadrootsEventContract] = &[ "RadrootsDocument", RadrootsEventClass::Addressable, RadrootsEventPrivacy::Public, - RadrootsActorRole::Farmer, + AuthorRole::Farmer, RadrootsContentSchema::JsonObject, RadrootsEventDiscriminator::KindOnly, D_TAGS, @@ -3260,7 +3305,7 @@ static EVENT_CONTRACTS_REGISTRY_V7: &[RadrootsEventContract] = &[ "RadrootsResourceArea", RadrootsEventClass::Addressable, RadrootsEventPrivacy::Public, - RadrootsActorRole::Farmer, + AuthorRole::Farmer, RadrootsContentSchema::JsonObject, RadrootsEventDiscriminator::KindOnly, FARM_TAGS, @@ -3273,7 +3318,7 @@ static EVENT_CONTRACTS_REGISTRY_V7: &[RadrootsEventContract] = &[ "RadrootsResourceHarvestCap", RadrootsEventClass::Addressable, RadrootsEventPrivacy::Public, - RadrootsActorRole::Farmer, + AuthorRole::Farmer, RadrootsContentSchema::JsonObject, RadrootsEventDiscriminator::KindOnly, FARM_TAGS, @@ -3286,7 +3331,7 @@ static EVENT_CONTRACTS_REGISTRY_V7: &[RadrootsEventContract] = &[ "RadrootsAccountClaim", RadrootsEventClass::Addressable, RadrootsEventPrivacy::Public, - RadrootsActorRole::Any, + AuthorRole::Any, RadrootsContentSchema::JsonObject, RadrootsEventDiscriminator::KindOnly, D_TAGS, @@ -3299,7 +3344,7 @@ static EVENT_CONTRACTS_REGISTRY_V7: &[RadrootsEventContract] = &[ "RadrootsFarmWorkspaceManifest", RadrootsEventClass::Addressable, RadrootsEventPrivacy::Encrypted, - RadrootsActorRole::Farmer, + AuthorRole::Farmer, RadrootsContentSchema::JsonObject, RadrootsEventDiscriminator::KindOnly, D_TAGS, @@ -3312,7 +3357,7 @@ static EVENT_CONTRACTS_REGISTRY_V7: &[RadrootsEventContract] = &[ "RadrootsOperationalListing", RadrootsEventClass::Addressable, RadrootsEventPrivacy::Public, - RadrootsActorRole::Seller, + AuthorRole::Seller, RadrootsContentSchema::Markdown, RadrootsEventDiscriminator::ClassifiedListingPartition( RadrootsClassifiedListingPartition::OperationalListing, @@ -3327,7 +3372,7 @@ static EVENT_CONTRACTS_REGISTRY_V7: &[RadrootsEventContract] = &[ "RadrootsFoodAvailabilityDetails / RadrootsInboundFoodAvailabilityProjection", RadrootsEventClass::Addressable, RadrootsEventPrivacy::Public, - RadrootsActorRole::Seller, + AuthorRole::Seller, RadrootsContentSchema::Markdown, RadrootsEventAuthoringPolicy::TypedOnly, RadrootsEventDiscriminator::AdmissionOnly, @@ -3341,7 +3386,7 @@ static EVENT_CONTRACTS_REGISTRY_V7: &[RadrootsEventContract] = &[ "RadrootsKnowledgeSource", RadrootsEventClass::Addressable, RadrootsEventPrivacy::Public, - RadrootsActorRole::Any, + AuthorRole::Any, RadrootsContentSchema::JsonObject, RadrootsEventDiscriminator::TagEquals { name: "contract", @@ -3357,7 +3402,7 @@ static EVENT_CONTRACTS_REGISTRY_V7: &[RadrootsEventContract] = &[ "RadrootsEvidenceBounty", RadrootsEventClass::Addressable, RadrootsEventPrivacy::Public, - RadrootsActorRole::Any, + AuthorRole::Any, RadrootsContentSchema::JsonObject, RadrootsEventDiscriminator::TagEquals { name: "contract", @@ -3373,7 +3418,7 @@ static EVENT_CONTRACTS_REGISTRY_V7: &[RadrootsEventContract] = &[ "RadrootsKnowledgeClaim", RadrootsEventClass::Regular, RadrootsEventPrivacy::Public, - RadrootsActorRole::Any, + AuthorRole::Any, RadrootsContentSchema::JsonObject, RadrootsEventDiscriminator::TagEquals { name: "contract", @@ -3389,7 +3434,7 @@ static EVENT_CONTRACTS_REGISTRY_V7: &[RadrootsEventContract] = &[ "RadrootsKnowledgeRelation", RadrootsEventClass::Regular, RadrootsEventPrivacy::Public, - RadrootsActorRole::Any, + AuthorRole::Any, RadrootsContentSchema::JsonObject, RadrootsEventDiscriminator::TagEquals { name: "contract", @@ -3405,7 +3450,7 @@ static EVENT_CONTRACTS_REGISTRY_V7: &[RadrootsEventContract] = &[ "RadrootsKnowledgeReview", RadrootsEventClass::Regular, RadrootsEventPrivacy::Public, - RadrootsActorRole::Any, + AuthorRole::Any, RadrootsContentSchema::JsonObject, RadrootsEventDiscriminator::TagEquals { name: "contract", @@ -3421,7 +3466,7 @@ static EVENT_CONTRACTS_REGISTRY_V7: &[RadrootsEventContract] = &[ "RadrootsKnowledgeFieldReport", RadrootsEventClass::Regular, RadrootsEventPrivacy::Public, - RadrootsActorRole::Any, + AuthorRole::Any, RadrootsContentSchema::JsonObject, RadrootsEventDiscriminator::TagEquals { name: "contract", @@ -3437,7 +3482,7 @@ static EVENT_CONTRACTS_REGISTRY_V7: &[RadrootsEventContract] = &[ "RadrootsKnowledgeChangeProposal", RadrootsEventClass::Regular, RadrootsEventPrivacy::Public, - RadrootsActorRole::Any, + AuthorRole::Any, RadrootsContentSchema::JsonObject, RadrootsEventDiscriminator::TagEquals { name: "contract", @@ -3453,7 +3498,7 @@ static EVENT_CONTRACTS_REGISTRY_V7: &[RadrootsEventContract] = &[ "RadrootsContributionAttestation", RadrootsEventClass::Regular, RadrootsEventPrivacy::Public, - RadrootsActorRole::Any, + AuthorRole::Any, RadrootsContentSchema::JsonObject, RadrootsEventDiscriminator::TagEquals { name: "contract", @@ -3469,7 +3514,7 @@ static EVENT_CONTRACTS_REGISTRY_V7: &[RadrootsEventContract] = &[ "RadrootsApplicationHandler", RadrootsEventClass::Addressable, RadrootsEventPrivacy::Public, - RadrootsActorRole::Application, + AuthorRole::Application, RadrootsContentSchema::JsonObject, RadrootsEventDiscriminator::KindOnly, D_TAGS, @@ -3482,7 +3527,7 @@ static EVENT_CONTRACTS_REGISTRY_V7: &[RadrootsEventContract] = &[ "RadrootsGroupMetadata", RadrootsEventClass::Addressable, RadrootsEventPrivacy::Public, - RadrootsActorRole::Moderator, + AuthorRole::Moderator, RadrootsContentSchema::JsonObject, RadrootsEventDiscriminator::KindOnly, GROUP_STATE_TAGS, @@ -3495,7 +3540,7 @@ static EVENT_CONTRACTS_REGISTRY_V7: &[RadrootsEventContract] = &[ "RadrootsGroupAdmins", RadrootsEventClass::Addressable, RadrootsEventPrivacy::Public, - RadrootsActorRole::Moderator, + AuthorRole::Moderator, RadrootsContentSchema::JsonObject, RadrootsEventDiscriminator::KindOnly, GROUP_STATE_TAGS, @@ -3508,7 +3553,7 @@ static EVENT_CONTRACTS_REGISTRY_V7: &[RadrootsEventContract] = &[ "RadrootsGroupMembers", RadrootsEventClass::Addressable, RadrootsEventPrivacy::Public, - RadrootsActorRole::Moderator, + AuthorRole::Moderator, RadrootsContentSchema::JsonObject, RadrootsEventDiscriminator::KindOnly, GROUP_STATE_TAGS, @@ -3521,7 +3566,7 @@ static EVENT_CONTRACTS_REGISTRY_V7: &[RadrootsEventContract] = &[ "RadrootsGroupRoles", RadrootsEventClass::Addressable, RadrootsEventPrivacy::Public, - RadrootsActorRole::Moderator, + AuthorRole::Moderator, RadrootsContentSchema::JsonObject, RadrootsEventDiscriminator::KindOnly, GROUP_STATE_TAGS, @@ -3534,7 +3579,7 @@ static EVENT_CONTRACTS_REGISTRY_V7: &[RadrootsEventContract] = &[ "RadrootsTradeMutationEnvelopeV1", RadrootsEventClass::Regular, RadrootsEventPrivacy::Public, - RadrootsActorRole::Buyer, + AuthorRole::Buyer, RadrootsContentSchema::JsonObject, RadrootsEventDiscriminator::ContentJsonFieldEquals { field: "contract_id", @@ -3550,7 +3595,7 @@ static EVENT_CONTRACTS_REGISTRY_V7: &[RadrootsEventContract] = &[ "RadrootsTradeMutationEnvelopeV1", RadrootsEventClass::Regular, RadrootsEventPrivacy::Public, - RadrootsActorRole::Seller, + AuthorRole::Seller, RadrootsContentSchema::JsonObject, RadrootsEventDiscriminator::ContentJsonFieldEquals { field: "contract_id", @@ -3566,7 +3611,7 @@ static EVENT_CONTRACTS_REGISTRY_V7: &[RadrootsEventContract] = &[ "RadrootsTradeMutationEnvelopeV1", RadrootsEventClass::Regular, RadrootsEventPrivacy::Public, - RadrootsActorRole::Any, + AuthorRole::Any, RadrootsContentSchema::JsonObject, RadrootsEventDiscriminator::ContentJsonFieldEquals { field: "contract_id", @@ -3582,7 +3627,7 @@ static EVENT_CONTRACTS_REGISTRY_V7: &[RadrootsEventContract] = &[ "RadrootsTradeMutationEnvelopeV1", RadrootsEventClass::Regular, RadrootsEventPrivacy::Public, - RadrootsActorRole::Any, + AuthorRole::Any, RadrootsContentSchema::JsonObject, RadrootsEventDiscriminator::ContentJsonFieldEquals { field: "contract_id", @@ -3598,7 +3643,7 @@ static EVENT_CONTRACTS_REGISTRY_V7: &[RadrootsEventContract] = &[ "RadrootsTradeMutationEnvelopeV1", RadrootsEventClass::Regular, RadrootsEventPrivacy::Public, - RadrootsActorRole::Buyer, + AuthorRole::Buyer, RadrootsContentSchema::JsonObject, RadrootsEventDiscriminator::ContentJsonFieldEquals { field: "contract_id", @@ -3614,7 +3659,7 @@ static EVENT_CONTRACTS_REGISTRY_V7: &[RadrootsEventContract] = &[ "RadrootsTradeValidationReceipt", RadrootsEventClass::Regular, RadrootsEventPrivacy::Public, - RadrootsActorRole::Service, + AuthorRole::Service, RadrootsContentSchema::JsonObject, RadrootsEventDiscriminator::KindOnly, TRADE_VALIDATION_RECEIPT_TAGS, diff --git a/crates/event/src/contract/registry_v7/tests.rs b/crates/event/src/contract/registry_v7/tests.rs @@ -10,7 +10,7 @@ static AMBIGUOUS_TEST_CONTRACTS: &[RadrootsEventContract] = &[ "Test", RadrootsEventClass::Regular, RadrootsEventPrivacy::Public, - RadrootsActorRole::Any, + AuthorRole::Any, RadrootsContentSchema::PlainText, RadrootsEventDiscriminator::KindOnly, NO_TAGS, @@ -23,7 +23,7 @@ static AMBIGUOUS_TEST_CONTRACTS: &[RadrootsEventContract] = &[ "Test", RadrootsEventClass::Regular, RadrootsEventPrivacy::Public, - RadrootsActorRole::Any, + AuthorRole::Any, RadrootsContentSchema::PlainText, RadrootsEventDiscriminator::KindOnly, NO_TAGS, @@ -93,7 +93,7 @@ fn synthetic_event_contract( class: RadrootsEventClass::Regular, stability: RadrootsEventStability::Experimental, privacy: RadrootsEventPrivacy::Public, - author_role: RadrootsActorRole::Any, + required_author_role: AuthorRole::Any, content_schema: RadrootsContentSchema::PlainText, authoring_policy: RadrootsEventAuthoringPolicy::GenericDraft, discriminator: RadrootsEventDiscriminator::KindOnly, @@ -113,6 +113,31 @@ fn synthetic_kind_contract(kind: u32) -> RadrootsKindContract { } } +#[test] +fn author_role_catalog_is_event_owned_complete_and_schema_stable() { + let declared = AuthorRole::ALL.into_iter().collect::<BTreeSet<_>>(); + let used = all_event_contracts_registry_v7() + .iter() + .map(RadrootsEventContract::required_author_role) + .collect::<BTreeSet<_>>(); + let labels = AuthorRole::ALL + .into_iter() + .map(AuthorRole::as_str) + .collect::<BTreeSet<_>>(); + + assert_eq!(used, declared, "every event author role must be exercised"); + assert_eq!(labels.len(), AuthorRole::ALL.len()); + assert!( + labels.iter().all(|label| { + !label.is_empty() + && label + .bytes() + .all(|byte| byte.is_ascii_lowercase() || byte == b'_') + }), + "author-role manifest labels must remain canonical snake case" + ); +} + fn unsigned_event(kind: u32, tags: Vec<Vec<&str>>, content: &str) -> RadrootsEventEnvelope { RadrootsEventEnvelope::new(RadrootsEventEnvelopeParts { id: "0".repeat(64), @@ -551,7 +576,7 @@ fn classified_listing_kind_profiles_are_partitioned_and_explicit() { ); assert_eq!(food.class, RadrootsEventClass::Addressable); assert_eq!(food.privacy, RadrootsEventPrivacy::Public); - assert_eq!(food.author_role, RadrootsActorRole::Seller); + assert_eq!(food.required_author_role(), AuthorRole::Seller); assert_eq!(food.content_schema, RadrootsContentSchema::Markdown); assert_eq!( food.authoring_policy, @@ -959,7 +984,7 @@ fn nip22_comment_contract_is_typed_and_admission_only() { assert_eq!(contract.kind, KIND_COMMENT); assert_eq!(contract.class, RadrootsEventClass::Regular); assert_eq!(contract.privacy, RadrootsEventPrivacy::Public); - assert_eq!(contract.author_role, RadrootsActorRole::Any); + assert_eq!(contract.required_author_role(), AuthorRole::Any); assert_eq!(contract.content_schema, RadrootsContentSchema::PlainText); assert_eq!( contract.authoring_policy, @@ -1020,7 +1045,7 @@ fn nip09_deletion_request_contract_is_typed_and_admission_only() { assert_eq!(contract.kind, KIND_DELETION_REQUEST); assert_eq!(contract.class, RadrootsEventClass::Regular); assert_eq!(contract.privacy, RadrootsEventPrivacy::Public); - assert_eq!(contract.author_role, RadrootsActorRole::Any); + assert_eq!(contract.required_author_role(), AuthorRole::Any); assert_eq!(contract.content_schema, RadrootsContentSchema::PlainText); assert_eq!( contract.authoring_policy, diff --git a/crates/event/tests/package_boundary.rs b/crates/event/tests/package_boundary.rs @@ -17,6 +17,7 @@ use radroots_identity::PublicKey; const MANIFEST: &str = include_str!("../Cargo.toml"); const ROOT: &str = include_str!("../src/lib.rs"); const IDENTIFIERS: &str = include_str!("../src/ids.rs"); +const CONTRACT_REGISTRY: &str = include_str!("../src/contract/registry_v7.rs"); const RELAY_HINT: &str = include_str!("../src/relay_hint.rs"); const TRADE: &str = include_str!("../src/trade.rs"); @@ -104,6 +105,23 @@ fn verification_typestates_are_native_private_and_policy_gated() { } #[test] +fn contract_author_roles_are_event_owned_requirements_not_signer_provenance() { + let seller = + radroots_event::contract::event_contract("radroots.operational_listing.published.v1") + .expect("operational listing contract"); + + assert_eq!( + seller.required_author_role(), + radroots_event::contract::AuthorRole::Seller + ); + assert!(!CONTRACT_REGISTRY.contains("RadrootsActorRole")); + assert!(!CONTRACT_REGISTRY.contains("pub author_role:")); + assert!(!CONTRACT_REGISTRY.contains("radroots_signing")); + assert!(!CONTRACT_REGISTRY.contains("RadrootsActorContext")); + assert!(!CONTRACT_REGISTRY.contains("AccountId")); +} + +#[test] fn canonical_identifier_api_owns_bytes_and_requires_explicit_text_encoding() { let event_id = EventId::parse("A".repeat(64)).expect("event id"); let signature = EventSignature::parse("B".repeat(128)).expect("event signature"); diff --git a/crates/event_codec/src/manifest.rs b/crates/event_codec/src/manifest.rs @@ -7,11 +7,11 @@ use alloc::{ use radroots_event::RADROOTS_EVENT_VERSION; use radroots_event::contract::{ - RADROOTS_EVENT_CONTRACT_REGISTRY_VERSION, RadrootsActorRole, RadrootsContentSchema, - RadrootsContractFamily, RadrootsEventClass, RadrootsEventContract, RadrootsEventDiscriminator, - RadrootsEventPrivacy, RadrootsEventStability, RadrootsNostrStandard, RadrootsReducer, - RadrootsTagCardinality, RadrootsTagContract, RadrootsTagSemantic, RadrootsTagValueType, - all_event_contracts, event_contract_family, kind_contract, + RADROOTS_EVENT_CONTRACT_REGISTRY_VERSION, RadrootsContentSchema, RadrootsContractFamily, + RadrootsEventClass, RadrootsEventContract, RadrootsEventDiscriminator, RadrootsEventPrivacy, + RadrootsEventStability, RadrootsNostrStandard, RadrootsReducer, RadrootsTagCardinality, + RadrootsTagContract, RadrootsTagSemantic, RadrootsTagValueType, all_event_contracts, + event_contract_family, kind_contract, }; use serde::{Deserialize, Serialize}; use sha2::{Digest, Sha256}; @@ -166,7 +166,7 @@ fn manifest_entry(contract: &RadrootsEventContract) -> RadrootsKnowledgeContract standard: standard.to_string(), stability: stability_label(contract.stability).to_string(), privacy: privacy_label(contract.privacy).to_string(), - author_role: actor_role_label(contract.author_role).to_string(), + author_role: contract.required_author_role().as_str().to_string(), content_schema: content_schema_label(contract.content_schema).to_string(), payload_type: contract.payload_type.to_string(), discriminators: vec![discriminator_manifest(&contract.discriminator)], @@ -344,20 +344,6 @@ fn privacy_label(value: RadrootsEventPrivacy) -> &'static str { } } -fn actor_role_label(value: RadrootsActorRole) -> &'static str { - match value { - RadrootsActorRole::Any => "any", - RadrootsActorRole::Application => "application", - RadrootsActorRole::Buyer => "buyer", - RadrootsActorRole::Farmer => "farmer", - RadrootsActorRole::Member => "member", - RadrootsActorRole::Moderator => "moderator", - RadrootsActorRole::Relay => "relay", - RadrootsActorRole::Seller => "seller", - RadrootsActorRole::Service => "service", - } -} - fn content_schema_label(value: RadrootsContentSchema) -> &'static str { match value { RadrootsContentSchema::Empty => "empty", diff --git a/crates/event_codec/src/manifest/registry_v7.rs b/crates/event_codec/src/manifest/registry_v7.rs @@ -8,7 +8,7 @@ use alloc::{ use radroots_event::{ classified_listing::RadrootsClassifiedListingPartition, contract::{ - RadrootsActorRole, RadrootsContentSchema, RadrootsEventAuthoringPolicy, RadrootsEventClass, + AuthorRole, RadrootsContentSchema, RadrootsEventAuthoringPolicy, RadrootsEventClass, RadrootsEventContract, RadrootsEventDiscriminator, RadrootsEventPrivacy, RadrootsEventStability, RadrootsKindContract, RadrootsNostrStandard, RadrootsReducer, RadrootsTagCardinality, RadrootsTagContract, RadrootsTagSemantic, RadrootsTagValueType, @@ -379,7 +379,7 @@ fn event_inventory_entry( class: class_inventory(contract.class), stability: stability_inventory(contract.stability), privacy: privacy_inventory(contract.privacy), - author_role: actor_role_inventory(contract.author_role), + author_role: author_role_inventory(contract.required_author_role()), content_schema: content_schema_inventory(contract.content_schema), authoring_policy: authoring_policy_inventory(contract.authoring_policy), discriminator: discriminator_inventory(&contract.discriminator), @@ -447,17 +447,17 @@ fn privacy_inventory(value: RadrootsEventPrivacy) -> RadrootsEventContractRegist } } -fn actor_role_inventory(value: RadrootsActorRole) -> RadrootsEventContractRegistryV7ActorRole { +fn author_role_inventory(value: AuthorRole) -> RadrootsEventContractRegistryV7ActorRole { match value { - RadrootsActorRole::Any => RadrootsEventContractRegistryV7ActorRole::Any, - RadrootsActorRole::Application => RadrootsEventContractRegistryV7ActorRole::Application, - RadrootsActorRole::Buyer => RadrootsEventContractRegistryV7ActorRole::Buyer, - RadrootsActorRole::Farmer => RadrootsEventContractRegistryV7ActorRole::Farmer, - RadrootsActorRole::Member => RadrootsEventContractRegistryV7ActorRole::Member, - RadrootsActorRole::Moderator => RadrootsEventContractRegistryV7ActorRole::Moderator, - RadrootsActorRole::Relay => RadrootsEventContractRegistryV7ActorRole::Relay, - RadrootsActorRole::Seller => RadrootsEventContractRegistryV7ActorRole::Seller, - RadrootsActorRole::Service => RadrootsEventContractRegistryV7ActorRole::Service, + AuthorRole::Any => RadrootsEventContractRegistryV7ActorRole::Any, + AuthorRole::Application => RadrootsEventContractRegistryV7ActorRole::Application, + AuthorRole::Buyer => RadrootsEventContractRegistryV7ActorRole::Buyer, + AuthorRole::Farmer => RadrootsEventContractRegistryV7ActorRole::Farmer, + AuthorRole::Member => RadrootsEventContractRegistryV7ActorRole::Member, + AuthorRole::Moderator => RadrootsEventContractRegistryV7ActorRole::Moderator, + AuthorRole::Relay => RadrootsEventContractRegistryV7ActorRole::Relay, + AuthorRole::Seller => RadrootsEventContractRegistryV7ActorRole::Seller, + AuthorRole::Service => RadrootsEventContractRegistryV7ActorRole::Service, } } diff --git a/crates/event_store/contracts/source_maintenance_v1.manifest.json b/crates/event_store/contracts/source_maintenance_v1.manifest.json @@ -264,8 +264,8 @@ { "role": "event_contract_registry_v7_authority", "path": "crates/event/src/contract/registry_v7.rs", - "byte_length": 155739, - "sha256": "64f5a67f8a54f364287210a3f717d9124bc1cb2b9c5fc67e9ff0e40acd7bd216", + "byte_length": 156426, + "sha256": "b24fd9cf75279dcd24971fba7d55df1a58f0fc773b68984528bd42e59b838086", "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 @@ -f4c42eb9d41cfa5378c0111708a6d2ca0e4cbf8c7cee64c85638d75e5887cb97 +ef36b3010757fed79fc799db93308e32303d808788ddae41f8169c4bb64a6b28 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\": 12411,\n \"sha256\": \"cad96f080b0cc9ac7ffda703c8807540c9cf89f47a2299b141e6e7949714bf9f\",\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\": 155739,\n \"sha256\": \"64f5a67f8a54f364287210a3f717d9124bc1cb2b9c5fc67e9ff0e40acd7bd216\",\n \"hash_algorithm\": \"sha256_bytes_v1\"\n },\n {\n \"role\": \"event_envelope_authority\",\n \"path\": \"crates/event/src/envelope.rs\",\n \"byte_length\": 31143,\n \"sha256\": \"2478ca91b4dedaf8b8aefe653971b70c56c4ee076dcbfdf7f59f97f86c03b748\",\n \"hash_algorithm\": \"sha256_bytes_v1\"\n },\n {\n \"role\": \"event_verification_typestate_authority\",\n \"path\": \"crates/event/src/verification.rs\",\n \"byte_length\": 9470,\n \"sha256\": \"181e17a5e45d7a01ae2d2d4057b210456072bfb260712ace71c2dd2461dda898\",\n \"hash_algorithm\": \"sha256_bytes_v1\"\n },\n {\n \"role\": \"event_admission_typestate_authority\",\n \"path\": \"crates/event/src/admission.rs\",\n \"byte_length\": 5809,\n \"sha256\": \"8caf75f69994e9710b4e8f82abface29e752dd581c012e5e20452c82d21c2d01\",\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\": 7538,\n \"sha256\": \"fbc738b403afd3a186ab183ff5f457125a7fbfab01a51fd4b46c92a2543a0126\",\n \"hash_algorithm\": \"sha256_bytes_v1\"\n },\n {\n \"role\": \"event_ids_authority\",\n \"path\": \"crates/event/src/ids.rs\",\n \"byte_length\": 51007,\n \"sha256\": \"7d5d52dcbdd2ec31d914999960fa58aa279a8d4f8bd380fb6050b9a1019ad2d8\",\n \"hash_algorithm\": \"sha256_bytes_v1\"\n },\n {\n \"role\": \"event_trade_authority\",\n \"path\": \"crates/event/src/trade.rs\",\n \"byte_length\": 68514,\n \"sha256\": \"88c21633f60b84adf30ad7fe21d6d0b6844cc7186826600a83a467cc028e55dd\",\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\": 58707,\n \"sha256\": \"c21e1b2e9cf6bfb4e007a32772ba59452deef0c9ba5f652992159e85fe7ccb24\",\n \"hash_algorithm\": \"sha256_bytes_v1\"\n },\n {\n \"role\": \"event_calendar_authority\",\n \"path\": \"crates/event/src/calendar.rs\",\n \"byte_length\": 103837,\n \"sha256\": \"928e5a3df61ab08565cecf20a5045352236bc3d807127f1cd66294d60ee65621\",\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\": 36434,\n \"sha256\": \"ec944bd868deb71215c915a35e79ff26715317fdb62c0fbbb5f1d0993f769c38\",\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\": 31177,\n \"sha256\": \"eaf5eac81cd90039dd2c8f5a1f647d7916f961841d51887f1c5a679947bc816a\",\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\": 14019,\n \"sha256\": \"f50a8fddd1ec9996a452f944ebc59ca4217fc8b28d90be33c2cca925dc3465d0\",\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\": 8649,\n \"sha256\": \"1ef3d12f90eb7d35f4cafe36c2cc0bbd33731df278b58c9062fb13934e2a98c8\",\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\": 5067,\n \"sha256\": \"de0b3f67177a48bd8e3c62534850103d09b7be099e80e88a9583363db705fcbb\",\n \"hash_algorithm\": \"sha256_bytes_v1\"\n },\n {\n \"role\": \"event_store_dependency_authority\",\n \"path\": \"crates/event_store/Cargo.toml\",\n \"byte_length\": 1567,\n \"sha256\": \"46e03d3c758e1116638021a0499dfa588b4266498e0d50cfa758f9bef9bcfeb3\",\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\": 185215,\n \"sha256\": \"575c9fb25b1f728144f5fe649007be705092d9b137f51fd8d771439871bfa09a\",\n \"hash_algorithm\": \"sha256_bytes_v1\"\n },\n {\n \"role\": \"nip09_successor_result_vector_executor\",\n \"path\": \"crates/event_store/tests/support/nip09_reconciliation_v1_result_vector_v2.rs\",\n \"byte_length\": 17983,\n \"sha256\": \"a1d919aa545d7c506d7ae8740445025732c2cda302790d243a4ff3d6cee898f6\",\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\": 395012,\n \"sha256\": \"5538b600fa5e457e10f23fe4e3a3c55496662098abaef2692108dc69c29aa3e6\",\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\": 40260,\n \"sha256\": \"46ea9c9786099c85150e4979c9dac6f84c1b85b8f30ec44aae6d25f9eb9bebc5\",\n \"hash_algorithm\": \"sha256_bytes_v1\"\n },\n {\n \"role\": \"current_visibility_store\",\n \"path\": \"crates/event_store/src/store/current_visibility_v1.rs\",\n \"byte_length\": 15786,\n \"sha256\": \"bf03f9fc45561366cc489daa400b39d65e68cc70aea2ef4a9cd7724224ca9514\",\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\": 48959,\n \"sha256\": \"a01ed95983481a8f0efdcc985635efba122fdbfafc226b7e0b30325af6b4de80\",\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\": \"3820dad764a0575c20f3dc80a2f850651a1e41ab767cf46305377bf800558699\",\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\": 16897,\n \"sha256\": \"3fb583b06dbd2e4fde96346da21e6d4516e79c8a4a3889299a7dd736c882c5df\",\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\": 30153,\n \"sha256\": \"de7c327d940d561f0818fade4dc79cabb0b5141e30e02574c702b6f109aee392\",\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\": 51849,\n \"sha256\": \"db43df5849c811d767a87bfa7884ce499400d0b169734e18242542a4415b3a51\",\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\": 34061,\n \"sha256\": \"7cdbdda875a876482a061bcd8886d9ba56c10fab0fa76a07d73d0f368324b545\",\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\": 198638,\n \"sha256\": \"66a703e5284d0ce91a95d519eee93bd9763d4ab24b7fe8ef39672064118ed391\",\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\": 836177,\n \"sha256\": \"0ac3b005475394432534fcb657fee34efdb8e8360231c44f94649d46e88fce94\",\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\": 193992,\n \"sha256\": \"6c550f688224ffd5404b4f5b44780c48e95b8cf2adee730f3a178024625b7c80\",\n \"hash_algorithm\": \"sha256_bytes_v1\"\n },\n {\n \"role\": \"contract_command_authority\",\n \"path\": \"tools/xtask/src/contract.rs\",\n \"byte_length\": 506277,\n \"sha256\": \"3a06ed79b5b342dce5b6582fc5c58311378a2dba97e5a8c74361f0186886023d\",\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\": 16426,\n \"sha256\": \"abc24896c6c740c10811a3e003ec4be8ebdb376a7b6b01445bfa7a5889f094a7\",\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\": 12411,\n \"sha256\": \"cad96f080b0cc9ac7ffda703c8807540c9cf89f47a2299b141e6e7949714bf9f\",\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\": 156426,\n \"sha256\": \"b24fd9cf75279dcd24971fba7d55df1a58f0fc773b68984528bd42e59b838086\",\n \"hash_algorithm\": \"sha256_bytes_v1\"\n },\n {\n \"role\": \"event_envelope_authority\",\n \"path\": \"crates/event/src/envelope.rs\",\n \"byte_length\": 31143,\n \"sha256\": \"2478ca91b4dedaf8b8aefe653971b70c56c4ee076dcbfdf7f59f97f86c03b748\",\n \"hash_algorithm\": \"sha256_bytes_v1\"\n },\n {\n \"role\": \"event_verification_typestate_authority\",\n \"path\": \"crates/event/src/verification.rs\",\n \"byte_length\": 9470,\n \"sha256\": \"181e17a5e45d7a01ae2d2d4057b210456072bfb260712ace71c2dd2461dda898\",\n \"hash_algorithm\": \"sha256_bytes_v1\"\n },\n {\n \"role\": \"event_admission_typestate_authority\",\n \"path\": \"crates/event/src/admission.rs\",\n \"byte_length\": 5809,\n \"sha256\": \"8caf75f69994e9710b4e8f82abface29e752dd581c012e5e20452c82d21c2d01\",\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\": 7538,\n \"sha256\": \"fbc738b403afd3a186ab183ff5f457125a7fbfab01a51fd4b46c92a2543a0126\",\n \"hash_algorithm\": \"sha256_bytes_v1\"\n },\n {\n \"role\": \"event_ids_authority\",\n \"path\": \"crates/event/src/ids.rs\",\n \"byte_length\": 51007,\n \"sha256\": \"7d5d52dcbdd2ec31d914999960fa58aa279a8d4f8bd380fb6050b9a1019ad2d8\",\n \"hash_algorithm\": \"sha256_bytes_v1\"\n },\n {\n \"role\": \"event_trade_authority\",\n \"path\": \"crates/event/src/trade.rs\",\n \"byte_length\": 68514,\n \"sha256\": \"88c21633f60b84adf30ad7fe21d6d0b6844cc7186826600a83a467cc028e55dd\",\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\": 58707,\n \"sha256\": \"c21e1b2e9cf6bfb4e007a32772ba59452deef0c9ba5f652992159e85fe7ccb24\",\n \"hash_algorithm\": \"sha256_bytes_v1\"\n },\n {\n \"role\": \"event_calendar_authority\",\n \"path\": \"crates/event/src/calendar.rs\",\n \"byte_length\": 103837,\n \"sha256\": \"928e5a3df61ab08565cecf20a5045352236bc3d807127f1cd66294d60ee65621\",\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\": 36434,\n \"sha256\": \"ec944bd868deb71215c915a35e79ff26715317fdb62c0fbbb5f1d0993f769c38\",\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\": 31177,\n \"sha256\": \"eaf5eac81cd90039dd2c8f5a1f647d7916f961841d51887f1c5a679947bc816a\",\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\": 14019,\n \"sha256\": \"f50a8fddd1ec9996a452f944ebc59ca4217fc8b28d90be33c2cca925dc3465d0\",\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\": 8649,\n \"sha256\": \"1ef3d12f90eb7d35f4cafe36c2cc0bbd33731df278b58c9062fb13934e2a98c8\",\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\": 5067,\n \"sha256\": \"de0b3f67177a48bd8e3c62534850103d09b7be099e80e88a9583363db705fcbb\",\n \"hash_algorithm\": \"sha256_bytes_v1\"\n },\n {\n \"role\": \"event_store_dependency_authority\",\n \"path\": \"crates/event_store/Cargo.toml\",\n \"byte_length\": 1567,\n \"sha256\": \"46e03d3c758e1116638021a0499dfa588b4266498e0d50cfa758f9bef9bcfeb3\",\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\": 185215,\n \"sha256\": \"575c9fb25b1f728144f5fe649007be705092d9b137f51fd8d771439871bfa09a\",\n \"hash_algorithm\": \"sha256_bytes_v1\"\n },\n {\n \"role\": \"nip09_successor_result_vector_executor\",\n \"path\": \"crates/event_store/tests/support/nip09_reconciliation_v1_result_vector_v2.rs\",\n \"byte_length\": 17983,\n \"sha256\": \"a1d919aa545d7c506d7ae8740445025732c2cda302790d243a4ff3d6cee898f6\",\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\": 395012,\n \"sha256\": \"5538b600fa5e457e10f23fe4e3a3c55496662098abaef2692108dc69c29aa3e6\",\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\": 40260,\n \"sha256\": \"46ea9c9786099c85150e4979c9dac6f84c1b85b8f30ec44aae6d25f9eb9bebc5\",\n \"hash_algorithm\": \"sha256_bytes_v1\"\n },\n {\n \"role\": \"current_visibility_store\",\n \"path\": \"crates/event_store/src/store/current_visibility_v1.rs\",\n \"byte_length\": 15786,\n \"sha256\": \"bf03f9fc45561366cc489daa400b39d65e68cc70aea2ef4a9cd7724224ca9514\",\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\": 48959,\n \"sha256\": \"a01ed95983481a8f0efdcc985635efba122fdbfafc226b7e0b30325af6b4de80\",\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\": \"3820dad764a0575c20f3dc80a2f850651a1e41ab767cf46305377bf800558699\",\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\": 16897,\n \"sha256\": \"3fb583b06dbd2e4fde96346da21e6d4516e79c8a4a3889299a7dd736c882c5df\",\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\": 30153,\n \"sha256\": \"de7c327d940d561f0818fade4dc79cabb0b5141e30e02574c702b6f109aee392\",\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\": 51849,\n \"sha256\": \"db43df5849c811d767a87bfa7884ce499400d0b169734e18242542a4415b3a51\",\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\": 34061,\n \"sha256\": \"7cdbdda875a876482a061bcd8886d9ba56c10fab0fa76a07d73d0f368324b545\",\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\": 198638,\n \"sha256\": \"66a703e5284d0ce91a95d519eee93bd9763d4ab24b7fe8ef39672064118ed391\",\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\": 836177,\n \"sha256\": \"0ac3b005475394432534fcb657fee34efdb8e8360231c44f94649d46e88fce94\",\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\": 193992,\n \"sha256\": \"6c550f688224ffd5404b4f5b44780c48e95b8cf2adee730f3a178024625b7c80\",\n \"hash_algorithm\": \"sha256_bytes_v1\"\n },\n {\n \"role\": \"contract_command_authority\",\n \"path\": \"tools/xtask/src/contract.rs\",\n \"byte_length\": 506277,\n \"sha256\": \"3a06ed79b5b342dce5b6582fc5c58311378a2dba97e5a8c74361f0186886023d\",\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\": 16426,\n \"sha256\": \"abc24896c6c740c10811a3e003ec4be8ebdb376a7b6b01445bfa7a5889f094a7\",\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 = 32509; pub(crate) const SOURCE_MAINTENANCE_MANIFEST_SHA256: &str = - "f4c42eb9d41cfa5378c0111708a6d2ca0e4cbf8c7cee64c85638d75e5887cb97"; + "ef36b3010757fed79fc799db93308e32303d808788ddae41f8169c4bb64a6b28"; 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/trade/src/operational_listing/draft.rs b/crates/trade/src/operational_listing/draft.rs @@ -12,7 +12,7 @@ use std::vec::Vec; use radroots_authority::RadrootsActorContext; use radroots_event::{ - contract::RadrootsActorRole, + contract::AuthorRole, ids::{RadrootsClassifiedListingAddress, RadrootsIdParseError, RadrootsInventoryBinId}, kinds::KIND_CLASSIFIED_LISTING, operational_listing::RadrootsOperationalListing, @@ -93,7 +93,7 @@ pub enum RadrootsOperationalListingEditError { InvalidClassifiedListingAddress(RadrootsIdParseError), InvalidModel(RadrootsOperationalListingValidationError), ActorRoleUnsatisfied { - required_role: RadrootsActorRole, + required_role: AuthorRole, }, FarmPubkeyMismatch { expected_pubkey: PublicKey, @@ -174,9 +174,9 @@ pub fn canonicalize_operational_listing_edit( actor: &RadrootsActorContext, mut document: RadrootsOperationalListingEditDocumentV1, ) -> Result<RadrootsOperationalListingCanonicalEdit, RadrootsOperationalListingEditError> { - if !actor.satisfies(RadrootsActorRole::Seller) { + if !actor.satisfies(AuthorRole::Seller) { return Err(RadrootsOperationalListingEditError::ActorRoleUnsatisfied { - required_role: RadrootsActorRole::Seller, + required_role: AuthorRole::Seller, }); } @@ -194,7 +194,7 @@ mod tests { use radroots_authority::RadrootsActorContext; use radroots_core::{Currency, Decimal, Money, Quantity, QuantityPrice, Unit}; use radroots_event::{ - contract::RadrootsActorRole, + contract::AuthorRole, farm::RadrootsFarmRef, ids::{RadrootsClassifiedListingAddress, RadrootsDTag, RadrootsInventoryBinId}, kinds::KIND_CLASSIFIED_LISTING, @@ -279,11 +279,11 @@ mod tests { } fn seller_actor() -> RadrootsActorContext { - RadrootsActorContext::explicit_pubkey(SELLER, [RadrootsActorRole::Seller]).expect("actor") + RadrootsActorContext::explicit_pubkey(SELLER, [AuthorRole::Seller]).expect("actor") } fn buyer_actor() -> RadrootsActorContext { - RadrootsActorContext::explicit_pubkey(SELLER, [RadrootsActorRole::Buyer]).expect("actor") + RadrootsActorContext::explicit_pubkey(SELLER, [AuthorRole::Buyer]).expect("actor") } #[test] @@ -367,7 +367,7 @@ mod tests { assert_eq!( error, RadrootsOperationalListingEditError::ActorRoleUnsatisfied { - required_role: RadrootsActorRole::Seller + required_role: AuthorRole::Seller } ); }