lib

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

commit f135f99ed5b7a7651dd2ef88cb5cb9cd91839910
parent 5dfeb3908b45783f48e4a3e6315b7ea85cdbcdbb
Author: triesap <tyson@radroots.org>
Date:   Wed, 29 Jul 2026 23:39:44 +0000

event-codec: isolate serde and JSON features

- adopt the final std, serde, json, knowledge, and manifests vocabulary
- gate JSON adapters explicitly and migrate every first-party feature activator
- bind the renamed feature graph in package and successor governance evidence

Diffstat:
Mbuild/nix/common.nix | 2+-
Mcontracts/coverage-profiles.toml | 2+-
Mcrates/event_codec/Cargo.toml | 9++++-----
Mcrates/event_codec/README.md | 21+++++++++------------
Mcrates/event_codec/src/codec.rs | 10+++++-----
Mcrates/event_codec/src/coop/decode.rs | 2+-
Mcrates/event_codec/src/coop/encode.rs | 6+++---
Mcrates/event_codec/src/coop/mod.rs | 6+++---
Mcrates/event_codec/src/decode.rs | 6+++---
Mcrates/event_codec/src/document/decode.rs | 2+-
Mcrates/event_codec/src/document/encode.rs | 8++++----
Mcrates/event_codec/src/encode.rs | 10+++++-----
Mcrates/event_codec/src/farm/decode.rs | 2+-
Mcrates/event_codec/src/farm/encode.rs | 6+++---
Mcrates/event_codec/src/farm/mod.rs | 16++++++++--------
Mcrates/event_codec/src/farm_crdt/encode.rs | 12++++++------
Mcrates/event_codec/src/farm_crdt/mod.rs | 4++--
Mcrates/event_codec/src/farm_workspace/encode.rs | 6+++---
Mcrates/event_codec/src/farm_workspace/mod.rs | 4++--
Mcrates/event_codec/src/job/encode.rs | 2+-
Mcrates/event_codec/src/lib.rs | 10+++++-----
Mcrates/event_codec/src/list/decode.rs | 2+-
Mcrates/event_codec/src/list/encode.rs | 2+-
Mcrates/event_codec/src/list_set/decode.rs | 4++--
Mcrates/event_codec/src/list_set/encode.rs | 4++--
Mcrates/event_codec/src/operational_listing/decode.rs | 12++++++------
Mcrates/event_codec/src/operational_listing/encode.rs | 20++++++++++----------
Mcrates/event_codec/src/operational_listing/tags.rs | 22+++++++++++-----------
Mcrates/event_codec/src/order/decode.rs | 36++++++++++++++++++------------------
Mcrates/event_codec/src/order/encode.rs | 24++++++++++++------------
Mcrates/event_codec/src/order/mod.rs | 4++--
Mcrates/event_codec/src/plot/decode.rs | 2+-
Mcrates/event_codec/src/plot/encode.rs | 6+++---
Mcrates/event_codec/src/profile/mod.rs | 8++++----
Mcrates/event_codec/src/relay_document/decode.rs | 2+-
Mcrates/event_codec/src/relay_document/encode.rs | 2+-
Mcrates/event_codec/src/resource_area/decode.rs | 2+-
Mcrates/event_codec/src/resource_area/encode.rs | 6+++---
Mcrates/event_codec/src/resource_cap/decode.rs | 2+-
Mcrates/event_codec/src/resource_cap/encode.rs | 8++++----
Mcrates/event_codec/src/trade/mod.rs | 30+++++++++++++++---------------
Mcrates/event_codec/tests/article.rs | 2+-
Mcrates/event_codec/tests/canonical_surface.rs | 6+++---
Mcrates/event_codec/tests/codec_error_job.rs | 6+++---
Mcrates/event_codec/tests/coverage_edges.rs | 2+-
Mcrates/event_codec/tests/farm_crdt.rs | 2+-
Mcrates/event_codec/tests/farm_workspace.rs | 2+-
Mcrates/event_codec/tests/field_events.rs | 2+-
Mcrates/event_codec/tests/file_metadata.rs | 2+-
Mcrates/event_codec/tests/food_availability_conformance.rs | 2+-
Mcrates/event_codec/tests/knowledge_manifest.rs | 2+-
Mcrates/event_codec/tests/list_private.rs | 2+-
Mcrates/event_codec/tests/nip09_suppression_conformance.rs | 2+-
Mcrates/event_codec/tests/operational_listing.rs | 2+-
Mcrates/event_codec/tests/operational_listing_conformance.rs | 2+-
Mcrates/event_codec/tests/package_boundary.rs | 26++++++++++++++++++++++++++
Mcrates/event_codec/tests/profile.rs | 2+-
Mcrates/event_codec/tests/profile_conformance.rs | 2+-
Mcrates/event_codec/tests/relay_document.rs | 2+-
Mcrates/event_codec/tests/report.rs | 2+-
Mcrates/event_codec/tests/repost.rs | 2+-
Mcrates/event_codec/tests/social_events.rs | 2+-
Mcrates/event_codec/tests/structured_decode.rs | 2+-
Mcrates/event_codec/tests/structured_encode_default.rs | 2+-
Mcrates/event_codec/tests/tag_builders.rs | 4++--
Mcrates/event_codec/tests/verified_admission_conformance.rs | 2+-
Mcrates/event_codec/tests/verified_comment_conformance.rs | 2+-
Mcrates/event_codec/tests/verified_deletion_conformance.rs | 2+-
Mcrates/event_codec/tests/verified_post_conformance.rs | 2+-
Mcrates/event_codec/tests/verified_profile_conformance.rs | 2+-
Mcrates/event_store/Cargo.toml | 2+-
Mcrates/event_store/contracts/source_maintenance_v1.manifest.json | 49++++++++++++++++++++++++++++++++++++++++++-------
Mcrates/event_store/contracts/source_maintenance_v1.manifest.sha256 | 2+-
Mcrates/event_store/src/generated/source_maintenance_manifest.rs | 6+++---
Mcrates/nostr/Cargo.toml | 2+-
Mcrates/replica_sync/Cargo.toml | 2+-
Mcrates/trade/Cargo.toml | 2+-
Mtools/xtask/Cargo.toml | 2+-
Mtools/xtask/src/contract/nip09_reconciliation.rs | 25++++++++++++++-----------
Mtools/xtask/src/contract/source_maintenance.rs | 25+++++++++++++++++++++++++
80 files changed, 319 insertions(+), 234 deletions(-)

diff --git a/build/nix/common.nix b/build/nix/common.nix @@ -109,7 +109,7 @@ let ]; coreContractCargoArgs = lib.concatStringsSep " " (map (crate: "-p ${crate}") coreContractCrates) - + " --features radroots_event_codec/serde_json,radroots_event_codec/nostr,radroots_nostr/blossom,radroots_nostr/client,radroots_nostr/codec,radroots_nostr/events"; + + " --features radroots_event_codec/json,radroots_nostr/blossom,radroots_nostr/client,radroots_nostr/codec,radroots_nostr/events"; craneLib = (crane.mkLib pkgs).overrideToolchain toolchains.stable; commonCraneArgs = { inherit version; diff --git a/contracts/coverage-profiles.toml b/contracts/coverage-profiles.toml @@ -10,7 +10,7 @@ test_threads = 1 [profiles.crates."radroots_event_codec"] no_default_features = false -features = ["serde_json", "nostr"] +features = ["json"] test_threads = 1 [profiles.crates."radroots_nostr_runtime"] diff --git a/crates/event_codec/Cargo.toml b/crates/event_codec/Cargo.toml @@ -16,7 +16,7 @@ readme = "README.md" name = "radroots_event_codec" [features] -default = ["std"] +default = ["std", "json"] std = [ "radroots_blossom/std", "radroots_core/std", @@ -31,10 +31,9 @@ serde = [ "radroots_identity/serde", "radroots_protocol/serde", ] -serde_json = ["serde", "dep:serde_json"] -knowledge = ["serde_json", "radroots_event/knowledge"] -knowledge-nip54 = ["knowledge"] -contract-manifest = ["knowledge", "dep:hex", "dep:sha2"] +json = ["serde", "dep:serde_json"] +knowledge = ["json", "radroots_event/knowledge"] +manifests = ["knowledge", "dep:hex", "dep:sha2"] [dependencies] radroots_blossom = { workspace = true, default-features = false } diff --git a/crates/event_codec/README.md b/crates/event_codec/README.md @@ -10,27 +10,26 @@ codecs and tag builders for the `radroots` core libraries. * tag builder helpers for the same event families exposed by `radroots_event`; * parsed view and error types for codec-driven validation and routing; - * optional `serde_json` and `radroots_nostr` integration for JSON and wire - interop. + * optional `json` adapters for JSON and wire interop. -With the optional `serde_json` feature, the Profile codec exposes separate +With the optional `json` feature, the Profile codec exposes separate strict authored and tolerant inbound operations. Strict authoring emits bounded, deterministic kind-`0` metadata with empty tags and image-typed, byte-verified Blossom media references. Tolerant inbound parsing retains raw and residual fields and never upgrades observed media or NIP-05 syntax into network verification. Its content parser accepts only bounded kind-`0` content from an event whose identifier and signature the caller has already verified. -With `serde_json,nostr`, `profile::admission::verify_and_admit_profile_event` +With `json`, `profile::admission::verify_and_admit_profile_event` provides that combined boundary and returns metadata bound to a non-forgeable signature-verified envelope. Standard tagless kind-`0` events are accepted; no Radroots marker is required. General NIP-01 identifier and Schnorr verification lives in `verification` and -is independent of the optional `knowledge` decoder. The `nostr` feature exposes -`RadrootsSignatureVerifiedEvent` and rejects event kinds above `u16::MAX` -instead of truncating them. +is independent of serde, JSON, and the optional `knowledge` decoder. The +portable verifier exposes `RadrootsSignatureVerifiedEvent` and rejects event +kinds above `u16::MAX` instead of truncating them. -With `serde_json`, `admission::admit_verified_event` is the current central +With `json`, `admission::admit_verified_event` is the current central contract boundary over an already verified event. It preserves typed admitted Profile, root Post, Reply, Comment, DeletionRequest, and FoodAvailability values, while other registered events must pass complete registry shape @@ -218,10 +217,8 @@ non-focused exclusion to that verified envelope. Revision validation accepts two independently verified events, requires both to satisfy the exact authored wire profile, preserves kind, author, `d`, and `published_at`, and applies the NIP-01 newer-event rule: later `created_at`, then lower event id at equal time. -Successful combined verification and admission uses the optional `nostr` -feature; without it, signature verification returns the stable unavailable -error rather than admitting an event. The packaged conformance runner enables -`serde_json,nostr` for signed JSON event cases. +Successful combined verification and admission uses the portable verifier; +the packaged conformance runner enables `json` for signed JSON event cases. These codecs do not sign, publish, replicate, upload, retrieve, or provide client behavior. diff --git a/crates/event_codec/src/codec.rs b/crates/event_codec/src/codec.rs @@ -1,11 +1,11 @@ //! Stateless convenience entrypoints for the canonical codec stages. -#[cfg(feature = "serde_json")] +#[cfg(feature = "json")] use crate::{DecodeError, EncodeError, decode, encode}; use crate::{VerificationError, verify}; -#[cfg(all(not(feature = "std"), feature = "serde_json"))] +#[cfg(all(not(feature = "std"), feature = "json"))] use alloc::string::String; -#[cfg(all(feature = "std", feature = "serde_json"))] +#[cfg(all(feature = "std", feature = "json"))] use std::string::String; /// Stateless convenience entrypoints for the canonical codec stages. @@ -17,13 +17,13 @@ pub struct Codec; impl Codec { /// Decodes compact NIP-01 JSON into an unverified event. - #[cfg(feature = "serde_json")] + #[cfg(feature = "json")] pub fn decode_event(raw_json: &str) -> Result<verify::RawEvent, DecodeError> { decode::event(raw_json) } /// Encodes a native event envelope as compact NIP-01 JSON. - #[cfg(feature = "serde_json")] + #[cfg(feature = "json")] pub fn encode_event( event: &radroots_event::envelope::EventEnvelope, ) -> Result<String, EncodeError> { diff --git a/crates/event_codec/src/coop/decode.rs b/crates/event_codec/src/coop/decode.rs @@ -1,4 +1,4 @@ -#![cfg(feature = "serde_json")] +#![cfg(feature = "json")] #![forbid(unsafe_code)] #[cfg(not(feature = "std"))] diff --git a/crates/event_codec/src/coop/encode.rs b/crates/event_codec/src/coop/encode.rs @@ -16,7 +16,7 @@ use radroots_event::{ use crate::d_tag::validate_d_tag; use crate::error::EventEncodeError; -#[cfg(feature = "serde_json")] +#[cfg(feature = "json")] use radroots_event::wire::Nip01EventWireParts; const TAG_T: &str = "t"; @@ -71,12 +71,12 @@ pub fn coop_ref_tags(coop: &CoopRef) -> Result<Vec<Vec<String>>, EventEncodeErro Ok(tags) } -#[cfg(feature = "serde_json")] +#[cfg(feature = "json")] pub fn to_wire_parts(coop: &Coop) -> Result<Nip01EventWireParts, EventEncodeError> { to_wire_parts_with_kind(coop, KIND_COOP) } -#[cfg(feature = "serde_json")] +#[cfg(feature = "json")] pub fn to_wire_parts_with_kind( coop: &Coop, kind: u32, diff --git a/crates/event_codec/src/coop/mod.rs b/crates/event_codec/src/coop/mod.rs @@ -6,7 +6,7 @@ pub mod list_sets; #[cfg(test)] mod tests { - #[cfg(feature = "serde_json")] + #[cfg(feature = "json")] use crate::coop::decode::coop_from_event; use crate::coop::encode::{coop_build_tags, coop_ref_tags}; use crate::coop::list_sets::{ @@ -14,7 +14,7 @@ mod tests { member_of_coops_list_set, }; use crate::error::EventEncodeError; - #[cfg(feature = "serde_json")] + #[cfg(feature = "json")] use radroots_event::envelope::kind::KIND_COOP; use radroots_event::farm::FarmRef; use radroots_event::farm::change_set::{GcsLocation, GeoJsonPoint, GeoJsonPolygon}; @@ -119,7 +119,7 @@ mod tests { } #[test] - #[cfg(feature = "serde_json")] + #[cfg(feature = "json")] fn coop_decode_rejects_empty_d_tag_and_content() { let coop = Coop { d_tag: "BAAAAAAAAAAAAAAAAAAAAA".to_string(), diff --git a/crates/event_codec/src/decode.rs b/crates/event_codec/src/decode.rs @@ -7,7 +7,7 @@ use core::fmt; use radroots_event::envelope::EventEnvelopeError; -#[cfg(feature = "serde_json")] +#[cfg(feature = "json")] use radroots_event::{ admission::RawEvent, envelope::{EventEnvelope, EventEnvelopeParts}, @@ -67,7 +67,7 @@ impl std::error::Error for DecodeError { /// treated as verified or contract-valid. /// /// ```no_run -/// # #[cfg(feature = "serde_json")] +/// # #[cfg(feature = "json")] /// # { /// let raw_json = r#"{"id":"00","pubkey":"00","created_at":0,"kind":1,"tags":[],"content":"","sig":"00"}"#; /// let raw = radroots_event_codec::decode::event(raw_json)?; @@ -76,7 +76,7 @@ impl std::error::Error for DecodeError { /// # } /// # Ok::<(), Box<dyn std::error::Error>>(()) /// ``` -#[cfg(feature = "serde_json")] +#[cfg(feature = "json")] pub fn event(raw_json: &str) -> Result<RawEvent, DecodeError> { let max = EventWireLimits::default().max_raw_json_bytes; let actual = raw_json.len(); diff --git a/crates/event_codec/src/document/decode.rs b/crates/event_codec/src/document/decode.rs @@ -1,4 +1,4 @@ -#![cfg(feature = "serde_json")] +#![cfg(feature = "json")] #![forbid(unsafe_code)] #[cfg(not(feature = "std"))] diff --git a/crates/event_codec/src/document/encode.rs b/crates/event_codec/src/document/encode.rs @@ -12,10 +12,10 @@ use radroots_event::{post::document::Document, tag::name::TAG_D}; use crate::d_tag::validate_d_tag; use crate::error::EventEncodeError; -#[cfg(feature = "serde_json")] +#[cfg(feature = "json")] use radroots_event::envelope::kind::KIND_DOCUMENT; -#[cfg(feature = "serde_json")] +#[cfg(feature = "json")] use radroots_event::wire::Nip01EventWireParts; const TAG_T: &str = "t"; @@ -61,12 +61,12 @@ pub fn document_build_tags(document: &Document) -> Result<Vec<Vec<String>>, Even Ok(tags) } -#[cfg(feature = "serde_json")] +#[cfg(feature = "json")] pub fn to_wire_parts(document: &Document) -> Result<Nip01EventWireParts, EventEncodeError> { to_wire_parts_with_kind(document, KIND_DOCUMENT) } -#[cfg(feature = "serde_json")] +#[cfg(feature = "json")] pub fn to_wire_parts_with_kind( document: &Document, kind: u32, diff --git a/crates/event_codec/src/encode.rs b/crates/event_codec/src/encode.rs @@ -1,12 +1,12 @@ //! Deterministic event encoding boundary. -#[cfg(all(not(feature = "std"), feature = "serde_json"))] +#[cfg(all(not(feature = "std"), feature = "json"))] use alloc::string::String; use core::fmt; -#[cfg(all(feature = "std", feature = "serde_json"))] +#[cfg(all(feature = "std", feature = "json"))] use std::string::String; -#[cfg(feature = "serde_json")] +#[cfg(feature = "json")] use radroots_event::envelope::EventEnvelope; /// A failure while encoding an event. @@ -42,7 +42,7 @@ impl std::error::Error for EncodeError {} /// identifier, signature, or contract has been verified. /// /// ```no_run -/// # #[cfg(feature = "serde_json")] +/// # #[cfg(feature = "json")] /// # { /// # let raw_json = r#"{"id":"00","pubkey":"00","created_at":0,"kind":1,"tags":[],"content":"","sig":"00"}"#; /// let raw = radroots_event_codec::decode::event(raw_json)?; @@ -51,7 +51,7 @@ impl std::error::Error for EncodeError {} /// # } /// # Ok::<(), Box<dyn std::error::Error>>(()) /// ``` -#[cfg(feature = "serde_json")] +#[cfg(feature = "json")] pub fn event(event: &EventEnvelope) -> Result<String, EncodeError> { serde_json::to_string(&event.to_nip01_wire()).map_err(|_| EncodeError::Json) } diff --git a/crates/event_codec/src/farm/decode.rs b/crates/event_codec/src/farm/decode.rs @@ -1,4 +1,4 @@ -#![cfg(feature = "serde_json")] +#![cfg(feature = "json")] #[cfg(not(feature = "std"))] use alloc::{ diff --git a/crates/event_codec/src/farm/encode.rs b/crates/event_codec/src/farm/encode.rs @@ -15,7 +15,7 @@ use radroots_event::{ use crate::d_tag::validate_d_tag; use crate::error::EventEncodeError; -#[cfg(feature = "serde_json")] +#[cfg(feature = "json")] use radroots_event::wire::Nip01EventWireParts; const TAG_T: &str = "t"; @@ -81,12 +81,12 @@ pub fn farm_ref_tags(farm: &FarmRef) -> Result<Vec<Vec<String>>, EventEncodeErro Ok(tags) } -#[cfg(feature = "serde_json")] +#[cfg(feature = "json")] pub fn to_wire_parts(farm: &Farm) -> Result<Nip01EventWireParts, EventEncodeError> { to_wire_parts_with_kind(farm, KIND_FARM) } -#[cfg(feature = "serde_json")] +#[cfg(feature = "json")] pub fn to_wire_parts_with_kind( farm: &Farm, kind: u32, diff --git a/crates/event_codec/src/farm/mod.rs b/crates/event_codec/src/farm/mod.rs @@ -5,9 +5,9 @@ pub mod list_sets; #[cfg(test)] mod tests { use crate::error::EventEncodeError; - #[cfg(feature = "serde_json")] + #[cfg(feature = "json")] use crate::error::EventParseError; - #[cfg(feature = "serde_json")] + #[cfg(feature = "json")] use crate::farm::decode::{farm_from_event, parsed_from_event}; use crate::farm::encode::{farm_build_tags, farm_ref_tags}; use crate::farm::list_sets::{ @@ -15,7 +15,7 @@ mod tests { farm_plots_list_set_from_plots, member_of_farms_list_set, }; use radroots_core::{Currency, Decimal, Money, Quantity, QuantityPrice, Unit}; - #[cfg(feature = "serde_json")] + #[cfg(feature = "json")] use radroots_event::envelope::kind::KIND_FARM; use radroots_event::farm::plot::Plot; use radroots_event::farm::{Farm, FarmPublicLocation, FarmRef}; @@ -24,11 +24,11 @@ mod tests { OperationalListing, OperationalListingBin, OperationalListingProduct, }; - #[cfg(feature = "serde_json")] + #[cfg(feature = "json")] const EVENT_ID: &str = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"; - #[cfg(feature = "serde_json")] + #[cfg(feature = "json")] const AUTHOR: &str = crate::test_fixtures::FIXTURE_ALICE_PUBLIC_KEY_HEX; - #[cfg(feature = "serde_json")] + #[cfg(feature = "json")] const EVENT_SIG: &str = concat!( "cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", "cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc" @@ -116,7 +116,7 @@ mod tests { #[test] #[cfg_attr(coverage_nightly, coverage(off))] - #[cfg(feature = "serde_json")] + #[cfg(feature = "json")] fn farm_decode_rejects_empty_d_tag_and_content() { let farm = Farm { d_tag: "AAAAAAAAAAAAAAAAAAAAAA".to_string(), @@ -301,7 +301,7 @@ mod tests { #[test] #[cfg_attr(coverage_nightly, coverage(off))] - #[cfg(feature = "serde_json")] + #[cfg(feature = "json")] fn farm_decode_rejects_private_location_and_ops_shapes() { let farm = Farm { d_tag: "AAAAAAAAAAAAAAAAAAAAAA".to_string(), diff --git a/crates/event_codec/src/farm_crdt/encode.rs b/crates/event_codec/src/farm_crdt/encode.rs @@ -1,7 +1,7 @@ #[cfg(not(feature = "std"))] use alloc::{format, string::String, vec::Vec}; -#[cfg(feature = "serde_json")] +#[cfg(feature = "json")] use radroots_event::farm::crdt::KIND_FARM_CRDT_CHANGE; use radroots_event::{ farm::crdt::{FarmCrdtChange, RADROOTS_FARM_CRDT_CHANGE_SCHEMA, RADROOTS_FARM_CRDT_TAG}, @@ -14,7 +14,7 @@ use crate::error::EventEncodeError; use crate::field_helpers::{ push_optional_tag, push_tag, validate_non_empty_base64url, validate_non_empty_field, }; -#[cfg(feature = "serde_json")] +#[cfg(feature = "json")] use radroots_event::wire::Nip01EventWireParts; pub fn farm_crdt_change_build_tags( @@ -44,12 +44,12 @@ pub fn farm_crdt_change_build_tags_with_author( Ok(tags) } -#[cfg(feature = "serde_json")] +#[cfg(feature = "json")] pub fn to_wire_parts(change: &FarmCrdtChange) -> Result<Nip01EventWireParts, EventEncodeError> { to_wire_parts_with_kind(change, KIND_FARM_CRDT_CHANGE) } -#[cfg(feature = "serde_json")] +#[cfg(feature = "json")] pub fn to_wire_parts_with_author( change: &FarmCrdtChange, author_pubkey: &str, @@ -57,7 +57,7 @@ pub fn to_wire_parts_with_author( to_wire_parts_with_kind_and_author(change, KIND_FARM_CRDT_CHANGE, Some(author_pubkey)) } -#[cfg(feature = "serde_json")] +#[cfg(feature = "json")] pub fn to_wire_parts_with_kind( change: &FarmCrdtChange, kind: u32, @@ -65,7 +65,7 @@ pub fn to_wire_parts_with_kind( to_wire_parts_with_kind_and_author(change, kind, None) } -#[cfg(feature = "serde_json")] +#[cfg(feature = "json")] pub fn to_wire_parts_with_kind_and_author( change: &FarmCrdtChange, kind: u32, diff --git a/crates/event_codec/src/farm_crdt/mod.rs b/crates/event_codec/src/farm_crdt/mod.rs @@ -1,9 +1,9 @@ pub mod encode; -#[cfg(feature = "serde_json")] +#[cfg(feature = "json")] pub mod decode; -#[cfg(all(test, feature = "serde_json"))] +#[cfg(all(test, feature = "json"))] mod tests { use radroots_event::{ envelope::kind::KIND_POST, diff --git a/crates/event_codec/src/farm_workspace/encode.rs b/crates/event_codec/src/farm_workspace/encode.rs @@ -13,7 +13,7 @@ use radroots_event::{ use crate::d_tag::validate_d_tag; use crate::error::EventEncodeError; use crate::field_helpers::{address_string, push_tag, validate_non_empty_field}; -#[cfg(feature = "serde_json")] +#[cfg(feature = "json")] use radroots_event::wire::Nip01EventWireParts; pub fn farm_workspace_build_tags( @@ -32,14 +32,14 @@ pub fn farm_workspace_build_tags( Ok(tags) } -#[cfg(feature = "serde_json")] +#[cfg(feature = "json")] pub fn to_wire_parts( manifest: &FarmWorkspaceManifest, ) -> Result<Nip01EventWireParts, EventEncodeError> { to_wire_parts_with_kind(manifest, KIND_FARM_WORKSPACE_MANIFEST) } -#[cfg(feature = "serde_json")] +#[cfg(feature = "json")] pub fn to_wire_parts_with_kind( manifest: &FarmWorkspaceManifest, kind: u32, diff --git a/crates/event_codec/src/farm_workspace/mod.rs b/crates/event_codec/src/farm_workspace/mod.rs @@ -1,9 +1,9 @@ pub mod encode; -#[cfg(feature = "serde_json")] +#[cfg(feature = "json")] pub mod decode; -#[cfg(all(test, feature = "serde_json"))] +#[cfg(all(test, feature = "json"))] mod tests { use radroots_event::{ envelope::kind::{KIND_FARM, KIND_FARM_FILE_METADATA, KIND_POST}, diff --git a/crates/event_codec/src/job/encode.rs b/crates/event_codec/src/job/encode.rs @@ -27,7 +27,7 @@ impl fmt::Display for JobEncodeError { #[cfg(feature = "std")] impl std::error::Error for JobEncodeError {} -#[cfg(feature = "serde_json")] +#[cfg(feature = "json")] pub fn json_content<T: serde::Serialize>(value: &T) -> Result<String, JobEncodeError> { serde_json::to_string(value).map_err(|_| JobEncodeError::EmptyRequiredField("content-json")) } diff --git a/crates/event_codec/src/lib.rs b/crates/event_codec/src/lib.rs @@ -15,7 +15,7 @@ mod field_helpers; pub mod job; #[cfg(feature = "knowledge")] pub mod knowledge; -#[cfg(feature = "contract-manifest")] +#[cfg(feature = "manifests")] pub mod manifest; pub mod parsed; pub mod profile; @@ -33,7 +33,7 @@ pub use decode::DecodeError; pub use encode::EncodeError; pub use verify::VerificationError; -#[cfg(feature = "serde_json")] +#[cfg(feature = "json")] pub mod admission; pub mod app_data; pub mod article; @@ -72,10 +72,10 @@ pub mod trade; #[cfg(test)] mod test_fixtures; -#[cfg(feature = "serde_json")] +#[cfg(feature = "json")] pub mod relay_document; -#[cfg(feature = "contract-manifest")] +#[cfg(feature = "manifests")] pub use manifest::registry_v7::{ RADROOTS_EVENT_CONTRACT_REGISTRY_V7_EVENT_COUNT, RADROOTS_EVENT_CONTRACT_REGISTRY_V7_INVENTORY_SCHEMA_VERSION, @@ -84,7 +84,7 @@ pub use manifest::registry_v7::{ event_contract_registry_v7_inventory_json, event_contract_registry_v7_inventory_sha256, parse_event_contract_registry_v7_inventory_json, }; -#[cfg(feature = "contract-manifest")] +#[cfg(feature = "manifests")] pub use manifest::{ RADROOTS_KNOWLEDGE_CONTRACT_MANIFEST_SCHEMA_VERSION, contract_manifest_json, contract_manifest_sha256, knowledge_contract_manifest, diff --git a/crates/event_codec/src/list/decode.rs b/crates/event_codec/src/list/decode.rs @@ -122,7 +122,7 @@ pub fn parsed_from_event( RadrootsParsedEvent::from_event_parts(id, author, published_at, kind, content, tags, sig, data) } -#[cfg(feature = "serde_json")] +#[cfg(feature = "json")] pub fn list_private_entries_from_json(content: &str) -> Result<Vec<ListEntry>, EventParseError> { let tags: Vec<Vec<String>> = serde_json::from_str(content).map_err(|_| EventParseError::InvalidJson("content"))?; diff --git a/crates/event_codec/src/list/encode.rs b/crates/event_codec/src/list/encode.rs @@ -90,7 +90,7 @@ fn is_ws_relay_url(value: &str) -> bool { || (value.starts_with("ws://") && value.len() > "ws://".len()) } -#[cfg(feature = "serde_json")] +#[cfg(feature = "json")] pub fn list_private_entries_json(entries: &[ListEntry]) -> Result<String, EventEncodeError> { let tags = list_entries_to_tags(entries)?; serde_json::to_string(&tags).map_err(|_| EventEncodeError::Json) diff --git a/crates/event_codec/src/list_set/decode.rs b/crates/event_codec/src/list_set/decode.rs @@ -4,7 +4,7 @@ use alloc::{string::String, vec::Vec}; use radroots_event::{social::list::ListEntry, social::list_set::ListSet}; use crate::error::EventParseError; -#[cfg(feature = "serde_json")] +#[cfg(feature = "json")] use crate::list::decode::list_entries_from_tags; use crate::parsed::{RadrootsParsedData, RadrootsParsedEvent}; @@ -134,7 +134,7 @@ pub fn parsed_from_event( RadrootsParsedEvent::from_event_parts(id, author, published_at, kind, content, tags, sig, data) } -#[cfg(feature = "serde_json")] +#[cfg(feature = "json")] pub fn list_set_private_entries_from_json( content: &str, ) -> Result<Vec<ListEntry>, EventParseError> { diff --git a/crates/event_codec/src/list_set/encode.rs b/crates/event_codec/src/list_set/encode.rs @@ -8,7 +8,7 @@ use alloc::{ use radroots_event::social::list_set::ListSet; use crate::error::EventEncodeError; -#[cfg(feature = "serde_json")] +#[cfg(feature = "json")] use crate::list::encode::list_entries_to_tags; use radroots_event::wire::Nip01EventWireParts; @@ -73,7 +73,7 @@ pub fn to_wire_parts_with_kind( }) } -#[cfg(feature = "serde_json")] +#[cfg(feature = "json")] pub fn list_set_private_entries_json( entries: &[radroots_event::social::list::ListEntry], ) -> Result<String, EventEncodeError> { diff --git a/crates/event_codec/src/operational_listing/decode.rs b/crates/event_codec/src/operational_listing/decode.rs @@ -59,7 +59,7 @@ enum OperationalListingDecodeError { InvalidUnit(&'static str), InvalidCurrency(&'static str), InvalidJson(&'static str), - #[cfg(feature = "serde_json")] + #[cfg(feature = "json")] InvalidDiscount(&'static str), } @@ -76,7 +76,7 @@ impl OperationalListingDecodeError { Self::InvalidJson(field) => { OperationalListingParseError::InvalidJson(field.to_string()) } - #[cfg(feature = "serde_json")] + #[cfg(feature = "json")] Self::InvalidDiscount(field) => { OperationalListingParseError::InvalidDiscount(field.to_string()) } @@ -90,7 +90,7 @@ impl OperationalListingDecodeError { | Self::InvalidNumber(field) | Self::InvalidUnit(field) | Self::InvalidCurrency(field) => EventParseError::InvalidTag(field), - #[cfg(feature = "serde_json")] + #[cfg(feature = "json")] Self::InvalidDiscount(field) => EventParseError::InvalidTag(field), Self::InvalidJson(_) => EventParseError::InvalidJson("content"), } @@ -120,7 +120,7 @@ fn reject_private_listing_location_content( if !trimmed.starts_with('{') { return Ok(()); } - #[cfg(feature = "serde_json")] + #[cfg(feature = "json")] { let Ok(value) = serde_json::from_str::<serde_json::Value>(trimmed) else { return Ok(()); @@ -802,12 +802,12 @@ fn parse_image_size(value: &str) -> Option<OperationalListingImageSize> { } fn parse_discount(payload: &str) -> Result<Discount, OperationalListingDecodeError> { - #[cfg(feature = "serde_json")] + #[cfg(feature = "json")] { serde_json::from_str(payload) .map_err(|_| OperationalListingDecodeError::InvalidDiscount(TAG_RADROOTS_DISCOUNT)) } - #[cfg(not(feature = "serde_json"))] + #[cfg(not(feature = "json"))] { let _ = payload; Err(OperationalListingDecodeError::InvalidJson("discount")) diff --git a/crates/event_codec/src/operational_listing/encode.rs b/crates/event_codec/src/operational_listing/encode.rs @@ -1,22 +1,22 @@ -#[cfg(all(not(feature = "std"), test, feature = "serde_json"))] +#[cfg(all(not(feature = "std"), test, feature = "json"))] use alloc::vec; -#[cfg(all(not(feature = "std"), feature = "serde_json"))] +#[cfg(all(not(feature = "std"), feature = "json"))] use alloc::{format, string::ToString}; #[cfg(not(feature = "std"))] use alloc::{string::String, vec::Vec}; -#[cfg(feature = "serde_json")] +#[cfg(feature = "json")] use radroots_event::envelope::kind::{KIND_CLASSIFIED_LISTING, is_classified_listing_kind}; use radroots_event::listing::operational::OperationalListing; use crate::error::EventEncodeError; use crate::operational_listing::tags::operational_listing_tags; -#[cfg(feature = "serde_json")] +#[cfg(feature = "json")] use crate::operational_listing::tags::operational_listing_tags_full; -#[cfg(feature = "serde_json")] +#[cfg(feature = "json")] use radroots_event::wire::Nip01EventWireParts; -#[cfg(feature = "serde_json")] +#[cfg(feature = "json")] const DEFAULT_KIND: u32 = KIND_CLASSIFIED_LISTING; pub fn operational_listing_build_tags( @@ -25,14 +25,14 @@ pub fn operational_listing_build_tags( operational_listing_tags(listing) } -#[cfg(feature = "serde_json")] +#[cfg(feature = "json")] pub fn to_wire_parts( listing: &OperationalListing, ) -> Result<Nip01EventWireParts, EventEncodeError> { to_wire_parts_with_kind(listing, DEFAULT_KIND) } -#[cfg(feature = "serde_json")] +#[cfg(feature = "json")] pub fn to_wire_parts_with_kind( listing: &OperationalListing, kind: u32, @@ -49,7 +49,7 @@ pub fn to_wire_parts_with_kind( }) } -#[cfg(feature = "serde_json")] +#[cfg(feature = "json")] fn operational_listing_markdown_content(listing: &OperationalListing) -> String { let title = listing.product.title.trim(); let summary = listing @@ -67,7 +67,7 @@ fn operational_listing_markdown_content(listing: &OperationalListing) -> String } } -#[cfg(all(test, feature = "serde_json"))] +#[cfg(all(test, feature = "json"))] mod tests { use super::*; use core::str::FromStr; diff --git a/crates/event_codec/src/operational_listing/tags.rs b/crates/event_codec/src/operational_listing/tags.rs @@ -9,7 +9,7 @@ use alloc::{ }; use radroots_core::Money; -#[cfg(any(feature = "serde_json", test))] +#[cfg(any(feature = "json", test))] use radroots_core::pricing::Discount; use radroots_event::envelope::kind::{KIND_FARM, KIND_PLOT, KIND_RESOURCE_AREA}; use radroots_event::farm::FarmRef; @@ -29,7 +29,7 @@ use crate::error::EventEncodeError; const TAG_PRICE: &str = "price"; const TAG_RADROOTS_BIN: &str = "radroots:bin"; const TAG_RADROOTS_PRICE: &str = "radroots:price"; -#[cfg(feature = "serde_json")] +#[cfg(feature = "json")] const TAG_RADROOTS_DISCOUNT: &str = "radroots:discount"; const TAG_RADROOTS_PRIMARY_BIN: &str = "radroots:primary_bin"; const TAG_RADROOTS_RESOURCE_AREA: &str = "radroots:resource_area"; @@ -161,14 +161,14 @@ pub fn operational_listing_tags_with_options( } } - #[cfg(feature = "serde_json")] + #[cfg(feature = "json")] if let Some(discounts) = &listing.discounts { for discount in discounts { let payload = discount_tag_payload(discount)?; tags.push(vec![TAG_RADROOTS_DISCOUNT.to_string(), payload]); } } - #[cfg(not(feature = "serde_json"))] + #[cfg(not(feature = "json"))] if listing.discounts.as_ref().is_some() { return Err(EventEncodeError::Json); } @@ -423,13 +423,13 @@ fn clean_value(value: &str) -> Option<String> { (!trimmed.is_empty() && !trimmed.eq_ignore_ascii_case("null")).then(|| trimmed.to_string()) } -#[cfg(any(feature = "serde_json", test))] +#[cfg(any(feature = "json", test))] fn discount_tag_payload(discount: &Discount) -> Result<String, EventEncodeError> { - #[cfg(feature = "serde_json")] + #[cfg(feature = "json")] { serde_json::to_string(discount).map_err(|_| EventEncodeError::Json) } - #[cfg(not(feature = "serde_json"))] + #[cfg(not(feature = "json"))] { let _ = discount; Err(EventEncodeError::Json) @@ -701,12 +701,12 @@ mod tests { DiscountValue::MoneyPerBin(money(decimal("1"), Currency::USD)), ) .unwrap(); - #[cfg(feature = "serde_json")] + #[cfg(feature = "json")] { let payload = discount_tag_payload(&discount).expect("serde_json payload"); assert!(payload.contains("\"scope\":\"bin\"")); } - #[cfg(not(feature = "serde_json"))] + #[cfg(not(feature = "json"))] { let _err = discount_tag_payload(&discount).expect_err("missing serde_json"); } @@ -957,7 +957,7 @@ mod tests { ) .unwrap(), ]); - #[cfg(feature = "serde_json")] + #[cfg(feature = "json")] { let tags = operational_listing_tags_with_options( &listing_with_discount, @@ -966,7 +966,7 @@ mod tests { .expect("discount serialization works"); assert!(find_tag(&tags, "radroots:discount").is_some()); } - #[cfg(not(feature = "serde_json"))] + #[cfg(not(feature = "json"))] { let _err = operational_listing_tags_with_options( &listing_with_discount, diff --git a/crates/event_codec/src/order/decode.rs b/crates/event_codec/src/order/decode.rs @@ -1,7 +1,7 @@ -#[cfg(all(not(feature = "std"), feature = "serde_json"))] +#[cfg(all(not(feature = "std"), feature = "json"))] use alloc::{string::String, vec::Vec}; -#[cfg(feature = "serde_json")] +#[cfg(feature = "json")] use radroots_event::{ envelope::EventEnvelope, envelope::kind::is_order_event_kind, @@ -13,18 +13,18 @@ use radroots_event::{ OrderPayloadError, OrderRequest, }, }; -#[cfg(feature = "serde_json")] +#[cfg(feature = "json")] use radroots_identity::PublicKey; -#[cfg(feature = "serde_json")] +#[cfg(feature = "json")] use serde::de::DeserializeOwned; -#[cfg(feature = "serde_json")] +#[cfg(feature = "json")] use crate::order::tags::{ TAG_LISTING_EVENT, parse_order_counterparty_tag, parse_order_listing_event_tag, parse_order_prev_tag, parse_order_root_tag, }; -#[cfg(feature = "serde_json")] +#[cfg(feature = "json")] #[derive(Clone, Debug, PartialEq, Eq)] pub enum RadrootsOrderEnvelopeParseError { InvalidKind(u32), @@ -45,7 +45,7 @@ pub enum RadrootsOrderEnvelopeParseError { InvalidListingAddr(ParseError), } -#[cfg(feature = "serde_json")] +#[cfg(feature = "json")] impl core::fmt::Display for RadrootsOrderEnvelopeParseError { fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result { match self { @@ -80,7 +80,7 @@ impl core::fmt::Display for RadrootsOrderEnvelopeParseError { } } -#[cfg(all(feature = "std", feature = "serde_json"))] +#[cfg(all(feature = "std", feature = "json"))] impl std::error::Error for RadrootsOrderEnvelopeParseError { fn source(&self) -> Option<&(dyn std::error::Error + 'static)> { match self { @@ -92,7 +92,7 @@ impl std::error::Error for RadrootsOrderEnvelopeParseError { } } -#[cfg(feature = "serde_json")] +#[cfg(feature = "json")] #[derive(Clone, Debug, PartialEq, Eq)] pub struct RadrootsOrderEventContext { pub counterparty_pubkey: PublicKey, @@ -101,7 +101,7 @@ pub struct RadrootsOrderEventContext { pub prev_event_id: Option<EventId>, } -#[cfg(feature = "serde_json")] +#[cfg(feature = "json")] pub fn order_envelope_from_event<T: DeserializeOwned>( event: &EventEnvelope, ) -> Result<OrderEnvelope<T>, RadrootsOrderEnvelopeParseError> { @@ -138,7 +138,7 @@ pub fn order_envelope_from_event<T: DeserializeOwned>( Ok(envelope) } -#[cfg(feature = "serde_json")] +#[cfg(feature = "json")] pub fn order_request_from_event( event: &EventEnvelope, ) -> Result<OrderEnvelope<OrderRequest>, RadrootsOrderEnvelopeParseError> { @@ -164,7 +164,7 @@ pub fn order_request_from_event( Ok(envelope) } -#[cfg(feature = "serde_json")] +#[cfg(feature = "json")] pub fn order_decision_from_event( event: &EventEnvelope, ) -> Result<OrderEnvelope<OrderDecision>, RadrootsOrderEnvelopeParseError> { @@ -190,7 +190,7 @@ pub fn order_decision_from_event( Ok(envelope) } -#[cfg(feature = "serde_json")] +#[cfg(feature = "json")] pub fn order_cancellation_from_event( event: &EventEnvelope, ) -> Result<OrderEnvelope<OrderCancellation>, RadrootsOrderEnvelopeParseError> { @@ -216,7 +216,7 @@ pub fn order_cancellation_from_event( Ok(envelope) } -#[cfg(feature = "serde_json")] +#[cfg(feature = "json")] pub fn order_event_context_from_tags( message_type: OrderEventType, tags: &[Vec<String>], @@ -264,7 +264,7 @@ pub fn order_event_context_from_tags( }) } -#[cfg(feature = "serde_json")] +#[cfg(feature = "json")] fn required_order_tag_value<'a>( tags: &'a [Vec<String>], key: &'static str, @@ -283,7 +283,7 @@ fn required_order_tag_value<'a>( Ok(value) } -#[cfg(feature = "serde_json")] +#[cfg(feature = "json")] fn map_tag_parse_error_for_order_envelope( error: crate::error::EventParseError, ) -> RadrootsOrderEnvelopeParseError { @@ -308,7 +308,7 @@ fn map_tag_parse_error_for_order_envelope( } } -#[cfg(feature = "serde_json")] +#[cfg(feature = "json")] fn validate_order_binding<T>( event: &EventEnvelope, envelope: &OrderEnvelope<T>, @@ -337,7 +337,7 @@ fn validate_order_binding<T>( Ok(()) } -#[cfg(all(test, feature = "serde_json"))] +#[cfg(all(test, feature = "json"))] mod tests { use super::{ RadrootsOrderEnvelopeParseError, map_tag_parse_error_for_order_envelope, diff --git a/crates/event_codec/src/order/encode.rs b/crates/event_codec/src/order/encode.rs @@ -1,4 +1,4 @@ -#[cfg(feature = "serde_json")] +#[cfg(feature = "json")] use radroots_event::{ id::EventId, tag::EventPtr, @@ -8,14 +8,14 @@ use radroots_event::{ }, }; -#[cfg(feature = "serde_json")] +#[cfg(feature = "json")] use crate::{error::EventEncodeError, order::tags::order_envelope_tags}; -#[cfg(feature = "serde_json")] +#[cfg(feature = "json")] use radroots_event::wire::Nip01EventWireParts; -#[cfg(feature = "serde_json")] +#[cfg(feature = "json")] use radroots_identity::PublicKey; -#[cfg(feature = "serde_json")] +#[cfg(feature = "json")] fn map_order_envelope_error(error: OrderEnvelopeError) -> EventEncodeError { match error { OrderEnvelopeError::MissingOrderId => EventEncodeError::EmptyRequiredField("order_id"), @@ -26,7 +26,7 @@ fn map_order_envelope_error(error: OrderEnvelopeError) -> EventEncodeError { } } -#[cfg(feature = "serde_json")] +#[cfg(feature = "json")] fn map_order_payload_error(error: OrderPayloadError) -> EventEncodeError { match error { OrderPayloadError::EmptyField(field) => EventEncodeError::EmptyRequiredField(field), @@ -70,7 +70,7 @@ fn map_order_payload_error(error: OrderPayloadError) -> EventEncodeError { } } -#[cfg(feature = "serde_json")] +#[cfg(feature = "json")] struct OrderEnvelopeEventBuildParts<'a, T> { recipient_pubkey: &'a PublicKey, message_type: OrderEventType, @@ -82,7 +82,7 @@ struct OrderEnvelopeEventBuildParts<'a, T> { payload: &'a T, } -#[cfg(feature = "serde_json")] +#[cfg(feature = "json")] fn order_envelope_event_build<T: serde::Serialize>( parts: OrderEnvelopeEventBuildParts<'_, T>, ) -> Result<Nip01EventWireParts, EventEncodeError> { @@ -123,7 +123,7 @@ fn order_envelope_event_build<T: serde::Serialize>( }) } -#[cfg(feature = "serde_json")] +#[cfg(feature = "json")] pub fn order_request_event_build( listing_event: &EventPtr, payload: &OrderRequest, @@ -141,7 +141,7 @@ pub fn order_request_event_build( }) } -#[cfg(feature = "serde_json")] +#[cfg(feature = "json")] pub fn order_decision_event_build( root_event_id: &EventId, prev_event_id: &EventId, @@ -160,7 +160,7 @@ pub fn order_decision_event_build( }) } -#[cfg(feature = "serde_json")] +#[cfg(feature = "json")] pub fn order_cancellation_event_build( root_event_id: &EventId, prev_event_id: &EventId, @@ -179,7 +179,7 @@ pub fn order_cancellation_event_build( }) } -#[cfg(all(test, feature = "serde_json"))] +#[cfg(all(test, feature = "json"))] mod tests { use super::{ OrderEnvelopeEventBuildParts, map_order_envelope_error, map_order_payload_error, diff --git a/crates/event_codec/src/order/mod.rs b/crates/event_codec/src/order/mod.rs @@ -2,13 +2,13 @@ pub mod decode; pub mod encode; pub mod tags; -#[cfg(feature = "serde_json")] +#[cfg(feature = "json")] pub use decode::{ RadrootsOrderEnvelopeParseError, RadrootsOrderEventContext, order_cancellation_from_event, order_decision_from_event, order_envelope_from_event, order_event_context_from_tags, order_request_from_event, }; -#[cfg(feature = "serde_json")] +#[cfg(feature = "json")] pub use encode::{ order_cancellation_event_build, order_decision_event_build, order_request_event_build, }; diff --git a/crates/event_codec/src/plot/decode.rs b/crates/event_codec/src/plot/decode.rs @@ -1,4 +1,4 @@ -#![cfg(feature = "serde_json")] +#![cfg(feature = "json")] #[cfg(not(feature = "std"))] use alloc::{ diff --git a/crates/event_codec/src/plot/encode.rs b/crates/event_codec/src/plot/encode.rs @@ -15,7 +15,7 @@ use radroots_event::{ use crate::d_tag::validate_d_tag; use crate::error::EventEncodeError; -#[cfg(feature = "serde_json")] +#[cfg(feature = "json")] use radroots_event::wire::Nip01EventWireParts; const TAG_T: &str = "t"; @@ -90,12 +90,12 @@ pub fn plot_build_tags(plot: &Plot) -> Result<Vec<Vec<String>>, EventEncodeError Ok(tags) } -#[cfg(feature = "serde_json")] +#[cfg(feature = "json")] pub fn to_wire_parts(plot: &Plot) -> Result<Nip01EventWireParts, EventEncodeError> { to_wire_parts_with_kind(plot, KIND_PLOT) } -#[cfg(feature = "serde_json")] +#[cfg(feature = "json")] pub fn to_wire_parts_with_kind( plot: &Plot, kind: u32, diff --git a/crates/event_codec/src/profile/mod.rs b/crates/event_codec/src/profile/mod.rs @@ -8,16 +8,16 @@ type LegacyProfileString = std::string::String; #[cfg(not(feature = "std"))] type LegacyProfileString = alloc::string::String; -#[cfg(feature = "serde_json")] +#[cfg(feature = "json")] pub mod admission; -#[cfg(feature = "serde_json")] +#[cfg(feature = "json")] pub mod authored; -#[cfg(feature = "serde_json")] +#[cfg(feature = "json")] pub mod decode; -#[cfg(feature = "serde_json")] +#[cfg(feature = "json")] pub mod inbound; /// Temporary lossy compatibility projection for pre-v1 profile consumers. diff --git a/crates/event_codec/src/relay_document/decode.rs b/crates/event_codec/src/relay_document/decode.rs @@ -1,4 +1,4 @@ -#![cfg(feature = "serde_json")] +#![cfg(feature = "json")] use radroots_event::social::relay_document::RelayDocument; diff --git a/crates/event_codec/src/relay_document/encode.rs b/crates/event_codec/src/relay_document/encode.rs @@ -1,4 +1,4 @@ -#![cfg(feature = "serde_json")] +#![cfg(feature = "json")] #[cfg(not(feature = "std"))] use alloc::string::String; diff --git a/crates/event_codec/src/resource_area/decode.rs b/crates/event_codec/src/resource_area/decode.rs @@ -1,4 +1,4 @@ -#![cfg(feature = "serde_json")] +#![cfg(feature = "json")] #[cfg(not(feature = "std"))] use alloc::{ diff --git a/crates/event_codec/src/resource_area/encode.rs b/crates/event_codec/src/resource_area/encode.rs @@ -14,7 +14,7 @@ use radroots_event::{ use crate::d_tag::validate_d_tag; use crate::error::EventEncodeError; -#[cfg(feature = "serde_json")] +#[cfg(feature = "json")] use radroots_event::wire::Nip01EventWireParts; const TAG_T: &str = "t"; @@ -76,12 +76,12 @@ pub fn resource_area_ref_tags( Ok(tags) } -#[cfg(feature = "serde_json")] +#[cfg(feature = "json")] pub fn to_wire_parts(area: &ResourceArea) -> Result<Nip01EventWireParts, EventEncodeError> { to_wire_parts_with_kind(area, KIND_RESOURCE_AREA) } -#[cfg(feature = "serde_json")] +#[cfg(feature = "json")] pub fn to_wire_parts_with_kind( area: &ResourceArea, kind: u32, diff --git a/crates/event_codec/src/resource_cap/decode.rs b/crates/event_codec/src/resource_cap/decode.rs @@ -1,4 +1,4 @@ -#![cfg(feature = "serde_json")] +#![cfg(feature = "json")] #[cfg(not(feature = "std"))] use alloc::{ diff --git a/crates/event_codec/src/resource_cap/encode.rs b/crates/event_codec/src/resource_cap/encode.rs @@ -12,9 +12,9 @@ use radroots_event::{ use crate::d_tag::validate_d_tag; use crate::error::EventEncodeError; -#[cfg(feature = "serde_json")] +#[cfg(feature = "json")] use radroots_event::envelope::kind::KIND_RESOURCE_HARVEST_CAP; -#[cfg(feature = "serde_json")] +#[cfg(feature = "json")] use radroots_event::wire::Nip01EventWireParts; const TAG_A: &str = "a"; @@ -78,12 +78,12 @@ pub fn resource_harvest_cap_build_tags( Ok(tags) } -#[cfg(feature = "serde_json")] +#[cfg(feature = "json")] pub fn to_wire_parts(cap: &ResourceHarvestCap) -> Result<Nip01EventWireParts, EventEncodeError> { to_wire_parts_with_kind(cap, KIND_RESOURCE_HARVEST_CAP) } -#[cfg(feature = "serde_json")] +#[cfg(feature = "json")] pub fn to_wire_parts_with_kind( cap: &ResourceHarvestCap, kind: u32, diff --git a/crates/event_codec/src/trade/mod.rs b/crates/event_codec/src/trade/mod.rs @@ -1,11 +1,11 @@ -#[cfg(all(not(feature = "std"), feature = "serde_json"))] +#[cfg(all(not(feature = "std"), feature = "json"))] use alloc::{ string::{String, ToString}, vec, vec::Vec, }; -#[cfg(feature = "serde_json")] +#[cfg(feature = "json")] use radroots_event::{ envelope::EventEnvelope, envelope::kind::is_trade_mutation_event_kind, @@ -18,10 +18,10 @@ use radroots_event::{ wire::Nip01EventWireParts, }; -#[cfg(feature = "serde_json")] +#[cfg(feature = "json")] use crate::error::EventEncodeError; -#[cfg(feature = "serde_json")] +#[cfg(feature = "json")] #[derive(Clone, Debug, PartialEq, Eq)] pub enum RadrootsTradeMutationParseError { InvalidKind(u32), @@ -35,7 +35,7 @@ pub enum RadrootsTradeMutationParseError { Canonical(TradeProtocolError), } -#[cfg(feature = "serde_json")] +#[cfg(feature = "json")] impl core::fmt::Display for RadrootsTradeMutationParseError { fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result { match self { @@ -52,17 +52,17 @@ impl core::fmt::Display for RadrootsTradeMutationParseError { } } -#[cfg(all(feature = "std", feature = "serde_json"))] +#[cfg(all(feature = "std", feature = "json"))] impl std::error::Error for RadrootsTradeMutationParseError {} -#[cfg(feature = "serde_json")] +#[cfg(feature = "json")] impl From<TradeProtocolError> for RadrootsTradeMutationParseError { fn from(value: TradeProtocolError) -> Self { Self::Canonical(value) } } -#[cfg(feature = "serde_json")] +#[cfg(feature = "json")] pub fn trade_mutation_event_build( envelope: TradeMutationEnvelopeV1, ) -> Result<Nip01EventWireParts, EventEncodeError> { @@ -76,7 +76,7 @@ pub fn trade_mutation_event_build( }) } -#[cfg(feature = "serde_json")] +#[cfg(feature = "json")] pub fn trade_mutation_from_event( event: &EventEnvelope, ) -> Result<TradeMutationEnvelopeV1, RadrootsTradeMutationParseError> { @@ -93,7 +93,7 @@ pub fn trade_mutation_from_event( Ok(envelope) } -#[cfg(feature = "serde_json")] +#[cfg(feature = "json")] pub fn trade_mutation_tags( envelope: &TradeMutationEnvelopeV1, ) -> Result<Vec<Vec<String>>, EventEncodeError> { @@ -107,7 +107,7 @@ pub fn trade_mutation_tags( Ok(tags) } -#[cfg(feature = "serde_json")] +#[cfg(feature = "json")] fn validate_trade_mutation_tags( envelope: &TradeMutationEnvelopeV1, tags: &[Vec<String>], @@ -143,7 +143,7 @@ fn validate_trade_mutation_tags( Ok(()) } -#[cfg(feature = "serde_json")] +#[cfg(feature = "json")] fn required_tag_value<'a>( tags: &'a [Vec<String>], name: &'static str, @@ -162,7 +162,7 @@ fn required_tag_value<'a>( Ok(value) } -#[cfg(feature = "serde_json")] +#[cfg(feature = "json")] fn push_tag( tags: &mut Vec<Vec<String>>, name: &'static str, @@ -175,7 +175,7 @@ fn push_tag( Ok(()) } -#[cfg(feature = "serde_json")] +#[cfg(feature = "json")] fn map_trade_protocol_error_to_encode_error(error: TradeProtocolError) -> EventEncodeError { match error { TradeProtocolError::EmptyField(field) => EventEncodeError::EmptyRequiredField(field), @@ -207,7 +207,7 @@ fn map_trade_protocol_error_to_encode_error(error: TradeProtocolError) -> EventE } } -#[cfg(all(test, feature = "serde_json"))] +#[cfg(all(test, feature = "json"))] mod tests { use super::*; use radroots_event::{ diff --git a/crates/event_codec/tests/article.rs b/crates/event_codec/tests/article.rs @@ -1,4 +1,4 @@ -#![cfg(feature = "serde_json")] +#![cfg(feature = "json")] mod common; diff --git a/crates/event_codec/tests/canonical_surface.rs b/crates/event_codec/tests/canonical_surface.rs @@ -60,7 +60,7 @@ fn module_entrypoints_match_codec_convenience_type() { assert_eq!(contract_validated.event(), &profile_event()); } -#[cfg(feature = "serde_json")] +#[cfg(feature = "json")] #[test] fn decode_does_not_hide_identifier_verification() { let encoded = Codec::encode_event(&profile_event()).expect("encoded event"); @@ -76,7 +76,7 @@ fn decode_does_not_hide_identifier_verification() { assert_eq!(error.code(), "id_mismatch"); } -#[cfg(feature = "serde_json")] +#[cfg(feature = "json")] #[test] fn compact_json_round_trip_is_deterministic() { let encoded = Codec::encode_event(&profile_event()).expect("encoded event"); @@ -86,7 +86,7 @@ fn compact_json_round_trip_is_deterministic() { assert_eq!(reencoded, encoded); } -#[cfg(feature = "serde_json")] +#[cfg(feature = "json")] #[test] fn public_errors_expose_stable_concise_codes() { let decode = Codec::decode_event("{").expect_err("invalid JSON"); diff --git a/crates/event_codec/tests/codec_error_job.rs b/crates/event_codec/tests/codec_error_job.rs @@ -9,9 +9,9 @@ use radroots_event_codec::job::encode::{ push_status_tag, }; use radroots_event_codec::job::error::JobParseError; -#[cfg(feature = "serde_json")] +#[cfg(feature = "json")] use serde::Serialize; -#[cfg(feature = "serde_json")] +#[cfg(feature = "json")] use serde::ser::{Error as _, Serializer}; use test_fixtures::{FIXTURE_ALICE_PUBLIC_KEY_HEX, RELAY_PRIMARY_WSS}; @@ -101,7 +101,7 @@ fn job_encode_helpers_cover_status_provider_relay_and_inputs() { assert!(!assert_no_inputs_when_encrypted(&tags_with_input)); } -#[cfg(feature = "serde_json")] +#[cfg(feature = "json")] #[test] fn job_json_content_covers_success_and_error_paths() { #[derive(Clone)] diff --git a/crates/event_codec/tests/coverage_edges.rs b/crates/event_codec/tests/coverage_edges.rs @@ -1,4 +1,4 @@ -#![cfg(feature = "serde_json")] +#![cfg(feature = "json")] use radroots_event::envelope::kind::KIND_POST; use radroots_event_codec::error::EventParseError; diff --git a/crates/event_codec/tests/farm_crdt.rs b/crates/event_codec/tests/farm_crdt.rs @@ -1,4 +1,4 @@ -#![cfg(feature = "serde_json")] +#![cfg(feature = "json")] use radroots_event::{ farm::crdt::{ diff --git a/crates/event_codec/tests/farm_workspace.rs b/crates/event_codec/tests/farm_workspace.rs @@ -1,4 +1,4 @@ -#![cfg(feature = "serde_json")] +#![cfg(feature = "json")] use radroots_event::{ envelope::kind::{KIND_FARM, KIND_FARM_FILE_METADATA}, diff --git a/crates/event_codec/tests/field_events.rs b/crates/event_codec/tests/field_events.rs @@ -1,4 +1,4 @@ -#![cfg(feature = "serde_json")] +#![cfg(feature = "json")] use radroots_event::{ envelope::kind::{KIND_FARM_FILE_METADATA, KIND_POST}, diff --git a/crates/event_codec/tests/file_metadata.rs b/crates/event_codec/tests/file_metadata.rs @@ -1,4 +1,4 @@ -#![cfg(feature = "serde_json")] +#![cfg(feature = "json")] mod common; diff --git a/crates/event_codec/tests/food_availability_conformance.rs b/crates/event_codec/tests/food_availability_conformance.rs @@ -1,4 +1,4 @@ -#![cfg(feature = "serde_json")] +#![cfg(feature = "json")] use std::{borrow::Cow, collections::BTreeSet, fs, path::Path}; diff --git a/crates/event_codec/tests/knowledge_manifest.rs b/crates/event_codec/tests/knowledge_manifest.rs @@ -1,4 +1,4 @@ -#![cfg(all(feature = "knowledge", feature = "contract-manifest"))] +#![cfg(all(feature = "knowledge", feature = "manifests"))] use std::collections::BTreeSet; diff --git a/crates/event_codec/tests/list_private.rs b/crates/event_codec/tests/list_private.rs @@ -1,4 +1,4 @@ -#![cfg(feature = "serde_json")] +#![cfg(feature = "json")] use radroots_event::social::list::ListEntry; use radroots_event_codec::list::decode::list_private_entries_from_json; diff --git a/crates/event_codec/tests/nip09_suppression_conformance.rs b/crates/event_codec/tests/nip09_suppression_conformance.rs @@ -1,4 +1,4 @@ -#![cfg(feature = "serde_json")] +#![cfg(feature = "json")] use std::{ borrow::Cow, diff --git a/crates/event_codec/tests/operational_listing.rs b/crates/event_codec/tests/operational_listing.rs @@ -1,4 +1,4 @@ -#![cfg(feature = "serde_json")] +#![cfg(feature = "json")] use radroots_core::pricing::{Discount, DiscountScope, DiscountThreshold, DiscountValue}; use radroots_core::{Currency, Decimal, Money, Quantity, QuantityPrice, Unit}; diff --git a/crates/event_codec/tests/operational_listing_conformance.rs b/crates/event_codec/tests/operational_listing_conformance.rs @@ -1,4 +1,4 @@ -#![cfg(feature = "serde_json")] +#![cfg(feature = "json")] use std::{borrow::Cow, collections::BTreeSet, fs, path::Path}; diff --git a/crates/event_codec/tests/package_boundary.rs b/crates/event_codec/tests/package_boundary.rs @@ -61,6 +61,32 @@ fn codec_runtime_is_protocol_neutral_and_host_free() { assert!(!VERIFICATION.contains("feature = \"nostr\"")); } +#[test] +fn serialization_features_are_explicit_additive_and_final() { + let features = table_keys(MANIFEST, "[features]"); + assert_eq!( + features, + BTreeSet::from(["default", "json", "knowledge", "manifests", "serde", "std"]) + ); + assert!(MANIFEST.contains("default = [\"std\", \"json\"]")); + assert!(MANIFEST.contains("json = [\"serde\", \"dep:serde_json\"]")); + assert!(MANIFEST.contains("knowledge = [\"json\", \"radroots_event/knowledge\"]")); + assert!(MANIFEST.contains("manifests = [\"knowledge\", \"dep:hex\", \"dep:sha2\"]")); + + for forbidden in [ + "serde_json", + "contract-manifest", + "knowledge-nip54", + "dto-bindgen", + "codegen", + ] { + assert!( + !features.contains(forbidden), + "retired public feature {forbidden} must remain absent" + ); + } +} + fn table_keys<'a>(manifest: &'a str, heading: &str) -> BTreeSet<&'a str> { let Some((_, table)) = manifest.split_once(heading) else { return BTreeSet::new(); diff --git a/crates/event_codec/tests/profile.rs b/crates/event_codec/tests/profile.rs @@ -1,4 +1,4 @@ -#![cfg(feature = "serde_json")] +#![cfg(feature = "json")] use radroots_event::{ envelope::kind::{KIND_POST, KIND_PROFILE}, diff --git a/crates/event_codec/tests/profile_conformance.rs b/crates/event_codec/tests/profile_conformance.rs @@ -1,4 +1,4 @@ -#![cfg(feature = "serde_json")] +#![cfg(feature = "json")] use std::{borrow::Cow, fs, path::Path}; diff --git a/crates/event_codec/tests/relay_document.rs b/crates/event_codec/tests/relay_document.rs @@ -1,4 +1,4 @@ -#![cfg(feature = "serde_json")] +#![cfg(feature = "json")] use radroots_event_codec::error::EventParseError; use radroots_event_codec::relay_document::decode::from_json; diff --git a/crates/event_codec/tests/report.rs b/crates/event_codec/tests/report.rs @@ -1,4 +1,4 @@ -#![cfg(feature = "serde_json")] +#![cfg(feature = "json")] mod common; diff --git a/crates/event_codec/tests/repost.rs b/crates/event_codec/tests/repost.rs @@ -1,4 +1,4 @@ -#![cfg(feature = "serde_json")] +#![cfg(feature = "json")] use radroots_event::{ envelope::kind::{KIND_ARTICLE, KIND_GENERIC_REPOST, KIND_POST, KIND_REACTION, KIND_REPOST}, diff --git a/crates/event_codec/tests/social_events.rs b/crates/event_codec/tests/social_events.rs @@ -1,4 +1,4 @@ -#![cfg(feature = "serde_json")] +#![cfg(feature = "json")] use radroots_event::{ envelope::kind::{ diff --git a/crates/event_codec/tests/structured_decode.rs b/crates/event_codec/tests/structured_decode.rs @@ -1,4 +1,4 @@ -#![cfg(feature = "serde_json")] +#![cfg(feature = "json")] #[path = "../src/test_fixtures.rs"] mod test_fixtures; diff --git a/crates/event_codec/tests/structured_encode_default.rs b/crates/event_codec/tests/structured_encode_default.rs @@ -1,4 +1,4 @@ -#![cfg(feature = "serde_json")] +#![cfg(feature = "json")] #[path = "../src/test_fixtures.rs"] mod test_fixtures; diff --git a/crates/event_codec/tests/tag_builders.rs b/crates/event_codec/tests/tag_builders.rs @@ -573,7 +573,7 @@ fn listing_and_message_builders_cover_optional_shapes() { ) .unwrap(), ]); - #[cfg(feature = "serde_json")] + #[cfg(feature = "json")] { let tags = operational_listing_tags_with_options(&listing_with_discount_payload, trade_options) @@ -583,7 +583,7 @@ fn listing_and_message_builders_cover_optional_shapes() { .any(|tag| tag.first().map(|v| v.as_str()) == Some("radroots:discount")) ); } - #[cfg(not(feature = "serde_json"))] + #[cfg(not(feature = "json"))] { let err = operational_listing_tags_with_options(&listing_with_discount_payload, trade_options) diff --git a/crates/event_codec/tests/verified_admission_conformance.rs b/crates/event_codec/tests/verified_admission_conformance.rs @@ -1,4 +1,4 @@ -#![cfg(feature = "serde_json")] +#![cfg(feature = "json")] use std::{borrow::Cow, fs, path::Path}; diff --git a/crates/event_codec/tests/verified_comment_conformance.rs b/crates/event_codec/tests/verified_comment_conformance.rs @@ -1,4 +1,4 @@ -#![cfg(feature = "serde_json")] +#![cfg(feature = "json")] use std::{ borrow::Cow, diff --git a/crates/event_codec/tests/verified_deletion_conformance.rs b/crates/event_codec/tests/verified_deletion_conformance.rs @@ -1,4 +1,4 @@ -#![cfg(feature = "serde_json")] +#![cfg(feature = "json")] use std::{ borrow::Cow, diff --git a/crates/event_codec/tests/verified_post_conformance.rs b/crates/event_codec/tests/verified_post_conformance.rs @@ -1,4 +1,4 @@ -#![cfg(feature = "serde_json")] +#![cfg(feature = "json")] use std::{borrow::Cow, collections::BTreeMap, fs, path::Path}; diff --git a/crates/event_codec/tests/verified_profile_conformance.rs b/crates/event_codec/tests/verified_profile_conformance.rs @@ -1,4 +1,4 @@ -#![cfg(feature = "serde_json")] +#![cfg(feature = "json")] use std::{borrow::Cow, fs, path::Path}; diff --git a/crates/event_store/Cargo.toml b/crates/event_store/Cargo.toml @@ -25,7 +25,7 @@ radroots_event = { workspace = true, default-features = false, features = [ "serde", ] } radroots_event_codec = { workspace = true, default-features = false, features = [ - "serde_json", + "json", "std", ] } radroots_identity = { workspace = true, default-features = false, features = [ diff --git a/crates/event_store/contracts/source_maintenance_v1.manifest.json b/crates/event_store/contracts/source_maintenance_v1.manifest.json @@ -479,6 +479,13 @@ "hash_algorithm": "sha256_bytes_v1" }, { + "role": "event_codec_public_surface", + "path": "crates/event_codec/src/lib.rs", + "byte_length": 2698, + "sha256": "021496688fbc8390639a4ec47be1d0b26fe3af0926fbae195692687f04ee4401", + "hash_algorithm": "sha256_bytes_v1" + }, + { "role": "event_codec_verification_facade", "path": "crates/event_codec/src/verification.rs", "byte_length": 253, @@ -619,6 +626,13 @@ "hash_algorithm": "sha256_bytes_v1" }, { + "role": "event_codec_job_encode_authority", + "path": "crates/event_codec/src/job/encode.rs", + "byte_length": 1670, + "sha256": "5d6cae6309fcdd02deb7c751b5c451d257cf1900986391cb39cbb2bfd1ddb577", + "hash_algorithm": "sha256_bytes_v1" + }, + { "role": "event_codec_knowledge_verification_authority", "path": "crates/event_codec/src/knowledge/verification.rs", "byte_length": 6986, @@ -626,6 +640,27 @@ "hash_algorithm": "sha256_bytes_v1" }, { + "role": "event_codec_operational_listing_tags_authority", + "path": "crates/event_codec/src/operational_listing/tags.rs", + "byte_length": 50222, + "sha256": "55b6860bc6f4699dd47a49f8336764e9db78aafb7c32849102dedeb96804b373", + "hash_algorithm": "sha256_bytes_v1" + }, + { + "role": "event_codec_order_decode_authority", + "path": "crates/event_codec/src/order/decode.rs", + "byte_length": 42667, + "sha256": "033d9465bc041d205eab3f820572b719a35651340dcb50bdce7c60fabee5f6e1", + "hash_algorithm": "sha256_bytes_v1" + }, + { + "role": "event_codec_profile_facade", + "path": "crates/event_codec/src/profile/mod.rs", + "byte_length": 1456, + "sha256": "06b890da54580e2ec68f7e729281b7c3b650ac0a95a4fcb0db3c6cdaa591a7ef", + "hash_algorithm": "sha256_bytes_v1" + }, + { "role": "event_codec_tag_builders_authority", "path": "crates/event_codec/src/tag_builders.rs", "byte_length": 9232, @@ -635,15 +670,15 @@ { "role": "event_codec_trade_facade", "path": "crates/event_codec/src/trade/mod.rs", - "byte_length": 21562, - "sha256": "97fd292f2ed47719098a55cad20d1f420d4c313a1349cb76a479ac620f809f48", + "byte_length": 21472, + "sha256": "10cee4b6cd6429ac9eb00327a521bcd0982fae4de98bda77e4728fda002965d3", "hash_algorithm": "sha256_bytes_v1" }, { "role": "event_store_dependency_authority", "path": "crates/event_store/Cargo.toml", - "byte_length": 1556, - "sha256": "9ec34fe9b0e7362a068a5473dea01ee6c4fe629311a9bd6e8be770ebcddb4200", + "byte_length": 1550, + "sha256": "9901a09402592ee873c255edf2e0c0d770105401255679d86ad47c35cb159d72", "hash_algorithm": "sha256_bytes_v1" }, { @@ -825,14 +860,14 @@ "role": "transitive_predecessor_membership_governance", "path": "tools/xtask/src/contract/nip09_reconciliation.rs", "byte_length": 842232, - "sha256": "09508250a5b22c239204937dea7567efb6aa34f1ecc84edb70bb5dcbcf8a3463", + "sha256": "08c2cc956f0f055c8e25d99b5c05dd8f7f2b095c52efa125b7f05471302ef9f5", "hash_algorithm": "sha256_bytes_v1" }, { "role": "source_maintenance_governance", "path": "tools/xtask/src/contract/source_maintenance.rs", - "byte_length": 198386, - "sha256": "0b27791f0f9695fe7dd2e03d5fcb776dd2cc1ee9c68ca62032ea574ef10086b1", + "byte_length": 199270, + "sha256": "148698b4f9f46bcad6af5ce84240153d5742b8ee2ce8b938539ede0da9ef9cdb", "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 @@ -f496d3c80c693187776ab031573ff2f6195c15259fd601b4f12ebe9ed56be330 +7f98748038dc5fd409f681a63fdd4a6617aca9e0990a7e2606d79a04a66388b2 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_public_surface\",\n \"path\": \"crates/event/src/lib.rs\",\n \"byte_length\": 1892,\n \"sha256\": \"5d609b963a9b8db18ef96a10f394617413734d2631774d3296e6d8fc029cb02c\",\n \"hash_algorithm\": \"sha256_bytes_v1\"\n },\n {\n \"role\": \"event_contract_facade\",\n \"path\": \"crates/event/src/contract.rs\",\n \"byte_length\": 208,\n \"sha256\": \"27466bf36461071931f391c60646a13f7781d19584583166cc54c0eece76d010\",\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\": 145805,\n \"sha256\": \"0a62603f6fc05dc9f758561cf7da258c676ada810ceaeca7fb151364a5c83d62\",\n \"hash_algorithm\": \"sha256_bytes_v1\"\n },\n {\n \"role\": \"event_envelope_authority\",\n \"path\": \"crates/event/src/envelope.rs\",\n \"byte_length\": 29310,\n \"sha256\": \"29f8d8c4b17c01cb5a8c7f59e4ce52e134180e0e6f37d265063d278b8f2ff26e\",\n \"hash_algorithm\": \"sha256_bytes_v1\"\n },\n {\n \"role\": \"event_verification_typestate_authority\",\n \"path\": \"crates/event/src/verification.rs\",\n \"byte_length\": 9400,\n \"sha256\": \"417acb2ce670d266b1fa4fcafd6b48a910218deab38f57fb8b942056db76f94d\",\n \"hash_algorithm\": \"sha256_bytes_v1\"\n },\n {\n \"role\": \"event_admission_typestate_authority\",\n \"path\": \"crates/event/src/admission.rs\",\n \"byte_length\": 7052,\n \"sha256\": \"62bd2ceb0f434946fdfc2b81f4efb13738676a29a6936c23a427e43aadf2d9cb\",\n \"hash_algorithm\": \"sha256_bytes_v1\"\n },\n {\n \"role\": \"event_head_facade\",\n \"path\": \"crates/event/src/event_head.rs\",\n \"byte_length\": 97,\n \"sha256\": \"f761ff3e74c4f5e1e28381db00ce698c633ff048669b22984d14a587482e8e83\",\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\": 6849,\n \"sha256\": \"9f4144d8d240023cf493ce0b538ade4c16dc44204d6b5f2797152caf6f9e7dba\",\n \"hash_algorithm\": \"sha256_bytes_v1\"\n },\n {\n \"role\": \"event_ids_authority\",\n \"path\": \"crates/event/src/id.rs\",\n \"byte_length\": 48381,\n \"sha256\": \"a08fe3873815453a03318a706e2fa98a8a6728ec69d24368a87ec60025566fe0\",\n \"hash_algorithm\": \"sha256_bytes_v1\"\n },\n {\n \"role\": \"event_trade_authority\",\n \"path\": \"crates/event/src/trade.rs\",\n \"byte_length\": 65549,\n \"sha256\": \"f818a7287ed82de3fb9ef1d973f0fb18d84b30eb4827ddc576ee502dd980145f\",\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\": 51154,\n \"sha256\": \"7fab3174e7fa6c317287ae53f049c9a5f7590c3432b99f1698c415df663265c0\",\n \"hash_algorithm\": \"sha256_bytes_v1\"\n },\n {\n \"role\": \"event_calendar_authority\",\n \"path\": \"crates/event/src/calendar.rs\",\n \"byte_length\": 97992,\n \"sha256\": \"73e79d61ee175cb46e6123e1d28239252ddf0ad094dc1113bdb1286b63b88d57\",\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\": 7956,\n \"sha256\": \"ac58484b87c7712c81f50f884d1c0dd60938571aa5f6f05d555191f529a4c2b0\",\n \"hash_algorithm\": \"sha256_bytes_v1\"\n },\n {\n \"role\": \"event_profile_authority\",\n \"path\": \"crates/event/src/profile.rs\",\n \"byte_length\": 17011,\n \"sha256\": \"572bfe3b6f1711d109db445077f0a8453cad3f021cc0638f79201b618e16b978\",\n \"hash_algorithm\": \"sha256_bytes_v1\"\n },\n {\n \"role\": \"event_post_authority\",\n \"path\": \"crates/event/src/post.rs\",\n \"byte_length\": 19968,\n \"sha256\": \"a822cd51eff9cbaa39db998cc5c90d117f7a983f0fe2d42d42118cb00e95982c\",\n \"hash_algorithm\": \"sha256_bytes_v1\"\n },\n {\n \"role\": \"event_comment_authority\",\n \"path\": \"crates/event/src/comment.rs\",\n \"byte_length\": 34745,\n \"sha256\": \"24b7fda13229f21cee5cef2a9941e3aaafdbc486b19ed42731b0b6ee37c28703\",\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\": 42829,\n \"sha256\": \"52472c07eb0855d884c60755dc3a3e1a963793451d707e51f769f2d78384f318\",\n \"hash_algorithm\": \"sha256_bytes_v1\"\n },\n {\n \"role\": \"event_deletion_authority\",\n \"path\": \"crates/event/src/deletion.rs\",\n \"byte_length\": 30022,\n \"sha256\": \"8c3f2e32407520a8e8242c1293af32613c648fb76218b8003a18929ac0b3811f\",\n \"hash_algorithm\": \"sha256_bytes_v1\"\n },\n {\n \"role\": \"event_dto_authority\",\n \"path\": \"crates/event/src/dto.rs\",\n \"byte_length\": 5038,\n \"sha256\": \"9e228c95ff6ff33f99441d8682781fd0a1c4d3f1db24284a43985dcbac3ba136\",\n \"hash_algorithm\": \"sha256_bytes_v1\"\n },\n {\n \"role\": \"event_farm_crdt_authority\",\n \"path\": \"crates/event/src/farm_crdt.rs\",\n \"byte_length\": 21118,\n \"sha256\": \"cec265ac9c42b59a14be4eb96924d26a83477c27291f667f23e6e47a64b6b2c7\",\n \"hash_algorithm\": \"sha256_bytes_v1\"\n },\n {\n \"role\": \"event_knowledge_authority\",\n \"path\": \"crates/event/src/knowledge.rs\",\n \"byte_length\": 54624,\n \"sha256\": \"3d55ff88a4e30d5d605f9ae4b2e96b9df6978d6c14e52f9aeb0b8039cfc200d7\",\n \"hash_algorithm\": \"sha256_bytes_v1\"\n },\n {\n \"role\": \"event_operational_listing_authority\",\n \"path\": \"crates/event/src/operational_listing.rs\",\n \"byte_length\": 10307,\n \"sha256\": \"52e710db816c89c8d4b87c86541987f7447f2f7091c394c68d9cb98a27f90159\",\n \"hash_algorithm\": \"sha256_bytes_v1\"\n },\n {\n \"role\": \"event_order_authority\",\n \"path\": \"crates/event/src/order.rs\",\n \"byte_length\": 60218,\n \"sha256\": \"4203fcc469612cac5c705884564e140b9fb076cd57079e22ed85275a8b936e50\",\n \"hash_algorithm\": \"sha256_bytes_v1\"\n },\n {\n \"role\": \"event_reply_authority\",\n \"path\": \"crates/event/src/reply.rs\",\n \"byte_length\": 15581,\n \"sha256\": \"b0b83a1e96125c0892d932e9314519242a715fa8f46334aff765ffd248c91d9a\",\n \"hash_algorithm\": \"sha256_bytes_v1\"\n },\n {\n \"role\": \"event_trade_validation_authority\",\n \"path\": \"crates/event/src/trade_validation.rs\",\n \"byte_length\": 4669,\n \"sha256\": \"1486f79bd1d0eadea6cc1b7646ce1f7f57ccade18334a3ea37286426676b9b98\",\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\": 13598,\n \"sha256\": \"fb8b026eeccf51d78f20771c44223e7b48825aa0e3c760d6b3cb90148021a674\",\n \"hash_algorithm\": \"sha256_bytes_v1\"\n },\n {\n \"role\": \"event_media_authority\",\n \"path\": \"crates/event/src/media.rs\",\n \"byte_length\": 3455,\n \"sha256\": \"10678af3a202d5367dbcf3bcdc0bf9fdf8d8fb89b045d7d3fb96b3cc195ab6f9\",\n \"hash_algorithm\": \"sha256_bytes_v1\"\n },\n {\n \"role\": \"event_social_authority\",\n \"path\": \"crates/event/src/social.rs\",\n \"byte_length\": 6076,\n \"sha256\": \"a2dab19caad46eab14fac86e7c878a801a450d8ac374b0e728b71a5a224eef19\",\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\": 21218,\n \"sha256\": \"c3f82fefcf52b3f208f31dedceae64a29ec6ba2804896a0bb957235fd8d9ff6b\",\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\": 6584,\n \"sha256\": \"72f64615bd6b6dc3b051579e3069b2213f3781dcc28e12f0b533c7d81b81b9b1\",\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\": 5228,\n \"sha256\": \"62da30cb6ef7d0ed2d43715a73bd529283e8ae8c12571bc5c68722cb400f17b8\",\n \"hash_algorithm\": \"sha256_bytes_v1\"\n },\n {\n \"role\": \"event_codec_admission_facade\",\n \"path\": \"crates/event_codec/src/admission.rs\",\n \"byte_length\": 20592,\n \"sha256\": \"49cc28d06e99880d5df75e899ca72c97f4fa27e8cb4f96457527b6cff783e0ae\",\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\": 10347,\n \"sha256\": \"32111c0e0592229c11a93a3a8054e7b124b039451aa696a9abcb56df2a6608d3\",\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\": 15985,\n \"sha256\": \"e17083b0596e3a55994c399bc6272c0ebf04cabaa513260b3d45dd546f7f50ef\",\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\": 26662,\n \"sha256\": \"d1d11116ca27801b7e2f17da60900e6a9ca0b6f27ea9ee0bf19e97dbf24c0c32\",\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\": 53311,\n \"sha256\": \"c63fe853536b17bded6073f32b53434b60fc5123f911d01c642a6b3982f09c70\",\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\": 38028,\n \"sha256\": \"c6901f559e83700610595720c47a4d062078ae8411e1fc2fb952dd215b19dd90\",\n \"hash_algorithm\": \"sha256_bytes_v1\"\n },\n {\n \"role\": \"event_codec_error_authority\",\n \"path\": \"crates/event_codec/src/error.rs\",\n \"byte_length\": 3666,\n \"sha256\": \"174ce982bca37fac28d016c3ab3236441c9b31b2169ec94db6c9288b36c72849\",\n \"hash_algorithm\": \"sha256_bytes_v1\"\n },\n {\n \"role\": \"event_codec_food_admission_authority\",\n \"path\": \"crates/event_codec/src/food_availability/admission.rs\",\n \"byte_length\": 5681,\n \"sha256\": \"99809859090f5295572688d06bbb30dbe50524ba2c996de7ec5b26f6dd390643\",\n \"hash_algorithm\": \"sha256_bytes_v1\"\n },\n {\n \"role\": \"event_codec_food_authored_authority\",\n \"path\": \"crates/event_codec/src/food_availability/authored.rs\",\n \"byte_length\": 9724,\n \"sha256\": \"8673ec62ed3fc47b691efd9ca828643719803971e72b756c5b4603d409d0fba5\",\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\": 26037,\n \"sha256\": \"92a7e75da3293967cec17a514479144c3c948a64542577dd58c7f07992968e4f\",\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\": 4946,\n \"sha256\": \"1b3558a3196744005978dceddd33d3a72ad1ab8f50fb1cbfd997dcfe98bb9e39\",\n \"hash_algorithm\": \"sha256_bytes_v1\"\n },\n {\n \"role\": \"event_codec_knowledge_verification_authority\",\n \"path\": \"crates/event_codec/src/knowledge/verification.rs\",\n \"byte_length\": 6986,\n \"sha256\": \"6f8a10ed262ce37f05acd9c89a1e37ca2fa99ce7da18407891e8abe228ee2349\",\n \"hash_algorithm\": \"sha256_bytes_v1\"\n },\n {\n \"role\": \"event_codec_tag_builders_authority\",\n \"path\": \"crates/event_codec/src/tag_builders.rs\",\n \"byte_length\": 9232,\n \"sha256\": \"bd81ccf04fd72358331b48eddcde087a95e115c5bd90c05fd9332644979ad5e6\",\n \"hash_algorithm\": \"sha256_bytes_v1\"\n },\n {\n \"role\": \"event_codec_trade_facade\",\n \"path\": \"crates/event_codec/src/trade/mod.rs\",\n \"byte_length\": 21562,\n \"sha256\": \"97fd292f2ed47719098a55cad20d1f420d4c313a1349cb76a479ac620f809f48\",\n \"hash_algorithm\": \"sha256_bytes_v1\"\n },\n {\n \"role\": \"event_store_dependency_authority\",\n \"path\": \"crates/event_store/Cargo.toml\",\n \"byte_length\": 1556,\n \"sha256\": \"9ec34fe9b0e7362a068a5473dea01ee6c4fe629311a9bd6e8be770ebcddb4200\",\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\": 19464,\n \"sha256\": \"47be522eb0541619683f8b30eb6f66da821b65eb310a60815c81c7b7f3349947\",\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\": 32314,\n \"sha256\": \"d7ffa47719783c9f08cb4e00fbe47123cf0310ead06f77d3ad1d81edfda96b2c\",\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\": 10452,\n \"sha256\": \"bd3a8f0efe6d4b2959ab8a5b8048cd940fd078dce842083be2386544722017ef\",\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\": 1594,\n \"sha256\": \"27b02ef508b4df45a801ef72e9f92b43819ea6372a3936bc2507c67a42acd07a\",\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\": 22229,\n \"sha256\": \"e651952d73ed0a29d2b137076f56f699beada205ac84ed8a96834e86e343fa78\",\n \"hash_algorithm\": \"sha256_bytes_v1\"\n },\n {\n \"role\": \"current_visibility_model\",\n \"path\": \"crates/event_store/src/model/current_visibility_v1.rs\",\n \"byte_length\": 5634,\n \"sha256\": \"7d5b2b35ceb52d7472d68444515fa4a6aab43f6838b557aefff74fcebf487657\",\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\": 17109,\n \"sha256\": \"2fd51989da7f07b3e80557fb1a4b89814126eb3ffd80023e42012f0242b0584d\",\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\": 184853,\n \"sha256\": \"b6887f9f319809d401ac519137cfa78467ca26594cae53720a58a37ccc72757e\",\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\": 18205,\n \"sha256\": \"c632beee70dc777b8dd2a4f88cadb55296fee7aa5742e6e2c9f6d49f26ae2c78\",\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\": 393835,\n \"sha256\": \"d47f5d8d95599783162533dcd26b0114160a098ddef3447fb2ee6648c3949e5f\",\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\": 40216,\n \"sha256\": \"31ed3390d279aee5261848386889cf256667759b9898be5607856a3f80fd7eb7\",\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\": 15737,\n \"sha256\": \"aa5d1bff7a5368cbac2b37906bb40f54bfc8aa6906bab34369569fdd105bf899\",\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\": 48927,\n \"sha256\": \"78a96d441e2fbfdfc6f9e2787ae773e8fd6aa5c53ca10d658350b843c0d1537e\",\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\": 6569,\n \"sha256\": \"f5bd8ddb45e1b2144895bd8da737fc92db051be1844ce7e8047a32b47376ce37\",\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\": 16558,\n \"sha256\": \"d88c1f7ff5cc0a19221ad893eb840d55c11535f13adf84ffb3076cbc18d4abf1\",\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\": 29950,\n \"sha256\": \"c72aaff06e4f35d0b4523c6625e83345879f9e15b9fe9563dccf589e5d01e277\",\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\": 10835,\n \"sha256\": \"c82179b9f57968191f3e71dd008cc701787c62715ada74090eeecaa3b213076d\",\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\": 34046,\n \"sha256\": \"776903c6431ff07f26c6ad6b713db5628efce1a72f34d86de6e47d4404fa3a6d\",\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\": 198991,\n \"sha256\": \"36fd3d8b5dda3b0855a06a47dae14cae7f4cc84aaca9902c31477c218859fccc\",\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\": 842232,\n \"sha256\": \"09508250a5b22c239204937dea7567efb6aa34f1ecc84edb70bb5dcbcf8a3463\",\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\": 198386,\n \"sha256\": \"0b27791f0f9695fe7dd2e03d5fcb776dd2cc1ee9c68ca62032ea574ef10086b1\",\n \"hash_algorithm\": \"sha256_bytes_v1\"\n },\n {\n \"role\": \"contract_command_authority\",\n \"path\": \"tools/xtask/src/contract.rs\",\n \"byte_length\": 503671,\n \"sha256\": \"82a33a2227fe63eed1d8ca5908f51f48c4ac4aa1d4527a7633980673fd9a6a30\",\n \"hash_algorithm\": \"sha256_bytes_v1\"\n },\n {\n \"role\": \"dto_root_generation_authority\",\n \"path\": \"tools/xtask/src/dto_roots.rs\",\n \"byte_length\": 35940,\n \"sha256\": \"a899a5695d7533c151d03477c4bd697a6e55c47a4980549724ac42046af694f5\",\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 = 37031; +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_public_surface\",\n \"path\": \"crates/event/src/lib.rs\",\n \"byte_length\": 1892,\n \"sha256\": \"5d609b963a9b8db18ef96a10f394617413734d2631774d3296e6d8fc029cb02c\",\n \"hash_algorithm\": \"sha256_bytes_v1\"\n },\n {\n \"role\": \"event_contract_facade\",\n \"path\": \"crates/event/src/contract.rs\",\n \"byte_length\": 208,\n \"sha256\": \"27466bf36461071931f391c60646a13f7781d19584583166cc54c0eece76d010\",\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\": 145805,\n \"sha256\": \"0a62603f6fc05dc9f758561cf7da258c676ada810ceaeca7fb151364a5c83d62\",\n \"hash_algorithm\": \"sha256_bytes_v1\"\n },\n {\n \"role\": \"event_envelope_authority\",\n \"path\": \"crates/event/src/envelope.rs\",\n \"byte_length\": 29310,\n \"sha256\": \"29f8d8c4b17c01cb5a8c7f59e4ce52e134180e0e6f37d265063d278b8f2ff26e\",\n \"hash_algorithm\": \"sha256_bytes_v1\"\n },\n {\n \"role\": \"event_verification_typestate_authority\",\n \"path\": \"crates/event/src/verification.rs\",\n \"byte_length\": 9400,\n \"sha256\": \"417acb2ce670d266b1fa4fcafd6b48a910218deab38f57fb8b942056db76f94d\",\n \"hash_algorithm\": \"sha256_bytes_v1\"\n },\n {\n \"role\": \"event_admission_typestate_authority\",\n \"path\": \"crates/event/src/admission.rs\",\n \"byte_length\": 7052,\n \"sha256\": \"62bd2ceb0f434946fdfc2b81f4efb13738676a29a6936c23a427e43aadf2d9cb\",\n \"hash_algorithm\": \"sha256_bytes_v1\"\n },\n {\n \"role\": \"event_head_facade\",\n \"path\": \"crates/event/src/event_head.rs\",\n \"byte_length\": 97,\n \"sha256\": \"f761ff3e74c4f5e1e28381db00ce698c633ff048669b22984d14a587482e8e83\",\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\": 6849,\n \"sha256\": \"9f4144d8d240023cf493ce0b538ade4c16dc44204d6b5f2797152caf6f9e7dba\",\n \"hash_algorithm\": \"sha256_bytes_v1\"\n },\n {\n \"role\": \"event_ids_authority\",\n \"path\": \"crates/event/src/id.rs\",\n \"byte_length\": 48381,\n \"sha256\": \"a08fe3873815453a03318a706e2fa98a8a6728ec69d24368a87ec60025566fe0\",\n \"hash_algorithm\": \"sha256_bytes_v1\"\n },\n {\n \"role\": \"event_trade_authority\",\n \"path\": \"crates/event/src/trade.rs\",\n \"byte_length\": 65549,\n \"sha256\": \"f818a7287ed82de3fb9ef1d973f0fb18d84b30eb4827ddc576ee502dd980145f\",\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\": 51154,\n \"sha256\": \"7fab3174e7fa6c317287ae53f049c9a5f7590c3432b99f1698c415df663265c0\",\n \"hash_algorithm\": \"sha256_bytes_v1\"\n },\n {\n \"role\": \"event_calendar_authority\",\n \"path\": \"crates/event/src/calendar.rs\",\n \"byte_length\": 97992,\n \"sha256\": \"73e79d61ee175cb46e6123e1d28239252ddf0ad094dc1113bdb1286b63b88d57\",\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\": 7956,\n \"sha256\": \"ac58484b87c7712c81f50f884d1c0dd60938571aa5f6f05d555191f529a4c2b0\",\n \"hash_algorithm\": \"sha256_bytes_v1\"\n },\n {\n \"role\": \"event_profile_authority\",\n \"path\": \"crates/event/src/profile.rs\",\n \"byte_length\": 17011,\n \"sha256\": \"572bfe3b6f1711d109db445077f0a8453cad3f021cc0638f79201b618e16b978\",\n \"hash_algorithm\": \"sha256_bytes_v1\"\n },\n {\n \"role\": \"event_post_authority\",\n \"path\": \"crates/event/src/post.rs\",\n \"byte_length\": 19968,\n \"sha256\": \"a822cd51eff9cbaa39db998cc5c90d117f7a983f0fe2d42d42118cb00e95982c\",\n \"hash_algorithm\": \"sha256_bytes_v1\"\n },\n {\n \"role\": \"event_comment_authority\",\n \"path\": \"crates/event/src/comment.rs\",\n \"byte_length\": 34745,\n \"sha256\": \"24b7fda13229f21cee5cef2a9941e3aaafdbc486b19ed42731b0b6ee37c28703\",\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\": 42829,\n \"sha256\": \"52472c07eb0855d884c60755dc3a3e1a963793451d707e51f769f2d78384f318\",\n \"hash_algorithm\": \"sha256_bytes_v1\"\n },\n {\n \"role\": \"event_deletion_authority\",\n \"path\": \"crates/event/src/deletion.rs\",\n \"byte_length\": 30022,\n \"sha256\": \"8c3f2e32407520a8e8242c1293af32613c648fb76218b8003a18929ac0b3811f\",\n \"hash_algorithm\": \"sha256_bytes_v1\"\n },\n {\n \"role\": \"event_dto_authority\",\n \"path\": \"crates/event/src/dto.rs\",\n \"byte_length\": 5038,\n \"sha256\": \"9e228c95ff6ff33f99441d8682781fd0a1c4d3f1db24284a43985dcbac3ba136\",\n \"hash_algorithm\": \"sha256_bytes_v1\"\n },\n {\n \"role\": \"event_farm_crdt_authority\",\n \"path\": \"crates/event/src/farm_crdt.rs\",\n \"byte_length\": 21118,\n \"sha256\": \"cec265ac9c42b59a14be4eb96924d26a83477c27291f667f23e6e47a64b6b2c7\",\n \"hash_algorithm\": \"sha256_bytes_v1\"\n },\n {\n \"role\": \"event_knowledge_authority\",\n \"path\": \"crates/event/src/knowledge.rs\",\n \"byte_length\": 54624,\n \"sha256\": \"3d55ff88a4e30d5d605f9ae4b2e96b9df6978d6c14e52f9aeb0b8039cfc200d7\",\n \"hash_algorithm\": \"sha256_bytes_v1\"\n },\n {\n \"role\": \"event_operational_listing_authority\",\n \"path\": \"crates/event/src/operational_listing.rs\",\n \"byte_length\": 10307,\n \"sha256\": \"52e710db816c89c8d4b87c86541987f7447f2f7091c394c68d9cb98a27f90159\",\n \"hash_algorithm\": \"sha256_bytes_v1\"\n },\n {\n \"role\": \"event_order_authority\",\n \"path\": \"crates/event/src/order.rs\",\n \"byte_length\": 60218,\n \"sha256\": \"4203fcc469612cac5c705884564e140b9fb076cd57079e22ed85275a8b936e50\",\n \"hash_algorithm\": \"sha256_bytes_v1\"\n },\n {\n \"role\": \"event_reply_authority\",\n \"path\": \"crates/event/src/reply.rs\",\n \"byte_length\": 15581,\n \"sha256\": \"b0b83a1e96125c0892d932e9314519242a715fa8f46334aff765ffd248c91d9a\",\n \"hash_algorithm\": \"sha256_bytes_v1\"\n },\n {\n \"role\": \"event_trade_validation_authority\",\n \"path\": \"crates/event/src/trade_validation.rs\",\n \"byte_length\": 4669,\n \"sha256\": \"1486f79bd1d0eadea6cc1b7646ce1f7f57ccade18334a3ea37286426676b9b98\",\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\": 13598,\n \"sha256\": \"fb8b026eeccf51d78f20771c44223e7b48825aa0e3c760d6b3cb90148021a674\",\n \"hash_algorithm\": \"sha256_bytes_v1\"\n },\n {\n \"role\": \"event_media_authority\",\n \"path\": \"crates/event/src/media.rs\",\n \"byte_length\": 3455,\n \"sha256\": \"10678af3a202d5367dbcf3bcdc0bf9fdf8d8fb89b045d7d3fb96b3cc195ab6f9\",\n \"hash_algorithm\": \"sha256_bytes_v1\"\n },\n {\n \"role\": \"event_social_authority\",\n \"path\": \"crates/event/src/social.rs\",\n \"byte_length\": 6076,\n \"sha256\": \"a2dab19caad46eab14fac86e7c878a801a450d8ac374b0e728b71a5a224eef19\",\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\": 21218,\n \"sha256\": \"c3f82fefcf52b3f208f31dedceae64a29ec6ba2804896a0bb957235fd8d9ff6b\",\n \"hash_algorithm\": \"sha256_bytes_v1\"\n },\n {\n \"role\": \"event_codec_public_surface\",\n \"path\": \"crates/event_codec/src/lib.rs\",\n \"byte_length\": 2698,\n \"sha256\": \"021496688fbc8390639a4ec47be1d0b26fe3af0926fbae195692687f04ee4401\",\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\": 6584,\n \"sha256\": \"72f64615bd6b6dc3b051579e3069b2213f3781dcc28e12f0b533c7d81b81b9b1\",\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\": 5228,\n \"sha256\": \"62da30cb6ef7d0ed2d43715a73bd529283e8ae8c12571bc5c68722cb400f17b8\",\n \"hash_algorithm\": \"sha256_bytes_v1\"\n },\n {\n \"role\": \"event_codec_admission_facade\",\n \"path\": \"crates/event_codec/src/admission.rs\",\n \"byte_length\": 20592,\n \"sha256\": \"49cc28d06e99880d5df75e899ca72c97f4fa27e8cb4f96457527b6cff783e0ae\",\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\": 10347,\n \"sha256\": \"32111c0e0592229c11a93a3a8054e7b124b039451aa696a9abcb56df2a6608d3\",\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\": 15985,\n \"sha256\": \"e17083b0596e3a55994c399bc6272c0ebf04cabaa513260b3d45dd546f7f50ef\",\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\": 26662,\n \"sha256\": \"d1d11116ca27801b7e2f17da60900e6a9ca0b6f27ea9ee0bf19e97dbf24c0c32\",\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\": 53311,\n \"sha256\": \"c63fe853536b17bded6073f32b53434b60fc5123f911d01c642a6b3982f09c70\",\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\": 38028,\n \"sha256\": \"c6901f559e83700610595720c47a4d062078ae8411e1fc2fb952dd215b19dd90\",\n \"hash_algorithm\": \"sha256_bytes_v1\"\n },\n {\n \"role\": \"event_codec_error_authority\",\n \"path\": \"crates/event_codec/src/error.rs\",\n \"byte_length\": 3666,\n \"sha256\": \"174ce982bca37fac28d016c3ab3236441c9b31b2169ec94db6c9288b36c72849\",\n \"hash_algorithm\": \"sha256_bytes_v1\"\n },\n {\n \"role\": \"event_codec_food_admission_authority\",\n \"path\": \"crates/event_codec/src/food_availability/admission.rs\",\n \"byte_length\": 5681,\n \"sha256\": \"99809859090f5295572688d06bbb30dbe50524ba2c996de7ec5b26f6dd390643\",\n \"hash_algorithm\": \"sha256_bytes_v1\"\n },\n {\n \"role\": \"event_codec_food_authored_authority\",\n \"path\": \"crates/event_codec/src/food_availability/authored.rs\",\n \"byte_length\": 9724,\n \"sha256\": \"8673ec62ed3fc47b691efd9ca828643719803971e72b756c5b4603d409d0fba5\",\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\": 26037,\n \"sha256\": \"92a7e75da3293967cec17a514479144c3c948a64542577dd58c7f07992968e4f\",\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\": 4946,\n \"sha256\": \"1b3558a3196744005978dceddd33d3a72ad1ab8f50fb1cbfd997dcfe98bb9e39\",\n \"hash_algorithm\": \"sha256_bytes_v1\"\n },\n {\n \"role\": \"event_codec_job_encode_authority\",\n \"path\": \"crates/event_codec/src/job/encode.rs\",\n \"byte_length\": 1670,\n \"sha256\": \"5d6cae6309fcdd02deb7c751b5c451d257cf1900986391cb39cbb2bfd1ddb577\",\n \"hash_algorithm\": \"sha256_bytes_v1\"\n },\n {\n \"role\": \"event_codec_knowledge_verification_authority\",\n \"path\": \"crates/event_codec/src/knowledge/verification.rs\",\n \"byte_length\": 6986,\n \"sha256\": \"6f8a10ed262ce37f05acd9c89a1e37ca2fa99ce7da18407891e8abe228ee2349\",\n \"hash_algorithm\": \"sha256_bytes_v1\"\n },\n {\n \"role\": \"event_codec_operational_listing_tags_authority\",\n \"path\": \"crates/event_codec/src/operational_listing/tags.rs\",\n \"byte_length\": 50222,\n \"sha256\": \"55b6860bc6f4699dd47a49f8336764e9db78aafb7c32849102dedeb96804b373\",\n \"hash_algorithm\": \"sha256_bytes_v1\"\n },\n {\n \"role\": \"event_codec_order_decode_authority\",\n \"path\": \"crates/event_codec/src/order/decode.rs\",\n \"byte_length\": 42667,\n \"sha256\": \"033d9465bc041d205eab3f820572b719a35651340dcb50bdce7c60fabee5f6e1\",\n \"hash_algorithm\": \"sha256_bytes_v1\"\n },\n {\n \"role\": \"event_codec_profile_facade\",\n \"path\": \"crates/event_codec/src/profile/mod.rs\",\n \"byte_length\": 1456,\n \"sha256\": \"06b890da54580e2ec68f7e729281b7c3b650ac0a95a4fcb0db3c6cdaa591a7ef\",\n \"hash_algorithm\": \"sha256_bytes_v1\"\n },\n {\n \"role\": \"event_codec_tag_builders_authority\",\n \"path\": \"crates/event_codec/src/tag_builders.rs\",\n \"byte_length\": 9232,\n \"sha256\": \"bd81ccf04fd72358331b48eddcde087a95e115c5bd90c05fd9332644979ad5e6\",\n \"hash_algorithm\": \"sha256_bytes_v1\"\n },\n {\n \"role\": \"event_codec_trade_facade\",\n \"path\": \"crates/event_codec/src/trade/mod.rs\",\n \"byte_length\": 21472,\n \"sha256\": \"10cee4b6cd6429ac9eb00327a521bcd0982fae4de98bda77e4728fda002965d3\",\n \"hash_algorithm\": \"sha256_bytes_v1\"\n },\n {\n \"role\": \"event_store_dependency_authority\",\n \"path\": \"crates/event_store/Cargo.toml\",\n \"byte_length\": 1550,\n \"sha256\": \"9901a09402592ee873c255edf2e0c0d770105401255679d86ad47c35cb159d72\",\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\": 19464,\n \"sha256\": \"47be522eb0541619683f8b30eb6f66da821b65eb310a60815c81c7b7f3349947\",\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\": 32314,\n \"sha256\": \"d7ffa47719783c9f08cb4e00fbe47123cf0310ead06f77d3ad1d81edfda96b2c\",\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\": 10452,\n \"sha256\": \"bd3a8f0efe6d4b2959ab8a5b8048cd940fd078dce842083be2386544722017ef\",\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\": 1594,\n \"sha256\": \"27b02ef508b4df45a801ef72e9f92b43819ea6372a3936bc2507c67a42acd07a\",\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\": 22229,\n \"sha256\": \"e651952d73ed0a29d2b137076f56f699beada205ac84ed8a96834e86e343fa78\",\n \"hash_algorithm\": \"sha256_bytes_v1\"\n },\n {\n \"role\": \"current_visibility_model\",\n \"path\": \"crates/event_store/src/model/current_visibility_v1.rs\",\n \"byte_length\": 5634,\n \"sha256\": \"7d5b2b35ceb52d7472d68444515fa4a6aab43f6838b557aefff74fcebf487657\",\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\": 17109,\n \"sha256\": \"2fd51989da7f07b3e80557fb1a4b89814126eb3ffd80023e42012f0242b0584d\",\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\": 184853,\n \"sha256\": \"b6887f9f319809d401ac519137cfa78467ca26594cae53720a58a37ccc72757e\",\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\": 18205,\n \"sha256\": \"c632beee70dc777b8dd2a4f88cadb55296fee7aa5742e6e2c9f6d49f26ae2c78\",\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\": 393835,\n \"sha256\": \"d47f5d8d95599783162533dcd26b0114160a098ddef3447fb2ee6648c3949e5f\",\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\": 40216,\n \"sha256\": \"31ed3390d279aee5261848386889cf256667759b9898be5607856a3f80fd7eb7\",\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\": 15737,\n \"sha256\": \"aa5d1bff7a5368cbac2b37906bb40f54bfc8aa6906bab34369569fdd105bf899\",\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\": 48927,\n \"sha256\": \"78a96d441e2fbfdfc6f9e2787ae773e8fd6aa5c53ca10d658350b843c0d1537e\",\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\": 6569,\n \"sha256\": \"f5bd8ddb45e1b2144895bd8da737fc92db051be1844ce7e8047a32b47376ce37\",\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\": 16558,\n \"sha256\": \"d88c1f7ff5cc0a19221ad893eb840d55c11535f13adf84ffb3076cbc18d4abf1\",\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\": 29950,\n \"sha256\": \"c72aaff06e4f35d0b4523c6625e83345879f9e15b9fe9563dccf589e5d01e277\",\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\": 10835,\n \"sha256\": \"c82179b9f57968191f3e71dd008cc701787c62715ada74090eeecaa3b213076d\",\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\": 34046,\n \"sha256\": \"776903c6431ff07f26c6ad6b713db5628efce1a72f34d86de6e47d4404fa3a6d\",\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\": 198991,\n \"sha256\": \"36fd3d8b5dda3b0855a06a47dae14cae7f4cc84aaca9902c31477c218859fccc\",\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\": 842232,\n \"sha256\": \"08c2cc956f0f055c8e25d99b5c05dd8f7f2b095c52efa125b7f05471302ef9f5\",\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\": 199270,\n \"sha256\": \"148698b4f9f46bcad6af5ce84240153d5742b8ee2ce8b938539ede0da9ef9cdb\",\n \"hash_algorithm\": \"sha256_bytes_v1\"\n },\n {\n \"role\": \"contract_command_authority\",\n \"path\": \"tools/xtask/src/contract.rs\",\n \"byte_length\": 503671,\n \"sha256\": \"82a33a2227fe63eed1d8ca5908f51f48c4ac4aa1d4527a7633980673fd9a6a30\",\n \"hash_algorithm\": \"sha256_bytes_v1\"\n },\n {\n \"role\": \"dto_root_generation_authority\",\n \"path\": \"tools/xtask/src/dto_roots.rs\",\n \"byte_length\": 35940,\n \"sha256\": \"a899a5695d7533c151d03477c4bd697a6e55c47a4980549724ac42046af694f5\",\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 = 38397; pub(crate) const SOURCE_MAINTENANCE_MANIFEST_SHA256: &str = - "f496d3c80c693187776ab031573ff2f6195c15259fd601b4f12ebe9ed56be330"; + "7f98748038dc5fd409f681a63fdd4a6617aca9e0990a7e2606d79a04a66388b2"; 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/nostr/Cargo.toml b/crates/nostr/Cargo.toml @@ -29,7 +29,7 @@ events = [ "dep:radroots_event_codec", "radroots_event/std", "radroots_event/serde", - "radroots_event_codec/serde_json", + "radroots_event_codec/json", "radroots_event_codec/std", ] http = ["dep:reqwest"] diff --git a/crates/replica_sync/Cargo.toml b/crates/replica_sync/Cargo.toml @@ -35,7 +35,7 @@ radroots_event = { workspace = true, default-features = false, features = [ ] } radroots_core = { workspace = true, default-features = false } radroots_event_codec = { workspace = true, default-features = false, features = [ - "serde_json", + "json", ] } radroots_sql_core = { workspace = true } radroots_replica_schema = { workspace = true } diff --git a/crates/trade/Cargo.toml b/crates/trade/Cargo.toml @@ -52,7 +52,7 @@ serde_json = [ "dep:hex", "dep:serde_json", "dep:sha2", - "radroots_event_codec/serde_json", + "radroots_event_codec/json", ] [dependencies] diff --git a/tools/xtask/Cargo.toml b/tools/xtask/Cargo.toml @@ -18,7 +18,7 @@ prettyplease = { workspace = true } proc-macro2 = { workspace = true } quote = { workspace = true } radroots_event_codec = { workspace = true, features = [ - "contract-manifest", + "manifests", ], default-features = false } radroots_protocol = { workspace = true, features = ["std"] } semver = { workspace = true } diff --git a/tools/xtask/src/contract/nip09_reconciliation.rs b/tools/xtask/src/contract/nip09_reconciliation.rs @@ -93,7 +93,7 @@ const EVENT_STORE_MIGRATION_IMPL_BASELINE_SHA256: &str = const EVENT_CRATE_ROOT_BASELINE_SHA256: &str = "7fa8fdbea6ce9a84486d238954cdb19d500dccfe727e3dd8434b6711db6330b1"; const EVENT_CODEC_CRATE_ROOT_BASELINE_SHA256: &str = - "93dd84b65105dd0aa8ad1f9763b7f5937bd77b30498e2b4a29724f342890dc9a"; + "4d18f9711b1f905b8c7124a2a4005d4b2d0fb5b4386c99667436a91542496023"; const BLOSSOM_CRATE_ROOT_BASELINE_SHA256: &str = "5066faee05fad71a94be757767f67bf99a10e5637acc41522cefe7a37eb0b4e4"; const ROUTE_FACADE_BASELINE_SHA256: &str = @@ -221,7 +221,7 @@ const GOVERNED_DEPENDENCY_TABLE_SHA256: [(&str, &str); 7] = [ ), ( EVENT_CODEC_CARGO_MANIFEST_RELATIVE, - "211f0eedc43bab3fa8f5356effbd9e64b929285b3c4c0b72701aec8e8f7d4b8d", + "59b52755d43caa7d9a4c2f549718996cef12a9ffd1a5fbe1a244f5cc65ced6fe", ), ( BLOSSOM_CARGO_MANIFEST_RELATIVE, @@ -229,7 +229,7 @@ const GOVERNED_DEPENDENCY_TABLE_SHA256: [(&str, &str); 7] = [ ), ( EVENT_STORE_CARGO_MANIFEST_RELATIVE, - "dc92a80725866be32cc773e0762ab26c72c07bc14aa6a6940460f8f175aa7237", + "abb8fafa1f817bf3f1cb60fdec90f04f0dc685fc8d0281eec9dd47ae5b167586", ), ( TRANSPORT_CARGO_MANIFEST_RELATIVE, @@ -611,8 +611,8 @@ const CARGO_PACKAGE_FEATURE_SPECS: &[CargoPackageFeatureSpec] = &[ cargo_package_name: "radroots_event_codec", manifest_path: EVENT_CODEC_CARGO_MANIFEST_RELATIVE, default_features_enabled: false, - selected_features: &["serde", "serde_json", "std"], - relevant_feature_definitions: &["serde", "serde_json", "std"], + selected_features: &["json", "serde", "std"], + relevant_feature_definitions: &["json", "serde", "std"], }, CargoPackageFeatureSpec { package: "radroots_event", @@ -5879,8 +5879,8 @@ fn expected_source_module_route_attributes( ) -> &'static [&'static str] { match (relative, module) { ("crates/event/src/lib.rs", "knowledge") => &["#[cfg(feature=\"knowledge\")]"], - ("crates/event_codec/src/lib.rs", "admission") => &["#[cfg(feature=\"serde_json\")]"], - ("crates/event_codec/src/profile/mod.rs", "inbound") => &["#[cfg(feature=\"serde_json\")]"], + ("crates/event_codec/src/lib.rs", "admission") => &["#[cfg(feature=\"json\")]"], + ("crates/event_codec/src/profile/mod.rs", "inbound") => &["#[cfg(feature=\"json\")]"], (EVENT_STORE_LIB_SOURCE_RELATIVE, _) => &["#[cfg(feature=\"sqlite\")]"], _ => &[], } @@ -14854,7 +14854,7 @@ fn validate_required_feature_enables( ("radroots_event_codec", "serde") => { &["dep:serde", "radroots_core/serde", "radroots_event/serde"] } - ("radroots_event_codec", "serde_json") => &["dep:serde_json", "serde"], + ("radroots_event_codec", "json") => &["dep:serde_json", "serde"], ("radroots_event_codec", "std") => &[ "radroots_blossom/std", "radroots_core/std", @@ -15003,7 +15003,7 @@ fn validate_event_store_dependency_profile( name: "radroots_event_codec".to_owned(), default_features: false, optional: false, - features: vec!["serde_json".to_owned(), "std".to_owned()], + features: vec!["json".to_owned(), "std".to_owned()], }, CargoDependencyFeatureDescriptor { name: "sqlx".to_owned(), @@ -21529,8 +21529,11 @@ async fn nip09_reconciliation_v1_result_vector() { describe_cargo_feature_profile(workspace.path()).expect("current feature profile"); let cargo_lock = read_regular_file(workspace.path(), CARGO_LOCK_RELATIVE).expect("current Cargo.lock"); - (manifest.runtime_dependency_policy, manifest.runtime_dependencies) = - runtime_dependencies_from_lock(&cargo_lock).expect("current runtime dependency profile"); + ( + manifest.runtime_dependency_policy, + manifest.runtime_dependencies, + ) = runtime_dependencies_from_lock(&cargo_lock) + .expect("current runtime dependency profile"); manifest.entry_points = expected_entry_points(); manifest.frozen_sources[0].path = GENERATED_DESCRIPTOR_RELATIVE.to_owned(); let error = validate_manifest_shape(workspace.path(), &manifest) diff --git a/tools/xtask/src/contract/source_maintenance.rs b/tools/xtask/src/contract/source_maintenance.rs @@ -434,6 +434,10 @@ const SOURCE_SPECS: &[SourceSpec] = &[ path: "crates/event/src/wire/v1.rs", }, SourceSpec { + role: "event_codec_public_surface", + path: "crates/event_codec/src/lib.rs", + }, + SourceSpec { role: "event_codec_verification_facade", path: "crates/event_codec/src/verification.rs", }, @@ -514,10 +518,26 @@ const SOURCE_SPECS: &[SourceSpec] = &[ path: "crates/event_codec/src/job/traits.rs", }, SourceSpec { + role: "event_codec_job_encode_authority", + path: "crates/event_codec/src/job/encode.rs", + }, + SourceSpec { role: "event_codec_knowledge_verification_authority", path: "crates/event_codec/src/knowledge/verification.rs", }, SourceSpec { + role: "event_codec_operational_listing_tags_authority", + path: "crates/event_codec/src/operational_listing/tags.rs", + }, + SourceSpec { + role: "event_codec_order_decode_authority", + path: "crates/event_codec/src/order/decode.rs", + }, + SourceSpec { + role: "event_codec_profile_facade", + path: "crates/event_codec/src/profile/mod.rs", + }, + SourceSpec { role: "event_codec_tag_builders_authority", path: "crates/event_codec/src/tag_builders.rs", }, @@ -712,10 +732,15 @@ const PREDECESSOR_SUPERSEDED_SOURCE_PATHS: &[&str] = &[ "crates/event_codec/src/food_availability/authored.rs", "crates/event_codec/src/food_availability/inbound.rs", "crates/event_codec/src/food_availability/inbound/registry_v7.rs", + "crates/event_codec/src/job/encode.rs", "crates/event_codec/src/job/traits.rs", "crates/event_codec/src/knowledge/verification.rs", + "crates/event_codec/src/lib.rs", + "crates/event_codec/src/operational_listing/tags.rs", + "crates/event_codec/src/order/decode.rs", "crates/event_codec/src/post/inbound.rs", "crates/event_codec/src/post/inbound/registry_v7.rs", + "crates/event_codec/src/profile/mod.rs", "crates/event_codec/src/profile/inbound.rs", "crates/event_codec/src/profile/inbound/registry_v7.rs", "crates/event_codec/src/reply/inbound.rs",