commit 2a92ea0492f0be4430cd8284c54a781ee2c170a4
parent 0072a355c0133722233de4215d4bdb539201433a
Author: triesap <tyson@radroots.org>
Date: Tue, 28 Jul 2026 11:46:03 +0000
blossom: document public api contract
- Make the package README the crate-level rustdoc authority.
- Add module guidance and a compiling verified-descriptor example.
- Record the pinned, reproducible public API baseline.
- Bind documentation governance and refresh generated attestations.
Diffstat:
14 files changed, 606 insertions(+), 35 deletions(-)
diff --git a/crates/blossom/README.md b/crates/blossom/README.md
@@ -1,23 +1,174 @@
# radroots_blossom
-`radroots_blossom` provides portable, runtime-independent primitives for
-Blossom blob hashes, root hash paths, blob URLs, BUD-02 descriptors,
-Radroots-approved byte verification, and pure BUD-11 authorization claims.
-
-The crate is `no_std + alloc`, performs no HTTP requests, and does not depend on
-Nostr event types. Structural Blossom validity is kept separate from the
-stricter Radroots reference policy: public HTTP descriptors remain parseable,
-but only HTTPS and loopback HTTP references can advance to an approved state.
-The byte-verified descriptor state proves local descriptor-to-byte agreement;
-it is not an upload receipt, and HTTP-capable runtimes must gate successful
-BUD-02 upload completion separately. BUD-11 support similarly stops at typed
-claim construction and endpoint validation; signing and canonical
-`Authorization: Nostr` encoding live behind the `radroots_nostr` `blossom`
-feature, and kind `24242` is never a relay-publication event.
+`radroots_blossom` provides portable Blossom protocol primitives for Radroots:
+canonical SHA-256 values and root hash paths, blob URLs, media types, BUD-02
+descriptors, byte-verification typestates, and pure BUD-11 authorization
+claims.
+
+The crate supports `no_std` environments with `alloc`. It performs no I/O,
+starts no tasks or threads, reads no clocks or process state, and owns no HTTP
+client, upload scheduler, cache, filesystem, credential, signer, or global
+authentication state.
+
+## Example
+
+Parse a BUD-02 descriptor, apply the Radroots reference policy, and prove that
+its hash, size, and media type match locally available bytes:
+
+```rust
+use radroots_blossom::{BlobDescriptor, BlobUrl, MediaType, Sha256};
+
+let bytes = b"hello";
+let hash = Sha256::digest(bytes);
+let media_type = MediaType::parse("text/plain")?;
+let url = BlobUrl::parse(&format!("https://media.example/{hash}.txt"))?;
+let descriptor = BlobDescriptor::new(
+ url,
+ hash,
+ bytes.len() as u64,
+ media_type.clone(),
+ 1_725_105_921,
+)?;
+
+let verified = descriptor
+ .approve_reference()?
+ .verify_bytes(bytes, &media_type)?;
+
+assert_eq!(verified.sha256(), hash);
+assert_eq!(verified.size(), 5);
+assert_eq!(verified.url().as_str(), format!("https://media.example/{hash}.txt"));
+# Ok::<(), radroots_blossom::Error>(())
+```
+
+The same program is available as the
+[`verified_descriptor`](examples/verified_descriptor.rs) example.
+
+## Public API
+
+The crate root intentionally exports `AuthorizationClaim`, `BlobDescriptor`,
+`BlobUrl`, `ByteVerifiedDescriptor`, `MediaType`, `Sha256`, and the aggregate
+[`Error`](https://docs.rs/radroots_blossom/latest/radroots_blossom/enum.Error.html).
+Supporting states and constructors remain in these modules:
+
+- `authorization` — bounded BUD-11 claim parsing, endpoint-scope validation,
+ and upload-claim wire parts;
+- `descriptor` — BUD-02 descriptors and the approved-reference,
+ byte-commitment, and byte-verified states;
+- `hash` — SHA-256 values, safe file extensions, and root hash paths;
+- `media_type` — parsed and deterministically canonicalized media types;
+- `url` — structural blob URLs and the stricter approved-reference state.
+
+The normative responsibility and dependency boundary are defined by the
+[`radroots_blossom` package charter](../../docs/specs/radroots_crates_release_v1.md).
+The reviewed pre-release surface is recorded in
+[`docs/api`](../../docs/api/README.md).
+
+## Features
+
+| Feature | Default | Effect |
+| --- | --- | --- |
+| `std` | yes | Implements the standard error integration and enables standard-library support in dependencies; protocol behavior remains portable. |
+| `serde` | yes | Implements checked string serialization for hashes, paths, URLs, and media types, plus checked BUD-02 descriptor serialization. |
+
+Disabling default features leaves the `no_std` + `alloc` protocol model.
+Features are additive; neither feature selects a runtime, transport, backend,
+clock, signer, credential source, or side effect.
+
+## Protocol and validation boundaries
Protocol behavior is pinned to Blossom commit
`b5bd2801d1763aa635fc8fea7a76597e0eb18990`:
-- BUD-01: <https://github.com/hzrd149/blossom/blob/b5bd2801d1763aa635fc8fea7a76597e0eb18990/buds/01.md>
-- BUD-02: <https://github.com/hzrd149/blossom/blob/b5bd2801d1763aa635fc8fea7a76597e0eb18990/buds/02.md>
-- BUD-11: <https://github.com/hzrd149/blossom/blob/b5bd2801d1763aa635fc8fea7a76597e0eb18990/buds/11.md>
+- [BUD-01](https://github.com/hzrd149/blossom/blob/b5bd2801d1763aa635fc8fea7a76597e0eb18990/buds/01.md)
+ defines root hash paths and basic blob retrieval;
+- [BUD-02](https://github.com/hzrd149/blossom/blob/b5bd2801d1763aa635fc8fea7a76597e0eb18990/buds/02.md)
+ defines blob descriptors;
+- [BUD-11](https://github.com/hzrd149/blossom/blob/b5bd2801d1763aa635fc8fea7a76597e0eb18990/buds/11.md)
+ defines Nostr authorization claims.
+
+`Sha256`, `HashPath`, `BlobUrl`, and `MediaType` reject ambiguous encodings and
+emit their documented canonical textual forms. A `BlobDescriptor` additionally
+requires a URL file extension and the same hash in its URL and `sha256` field.
+These checks establish structural protocol validity; they do not make a remote
+reference trustworthy.
+
+`BlobUrl::parse` accepts structurally valid public HTTP references so received
+Blossom data can be represented faithfully. `BlobUrl::approve` advances only
+HTTPS or loopback HTTP references to `ApprovedBlobUrl`. Callers must not fetch,
+display, cache, or otherwise act on an unapproved URL. URL approval is a narrow
+transport policy, not host reputation, content safety, malware scanning, or
+application media policy.
+
+`ByteVerifiedDescriptor` can only be produced after an approved descriptor's
+hash, byte length, and approved media type match supplied bytes or a locally
+computed `ByteCommitment`. It proves local descriptor-to-byte agreement. It is
+not a server receipt, upload acknowledgement, authenticity proof, or safe-media
+classification.
+
+## Authorization and security
+
+`AuthorizationClaim` parses the BUD-11 content and tags needed for endpoint
+authorization. Validation checks caller-supplied current time, action, server,
+hash, expiration, creation age, and lifetime policy. The crate never reads a
+clock and never verifies a Nostr event signature or signer identity. The
+composing Nostr layer must validate event kind `24242`, signature, author,
+request association, and canonical `Authorization: Nostr` encoding before an
+endpoint treats a validated claim as authenticated. Kind `24242` is ephemeral
+HTTP authorization material and must not be published to relays.
+
+`AuthoredUploadClaim` emits checked event wire parts; it does not sign them or
+send a request. Authorization content is bounded to 4,096 bytes, server domains
+use lowercase ASCII DNS or canonical IPv4 forms, timestamps are explicit
+caller inputs, and authored lifetimes are limited to 300 seconds.
+
+The crate forbids unsafe Rust. It does not provide confidentiality,
+authentication, authorization storage, credential redaction, content scanning,
+SSRF protection beyond its explicit URL approval rule, or resource limits for
+the bytes callers choose to hash. Hosts must bound untrusted payload sizes
+before hashing or retaining them and must enforce application policy at their
+own trust boundaries.
+
+## Serialization
+
+With `serde`, SHA-256 values are lowercase hexadecimal strings; file extensions,
+hash paths, blob URLs, and media types use their canonical string forms; and
+BUD-02 descriptors use the protocol fields `url`, `sha256`, `size`, `type`, and
+`uploaded`. Deserialization re-runs the same parsers and descriptor constructor,
+so malformed or cross-field-inconsistent values cannot enter through the
+supported serde surface.
+
+Authorization states and approved or byte-verified typestates intentionally do
+not implement serde. Reconstruct them by parsing untrusted wire parts and
+reapplying the current request, time, URL, and byte-verification policies.
+Serialization alone never preserves an approval or authentication decision.
+
+## Execution and commit semantics
+
+Operations are synchronous and deterministic. Hashing cost is linear in the
+caller-supplied byte slice; parsing and authored authorization construction may
+allocate in proportion to bounded input. There are no asynchronous cancellation
+points, deadlines, retries, callbacks, network requests, partial external
+effects, or durable commit points. A successful call returns its complete
+in-memory value; an error returns without durable mutation because the crate
+owns no external state.
+
+HTTP-capable callers must define their own cancellation and commit boundary.
+In particular, local byte verification does not authorize marking a BUD-02
+upload complete: durable upload success may be committed only after the
+composing transport has validated its successful server response.
+
+## Intended consumers
+
+`radroots_blossom` is intended directly for `radroots_event`,
+`radroots_event_codec`, `radroots_nostr`, and media clients that need portable
+Blossom values. Applications should normally begin with the curated `radroots`
+crate or the advanced `radroots_sdk` composition surface, where transport,
+signing, storage, and application media policy can be supplied explicitly.
+
+The package is pre-1.0. Its durable responsibility and package identity are
+fixed, while API-breaking changes follow the workspace's pre-1.0 versioning
+policy.
+
+## License
+
+Licensed under either Apache-2.0 or MIT, at your option.
diff --git a/crates/blossom/examples/verified_descriptor.rs b/crates/blossom/examples/verified_descriptor.rs
@@ -0,0 +1,27 @@
+use radroots_blossom::{BlobDescriptor, BlobUrl, MediaType, Sha256};
+
+fn main() -> Result<(), radroots_blossom::Error> {
+ let bytes = b"hello";
+ let hash = Sha256::digest(bytes);
+ let media_type = MediaType::parse("text/plain")?;
+ let url = BlobUrl::parse(&format!("https://media.example/{hash}.txt"))?;
+ let descriptor = BlobDescriptor::new(
+ url,
+ hash,
+ bytes.len() as u64,
+ media_type.clone(),
+ 1_725_105_921,
+ )?;
+
+ let verified = descriptor
+ .approve_reference()?
+ .verify_bytes(bytes, &media_type)?;
+
+ assert_eq!(verified.sha256(), hash);
+ assert_eq!(verified.size(), 5);
+ assert_eq!(
+ verified.url().as_str(),
+ format!("https://media.example/{hash}.txt")
+ );
+ Ok(())
+}
diff --git a/crates/blossom/src/authorization.rs b/crates/blossom/src/authorization.rs
@@ -1,3 +1,12 @@
+//! Pure BUD-11 authorization claim construction, parsing, and validation.
+//!
+//! This module validates bounded claim content and caller-supplied endpoint,
+//! server, hash, and time context. It does not read a clock, verify Nostr event
+//! signatures or authors, encode HTTP headers, send requests, or publish events.
+//! A [`ValidatedAuthorizationClaim`] therefore proves only the checks represented
+//! by its [`AuthorizationValidation`]; the composing Nostr and HTTP layers retain
+//! authentication and request-commit responsibility.
+
use alloc::{
string::{String, ToString},
vec,
diff --git a/crates/blossom/src/descriptor.rs b/crates/blossom/src/descriptor.rs
@@ -1,3 +1,11 @@
+//! BUD-02 descriptors and explicit reference- and byte-verification states.
+//!
+//! [`BlobDescriptor`] establishes structural descriptor invariants.
+//! [`ApprovedDescriptor`] additionally proves the URL passed the Radroots
+//! HTTPS-or-loopback policy, and [`ByteVerifiedDescriptor`] proves descriptor
+//! agreement with a local [`ByteCommitment`]. None of these states attests that
+//! network upload, retrieval, content scanning, or durable storage occurred.
+
use crate::{
Error, MediaType, Sha256,
url::{ApprovedBlobUrl, BlobUrl},
diff --git a/crates/blossom/src/hash.rs b/crates/blossom/src/hash.rs
@@ -1,3 +1,10 @@
+//! Canonical SHA-256 values, safe file extensions, and root hash paths.
+//!
+//! [`Sha256`] hashes or parses exact lowercase hexadecimal values. [`HashPath`]
+//! models the single root path segment used by Blossom and rejects traversal,
+//! escaping, queries, and fragments. These values identify bytes; they do not
+//! establish origin, authenticity, or content safety.
+
use alloc::string::{String, ToString};
use core::{fmt, str::FromStr};
use sha2::{Digest, Sha256 as Sha256Hasher};
diff --git a/crates/blossom/src/lib.rs b/crates/blossom/src/lib.rs
@@ -1,3 +1,4 @@
+#![doc = include_str!("../README.md")]
#![cfg_attr(not(feature = "std"), no_std)]
#![cfg_attr(coverage_nightly, feature(coverage_attribute))]
#![forbid(unsafe_code)]
diff --git a/crates/blossom/src/media_type.rs b/crates/blossom/src/media_type.rs
@@ -1,4 +1,9 @@
//! Canonical Blossom media-type values.
+//!
+//! [`MediaType`] rejects wildcards and duplicate parameters, then emits a
+//! deterministic parameter order. Parsing describes declared media type only;
+//! callers remain responsible for sniffing or applying content policy where
+//! untrusted bytes require it.
#[cfg(feature = "serde")]
use alloc::string::String;
diff --git a/crates/blossom/src/url.rs b/crates/blossom/src/url.rs
@@ -1,3 +1,11 @@
+//! Structural Blossom blob URLs and the Radroots-approved reference state.
+//!
+//! [`BlobUrl`] preserves received HTTP or HTTPS references after strict
+//! structural parsing. [`BlobUrl::approve`] produces [`ApprovedBlobUrl`] only
+//! for HTTPS and loopback HTTP references. Approval permits a caller to consider
+//! the reference for transport; it does not perform a request or establish host
+//! reputation, byte integrity, authenticity, or application media safety.
+
#[cfg(feature = "serde")]
use alloc::string::String;
use alloc::string::ToString;
diff --git a/crates/event_store/contracts/source_maintenance_v1.manifest.json b/crates/event_store/contracts/source_maintenance_v1.manifest.json
@@ -208,22 +208,22 @@
{
"role": "blossom_public_surface",
"path": "crates/blossom/src/lib.rs",
- "byte_length": 471,
- "sha256": "821c0fb1c8a8832b89ec318192d4a054581ca7f9c208e8e02d7aa198184fe0e1",
+ "byte_length": 510,
+ "sha256": "a4dfcbd193457c50c1b0fbfc91bb547981ecd3a6e23cfc6f1030edfb511dc58c",
"hash_algorithm": "sha256_bytes_v1"
},
{
"role": "blossom_authorization_authority",
"path": "crates/blossom/src/authorization.rs",
- "byte_length": 38819,
- "sha256": "68e1b118232953ce7cc63d078aa13804dd17da6ed7f223dd6b106743fb5112a4",
+ "byte_length": 39360,
+ "sha256": "461947b30516315a342b3b5697599f701d27050888f29f67f5d7a7ad4afa4c28",
"hash_algorithm": "sha256_bytes_v1"
},
{
"role": "blossom_descriptor_authority",
"path": "crates/blossom/src/descriptor.rs",
- "byte_length": 13238,
- "sha256": "dc2ff3d9cb0a81da5ce99b14370a42b2dac7a8842a584f55156dfa7c0fa93c74",
+ "byte_length": 13702,
+ "sha256": "b2a4ffa760256e1316f70e012d200e2b5f4afd8ede771b85a5147f96b247f599",
"hash_algorithm": "sha256_bytes_v1"
},
{
@@ -236,22 +236,22 @@
{
"role": "blossom_hash_authority",
"path": "crates/blossom/src/hash.rs",
- "byte_length": 10634,
- "sha256": "964f3217ad2f81aece1f20c40ebcd125542b77ba6a1fa01f29118cc51129f415",
+ "byte_length": 11006,
+ "sha256": "45eca0d81ac0f46c305a32f81aafcdd90b14679d0614f72862289a6e5d4cb08f",
"hash_algorithm": "sha256_bytes_v1"
},
{
"role": "blossom_media_type_authority",
"path": "crates/blossom/src/media_type.rs",
- "byte_length": 2101,
- "sha256": "e0d953fc9b38d49560e02a005277f9e91a25bd890d9f1654529df9d8ab7eb029",
+ "byte_length": 2368,
+ "sha256": "69db5c0f9fcdd7dbe1f22daa499f65603ae4ce198083dab2c73a36813fa18a46",
"hash_algorithm": "sha256_bytes_v1"
},
{
"role": "blossom_url_authority",
"path": "crates/blossom/src/url.rs",
- "byte_length": 14109,
- "sha256": "8532c827a55d6392139143de6979e2913538a58f815d1fdb0e243b02369cb465",
+ "byte_length": 14580,
+ "sha256": "342c995fcf620e5fb32461a7d8276f5668ba2662890bd32d12780cc9121c6451",
"hash_algorithm": "sha256_bytes_v1"
},
{
@@ -684,8 +684,8 @@
{
"role": "transitive_predecessor_membership_governance",
"path": "tools/xtask/src/contract/nip09_reconciliation.rs",
- "byte_length": 835884,
- "sha256": "c266610ba4a55e9fc3b5e80c52c7b244aa9fac7336c7a7cd37489a8bbdb97f1d",
+ "byte_length": 836131,
+ "sha256": "af71c0172eb214f10a615fc867e309cb6d07780a0dc583858a42c617e10cea83",
"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 @@
-bf1235f18e9db5c5242ada8b7b3e1413e4d5d3d62d496d2a057744354689b77a
+22cc195ee967cec226d47948f005fa4689da276a00c3bbce187d76b1d7dbf6b4
diff --git a/crates/event_store/src/generated/source_maintenance_manifest.rs b/crates/event_store/src/generated/source_maintenance_manifest.rs
@@ -1,8 +1,8 @@
// @generated by `cargo xtask contract source-maintenance-manifest --write`; do not edit.
-pub(crate) const SOURCE_MAINTENANCE_MANIFEST_JSON: &str = "{\n \"schema_version\": 1,\n \"contract_id\": \"radroots_event_store.source_maintenance_v1\",\n \"hook_id\": \"source_maintenance_v1\",\n \"manifest_schema\": {\n \"path\": \"crates/event_store/contracts/source_maintenance_v1.manifest.schema.json\",\n \"byte_length\": 12315,\n \"sha256\": \"96ea98a5abf3348b61565954cd34f2c622411d8dd34205ef04134bbe0e3d3f2b\",\n \"hash_algorithm\": \"sha256_bytes_v1\"\n },\n \"predecessor\": {\n \"hook_id\": \"food_availability_projection_v1\",\n \"manifest\": {\n \"path\": \"crates/event_store/contracts/food_availability_projection_v1.manifest.json\",\n \"byte_length\": 17455,\n \"sha256\": \"02dfe1b450fbdac16e718888215b4dd5c85d8975440fa21e8f439fb24c2b2990\",\n \"hash_algorithm\": \"sha256_bytes_v1\"\n }\n },\n \"migration\": {\n \"version\": 4,\n \"name\": \"source_maintenance\",\n \"up\": {\n \"path\": \"crates/event_store/migrations/0004_source_maintenance.up.sql\",\n \"byte_length\": 19841,\n \"sha256\": \"ab2724188f8d08c897eebea2533a635e7c74282a25e84e4c0c37e78b08837a43\",\n \"hash_algorithm\": \"sha256_bytes_v1\"\n },\n \"down\": {\n \"path\": \"crates/event_store/migrations/0004_source_maintenance.down.sql\",\n \"byte_length\": 5172,\n \"sha256\": \"fe44fd53c51545c08ea479b385e6781079dab70fc63da2a3c205d727a00ce860\",\n \"hash_algorithm\": \"sha256_bytes_v1\"\n },\n \"schema_sha256\": \"074f85b663444ac150239ecd8441ea4a96ad83a798a55e22d2e5e2f7ee943a8c\",\n \"catalog\": {\n \"objects\": [\n \"radroots_event_store_source_capacity_delete_guard\",\n \"radroots_event_store_source_capacity_insert_guard\",\n \"radroots_event_store_source_capacity_marker_close_guard\",\n \"radroots_event_store_source_capacity_update_guard\",\n \"radroots_event_store_source_capacity_v1\",\n \"radroots_event_store_source_generation_capacity_advance\",\n \"radroots_event_store_source_generation_capacity_guard\"\n ],\n \"replaced_objects\": [\n \"radroots_event_store_food_availability_image_delete_guard\",\n \"radroots_event_store_food_availability_projection_delete_guard\",\n \"radroots_event_store_source_rebuild_marker_insert_guard\"\n ],\n \"tables\": [\n \"radroots_event_store_source_capacity_v1\"\n ],\n \"fts5_tables\": []\n }\n },\n \"source_maintenance\": {\n \"version\": 1,\n \"event_contract_registry_version\": 7,\n \"capacity_authority_id\": \"radroots_event_store_source_capacity_v1\",\n \"accounting\": {\n \"algorithm\": \"sqlite_cast_blob_octet_sum_v1\",\n \"raw_event_columns\": [\n \"event_id\",\n \"pubkey\",\n \"tags_json\",\n \"content\",\n \"sig\",\n \"raw_json\"\n ],\n \"raw_tag_columns\": [\n \"event_id\",\n \"tag_name\",\n \"tag_value\",\n \"tag_json\"\n ],\n \"nullable_raw_tag_columns\": [\n \"tag_value\"\n ]\n },\n \"limits\": {\n \"raw_events\": 25000,\n \"raw_tags\": 250000,\n \"raw_event_text_bytes\": 67108864,\n \"raw_tag_text_bytes\": 33554432,\n \"retained_source_generations\": 8\n },\n \"reopen_validation\": {\n \"mode\": \"bounded_full_raw_recount_v1\",\n \"raw_event_rejection_scan_bound\": 25001,\n \"raw_tag_rejection_scan_bound\": 250001,\n \"generation_history_validation\": \"bounded_count_plus_active_ordinal_v1\",\n \"retained_generation_rejection_scan_bound\": 9\n },\n \"rebuild_seal\": {\n \"nip09_hook_id\": \"nip09_reconciliation_v1\",\n \"nip09_manifest_sha256\": \"74af832420ffbaa9805e89df3c0b34f126a443e1598f757e3372f407f9003b77\",\n \"food_hook_id\": \"food_availability_projection_v1\",\n \"food_manifest_sha256\": \"02dfe1b450fbdac16e718888215b4dd5c85d8975440fa21e8f439fb24c2b2990\",\n \"food_scope_fingerprint_sha256\": \"8b63c5ddc48a2cc7db69295238b96d5f814dba50427c80b4d0079f061e6d3de0\",\n \"active_generation_authority\": \"radroots_event_store_source_state\",\n \"marker_close_authority\": \"radroots_event_store_source_capacity_marker_close_guard\"\n }\n },\n \"entry_points\": [\n {\n \"role\": \"migration_registry\",\n \"rust_path\": \"radroots_event_store::migrations::EVENT_STORE_MIGRATIONS[3]\"\n },\n {\n \"role\": \"migration_apply_hook\",\n \"rust_path\": \"radroots_event_store::schema::apply_migration_hook\"\n },\n {\n \"role\": \"migration_validation_hook\",\n \"rust_path\": \"radroots_event_store::schema::validate_migration_hook_state\"\n },\n {\n \"role\": \"capacity_query\",\n \"rust_path\": \"radroots_event_store::RadrootsEventStore::source_capacity_v1\"\n },\n {\n \"role\": \"raw_append_preflight\",\n \"rust_path\": \"radroots_event_store::source_maintenance_v1::preflight_unique_raw_source_append_v1\"\n },\n {\n \"role\": \"raw_append_advance\",\n \"rust_path\": \"radroots_event_store::source_maintenance_v1::advance_source_capacity_after_insert_v1\"\n },\n {\n \"role\": \"generation_append_preflight\",\n \"rust_path\": \"radroots_event_store::source_maintenance_v1::preflight_source_generation_append_v1\"\n },\n {\n \"role\": \"generation_rebuild_bind\",\n \"rust_path\": \"radroots_event_store::source_maintenance_v1::bind_source_capacity_to_generation_v1\"\n },\n {\n \"role\": \"sqlite_encoding_preflight\",\n \"rust_path\": \"radroots_event_store::store::validate_main_database_encoding\"\n },\n {\n \"role\": \"source_generation_history_rollback_guard\",\n \"rust_path\": \"radroots_event_store::schema::validate_rollback_preserves_source_generation_history\"\n },\n {\n \"role\": \"result_vector_executor\",\n \"rust_path\": \"source_maintenance_v1_result_vector\"\n }\n ],\n \"source_files\": [\n {\n \"role\": \"workspace_dependency_authority\",\n \"path\": \"Cargo.toml\",\n \"byte_length\": 12385,\n \"sha256\": \"c53c5c5a464267d7df850e03fdfa99dcde0b469972cf921f9b81c18b52a9c4b2\",\n \"hash_algorithm\": \"sha256_bytes_v1\"\n },\n {\n \"role\": \"core_currency_value_authority\",\n \"path\": \"crates/core/src/currency.rs\",\n \"byte_length\": 4142,\n \"sha256\": \"42e6da2d8d2fdd6955dc2d83e98dd00266e02bc910b69923b117662c05089d14\",\n \"hash_algorithm\": \"sha256_bytes_v1\"\n },\n {\n \"role\": \"core_decimal_value_authority\",\n \"path\": \"crates/core/src/decimal.rs\",\n \"byte_length\": 7839,\n \"sha256\": \"4b1d681a92d7a9e074bee7e1f20eb1499bb05bfc6528a6c9ba69fa7d00416550\",\n \"hash_algorithm\": \"sha256_bytes_v1\"\n },\n {\n \"role\": \"core_money_value_authority\",\n \"path\": \"crates/core/src/money.rs\",\n \"byte_length\": 8025,\n \"sha256\": \"3f30bc21e21951a62fdc5d4033736ed42a883df590e8403940775bd2edfeebc5\",\n \"hash_algorithm\": \"sha256_bytes_v1\"\n },\n {\n \"role\": \"core_percent_value_authority\",\n \"path\": \"crates/core/src/percent.rs\",\n \"byte_length\": 2652,\n \"sha256\": \"42ceab109881329f3539d06a0ee0381ab4359985fe185a18d58a9c9558c5eb7f\",\n \"hash_algorithm\": \"sha256_bytes_v1\"\n },\n {\n \"role\": \"core_quantity_value_authority\",\n \"path\": \"crates/core/src/quantity.rs\",\n \"byte_length\": 6785,\n \"sha256\": \"d14e619da3829cdaf3ca7385fb892d330c286c1e21455c135c37518cbb588b5f\",\n \"hash_algorithm\": \"sha256_bytes_v1\"\n },\n {\n \"role\": \"core_quantity_price_value_authority\",\n \"path\": \"crates/core/src/quantity_price.rs\",\n \"byte_length\": 7061,\n \"sha256\": \"d60f70377099470ed283f45868a5119d7bb46143cb250b5082a4c038ba7f6cdc\",\n \"hash_algorithm\": \"sha256_bytes_v1\"\n },\n {\n \"role\": \"core_unit_value_authority\",\n \"path\": \"crates/core/src/unit.rs\",\n \"byte_length\": 10023,\n \"sha256\": \"550e9582b6a5290aac3f637b83853b21fefcbab92c432d067c83448f4b2fe3e9\",\n \"hash_algorithm\": \"sha256_bytes_v1\"\n },\n {\n \"role\": \"blossom_public_surface\",\n \"path\": \"crates/blossom/src/lib.rs\",\n \"byte_length\": 471,\n \"sha256\": \"821c0fb1c8a8832b89ec318192d4a054581ca7f9c208e8e02d7aa198184fe0e1\",\n \"hash_algorithm\": \"sha256_bytes_v1\"\n },\n {\n \"role\": \"blossom_authorization_authority\",\n \"path\": \"crates/blossom/src/authorization.rs\",\n \"byte_length\": 38819,\n \"sha256\": \"68e1b118232953ce7cc63d078aa13804dd17da6ed7f223dd6b106743fb5112a4\",\n \"hash_algorithm\": \"sha256_bytes_v1\"\n },\n {\n \"role\": \"blossom_descriptor_authority\",\n \"path\": \"crates/blossom/src/descriptor.rs\",\n \"byte_length\": 13238,\n \"sha256\": \"dc2ff3d9cb0a81da5ce99b14370a42b2dac7a8842a584f55156dfa7c0fa93c74\",\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\": 10634,\n \"sha256\": \"964f3217ad2f81aece1f20c40ebcd125542b77ba6a1fa01f29118cc51129f415\",\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\": 2101,\n \"sha256\": \"e0d953fc9b38d49560e02a005277f9e91a25bd890d9f1654529df9d8ab7eb029\",\n \"hash_algorithm\": \"sha256_bytes_v1\"\n },\n {\n \"role\": \"blossom_url_authority\",\n \"path\": \"crates/blossom/src/url.rs\",\n \"byte_length\": 14109,\n \"sha256\": \"8532c827a55d6392139143de6979e2913538a58f815d1fdb0e243b02369cb465\",\n \"hash_algorithm\": \"sha256_bytes_v1\"\n },\n {\n \"role\": \"event_contract_facade\",\n \"path\": \"crates/event/src/contract.rs\",\n \"byte_length\": 86,\n \"sha256\": \"9994cbca9dcc7450ad133b6b927e7c06bee08ef813652452cc1e56a284c1be10\",\n \"hash_algorithm\": \"sha256_bytes_v1\"\n },\n {\n \"role\": \"event_contract_registry_v7_authority\",\n \"path\": \"crates/event/src/contract/registry_v7.rs\",\n \"byte_length\": 155738,\n \"sha256\": \"e9133e65b37810478c3e34ec4ac2005d81209a714ec2de5bd0232b9f02740dde\",\n \"hash_algorithm\": \"sha256_bytes_v1\"\n },\n {\n \"role\": \"event_envelope_authority\",\n \"path\": \"crates/event/src/envelope.rs\",\n \"byte_length\": 31165,\n \"sha256\": \"97a3bb38d630666bba497b98e856ee457d6899de230dabf6cab786a5bd55a3ce\",\n \"hash_algorithm\": \"sha256_bytes_v1\"\n },\n {\n \"role\": \"event_head_facade\",\n \"path\": \"crates/event/src/event_head.rs\",\n \"byte_length\": 68,\n \"sha256\": \"cb52f6006f7ecd862707d6b048f9fc407e0cd5ebcd3091b3c54e195ffa5cba64\",\n \"hash_algorithm\": \"sha256_bytes_v1\"\n },\n {\n \"role\": \"event_head_v1_authority\",\n \"path\": \"crates/event/src/event_head/v1.rs\",\n \"byte_length\": 7529,\n \"sha256\": \"0a4b50c4b7a93e9d88cc995cf69d9e87b341cba66d7feb51c357dfa4e5b2de37\",\n \"hash_algorithm\": \"sha256_bytes_v1\"\n },\n {\n \"role\": \"event_ids_authority\",\n \"path\": \"crates/event/src/ids.rs\",\n \"byte_length\": 46282,\n \"sha256\": \"f3c34e7dcf09fc225cb9c12f02ae932d5155c859f73f8b8573db8e5ebf298678\",\n \"hash_algorithm\": \"sha256_bytes_v1\"\n },\n {\n \"role\": \"event_trade_authority\",\n \"path\": \"crates/event/src/trade.rs\",\n \"byte_length\": 68376,\n \"sha256\": \"1012b44295cb26844206304bc24b355a49c18a023844f6b3905337c63b1417a7\",\n \"hash_algorithm\": \"sha256_bytes_v1\"\n },\n {\n \"role\": \"event_kinds_authority\",\n \"path\": \"crates/event/src/kinds.rs\",\n \"byte_length\": 34961,\n \"sha256\": \"8b3ce6193cab1f7e1587d0c1b2880a81b0aa43c77d89671b602772db37edcebf\",\n \"hash_algorithm\": \"sha256_bytes_v1\"\n },\n {\n \"role\": \"event_tags_authority\",\n \"path\": \"crates/event/src/tags.rs\",\n \"byte_length\": 4530,\n \"sha256\": \"cb8f12a639fc72d9238e32495d9e67e928e6627fb8c94ec0a58c5d95e7373cd6\",\n \"hash_algorithm\": \"sha256_bytes_v1\"\n },\n {\n \"role\": \"event_draft_authority\",\n \"path\": \"crates/event/src/draft.rs\",\n \"byte_length\": 58674,\n \"sha256\": \"fa4e802f1143eba72ba7fc334104ea0d6613c886725ff9f3e61dab2443c243b6\",\n \"hash_algorithm\": \"sha256_bytes_v1\"\n },\n {\n \"role\": \"event_calendar_authority\",\n \"path\": \"crates/event/src/calendar.rs\",\n \"byte_length\": 103814,\n \"sha256\": \"f8e0fcb4802d0dcd2a1a13b17216a0c5278950a60c09a261ab349e9ce1989d72\",\n \"hash_algorithm\": \"sha256_bytes_v1\"\n },\n {\n \"role\": \"event_classified_listing_authority\",\n \"path\": \"crates/event/src/classified_listing.rs\",\n \"byte_length\": 8226,\n \"sha256\": \"745aa08953a6243ea1afad22aa63e44f6746f2f243ab0d6b617d6ab64fa58749\",\n \"hash_algorithm\": \"sha256_bytes_v1\"\n },\n {\n \"role\": \"event_profile_authority\",\n \"path\": \"crates/event/src/profile.rs\",\n \"byte_length\": 18848,\n \"sha256\": \"7c7ac7f4926938f5cb5530be5450e5e23f18f216bdb222150fbdd451cec20d5c\",\n \"hash_algorithm\": \"sha256_bytes_v1\"\n },\n {\n \"role\": \"event_post_authority\",\n \"path\": \"crates/event/src/post.rs\",\n \"byte_length\": 22738,\n \"sha256\": \"7ed4a4c39bed40b134369d16e1fc35ab2c7d27ee300dd36d367025def2283b39\",\n \"hash_algorithm\": \"sha256_bytes_v1\"\n },\n {\n \"role\": \"event_comment_authority\",\n \"path\": \"crates/event/src/comment.rs\",\n \"byte_length\": 36375,\n \"sha256\": \"f4d1a57780eff0d315bc4e2fbad316dfb7c7ced1bcc9e8e85afe0b5ecdaf3aa8\",\n \"hash_algorithm\": \"sha256_bytes_v1\"\n },\n {\n \"role\": \"event_food_availability_authority\",\n \"path\": \"crates/event/src/food_availability.rs\",\n \"byte_length\": 45429,\n \"sha256\": \"b4357dfb6954631673b6cd58794015da29303cb54ce8405a57ad543870036c9e\",\n \"hash_algorithm\": \"sha256_bytes_v1\"\n },\n {\n \"role\": \"event_deletion_authority\",\n \"path\": \"crates/event/src/deletion.rs\",\n \"byte_length\": 31155,\n \"sha256\": \"c8b7ab79998ae62e03497f5511dd3950a41d73155edda3d8d34c65fc797e9d09\",\n \"hash_algorithm\": \"sha256_bytes_v1\"\n },\n {\n \"role\": \"event_relay_hint_authority\",\n \"path\": \"crates/event/src/relay_hint.rs\",\n \"byte_length\": 14317,\n \"sha256\": \"1a14aea5d2f2620970dc1de9e3d311d9042cab4d5805a56461548168112a0801\",\n \"hash_algorithm\": \"sha256_bytes_v1\"\n },\n {\n \"role\": \"event_media_authority\",\n \"path\": \"crates/event/src/media.rs\",\n \"byte_length\": 3521,\n \"sha256\": \"8f670e634452872a525efdad0cb9480288885c62f22a9b9915a67a7e7965651c\",\n \"hash_algorithm\": \"sha256_bytes_v1\"\n },\n {\n \"role\": \"event_social_authority\",\n \"path\": \"crates/event/src/social.rs\",\n \"byte_length\": 5483,\n \"sha256\": \"1b89c6d0954822e7f1e778479ed43694e88929bcd5310ee066f8f4ba6505045a\",\n \"hash_algorithm\": \"sha256_bytes_v1\"\n },\n {\n \"role\": \"event_wire_facade\",\n \"path\": \"crates/event/src/wire.rs\",\n \"byte_length\": 68,\n \"sha256\": \"cb52f6006f7ecd862707d6b048f9fc407e0cd5ebcd3091b3c54e195ffa5cba64\",\n \"hash_algorithm\": \"sha256_bytes_v1\"\n },\n {\n \"role\": \"event_wire_v1_authority\",\n \"path\": \"crates/event/src/wire/v1.rs\",\n \"byte_length\": 22133,\n \"sha256\": \"cc28c8cbd962b32ed2efe43e84c1e0d1ea3bd89636efff2d5553714072fce1a4\",\n \"hash_algorithm\": \"sha256_bytes_v1\"\n },\n {\n \"role\": \"event_codec_verification_facade\",\n \"path\": \"crates/event_codec/src/verification.rs\",\n \"byte_length\": 253,\n \"sha256\": \"b49a32df605035c87f295c0a151140d43d2e588c5e11b05183e5fc92993dae0e\",\n \"hash_algorithm\": \"sha256_bytes_v1\"\n },\n {\n \"role\": \"event_codec_verification_v1_authority\",\n \"path\": \"crates/event_codec/src/verification/v1.rs\",\n \"byte_length\": 8751,\n \"sha256\": \"fc4c5d45e475151c56330ba9c4db70de603e4ec48adabd6365f80d5f6a3733f4\",\n \"hash_algorithm\": \"sha256_bytes_v1\"\n },\n {\n \"role\": \"event_codec_registry_v7_admission_authority\",\n \"path\": \"crates/event_codec/src/admission/registry_v7.rs\",\n \"byte_length\": 5350,\n \"sha256\": \"755e63dd7ad1115c219e5a3ea540bef67d2770fc9f2a5aa6ba97c925c99bdced\",\n \"hash_algorithm\": \"sha256_bytes_v1\"\n },\n {\n \"role\": \"event_codec_profile_inbound_facade\",\n \"path\": \"crates/event_codec/src/profile/inbound.rs\",\n \"byte_length\": 86,\n \"sha256\": \"9994cbca9dcc7450ad133b6b927e7c06bee08ef813652452cc1e56a284c1be10\",\n \"hash_algorithm\": \"sha256_bytes_v1\"\n },\n {\n \"role\": \"event_codec_profile_registry_v7_authority\",\n \"path\": \"crates/event_codec/src/profile/inbound/registry_v7.rs\",\n \"byte_length\": 10394,\n \"sha256\": \"c37c225ea8153beb098a39c4a56203aa03382af12646f40cd3f8628663700702\",\n \"hash_algorithm\": \"sha256_bytes_v1\"\n },\n {\n \"role\": \"event_codec_post_inbound_facade\",\n \"path\": \"crates/event_codec/src/post/inbound.rs\",\n \"byte_length\": 86,\n \"sha256\": \"9994cbca9dcc7450ad133b6b927e7c06bee08ef813652452cc1e56a284c1be10\",\n \"hash_algorithm\": \"sha256_bytes_v1\"\n },\n {\n \"role\": \"event_codec_post_registry_v7_authority\",\n \"path\": \"crates/event_codec/src/post/inbound/registry_v7.rs\",\n \"byte_length\": 16016,\n \"sha256\": \"bc0bb839c28f3588f05544c846c987528ea3934c75305fef70af8e027a97cc58\",\n \"hash_algorithm\": \"sha256_bytes_v1\"\n },\n {\n \"role\": \"event_codec_reply_inbound_facade\",\n \"path\": \"crates/event_codec/src/reply/inbound.rs\",\n \"byte_length\": 86,\n \"sha256\": \"9994cbca9dcc7450ad133b6b927e7c06bee08ef813652452cc1e56a284c1be10\",\n \"hash_algorithm\": \"sha256_bytes_v1\"\n },\n {\n \"role\": \"event_codec_reply_registry_v7_authority\",\n \"path\": \"crates/event_codec/src/reply/inbound/registry_v7.rs\",\n \"byte_length\": 26812,\n \"sha256\": \"a72e9721ed13addca2a63942ac9e43c1daa8f1d1457eef08ec6a3ee5eb8872c5\",\n \"hash_algorithm\": \"sha256_bytes_v1\"\n },\n {\n \"role\": \"event_codec_comment_inbound_facade\",\n \"path\": \"crates/event_codec/src/comment/inbound.rs\",\n \"byte_length\": 86,\n \"sha256\": \"9994cbca9dcc7450ad133b6b927e7c06bee08ef813652452cc1e56a284c1be10\",\n \"hash_algorithm\": \"sha256_bytes_v1\"\n },\n {\n \"role\": \"event_codec_comment_registry_v7_authority\",\n \"path\": \"crates/event_codec/src/comment/inbound/registry_v7.rs\",\n \"byte_length\": 53783,\n \"sha256\": \"30d1b0155963b25d64685ddd042f423ef7707b111dc56ead15bd468e0433a432\",\n \"hash_algorithm\": \"sha256_bytes_v1\"\n },\n {\n \"role\": \"event_codec_deletion_facade\",\n \"path\": \"crates/event_codec/src/deletion/mod.rs\",\n \"byte_length\": 115,\n \"sha256\": \"17d56f82ddb0a86bc97abbcf3e037fe460ea31fff2548f527be4bf004dac3a95\",\n \"hash_algorithm\": \"sha256_bytes_v1\"\n },\n {\n \"role\": \"event_codec_deletion_reconciliation_v1_authority\",\n \"path\": \"crates/event_codec/src/deletion/reconciliation_v1.rs\",\n \"byte_length\": 38469,\n \"sha256\": \"3e06d1fa923ca5faabb1e95338c35650b0e20b078ff5c972e35ab845d8b7476c\",\n \"hash_algorithm\": \"sha256_bytes_v1\"\n },\n {\n \"role\": \"event_codec_food_inbound_facade\",\n \"path\": \"crates/event_codec/src/food_availability/inbound.rs\",\n \"byte_length\": 86,\n \"sha256\": \"9994cbca9dcc7450ad133b6b927e7c06bee08ef813652452cc1e56a284c1be10\",\n \"hash_algorithm\": \"sha256_bytes_v1\"\n },\n {\n \"role\": \"event_codec_food_registry_v7_authority\",\n \"path\": \"crates/event_codec/src/food_availability/inbound/registry_v7.rs\",\n \"byte_length\": 26764,\n \"sha256\": \"a5786cff942b7b0038f741afb5b9a19230ac58cb57a5ba747b32e1b95d414e15\",\n \"hash_algorithm\": \"sha256_bytes_v1\"\n },\n {\n \"role\": \"event_codec_job_traits_authority\",\n \"path\": \"crates/event_codec/src/job/traits.rs\",\n \"byte_length\": 5029,\n \"sha256\": \"353df3703de4d99fc318474952dc6c95cbce9a19756f3e235ed2d715f36c4364\",\n \"hash_algorithm\": \"sha256_bytes_v1\"\n },\n {\n \"role\": \"event_store_dependency_authority\",\n \"path\": \"crates/event_store/Cargo.toml\",\n \"byte_length\": 1569,\n \"sha256\": \"30f43004bcf0ffa9b9b6f338cba8c56be0265bc1cee708e93f7b7dc54ed60f9c\",\n \"hash_algorithm\": \"sha256_bytes_v1\"\n },\n {\n \"role\": \"event_store_error_and_limits\",\n \"path\": \"crates/event_store/src/error.rs\",\n \"byte_length\": 19517,\n \"sha256\": \"4bf24ee1aa6117597ab467b1379a05549b79024213dc7622a2d276bc26fffab4\",\n \"hash_algorithm\": \"sha256_bytes_v1\"\n },\n {\n \"role\": \"generated_descriptor_registration\",\n \"path\": \"crates/event_store/src/generated.rs\",\n \"byte_length\": 144,\n \"sha256\": \"6b0a8d6f249bd4fc3f878d37cb5e418680f0f1be2d9eec2518dedf03efc47121\",\n \"hash_algorithm\": \"sha256_bytes_v1\"\n },\n {\n \"role\": \"public_surface\",\n \"path\": \"crates/event_store/src/lib.rs\",\n \"byte_length\": 3844,\n \"sha256\": \"3cd9653bcb752fb3c4442d4904b98a0a6208011a9a238125b7b7073d7f4e312b\",\n \"hash_algorithm\": \"sha256_bytes_v1\"\n },\n {\n \"role\": \"migration_registry\",\n \"path\": \"crates/event_store/src/migrations.rs\",\n \"byte_length\": 73585,\n \"sha256\": \"a47477d04759ec6e71d14d3d05459864eae78fce0e3c2481a1b03147f04637f7\",\n \"hash_algorithm\": \"sha256_bytes_v1\"\n },\n {\n \"role\": \"predecessor_model_public_surface\",\n \"path\": \"crates/event_store/src/model.rs\",\n \"byte_length\": 33596,\n \"sha256\": \"98b1742ffb517f66f8e9edefa61d1c3cf3e22be5985202c6c340310a98c72c8e\",\n \"hash_algorithm\": \"sha256_bytes_v1\"\n },\n {\n \"role\": \"event_store_reconciliation_v1_model\",\n \"path\": \"crates/event_store/src/model/reconciliation_v1.rs\",\n \"byte_length\": 11138,\n \"sha256\": \"8a26bc373035878ef9b41767ceea7b681896e17d88bedce118de1d622125e1d6\",\n \"hash_algorithm\": \"sha256_bytes_v1\"\n },\n {\n \"role\": \"event_store_reconciliation_v1_ingest_model\",\n \"path\": \"crates/event_store/src/model/ingest_reconciliation_v1.rs\",\n \"byte_length\": 1626,\n \"sha256\": \"47bf13b3fc0f8a913a660f7d655413de0f6b90568bc4acc510aa6bd741bab47b\",\n \"hash_algorithm\": \"sha256_bytes_v1\"\n },\n {\n \"role\": \"addressable_transition_feed_model\",\n \"path\": \"crates/event_store/src/model/addressable_transition_feed_v1.rs\",\n \"byte_length\": 22279,\n \"sha256\": \"f8ea454a0e998a3d433bba52d1ff9759a04fcb91db286cf2a2b10ef7d0057694\",\n \"hash_algorithm\": \"sha256_bytes_v1\"\n },\n {\n \"role\": \"food_projection_model\",\n \"path\": \"crates/event_store/src/model/food_availability_projection_v1.rs\",\n \"byte_length\": 17437,\n \"sha256\": \"6fdfc8c5eb3dd9c451fd47b2394af123b50f7fe6d74113f8777221a8fa31ba30\",\n \"hash_algorithm\": \"sha256_bytes_v1\"\n },\n {\n \"role\": \"source_generation_rebuild_authority\",\n \"path\": \"crates/event_store/src/nip09/reconciliation_v1.rs\",\n \"byte_length\": 184402,\n \"sha256\": \"7fa01e52f51d3470ba60e6068dc05797c2a6eaf5eb317d23111a961dbe4451f9\",\n \"hash_algorithm\": \"sha256_bytes_v1\"\n },\n {\n \"role\": \"schema_migration_and_reopen_authority\",\n \"path\": \"crates/event_store/src/schema.rs\",\n \"byte_length\": 146146,\n \"sha256\": \"93b060e80d3edd73f86208e4bf698fa9d53eaf1eeb04526c9261fb8b5726fb0d\",\n \"hash_algorithm\": \"sha256_bytes_v1\"\n },\n {\n \"role\": \"public_store_and_transaction_authority\",\n \"path\": \"crates/event_store/src/store.rs\",\n \"byte_length\": 394732,\n \"sha256\": \"6710a4b3e366b724f6b3d4904e2403c15456f23111996945931d2ba20e301f52\",\n \"hash_algorithm\": \"sha256_bytes_v1\"\n },\n {\n \"role\": \"addressable_transition_feed_store\",\n \"path\": \"crates/event_store/src/store/addressable_transition_feed_v1.rs\",\n \"byte_length\": 40254,\n \"sha256\": \"de656face46735b938b7b20780687404eade47885871129cc5a7c009155d6336\",\n \"hash_algorithm\": \"sha256_bytes_v1\"\n },\n {\n \"role\": \"food_projection_store\",\n \"path\": \"crates/event_store/src/store/food_availability_projection_v1.rs\",\n \"byte_length\": 48971,\n \"sha256\": \"189b824af305f39c7f71a285f4746455ff30f1a27b24b95d8d21223b41772152\",\n \"hash_algorithm\": \"sha256_bytes_v1\"\n },\n {\n \"role\": \"predecessor_post_core_v1_extension\",\n \"path\": \"crates/event_store/src/store/post_core_extensions_v1.rs\",\n \"byte_length\": 6923,\n \"sha256\": \"2fbfc6252f9ce249468a99b5230fd6b7b59b9e47ee4f38783c5fd9379c823fd0\",\n \"hash_algorithm\": \"sha256_bytes_v1\"\n },\n {\n \"role\": \"predecessor_post_core_v1_storage\",\n \"path\": \"crates/event_store/src/store/post_core_storage_v1.rs\",\n \"byte_length\": 16876,\n \"sha256\": \"f27dc7dcd643762226f8d4df0d297027b384bcf1004277222e978965bc2d40cf\",\n \"hash_algorithm\": \"sha256_bytes_v1\"\n },\n {\n \"role\": \"raw_ingest_capacity_authority\",\n \"path\": \"crates/event_store/src/store/protocol_reconciliation_v1.rs\",\n \"byte_length\": 30145,\n \"sha256\": \"a8a26763dc39124ab7537fdcc3f89a1f0aa7e1830f4f9dec9ee4057bbb4fd228\",\n \"hash_algorithm\": \"sha256_bytes_v1\"\n },\n {\n \"role\": \"predecessor_protocol_storage\",\n \"path\": \"crates/event_store/src/store/protocol_storage_v1.rs\",\n \"byte_length\": 10929,\n \"sha256\": \"20de4436945bac0d8cbeca0ae6cd95232a92da8cd6be6ae6beacba17fe50d658\",\n \"hash_algorithm\": \"sha256_bytes_v1\"\n },\n {\n \"role\": \"source_maintenance_runtime\",\n \"path\": \"crates/event_store/src/source_maintenance_v1.rs\",\n \"byte_length\": 51762,\n \"sha256\": \"5db9c9e86fd18a2fcc08dbc3468f373bf39d8948bc6a08936b252a4dda3546e9\",\n \"hash_algorithm\": \"sha256_bytes_v1\"\n },\n {\n \"role\": \"predecessor_food_result_vector_executor\",\n \"path\": \"crates/event_store/tests/food_availability_projection_v1_result_vector.rs\",\n \"byte_length\": 34070,\n \"sha256\": \"aa098bcb0f975f690ca9535d3cbb76c6e57e6d70fd3a892c4399fd35fe8ec21c\",\n \"hash_algorithm\": \"sha256_bytes_v1\"\n },\n {\n \"role\": \"artifact_transaction_authority\",\n \"path\": \"tools/xtask/src/contract/artifact_bundle.rs\",\n \"byte_length\": 38279,\n \"sha256\": \"f326ea57b56d40135f95b6b1e15961f66eed363337180a6d12a5ea903e1a9a29\",\n \"hash_algorithm\": \"sha256_bytes_v1\"\n },\n {\n \"role\": \"predecessor_successor_governance\",\n \"path\": \"tools/xtask/src/contract/food_availability_projection.rs\",\n \"byte_length\": 197131,\n \"sha256\": \"6b71c927b41404f633dfbd0f8e321dcdab933285a196671f27046c0c15d55434\",\n \"hash_algorithm\": \"sha256_bytes_v1\"\n },\n {\n \"role\": \"transitive_predecessor_membership_governance\",\n \"path\": \"tools/xtask/src/contract/nip09_reconciliation.rs\",\n \"byte_length\": 835884,\n \"sha256\": \"c266610ba4a55e9fc3b5e80c52c7b244aa9fac7336c7a7cd37489a8bbdb97f1d\",\n \"hash_algorithm\": \"sha256_bytes_v1\"\n },\n {\n \"role\": \"source_maintenance_governance\",\n \"path\": \"tools/xtask/src/contract/source_maintenance.rs\",\n \"byte_length\": 188436,\n \"sha256\": \"ce21d4d200142b361ee0f65bd8063a461fd01f016e92eec7f6576863a0856b05\",\n \"hash_algorithm\": \"sha256_bytes_v1\"\n },\n {\n \"role\": \"contract_command_authority\",\n \"path\": \"tools/xtask/src/contract.rs\",\n \"byte_length\": 504182,\n \"sha256\": \"7edf6ffda5dec9e08b66ad100d9119a705c994af692fd287e90700830de12281\",\n \"hash_algorithm\": \"sha256_bytes_v1\"\n },\n {\n \"role\": \"xtask_dispatch_and_release_preflight\",\n \"path\": \"tools/xtask/src/main.rs\",\n \"byte_length\": 15109,\n \"sha256\": \"bf721ecaa94225908496f247bf65011e669aa61b732594c23d64e306b4ac38cc\",\n \"hash_algorithm\": \"sha256_bytes_v1\"\n }\n ],\n \"public_api\": {\n \"inherited_predecessor_symbols\": [\n \"RADROOTS_ADDRESSABLE_TRANSITION_CURSOR_JSON_MAX_BYTES_V1\",\n \"RADROOTS_ADDRESSABLE_TRANSITION_D_TAG_MAX_BYTES_V1\",\n \"RADROOTS_ADDRESSABLE_TRANSITION_FEED_VERSION_V1\",\n \"RADROOTS_ADDRESSABLE_TRANSITION_PAGE_LIMIT_MAX_V1\",\n \"RADROOTS_ADDRESSABLE_TRANSITION_PAGE_RAW_JSON_MAX_BYTES_V1\",\n \"RADROOTS_ADDRESSABLE_TRANSITION_PAGE_SCAN_MAX_V1\",\n \"RADROOTS_ADDRESSABLE_TRANSITION_SCOPE_KIND_MAX_V1\",\n \"RADROOTS_FOOD_AVAILABILITY_PROJECTION_APPLY_PAGE_LIMIT_V1\",\n \"RADROOTS_FOOD_AVAILABILITY_PROJECTION_VERSION_V1\",\n \"RADROOTS_FOOD_AVAILABILITY_SEARCH_QUERY_MAX_BYTES_V1\",\n \"RADROOTS_FOOD_AVAILABILITY_SEARCH_QUERY_MAX_TERMS_V1\",\n \"RadrootsAddressableTransitionCauseV1\",\n \"RadrootsAddressableTransitionCoordinateV1\",\n \"RadrootsAddressableTransitionCursorV1\",\n \"RadrootsAddressableTransitionEventReferenceV1\",\n \"RadrootsAddressableTransitionOriginV1\",\n \"RadrootsAddressableTransitionPageV1\",\n \"RadrootsAddressableTransitionRawHeadDecisionV1\",\n \"RadrootsAddressableTransitionScopeFingerprintV1\",\n \"RadrootsAddressableTransitionScopeV1\",\n \"RadrootsAddressableTransitionV1\",\n \"RadrootsAddressableTransitionVisibilityV1\",\n \"RadrootsCurrentEventVisibilityV1\",\n \"RadrootsCurrentVisibilityDecisionV1\",\n \"RadrootsFoodAvailabilitySearchQueryV1\",\n \"RadrootsFoodAvailabilityStatusFilterV1\",\n \"RadrootsNip09SuppressionEvidenceV1\",\n \"RadrootsNip09SuppressionOutcome\",\n \"RadrootsNip09SuppressionReason\",\n \"RadrootsStoreProducedCanonicalEventV1\",\n \"RadrootsStoredFoodAvailabilityImageV1\",\n \"RadrootsStoredFoodAvailabilityV1\"\n ],\n \"added_symbols\": [\n \"RADROOTS_EVENT_STORE_RAW_EVENT_COUNT_LIMIT_V1\",\n \"RADROOTS_EVENT_STORE_RAW_EVENT_TEXT_BYTES_LIMIT_V1\",\n \"RADROOTS_EVENT_STORE_RAW_TAG_COUNT_LIMIT_V1\",\n \"RADROOTS_EVENT_STORE_RAW_TAG_TEXT_BYTES_LIMIT_V1\",\n \"RADROOTS_EVENT_STORE_RETAINED_SOURCE_GENERATION_LIMIT_V1\",\n \"RadrootsEventStoreSourceCapacityResourceV1\",\n \"RadrootsEventStoreSourceCapacityV1\"\n ],\n \"methods\": [\n \"RadrootsEventStore::source_capacity_v1\",\n \"RadrootsEventStoreSourceCapacityResourceV1::as_str\",\n \"RadrootsEventStoreSourceCapacityV1::source_generation\",\n \"RadrootsEventStoreSourceCapacityV1::raw_event_count\",\n \"RadrootsEventStoreSourceCapacityV1::raw_tag_count\",\n \"RadrootsEventStoreSourceCapacityV1::raw_event_text_bytes\",\n \"RadrootsEventStoreSourceCapacityV1::raw_tag_text_bytes\",\n \"RadrootsEventStoreSourceCapacityV1::raw_high_water_seq\",\n \"RadrootsEventStoreSourceCapacityV1::retained_generation_count\",\n \"RadrootsEventStoreSourceCapacityV1::retained_generation_limit\"\n ],\n \"error_variants\": [\n \"SourceCapacityExceeded\",\n \"SourceGenerationHistoryLimitReached\",\n \"PersistedEphemeralRawEvent\",\n \"SourceCapacityStateDrift\",\n \"SqliteMainDatabaseEncodingNotUtf8\",\n \"RollbackWouldDiscardSourceGenerationHistory\"\n ],\n \"removed_symbols\": [\n \"RadrootsEventStoreReconciliationResource\",\n \"RadrootsEventStoreError::ReconciliationCapacityExceeded\"\n ],\n \"breaking_replacements\": [\n {\n \"removed\": \"RadrootsEventStoreReconciliationResource\",\n \"replacement\": \"RadrootsEventStoreSourceCapacityResourceV1\"\n },\n {\n \"removed\": \"RadrootsEventStoreError::ReconciliationCapacityExceeded\",\n \"replacement\": \"RadrootsEventStoreError::SourceCapacityExceeded\"\n }\n ]\n },\n \"result_vector\": {\n \"canonical_path\": \"contracts/conformance/vectors/event_store/source_maintenance.v1.json\",\n \"mirror_path\": \"crates/event_store/tests/fixtures/source_maintenance.v1.json\",\n \"byte_length\": 16253,\n \"sha256\": \"997aba2604a2b9d199fb87dc9d07942ca50d91863aeadcf3eeacf16d191dd71f\",\n \"hash_algorithm\": \"sha256_bytes_v1\",\n \"executor_id\": \"radroots_event_store.source_maintenance_v1.result_vector_executor.v1\",\n \"executor_path\": \"crates/event_store/tests/source_maintenance_v1_result_vector.rs\",\n \"executor_test\": \"source_maintenance_v1_result_vector\",\n \"executor_byte_length\": 23510,\n \"executor_sha256\": \"a7487afdfe19fc5fc794811d0f0e6035203e1aabcf0a33a1d398f6b3555d38f3\",\n \"executor_hash_algorithm\": \"sha256_bytes_v1\"\n }\n}\n";
+pub(crate) const SOURCE_MAINTENANCE_MANIFEST_JSON: &str = "{\n \"schema_version\": 1,\n \"contract_id\": \"radroots_event_store.source_maintenance_v1\",\n \"hook_id\": \"source_maintenance_v1\",\n \"manifest_schema\": {\n \"path\": \"crates/event_store/contracts/source_maintenance_v1.manifest.schema.json\",\n \"byte_length\": 12315,\n \"sha256\": \"96ea98a5abf3348b61565954cd34f2c622411d8dd34205ef04134bbe0e3d3f2b\",\n \"hash_algorithm\": \"sha256_bytes_v1\"\n },\n \"predecessor\": {\n \"hook_id\": \"food_availability_projection_v1\",\n \"manifest\": {\n \"path\": \"crates/event_store/contracts/food_availability_projection_v1.manifest.json\",\n \"byte_length\": 17455,\n \"sha256\": \"02dfe1b450fbdac16e718888215b4dd5c85d8975440fa21e8f439fb24c2b2990\",\n \"hash_algorithm\": \"sha256_bytes_v1\"\n }\n },\n \"migration\": {\n \"version\": 4,\n \"name\": \"source_maintenance\",\n \"up\": {\n \"path\": \"crates/event_store/migrations/0004_source_maintenance.up.sql\",\n \"byte_length\": 19841,\n \"sha256\": \"ab2724188f8d08c897eebea2533a635e7c74282a25e84e4c0c37e78b08837a43\",\n \"hash_algorithm\": \"sha256_bytes_v1\"\n },\n \"down\": {\n \"path\": \"crates/event_store/migrations/0004_source_maintenance.down.sql\",\n \"byte_length\": 5172,\n \"sha256\": \"fe44fd53c51545c08ea479b385e6781079dab70fc63da2a3c205d727a00ce860\",\n \"hash_algorithm\": \"sha256_bytes_v1\"\n },\n \"schema_sha256\": \"074f85b663444ac150239ecd8441ea4a96ad83a798a55e22d2e5e2f7ee943a8c\",\n \"catalog\": {\n \"objects\": [\n \"radroots_event_store_source_capacity_delete_guard\",\n \"radroots_event_store_source_capacity_insert_guard\",\n \"radroots_event_store_source_capacity_marker_close_guard\",\n \"radroots_event_store_source_capacity_update_guard\",\n \"radroots_event_store_source_capacity_v1\",\n \"radroots_event_store_source_generation_capacity_advance\",\n \"radroots_event_store_source_generation_capacity_guard\"\n ],\n \"replaced_objects\": [\n \"radroots_event_store_food_availability_image_delete_guard\",\n \"radroots_event_store_food_availability_projection_delete_guard\",\n \"radroots_event_store_source_rebuild_marker_insert_guard\"\n ],\n \"tables\": [\n \"radroots_event_store_source_capacity_v1\"\n ],\n \"fts5_tables\": []\n }\n },\n \"source_maintenance\": {\n \"version\": 1,\n \"event_contract_registry_version\": 7,\n \"capacity_authority_id\": \"radroots_event_store_source_capacity_v1\",\n \"accounting\": {\n \"algorithm\": \"sqlite_cast_blob_octet_sum_v1\",\n \"raw_event_columns\": [\n \"event_id\",\n \"pubkey\",\n \"tags_json\",\n \"content\",\n \"sig\",\n \"raw_json\"\n ],\n \"raw_tag_columns\": [\n \"event_id\",\n \"tag_name\",\n \"tag_value\",\n \"tag_json\"\n ],\n \"nullable_raw_tag_columns\": [\n \"tag_value\"\n ]\n },\n \"limits\": {\n \"raw_events\": 25000,\n \"raw_tags\": 250000,\n \"raw_event_text_bytes\": 67108864,\n \"raw_tag_text_bytes\": 33554432,\n \"retained_source_generations\": 8\n },\n \"reopen_validation\": {\n \"mode\": \"bounded_full_raw_recount_v1\",\n \"raw_event_rejection_scan_bound\": 25001,\n \"raw_tag_rejection_scan_bound\": 250001,\n \"generation_history_validation\": \"bounded_count_plus_active_ordinal_v1\",\n \"retained_generation_rejection_scan_bound\": 9\n },\n \"rebuild_seal\": {\n \"nip09_hook_id\": \"nip09_reconciliation_v1\",\n \"nip09_manifest_sha256\": \"74af832420ffbaa9805e89df3c0b34f126a443e1598f757e3372f407f9003b77\",\n \"food_hook_id\": \"food_availability_projection_v1\",\n \"food_manifest_sha256\": \"02dfe1b450fbdac16e718888215b4dd5c85d8975440fa21e8f439fb24c2b2990\",\n \"food_scope_fingerprint_sha256\": \"8b63c5ddc48a2cc7db69295238b96d5f814dba50427c80b4d0079f061e6d3de0\",\n \"active_generation_authority\": \"radroots_event_store_source_state\",\n \"marker_close_authority\": \"radroots_event_store_source_capacity_marker_close_guard\"\n }\n },\n \"entry_points\": [\n {\n \"role\": \"migration_registry\",\n \"rust_path\": \"radroots_event_store::migrations::EVENT_STORE_MIGRATIONS[3]\"\n },\n {\n \"role\": \"migration_apply_hook\",\n \"rust_path\": \"radroots_event_store::schema::apply_migration_hook\"\n },\n {\n \"role\": \"migration_validation_hook\",\n \"rust_path\": \"radroots_event_store::schema::validate_migration_hook_state\"\n },\n {\n \"role\": \"capacity_query\",\n \"rust_path\": \"radroots_event_store::RadrootsEventStore::source_capacity_v1\"\n },\n {\n \"role\": \"raw_append_preflight\",\n \"rust_path\": \"radroots_event_store::source_maintenance_v1::preflight_unique_raw_source_append_v1\"\n },\n {\n \"role\": \"raw_append_advance\",\n \"rust_path\": \"radroots_event_store::source_maintenance_v1::advance_source_capacity_after_insert_v1\"\n },\n {\n \"role\": \"generation_append_preflight\",\n \"rust_path\": \"radroots_event_store::source_maintenance_v1::preflight_source_generation_append_v1\"\n },\n {\n \"role\": \"generation_rebuild_bind\",\n \"rust_path\": \"radroots_event_store::source_maintenance_v1::bind_source_capacity_to_generation_v1\"\n },\n {\n \"role\": \"sqlite_encoding_preflight\",\n \"rust_path\": \"radroots_event_store::store::validate_main_database_encoding\"\n },\n {\n \"role\": \"source_generation_history_rollback_guard\",\n \"rust_path\": \"radroots_event_store::schema::validate_rollback_preserves_source_generation_history\"\n },\n {\n \"role\": \"result_vector_executor\",\n \"rust_path\": \"source_maintenance_v1_result_vector\"\n }\n ],\n \"source_files\": [\n {\n \"role\": \"workspace_dependency_authority\",\n \"path\": \"Cargo.toml\",\n \"byte_length\": 12385,\n \"sha256\": \"c53c5c5a464267d7df850e03fdfa99dcde0b469972cf921f9b81c18b52a9c4b2\",\n \"hash_algorithm\": \"sha256_bytes_v1\"\n },\n {\n \"role\": \"core_currency_value_authority\",\n \"path\": \"crates/core/src/currency.rs\",\n \"byte_length\": 4142,\n \"sha256\": \"42e6da2d8d2fdd6955dc2d83e98dd00266e02bc910b69923b117662c05089d14\",\n \"hash_algorithm\": \"sha256_bytes_v1\"\n },\n {\n \"role\": \"core_decimal_value_authority\",\n \"path\": \"crates/core/src/decimal.rs\",\n \"byte_length\": 7839,\n \"sha256\": \"4b1d681a92d7a9e074bee7e1f20eb1499bb05bfc6528a6c9ba69fa7d00416550\",\n \"hash_algorithm\": \"sha256_bytes_v1\"\n },\n {\n \"role\": \"core_money_value_authority\",\n \"path\": \"crates/core/src/money.rs\",\n \"byte_length\": 8025,\n \"sha256\": \"3f30bc21e21951a62fdc5d4033736ed42a883df590e8403940775bd2edfeebc5\",\n \"hash_algorithm\": \"sha256_bytes_v1\"\n },\n {\n \"role\": \"core_percent_value_authority\",\n \"path\": \"crates/core/src/percent.rs\",\n \"byte_length\": 2652,\n \"sha256\": \"42ceab109881329f3539d06a0ee0381ab4359985fe185a18d58a9c9558c5eb7f\",\n \"hash_algorithm\": \"sha256_bytes_v1\"\n },\n {\n \"role\": \"core_quantity_value_authority\",\n \"path\": \"crates/core/src/quantity.rs\",\n \"byte_length\": 6785,\n \"sha256\": \"d14e619da3829cdaf3ca7385fb892d330c286c1e21455c135c37518cbb588b5f\",\n \"hash_algorithm\": \"sha256_bytes_v1\"\n },\n {\n \"role\": \"core_quantity_price_value_authority\",\n \"path\": \"crates/core/src/quantity_price.rs\",\n \"byte_length\": 7061,\n \"sha256\": \"d60f70377099470ed283f45868a5119d7bb46143cb250b5082a4c038ba7f6cdc\",\n \"hash_algorithm\": \"sha256_bytes_v1\"\n },\n {\n \"role\": \"core_unit_value_authority\",\n \"path\": \"crates/core/src/unit.rs\",\n \"byte_length\": 10023,\n \"sha256\": \"550e9582b6a5290aac3f637b83853b21fefcbab92c432d067c83448f4b2fe3e9\",\n \"hash_algorithm\": \"sha256_bytes_v1\"\n },\n {\n \"role\": \"blossom_public_surface\",\n \"path\": \"crates/blossom/src/lib.rs\",\n \"byte_length\": 510,\n \"sha256\": \"a4dfcbd193457c50c1b0fbfc91bb547981ecd3a6e23cfc6f1030edfb511dc58c\",\n \"hash_algorithm\": \"sha256_bytes_v1\"\n },\n {\n \"role\": \"blossom_authorization_authority\",\n \"path\": \"crates/blossom/src/authorization.rs\",\n \"byte_length\": 39360,\n \"sha256\": \"461947b30516315a342b3b5697599f701d27050888f29f67f5d7a7ad4afa4c28\",\n \"hash_algorithm\": \"sha256_bytes_v1\"\n },\n {\n \"role\": \"blossom_descriptor_authority\",\n \"path\": \"crates/blossom/src/descriptor.rs\",\n \"byte_length\": 13702,\n \"sha256\": \"b2a4ffa760256e1316f70e012d200e2b5f4afd8ede771b85a5147f96b247f599\",\n \"hash_algorithm\": \"sha256_bytes_v1\"\n },\n {\n \"role\": \"blossom_error_authority\",\n \"path\": \"crates/blossom/src/error.rs\",\n \"byte_length\": 17229,\n \"sha256\": \"02af55beacf437040be17d1fc3271d6e2a62915f656ec2dbe06247deef83f95a\",\n \"hash_algorithm\": \"sha256_bytes_v1\"\n },\n {\n \"role\": \"blossom_hash_authority\",\n \"path\": \"crates/blossom/src/hash.rs\",\n \"byte_length\": 11006,\n \"sha256\": \"45eca0d81ac0f46c305a32f81aafcdd90b14679d0614f72862289a6e5d4cb08f\",\n \"hash_algorithm\": \"sha256_bytes_v1\"\n },\n {\n \"role\": \"blossom_media_type_authority\",\n \"path\": \"crates/blossom/src/media_type.rs\",\n \"byte_length\": 2368,\n \"sha256\": \"69db5c0f9fcdd7dbe1f22daa499f65603ae4ce198083dab2c73a36813fa18a46\",\n \"hash_algorithm\": \"sha256_bytes_v1\"\n },\n {\n \"role\": \"blossom_url_authority\",\n \"path\": \"crates/blossom/src/url.rs\",\n \"byte_length\": 14580,\n \"sha256\": \"342c995fcf620e5fb32461a7d8276f5668ba2662890bd32d12780cc9121c6451\",\n \"hash_algorithm\": \"sha256_bytes_v1\"\n },\n {\n \"role\": \"event_contract_facade\",\n \"path\": \"crates/event/src/contract.rs\",\n \"byte_length\": 86,\n \"sha256\": \"9994cbca9dcc7450ad133b6b927e7c06bee08ef813652452cc1e56a284c1be10\",\n \"hash_algorithm\": \"sha256_bytes_v1\"\n },\n {\n \"role\": \"event_contract_registry_v7_authority\",\n \"path\": \"crates/event/src/contract/registry_v7.rs\",\n \"byte_length\": 155738,\n \"sha256\": \"e9133e65b37810478c3e34ec4ac2005d81209a714ec2de5bd0232b9f02740dde\",\n \"hash_algorithm\": \"sha256_bytes_v1\"\n },\n {\n \"role\": \"event_envelope_authority\",\n \"path\": \"crates/event/src/envelope.rs\",\n \"byte_length\": 31165,\n \"sha256\": \"97a3bb38d630666bba497b98e856ee457d6899de230dabf6cab786a5bd55a3ce\",\n \"hash_algorithm\": \"sha256_bytes_v1\"\n },\n {\n \"role\": \"event_head_facade\",\n \"path\": \"crates/event/src/event_head.rs\",\n \"byte_length\": 68,\n \"sha256\": \"cb52f6006f7ecd862707d6b048f9fc407e0cd5ebcd3091b3c54e195ffa5cba64\",\n \"hash_algorithm\": \"sha256_bytes_v1\"\n },\n {\n \"role\": \"event_head_v1_authority\",\n \"path\": \"crates/event/src/event_head/v1.rs\",\n \"byte_length\": 7529,\n \"sha256\": \"0a4b50c4b7a93e9d88cc995cf69d9e87b341cba66d7feb51c357dfa4e5b2de37\",\n \"hash_algorithm\": \"sha256_bytes_v1\"\n },\n {\n \"role\": \"event_ids_authority\",\n \"path\": \"crates/event/src/ids.rs\",\n \"byte_length\": 46282,\n \"sha256\": \"f3c34e7dcf09fc225cb9c12f02ae932d5155c859f73f8b8573db8e5ebf298678\",\n \"hash_algorithm\": \"sha256_bytes_v1\"\n },\n {\n \"role\": \"event_trade_authority\",\n \"path\": \"crates/event/src/trade.rs\",\n \"byte_length\": 68376,\n \"sha256\": \"1012b44295cb26844206304bc24b355a49c18a023844f6b3905337c63b1417a7\",\n \"hash_algorithm\": \"sha256_bytes_v1\"\n },\n {\n \"role\": \"event_kinds_authority\",\n \"path\": \"crates/event/src/kinds.rs\",\n \"byte_length\": 34961,\n \"sha256\": \"8b3ce6193cab1f7e1587d0c1b2880a81b0aa43c77d89671b602772db37edcebf\",\n \"hash_algorithm\": \"sha256_bytes_v1\"\n },\n {\n \"role\": \"event_tags_authority\",\n \"path\": \"crates/event/src/tags.rs\",\n \"byte_length\": 4530,\n \"sha256\": \"cb8f12a639fc72d9238e32495d9e67e928e6627fb8c94ec0a58c5d95e7373cd6\",\n \"hash_algorithm\": \"sha256_bytes_v1\"\n },\n {\n \"role\": \"event_draft_authority\",\n \"path\": \"crates/event/src/draft.rs\",\n \"byte_length\": 58674,\n \"sha256\": \"fa4e802f1143eba72ba7fc334104ea0d6613c886725ff9f3e61dab2443c243b6\",\n \"hash_algorithm\": \"sha256_bytes_v1\"\n },\n {\n \"role\": \"event_calendar_authority\",\n \"path\": \"crates/event/src/calendar.rs\",\n \"byte_length\": 103814,\n \"sha256\": \"f8e0fcb4802d0dcd2a1a13b17216a0c5278950a60c09a261ab349e9ce1989d72\",\n \"hash_algorithm\": \"sha256_bytes_v1\"\n },\n {\n \"role\": \"event_classified_listing_authority\",\n \"path\": \"crates/event/src/classified_listing.rs\",\n \"byte_length\": 8226,\n \"sha256\": \"745aa08953a6243ea1afad22aa63e44f6746f2f243ab0d6b617d6ab64fa58749\",\n \"hash_algorithm\": \"sha256_bytes_v1\"\n },\n {\n \"role\": \"event_profile_authority\",\n \"path\": \"crates/event/src/profile.rs\",\n \"byte_length\": 18848,\n \"sha256\": \"7c7ac7f4926938f5cb5530be5450e5e23f18f216bdb222150fbdd451cec20d5c\",\n \"hash_algorithm\": \"sha256_bytes_v1\"\n },\n {\n \"role\": \"event_post_authority\",\n \"path\": \"crates/event/src/post.rs\",\n \"byte_length\": 22738,\n \"sha256\": \"7ed4a4c39bed40b134369d16e1fc35ab2c7d27ee300dd36d367025def2283b39\",\n \"hash_algorithm\": \"sha256_bytes_v1\"\n },\n {\n \"role\": \"event_comment_authority\",\n \"path\": \"crates/event/src/comment.rs\",\n \"byte_length\": 36375,\n \"sha256\": \"f4d1a57780eff0d315bc4e2fbad316dfb7c7ced1bcc9e8e85afe0b5ecdaf3aa8\",\n \"hash_algorithm\": \"sha256_bytes_v1\"\n },\n {\n \"role\": \"event_food_availability_authority\",\n \"path\": \"crates/event/src/food_availability.rs\",\n \"byte_length\": 45429,\n \"sha256\": \"b4357dfb6954631673b6cd58794015da29303cb54ce8405a57ad543870036c9e\",\n \"hash_algorithm\": \"sha256_bytes_v1\"\n },\n {\n \"role\": \"event_deletion_authority\",\n \"path\": \"crates/event/src/deletion.rs\",\n \"byte_length\": 31155,\n \"sha256\": \"c8b7ab79998ae62e03497f5511dd3950a41d73155edda3d8d34c65fc797e9d09\",\n \"hash_algorithm\": \"sha256_bytes_v1\"\n },\n {\n \"role\": \"event_relay_hint_authority\",\n \"path\": \"crates/event/src/relay_hint.rs\",\n \"byte_length\": 14317,\n \"sha256\": \"1a14aea5d2f2620970dc1de9e3d311d9042cab4d5805a56461548168112a0801\",\n \"hash_algorithm\": \"sha256_bytes_v1\"\n },\n {\n \"role\": \"event_media_authority\",\n \"path\": \"crates/event/src/media.rs\",\n \"byte_length\": 3521,\n \"sha256\": \"8f670e634452872a525efdad0cb9480288885c62f22a9b9915a67a7e7965651c\",\n \"hash_algorithm\": \"sha256_bytes_v1\"\n },\n {\n \"role\": \"event_social_authority\",\n \"path\": \"crates/event/src/social.rs\",\n \"byte_length\": 5483,\n \"sha256\": \"1b89c6d0954822e7f1e778479ed43694e88929bcd5310ee066f8f4ba6505045a\",\n \"hash_algorithm\": \"sha256_bytes_v1\"\n },\n {\n \"role\": \"event_wire_facade\",\n \"path\": \"crates/event/src/wire.rs\",\n \"byte_length\": 68,\n \"sha256\": \"cb52f6006f7ecd862707d6b048f9fc407e0cd5ebcd3091b3c54e195ffa5cba64\",\n \"hash_algorithm\": \"sha256_bytes_v1\"\n },\n {\n \"role\": \"event_wire_v1_authority\",\n \"path\": \"crates/event/src/wire/v1.rs\",\n \"byte_length\": 22133,\n \"sha256\": \"cc28c8cbd962b32ed2efe43e84c1e0d1ea3bd89636efff2d5553714072fce1a4\",\n \"hash_algorithm\": \"sha256_bytes_v1\"\n },\n {\n \"role\": \"event_codec_verification_facade\",\n \"path\": \"crates/event_codec/src/verification.rs\",\n \"byte_length\": 253,\n \"sha256\": \"b49a32df605035c87f295c0a151140d43d2e588c5e11b05183e5fc92993dae0e\",\n \"hash_algorithm\": \"sha256_bytes_v1\"\n },\n {\n \"role\": \"event_codec_verification_v1_authority\",\n \"path\": \"crates/event_codec/src/verification/v1.rs\",\n \"byte_length\": 8751,\n \"sha256\": \"fc4c5d45e475151c56330ba9c4db70de603e4ec48adabd6365f80d5f6a3733f4\",\n \"hash_algorithm\": \"sha256_bytes_v1\"\n },\n {\n \"role\": \"event_codec_registry_v7_admission_authority\",\n \"path\": \"crates/event_codec/src/admission/registry_v7.rs\",\n \"byte_length\": 5350,\n \"sha256\": \"755e63dd7ad1115c219e5a3ea540bef67d2770fc9f2a5aa6ba97c925c99bdced\",\n \"hash_algorithm\": \"sha256_bytes_v1\"\n },\n {\n \"role\": \"event_codec_profile_inbound_facade\",\n \"path\": \"crates/event_codec/src/profile/inbound.rs\",\n \"byte_length\": 86,\n \"sha256\": \"9994cbca9dcc7450ad133b6b927e7c06bee08ef813652452cc1e56a284c1be10\",\n \"hash_algorithm\": \"sha256_bytes_v1\"\n },\n {\n \"role\": \"event_codec_profile_registry_v7_authority\",\n \"path\": \"crates/event_codec/src/profile/inbound/registry_v7.rs\",\n \"byte_length\": 10394,\n \"sha256\": \"c37c225ea8153beb098a39c4a56203aa03382af12646f40cd3f8628663700702\",\n \"hash_algorithm\": \"sha256_bytes_v1\"\n },\n {\n \"role\": \"event_codec_post_inbound_facade\",\n \"path\": \"crates/event_codec/src/post/inbound.rs\",\n \"byte_length\": 86,\n \"sha256\": \"9994cbca9dcc7450ad133b6b927e7c06bee08ef813652452cc1e56a284c1be10\",\n \"hash_algorithm\": \"sha256_bytes_v1\"\n },\n {\n \"role\": \"event_codec_post_registry_v7_authority\",\n \"path\": \"crates/event_codec/src/post/inbound/registry_v7.rs\",\n \"byte_length\": 16016,\n \"sha256\": \"bc0bb839c28f3588f05544c846c987528ea3934c75305fef70af8e027a97cc58\",\n \"hash_algorithm\": \"sha256_bytes_v1\"\n },\n {\n \"role\": \"event_codec_reply_inbound_facade\",\n \"path\": \"crates/event_codec/src/reply/inbound.rs\",\n \"byte_length\": 86,\n \"sha256\": \"9994cbca9dcc7450ad133b6b927e7c06bee08ef813652452cc1e56a284c1be10\",\n \"hash_algorithm\": \"sha256_bytes_v1\"\n },\n {\n \"role\": \"event_codec_reply_registry_v7_authority\",\n \"path\": \"crates/event_codec/src/reply/inbound/registry_v7.rs\",\n \"byte_length\": 26812,\n \"sha256\": \"a72e9721ed13addca2a63942ac9e43c1daa8f1d1457eef08ec6a3ee5eb8872c5\",\n \"hash_algorithm\": \"sha256_bytes_v1\"\n },\n {\n \"role\": \"event_codec_comment_inbound_facade\",\n \"path\": \"crates/event_codec/src/comment/inbound.rs\",\n \"byte_length\": 86,\n \"sha256\": \"9994cbca9dcc7450ad133b6b927e7c06bee08ef813652452cc1e56a284c1be10\",\n \"hash_algorithm\": \"sha256_bytes_v1\"\n },\n {\n \"role\": \"event_codec_comment_registry_v7_authority\",\n \"path\": \"crates/event_codec/src/comment/inbound/registry_v7.rs\",\n \"byte_length\": 53783,\n \"sha256\": \"30d1b0155963b25d64685ddd042f423ef7707b111dc56ead15bd468e0433a432\",\n \"hash_algorithm\": \"sha256_bytes_v1\"\n },\n {\n \"role\": \"event_codec_deletion_facade\",\n \"path\": \"crates/event_codec/src/deletion/mod.rs\",\n \"byte_length\": 115,\n \"sha256\": \"17d56f82ddb0a86bc97abbcf3e037fe460ea31fff2548f527be4bf004dac3a95\",\n \"hash_algorithm\": \"sha256_bytes_v1\"\n },\n {\n \"role\": \"event_codec_deletion_reconciliation_v1_authority\",\n \"path\": \"crates/event_codec/src/deletion/reconciliation_v1.rs\",\n \"byte_length\": 38469,\n \"sha256\": \"3e06d1fa923ca5faabb1e95338c35650b0e20b078ff5c972e35ab845d8b7476c\",\n \"hash_algorithm\": \"sha256_bytes_v1\"\n },\n {\n \"role\": \"event_codec_food_inbound_facade\",\n \"path\": \"crates/event_codec/src/food_availability/inbound.rs\",\n \"byte_length\": 86,\n \"sha256\": \"9994cbca9dcc7450ad133b6b927e7c06bee08ef813652452cc1e56a284c1be10\",\n \"hash_algorithm\": \"sha256_bytes_v1\"\n },\n {\n \"role\": \"event_codec_food_registry_v7_authority\",\n \"path\": \"crates/event_codec/src/food_availability/inbound/registry_v7.rs\",\n \"byte_length\": 26764,\n \"sha256\": \"a5786cff942b7b0038f741afb5b9a19230ac58cb57a5ba747b32e1b95d414e15\",\n \"hash_algorithm\": \"sha256_bytes_v1\"\n },\n {\n \"role\": \"event_codec_job_traits_authority\",\n \"path\": \"crates/event_codec/src/job/traits.rs\",\n \"byte_length\": 5029,\n \"sha256\": \"353df3703de4d99fc318474952dc6c95cbce9a19756f3e235ed2d715f36c4364\",\n \"hash_algorithm\": \"sha256_bytes_v1\"\n },\n {\n \"role\": \"event_store_dependency_authority\",\n \"path\": \"crates/event_store/Cargo.toml\",\n \"byte_length\": 1569,\n \"sha256\": \"30f43004bcf0ffa9b9b6f338cba8c56be0265bc1cee708e93f7b7dc54ed60f9c\",\n \"hash_algorithm\": \"sha256_bytes_v1\"\n },\n {\n \"role\": \"event_store_error_and_limits\",\n \"path\": \"crates/event_store/src/error.rs\",\n \"byte_length\": 19517,\n \"sha256\": \"4bf24ee1aa6117597ab467b1379a05549b79024213dc7622a2d276bc26fffab4\",\n \"hash_algorithm\": \"sha256_bytes_v1\"\n },\n {\n \"role\": \"generated_descriptor_registration\",\n \"path\": \"crates/event_store/src/generated.rs\",\n \"byte_length\": 144,\n \"sha256\": \"6b0a8d6f249bd4fc3f878d37cb5e418680f0f1be2d9eec2518dedf03efc47121\",\n \"hash_algorithm\": \"sha256_bytes_v1\"\n },\n {\n \"role\": \"public_surface\",\n \"path\": \"crates/event_store/src/lib.rs\",\n \"byte_length\": 3844,\n \"sha256\": \"3cd9653bcb752fb3c4442d4904b98a0a6208011a9a238125b7b7073d7f4e312b\",\n \"hash_algorithm\": \"sha256_bytes_v1\"\n },\n {\n \"role\": \"migration_registry\",\n \"path\": \"crates/event_store/src/migrations.rs\",\n \"byte_length\": 73585,\n \"sha256\": \"a47477d04759ec6e71d14d3d05459864eae78fce0e3c2481a1b03147f04637f7\",\n \"hash_algorithm\": \"sha256_bytes_v1\"\n },\n {\n \"role\": \"predecessor_model_public_surface\",\n \"path\": \"crates/event_store/src/model.rs\",\n \"byte_length\": 33596,\n \"sha256\": \"98b1742ffb517f66f8e9edefa61d1c3cf3e22be5985202c6c340310a98c72c8e\",\n \"hash_algorithm\": \"sha256_bytes_v1\"\n },\n {\n \"role\": \"event_store_reconciliation_v1_model\",\n \"path\": \"crates/event_store/src/model/reconciliation_v1.rs\",\n \"byte_length\": 11138,\n \"sha256\": \"8a26bc373035878ef9b41767ceea7b681896e17d88bedce118de1d622125e1d6\",\n \"hash_algorithm\": \"sha256_bytes_v1\"\n },\n {\n \"role\": \"event_store_reconciliation_v1_ingest_model\",\n \"path\": \"crates/event_store/src/model/ingest_reconciliation_v1.rs\",\n \"byte_length\": 1626,\n \"sha256\": \"47bf13b3fc0f8a913a660f7d655413de0f6b90568bc4acc510aa6bd741bab47b\",\n \"hash_algorithm\": \"sha256_bytes_v1\"\n },\n {\n \"role\": \"addressable_transition_feed_model\",\n \"path\": \"crates/event_store/src/model/addressable_transition_feed_v1.rs\",\n \"byte_length\": 22279,\n \"sha256\": \"f8ea454a0e998a3d433bba52d1ff9759a04fcb91db286cf2a2b10ef7d0057694\",\n \"hash_algorithm\": \"sha256_bytes_v1\"\n },\n {\n \"role\": \"food_projection_model\",\n \"path\": \"crates/event_store/src/model/food_availability_projection_v1.rs\",\n \"byte_length\": 17437,\n \"sha256\": \"6fdfc8c5eb3dd9c451fd47b2394af123b50f7fe6d74113f8777221a8fa31ba30\",\n \"hash_algorithm\": \"sha256_bytes_v1\"\n },\n {\n \"role\": \"source_generation_rebuild_authority\",\n \"path\": \"crates/event_store/src/nip09/reconciliation_v1.rs\",\n \"byte_length\": 184402,\n \"sha256\": \"7fa01e52f51d3470ba60e6068dc05797c2a6eaf5eb317d23111a961dbe4451f9\",\n \"hash_algorithm\": \"sha256_bytes_v1\"\n },\n {\n \"role\": \"schema_migration_and_reopen_authority\",\n \"path\": \"crates/event_store/src/schema.rs\",\n \"byte_length\": 146146,\n \"sha256\": \"93b060e80d3edd73f86208e4bf698fa9d53eaf1eeb04526c9261fb8b5726fb0d\",\n \"hash_algorithm\": \"sha256_bytes_v1\"\n },\n {\n \"role\": \"public_store_and_transaction_authority\",\n \"path\": \"crates/event_store/src/store.rs\",\n \"byte_length\": 394732,\n \"sha256\": \"6710a4b3e366b724f6b3d4904e2403c15456f23111996945931d2ba20e301f52\",\n \"hash_algorithm\": \"sha256_bytes_v1\"\n },\n {\n \"role\": \"addressable_transition_feed_store\",\n \"path\": \"crates/event_store/src/store/addressable_transition_feed_v1.rs\",\n \"byte_length\": 40254,\n \"sha256\": \"de656face46735b938b7b20780687404eade47885871129cc5a7c009155d6336\",\n \"hash_algorithm\": \"sha256_bytes_v1\"\n },\n {\n \"role\": \"food_projection_store\",\n \"path\": \"crates/event_store/src/store/food_availability_projection_v1.rs\",\n \"byte_length\": 48971,\n \"sha256\": \"189b824af305f39c7f71a285f4746455ff30f1a27b24b95d8d21223b41772152\",\n \"hash_algorithm\": \"sha256_bytes_v1\"\n },\n {\n \"role\": \"predecessor_post_core_v1_extension\",\n \"path\": \"crates/event_store/src/store/post_core_extensions_v1.rs\",\n \"byte_length\": 6923,\n \"sha256\": \"2fbfc6252f9ce249468a99b5230fd6b7b59b9e47ee4f38783c5fd9379c823fd0\",\n \"hash_algorithm\": \"sha256_bytes_v1\"\n },\n {\n \"role\": \"predecessor_post_core_v1_storage\",\n \"path\": \"crates/event_store/src/store/post_core_storage_v1.rs\",\n \"byte_length\": 16876,\n \"sha256\": \"f27dc7dcd643762226f8d4df0d297027b384bcf1004277222e978965bc2d40cf\",\n \"hash_algorithm\": \"sha256_bytes_v1\"\n },\n {\n \"role\": \"raw_ingest_capacity_authority\",\n \"path\": \"crates/event_store/src/store/protocol_reconciliation_v1.rs\",\n \"byte_length\": 30145,\n \"sha256\": \"a8a26763dc39124ab7537fdcc3f89a1f0aa7e1830f4f9dec9ee4057bbb4fd228\",\n \"hash_algorithm\": \"sha256_bytes_v1\"\n },\n {\n \"role\": \"predecessor_protocol_storage\",\n \"path\": \"crates/event_store/src/store/protocol_storage_v1.rs\",\n \"byte_length\": 10929,\n \"sha256\": \"20de4436945bac0d8cbeca0ae6cd95232a92da8cd6be6ae6beacba17fe50d658\",\n \"hash_algorithm\": \"sha256_bytes_v1\"\n },\n {\n \"role\": \"source_maintenance_runtime\",\n \"path\": \"crates/event_store/src/source_maintenance_v1.rs\",\n \"byte_length\": 51762,\n \"sha256\": \"5db9c9e86fd18a2fcc08dbc3468f373bf39d8948bc6a08936b252a4dda3546e9\",\n \"hash_algorithm\": \"sha256_bytes_v1\"\n },\n {\n \"role\": \"predecessor_food_result_vector_executor\",\n \"path\": \"crates/event_store/tests/food_availability_projection_v1_result_vector.rs\",\n \"byte_length\": 34070,\n \"sha256\": \"aa098bcb0f975f690ca9535d3cbb76c6e57e6d70fd3a892c4399fd35fe8ec21c\",\n \"hash_algorithm\": \"sha256_bytes_v1\"\n },\n {\n \"role\": \"artifact_transaction_authority\",\n \"path\": \"tools/xtask/src/contract/artifact_bundle.rs\",\n \"byte_length\": 38279,\n \"sha256\": \"f326ea57b56d40135f95b6b1e15961f66eed363337180a6d12a5ea903e1a9a29\",\n \"hash_algorithm\": \"sha256_bytes_v1\"\n },\n {\n \"role\": \"predecessor_successor_governance\",\n \"path\": \"tools/xtask/src/contract/food_availability_projection.rs\",\n \"byte_length\": 197131,\n \"sha256\": \"6b71c927b41404f633dfbd0f8e321dcdab933285a196671f27046c0c15d55434\",\n \"hash_algorithm\": \"sha256_bytes_v1\"\n },\n {\n \"role\": \"transitive_predecessor_membership_governance\",\n \"path\": \"tools/xtask/src/contract/nip09_reconciliation.rs\",\n \"byte_length\": 836131,\n \"sha256\": \"af71c0172eb214f10a615fc867e309cb6d07780a0dc583858a42c617e10cea83\",\n \"hash_algorithm\": \"sha256_bytes_v1\"\n },\n {\n \"role\": \"source_maintenance_governance\",\n \"path\": \"tools/xtask/src/contract/source_maintenance.rs\",\n \"byte_length\": 188436,\n \"sha256\": \"ce21d4d200142b361ee0f65bd8063a461fd01f016e92eec7f6576863a0856b05\",\n \"hash_algorithm\": \"sha256_bytes_v1\"\n },\n {\n \"role\": \"contract_command_authority\",\n \"path\": \"tools/xtask/src/contract.rs\",\n \"byte_length\": 504182,\n \"sha256\": \"7edf6ffda5dec9e08b66ad100d9119a705c994af692fd287e90700830de12281\",\n \"hash_algorithm\": \"sha256_bytes_v1\"\n },\n {\n \"role\": \"xtask_dispatch_and_release_preflight\",\n \"path\": \"tools/xtask/src/main.rs\",\n \"byte_length\": 15109,\n \"sha256\": \"bf721ecaa94225908496f247bf65011e669aa61b732594c23d64e306b4ac38cc\",\n \"hash_algorithm\": \"sha256_bytes_v1\"\n }\n ],\n \"public_api\": {\n \"inherited_predecessor_symbols\": [\n \"RADROOTS_ADDRESSABLE_TRANSITION_CURSOR_JSON_MAX_BYTES_V1\",\n \"RADROOTS_ADDRESSABLE_TRANSITION_D_TAG_MAX_BYTES_V1\",\n \"RADROOTS_ADDRESSABLE_TRANSITION_FEED_VERSION_V1\",\n \"RADROOTS_ADDRESSABLE_TRANSITION_PAGE_LIMIT_MAX_V1\",\n \"RADROOTS_ADDRESSABLE_TRANSITION_PAGE_RAW_JSON_MAX_BYTES_V1\",\n \"RADROOTS_ADDRESSABLE_TRANSITION_PAGE_SCAN_MAX_V1\",\n \"RADROOTS_ADDRESSABLE_TRANSITION_SCOPE_KIND_MAX_V1\",\n \"RADROOTS_FOOD_AVAILABILITY_PROJECTION_APPLY_PAGE_LIMIT_V1\",\n \"RADROOTS_FOOD_AVAILABILITY_PROJECTION_VERSION_V1\",\n \"RADROOTS_FOOD_AVAILABILITY_SEARCH_QUERY_MAX_BYTES_V1\",\n \"RADROOTS_FOOD_AVAILABILITY_SEARCH_QUERY_MAX_TERMS_V1\",\n \"RadrootsAddressableTransitionCauseV1\",\n \"RadrootsAddressableTransitionCoordinateV1\",\n \"RadrootsAddressableTransitionCursorV1\",\n \"RadrootsAddressableTransitionEventReferenceV1\",\n \"RadrootsAddressableTransitionOriginV1\",\n \"RadrootsAddressableTransitionPageV1\",\n \"RadrootsAddressableTransitionRawHeadDecisionV1\",\n \"RadrootsAddressableTransitionScopeFingerprintV1\",\n \"RadrootsAddressableTransitionScopeV1\",\n \"RadrootsAddressableTransitionV1\",\n \"RadrootsAddressableTransitionVisibilityV1\",\n \"RadrootsCurrentEventVisibilityV1\",\n \"RadrootsCurrentVisibilityDecisionV1\",\n \"RadrootsFoodAvailabilitySearchQueryV1\",\n \"RadrootsFoodAvailabilityStatusFilterV1\",\n \"RadrootsNip09SuppressionEvidenceV1\",\n \"RadrootsNip09SuppressionOutcome\",\n \"RadrootsNip09SuppressionReason\",\n \"RadrootsStoreProducedCanonicalEventV1\",\n \"RadrootsStoredFoodAvailabilityImageV1\",\n \"RadrootsStoredFoodAvailabilityV1\"\n ],\n \"added_symbols\": [\n \"RADROOTS_EVENT_STORE_RAW_EVENT_COUNT_LIMIT_V1\",\n \"RADROOTS_EVENT_STORE_RAW_EVENT_TEXT_BYTES_LIMIT_V1\",\n \"RADROOTS_EVENT_STORE_RAW_TAG_COUNT_LIMIT_V1\",\n \"RADROOTS_EVENT_STORE_RAW_TAG_TEXT_BYTES_LIMIT_V1\",\n \"RADROOTS_EVENT_STORE_RETAINED_SOURCE_GENERATION_LIMIT_V1\",\n \"RadrootsEventStoreSourceCapacityResourceV1\",\n \"RadrootsEventStoreSourceCapacityV1\"\n ],\n \"methods\": [\n \"RadrootsEventStore::source_capacity_v1\",\n \"RadrootsEventStoreSourceCapacityResourceV1::as_str\",\n \"RadrootsEventStoreSourceCapacityV1::source_generation\",\n \"RadrootsEventStoreSourceCapacityV1::raw_event_count\",\n \"RadrootsEventStoreSourceCapacityV1::raw_tag_count\",\n \"RadrootsEventStoreSourceCapacityV1::raw_event_text_bytes\",\n \"RadrootsEventStoreSourceCapacityV1::raw_tag_text_bytes\",\n \"RadrootsEventStoreSourceCapacityV1::raw_high_water_seq\",\n \"RadrootsEventStoreSourceCapacityV1::retained_generation_count\",\n \"RadrootsEventStoreSourceCapacityV1::retained_generation_limit\"\n ],\n \"error_variants\": [\n \"SourceCapacityExceeded\",\n \"SourceGenerationHistoryLimitReached\",\n \"PersistedEphemeralRawEvent\",\n \"SourceCapacityStateDrift\",\n \"SqliteMainDatabaseEncodingNotUtf8\",\n \"RollbackWouldDiscardSourceGenerationHistory\"\n ],\n \"removed_symbols\": [\n \"RadrootsEventStoreReconciliationResource\",\n \"RadrootsEventStoreError::ReconciliationCapacityExceeded\"\n ],\n \"breaking_replacements\": [\n {\n \"removed\": \"RadrootsEventStoreReconciliationResource\",\n \"replacement\": \"RadrootsEventStoreSourceCapacityResourceV1\"\n },\n {\n \"removed\": \"RadrootsEventStoreError::ReconciliationCapacityExceeded\",\n \"replacement\": \"RadrootsEventStoreError::SourceCapacityExceeded\"\n }\n ]\n },\n \"result_vector\": {\n \"canonical_path\": \"contracts/conformance/vectors/event_store/source_maintenance.v1.json\",\n \"mirror_path\": \"crates/event_store/tests/fixtures/source_maintenance.v1.json\",\n \"byte_length\": 16253,\n \"sha256\": \"997aba2604a2b9d199fb87dc9d07942ca50d91863aeadcf3eeacf16d191dd71f\",\n \"hash_algorithm\": \"sha256_bytes_v1\",\n \"executor_id\": \"radroots_event_store.source_maintenance_v1.result_vector_executor.v1\",\n \"executor_path\": \"crates/event_store/tests/source_maintenance_v1_result_vector.rs\",\n \"executor_test\": \"source_maintenance_v1_result_vector\",\n \"executor_byte_length\": 23510,\n \"executor_sha256\": \"a7487afdfe19fc5fc794811d0f0e6035203e1aabcf0a33a1d398f6b3555d38f3\",\n \"executor_hash_algorithm\": \"sha256_bytes_v1\"\n }\n}\n";
pub(crate) const SOURCE_MAINTENANCE_MANIFEST_BYTE_LENGTH: usize = 31374;
pub(crate) const SOURCE_MAINTENANCE_MANIFEST_SHA256: &str =
- "bf1235f18e9db5c5242ada8b7b3e1413e4d5d3d62d496d2a057744354689b77a";
+ "22cc195ee967cec226d47948f005fa4689da276a00c3bbce187d76b1d7dbf6b4";
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/docs/api/README.md b/docs/api/README.md
@@ -32,3 +32,4 @@ expand a package beyond its charter.
| --- | --- | --- |
| `radroots_core` | [`radroots_core.txt`](radroots_core.txt) | [release V1 specification](../specs/radroots_crates_release_v1.md) |
| `radroots_identity` | [`radroots_identity.txt`](radroots_identity.txt) | [release V1 specification](../specs/radroots_crates_release_v1.md) |
+| `radroots_blossom` | [`radroots_blossom.txt`](radroots_blossom.txt) | [release V1 specification](../specs/radroots_crates_release_v1.md) |
diff --git a/docs/api/radroots_blossom.txt b/docs/api/radroots_blossom.txt
@@ -0,0 +1,348 @@
+pub mod radroots_blossom
+pub mod radroots_blossom::authorization
+pub enum radroots_blossom::authorization::AuthorizationAction
+pub radroots_blossom::authorization::AuthorizationAction::Delete
+pub radroots_blossom::authorization::AuthorizationAction::Get
+pub radroots_blossom::authorization::AuthorizationAction::List
+pub radroots_blossom::authorization::AuthorizationAction::Media
+pub radroots_blossom::authorization::AuthorizationAction::Upload
+impl radroots_blossom::authorization::AuthorizationAction
+pub const fn radroots_blossom::authorization::AuthorizationAction::as_str(self) -> &'static str
+pub fn radroots_blossom::authorization::AuthorizationAction::parse(&str) -> core::result::Result<Self, radroots_blossom::Error>
+impl core::fmt::Display for radroots_blossom::authorization::AuthorizationAction
+pub fn radroots_blossom::authorization::AuthorizationAction::fmt(&self, &mut core::fmt::Formatter<'_>) -> core::fmt::Result
+impl core::str::traits::FromStr for radroots_blossom::authorization::AuthorizationAction
+pub type radroots_blossom::authorization::AuthorizationAction::Err = radroots_blossom::Error
+pub fn radroots_blossom::authorization::AuthorizationAction::from_str(&str) -> core::result::Result<Self, Self::Err>
+pub enum radroots_blossom::authorization::AuthorizationTarget
+pub radroots_blossom::authorization::AuthorizationTarget::DeleteBlob(radroots_blossom::hash::Sha256)
+pub radroots_blossom::authorization::AuthorizationTarget::GetBlob(radroots_blossom::hash::Sha256)
+pub radroots_blossom::authorization::AuthorizationTarget::List
+pub radroots_blossom::authorization::AuthorizationTarget::Media(radroots_blossom::hash::Sha256)
+pub radroots_blossom::authorization::AuthorizationTarget::Mirror(radroots_blossom::hash::Sha256)
+pub radroots_blossom::authorization::AuthorizationTarget::Upload(radroots_blossom::hash::Sha256)
+impl radroots_blossom::authorization::AuthorizationTarget
+pub const fn radroots_blossom::authorization::AuthorizationTarget::action(self) -> radroots_blossom::authorization::AuthorizationAction
+pub const fn radroots_blossom::authorization::AuthorizationTarget::implied_hash(self) -> core::option::Option<radroots_blossom::hash::Sha256>
+pub enum radroots_blossom::authorization::ServerScopeRequirement
+pub radroots_blossom::authorization::ServerScopeRequirement::OptionalAnyMatch
+pub radroots_blossom::authorization::ServerScopeRequirement::RequiredAnyMatch
+pub struct radroots_blossom::authorization::AuthoredUploadClaim
+impl radroots_blossom::authorization::AuthoredUploadClaim
+pub fn radroots_blossom::authorization::AuthoredUploadClaim::content(&self) -> &radroots_blossom::authorization::AuthorizationContent
+pub const fn radroots_blossom::authorization::AuthoredUploadClaim::created_at(&self) -> u64
+pub const fn radroots_blossom::authorization::AuthoredUploadClaim::expiration(&self) -> u64
+pub fn radroots_blossom::authorization::AuthoredUploadClaim::into_wire_parts(self) -> radroots_blossom::authorization::AuthorizationWireParts
+pub const fn radroots_blossom::authorization::AuthoredUploadClaim::lifetime_seconds(&self) -> u64
+pub fn radroots_blossom::authorization::AuthoredUploadClaim::new(radroots_blossom::authorization::AuthorizationContent, radroots_blossom::authorization::ServerDomain, radroots_blossom::hash::Sha256, u64, u64) -> core::result::Result<Self, radroots_blossom::Error>
+pub fn radroots_blossom::authorization::AuthoredUploadClaim::server_domain(&self) -> &radroots_blossom::authorization::ServerDomain
+pub const fn radroots_blossom::authorization::AuthoredUploadClaim::sha256(&self) -> radroots_blossom::hash::Sha256
+pub fn radroots_blossom::authorization::AuthoredUploadClaim::wire_parts(&self) -> &radroots_blossom::authorization::AuthorizationWireParts
+pub struct radroots_blossom::authorization::AuthorizationClaim
+impl radroots_blossom::authorization::AuthorizationClaim
+pub const fn radroots_blossom::authorization::AuthorizationClaim::action(&self) -> radroots_blossom::authorization::AuthorizationAction
+pub fn radroots_blossom::authorization::AuthorizationClaim::content(&self) -> &radroots_blossom::authorization::AuthorizationContent
+pub const fn radroots_blossom::authorization::AuthorizationClaim::created_at(&self) -> u64
+pub const fn radroots_blossom::authorization::AuthorizationClaim::expiration(&self) -> u64
+pub fn radroots_blossom::authorization::AuthorizationClaim::hashes(&self) -> &[radroots_blossom::hash::Sha256]
+pub fn radroots_blossom::authorization::AuthorizationClaim::parse(&str, u64, &[alloc::vec::Vec<alloc::string::String>]) -> core::result::Result<Self, radroots_blossom::Error>
+pub fn radroots_blossom::authorization::AuthorizationClaim::server_domains(&self) -> &[radroots_blossom::authorization::ServerDomain]
+pub fn radroots_blossom::authorization::AuthorizationClaim::validate(&self, &radroots_blossom::authorization::AuthorizationValidation) -> core::result::Result<radroots_blossom::authorization::ValidatedAuthorizationClaim, radroots_blossom::Error>
+pub struct radroots_blossom::authorization::AuthorizationContent(_)
+impl radroots_blossom::authorization::AuthorizationContent
+pub fn radroots_blossom::authorization::AuthorizationContent::as_str(&self) -> &str
+pub fn radroots_blossom::authorization::AuthorizationContent::parse(&str) -> core::result::Result<Self, radroots_blossom::Error>
+impl core::fmt::Display for radroots_blossom::authorization::AuthorizationContent
+pub fn radroots_blossom::authorization::AuthorizationContent::fmt(&self, &mut core::fmt::Formatter<'_>) -> core::fmt::Result
+impl core::str::traits::FromStr for radroots_blossom::authorization::AuthorizationContent
+pub type radroots_blossom::authorization::AuthorizationContent::Err = radroots_blossom::Error
+pub fn radroots_blossom::authorization::AuthorizationContent::from_str(&str) -> core::result::Result<Self, Self::Err>
+pub struct radroots_blossom::authorization::AuthorizationValidation
+impl radroots_blossom::authorization::AuthorizationValidation
+pub fn radroots_blossom::authorization::AuthorizationValidation::bud11(radroots_blossom::authorization::AuthorizationTarget, radroots_blossom::authorization::ServerDomain, u64) -> Self
+pub const fn radroots_blossom::authorization::AuthorizationValidation::max_created_age_seconds(&self) -> core::option::Option<u64>
+pub const fn radroots_blossom::authorization::AuthorizationValidation::max_lifetime_seconds(&self) -> core::option::Option<u64>
+pub fn radroots_blossom::authorization::AuthorizationValidation::new(radroots_blossom::authorization::AuthorizationTarget, radroots_blossom::authorization::ServerDomain, radroots_blossom::authorization::ServerScopeRequirement, u64, u64) -> core::result::Result<Self, radroots_blossom::Error>
+pub const fn radroots_blossom::authorization::AuthorizationValidation::now(&self) -> u64
+pub const fn radroots_blossom::authorization::AuthorizationValidation::server_scope_requirement(&self) -> radroots_blossom::authorization::ServerScopeRequirement
+pub const fn radroots_blossom::authorization::AuthorizationValidation::target(&self) -> radroots_blossom::authorization::AuthorizationTarget
+pub fn radroots_blossom::authorization::AuthorizationValidation::target_server(&self) -> &radroots_blossom::authorization::ServerDomain
+pub struct radroots_blossom::authorization::AuthorizationWireParts
+impl radroots_blossom::authorization::AuthorizationWireParts
+pub fn radroots_blossom::authorization::AuthorizationWireParts::content(&self) -> &str
+pub const fn radroots_blossom::authorization::AuthorizationWireParts::created_at(&self) -> u64
+pub fn radroots_blossom::authorization::AuthorizationWireParts::into_parts(self) -> (u16, u64, alloc::vec::Vec<alloc::vec::Vec<alloc::string::String>>, alloc::string::String)
+pub const fn radroots_blossom::authorization::AuthorizationWireParts::kind(&self) -> u16
+pub fn radroots_blossom::authorization::AuthorizationWireParts::tags(&self) -> &[alloc::vec::Vec<alloc::string::String>]
+pub struct radroots_blossom::authorization::ServerDomain(_)
+impl radroots_blossom::authorization::ServerDomain
+pub fn radroots_blossom::authorization::ServerDomain::as_str(&self) -> &str
+pub fn radroots_blossom::authorization::ServerDomain::parse(&str) -> core::result::Result<Self, radroots_blossom::Error>
+impl core::fmt::Display for radroots_blossom::authorization::ServerDomain
+pub fn radroots_blossom::authorization::ServerDomain::fmt(&self, &mut core::fmt::Formatter<'_>) -> core::fmt::Result
+impl core::str::traits::FromStr for radroots_blossom::authorization::ServerDomain
+pub type radroots_blossom::authorization::ServerDomain::Err = radroots_blossom::Error
+pub fn radroots_blossom::authorization::ServerDomain::from_str(&str) -> core::result::Result<Self, Self::Err>
+pub struct radroots_blossom::authorization::ValidatedAuthorizationClaim
+impl radroots_blossom::authorization::ValidatedAuthorizationClaim
+pub const fn radroots_blossom::authorization::ValidatedAuthorizationClaim::action(&self) -> radroots_blossom::authorization::AuthorizationAction
+pub fn radroots_blossom::authorization::ValidatedAuthorizationClaim::claim(&self) -> &radroots_blossom::authorization::AuthorizationClaim
+pub fn radroots_blossom::authorization::ValidatedAuthorizationClaim::content(&self) -> &radroots_blossom::authorization::AuthorizationContent
+pub const fn radroots_blossom::authorization::ValidatedAuthorizationClaim::created_at(&self) -> u64
+pub const fn radroots_blossom::authorization::ValidatedAuthorizationClaim::expiration(&self) -> u64
+pub fn radroots_blossom::authorization::ValidatedAuthorizationClaim::hashes(&self) -> &[radroots_blossom::hash::Sha256]
+pub fn radroots_blossom::authorization::ValidatedAuthorizationClaim::server_domains(&self) -> &[radroots_blossom::authorization::ServerDomain]
+pub const fn radroots_blossom::authorization::ValidatedAuthorizationClaim::target(&self) -> radroots_blossom::authorization::AuthorizationTarget
+pub fn radroots_blossom::authorization::ValidatedAuthorizationClaim::target_server(&self) -> &radroots_blossom::authorization::ServerDomain
+pub const radroots_blossom::authorization::RADROOTS_BLOSSOM_AUTHORIZATION_EVENT_KIND: u16
+pub const radroots_blossom::authorization::RADROOTS_BLOSSOM_AUTH_CONTENT_MAX_BYTES: usize
+pub const radroots_blossom::authorization::RADROOTS_BLOSSOM_AUTH_MAX_CREATED_AGE_SECONDS: u64
+pub const radroots_blossom::authorization::RADROOTS_BLOSSOM_AUTH_MAX_HORIZON_SECONDS: u64
+pub mod radroots_blossom::descriptor
+pub struct radroots_blossom::descriptor::ApprovedDescriptor
+impl radroots_blossom::descriptor::ApprovedDescriptor
+pub fn radroots_blossom::descriptor::ApprovedDescriptor::descriptor(&self) -> &radroots_blossom::descriptor::BlobDescriptor
+pub fn radroots_blossom::descriptor::ApprovedDescriptor::into_descriptor(self) -> radroots_blossom::descriptor::BlobDescriptor
+pub fn radroots_blossom::descriptor::ApprovedDescriptor::url(&self) -> &radroots_blossom::url::ApprovedBlobUrl
+pub fn radroots_blossom::descriptor::ApprovedDescriptor::verify_bytes(self, &[u8], &radroots_blossom::media_type::MediaType) -> core::result::Result<radroots_blossom::descriptor::ByteVerifiedDescriptor, radroots_blossom::Error>
+pub fn radroots_blossom::descriptor::ApprovedDescriptor::verify_commitment(self, &radroots_blossom::descriptor::ByteCommitment) -> core::result::Result<radroots_blossom::descriptor::ByteVerifiedDescriptor, radroots_blossom::Error>
+pub struct radroots_blossom::descriptor::BlobDescriptor
+impl radroots_blossom::descriptor::BlobDescriptor
+pub fn radroots_blossom::descriptor::BlobDescriptor::approve_reference(self) -> core::result::Result<radroots_blossom::descriptor::ApprovedDescriptor, radroots_blossom::Error>
+pub fn radroots_blossom::descriptor::BlobDescriptor::media_type(&self) -> &radroots_blossom::media_type::MediaType
+pub fn radroots_blossom::descriptor::BlobDescriptor::new(radroots_blossom::url::BlobUrl, radroots_blossom::hash::Sha256, u64, radroots_blossom::media_type::MediaType, u64) -> core::result::Result<Self, radroots_blossom::Error>
+pub const fn radroots_blossom::descriptor::BlobDescriptor::sha256(&self) -> radroots_blossom::hash::Sha256
+pub const fn radroots_blossom::descriptor::BlobDescriptor::size(&self) -> u64
+pub const fn radroots_blossom::descriptor::BlobDescriptor::uploaded(&self) -> u64
+pub fn radroots_blossom::descriptor::BlobDescriptor::url(&self) -> &radroots_blossom::url::BlobUrl
+impl serde_core::ser::Serialize for radroots_blossom::descriptor::BlobDescriptor
+pub fn radroots_blossom::descriptor::BlobDescriptor::serialize<S>(&self, S) -> core::result::Result<<S as serde_core::ser::Serializer>::Ok, <S as serde_core::ser::Serializer>::Error> where S: serde_core::ser::Serializer
+impl<'de> serde_core::de::Deserialize<'de> for radroots_blossom::descriptor::BlobDescriptor
+pub fn radroots_blossom::descriptor::BlobDescriptor::deserialize<D>(D) -> core::result::Result<Self, <D as serde_core::de::Deserializer>::Error> where D: serde_core::de::Deserializer<'de>
+pub struct radroots_blossom::descriptor::ByteCommitment
+impl radroots_blossom::descriptor::ByteCommitment
+pub fn radroots_blossom::descriptor::ByteCommitment::from_bytes(&[u8], radroots_blossom::media_type::MediaType) -> Self
+pub fn radroots_blossom::descriptor::ByteCommitment::media_type(&self) -> &radroots_blossom::media_type::MediaType
+pub const fn radroots_blossom::descriptor::ByteCommitment::sha256(&self) -> radroots_blossom::hash::Sha256
+pub const fn radroots_blossom::descriptor::ByteCommitment::size(&self) -> u64
+pub struct radroots_blossom::descriptor::ByteVerifiedDescriptor(_)
+impl radroots_blossom::descriptor::ByteVerifiedDescriptor
+pub fn radroots_blossom::descriptor::ByteVerifiedDescriptor::descriptor(&self) -> &radroots_blossom::descriptor::BlobDescriptor
+pub fn radroots_blossom::descriptor::ByteVerifiedDescriptor::into_descriptor(self) -> radroots_blossom::descriptor::BlobDescriptor
+pub fn radroots_blossom::descriptor::ByteVerifiedDescriptor::media_type(&self) -> &radroots_blossom::media_type::MediaType
+pub const fn radroots_blossom::descriptor::ByteVerifiedDescriptor::sha256(&self) -> radroots_blossom::hash::Sha256
+pub const fn radroots_blossom::descriptor::ByteVerifiedDescriptor::size(&self) -> u64
+pub fn radroots_blossom::descriptor::ByteVerifiedDescriptor::url(&self) -> &radroots_blossom::url::ApprovedBlobUrl
+pub mod radroots_blossom::hash
+pub struct radroots_blossom::hash::FileExtension(_)
+impl radroots_blossom::hash::FileExtension
+pub fn radroots_blossom::hash::FileExtension::as_str(&self) -> &str
+pub fn radroots_blossom::hash::FileExtension::parse(&str) -> core::result::Result<Self, radroots_blossom::Error>
+impl core::fmt::Display for radroots_blossom::hash::FileExtension
+pub fn radroots_blossom::hash::FileExtension::fmt(&self, &mut core::fmt::Formatter<'_>) -> core::fmt::Result
+impl core::str::traits::FromStr for radroots_blossom::hash::FileExtension
+pub type radroots_blossom::hash::FileExtension::Err = radroots_blossom::Error
+pub fn radroots_blossom::hash::FileExtension::from_str(&str) -> core::result::Result<Self, Self::Err>
+impl serde_core::ser::Serialize for radroots_blossom::hash::FileExtension
+pub fn radroots_blossom::hash::FileExtension::serialize<S>(&self, S) -> core::result::Result<<S as serde_core::ser::Serializer>::Ok, <S as serde_core::ser::Serializer>::Error> where S: serde_core::ser::Serializer
+impl<'de> serde_core::de::Deserialize<'de> for radroots_blossom::hash::FileExtension
+pub fn radroots_blossom::hash::FileExtension::deserialize<D>(D) -> core::result::Result<Self, <D as serde_core::de::Deserializer>::Error> where D: serde_core::de::Deserializer<'de>
+pub struct radroots_blossom::hash::HashPath
+impl radroots_blossom::hash::HashPath
+pub fn radroots_blossom::hash::HashPath::extension(&self) -> core::option::Option<&radroots_blossom::hash::FileExtension>
+pub const fn radroots_blossom::hash::HashPath::hash(&self) -> radroots_blossom::hash::Sha256
+pub fn radroots_blossom::hash::HashPath::new(radroots_blossom::hash::Sha256, core::option::Option<radroots_blossom::hash::FileExtension>) -> Self
+pub fn radroots_blossom::hash::HashPath::parse(&str) -> core::result::Result<Self, radroots_blossom::Error>
+pub fn radroots_blossom::hash::HashPath::to_path(&self) -> alloc::string::String
+impl core::fmt::Display for radroots_blossom::hash::HashPath
+pub fn radroots_blossom::hash::HashPath::fmt(&self, &mut core::fmt::Formatter<'_>) -> core::fmt::Result
+impl core::str::traits::FromStr for radroots_blossom::hash::HashPath
+pub type radroots_blossom::hash::HashPath::Err = radroots_blossom::Error
+pub fn radroots_blossom::hash::HashPath::from_str(&str) -> core::result::Result<Self, Self::Err>
+impl serde_core::ser::Serialize for radroots_blossom::hash::HashPath
+pub fn radroots_blossom::hash::HashPath::serialize<S>(&self, S) -> core::result::Result<<S as serde_core::ser::Serializer>::Ok, <S as serde_core::ser::Serializer>::Error> where S: serde_core::ser::Serializer
+impl<'de> serde_core::de::Deserialize<'de> for radroots_blossom::hash::HashPath
+pub fn radroots_blossom::hash::HashPath::deserialize<D>(D) -> core::result::Result<Self, <D as serde_core::de::Deserializer>::Error> where D: serde_core::de::Deserializer<'de>
+pub struct radroots_blossom::hash::Sha256(_)
+impl radroots_blossom::hash::Sha256
+pub const fn radroots_blossom::hash::Sha256::as_bytes(&self) -> &[u8; 32]
+pub fn radroots_blossom::hash::Sha256::digest(&[u8]) -> Self
+pub const fn radroots_blossom::hash::Sha256::from_bytes([u8; 32]) -> Self
+pub fn radroots_blossom::hash::Sha256::from_hex(&str) -> core::result::Result<Self, radroots_blossom::Error>
+pub fn radroots_blossom::hash::Sha256::to_hex(self) -> alloc::string::String
+impl core::fmt::Display for radroots_blossom::hash::Sha256
+pub fn radroots_blossom::hash::Sha256::fmt(&self, &mut core::fmt::Formatter<'_>) -> core::fmt::Result
+impl core::str::traits::FromStr for radroots_blossom::hash::Sha256
+pub type radroots_blossom::hash::Sha256::Err = radroots_blossom::Error
+pub fn radroots_blossom::hash::Sha256::from_str(&str) -> core::result::Result<Self, Self::Err>
+impl serde_core::ser::Serialize for radroots_blossom::hash::Sha256
+pub fn radroots_blossom::hash::Sha256::serialize<S>(&self, S) -> core::result::Result<<S as serde_core::ser::Serializer>::Ok, <S as serde_core::ser::Serializer>::Error> where S: serde_core::ser::Serializer
+impl<'de> serde_core::de::Deserialize<'de> for radroots_blossom::hash::Sha256
+pub fn radroots_blossom::hash::Sha256::deserialize<D>(D) -> core::result::Result<Self, <D as serde_core::de::Deserializer>::Error> where D: serde_core::de::Deserializer<'de>
+pub mod radroots_blossom::media_type
+pub struct radroots_blossom::media_type::MediaType(_)
+impl radroots_blossom::media_type::MediaType
+pub fn radroots_blossom::media_type::MediaType::as_str(&self) -> &str
+pub fn radroots_blossom::media_type::MediaType::parse(&str) -> core::result::Result<Self, radroots_blossom::Error>
+impl core::fmt::Display for radroots_blossom::media_type::MediaType
+pub fn radroots_blossom::media_type::MediaType::fmt(&self, &mut core::fmt::Formatter<'_>) -> core::fmt::Result
+impl core::str::traits::FromStr for radroots_blossom::media_type::MediaType
+pub type radroots_blossom::media_type::MediaType::Err = radroots_blossom::Error
+pub fn radroots_blossom::media_type::MediaType::from_str(&str) -> core::result::Result<Self, Self::Err>
+impl serde_core::ser::Serialize for radroots_blossom::media_type::MediaType
+pub fn radroots_blossom::media_type::MediaType::serialize<S>(&self, S) -> core::result::Result<<S as serde_core::ser::Serializer>::Ok, <S as serde_core::ser::Serializer>::Error> where S: serde_core::ser::Serializer
+impl<'de> serde_core::de::Deserialize<'de> for radroots_blossom::media_type::MediaType
+pub fn radroots_blossom::media_type::MediaType::deserialize<D>(D) -> core::result::Result<Self, <D as serde_core::de::Deserializer>::Error> where D: serde_core::de::Deserializer<'de>
+pub mod radroots_blossom::url
+pub struct radroots_blossom::url::ApprovedBlobUrl(_)
+impl radroots_blossom::url::ApprovedBlobUrl
+pub fn radroots_blossom::url::ApprovedBlobUrl::as_blob_url(&self) -> &radroots_blossom::url::BlobUrl
+pub fn radroots_blossom::url::ApprovedBlobUrl::as_str(&self) -> &str
+pub fn radroots_blossom::url::ApprovedBlobUrl::into_blob_url(self) -> radroots_blossom::url::BlobUrl
+impl core::fmt::Display for radroots_blossom::url::ApprovedBlobUrl
+pub fn radroots_blossom::url::ApprovedBlobUrl::fmt(&self, &mut core::fmt::Formatter<'_>) -> core::fmt::Result
+pub struct radroots_blossom::url::BlobUrl
+impl radroots_blossom::url::BlobUrl
+pub fn radroots_blossom::url::BlobUrl::approve(self) -> core::result::Result<radroots_blossom::url::ApprovedBlobUrl, radroots_blossom::Error>
+pub fn radroots_blossom::url::BlobUrl::as_str(&self) -> &str
+pub fn radroots_blossom::url::BlobUrl::hash_path(&self) -> &radroots_blossom::hash::HashPath
+pub fn radroots_blossom::url::BlobUrl::host(&self) -> &str
+pub fn radroots_blossom::url::BlobUrl::is_https(&self) -> bool
+pub fn radroots_blossom::url::BlobUrl::is_loopback_http(&self) -> bool
+pub fn radroots_blossom::url::BlobUrl::parse(&str) -> core::result::Result<Self, radroots_blossom::Error>
+pub fn radroots_blossom::url::BlobUrl::port(&self) -> core::option::Option<u16>
+pub fn radroots_blossom::url::BlobUrl::scheme(&self) -> &str
+impl core::fmt::Display for radroots_blossom::url::BlobUrl
+pub fn radroots_blossom::url::BlobUrl::fmt(&self, &mut core::fmt::Formatter<'_>) -> core::fmt::Result
+impl core::str::traits::FromStr for radroots_blossom::url::BlobUrl
+pub type radroots_blossom::url::BlobUrl::Err = radroots_blossom::Error
+pub fn radroots_blossom::url::BlobUrl::from_str(&str) -> core::result::Result<Self, Self::Err>
+impl serde_core::ser::Serialize for radroots_blossom::url::BlobUrl
+pub fn radroots_blossom::url::BlobUrl::serialize<S>(&self, S) -> core::result::Result<<S as serde_core::ser::Serializer>::Ok, <S as serde_core::ser::Serializer>::Error> where S: serde_core::ser::Serializer
+impl<'de> serde_core::de::Deserialize<'de> for radroots_blossom::url::BlobUrl
+pub fn radroots_blossom::url::BlobUrl::deserialize<D>(D) -> core::result::Result<Self, <D as serde_core::de::Deserializer>::Error> where D: serde_core::de::Deserializer<'de>
+#[non_exhaustive] pub enum radroots_blossom::Error
+pub radroots_blossom::Error::AuthorizationActionMismatch
+pub radroots_blossom::Error::AuthorizationCreatedInFuture
+pub radroots_blossom::Error::AuthorizationExpired
+pub radroots_blossom::Error::AuthorizationHashMismatch
+pub radroots_blossom::Error::AuthorizationHashRequired
+pub radroots_blossom::Error::AuthorizationServerMismatch
+pub radroots_blossom::Error::AuthorizationServerRequired
+pub radroots_blossom::Error::AuthorizationStale
+pub radroots_blossom::Error::AuthorizationTimestampOverflow
+pub radroots_blossom::Error::BlobHashMismatch
+pub radroots_blossom::Error::BlobMediaTypeMismatch
+pub radroots_blossom::Error::BlobSizeMismatch
+pub radroots_blossom::Error::BlobSizeMismatch::actual: u64
+pub radroots_blossom::Error::BlobSizeMismatch::expected: u64
+pub radroots_blossom::Error::BlobUrlCredentialsForbidden
+pub radroots_blossom::Error::BlobUrlFragmentForbidden
+pub radroots_blossom::Error::BlobUrlQueryForbidden
+pub radroots_blossom::Error::DescriptorExtensionRequired
+pub radroots_blossom::Error::DescriptorHashMismatch
+pub radroots_blossom::Error::DuplicateAuthorizationActionTag
+pub radroots_blossom::Error::DuplicateAuthorizationExpirationTag
+pub radroots_blossom::Error::InsecureBlobUrl
+pub radroots_blossom::Error::InvalidAuthorizationAction
+pub radroots_blossom::Error::InvalidAuthorizationContent
+pub radroots_blossom::Error::InvalidAuthorizationCreatedAge
+pub radroots_blossom::Error::InvalidAuthorizationLifetime
+pub radroots_blossom::Error::InvalidAuthorizationServerDomain
+pub radroots_blossom::Error::InvalidBlobUrl
+pub radroots_blossom::Error::InvalidFileExtension
+pub radroots_blossom::Error::InvalidHashPath
+pub radroots_blossom::Error::InvalidMediaType
+pub radroots_blossom::Error::InvalidSha256
+pub radroots_blossom::Error::MalformedAuthorizationActionTag
+pub radroots_blossom::Error::MalformedAuthorizationExpirationTag
+pub radroots_blossom::Error::MalformedAuthorizationHashTag
+pub radroots_blossom::Error::MalformedAuthorizationServerTag
+pub radroots_blossom::Error::MissingAuthorizationActionTag
+pub radroots_blossom::Error::MissingAuthorizationExpirationTag
+pub radroots_blossom::Error::UnsupportedBlobUrlScheme
+impl radroots_blossom::Error
+pub const fn radroots_blossom::Error::code(&self) -> &'static str
+impl core::error::Error for radroots_blossom::Error
+impl core::fmt::Display for radroots_blossom::Error
+pub fn radroots_blossom::Error::fmt(&self, &mut core::fmt::Formatter<'_>) -> core::fmt::Result
+pub struct radroots_blossom::AuthorizationClaim
+impl radroots_blossom::authorization::AuthorizationClaim
+pub const fn radroots_blossom::authorization::AuthorizationClaim::action(&self) -> radroots_blossom::authorization::AuthorizationAction
+pub fn radroots_blossom::authorization::AuthorizationClaim::content(&self) -> &radroots_blossom::authorization::AuthorizationContent
+pub const fn radroots_blossom::authorization::AuthorizationClaim::created_at(&self) -> u64
+pub const fn radroots_blossom::authorization::AuthorizationClaim::expiration(&self) -> u64
+pub fn radroots_blossom::authorization::AuthorizationClaim::hashes(&self) -> &[radroots_blossom::hash::Sha256]
+pub fn radroots_blossom::authorization::AuthorizationClaim::parse(&str, u64, &[alloc::vec::Vec<alloc::string::String>]) -> core::result::Result<Self, radroots_blossom::Error>
+pub fn radroots_blossom::authorization::AuthorizationClaim::server_domains(&self) -> &[radroots_blossom::authorization::ServerDomain]
+pub fn radroots_blossom::authorization::AuthorizationClaim::validate(&self, &radroots_blossom::authorization::AuthorizationValidation) -> core::result::Result<radroots_blossom::authorization::ValidatedAuthorizationClaim, radroots_blossom::Error>
+pub struct radroots_blossom::BlobDescriptor
+impl radroots_blossom::descriptor::BlobDescriptor
+pub fn radroots_blossom::descriptor::BlobDescriptor::approve_reference(self) -> core::result::Result<radroots_blossom::descriptor::ApprovedDescriptor, radroots_blossom::Error>
+pub fn radroots_blossom::descriptor::BlobDescriptor::media_type(&self) -> &radroots_blossom::media_type::MediaType
+pub fn radroots_blossom::descriptor::BlobDescriptor::new(radroots_blossom::url::BlobUrl, radroots_blossom::hash::Sha256, u64, radroots_blossom::media_type::MediaType, u64) -> core::result::Result<Self, radroots_blossom::Error>
+pub const fn radroots_blossom::descriptor::BlobDescriptor::sha256(&self) -> radroots_blossom::hash::Sha256
+pub const fn radroots_blossom::descriptor::BlobDescriptor::size(&self) -> u64
+pub const fn radroots_blossom::descriptor::BlobDescriptor::uploaded(&self) -> u64
+pub fn radroots_blossom::descriptor::BlobDescriptor::url(&self) -> &radroots_blossom::url::BlobUrl
+impl serde_core::ser::Serialize for radroots_blossom::descriptor::BlobDescriptor
+pub fn radroots_blossom::descriptor::BlobDescriptor::serialize<S>(&self, S) -> core::result::Result<<S as serde_core::ser::Serializer>::Ok, <S as serde_core::ser::Serializer>::Error> where S: serde_core::ser::Serializer
+impl<'de> serde_core::de::Deserialize<'de> for radroots_blossom::descriptor::BlobDescriptor
+pub fn radroots_blossom::descriptor::BlobDescriptor::deserialize<D>(D) -> core::result::Result<Self, <D as serde_core::de::Deserializer>::Error> where D: serde_core::de::Deserializer<'de>
+pub struct radroots_blossom::BlobUrl
+impl radroots_blossom::url::BlobUrl
+pub fn radroots_blossom::url::BlobUrl::approve(self) -> core::result::Result<radroots_blossom::url::ApprovedBlobUrl, radroots_blossom::Error>
+pub fn radroots_blossom::url::BlobUrl::as_str(&self) -> &str
+pub fn radroots_blossom::url::BlobUrl::hash_path(&self) -> &radroots_blossom::hash::HashPath
+pub fn radroots_blossom::url::BlobUrl::host(&self) -> &str
+pub fn radroots_blossom::url::BlobUrl::is_https(&self) -> bool
+pub fn radroots_blossom::url::BlobUrl::is_loopback_http(&self) -> bool
+pub fn radroots_blossom::url::BlobUrl::parse(&str) -> core::result::Result<Self, radroots_blossom::Error>
+pub fn radroots_blossom::url::BlobUrl::port(&self) -> core::option::Option<u16>
+pub fn radroots_blossom::url::BlobUrl::scheme(&self) -> &str
+impl core::fmt::Display for radroots_blossom::url::BlobUrl
+pub fn radroots_blossom::url::BlobUrl::fmt(&self, &mut core::fmt::Formatter<'_>) -> core::fmt::Result
+impl core::str::traits::FromStr for radroots_blossom::url::BlobUrl
+pub type radroots_blossom::url::BlobUrl::Err = radroots_blossom::Error
+pub fn radroots_blossom::url::BlobUrl::from_str(&str) -> core::result::Result<Self, Self::Err>
+impl serde_core::ser::Serialize for radroots_blossom::url::BlobUrl
+pub fn radroots_blossom::url::BlobUrl::serialize<S>(&self, S) -> core::result::Result<<S as serde_core::ser::Serializer>::Ok, <S as serde_core::ser::Serializer>::Error> where S: serde_core::ser::Serializer
+impl<'de> serde_core::de::Deserialize<'de> for radroots_blossom::url::BlobUrl
+pub fn radroots_blossom::url::BlobUrl::deserialize<D>(D) -> core::result::Result<Self, <D as serde_core::de::Deserializer>::Error> where D: serde_core::de::Deserializer<'de>
+pub struct radroots_blossom::ByteVerifiedDescriptor(_)
+impl radroots_blossom::descriptor::ByteVerifiedDescriptor
+pub fn radroots_blossom::descriptor::ByteVerifiedDescriptor::descriptor(&self) -> &radroots_blossom::descriptor::BlobDescriptor
+pub fn radroots_blossom::descriptor::ByteVerifiedDescriptor::into_descriptor(self) -> radroots_blossom::descriptor::BlobDescriptor
+pub fn radroots_blossom::descriptor::ByteVerifiedDescriptor::media_type(&self) -> &radroots_blossom::media_type::MediaType
+pub const fn radroots_blossom::descriptor::ByteVerifiedDescriptor::sha256(&self) -> radroots_blossom::hash::Sha256
+pub const fn radroots_blossom::descriptor::ByteVerifiedDescriptor::size(&self) -> u64
+pub fn radroots_blossom::descriptor::ByteVerifiedDescriptor::url(&self) -> &radroots_blossom::url::ApprovedBlobUrl
+pub struct radroots_blossom::MediaType(_)
+impl radroots_blossom::media_type::MediaType
+pub fn radroots_blossom::media_type::MediaType::as_str(&self) -> &str
+pub fn radroots_blossom::media_type::MediaType::parse(&str) -> core::result::Result<Self, radroots_blossom::Error>
+impl core::fmt::Display for radroots_blossom::media_type::MediaType
+pub fn radroots_blossom::media_type::MediaType::fmt(&self, &mut core::fmt::Formatter<'_>) -> core::fmt::Result
+impl core::str::traits::FromStr for radroots_blossom::media_type::MediaType
+pub type radroots_blossom::media_type::MediaType::Err = radroots_blossom::Error
+pub fn radroots_blossom::media_type::MediaType::from_str(&str) -> core::result::Result<Self, Self::Err>
+impl serde_core::ser::Serialize for radroots_blossom::media_type::MediaType
+pub fn radroots_blossom::media_type::MediaType::serialize<S>(&self, S) -> core::result::Result<<S as serde_core::ser::Serializer>::Ok, <S as serde_core::ser::Serializer>::Error> where S: serde_core::ser::Serializer
+impl<'de> serde_core::de::Deserialize<'de> for radroots_blossom::media_type::MediaType
+pub fn radroots_blossom::media_type::MediaType::deserialize<D>(D) -> core::result::Result<Self, <D as serde_core::de::Deserializer>::Error> where D: serde_core::de::Deserializer<'de>
+pub struct radroots_blossom::Sha256(_)
+impl radroots_blossom::hash::Sha256
+pub const fn radroots_blossom::hash::Sha256::as_bytes(&self) -> &[u8; 32]
+pub fn radroots_blossom::hash::Sha256::digest(&[u8]) -> Self
+pub const fn radroots_blossom::hash::Sha256::from_bytes([u8; 32]) -> Self
+pub fn radroots_blossom::hash::Sha256::from_hex(&str) -> core::result::Result<Self, radroots_blossom::Error>
+pub fn radroots_blossom::hash::Sha256::to_hex(self) -> alloc::string::String
+impl core::fmt::Display for radroots_blossom::hash::Sha256
+pub fn radroots_blossom::hash::Sha256::fmt(&self, &mut core::fmt::Formatter<'_>) -> core::fmt::Result
+impl core::str::traits::FromStr for radroots_blossom::hash::Sha256
+pub type radroots_blossom::hash::Sha256::Err = radroots_blossom::Error
+pub fn radroots_blossom::hash::Sha256::from_str(&str) -> core::result::Result<Self, Self::Err>
+impl serde_core::ser::Serialize for radroots_blossom::hash::Sha256
+pub fn radroots_blossom::hash::Sha256::serialize<S>(&self, S) -> core::result::Result<<S as serde_core::ser::Serializer>::Ok, <S as serde_core::ser::Serializer>::Error> where S: serde_core::ser::Serializer
+impl<'de> serde_core::de::Deserialize<'de> for radroots_blossom::hash::Sha256
+pub fn radroots_blossom::hash::Sha256::deserialize<D>(D) -> core::result::Result<Self, <D as serde_core::de::Deserializer>::Error> where D: serde_core::de::Deserializer<'de>
diff --git a/tools/xtask/src/contract/nip09_reconciliation.rs b/tools/xtask/src/contract/nip09_reconciliation.rs
@@ -5240,7 +5240,13 @@ fn validate_raw_crate_attributes(relative: &str, source: &str) -> Result<(), Str
"#![cfg_attr(all(not(feature=\"std\"),not(test)),no_std)]",
"#![forbid(unsafe_code)]",
],
- "crates/event_codec/src/lib.rs" | "crates/blossom/src/lib.rs" => &[
+ "crates/event_codec/src/lib.rs" => &[
+ "#![cfg_attr(not(feature=\"std\"),no_std)]",
+ "#![cfg_attr(coverage_nightly,feature(coverage_attribute))]",
+ "#![forbid(unsafe_code)]",
+ ],
+ "crates/blossom/src/lib.rs" => &[
+ "#![doc=include_str!(\"../README.md\")]",
"#![cfg_attr(not(feature=\"std\"),no_std)]",
"#![cfg_attr(coverage_nightly,feature(coverage_attribute))]",
"#![forbid(unsafe_code)]",