lib

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

commit a8487b1d3f5ee1d1086ebd03a91b14e99e303ef2
parent 122d089ddbc09269dd79e59a811bb531a163d4b4
Author: triesap <tyson@radroots.org>
Date:   Mon, 27 Jul 2026 19:00:35 +0000

workspace: correct crate names to snake case

- rename all seventeen public package identities to snake case
- add exact workspace entries for every final local package
- align release contracts, lock resolution, docs, and architecture fixtures
- refresh synchronized specs and generated source-maintenance artifacts

Diffstat:
MAGENTS.md | 2+-
MCONTRIBUTING.md | 4++--
MCargo.lock | 354++++++++++++++++++++++++++++++++++++++++----------------------------------------
MCargo.toml | 27+++++++++++++++++----------
Mbuild/nix/checks.nix | 22+++++++++++-----------
Mbuild/nix/common.nix | 16++++++++--------
Mcontracts/coverage-profiles.toml | 4++--
Mcontracts/coverage.toml | 34+++++++++++++++++-----------------
Mcontracts/releases/api_boundaries.toml | 48++++++++++++++++++++++++------------------------
Mcontracts/releases/package_tiers.toml | 40++++++++++++++++++++--------------------
Mcontracts/releases/publish_policy.toml | 72++++++++++++++++++++++++++++++++++++------------------------------------
Mcrates/blossom/Cargo.toml | 4++--
Mcrates/blossom/README.md | 2+-
Mcrates/core/Cargo.toml | 4++--
Mcrates/core/README.md | 12++++++------
Mcrates/event/Cargo.toml | 4++--
Mcrates/event/README.md | 2+-
Mcrates/event_codec/Cargo.toml | 4++--
Mcrates/event_codec/README.md | 2+-
Mcrates/event_store/contracts/source_maintenance_v1.manifest.json | 8++++----
Mcrates/event_store/contracts/source_maintenance_v1.manifest.sha256 | 2+-
Mcrates/event_store/src/generated/source_maintenance_manifest.rs | 4++--
Mcrates/geonames/Cargo.toml | 2+-
Mcrates/geonames/README.md | 2+-
Mcrates/identity/Cargo.toml | 4++--
Mcrates/identity/README.md | 2+-
Mcrates/nostr/Cargo.toml | 4++--
Mcrates/nostr/README.md | 2+-
Mcrates/nostr_connect/Cargo.toml | 4++--
Mcrates/nostr_connect/README.md | 2+-
Mcrates/protocol/Cargo.toml | 2+-
Mcrates/protocol/README.md | 2+-
Mcrates/secrets/Cargo.toml | 2+-
Mcrates/secrets/README.md | 2+-
Mcrates/signing/Cargo.toml | 2+-
Mcrates/signing/README.md | 2+-
Mcrates/storage/Cargo.toml | 2+-
Mcrates/storage/README.md | 2+-
Mcrates/storage_sqlite/Cargo.toml | 2+-
Mcrates/storage_sqlite/README.md | 2+-
Mcrates/sync/Cargo.toml | 2+-
Mcrates/sync/README.md | 2+-
Mcrates/trade/Cargo.toml | 4++--
Mcrates/trade/README.md | 2+-
Mcrates/transport/Cargo.toml | 2+-
Mcrates/transport/README.md | 2+-
Mcrates/transport_nostr/Cargo.toml | 2+-
Mcrates/transport_nostr/README.md | 2+-
Mdocs/api/README.md | 2+-
Mdocs/implementation/TRACEABILITY.md | 14+++++++-------
Mdocs/migration/identity.md | 16++++++++--------
Mdocs/specs/README.md | 6+++---
Mdocs/specs/radroots_crates_release_v1.dot | 180++++++++++++++++++++++++++++++++++++++++----------------------------------------
Mdocs/specs/radroots_crates_release_v1.md | 562++++++++++++++++++++++++++++++++++++++++----------------------------------------
Mdocs/specs/radroots_crates_release_v1.sha256 | 8++++----
Mdocs/specs/radroots_crates_release_v1.toml | 202++++++++++++++++++++++++++++++++++++++++----------------------------------------
Mdocs/specs/radroots_crates_release_v1_inventory.csv | 38+++++++++++++++++++-------------------
Mtools/xtask/src/architecture.rs | 11+++++------
Mtools/xtask/src/architecture/api_leakage.rs | 12++++++------
Mtools/xtask/src/architecture/core_contract.rs | 42+++++++++++++++++++++---------------------
Mtools/xtask/src/architecture/dependency_boundary.rs | 18+++++++++---------
Mtools/xtask/src/contract/food_availability_projection.rs | 2+-
Mtools/xtask/src/contract/nip09_reconciliation.rs | 22+++++++++++-----------
Mtools/xtask/src/coverage.rs | 14+++++++-------
Mtools/xtask/tests/fixtures/dependency-boundaries/domain-to-storage.json | 16++++++++--------
Mtools/xtask/tests/fixtures/dependency-boundaries/service-to-sdk.json | 16++++++++--------
Mtools/xtask/tests/fixtures/dependency-boundaries/spi-to-adapter.json | 16++++++++--------
Mtools/xtask/tests/fixtures/dependency-boundaries/valid-downward.json | 16++++++++--------
68 files changed, 975 insertions(+), 969 deletions(-)

diff --git a/AGENTS.md b/AGENTS.md @@ -85,7 +85,7 @@ Before editing code: - Behavior changes that affect public surfaces must update the relevant contract metadata, conformance vectors, export rules, or validation flows in the same change. - Keep pure flake checks and repo-aware command apps aligned with the documented Nix command map. - This repository owns packages 1-17 in `radroots.crates.release.v1`, from - `radroots-core` through `radroots-geonames`. `radroots-sdk` and `radroots` + `radroots_core` through `radroots_geonames`. `radroots_sdk` and `radroots` remain owned by the standalone SDK repository. - Public packages have no dependency on private Radroots packages. Every Radroots dependency edge points downward in the approved graph. diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md @@ -10,8 +10,8 @@ reviewable. Before editing, read these files in order: 5. the affected manifests, implementation, contracts, and tests The release-v1 architecture identifier is `radroots.crates.release.v1`. This -repository owns its first 17 public packages, from `radroots-core` through -`radroots-geonames`; the standalone SDK repository owns `radroots-sdk` and +repository owns its first 17 public packages, from `radroots_core` through +`radroots_geonames`; the standalone SDK repository owns `radroots_sdk` and `radroots`. ## Workflow diff --git a/Cargo.lock b/Cargo.lock @@ -4495,7 +4495,16 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dc33ff2d4973d518d823d61aa239014831e521c75da58e3df4840d3f47749d09" [[package]] -name = "radroots-blossom" +name = "radroots_authority" +version = "1.0.0-alpha.1" +dependencies = [ + "radroots_event", + "radroots_nostr", + "serde_json", +] + +[[package]] +name = "radroots_blossom" version = "0.1.0" dependencies = [ "hex", @@ -4508,7 +4517,7 @@ dependencies = [ ] [[package]] -name = "radroots-core" +name = "radroots_core" version = "0.1.0" dependencies = [ "dto_bindgen", @@ -4518,14 +4527,14 @@ dependencies = [ ] [[package]] -name = "radroots-event" +name = "radroots_event" version = "0.1.0" dependencies = [ "dto_bindgen", "hex", "jiff-tzdb", - "radroots-blossom", - "radroots-core", + "radroots_blossom", + "radroots_core", "secp256k1", "serde", "serde_json", @@ -4535,155 +4544,18 @@ dependencies = [ ] [[package]] -name = "radroots-event-codec" -version = "0.1.0" -dependencies = [ - "hex", - "nostr", - "radroots-blossom", - "radroots-core", - "radroots-event", - "radroots_test_fixtures", - "serde", - "serde_json", - "sha2", -] - -[[package]] -name = "radroots-geonames" -version = "0.1.0" - -[[package]] -name = "radroots-identity" -version = "0.1.0" -dependencies = [ - "k256", - "radroots_protected_store", - "radroots_runtime", - "radroots_runtime_paths", - "radroots_secret_vault", - "serde", - "serde_json", - "tempfile", - "thiserror 2.0.18", - "tracing", -] - -[[package]] -name = "radroots-nostr" -version = "0.1.0" -dependencies = [ - "base64 0.22.1", - "nostr", - "nostr-sdk", - "radroots-blossom", - "radroots-event", - "radroots-event-codec", - "radroots-identity", - "radroots_test_fixtures", - "reqwest", - "serde", - "serde_json", - "thiserror 1.0.69", - "tokio", -] - -[[package]] -name = "radroots-nostr-connect" -version = "0.1.0" -dependencies = [ - "nostr", - "serde", - "serde_json", - "thiserror 1.0.69", - "tokio", - "url", -] - -[[package]] -name = "radroots-protocol" -version = "0.1.0" - -[[package]] -name = "radroots-secrets" -version = "0.1.0" - -[[package]] -name = "radroots-signing" -version = "0.1.0" - -[[package]] -name = "radroots-storage" -version = "0.1.0" - -[[package]] -name = "radroots-storage-sqlite" -version = "0.1.0" - -[[package]] -name = "radroots-sync" -version = "0.1.0" - -[[package]] -name = "radroots-trade" +name = "radroots_event_codec" version = "0.1.0" dependencies = [ - "base64 0.22.1", - "dto_bindgen", - "dto_bindgen_core", "hex", "nostr", - "radroots-core", - "radroots-event", - "radroots-event-codec", - "radroots-nostr", - "radroots-transport", - "radroots_authority", - "radroots_event_store", + "radroots_blossom", + "radroots_core", + "radroots_event", "radroots_test_fixtures", "serde", "serde_json", "sha2", - "sqlx", - "thiserror 1.0.69", - "tokio", -] - -[[package]] -name = "radroots-transport" -version = "0.1.0" -dependencies = [ - "futures", - "serde", - "serde_json", - "sha2", -] - -[[package]] -name = "radroots-transport-nostr" -version = "0.1.0" -dependencies = [ - "futures", - "nostr", - "radroots-event", - "radroots-nostr", - "radroots-transport", - "radroots_event_store", - "radroots_outbox", - "serde", - "serde_json", - "thiserror 1.0.69", - "tokio", - "url", -] - -[[package]] -name = "radroots_authority" -version = "1.0.0-alpha.1" -dependencies = [ - "radroots-event", - "radroots-nostr", - "serde_json", ] [[package]] @@ -4703,10 +4575,10 @@ dependencies = [ "getrandom 0.2.17", "hex", "nostr", - "radroots-blossom", - "radroots-event", - "radroots-event-codec", - "radroots-transport", + "radroots_blossom", + "radroots_event", + "radroots_event_codec", + "radroots_transport", "serde", "serde_json", "sha2", @@ -4734,6 +4606,26 @@ dependencies = [ ] [[package]] +name = "radroots_geonames" +version = "0.1.0" + +[[package]] +name = "radroots_identity" +version = "0.1.0" +dependencies = [ + "k256", + "radroots_protected_store", + "radroots_runtime", + "radroots_runtime_paths", + "radroots_secret_vault", + "serde", + "serde_json", + "tempfile", + "thiserror 2.0.18", + "tracing", +] + +[[package]] name = "radroots_log" version = "1.0.0-alpha.1" dependencies = [ @@ -4749,7 +4641,7 @@ dependencies = [ name = "radroots_mesh" version = "1.0.0-alpha.1" dependencies = [ - "radroots-transport", + "radroots_transport", "serde", "serde_json", ] @@ -4758,9 +4650,9 @@ dependencies = [ name = "radroots_mesh_agent_client" version = "1.0.0-alpha.1" dependencies = [ - "radroots-transport", "radroots_mesh", "radroots_mesh_agent_proto", + "radroots_transport", "serde", "serde_json", ] @@ -4779,11 +4671,11 @@ dependencies = [ "directories", "futures", "hex", - "radroots-event", - "radroots-event-codec", - "radroots-identity", - "radroots-nostr", + "radroots_event", + "radroots_event_codec", + "radroots_identity", "radroots_log", + "radroots_nostr", "radroots_nostr_accounts", "radroots_nostr_signer", "radroots_runtime_paths", @@ -4797,10 +4689,29 @@ dependencies = [ ] [[package]] +name = "radroots_nostr" +version = "0.1.0" +dependencies = [ + "base64 0.22.1", + "nostr", + "nostr-sdk", + "radroots_blossom", + "radroots_event", + "radroots_event_codec", + "radroots_identity", + "radroots_test_fixtures", + "reqwest", + "serde", + "serde_json", + "thiserror 1.0.69", + "tokio", +] + +[[package]] name = "radroots_nostr_accounts" version = "1.0.0-alpha.1" dependencies = [ - "radroots-identity", + "radroots_identity", "radroots_nostr_signer", "radroots_nostrdb", "radroots_protected_store", @@ -4814,12 +4725,24 @@ dependencies = [ ] [[package]] +name = "radroots_nostr_connect" +version = "0.1.0" +dependencies = [ + "nostr", + "serde", + "serde_json", + "thiserror 1.0.69", + "tokio", + "url", +] + +[[package]] name = "radroots_nostr_runtime" version = "1.0.0-alpha.1" dependencies = [ "futures", "nostr", - "radroots-nostr", + "radroots_nostr", "thiserror 1.0.69", "tokio", ] @@ -4830,9 +4753,9 @@ version = "1.0.0-alpha.1" dependencies = [ "hex", "nostr", - "radroots-identity", - "radroots-nostr", - "radroots-nostr-connect", + "radroots_identity", + "radroots_nostr", + "radroots_nostr_connect", "radroots_runtime", "radroots_sql_core", "serde", @@ -4852,7 +4775,7 @@ dependencies = [ "hex", "nostr", "nostrdb", - "radroots-nostr", + "radroots_nostr", "radroots_nostr_runtime", "serde_json", "tempfile", @@ -4865,10 +4788,10 @@ name = "radroots_outbox" version = "1.0.0-alpha.1" dependencies = [ "hex", - "radroots-event", - "radroots-nostr", - "radroots-transport", + "radroots_event", "radroots_event_store", + "radroots_nostr", + "radroots_transport", "serde", "serde_json", "sha2", @@ -4892,6 +4815,10 @@ dependencies = [ ] [[package]] +name = "radroots_protocol" +version = "0.1.0" + +[[package]] name = "radroots_protocol_contract_v1" version = "1.0.0-alpha.1" dependencies = [ @@ -4927,10 +4854,10 @@ dependencies = [ "base64 0.22.1", "hex", "nostr", - "radroots-core", - "radroots-event", - "radroots-event-codec", - "radroots-nostr", + "radroots_core", + "radroots_event", + "radroots_event_codec", + "radroots_nostr", "radroots_replica_schema", "radroots_replica_store", "radroots_sql_core", @@ -4950,12 +4877,12 @@ dependencies = [ "clap", "config", "getrandom 0.2.17", - "radroots-event", - "radroots-transport", + "radroots_event", "radroots_log", "radroots_protected_store", "radroots_runtime_paths", "radroots_secret_vault", + "radroots_transport", "radroots_transport_reticulum", "serde", "serde_json", @@ -5015,6 +4942,14 @@ dependencies = [ ] [[package]] +name = "radroots_secrets" +version = "0.1.0" + +[[package]] +name = "radroots_signing" +version = "0.1.0" + +[[package]] name = "radroots_simplex_agent_proto" version = "1.0.0-alpha.1" dependencies = [ @@ -5141,10 +5076,47 @@ dependencies = [ ] [[package]] +name = "radroots_storage" +version = "0.1.0" + +[[package]] +name = "radroots_storage_sqlite" +version = "0.1.0" + +[[package]] +name = "radroots_sync" +version = "0.1.0" + +[[package]] name = "radroots_test_fixtures" version = "1.0.0-alpha.1" dependencies = [ - "radroots-event", + "radroots_event", +] + +[[package]] +name = "radroots_trade" +version = "0.1.0" +dependencies = [ + "base64 0.22.1", + "dto_bindgen", + "dto_bindgen_core", + "hex", + "nostr", + "radroots_authority", + "radroots_core", + "radroots_event", + "radroots_event_codec", + "radroots_event_store", + "radroots_nostr", + "radroots_test_fixtures", + "radroots_transport", + "serde", + "serde_json", + "sha2", + "sqlx", + "thiserror 1.0.69", + "tokio", ] [[package]] @@ -5165,8 +5137,8 @@ dependencies = [ "base64 0.22.1", "bincode", "futures", - "radroots-event", - "radroots-trade", + "radroots_event", + "radroots_trade", "radroots_trade_sp1_guest", "serde", "serde_json", @@ -5178,10 +5150,38 @@ dependencies = [ ] [[package]] +name = "radroots_transport" +version = "0.1.0" +dependencies = [ + "futures", + "serde", + "serde_json", + "sha2", +] + +[[package]] +name = "radroots_transport_nostr" +version = "0.1.0" +dependencies = [ + "futures", + "nostr", + "radroots_event", + "radroots_event_store", + "radroots_nostr", + "radroots_outbox", + "radroots_transport", + "serde", + "serde_json", + "thiserror 1.0.69", + "tokio", + "url", +] + +[[package]] name = "radroots_transport_publish_protocol" version = "1.0.0-alpha.1" dependencies = [ - "radroots-transport", + "radroots_transport", "serde", "serde_json", ] @@ -5191,7 +5191,7 @@ name = "radroots_transport_reticulum" version = "1.0.0-alpha.1" dependencies = [ "futures", - "radroots-transport", + "radroots_transport", "serde", "serde_json", ] @@ -9019,7 +9019,7 @@ dependencies = [ "prettyplease", "proc-macro2", "quote", - "radroots-event-codec", + "radroots_event_codec", "radroots_protocol_contract_v1", "semver", "serde", diff --git a/Cargo.toml b/Cargo.toml @@ -91,21 +91,22 @@ unimplemented = "deny" [workspace.dependencies] dto_bindgen = { version = "0.1.0" } dto_bindgen_core = { version = "0.1.0" } -radroots_core = { package = "radroots-core", path = "crates/core", version = "=0.1.0", default-features = false } -radroots_event = { package = "radroots-event", path = "crates/event", version = "=0.1.0", default-features = false } +radroots_core = { package = "radroots_core", path = "crates/core", version = "=0.1.0", default-features = false } +radroots_event = { package = "radroots_event", path = "crates/event", version = "=0.1.0", default-features = false } radroots_event_store = { path = "crates/event_store", version = "=1.0.0-alpha.1", default-features = false } -radroots_event_codec = { package = "radroots-event-codec", path = "crates/event_codec", version = "=0.1.0", default-features = false } +radroots_event_codec = { package = "radroots_event_codec", path = "crates/event_codec", version = "=0.1.0", default-features = false } radroots_event_index = { path = "crates/event_index", version = "=1.0.0-alpha.1", default-features = false } radroots_authority = { path = "crates/authority", version = "=1.0.0-alpha.1", default-features = false } -radroots_blossom = { package = "radroots-blossom", path = "crates/blossom", version = "=0.1.0", default-features = false } +radroots_blossom = { package = "radroots_blossom", path = "crates/blossom", version = "=0.1.0", default-features = false } radroots_geocoder = { path = "crates/geocoder", version = "=1.0.0-alpha.1" } -radroots_identity = { package = "radroots-identity", path = "crates/identity", version = "=0.1.0", default-features = false } +radroots_identity = { package = "radroots_identity", path = "crates/identity", version = "=0.1.0", default-features = false } radroots_runtime_store = { path = "crates/runtime_store", version = "=1.0.0-alpha.1", default-features = false } -radroots_nostr = { package = "radroots-nostr", path = "crates/nostr", version = "=0.1.0", default-features = false } +radroots_nostr = { package = "radroots_nostr", path = "crates/nostr", version = "=0.1.0", default-features = false } radroots_nostr_accounts = { path = "crates/nostr_accounts", version = "=1.0.0-alpha.1", default-features = false } -radroots_nostr_connect = { package = "radroots-nostr-connect", path = "crates/nostr_connect", version = "=0.1.0", default-features = false } +radroots_nostr_connect = { package = "radroots_nostr_connect", path = "crates/nostr_connect", version = "=0.1.0", default-features = false } radroots_nostr_signer = { path = "crates/nostr_signer", version = "=1.0.0-alpha.1", default-features = false } radroots_nostrdb = { path = "crates/nostrdb", version = "=1.0.0-alpha.1", default-features = false } +radroots_protocol = { package = "radroots_protocol", path = "crates/protocol", version = "=0.1.0", default-features = false } radroots_runtime = { path = "crates/runtime", version = "=1.0.0-alpha.1", default-features = false } radroots_runtime_paths = { path = "crates/runtime_paths", version = "=1.0.0-alpha.1", default-features = false } radroots_runtime_distribution = { path = "crates/runtime_distribution", version = "=1.0.0-alpha.1", default-features = false } @@ -116,7 +117,7 @@ radroots_nostr_runtime = { path = "crates/nostr_runtime", version = "=1.0.0-alph radroots_outbox = { path = "crates/outbox", version = "=1.0.0-alpha.1", default-features = false } radroots_protocol_contract_v1 = { path = "crates/protocol_contract_v1", version = "=1.0.0-alpha.1", default-features = false } radroots_transport_publish_protocol = { path = "crates/transport_publish_protocol", version = "=1.0.0-alpha.1", default-features = false } -radroots_transport_nostr = { package = "radroots-transport-nostr", path = "crates/transport_nostr", version = "=0.1.0", default-features = false } +radroots_transport_nostr = { package = "radroots_transport_nostr", path = "crates/transport_nostr", version = "=0.1.0", default-features = false } radroots_transport_reticulum = { path = "crates/transport_reticulum", version = "=1.0.0-alpha.1", default-features = false } radroots_simplex_agent_proto = { path = "crates/simplex_agent_proto", version = "=1.0.0-alpha.1", default-features = false } radroots_simplex_agent_runtime = { path = "crates/simplex_agent_runtime", version = "=1.0.0-alpha.1", default-features = false } @@ -131,8 +132,14 @@ radroots_test_fixtures = { path = "crates/test_fixtures", version = "=1.0.0-alph radroots_replica_schema = { path = "crates/replica_schema", version = "=1.0.0-alpha.1", default-features = false } radroots_replica_sync = { path = "crates/replica_sync", version = "=1.0.0-alpha.1", default-features = false } radroots_replica_store = { path = "crates/replica_store", version = "=1.0.0-alpha.1", default-features = false } -radroots_trade = { package = "radroots-trade", path = "crates/trade", version = "=0.1.0", default-features = false } -radroots_transport = { package = "radroots-transport", path = "crates/transport", version = "=0.1.0", default-features = false } +radroots_geonames = { package = "radroots_geonames", path = "crates/geonames", version = "=0.1.0", default-features = false } +radroots_secrets = { package = "radroots_secrets", path = "crates/secrets", version = "=0.1.0", default-features = false } +radroots_signing = { package = "radroots_signing", path = "crates/signing", version = "=0.1.0", default-features = false } +radroots_storage = { package = "radroots_storage", path = "crates/storage", version = "=0.1.0", default-features = false } +radroots_storage_sqlite = { package = "radroots_storage_sqlite", path = "crates/storage_sqlite", version = "=0.1.0", default-features = false } +radroots_sync = { package = "radroots_sync", path = "crates/sync", version = "=0.1.0", default-features = false } +radroots_trade = { package = "radroots_trade", path = "crates/trade", version = "=0.1.0", default-features = false } +radroots_transport = { package = "radroots_transport", path = "crates/transport", version = "=0.1.0", default-features = false } radroots_mesh = { path = "crates/mesh", version = "=1.0.0-alpha.1", default-features = false } radroots_mesh_agent_client = { path = "crates/mesh_agent_client", version = "=1.0.0-alpha.1", default-features = false } radroots_mesh_agent_proto = { path = "crates/mesh_agent_proto", version = "=1.0.0-alpha.1", default-features = false } diff --git a/build/nix/checks.nix b/build/nix/checks.nix @@ -32,17 +32,17 @@ let pname = "radroots-core-conformance"; doCheck = false; buildPhaseCargoCommand = '' - cargo check -p radroots-core --all-targets --no-default-features --locked - cargo check -p radroots-core --all-targets --no-default-features --features std --locked - cargo check -p radroots-core --all-targets --no-default-features --features serde --locked - cargo check -p radroots-core --all-targets --locked - cargo check -p radroots-core --all-targets --all-features --locked - cargo clippy -p radroots-core --all-targets --all-features --locked -- -D warnings - cargo test -p radroots-core --all-targets --all-features --locked - cargo check -p radroots-core --no-default-features --target wasm32-unknown-unknown --locked - cargo check -p radroots-core --no-default-features --features serde --target wasm32-unknown-unknown --locked - RUSTDOCFLAGS="-D warnings" cargo doc -p radroots-core --all-features --no-deps --locked - cargo test -p radroots-core --all-features --doc --locked + cargo check -p radroots_core --all-targets --no-default-features --locked + cargo check -p radroots_core --all-targets --no-default-features --features std --locked + cargo check -p radroots_core --all-targets --no-default-features --features serde --locked + cargo check -p radroots_core --all-targets --locked + cargo check -p radroots_core --all-targets --all-features --locked + cargo clippy -p radroots_core --all-targets --all-features --locked -- -D warnings + cargo test -p radroots_core --all-targets --all-features --locked + cargo check -p radroots_core --no-default-features --target wasm32-unknown-unknown --locked + cargo check -p radroots_core --no-default-features --features serde --target wasm32-unknown-unknown --locked + RUSTDOCFLAGS="-D warnings" cargo doc -p radroots_core --all-features --no-deps --locked + cargo test -p radroots_core --all-features --doc --locked ''; installPhaseCommand = "mkdir -p $out"; } diff --git a/build/nix/common.nix b/build/nix/common.nix @@ -95,16 +95,16 @@ let releaseRuntimeInputs = coverageRuntimeInputs; coreContractCrates = [ "xtask" - "radroots-blossom" - "radroots-core" - "radroots-event" - "radroots-trade" - "radroots-identity" + "radroots_blossom" + "radroots_core" + "radroots_event" + "radroots_trade" + "radroots_identity" "radroots_replica_schema" - "radroots-event-codec" + "radroots_event_codec" "radroots_event_store" - "radroots-nostr" - "radroots-nostr-connect" + "radroots_nostr" + "radroots_nostr_connect" "radroots_nostr_signer" ]; coreContractCargoArgs = diff --git a/contracts/coverage-profiles.toml b/contracts/coverage-profiles.toml @@ -8,7 +8,7 @@ no_default_features = true features = [] test_threads = 1 -[profiles.crates."radroots-event-codec"] +[profiles.crates."radroots_event_codec"] no_default_features = false features = ["serde_json", "nostr"] test_threads = 1 @@ -18,7 +18,7 @@ no_default_features = true features = ["std"] test_threads = 1 -[profiles.crates."radroots-nostr"] +[profiles.crates."radroots_nostr"] no_default_features = false features = ["blossom"] test_threads = 1 diff --git a/contracts/coverage.toml b/contracts/coverage.toml @@ -32,24 +32,24 @@ reason = "branch coverage is not applicable while the crate has no measured bran [required] crates = [ "radroots_authority", - "radroots-blossom", - "radroots-core", + "radroots_blossom", + "radroots_core", "radroots_event_store", - "radroots-event", - "radroots-event-codec", + "radroots_event", + "radroots_event_codec", "radroots_event_index", "radroots_geocoder", - "radroots-geonames", - "radroots-identity", + "radroots_geonames", + "radroots_identity", "radroots_runtime_store", "radroots_log", "radroots_mesh", "radroots_mesh_agent_client", "radroots_mesh_agent_proto", "radroots_net", - "radroots-nostr", + "radroots_nostr", "radroots_nostr_accounts", - "radroots-nostr-connect", + "radroots_nostr_connect", "radroots_nostrdb", "radroots_nostr_runtime", "radroots_nostr_signer", @@ -57,13 +57,13 @@ crates = [ "radroots_protocol_contract_v1", "radroots_protected_store", "radroots_transport_publish_protocol", - "radroots-protocol", - "radroots-secrets", - "radroots-signing", - "radroots-storage", - "radroots-storage-sqlite", - "radroots-sync", - "radroots-transport-nostr", + "radroots_protocol", + "radroots_secrets", + "radroots_signing", + "radroots_storage", + "radroots_storage_sqlite", + "radroots_sync", + "radroots_transport_nostr", "radroots_transport_reticulum", "radroots_replica_store", "radroots_replica_schema", @@ -77,7 +77,7 @@ crates = [ "radroots_trade_sp1_host", "radroots_sql_core", "radroots_test_fixtures", - "radroots-trade", - "radroots-transport", + "radroots_trade", + "radroots_transport", "xtask", ] diff --git a/contracts/releases/api_boundaries.toml b/contracts/releases/api_boundaries.toml @@ -23,75 +23,75 @@ forbidden_public_paths = [ ] [[package]] -name = "radroots-core" +name = "radroots_core" allowed_public_paths = [] [[package]] -name = "radroots-identity" +name = "radroots_identity" allowed_public_paths = [] [[package]] -name = "radroots-blossom" +name = "radroots_blossom" allowed_public_paths = [] [[package]] -name = "radroots-protocol" +name = "radroots_protocol" allowed_public_paths = [] [[package]] -name = "radroots-event" +name = "radroots_event" allowed_public_paths = [] [[package]] -name = "radroots-event-codec" +name = "radroots_event_codec" allowed_public_paths = [] [[package]] -name = "radroots-trade" +name = "radroots_trade" allowed_public_paths = [] [[package]] -name = "radroots-signing" +name = "radroots_signing" allowed_public_paths = [] [[package]] -name = "radroots-transport" +name = "radroots_transport" allowed_public_paths = [] [[package]] -name = "radroots-nostr" +name = "radroots_nostr" allowed_public_paths = ["nostr"] [[package]] -name = "radroots-nostr-connect" +name = "radroots_nostr_connect" allowed_public_paths = [] [[package]] -name = "radroots-secrets" +name = "radroots_secrets" allowed_public_paths = [] [[package]] -name = "radroots-storage" +name = "radroots_storage" allowed_public_paths = [] [[package]] -name = "radroots-storage-sqlite" +name = "radroots_storage_sqlite" allowed_public_paths = [] [[package]] -name = "radroots-transport-nostr" +name = "radroots_transport_nostr" allowed_public_paths = [] [[package]] -name = "radroots-sync" +name = "radroots_sync" allowed_public_paths = [] [[package]] -name = "radroots-geonames" +name = "radroots_geonames" allowed_public_paths = [] [[package]] -name = "radroots-sdk" +name = "radroots_sdk" allowed_public_paths = [] [[package]] @@ -99,7 +99,7 @@ name = "radroots" allowed_public_paths = [] [[exception]] id = "RCRV1-API-003" -package = "radroots-nostr" +package = "radroots_nostr" source = "src/client.rs" forbidden_path = "nostr_sdk" items = [ @@ -113,7 +113,7 @@ rationale = "Legacy client ownership remains visible only until the Nostr packag [[exception]] id = "RCRV1-API-004" -package = "radroots-nostr" +package = "radroots_nostr" source = "src/error.rs" forbidden_path = "nostr_sdk" items = ["error::RadrootsNostrError"] @@ -127,7 +127,7 @@ rationale = "Legacy SDK error variants remain exact-scoped until normalized adap [[exception]] id = "RCRV1-API-005" -package = "radroots-nostr" +package = "radroots_nostr" source = "src/types.rs" forbidden_path = "nostr_sdk" items = [ @@ -156,7 +156,7 @@ rationale = "Broad live-client aliases are frozen and must be removed with the N [[exception]] id = "RCRV1-API-006" -package = "radroots-nostr-connect" +package = "radroots_nostr_connect" source = "src/client.rs" forbidden_path = "nostr" items = [ @@ -179,7 +179,7 @@ rationale = "Legacy client state-machine signatures retain exact protocol types [[exception]] id = "RCRV1-API-007" -package = "radroots-nostr-connect" +package = "radroots_nostr_connect" source = "src/message.rs" forbidden_path = "nostr" items = [ @@ -200,7 +200,7 @@ rationale = "Legacy request and response envelopes retain exact Nostr values unt [[exception]] id = "RCRV1-API-008" -package = "radroots-nostr-connect" +package = "radroots_nostr_connect" source = "src/uri.rs" forbidden_path = "nostr" items = [ diff --git a/contracts/releases/package_tiers.toml b/contracts/releases/package_tiers.toml @@ -7,47 +7,47 @@ enforced_dependency_kinds = ["normal", "dev", "build"] id = "foundation" rank = 0 packages = [ - "radroots-core", - "radroots-identity", - "radroots-blossom", - "radroots-protocol", + "radroots_core", + "radroots_identity", + "radroots_blossom", + "radroots_protocol", ] [[tier]] id = "domain" rank = 1 -packages = ["radroots-event", "radroots-event-codec", "radroots-trade"] +packages = ["radroots_event", "radroots_event_codec", "radroots_trade"] [[tier]] id = "spi" rank = 2 packages = [ - "radroots-signing", - "radroots-transport", - "radroots-secrets", - "radroots-storage", + "radroots_signing", + "radroots_transport", + "radroots_secrets", + "radroots_storage", ] [[tier]] id = "adapter" rank = 3 packages = [ - "radroots-nostr", - "radroots-nostr-connect", - "radroots-storage-sqlite", - "radroots-transport-nostr", - "radroots-geonames", + "radroots_nostr", + "radroots_nostr_connect", + "radroots_storage_sqlite", + "radroots_transport_nostr", + "radroots_geonames", ] [[tier]] id = "orchestration" rank = 4 -packages = ["radroots-sync"] +packages = ["radroots_sync"] [[tier]] id = "sdk" rank = 5 -packages = ["radroots-sdk"] +packages = ["radroots_sdk"] [[tier]] id = "facade" @@ -58,8 +58,8 @@ packages = ["radroots"] # removed by the manifest-alignment checkpoint. Normal, build, target, or # feature-broadened forms remain forbidden. [[temporary_exception]] -owner = "radroots-trade" -dependency = "radroots-nostr" +owner = "radroots_trade" +dependency = "radroots_nostr" kind = "dev" target = "all" features = ["events", "std"] @@ -68,8 +68,8 @@ removal_step = 88 rationale = "Existing trade conformance tests consume Nostr vectors until the Step 088 package boundary alignment." [[temporary_exception]] -owner = "radroots-trade" -dependency = "radroots-transport" +owner = "radroots_trade" +dependency = "radroots_transport" kind = "dev" target = "all" features = [] diff --git a/contracts/releases/publish_policy.toml b/contracts/releases/publish_policy.toml @@ -7,46 +7,46 @@ registry = "crates-io" final_enablement_step = 305 spec_id = "radroots.crates.release.v1" approved_packages = [ - "radroots-core", - "radroots-identity", - "radroots-blossom", - "radroots-protocol", - "radroots-event", - "radroots-event-codec", - "radroots-trade", - "radroots-signing", - "radroots-transport", - "radroots-nostr", - "radroots-nostr-connect", - "radroots-secrets", - "radroots-storage", - "radroots-storage-sqlite", - "radroots-transport-nostr", - "radroots-sync", - "radroots-geonames", - "radroots-sdk", + "radroots_core", + "radroots_identity", + "radroots_blossom", + "radroots_protocol", + "radroots_event", + "radroots_event_codec", + "radroots_trade", + "radroots_signing", + "radroots_transport", + "radroots_nostr", + "radroots_nostr_connect", + "radroots_secrets", + "radroots_storage", + "radroots_storage_sqlite", + "radroots_transport_nostr", + "radroots_sync", + "radroots_geonames", + "radroots_sdk", "radroots", ] local_packages = [ - "radroots-core", - "radroots-identity", - "radroots-blossom", - "radroots-protocol", - "radroots-event", - "radroots-event-codec", - "radroots-trade", - "radroots-signing", - "radroots-transport", - "radroots-nostr", - "radroots-nostr-connect", - "radroots-secrets", - "radroots-storage", - "radroots-storage-sqlite", - "radroots-transport-nostr", - "radroots-sync", - "radroots-geonames", + "radroots_core", + "radroots_identity", + "radroots_blossom", + "radroots_protocol", + "radroots_event", + "radroots_event_codec", + "radroots_trade", + "radroots_signing", + "radroots_transport", + "radroots_nostr", + "radroots_nostr_connect", + "radroots_secrets", + "radroots_storage", + "radroots_storage_sqlite", + "radroots_transport_nostr", + "radroots_sync", + "radroots_geonames", ] -external_packages = ["radroots-sdk", "radroots"] +external_packages = ["radroots_sdk", "radroots"] [workspace_classification] private = [ diff --git a/crates/blossom/Cargo.toml b/crates/blossom/Cargo.toml @@ -1,5 +1,5 @@ [package] -name = "radroots-blossom" +name = "radroots_blossom" publish = false version = "0.1.0" edition.workspace = true @@ -9,7 +9,7 @@ license.workspace = true description = "Portable Blossom protocol primitives for Radroots" repository.workspace = true homepage.workspace = true -documentation = "https://docs.rs/radroots-blossom" +documentation = "https://docs.rs/radroots_blossom" readme = "README.md" [lib] diff --git a/crates/blossom/README.md b/crates/blossom/README.md @@ -1,4 +1,4 @@ -# radroots-blossom +# radroots_blossom `radroots_blossom` provides portable, runtime-independent primitives for Blossom blob hashes, root hash paths, blob URLs, BUD-02 descriptors, diff --git a/crates/core/Cargo.toml b/crates/core/Cargo.toml @@ -1,5 +1,5 @@ [package] -name = "radroots-core" +name = "radroots_core" publish = false version = "0.1.0" edition.workspace = true @@ -9,7 +9,7 @@ license.workspace = true description = "Core value model for Radroots" repository.workspace = true homepage.workspace = true -documentation = "https://docs.rs/radroots-core" +documentation = "https://docs.rs/radroots_core" readme = "README.md" [lib] diff --git a/crates/core/README.md b/crates/core/README.md @@ -1,6 +1,6 @@ -# radroots-core +# radroots_core -`radroots-core` provides the portable, deterministic value model shared by +`radroots_core` provides the portable, deterministic value model shared by Radroots domain packages: decimals, currencies, money, percentages, quantities, units, and pricing. @@ -34,7 +34,7 @@ The same program is available as the checked ## Public API The crate root intentionally exports the common value types and aggregate -[`Error`](https://docs.rs/radroots-core/latest/radroots_core/enum.Error.html). +[`Error`](https://docs.rs/radroots_core/latest/radroots_core/enum.Error.html). Focused errors and operations remain in these modules: - `currency` — canonical three-letter ASCII currency codes; @@ -46,7 +46,7 @@ Focused errors and operations remain in these modules: - `unit` — unit parsing, dimensions, and deterministic conversions. The normative responsibility and dependency boundary are defined by the -[`radroots-core` package charter](../../docs/specs/radroots_crates_release_v1.md). +[`radroots_core` package charter](../../docs/specs/radroots_crates_release_v1.md). The reviewed pre-release surface is recorded in [`docs/api`](../../docs/api/README.md). @@ -101,10 +101,10 @@ any durable commit because the crate owns no durable state. Methods taking ## Intended consumers -`radroots-core` is intended for lower-level Radroots domain crates and for +`radroots_core` is intended for lower-level Radroots domain crates and for integrators that need the portable value model directly. Applications should normally begin with the curated `radroots` crate or the advanced -`radroots-sdk` composition surface. +`radroots_sdk` composition surface. 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 diff --git a/crates/event/Cargo.toml b/crates/event/Cargo.toml @@ -1,5 +1,5 @@ [package] -name = "radroots-event" +name = "radroots_event" publish = false version = "0.1.0" edition.workspace = true @@ -9,7 +9,7 @@ license.workspace = true description = "Domain event model for Radroots" repository.workspace = true homepage.workspace = true -documentation = "https://docs.rs/radroots-event" +documentation = "https://docs.rs/radroots_event" readme = "README.md" [lib] diff --git a/crates/event/README.md b/crates/event/README.md @@ -1,4 +1,4 @@ -# radroots-event +# radroots_event This is the README for `radroots_event`, which provides typed `radroots` event models, kinds, and tag conventions for the `radroots` core libraries. diff --git a/crates/event_codec/Cargo.toml b/crates/event_codec/Cargo.toml @@ -1,5 +1,5 @@ [package] -name = "radroots-event-codec" +name = "radroots_event_codec" publish = false version = "0.1.0" edition.workspace = true @@ -9,7 +9,7 @@ license.workspace = true description = "Event codec layer for Radroots" repository.workspace = true homepage.workspace = true -documentation = "https://docs.rs/radroots-event-codec" +documentation = "https://docs.rs/radroots_event_codec" readme = "README.md" [lib] diff --git a/crates/event_codec/README.md b/crates/event_codec/README.md @@ -1,4 +1,4 @@ -# radroots-event-codec +# radroots_event_codec This is the README for `radroots_event_codec`, which provides canonical event codecs and tag builders for the `radroots` core libraries. diff --git a/crates/event_store/contracts/source_maintenance_v1.manifest.json b/crates/event_store/contracts/source_maintenance_v1.manifest.json @@ -152,8 +152,8 @@ { "role": "workspace_dependency_authority", "path": "Cargo.toml", - "byte_length": 11506, - "sha256": "af871d7567594f75da8385691297a5ce170f51ae54c4c318db10b99d458a3335", + "byte_length": 12385, + "sha256": "c53c5c5a464267d7df850e03fdfa99dcde0b469972cf921f9b81c18b52a9c4b2", "hash_algorithm": "sha256_bytes_v1" }, { @@ -286,14 +286,14 @@ "role": "predecessor_successor_governance", "path": "tools/xtask/src/contract/food_availability_projection.rs", "byte_length": 194594, - "sha256": "4b2961fc69c8204ad5470c0e51c93533063e49d7a14da00a53598c3e8d0cdf6b", + "sha256": "b859df0608b000f0de53f6543d2dea9501fa9080f57e3fdd8d9e71acf386e0a7", "hash_algorithm": "sha256_bytes_v1" }, { "role": "transitive_predecessor_membership_governance", "path": "tools/xtask/src/contract/nip09_reconciliation.rs", "byte_length": 835558, - "sha256": "51a01360e2c32c83056cb36e22b850e6b09d2ad4e4a749097564b4a100709a16", + "sha256": "6218e33cc8445fce59194508f73290e7eea8c91495fbe77a5323b258ef21f4a6", "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 @@ -e739b4f5386d971cb4a2cca198015e7ae68b2e36e11ec75113eb0e18b5bb0d81 +e3a56e03726af0db35480e55eab9d3244029673cff07bb9e7e1db185125b0785 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\": \"ad4a6c8ae9488fc8033792bc6952af04687f312901c1847d8c668a62913bb642\",\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\": \"33b93a3c87ce428e8aa6f5e92643c77203d9aa006c53ce96f3562fe6d68ffd23\",\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\": \"425dc799f392b87f265a6fb81f89c4a1c7a5db8391ab0380970708cb9c66704d\",\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\": \"d526d96ea02be12b4b0aed99e97cfdde17c4474ace67111506a7b900ee78b186\",\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\": \"33b93a3c87ce428e8aa6f5e92643c77203d9aa006c53ce96f3562fe6d68ffd23\",\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\": 11506,\n \"sha256\": \"af871d7567594f75da8385691297a5ce170f51ae54c4c318db10b99d458a3335\",\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\": \"event_store_error_and_limits\",\n \"path\": \"crates/event_store/src/error.rs\",\n \"byte_length\": 19421,\n \"sha256\": \"4772e041cb20a4963afb2f3159804c777e2f2be61bfdb6ee267e7a7c04258972\",\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\": 33617,\n \"sha256\": \"79296b8f263aa06d17005795e4515f769f064ea6fd971eeb1296e1151debaf20\",\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\": 184407,\n \"sha256\": \"c455d40fc736e3db264f567c7809af7bd897d89be8a33dfb21667a6ef6b8d6c6\",\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\": 394574,\n \"sha256\": \"db57dc3e35e64c7194683142fe55edba853671a829269449dd2273056dfc3a0e\",\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\": 30140,\n \"sha256\": \"210112eeaa6975a3b4fbb97d5c52588f8c6d8d07975e531d39737fd11235de51\",\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\": 51756,\n \"sha256\": \"f8d5b62f0613104aa86658d5bf1baade92c7df83f00ef0cddadd734b9797afca\",\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\": 194594,\n \"sha256\": \"4b2961fc69c8204ad5470c0e51c93533063e49d7a14da00a53598c3e8d0cdf6b\",\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\": 835558,\n \"sha256\": \"51a01360e2c32c83056cb36e22b850e6b09d2ad4e4a749097564b4a100709a16\",\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\": 177996,\n \"sha256\": \"c309da38f12101d77c4de1caa49ef443252cac6238b49692182851c2cf894bda\",\n \"hash_algorithm\": \"sha256_bytes_v1\"\n },\n {\n \"role\": \"contract_command_authority\",\n \"path\": \"tools/xtask/src/contract.rs\",\n \"byte_length\": 500241,\n \"sha256\": \"972e2a6b1099267e11d9a34e73fd38b20fc217a3dd79bd9a0f1f060b680ba2ba\",\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\": 14976,\n \"sha256\": \"42b59a8576e4f86b091941a64349ac9eaa20b1e3b52aef367bb3d5947d8ccd1d\",\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\": \"ad4a6c8ae9488fc8033792bc6952af04687f312901c1847d8c668a62913bb642\",\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\": \"33b93a3c87ce428e8aa6f5e92643c77203d9aa006c53ce96f3562fe6d68ffd23\",\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\": \"425dc799f392b87f265a6fb81f89c4a1c7a5db8391ab0380970708cb9c66704d\",\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\": \"d526d96ea02be12b4b0aed99e97cfdde17c4474ace67111506a7b900ee78b186\",\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\": \"33b93a3c87ce428e8aa6f5e92643c77203d9aa006c53ce96f3562fe6d68ffd23\",\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\": \"event_store_error_and_limits\",\n \"path\": \"crates/event_store/src/error.rs\",\n \"byte_length\": 19421,\n \"sha256\": \"4772e041cb20a4963afb2f3159804c777e2f2be61bfdb6ee267e7a7c04258972\",\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\": 33617,\n \"sha256\": \"79296b8f263aa06d17005795e4515f769f064ea6fd971eeb1296e1151debaf20\",\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\": 184407,\n \"sha256\": \"c455d40fc736e3db264f567c7809af7bd897d89be8a33dfb21667a6ef6b8d6c6\",\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\": 394574,\n \"sha256\": \"db57dc3e35e64c7194683142fe55edba853671a829269449dd2273056dfc3a0e\",\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\": 30140,\n \"sha256\": \"210112eeaa6975a3b4fbb97d5c52588f8c6d8d07975e531d39737fd11235de51\",\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\": 51756,\n \"sha256\": \"f8d5b62f0613104aa86658d5bf1baade92c7df83f00ef0cddadd734b9797afca\",\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\": 194594,\n \"sha256\": \"b859df0608b000f0de53f6543d2dea9501fa9080f57e3fdd8d9e71acf386e0a7\",\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\": 835558,\n \"sha256\": \"6218e33cc8445fce59194508f73290e7eea8c91495fbe77a5323b258ef21f4a6\",\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\": 177996,\n \"sha256\": \"c309da38f12101d77c4de1caa49ef443252cac6238b49692182851c2cf894bda\",\n \"hash_algorithm\": \"sha256_bytes_v1\"\n },\n {\n \"role\": \"contract_command_authority\",\n \"path\": \"tools/xtask/src/contract.rs\",\n \"byte_length\": 500241,\n \"sha256\": \"972e2a6b1099267e11d9a34e73fd38b20fc217a3dd79bd9a0f1f060b680ba2ba\",\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\": 14976,\n \"sha256\": \"42b59a8576e4f86b091941a64349ac9eaa20b1e3b52aef367bb3d5947d8ccd1d\",\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 = 16260; pub(crate) const SOURCE_MAINTENANCE_MANIFEST_SHA256: &str = - "e739b4f5386d971cb4a2cca198015e7ae68b2e36e11ec75113eb0e18b5bb0d81"; + "e3a56e03726af0db35480e55eab9d3244029673cff07bb9e7e1db185125b0785"; pub(crate) const SOURCE_MAINTENANCE_MANIFEST_SCHEMA_VERSION: u32 = 1; pub(crate) const SOURCE_MAINTENANCE_CONTRACT_ID: &str = "radroots_event_store.source_maintenance_v1"; diff --git a/crates/geonames/Cargo.toml b/crates/geonames/Cargo.toml @@ -1,5 +1,5 @@ [package] -name = "radroots-geonames" +name = "radroots_geonames" description = "GeoNames-backed geocoding for Radroots" version = "0.1.0" edition.workspace = true diff --git a/crates/geonames/README.md b/crates/geonames/README.md @@ -1,4 +1,4 @@ -# radroots-geonames +# radroots_geonames GeoNames-backed geocoding for Radroots. diff --git a/crates/identity/Cargo.toml b/crates/identity/Cargo.toml @@ -1,5 +1,5 @@ [package] -name = "radroots-identity" +name = "radroots_identity" publish = false version = "0.1.0" edition.workspace = true @@ -9,7 +9,7 @@ license.workspace = true description = "Public identity and account value types for Radroots" repository.workspace = true homepage.workspace = true -documentation = "https://docs.rs/radroots-identity" +documentation = "https://docs.rs/radroots_identity" readme = "README.md" [lib] diff --git a/crates/identity/README.md b/crates/identity/README.md @@ -1,4 +1,4 @@ -# radroots-identity +# radroots_identity This is the README for `radroots_identity`, which provides public identity, account, and profile value types for the Radroots package family. diff --git a/crates/nostr/Cargo.toml b/crates/nostr/Cargo.toml @@ -1,5 +1,5 @@ [package] -name = "radroots-nostr" +name = "radroots_nostr" publish = false version = "0.1.0" edition.workspace = true @@ -9,7 +9,7 @@ license.workspace = true description = "Nostr integration layer for Radroots" repository.workspace = true homepage.workspace = true -documentation = "https://docs.rs/radroots-nostr" +documentation = "https://docs.rs/radroots_nostr" readme = "README.md" [lib] diff --git a/crates/nostr/README.md b/crates/nostr/README.md @@ -1,4 +1,4 @@ -# radroots-nostr +# radroots_nostr This is the README for `radroots_nostr`, which provides shared Nostr protocol primitives for the `radroots` core libraries. diff --git a/crates/nostr_connect/Cargo.toml b/crates/nostr_connect/Cargo.toml @@ -1,5 +1,5 @@ [package] -name = "radroots-nostr-connect" +name = "radroots_nostr_connect" publish = false version = "0.1.0" edition.workspace = true @@ -9,7 +9,7 @@ license.workspace = true description = "NIP-46 protocol model for Radroots" repository.workspace = true homepage.workspace = true -documentation = "https://docs.rs/radroots-nostr-connect" +documentation = "https://docs.rs/radroots_nostr_connect" readme = "README.md" [lib] diff --git a/crates/nostr_connect/README.md b/crates/nostr_connect/README.md @@ -1,4 +1,4 @@ -# radroots-nostr-connect +# radroots_nostr_connect This is the README for `radroots_nostr_connect`, which provides NIP-46 connection and URI models for the `radroots` core libraries. diff --git a/crates/protocol/Cargo.toml b/crates/protocol/Cargo.toml @@ -1,5 +1,5 @@ [package] -name = "radroots-protocol" +name = "radroots_protocol" description = "Versioned wire contracts for Radroots" version = "0.1.0" edition.workspace = true diff --git a/crates/protocol/README.md b/crates/protocol/README.md @@ -1,4 +1,4 @@ -# radroots-protocol +# radroots_protocol Versioned cross-process and cross-language schemas for Radroots. diff --git a/crates/secrets/Cargo.toml b/crates/secrets/Cargo.toml @@ -1,5 +1,5 @@ [package] -name = "radroots-secrets" +name = "radroots_secrets" description = "Secret material and protected-storage abstractions for Radroots" version = "0.1.0" edition.workspace = true diff --git a/crates/secrets/README.md b/crates/secrets/README.md @@ -1,4 +1,4 @@ -# radroots-secrets +# radroots_secrets Secret material and protected-storage abstractions for Radroots. diff --git a/crates/signing/Cargo.toml b/crates/signing/Cargo.toml @@ -1,5 +1,5 @@ [package] -name = "radroots-signing" +name = "radroots_signing" description = "Signing abstractions and authorization policy for Radroots" version = "0.1.0" edition.workspace = true diff --git a/crates/signing/README.md b/crates/signing/README.md @@ -1,4 +1,4 @@ -# radroots-signing +# radroots_signing Signing abstractions and authorization policy for Radroots. diff --git a/crates/storage/Cargo.toml b/crates/storage/Cargo.toml @@ -1,5 +1,5 @@ [package] -name = "radroots-storage" +name = "radroots_storage" description = "Backend-neutral persistence abstractions for Radroots" version = "0.1.0" edition.workspace = true diff --git a/crates/storage/README.md b/crates/storage/README.md @@ -1,4 +1,4 @@ -# radroots-storage +# radroots_storage Backend-neutral persistence abstractions for Radroots. diff --git a/crates/storage_sqlite/Cargo.toml b/crates/storage_sqlite/Cargo.toml @@ -1,5 +1,5 @@ [package] -name = "radroots-storage-sqlite" +name = "radroots_storage_sqlite" description = "SQLite storage backend for Radroots" version = "0.1.0" edition.workspace = true diff --git a/crates/storage_sqlite/README.md b/crates/storage_sqlite/README.md @@ -1,4 +1,4 @@ -# radroots-storage-sqlite +# radroots_storage_sqlite SQLite storage backend for Radroots. diff --git a/crates/sync/Cargo.toml b/crates/sync/Cargo.toml @@ -1,5 +1,5 @@ [package] -name = "radroots-sync" +name = "radroots_sync" description = "Synchronization orchestration for Radroots" version = "0.1.0" edition.workspace = true diff --git a/crates/sync/README.md b/crates/sync/README.md @@ -1,4 +1,4 @@ -# radroots-sync +# radroots_sync Synchronization orchestration for Radroots. diff --git a/crates/trade/Cargo.toml b/crates/trade/Cargo.toml @@ -1,5 +1,5 @@ [package] -name = "radroots-trade" +name = "radroots_trade" publish = false version = "0.1.0" edition.workspace = true @@ -9,7 +9,7 @@ license.workspace = true description = "Trade domain model for Radroots" repository.workspace = true homepage.workspace = true -documentation = "https://docs.rs/radroots-trade" +documentation = "https://docs.rs/radroots_trade" readme = "README.md" [lib] diff --git a/crates/trade/README.md b/crates/trade/README.md @@ -1,4 +1,4 @@ -# radroots-trade +# radroots_trade This is the README for `radroots_trade`, which provides shared trade workflow helpers for the `radroots` core libraries. diff --git a/crates/transport/Cargo.toml b/crates/transport/Cargo.toml @@ -1,5 +1,5 @@ [package] -name = "radroots-transport" +name = "radroots_transport" publish = false version = "0.1.0" edition.workspace = true diff --git a/crates/transport/README.md b/crates/transport/README.md @@ -1,4 +1,4 @@ -# radroots-transport +# radroots_transport This is the README for `radroots_transport`, which provides transport-neutral delivery models for the `radroots` core libraries. diff --git a/crates/transport_nostr/Cargo.toml b/crates/transport_nostr/Cargo.toml @@ -1,5 +1,5 @@ [package] -name = "radroots-transport-nostr" +name = "radroots_transport_nostr" publish = false version = "0.1.0" edition.workspace = true diff --git a/crates/transport_nostr/README.md b/crates/transport_nostr/README.md @@ -1,4 +1,4 @@ -# radroots-transport-nostr +# radroots_transport_nostr Deterministic Nostr relay transport substrate for exact signed-event publish, fetch ingest, and outbox delivery target coordination. diff --git a/docs/api/README.md b/docs/api/README.md @@ -30,4 +30,4 @@ expand a package beyond its charter. | Package | Baseline | Charter | | --- | --- | --- | -| `radroots-core` | [`radroots-core.txt`](radroots-core.txt) | [release V1 specification](../specs/radroots_crates_release_v1.md) | +| `radroots_core` | [`radroots_core.txt`](radroots_core.txt) | [release V1 specification](../specs/radroots_crates_release_v1.md) | diff --git a/docs/implementation/TRACEABILITY.md b/docs/implementation/TRACEABILITY.md @@ -7,13 +7,13 @@ and verification. It adds no product requirements; the synchronized | Durable requirement | Owning package or control | Handoff steps | Required evidence | | --- | --- | --- | --- | | Exactly 19 public packages with a 17/2 repository split | release policy and architecture catalog | 013, 015-026, 304-305 | Cargo-resolved graph report and exact allowlist validation | -| Public-only identity and separated signing/secrets | `radroots-identity`, `radroots-signing`, `radroots-secrets` | 052-054, 099-111, 147-155 | public API, feature, dependency, and redaction tests | -| One canonical `TradeId` | `radroots-event`, `radroots-trade` | 073-098 | compile/API inventory and trade conformance | -| Version-neutral protocol ownership | `radroots-protocol` and private generators | 055-064, 261-268 | contract vectors and generated freshness | -| Independent transport source/sink with extensible identity | `radroots-transport` and adapters | 112-134, 190-207 | transport conformance and forward-compatibility fixtures | -| Storage SPI with SQLite backend | `radroots-storage`, `radroots-storage-sqlite` | 156-189 | backend conformance, migration, recovery, and leakage gates | -| Shared sync engine and explicit lifecycle | `radroots-sync` | 208-225 | pull/push, idempotency, cancellation, and close tests | -| Safe SDK defaults and curated facade | `radroots-sdk`, `radroots` | 226-260 | clean-project package smoke tests and compile-time surface guards | +| Public-only identity and separated signing/secrets | `radroots_identity`, `radroots_signing`, `radroots_secrets` | 052-054, 099-111, 147-155 | public API, feature, dependency, and redaction tests | +| One canonical `TradeId` | `radroots_event`, `radroots_trade` | 073-098 | compile/API inventory and trade conformance | +| Version-neutral protocol ownership | `radroots_protocol` and private generators | 055-064, 261-268 | contract vectors and generated freshness | +| Independent transport source/sink with extensible identity | `radroots_transport` and adapters | 112-134, 190-207 | transport conformance and forward-compatibility fixtures | +| Storage SPI with SQLite backend | `radroots_storage`, `radroots_storage_sqlite` | 156-189 | backend conformance, migration, recovery, and leakage gates | +| Shared sync engine and explicit lifecycle | `radroots_sync` | 208-225 | pull/push, idempotency, cancellation, and close tests | +| Safe SDK defaults and curated facade | `radroots_sdk`, `radroots` | 226-260 | clean-project package smoke tests and compile-time surface guards | | Preview and implementation packages remain private | release policy and graph validator | 013, 023-026, 304-305 | private-closure and forbidden-edge fixtures | | Package-realistic reproducible release | release tooling in both repositories | 295-315 | locked zero-diff package, extracted, local-registry, target, and coverage gates | | Every first-party consumer migrates | downstream cutover matrix | 269-294 | discovered consumer inventory and canary results | diff --git a/docs/migration/identity.md b/docs/migration/identity.md @@ -1,6 +1,6 @@ # Identity, signing, and secret ownership migration -`radroots-identity` now owns public values only: `PublicKey`, `IdentityId`, +`radroots_identity` now owns public values only: `PublicKey`, `IdentityId`, `AccountId`, `PublicIdentity`, `Profile`, and `Username`. The removed `RadrootsIdentity` API, raw secret bytes, key generation, nsec encoding, NIP-49 encryption/decryption, and encrypted identity files have no compatibility @@ -8,17 +8,17 @@ aliases in this package. The approved destination boundaries are: -- `radroots-nostr::key` for explicit Nostr key parsing, nsec/NIP-49 conversion, +- `radroots_nostr::key` for explicit Nostr key parsing, nsec/NIP-49 conversion, and host-requested local Nostr key creation; -- `radroots-signing` for the signer SPI, requests, receipts, authorization, and +- `radroots_signing` for the signer SPI, requests, receipts, authorization, and actor provenance, without owning raw secret bytes; -- `radroots-nostr::signing` for concrete local Nostr signing adapters; -- `radroots-secrets::{reference, provider, envelope, wrapping}` for secret +- `radroots_nostr::signing` for concrete local Nostr signing adapters; +- `radroots_secrets::{reference, provider, envelope, wrapping}` for secret references, providers, wrapping, and versioned encrypted envelopes; -- host storage adapters composed from `radroots-secrets` and - `radroots-storage-sqlite` for durable secret persistence. +- host storage adapters composed from `radroots_secrets` and + `radroots_storage_sqlite` for durable secret persistence. Those destination APIs are introduced by their ordered release checkpoints. -Until then, callers must not recreate secret ownership in `radroots-identity` +Until then, callers must not recreate secret ownership in `radroots_identity` or add a compatibility shim. Public identity profile file helpers remain only for the immediately following filesystem-extraction checkpoint. diff --git a/docs/specs/README.md b/docs/specs/README.md @@ -3,9 +3,9 @@ This directory carries the coordinated `radroots.crates.release.v1` contract for the two existing standalone Rust repositories. -The `radrootslabs/lib` repository owns packages 1-17, from `radroots-core` -through `radroots-geonames`. The `radrootslabs/sdk` repository owns packages -18-19, `radroots-sdk` and `radroots`. No third Rust repository is part of this +The `radrootslabs/lib` repository owns packages 1-17, from `radroots_core` +through `radroots_geonames`. The `radrootslabs/sdk` repository owns packages +18-19, `radroots_sdk` and `radroots`. No third Rust repository is part of this release architecture. ## Files diff --git a/docs/specs/radroots_crates_release_v1.dot b/docs/specs/radroots_crates_release_v1.dot @@ -2,101 +2,101 @@ digraph radroots_crates_release_v1 { rankdir="BT"; graph [label="Radroots Crates Release V1", labelloc="t", fontsize=20]; node [fontname="Helvetica"]; - "radroots-core" [shape=ellipse]; - "radroots-identity" [shape=ellipse]; - "radroots-blossom" [shape=ellipse]; - "radroots-protocol" [shape=component]; - "radroots-event" [shape=box]; - "radroots-event-codec" [shape=box]; - "radroots-trade" [shape=box]; - "radroots-signing" [shape=hexagon]; - "radroots-transport" [shape=hexagon]; - "radroots-nostr" [shape=component]; - "radroots-nostr-connect" [shape=component]; - "radroots-secrets" [shape=hexagon]; - "radroots-storage" [shape=hexagon]; - "radroots-storage-sqlite" [shape=cylinder]; - "radroots-transport-nostr" [shape=component]; - "radroots-sync" [shape=box3d]; - "radroots-geonames" [shape=component]; - "radroots-sdk" [shape=doubleoctagon]; + "radroots_core" [shape=ellipse]; + "radroots_identity" [shape=ellipse]; + "radroots_blossom" [shape=ellipse]; + "radroots_protocol" [shape=component]; + "radroots_event" [shape=box]; + "radroots_event_codec" [shape=box]; + "radroots_trade" [shape=box]; + "radroots_signing" [shape=hexagon]; + "radroots_transport" [shape=hexagon]; + "radroots_nostr" [shape=component]; + "radroots_nostr_connect" [shape=component]; + "radroots_secrets" [shape=hexagon]; + "radroots_storage" [shape=hexagon]; + "radroots_storage_sqlite" [shape=cylinder]; + "radroots_transport_nostr" [shape=component]; + "radroots_sync" [shape=box3d]; + "radroots_geonames" [shape=component]; + "radroots_sdk" [shape=doubleoctagon]; "radroots" [shape=doubleoctagon]; subgraph cluster_lib { label="radrootslabs/lib (packages 1-17)"; - "radroots-core"; "radroots-identity"; "radroots-blossom"; - "radroots-protocol"; "radroots-event"; "radroots-event-codec"; - "radroots-trade"; "radroots-signing"; "radroots-transport"; - "radroots-nostr"; "radroots-nostr-connect"; "radroots-secrets"; - "radroots-storage"; "radroots-storage-sqlite"; - "radroots-transport-nostr"; "radroots-sync"; "radroots-geonames"; + "radroots_core"; "radroots_identity"; "radroots_blossom"; + "radroots_protocol"; "radroots_event"; "radroots_event_codec"; + "radroots_trade"; "radroots_signing"; "radroots_transport"; + "radroots_nostr"; "radroots_nostr_connect"; "radroots_secrets"; + "radroots_storage"; "radroots_storage_sqlite"; + "radroots_transport_nostr"; "radroots_sync"; "radroots_geonames"; } subgraph cluster_sdk { label="radrootslabs/sdk (packages 18-19)"; - "radroots-sdk"; "radroots"; + "radroots_sdk"; "radroots"; } - "radroots-event" -> "radroots-blossom" [style=solid, label="required"]; - "radroots-event" -> "radroots-core" [style=solid, label="required"]; - "radroots-event" -> "radroots-identity" [style=solid, label="required"]; - "radroots-event" -> "radroots-protocol" [style=solid, label="required"]; - "radroots-event-codec" -> "radroots-blossom" [style=solid, label="required"]; - "radroots-event-codec" -> "radroots-event" [style=solid, label="required"]; - "radroots-event-codec" -> "radroots-protocol" [style=solid, label="required"]; - "radroots-trade" -> "radroots-core" [style=solid, label="required"]; - "radroots-trade" -> "radroots-event" [style=solid, label="required"]; - "radroots-trade" -> "radroots-identity" [style=solid, label="required"]; - "radroots-signing" -> "radroots-event" [style=solid, label="required"]; - "radroots-signing" -> "radroots-identity" [style=solid, label="required"]; - "radroots-signing" -> "radroots-protocol" [style=solid, label="required"]; - "radroots-transport" -> "radroots-event" [style=solid, label="required"]; - "radroots-transport" -> "radroots-identity" [style=solid, label="required"]; - "radroots-transport" -> "radroots-protocol" [style=solid, label="required"]; - "radroots-nostr" -> "radroots-blossom" [style=dashed, label="optional"]; - "radroots-nostr" -> "radroots-signing" [style=dashed, label="optional"]; - "radroots-nostr" -> "radroots-event" [style=solid, label="required"]; - "radroots-nostr" -> "radroots-event-codec" [style=solid, label="required"]; - "radroots-nostr" -> "radroots-identity" [style=solid, label="required"]; - "radroots-nostr-connect" -> "radroots-event" [style=solid, label="required"]; - "radroots-nostr-connect" -> "radroots-identity" [style=solid, label="required"]; - "radroots-nostr-connect" -> "radroots-nostr" [style=solid, label="required"]; - "radroots-nostr-connect" -> "radroots-protocol" [style=solid, label="required"]; - "radroots-storage" -> "radroots-event" [style=solid, label="required"]; - "radroots-storage" -> "radroots-protocol" [style=solid, label="required"]; - "radroots-storage" -> "radroots-trade" [style=solid, label="required"]; - "radroots-storage" -> "radroots-transport" [style=solid, label="required"]; - "radroots-storage-sqlite" -> "radroots-event-codec" [style=solid, label="required"]; - "radroots-storage-sqlite" -> "radroots-secrets" [style=solid, label="required"]; - "radroots-storage-sqlite" -> "radroots-storage" [style=solid, label="required"]; - "radroots-transport-nostr" -> "radroots-event-codec" [style=solid, label="required"]; - "radroots-transport-nostr" -> "radroots-nostr" [style=solid, label="required"]; - "radroots-transport-nostr" -> "radroots-protocol" [style=solid, label="required"]; - "radroots-transport-nostr" -> "radroots-transport" [style=solid, label="required"]; - "radroots-sync" -> "radroots-event" [style=solid, label="required"]; - "radroots-sync" -> "radroots-event-codec" [style=solid, label="required"]; - "radroots-sync" -> "radroots-protocol" [style=solid, label="required"]; - "radroots-sync" -> "radroots-signing" [style=solid, label="required"]; - "radroots-sync" -> "radroots-storage" [style=solid, label="required"]; - "radroots-sync" -> "radroots-trade" [style=solid, label="required"]; - "radroots-sync" -> "radroots-transport" [style=solid, label="required"]; - "radroots-sdk" -> "radroots-geonames" [style=dashed, label="optional"]; - "radroots-sdk" -> "radroots-nostr" [style=dashed, label="optional"]; - "radroots-sdk" -> "radroots-nostr-connect" [style=dashed, label="optional"]; - "radroots-sdk" -> "radroots-secrets" [style=dashed, label="optional"]; - "radroots-sdk" -> "radroots-storage-sqlite" [style=dashed, label="optional"]; - "radroots-sdk" -> "radroots-sync" [style=dashed, label="optional"]; - "radroots-sdk" -> "radroots-transport-nostr" [style=dashed, label="optional"]; - "radroots-sdk" -> "radroots-core" [style=solid, label="required"]; - "radroots-sdk" -> "radroots-event" [style=solid, label="required"]; - "radroots-sdk" -> "radroots-event-codec" [style=solid, label="required"]; - "radroots-sdk" -> "radroots-identity" [style=solid, label="required"]; - "radroots-sdk" -> "radroots-protocol" [style=solid, label="required"]; - "radroots-sdk" -> "radroots-signing" [style=solid, label="required"]; - "radroots-sdk" -> "radroots-storage" [style=solid, label="required"]; - "radroots-sdk" -> "radroots-trade" [style=solid, label="required"]; - "radroots-sdk" -> "radroots-transport" [style=solid, label="required"]; - "radroots" -> "radroots-core" [style=solid, label="required"]; - "radroots" -> "radroots-event" [style=solid, label="required"]; - "radroots" -> "radroots-identity" [style=solid, label="required"]; - "radroots" -> "radroots-sdk" [style=solid, label="required"]; - "radroots" -> "radroots-trade" [style=solid, label="required"]; - "radroots" -> "radroots-transport" [style=solid, label="required"]; + "radroots_event" -> "radroots_blossom" [style=solid, label="required"]; + "radroots_event" -> "radroots_core" [style=solid, label="required"]; + "radroots_event" -> "radroots_identity" [style=solid, label="required"]; + "radroots_event" -> "radroots_protocol" [style=solid, label="required"]; + "radroots_event_codec" -> "radroots_blossom" [style=solid, label="required"]; + "radroots_event_codec" -> "radroots_event" [style=solid, label="required"]; + "radroots_event_codec" -> "radroots_protocol" [style=solid, label="required"]; + "radroots_trade" -> "radroots_core" [style=solid, label="required"]; + "radroots_trade" -> "radroots_event" [style=solid, label="required"]; + "radroots_trade" -> "radroots_identity" [style=solid, label="required"]; + "radroots_signing" -> "radroots_event" [style=solid, label="required"]; + "radroots_signing" -> "radroots_identity" [style=solid, label="required"]; + "radroots_signing" -> "radroots_protocol" [style=solid, label="required"]; + "radroots_transport" -> "radroots_event" [style=solid, label="required"]; + "radroots_transport" -> "radroots_identity" [style=solid, label="required"]; + "radroots_transport" -> "radroots_protocol" [style=solid, label="required"]; + "radroots_nostr" -> "radroots_blossom" [style=dashed, label="optional"]; + "radroots_nostr" -> "radroots_signing" [style=dashed, label="optional"]; + "radroots_nostr" -> "radroots_event" [style=solid, label="required"]; + "radroots_nostr" -> "radroots_event_codec" [style=solid, label="required"]; + "radroots_nostr" -> "radroots_identity" [style=solid, label="required"]; + "radroots_nostr_connect" -> "radroots_event" [style=solid, label="required"]; + "radroots_nostr_connect" -> "radroots_identity" [style=solid, label="required"]; + "radroots_nostr_connect" -> "radroots_nostr" [style=solid, label="required"]; + "radroots_nostr_connect" -> "radroots_protocol" [style=solid, label="required"]; + "radroots_storage" -> "radroots_event" [style=solid, label="required"]; + "radroots_storage" -> "radroots_protocol" [style=solid, label="required"]; + "radroots_storage" -> "radroots_trade" [style=solid, label="required"]; + "radroots_storage" -> "radroots_transport" [style=solid, label="required"]; + "radroots_storage_sqlite" -> "radroots_event_codec" [style=solid, label="required"]; + "radroots_storage_sqlite" -> "radroots_secrets" [style=solid, label="required"]; + "radroots_storage_sqlite" -> "radroots_storage" [style=solid, label="required"]; + "radroots_transport_nostr" -> "radroots_event_codec" [style=solid, label="required"]; + "radroots_transport_nostr" -> "radroots_nostr" [style=solid, label="required"]; + "radroots_transport_nostr" -> "radroots_protocol" [style=solid, label="required"]; + "radroots_transport_nostr" -> "radroots_transport" [style=solid, label="required"]; + "radroots_sync" -> "radroots_event" [style=solid, label="required"]; + "radroots_sync" -> "radroots_event_codec" [style=solid, label="required"]; + "radroots_sync" -> "radroots_protocol" [style=solid, label="required"]; + "radroots_sync" -> "radroots_signing" [style=solid, label="required"]; + "radroots_sync" -> "radroots_storage" [style=solid, label="required"]; + "radroots_sync" -> "radroots_trade" [style=solid, label="required"]; + "radroots_sync" -> "radroots_transport" [style=solid, label="required"]; + "radroots_sdk" -> "radroots_geonames" [style=dashed, label="optional"]; + "radroots_sdk" -> "radroots_nostr" [style=dashed, label="optional"]; + "radroots_sdk" -> "radroots_nostr_connect" [style=dashed, label="optional"]; + "radroots_sdk" -> "radroots_secrets" [style=dashed, label="optional"]; + "radroots_sdk" -> "radroots_storage_sqlite" [style=dashed, label="optional"]; + "radroots_sdk" -> "radroots_sync" [style=dashed, label="optional"]; + "radroots_sdk" -> "radroots_transport_nostr" [style=dashed, label="optional"]; + "radroots_sdk" -> "radroots_core" [style=solid, label="required"]; + "radroots_sdk" -> "radroots_event" [style=solid, label="required"]; + "radroots_sdk" -> "radroots_event_codec" [style=solid, label="required"]; + "radroots_sdk" -> "radroots_identity" [style=solid, label="required"]; + "radroots_sdk" -> "radroots_protocol" [style=solid, label="required"]; + "radroots_sdk" -> "radroots_signing" [style=solid, label="required"]; + "radroots_sdk" -> "radroots_storage" [style=solid, label="required"]; + "radroots_sdk" -> "radroots_trade" [style=solid, label="required"]; + "radroots_sdk" -> "radroots_transport" [style=solid, label="required"]; + "radroots" -> "radroots_core" [style=solid, label="required"]; + "radroots" -> "radroots_event" [style=solid, label="required"]; + "radroots" -> "radroots_identity" [style=solid, label="required"]; + "radroots" -> "radroots_sdk" [style=solid, label="required"]; + "radroots" -> "radroots_trade" [style=solid, label="required"]; + "radroots" -> "radroots_transport" [style=solid, label="required"]; } diff --git a/docs/specs/radroots_crates_release_v1.md b/docs/specs/radroots_crates_release_v1.md @@ -9,7 +9,7 @@ **Repository allocation:** the existing `radrootslabs/lib` and `radrootslabs/sdk` repositories remain independent. The first 17 packages are -owned by `lib`; `radroots-sdk` and `radroots` are owned by `sdk`. No third Rust +owned by `lib`; `radroots_sdk` and `radroots` are owned by `sdk`. No third Rust repository is created for release V1. **Registry context supplied by the project:** no Radroots crate is currently published on crates.io. Deleted experimental publications create no compatibility, pluralization, deprecation, or version-continuity requirement. @@ -26,27 +26,27 @@ It does not claim that the current source tree is already publishable. Publicati Radroots SHALL publish exactly **19 durable package identities** for release V1: -1. `radroots-core` -2. `radroots-identity` -3. `radroots-blossom` -4. `radroots-protocol` -5. `radroots-event` -6. `radroots-event-codec` -7. `radroots-trade` -8. `radroots-signing` -9. `radroots-transport` -10. `radroots-nostr` -11. `radroots-nostr-connect` -12. `radroots-secrets` -13. `radroots-storage` -14. `radroots-storage-sqlite` -15. `radroots-transport-nostr` -16. `radroots-sync` -17. `radroots-geonames` -18. `radroots-sdk` +1. `radroots_core` +2. `radroots_identity` +3. `radroots_blossom` +4. `radroots_protocol` +5. `radroots_event` +6. `radroots_event_codec` +7. `radroots_trade` +8. `radroots_signing` +9. `radroots_transport` +10. `radroots_nostr` +11. `radroots_nostr_connect` +12. `radroots_secrets` +13. `radroots_storage` +14. `radroots_storage_sqlite` +15. `radroots_transport_nostr` +16. `radroots_sync` +17. `radroots_geonames` +18. `radroots_sdk` 19. `radroots` -This is neither the current workspace publication list nor a collapse into `radroots-sdk`. +This is neither the current workspace publication list nor a collapse into `radroots_sdk`. The package family is implemented across the two existing standalone repositories. `radrootslabs/lib` owns packages 1-17, and `radrootslabs/sdk` @@ -75,15 +75,15 @@ ordinary-user façade The final review makes the following deliberate changes: -1. **`radroots-contracts` becomes `radroots-protocol`.** The package is a durable, versioned wire/operation protocol boundary rather than a general-purpose “contracts” bucket. -2. **`radroots-store` and `radroots-store-sqlite` become `radroots-storage` and `radroots-storage-sqlite`.** “Storage” is unambiguous in an agricultural marketplace and describes the package family more accurately than “store.” -3. **`radroots-nostr-connect` remains independent.** It is a bidirectional security protocol with URIs, permissions, client/server state, and independent SDK/Myc consumers. It is not merely a convenience NIP module. +1. **`radroots-contracts` becomes `radroots_protocol`.** The package is a durable, versioned wire/operation protocol boundary rather than a general-purpose “contracts” bucket. +2. **`radroots-store` and `radroots-store-sqlite` become `radroots_storage` and `radroots_storage_sqlite`.** “Storage” is unambiguous in an agricultural marketplace and describes the package family more accurately than “store.” +3. **`radroots_nostr_connect` remains independent.** It is a bidirectional security protocol with URIs, permissions, client/server state, and independent SDK/Myc consumers. It is not merely a convenience NIP module. 4. **Actor ownership is refined.** Public keys/accounts live in identity; event author roles live in the event contract model; actor provenance, authorization, and signer behavior live in signing. 5. **Trade identity is made singular.** The conflicting `TradeId`/`OrderId` definitions MUST be replaced by one canonical protocol `TradeId` and a separately named business `OrderId`. 6. **Public codegen features are removed.** `dto-bindgen`, binding generation, WASM wrappers, and fixture switches remain private build/test concerns. 7. **The workspace moves to Cargo resolver 3.** A virtual Rust 2024 workspace MUST explicitly set `resolver = "3"`. 8. **Release V1 uses MSRV 1.97.1.** The patch release is selected rather than 1.97.0 because it contains a compiler miscompilation fix. -9. **Lower crates do not remain permanently lockstep.** All begin at `0.1.0`, but only `radroots` and `radroots-sdk` are an exact lockstep pair; lower packages follow independent SemVer after the first release. +9. **Lower crates do not remain permanently lockstep.** All begin at `0.1.0`, but only `radroots` and `radroots_sdk` are an exact lockstep pair; lower packages follow independent SemVer after the first release. ## 4. Non-negotiable architecture invariants @@ -93,7 +93,7 @@ The final review makes the following deliberate changes: 4. Generic SPIs MUST NOT expose concrete SQLite, Tokio, Reqwest, Nostr SDK, keyring, or OS-specific types. 5. Adapters and backends MUST implement SPIs; SPIs MUST NOT depend on adapters or backends. 6. Synchronization MUST orchestrate sources, sinks, signing, and storage without owning an executor or scheduler. -7. `radroots-sdk` MUST compose lower packages and own client-level commit semantics; it MUST NOT become a dumping ground for code that has an independent durable boundary. +7. `radroots_sdk` MUST compose lower packages and own client-level commit semantics; it MUST NOT become a dumping ground for code that has an independent durable boundary. 8. `radroots` MUST provide meaningful curation and documentation; it MUST NOT be `pub use radroots_sdk::*`. 9. Version generations MUST live in modules and schema IDs, never in package names. 10. Preview implementation code MAY remain in the monorepo but MUST NOT appear in a published dependency or feature until registry-ready. @@ -104,9 +104,9 @@ The final review makes the following deliberate changes: ### 5.1 Repository ownership -- `https://github.com/radrootslabs/lib` owns `radroots-core` through - `radroots-geonames` (packages 1-17). -- `https://github.com/radrootslabs/sdk` owns `radroots-sdk` and `radroots` +- `https://github.com/radrootslabs/lib` owns `radroots_core` through + `radroots_geonames` (packages 1-17). +- `https://github.com/radrootslabs/sdk` owns `radroots_sdk` and `radroots` (packages 18-19). - Both repositories retain their existing histories and remain independently buildable, testable, packageable, and releasable. @@ -116,35 +116,35 @@ The final review makes the following deliberate changes: | Order | Package | Rust crate path | Tier | Permanent responsibility | |---:|---|---|---|---| -| 1 | `radroots-core` | `radroots_core` | foundation | Foundational value objects and deterministic invariants: decimal, currency, money, percentage, quantity, units, and pricing. | -| 2 | `radroots-identity` | `radroots_identity` | foundation | Public identity and account value types: canonical public keys, identity IDs, account IDs, public profiles, and usernames. | -| 3 | `radroots-blossom` | `radroots_blossom` | protocol primitive | Portable Blossom protocol primitives: canonical blob URLs, hashes, media descriptors, byte-verification typestates, and authorization claims. | -| 4 | `radroots-protocol` | `radroots_protocol` | versioned wire contract | Versioned cross-process and cross-language schemas, capability catalogs, operation descriptors, stable error reports, schema IDs, and structural validation. | -| 5 | `radroots-event` | `radroots_event` | domain protocol model | Canonical Radroots event-domain models, validated event identifiers, tags, event contracts, authoring drafts, signed/verified typestates, and NIP-01 wire-neutral representations. | -| 6 | `radroots-event-codec` | `radroots_event_codec` | deterministic algorithm | Deterministic canonical encoding, decoding, ID/signature verification, contract validation, admission, and manifest generation for Radroots events. | -| 7 | `radroots-trade` | `radroots_trade` | domain algorithm | Trade validation, evidence models, deterministic reduction, conflict analysis, and side-effect-free workflow plans over the canonical event trade model. | -| 8 | `radroots-signing` | `radroots_signing` | host SPI | Object-safe author/signing SPI, actor provenance, authorization checks, requests, receipts, progress, capabilities, and normalized signing errors. | -| 9 | `radroots-transport` | `radroots_transport` | network SPI | Transport-neutral target identities, capability/status models, source and sink SPIs, delivery/fetch policies, bounded requests, provenance, and normalized outcomes. | -| 10 | `radroots-nostr` | `radroots_nostr` | protocol adapter | Portable conversion between Radroots native event/identity types and Nostr protocol types, typed NIP helpers, and concrete local signing adapters; no live relay client. | -| 11 | `radroots-nostr-connect` | `radroots_nostr_connect` | security protocol | Nostr Connect/NIP-46 URIs, methods, permissions, requests, responses, client/server state machines, timeout-independent protocol validation, and normalized errors. | -| 12 | `radroots-secrets` | `radroots_secrets` | security SPI | Secret references, provider and key-wrapping SPIs, versioned encrypted envelopes, zeroization-safe secret handling, and explicit memory/file/keyring adapters. | -| 13 | `radroots-storage` | `radroots_storage` | storage SPI | Backend-neutral canonical event, operation journal, outbox, transport evidence, projection, private-artifact metadata, backup, status, and atomic commit interfaces, plus an in-memory reference backend. | -| 14 | `radroots-storage-sqlite` | `radroots_storage_sqlite` | native storage backend | SQLite implementation of the storage SPIs with schema migration, WAL, locking, integrity, backup/restore, crash recovery, and encrypted private storage. | -| 15 | `radroots-transport-nostr` | `radroots_transport_nostr` | native network adapter | Concrete Nostr EventSource/EventSink implementation: relay URL policy, connection, NIP-42 authentication, bounded fetch pages, delivery, status, and relay-outcome normalization. | -| 16 | `radroots-sync` | `radroots_sync` | local-first orchestration | Shared pull, verification, canonical admission, duplicate handling, projection refresh, outbox signing/delivery, status, and retry-decision orchestration without owning scheduling. | -| 17 | `radroots-geonames` | `radroots_geonames` | concrete data provider | GeoNames asset specification, authenticated/integrity-checked acquisition, database lifecycle, and forward/reverse locality lookup using provider-owned types. | -| 18 | `radroots-sdk` | `radroots_sdk` | advanced front door | Host-neutral asynchronous client engine, product operations, capability reporting, explicit storage/signing/transport composition, diagnostics, backup/restore, and safe commit semantics. | +| 1 | `radroots_core` | `radroots_core` | foundation | Foundational value objects and deterministic invariants: decimal, currency, money, percentage, quantity, units, and pricing. | +| 2 | `radroots_identity` | `radroots_identity` | foundation | Public identity and account value types: canonical public keys, identity IDs, account IDs, public profiles, and usernames. | +| 3 | `radroots_blossom` | `radroots_blossom` | protocol primitive | Portable Blossom protocol primitives: canonical blob URLs, hashes, media descriptors, byte-verification typestates, and authorization claims. | +| 4 | `radroots_protocol` | `radroots_protocol` | versioned wire contract | Versioned cross-process and cross-language schemas, capability catalogs, operation descriptors, stable error reports, schema IDs, and structural validation. | +| 5 | `radroots_event` | `radroots_event` | domain protocol model | Canonical Radroots event-domain models, validated event identifiers, tags, event contracts, authoring drafts, signed/verified typestates, and NIP-01 wire-neutral representations. | +| 6 | `radroots_event_codec` | `radroots_event_codec` | deterministic algorithm | Deterministic canonical encoding, decoding, ID/signature verification, contract validation, admission, and manifest generation for Radroots events. | +| 7 | `radroots_trade` | `radroots_trade` | domain algorithm | Trade validation, evidence models, deterministic reduction, conflict analysis, and side-effect-free workflow plans over the canonical event trade model. | +| 8 | `radroots_signing` | `radroots_signing` | host SPI | Object-safe author/signing SPI, actor provenance, authorization checks, requests, receipts, progress, capabilities, and normalized signing errors. | +| 9 | `radroots_transport` | `radroots_transport` | network SPI | Transport-neutral target identities, capability/status models, source and sink SPIs, delivery/fetch policies, bounded requests, provenance, and normalized outcomes. | +| 10 | `radroots_nostr` | `radroots_nostr` | protocol adapter | Portable conversion between Radroots native event/identity types and Nostr protocol types, typed NIP helpers, and concrete local signing adapters; no live relay client. | +| 11 | `radroots_nostr_connect` | `radroots_nostr_connect` | security protocol | Nostr Connect/NIP-46 URIs, methods, permissions, requests, responses, client/server state machines, timeout-independent protocol validation, and normalized errors. | +| 12 | `radroots_secrets` | `radroots_secrets` | security SPI | Secret references, provider and key-wrapping SPIs, versioned encrypted envelopes, zeroization-safe secret handling, and explicit memory/file/keyring adapters. | +| 13 | `radroots_storage` | `radroots_storage` | storage SPI | Backend-neutral canonical event, operation journal, outbox, transport evidence, projection, private-artifact metadata, backup, status, and atomic commit interfaces, plus an in-memory reference backend. | +| 14 | `radroots_storage_sqlite` | `radroots_storage_sqlite` | native storage backend | SQLite implementation of the storage SPIs with schema migration, WAL, locking, integrity, backup/restore, crash recovery, and encrypted private storage. | +| 15 | `radroots_transport_nostr` | `radroots_transport_nostr` | native network adapter | Concrete Nostr EventSource/EventSink implementation: relay URL policy, connection, NIP-42 authentication, bounded fetch pages, delivery, status, and relay-outcome normalization. | +| 16 | `radroots_sync` | `radroots_sync` | local-first orchestration | Shared pull, verification, canonical admission, duplicate handling, projection refresh, outbox signing/delivery, status, and retry-decision orchestration without owning scheduling. | +| 17 | `radroots_geonames` | `radroots_geonames` | concrete data provider | GeoNames asset specification, authenticated/integrity-checked acquisition, database lifecycle, and forward/reverse locality lookup using provider-owned types. | +| 18 | `radroots_sdk` | `radroots_sdk` | advanced front door | Host-neutral asynchronous client engine, product operations, capability reporting, explicit storage/signing/transport composition, diagnostics, backup/restore, and safe commit semantics. | | 19 | `radroots` | `radroots` | ordinary-user front door | Canonical Rust onboarding package with curated modules, safe defaults, stable convenience builders, domain aggregation, examples, and primary documentation. | ## 6. Detailed package specifications - ### 1. `radroots-core` + ### 1. `radroots_core` **Rust crate path:** `radroots_core` **Tier:** foundation **API maturity at first publish:** durable identity; pre-1.0 API **Platform contract:** no_std + alloc; std feature - **Direct intended consumers:** radroots-event, radroots-trade, radroots-sdk, radroots + **Direct intended consumers:** radroots_event, radroots_trade, radroots_sdk, radroots **Normative responsibility.** Foundational value objects and deterministic invariants: decimal, currency, money, percentage, quantity, units, and pricing. @@ -168,13 +168,13 @@ The final review makes the following deliberate changes: **Explicitly forbidden.** Identifiers, identities, event kinds, networking, persistence, clocks, filesystem paths, process behavior, or application configuration. - ### 2. `radroots-identity` + ### 2. `radroots_identity` **Rust crate path:** `radroots_identity` **Tier:** foundation **API maturity at first publish:** durable identity; pre-1.0 API **Platform contract:** no_std + alloc; std feature - **Direct intended consumers:** radroots-event, radroots-signing, radroots-transport, radroots-nostr, radroots-nostr-connect, radroots-sdk, services + **Direct intended consumers:** radroots_event, radroots_signing, radroots_transport, radroots_nostr, radroots_nostr_connect, radroots_sdk, services **Normative responsibility.** Public identity and account value types: canonical public keys, identity IDs, account IDs, public profiles, and usernames. @@ -195,13 +195,13 @@ The final review makes the following deliberate changes: **Explicitly forbidden.** Secret keys, key generation, NIP-49 encryption, keyrings, files, SQLite, runtime paths, upstream nostr::Event values, signer sessions, or host account selection. - ### 3. `radroots-blossom` + ### 3. `radroots_blossom` **Rust crate path:** `radroots_blossom` **Tier:** protocol primitive **API maturity at first publish:** durable identity; pre-1.0 API **Platform contract:** no_std + alloc; std feature - **Direct intended consumers:** radroots-event, radroots-event-codec, radroots-nostr, media clients + **Direct intended consumers:** radroots_event, radroots_event_codec, radroots_nostr, media clients **Normative responsibility.** Portable Blossom protocol primitives: canonical blob URLs, hashes, media descriptors, byte-verification typestates, and authorization claims. @@ -223,13 +223,13 @@ The final review makes the following deliberate changes: **Explicitly forbidden.** HTTP clients, upload scheduling, cache management, filesystem traversal, application media policy, or global authentication state. - ### 4. `radroots-protocol` + ### 4. `radroots_protocol` **Rust crate path:** `radroots_protocol` **Tier:** versioned wire contract **API maturity at first publish:** durable identity; independently versioned contract modules **Platform contract:** no_std + alloc; std feature - **Direct intended consumers:** radroots-event, radroots-signing, radroots-transport, radroots-storage, radroots-sync, radroots-sdk, radrootsd, bindings + **Direct intended consumers:** radroots_event, radroots_signing, radroots_transport, radroots_storage, radroots_sync, radroots_sdk, radrootsd, bindings **Normative responsibility.** Versioned cross-process and cross-language schemas, capability catalogs, operation descriptors, stable error reports, schema IDs, and structural validation. @@ -252,17 +252,17 @@ The final review makes the following deliberate changes: **Explicitly forbidden.** Native clients, storage, network I/O, executor/runtime ownership, domain reducers, upstream dependency types, unversioned serialized DTOs, or package names containing protocol generations. - ### 5. `radroots-event` + ### 5. `radroots_event` **Rust crate path:** `radroots_event` **Tier:** domain protocol model **API maturity at first publish:** durable identity; pre-1.0 API **Platform contract:** no_std + alloc; std feature - **Direct intended consumers:** radroots-event-codec, radroots-trade, radroots-signing, radroots-transport, radroots-storage, radroots-sync, radroots-nostr, radroots-sdk, indexers + **Direct intended consumers:** radroots_event_codec, radroots_trade, radroots_signing, radroots_transport, radroots_storage, radroots_sync, radroots_nostr, radroots_sdk, indexers **Normative responsibility.** Canonical Radroots event-domain models, validated event identifiers, tags, event contracts, authoring drafts, signed/verified typestates, and NIP-01 wire-neutral representations. - **Required Radroots dependencies:** `radroots-core`, `radroots-identity`, `radroots-blossom`, `radroots-protocol` + **Required Radroots dependencies:** `radroots_core`, `radroots_identity`, `radroots_blossom`, `radroots_protocol` **Optional Radroots dependencies:** None **Default features:** `std`, `serde` **Complete public feature vocabulary:** `std`, `serde`, `knowledge` @@ -292,17 +292,17 @@ The final review makes the following deliberate changes: **Explicitly forbidden.** Live Nostr clients, relay pools, signing backends, SQLite, outbox claims, retry scheduling, application state, or duplicate trade/order identifier concepts. - ### 6. `radroots-event-codec` + ### 6. `radroots_event_codec` **Rust crate path:** `radroots_event_codec` **Tier:** deterministic algorithm **API maturity at first publish:** durable identity; pre-1.0 API **Platform contract:** no_std + alloc where selected features permit; std feature - **Direct intended consumers:** radroots-nostr, radroots-storage-sqlite, radroots-transport-nostr, radroots-sync, radroots-sdk, bindings + **Direct intended consumers:** radroots_nostr, radroots_storage_sqlite, radroots_transport_nostr, radroots_sync, radroots_sdk, bindings **Normative responsibility.** Deterministic canonical encoding, decoding, ID/signature verification, contract validation, admission, and manifest generation for Radroots events. - **Required Radroots dependencies:** `radroots-event`, `radroots-blossom`, `radroots-protocol` + **Required Radroots dependencies:** `radroots_event`, `radroots_blossom`, `radroots_protocol` **Optional Radroots dependencies:** None **Default features:** `std`, `json` **Complete public feature vocabulary:** `std`, `serde`, `json`, `knowledge`, `manifests` @@ -321,17 +321,17 @@ The final review makes the following deliberate changes: **Explicitly forbidden.** nostr-sdk clients, relay networking, persistence, background work, upstream client errors, or host configuration. - ### 7. `radroots-trade` + ### 7. `radroots_trade` **Rust crate path:** `radroots_trade` **Tier:** domain algorithm **API maturity at first publish:** durable identity; pre-1.0 API **Platform contract:** no_std + alloc for model/reducer; std feature - **Direct intended consumers:** radroots-storage, radroots-sync, radroots-sdk, RHI, applications + **Direct intended consumers:** radroots_storage, radroots_sync, radroots_sdk, RHI, applications **Normative responsibility.** Trade validation, evidence models, deterministic reduction, conflict analysis, and side-effect-free workflow plans over the canonical event trade model. - **Required Radroots dependencies:** `radroots-core`, `radroots-identity`, `radroots-event` + **Required Radroots dependencies:** `radroots_core`, `radroots_identity`, `radroots_event` **Optional Radroots dependencies:** None **Default features:** `std`, `serde`, `json` **Complete public feature vocabulary:** `std`, `serde`, `json` @@ -349,17 +349,17 @@ The final review makes the following deliberate changes: **Explicitly forbidden.** A second TradeId definition, actor authorization, signers, event-store access, SQLx, filesystem state, transport delivery, outbox mutation, or process scheduling. - ### 8. `radroots-signing` + ### 8. `radroots_signing` **Rust crate path:** `radroots_signing` **Tier:** host SPI **API maturity at first publish:** durable identity; pre-1.0 API **Platform contract:** no_std + alloc core; std feature - **Direct intended consumers:** radroots-nostr, radroots-sync, radroots-sdk, CLI, Studio, FFI hosts + **Direct intended consumers:** radroots_nostr, radroots_sync, radroots_sdk, CLI, Studio, FFI hosts **Normative responsibility.** Object-safe author/signing SPI, actor provenance, authorization checks, requests, receipts, progress, capabilities, and normalized signing errors. - **Required Radroots dependencies:** `radroots-identity`, `radroots-event`, `radroots-protocol` + **Required Radroots dependencies:** `radroots_identity`, `radroots_event`, `radroots_protocol` **Optional Radroots dependencies:** None **Default features:** `std`, `serde` **Complete public feature vocabulary:** `std`, `serde` @@ -379,17 +379,17 @@ The final review makes the following deliberate changes: **Explicitly forbidden.** Raw secret-key ownership, keyrings, relay networking, NIP-46 session persistence, SQL, UI prompts, or executor creation. - ### 9. `radroots-transport` + ### 9. `radroots_transport` **Rust crate path:** `radroots_transport` **Tier:** network SPI **API maturity at first publish:** durable identity; pre-1.0 API **Platform contract:** no_std + alloc data model; std feature - **Direct intended consumers:** radroots-storage, radroots-transport-nostr, radroots-sync, radroots-sdk, services, future adapters + **Direct intended consumers:** radroots_storage, radroots_transport_nostr, radroots_sync, radroots_sdk, services, future adapters **Normative responsibility.** Transport-neutral target identities, capability/status models, source and sink SPIs, delivery/fetch policies, bounded requests, provenance, and normalized outcomes. - **Required Radroots dependencies:** `radroots-identity`, `radroots-event`, `radroots-protocol` + **Required Radroots dependencies:** `radroots_identity`, `radroots_event`, `radroots_protocol` **Optional Radroots dependencies:** None **Default features:** `std`, `serde` **Complete public feature vocabulary:** `std`, `serde` @@ -410,18 +410,18 @@ The final review makes the following deliberate changes: **Explicitly forbidden.** Closed enums that prevent new transports, Reticulum-specific constants, Nostr URLs at the generic root, storage/outbox access, retries, scheduler ownership, or silent fallback. - ### 10. `radroots-nostr` + ### 10. `radroots_nostr` **Rust crate path:** `radroots_nostr` **Tier:** protocol adapter **API maturity at first publish:** durable identity; pre-1.0 API **Platform contract:** no_std + alloc for conversion surface; std feature - **Direct intended consumers:** radroots-nostr-connect, radroots-transport-nostr, radroots-sdk, Myc, radrootsd + **Direct intended consumers:** radroots_nostr_connect, radroots_transport_nostr, radroots_sdk, Myc, radrootsd **Normative responsibility.** Portable conversion between Radroots native event/identity types and Nostr protocol types, typed NIP helpers, and concrete local signing adapters; no live relay client. - **Required Radroots dependencies:** `radroots-identity`, `radroots-event`, `radroots-event-codec` - **Optional Radroots dependencies:** `radroots-signing`, `radroots-blossom` + **Required Radroots dependencies:** `radroots_identity`, `radroots_event`, `radroots_event_codec` + **Optional Radroots dependencies:** `radroots_signing`, `radroots_blossom` **Default features:** `std`, `events` **Complete public feature vocabulary:** `std`, `events`, `signing`, `nip17`, `blossom` @@ -440,17 +440,17 @@ The final review makes the following deliberate changes: **Explicitly forbidden.** nostr-sdk relay pools, reqwest clients, runtime ownership, broad aliases of upstream nostr types at the root, account persistence, or outbox orchestration. - ### 11. `radroots-nostr-connect` + ### 11. `radroots_nostr_connect` **Rust crate path:** `radroots_nostr_connect` **Tier:** security protocol **API maturity at first publish:** durable identity; pre-1.0 API **Platform contract:** std for v1; protocol data kept portable - **Direct intended consumers:** radroots-sdk, Myc, remote signer tooling + **Direct intended consumers:** radroots_sdk, Myc, remote signer tooling **Normative responsibility.** Nostr Connect/NIP-46 URIs, methods, permissions, requests, responses, client/server state machines, timeout-independent protocol validation, and normalized errors. - **Required Radroots dependencies:** `radroots-identity`, `radroots-event`, `radroots-nostr`, `radroots-protocol` + **Required Radroots dependencies:** `radroots_identity`, `radroots_event`, `radroots_nostr`, `radroots_protocol` **Optional Radroots dependencies:** None **Default features:** `serde` **Complete public feature vocabulary:** `serde` @@ -470,13 +470,13 @@ The final review makes the following deliberate changes: **Explicitly forbidden.** Relay-pool implementation, secret persistence, approval UI, global sessions, Tokio runtime ownership, or Myc-specific service storage. - ### 12. `radroots-secrets` + ### 12. `radroots_secrets` **Rust crate path:** `radroots_secrets` **Tier:** security SPI **API maturity at first publish:** durable identity; pre-1.0 API **Platform contract:** no_std + alloc core; std adapters - **Direct intended consumers:** radroots-storage-sqlite, radroots-sdk, signing hosts, services + **Direct intended consumers:** radroots_storage_sqlite, radroots_sdk, signing hosts, services **Normative responsibility.** Secret references, provider and key-wrapping SPIs, versioned encrypted envelopes, zeroization-safe secret handling, and explicit memory/file/keyring adapters. @@ -501,17 +501,17 @@ The final review makes the following deliberate changes: **Explicitly forbidden.** Public secret bytes, Clone/Debug/Serialize for secret-bearing values, identity profiles, domain tables, arbitrary key/value storage, hidden key generation, or process-global vaults. - ### 13. `radroots-storage` + ### 13. `radroots_storage` **Rust crate path:** `radroots_storage` **Tier:** storage SPI **API maturity at first publish:** durable identity; pre-1.0 API **Platform contract:** std for v1 - **Direct intended consumers:** radroots-storage-sqlite, radroots-sync, radroots-sdk, indexers, tests, future backends + **Direct intended consumers:** radroots_storage_sqlite, radroots_sync, radroots_sdk, indexers, tests, future backends **Normative responsibility.** Backend-neutral canonical event, operation journal, outbox, transport evidence, projection, private-artifact metadata, backup, status, and atomic commit interfaces, plus an in-memory reference backend. - **Required Radroots dependencies:** `radroots-event`, `radroots-trade`, `radroots-transport`, `radroots-protocol` + **Required Radroots dependencies:** `radroots_event`, `radroots_trade`, `radroots_transport`, `radroots_protocol` **Optional Radroots dependencies:** None **Default features:** `memory`, `serde` **Complete public feature vocabulary:** `memory`, `serde` @@ -533,17 +533,17 @@ The final review makes the following deliberate changes: **Explicitly forbidden.** SQL text, SQLx pools or transactions, filesystem paths, application UI state, concrete retry loops, Nostr clients, or unconstrained raw key/value escape hatches. - ### 14. `radroots-storage-sqlite` + ### 14. `radroots_storage_sqlite` **Rust crate path:** `radroots_storage_sqlite` **Tier:** native storage backend **API maturity at first publish:** durable identity; pre-1.0 API **Platform contract:** std-only native backend - **Direct intended consumers:** radroots-sdk, CLI, Studio, mobile/FFI + **Direct intended consumers:** radroots_sdk, CLI, Studio, mobile/FFI **Normative responsibility.** SQLite implementation of the storage SPIs with schema migration, WAL, locking, integrity, backup/restore, crash recovery, and encrypted private storage. - **Required Radroots dependencies:** `radroots-storage`, `radroots-event-codec`, `radroots-secrets` + **Required Radroots dependencies:** `radroots_storage`, `radroots_event_codec`, `radroots_secrets` **Optional Radroots dependencies:** None **Default features:** None **Complete public feature vocabulary:** None @@ -563,17 +563,17 @@ The final review makes the following deliberate changes: **Explicitly forbidden.** Public SqlitePool/Connection/Transaction handles, caller-supplied arbitrary SQL, Studio state, global connection pools, runtime installation, or silent schema downgrade. - ### 15. `radroots-transport-nostr` + ### 15. `radroots_transport_nostr` **Rust crate path:** `radroots_transport_nostr` **Tier:** native network adapter **API maturity at first publish:** durable identity; pre-1.0 API **Platform contract:** std-only; Tokio implementation detail in v1 - **Direct intended consumers:** radroots-sdk, CLI, radrootsd, advanced hosts + **Direct intended consumers:** radroots_sdk, CLI, radrootsd, advanced hosts **Normative responsibility.** Concrete Nostr EventSource/EventSink implementation: relay URL policy, connection, NIP-42 authentication, bounded fetch pages, delivery, status, and relay-outcome normalization. - **Required Radroots dependencies:** `radroots-transport`, `radroots-nostr`, `radroots-event-codec`, `radroots-protocol` + **Required Radroots dependencies:** `radroots_transport`, `radroots_nostr`, `radroots_event_codec`, `radroots_protocol` **Optional Radroots dependencies:** None **Default features:** None **Complete public feature vocabulary:** None @@ -592,17 +592,17 @@ The final review makes the following deliberate changes: **Explicitly forbidden.** Event-store ingestion, outbox claiming, retry scheduling, projection refresh, global relay clients, direct SQL, or transport fallback. - ### 16. `radroots-sync` + ### 16. `radroots_sync` **Rust crate path:** `radroots_sync` **Tier:** local-first orchestration **API maturity at first publish:** durable identity; pre-1.0 API **Platform contract:** std-only in v1; executor-neutral public API - **Direct intended consumers:** radroots-sdk, CLI, Studio, mobile/FFI, advanced hosts + **Direct intended consumers:** radroots_sdk, CLI, Studio, mobile/FFI, advanced hosts **Normative responsibility.** Shared pull, verification, canonical admission, duplicate handling, projection refresh, outbox signing/delivery, status, and retry-decision orchestration without owning scheduling. - **Required Radroots dependencies:** `radroots-event`, `radroots-event-codec`, `radroots-signing`, `radroots-transport`, `radroots-storage`, `radroots-trade`, `radroots-protocol` + **Required Radroots dependencies:** `radroots_event`, `radroots_event_codec`, `radroots_signing`, `radroots_transport`, `radroots_storage`, `radroots_trade`, `radroots_protocol` **Optional Radroots dependencies:** None **Default features:** `serde` **Complete public feature vocabulary:** `serde` @@ -621,13 +621,13 @@ The final review makes the following deliberate changes: **Explicitly forbidden.** Creating an executor, spawning hidden workers, installing timers globally, owning process lifecycle, storing UI state, or transport-specific branches outside adapters. - ### 17. `radroots-geonames` + ### 17. `radroots_geonames` **Rust crate path:** `radroots_geonames` **Tier:** concrete data provider **API maturity at first publish:** durable identity; pre-1.0 API **Platform contract:** std-only - **Direct intended consumers:** radroots-sdk, CLI, geocoding applications + **Direct intended consumers:** radroots_sdk, CLI, geocoding applications **Normative responsibility.** GeoNames asset specification, authenticated/integrity-checked acquisition, database lifecycle, and forward/reverse locality lookup using provider-owned types. @@ -649,7 +649,7 @@ The final review makes the following deliberate changes: **Explicitly forbidden.** Generic multi-provider abstraction before a second provider exists, runtime-path policy, hidden downloads, SDK configuration types, SQLx/reqwest types in the public API, or test-fixture features. - ### 18. `radroots-sdk` + ### 18. `radroots_sdk` **Rust crate path:** `radroots_sdk` **Tier:** advanced front door @@ -659,8 +659,8 @@ The final review makes the following deliberate changes: **Normative responsibility.** Host-neutral asynchronous client engine, product operations, capability reporting, explicit storage/signing/transport composition, diagnostics, backup/restore, and safe commit semantics. - **Required Radroots dependencies:** `radroots-core`, `radroots-identity`, `radroots-protocol`, `radroots-event`, `radroots-event-codec`, `radroots-trade`, `radroots-signing`, `radroots-transport`, `radroots-storage` - **Optional Radroots dependencies:** `radroots-secrets`, `radroots-storage-sqlite`, `radroots-nostr`, `radroots-nostr-connect`, `radroots-transport-nostr`, `radroots-sync`, `radroots-geonames` + **Required Radroots dependencies:** `radroots_core`, `radroots_identity`, `radroots_protocol`, `radroots_event`, `radroots_event_codec`, `radroots_trade`, `radroots_signing`, `radroots_transport`, `radroots_storage` + **Optional Radroots dependencies:** `radroots_secrets`, `radroots_storage_sqlite`, `radroots_nostr`, `radroots_nostr_connect`, `radroots_transport_nostr`, `radroots_sync`, `radroots_geonames` **Default features:** `memory` **Complete public feature vocabulary:** `memory`, `sqlite`, `sync`, `nostr`, `nip46`, `local-signing`, `radrootsd`, `geonames`, `knowledge`, `native`, `full` @@ -687,13 +687,13 @@ The final review makes the following deliberate changes: **Rust crate path:** `radroots` **Tier:** ordinary-user front door - **API maturity at first publish:** durable identity; lockstep pre-1.0 API with radroots-sdk + **API maturity at first publish:** durable identity; lockstep pre-1.0 API with radroots_sdk **Platform contract:** std-only **Direct intended consumers:** ordinary Rust applications, examples, documentation **Normative responsibility.** Canonical Rust onboarding package with curated modules, safe defaults, stable convenience builders, domain aggregation, examples, and primary documentation. - **Required Radroots dependencies:** `radroots-sdk`, `radroots-core`, `radroots-identity`, `radroots-event`, `radroots-trade`, `radroots-transport` + **Required Radroots dependencies:** `radroots_sdk`, `radroots_core`, `radroots_identity`, `radroots_event`, `radroots_trade`, `radroots_transport` **Optional Radroots dependencies:** None **Default features:** `client` **Complete public feature vocabulary:** `client`, `native`, `nostr`, `nip46`, `radrootsd`, `geonames`, `knowledge`, `full` @@ -714,7 +714,7 @@ The final review makes the following deliberate changes: **Permitted root exports:** `Client`, `ClientBuilder`, `Error`, `Result` - **Explicitly forbidden.** A public radroots::sdk namespace, wildcard reexport of radroots-sdk, duplicate engine implementation, CLI binary, hidden network/filesystem/keychain side effects, or exposure of every lower-crate symbol. + **Explicitly forbidden.** A public radroots::sdk namespace, wildcard reexport of radroots_sdk, duplicate engine implementation, CLI binary, hidden network/filesystem/keychain side effects, or exposure of every lower-crate symbol. ## 7. Normative dependency graph @@ -723,100 +723,100 @@ The final review makes the following deliberate changes: | Dependency | Dependent | Edge | |---|---|---| -| `radroots-blossom` | `radroots-event` | required | -| `radroots-core` | `radroots-event` | required | -| `radroots-identity` | `radroots-event` | required | -| `radroots-protocol` | `radroots-event` | required | -| `radroots-blossom` | `radroots-event-codec` | required | -| `radroots-event` | `radroots-event-codec` | required | -| `radroots-protocol` | `radroots-event-codec` | required | -| `radroots-core` | `radroots-trade` | required | -| `radroots-event` | `radroots-trade` | required | -| `radroots-identity` | `radroots-trade` | required | -| `radroots-event` | `radroots-signing` | required | -| `radroots-identity` | `radroots-signing` | required | -| `radroots-protocol` | `radroots-signing` | required | -| `radroots-event` | `radroots-transport` | required | -| `radroots-identity` | `radroots-transport` | required | -| `radroots-protocol` | `radroots-transport` | required | -| `radroots-blossom` | `radroots-nostr` | optional | -| `radroots-signing` | `radroots-nostr` | optional | -| `radroots-event` | `radroots-nostr` | required | -| `radroots-event-codec` | `radroots-nostr` | required | -| `radroots-identity` | `radroots-nostr` | required | -| `radroots-event` | `radroots-nostr-connect` | required | -| `radroots-identity` | `radroots-nostr-connect` | required | -| `radroots-nostr` | `radroots-nostr-connect` | required | -| `radroots-protocol` | `radroots-nostr-connect` | required | -| `radroots-event` | `radroots-storage` | required | -| `radroots-protocol` | `radroots-storage` | required | -| `radroots-trade` | `radroots-storage` | required | -| `radroots-transport` | `radroots-storage` | required | -| `radroots-event-codec` | `radroots-storage-sqlite` | required | -| `radroots-secrets` | `radroots-storage-sqlite` | required | -| `radroots-storage` | `radroots-storage-sqlite` | required | -| `radroots-event-codec` | `radroots-transport-nostr` | required | -| `radroots-nostr` | `radroots-transport-nostr` | required | -| `radroots-protocol` | `radroots-transport-nostr` | required | -| `radroots-transport` | `radroots-transport-nostr` | required | -| `radroots-event` | `radroots-sync` | required | -| `radroots-event-codec` | `radroots-sync` | required | -| `radroots-protocol` | `radroots-sync` | required | -| `radroots-signing` | `radroots-sync` | required | -| `radroots-storage` | `radroots-sync` | required | -| `radroots-trade` | `radroots-sync` | required | -| `radroots-transport` | `radroots-sync` | required | -| `radroots-geonames` | `radroots-sdk` | optional | -| `radroots-nostr` | `radroots-sdk` | optional | -| `radroots-nostr-connect` | `radroots-sdk` | optional | -| `radroots-secrets` | `radroots-sdk` | optional | -| `radroots-storage-sqlite` | `radroots-sdk` | optional | -| `radroots-sync` | `radroots-sdk` | optional | -| `radroots-transport-nostr` | `radroots-sdk` | optional | -| `radroots-core` | `radroots-sdk` | required | -| `radroots-event` | `radroots-sdk` | required | -| `radroots-event-codec` | `radroots-sdk` | required | -| `radroots-identity` | `radroots-sdk` | required | -| `radroots-protocol` | `radroots-sdk` | required | -| `radroots-signing` | `radroots-sdk` | required | -| `radroots-storage` | `radroots-sdk` | required | -| `radroots-trade` | `radroots-sdk` | required | -| `radroots-transport` | `radroots-sdk` | required | -| `radroots-core` | `radroots` | required | -| `radroots-event` | `radroots` | required | -| `radroots-identity` | `radroots` | required | -| `radroots-sdk` | `radroots` | required | -| `radroots-trade` | `radroots` | required | -| `radroots-transport` | `radroots` | required | +| `radroots_blossom` | `radroots_event` | required | +| `radroots_core` | `radroots_event` | required | +| `radroots_identity` | `radroots_event` | required | +| `radroots_protocol` | `radroots_event` | required | +| `radroots_blossom` | `radroots_event_codec` | required | +| `radroots_event` | `radroots_event_codec` | required | +| `radroots_protocol` | `radroots_event_codec` | required | +| `radroots_core` | `radroots_trade` | required | +| `radroots_event` | `radroots_trade` | required | +| `radroots_identity` | `radroots_trade` | required | +| `radroots_event` | `radroots_signing` | required | +| `radroots_identity` | `radroots_signing` | required | +| `radroots_protocol` | `radroots_signing` | required | +| `radroots_event` | `radroots_transport` | required | +| `radroots_identity` | `radroots_transport` | required | +| `radroots_protocol` | `radroots_transport` | required | +| `radroots_blossom` | `radroots_nostr` | optional | +| `radroots_signing` | `radroots_nostr` | optional | +| `radroots_event` | `radroots_nostr` | required | +| `radroots_event_codec` | `radroots_nostr` | required | +| `radroots_identity` | `radroots_nostr` | required | +| `radroots_event` | `radroots_nostr_connect` | required | +| `radroots_identity` | `radroots_nostr_connect` | required | +| `radroots_nostr` | `radroots_nostr_connect` | required | +| `radroots_protocol` | `radroots_nostr_connect` | required | +| `radroots_event` | `radroots_storage` | required | +| `radroots_protocol` | `radroots_storage` | required | +| `radroots_trade` | `radroots_storage` | required | +| `radroots_transport` | `radroots_storage` | required | +| `radroots_event_codec` | `radroots_storage_sqlite` | required | +| `radroots_secrets` | `radroots_storage_sqlite` | required | +| `radroots_storage` | `radroots_storage_sqlite` | required | +| `radroots_event_codec` | `radroots_transport_nostr` | required | +| `radroots_nostr` | `radroots_transport_nostr` | required | +| `radroots_protocol` | `radroots_transport_nostr` | required | +| `radroots_transport` | `radroots_transport_nostr` | required | +| `radroots_event` | `radroots_sync` | required | +| `radroots_event_codec` | `radroots_sync` | required | +| `radroots_protocol` | `radroots_sync` | required | +| `radroots_signing` | `radroots_sync` | required | +| `radroots_storage` | `radroots_sync` | required | +| `radroots_trade` | `radroots_sync` | required | +| `radroots_transport` | `radroots_sync` | required | +| `radroots_geonames` | `radroots_sdk` | optional | +| `radroots_nostr` | `radroots_sdk` | optional | +| `radroots_nostr_connect` | `radroots_sdk` | optional | +| `radroots_secrets` | `radroots_sdk` | optional | +| `radroots_storage_sqlite` | `radroots_sdk` | optional | +| `radroots_sync` | `radroots_sdk` | optional | +| `radroots_transport_nostr` | `radroots_sdk` | optional | +| `radroots_core` | `radroots_sdk` | required | +| `radroots_event` | `radroots_sdk` | required | +| `radroots_event_codec` | `radroots_sdk` | required | +| `radroots_identity` | `radroots_sdk` | required | +| `radroots_protocol` | `radroots_sdk` | required | +| `radroots_signing` | `radroots_sdk` | required | +| `radroots_storage` | `radroots_sdk` | required | +| `radroots_trade` | `radroots_sdk` | required | +| `radroots_transport` | `radroots_sdk` | required | +| `radroots_core` | `radroots` | required | +| `radroots_event` | `radroots` | required | +| `radroots_identity` | `radroots` | required | +| `radroots_sdk` | `radroots` | required | +| `radroots_trade` | `radroots` | required | +| `radroots_transport` | `radroots` | required | ### 7.2 Architectural graph ```text -radroots-core radroots-identity radroots-blossom +radroots_core radroots_identity radroots_blossom \ | / \ | / - +---------- radroots-protocol --------+ + +---------- radroots_protocol --------+ | - radroots-event + radroots_event / | \ / | \ - radroots-event-codec | radroots-trade + radroots_event_codec | radroots_trade | +----------+-----------+ | | | - radroots-signing radroots-transport radroots-storage + radroots_signing radroots_transport radroots_storage | | | - | radroots-nostr +--> radroots-storage-sqlite + | radroots_nostr +--> radroots_storage_sqlite | | - | radroots-nostr-connect + | radroots_nostr_connect | | - +---- radroots-transport-nostr + +---- radroots_transport_nostr | - radroots-sync + radroots_sync -radroots-geonames -------------------------+ +radroots_geonames -------------------------+ | -all selected lower packages ----------> radroots-sdk ---> radroots +all selected lower packages ----------> radroots_sdk ---> radroots ``` This diagram is explanatory. The release tool MUST use Cargo-resolved metadata as authority. @@ -825,28 +825,28 @@ This diagram is explanatory. The release tool MUST use Cargo-resolved metadata a | Concept | Canonical owning crate | Rule | |---|---|---| -| Decimal, money, quantity, unit, pricing | `radroots-core` | No duplicate wrapper in SDK or trade. | -| Public key, identity ID, account ID, username | `radroots-identity` | Secret material is forbidden here. | -| Event ID, event signature, coordinate, D-tag, event kind | `radroots-event` | Store bytes/newtypes, not unvalidated Strings. | -| Event contract author role | `radroots-event::contract` | This is an event-authoring rule, not an account property. | -| Actor provenance and author context | `radroots-signing` | Combines identity with event author roles at the signing boundary. | -| Canonical protocol TradeId/CandidateId/MutationId | `radroots-event::trade` | Exactly one definition. | -| Human/business OrderId | `radroots-trade` | MUST NOT be aliased or wrapped as TradeId. | -| Runtime/wire DTO generations | `radroots-protocol` | Native packages convert at boundaries. | -| Secret references and encrypted envelopes | `radroots-secrets` | No domain-specific tables. | -| Transport ID, target, capability, outcome | `radroots-transport` | TransportId is extensible, not a closed enum. | -| Native event/outbox/journal/projection storage | `radroots-storage` | Backend-neutral interfaces only. | -| SQLite schema and connection behavior | `radroots-storage-sqlite` | SQLx remains private. | -| Relay URL and Nostr network status | `radroots-transport-nostr` | Protocol conversions remain in `radroots-nostr`. | -| Pull/push/ingest/projection orchestration | `radroots-sync` | No host scheduling. | -| Client-level requests, plans, receipts, diagnostics | `radroots-sdk` | Use lower canonical types rather than duplicate wrappers. | +| Decimal, money, quantity, unit, pricing | `radroots_core` | No duplicate wrapper in SDK or trade. | +| Public key, identity ID, account ID, username | `radroots_identity` | Secret material is forbidden here. | +| Event ID, event signature, coordinate, D-tag, event kind | `radroots_event` | Store bytes/newtypes, not unvalidated Strings. | +| Event contract author role | `radroots_event::contract` | This is an event-authoring rule, not an account property. | +| Actor provenance and author context | `radroots_signing` | Combines identity with event author roles at the signing boundary. | +| Canonical protocol TradeId/CandidateId/MutationId | `radroots_event::trade` | Exactly one definition. | +| Human/business OrderId | `radroots_trade` | MUST NOT be aliased or wrapped as TradeId. | +| Runtime/wire DTO generations | `radroots_protocol` | Native packages convert at boundaries. | +| Secret references and encrypted envelopes | `radroots_secrets` | No domain-specific tables. | +| Transport ID, target, capability, outcome | `radroots_transport` | TransportId is extensible, not a closed enum. | +| Native event/outbox/journal/projection storage | `radroots_storage` | Backend-neutral interfaces only. | +| SQLite schema and connection behavior | `radroots_storage_sqlite` | SQLx remains private. | +| Relay URL and Nostr network status | `radroots_transport_nostr` | Protocol conversions remain in `radroots_nostr`. | +| Pull/push/ingest/projection orchestration | `radroots_sync` | No host scheduling. | +| Client-level requests, plans, receipts, diagnostics | `radroots_sdk` | Use lower canonical types rather than duplicate wrappers. | ## 9. Rust API and naming law ### 9.1 Packages, crates, modules, and types -- Cargo package names MUST be lowercase and hyphenated: `radroots-event-codec`. -- Rust crate paths MUST be snake case: `radroots_event_codec`. +- Cargo package names MUST use lowercase snake case: `radroots_event_codec`. +- Rust crate paths MUST use the same lowercase snake case: `radroots_event_codec`. - Modules MUST use singular snake-case nouns unless the concept is inherently plural. - Types and traits MUST use `UpperCamelCase`; functions and methods MUST use `snake_case`. - Items MUST NOT repeat their crate or module name: @@ -861,7 +861,7 @@ This diagram is explanatory. The release tool MUST use Cargo-resolved metadata a - Crate roots MUST be small. - Wildcard reexports and `pub use models::*` are forbidden. - Lower crates MUST NOT publish a broad `prelude` in V1. -- Every native public struct MUST have private fields unless it is an intentionally passive versioned DTO in `radroots-protocol`. +- Every native public struct MUST have private fields unless it is an intentionally passive versioned DTO in `radroots_protocol`. - Evolvable enums and reports SHOULD be `#[non_exhaustive]`. - Semantic IDs MUST NOT implement `Deref<Target = str>`. - IDs SHOULD store canonical bytes or validated compact representations; string encoding belongs at boundaries. @@ -890,7 +890,7 @@ Host SPIs MUST: - avoid associated types that leak backend implementations; - not expose private or third-party implementation types. -The Rust SPI is native. Browser and generated-language transports use `radroots-protocol` DTOs and language-native interfaces rather than weakening native `Send + Sync` guarantees. +The Rust SPI is native. Browser and generated-language transports use `radroots_protocol` DTOs and language-native interfaces rather than weakening native `Send + Sync` guarantees. ## 10. Feature law @@ -912,39 +912,39 @@ The Rust SPI is native. Browser and generated-language transports use `radroots- 9. Public feature removal is a breaking change. 10. `--all-features` MUST build on every declared target for which the package claims support. -### 10.1 `radroots-sdk` +### 10.1 `radroots_sdk` ```toml [features] default = ["memory"] # Safe, in-process storage; no files or network. -memory = ["radroots-storage/memory"] +memory = ["radroots_storage/memory"] # Explicit native capabilities. -sqlite = ["dep:radroots-storage-sqlite"] -sync = ["dep:radroots-sync"] +sqlite = ["dep:radroots_storage_sqlite"] +sync = ["dep:radroots_sync"] nostr = [ "sync", - "dep:radroots-nostr", - "dep:radroots-transport-nostr", + "dep:radroots_nostr", + "dep:radroots_transport_nostr", ] nip46 = [ "nostr", - "dep:radroots-nostr-connect", + "dep:radroots_nostr_connect", ] local-signing = [ - "dep:radroots-secrets", - "radroots-nostr/signing", + "dep:radroots_secrets", + "radroots_nostr/signing", ] radrootsd = [ "sync", "dep:reqwest", ] -geonames = ["dep:radroots-geonames"] +geonames = ["dep:radroots_geonames"] knowledge = [ - "radroots-event/knowledge", - "radroots-event-codec/knowledge", + "radroots_event/knowledge", + "radroots_event_codec/knowledge", ] native = ["sqlite", "sync", "local-signing"] @@ -964,14 +964,14 @@ full = [ [features] default = ["client"] -client = ["radroots-sdk/default"] -native = ["client", "radroots-sdk/native"] -nostr = ["client", "radroots-sdk/nostr"] -nip46 = ["nostr", "radroots-sdk/nip46"] -radrootsd = ["client", "radroots-sdk/radrootsd"] -geonames = ["client", "radroots-sdk/geonames"] -knowledge = ["client", "radroots-sdk/knowledge"] -full = ["radroots-sdk/full"] +client = ["radroots_sdk/default"] +native = ["client", "radroots_sdk/native"] +nostr = ["client", "radroots_sdk/nostr"] +nip46 = ["nostr", "radroots_sdk/nip46"] +radrootsd = ["client", "radroots_sdk/radrootsd"] +geonames = ["client", "radroots_sdk/geonames"] +knowledge = ["client", "radroots_sdk/knowledge"] +full = ["radroots_sdk/full"] ``` Reticulum, mesh, Simplex, NostrDB, replica, and SP1 feature names MUST NOT appear in published V1 manifests. @@ -1023,7 +1023,7 @@ A transport MAY implement either or both. ### 12.1 Logical ownership -`radroots-storage` owns interfaces for: +`radroots_storage` owns interfaces for: - canonical event admission and queries; - operation journal; @@ -1034,7 +1034,7 @@ A transport MAY implement either or both. - storage status and integrity; - atomic workflow commits. -`radroots-storage-sqlite` implements them. +`radroots_storage_sqlite` implements them. ### 12.2 Native layout @@ -1084,11 +1084,11 @@ host-owned databases ### 13.1 Identity -`radroots-identity` contains no private key and no upstream Nostr event object. `PublicKey` is a validated canonical Radroots author key. NIP-19/npub conversion lives in `radroots-nostr`. +`radroots_identity` contains no private key and no upstream Nostr event object. `PublicKey` is a validated canonical Radroots author key. NIP-19/npub conversion lives in `radroots_nostr`. ### 13.2 Signing -`radroots-signing::Signer` signs a frozen canonical `EventDraft`. The signing layer: +`radroots_signing::Signer` signs a frozen canonical `EventDraft`. The signing layer: - authorizes actor role and expected public key before invoking a signer; - verifies the signer result matches the exact draft; @@ -1097,7 +1097,7 @@ host-owned databases - defines cancellation before and after remote request publication; - never logs or serializes private material. -Concrete local Nostr signing lives in `radroots-nostr`; NIP-46 protocol state lives in `radroots-nostr-connect`; host composition lives in `radroots-sdk`. +Concrete local Nostr signing lives in `radroots_nostr`; NIP-46 protocol state lives in `radroots_nostr_connect`; host composition lives in `radroots_sdk`. ### 13.3 Secrets @@ -1112,10 +1112,10 @@ Secret-bearing values: ## 14. Event and trade model corrections -1. `radroots-event` remains the canonical owner of event-bound identifiers and trade wire identities. -2. `radroots-trade` MUST delete its conflicting `TradeId(OrderId)` definition. +1. `radroots_event` remains the canonical owner of event-bound identifiers and trade wire identities. +2. `radroots_trade` MUST delete its conflicting `TradeId(OrderId)` definition. 3. `TradeId` and `OrderId` MUST remain semantically distinct. -4. `radroots-trade` consumes canonical event trade models and owns reducers, evidence, validation, and workflow plans. +4. `radroots_trade` consumes canonical event trade models and owns reducers, evidence, validation, and workflow plans. 5. Trade MUST NOT depend on authority, storage, SQLx, Nostr clients, or transports. 6. Event codec MUST own wire conversion; trade reducers operate on validated native inputs. 7. Typed authoring policy MUST reject reserved event kinds before any signer is consulted. @@ -1123,7 +1123,7 @@ Secret-bearing values: ## 15. Error model -Each crate owns a native `Error` with preserved sources. `radroots-protocol::error::v1::ErrorReport` is the serialized boundary. +Each crate owns a native `Error` with preserved sources. `radroots_protocol::error::v1::ErrorReport` is the serialized boundary. One generated authority MUST define: @@ -1142,7 +1142,7 @@ Third-party errors MUST NOT appear as public variants. Sensitive source messages ## 16. SDK and façade rules -### 16.1 `radroots-sdk` +### 16.1 `radroots_sdk` - `Client` is `Clone + Send + Sync`. - The host owns the executor and scheduling. @@ -1159,7 +1159,7 @@ Third-party errors MUST NOT appear as public variants. Sensitive source messages - Primary documentation and examples use `radroots`. - The façade adds curated modules, convenience constructors, safe defaults, and domain aggregation. -- Advanced hosts use `radroots-sdk` directly. +- Advanced hosts use `radroots_sdk` directly. - There is no `radroots::sdk` public namespace. - The façade does not expose implementation crates accidentally. @@ -1167,8 +1167,8 @@ Third-party errors MUST NOT appear as public variants. Sensitive source messages - Rust binding, WASM, UniFFI, Swift, Kotlin, TypeScript, and codegen crates remain `publish = false`. - Public runtime crates have no codegen feature or codegen dependency. -- Versioned language DTOs derive from `radroots-protocol`. -- Deterministic event algorithms derive from `radroots-event-codec`. +- Versioned language DTOs derive from `radroots_protocol`. +- Deterministic event algorithms derive from `radroots_event_codec`. - Generated artifacts are checked in or generated reproducibly and carry source hashes. - Rust native module structure is not mechanically mirrored into other languages. - Language runtimes own networking, scheduling, keychain prompts, and UI lifecycle where appropriate. @@ -1210,36 +1210,36 @@ Names containing `common`, `utils`, `types`, `models`, `preview`, `unstable`, `v | Current package/family | Final owner | Required action | |---|---|---| -| `radroots_core` | `radroots-core` | Retain and rename package with hyphens; remove RadrootsCore type prefixes. | -| `radroots_identity` | `radroots-identity + radroots-signing + radroots-secrets + radroots-storage` | Keep only public identity/account concepts in identity; move secrets, signers, and persistence. | -| `radroots_blossom` | `radroots-blossom` | Retain portable protocol primitives. | -| `radroots_protocol_contract_v1` | `radroots-protocol::event::v1 / capability::v1` | Merge; generation becomes a module, never a package suffix. | -| `radroots_runtime_contract_v1` | `radroots-protocol::runtime::v1` | Merge; generation becomes a module. | -| `radroots_transport_publish_protocol` | `radroots-protocol::radrootsd::transport_publish::v5` | Merge daemon wire DTOs into the versioned protocol package. | -| `radroots_event` | `radroots-event` | Retain singular package; narrow to canonical event-domain model. | -| `radroots_event_codec` | `radroots-event-codec` | Retain; remove live Nostr/upstream client responsibilities. | -| `radroots_event_index` | `radroots-storage::projection/index` | Merge; current checkpoint/manifest model is not an independent indexing engine. | -| `radroots_trade` | `radroots-trade` | Retain algorithms; remove authority, storage, SQL, transport, and duplicate TradeId. | -| `radroots_authority` | `radroots-identity + radroots-event::contract + radroots-signing` | Split account/public-key ownership, author-role contracts, and signing/authorization SPI. | -| `radroots_transport` | `radroots-transport` | Retain and redesign as extensible source/sink SPI. | -| `radroots_transport_nostr` | `radroots-transport-nostr` | Retain adapter; remove storage and sync orchestration. | +| `radroots_core` | `radroots_core` | Retain the snake-case package name and remove RadrootsCore type prefixes. | +| `radroots_identity` | `radroots_identity + radroots_signing + radroots_secrets + radroots_storage` | Keep only public identity/account concepts in identity; move secrets, signers, and persistence. | +| `radroots_blossom` | `radroots_blossom` | Retain portable protocol primitives. | +| `radroots_protocol_contract_v1` | `radroots_protocol::event::v1 / capability::v1` | Merge; generation becomes a module, never a package suffix. | +| `radroots_runtime_contract_v1` | `radroots_protocol::runtime::v1` | Merge; generation becomes a module. | +| `radroots_transport_publish_protocol` | `radroots_protocol::radrootsd::transport_publish::v5` | Merge daemon wire DTOs into the versioned protocol package. | +| `radroots_event` | `radroots_event` | Retain singular package; narrow to canonical event-domain model. | +| `radroots_event_codec` | `radroots_event_codec` | Retain; remove live Nostr/upstream client responsibilities. | +| `radroots_event_index` | `radroots_storage::projection/index` | Merge; current checkpoint/manifest model is not an independent indexing engine. | +| `radroots_trade` | `radroots_trade` | Retain algorithms; remove authority, storage, SQL, transport, and duplicate TradeId. | +| `radroots_authority` | `radroots_identity + radroots_event::contract + radroots_signing` | Split account/public-key ownership, author-role contracts, and signing/authorization SPI. | +| `radroots_transport` | `radroots_transport` | Retain and redesign as extensible source/sink SPI. | +| `radroots_transport_nostr` | `radroots_transport_nostr` | Retain adapter; remove storage and sync orchestration. | | `radroots_transport_reticulum` | `private preview` | Withhold until a real adapter passes the transport conformance suite. | -| `radroots_nostr` | `radroots-nostr` | Retain protocol conversion; remove live relay client and broad upstream aliases. | -| `radroots_nostr_connect` | `radroots-nostr-connect` | Retain as independent bidirectional NIP-46 protocol boundary. | -| `radroots_nostr_accounts` | `radroots-identity + radroots-secrets + radroots-storage + radroots-sdk` | Split mixed account, vault, persistence, and manager responsibilities. | -| `radroots_nostr_signer` | `radroots-signing + radroots-nostr-connect + Myc-private state` | Do not publish current service-state package. | -| `radroots_nostr_runtime` | `radroots-transport-nostr + radroots-sync` | Merge live relay runtime into adapter/orchestration layers. | +| `radroots_nostr` | `radroots_nostr` | Retain protocol conversion; remove live relay client and broad upstream aliases. | +| `radroots_nostr_connect` | `radroots_nostr_connect` | Retain as independent bidirectional NIP-46 protocol boundary. | +| `radroots_nostr_accounts` | `radroots_identity + radroots_secrets + radroots_storage + radroots_sdk` | Split mixed account, vault, persistence, and manager responsibilities. | +| `radroots_nostr_signer` | `radroots_signing + radroots_nostr_connect + Myc-private state` | Do not publish current service-state package. | +| `radroots_nostr_runtime` | `radroots_transport_nostr + radroots_sync` | Merge live relay runtime into adapter/orchestration layers. | | `radroots_nostrdb` | `private; possible future radroots-storage-nostrdb` | Withhold until the storage SPI and external consumers justify a backend package. | -| `radroots_event_store` | `radroots-storage + radroots-storage-sqlite` | Split backend-neutral contracts from SQLite implementation. | -| `radroots_outbox` | `radroots-storage + radroots-storage-sqlite` | Merge as one persistence capability with atomic operation commits. | -| `radroots_runtime_store` | `radroots-storage or host-private state` | Retire broad name and classify each table by owner. | -| `radroots_sql_core` | `radroots-storage-sqlite private internals` | Remove raw SQL/JSON executor from public API. | -| `radroots_secret_vault` | `radroots-secrets` | Merge provider/wrapping SPI. | -| `radroots_protected_store` | `radroots-secrets` | Merge encrypted-envelope semantics. | -| `radroots_geocoder` | `radroots-geonames` | Rename to the actual concrete provider. | -| `radroots_runtime` | `radroots-sync + radroots-storage + host-private tooling` | Dismantle mixed config/signals/logging/queue/transport package. | +| `radroots_event_store` | `radroots_storage + radroots_storage_sqlite` | Split backend-neutral contracts from SQLite implementation. | +| `radroots_outbox` | `radroots_storage + radroots_storage_sqlite` | Merge as one persistence capability with atomic operation commits. | +| `radroots_runtime_store` | `radroots_storage or host-private state` | Retire broad name and classify each table by owner. | +| `radroots_sql_core` | `radroots_storage_sqlite private internals` | Remove raw SQL/JSON executor from public API. | +| `radroots_secret_vault` | `radroots_secrets` | Merge provider/wrapping SPI. | +| `radroots_protected_store` | `radroots_secrets` | Merge encrypted-envelope semantics. | +| `radroots_geocoder` | `radroots_geonames` | Rename to the actual concrete provider. | +| `radroots_runtime` | `radroots_sync + radroots_storage + host-private tooling` | Dismantle mixed config/signals/logging/queue/transport package. | | `radroots_log` | `no replacement package` | Libraries emit tracing; hosts install subscribers. | -| `radroots_net` | `radroots-transport + radroots-sync + radroots-sdk` | Retire broad duplicated network/runtime package. | +| `radroots_net` | `radroots_transport + radroots_sync + radroots_sdk` | Retire broad duplicated network/runtime package. | | `radroots_runtime_paths` | `private host utility` | Do not place host path policy in the SDK registry closure. | | `radroots_runtime_manager` | `private host tooling` | Runtime installation and process lifecycle remain host-owned. | | `radroots_runtime_distribution` | `private host tooling` | Artifact distribution is not a public SDK dependency. | @@ -1315,7 +1315,7 @@ All 19 packages start at `0.1.0`. This document's “V1” is the architecture s ### 22.2 SemVer groups -- `radroots` and `radroots-sdk` release in lockstep and `radroots` uses `=X.Y.Z` for the SDK. +- `radroots` and `radroots_sdk` release in lockstep and `radroots` uses `=X.Y.Z` for the SDK. - Lower packages version independently after the first release. - Lower dependencies use ordinary compatible requirements at the actual minimum supported version. - Exact requirements are reserved for genuinely inseparable package pairs. @@ -1338,24 +1338,24 @@ For `0.y.z` packages: The actual order is computed from `cargo metadata`; the expected order is: ```text -radroots-core -radroots-identity -radroots-blossom -radroots-protocol -radroots-secrets -radroots-geonames -radroots-event -radroots-event-codec -radroots-trade -radroots-signing -radroots-transport -radroots-nostr -radroots-nostr-connect -radroots-storage -radroots-storage-sqlite -radroots-transport-nostr -radroots-sync -radroots-sdk +radroots_core +radroots_identity +radroots_blossom +radroots_protocol +radroots_secrets +radroots_geonames +radroots_event +radroots_event_codec +radroots_trade +radroots_signing +radroots_transport +radroots_nostr +radroots_nostr_connect +radroots_storage +radroots_storage_sqlite +radroots_transport_nostr +radroots_sync +radroots_sdk radroots ``` @@ -1463,7 +1463,7 @@ Rejected because it permanently exposes host tooling and still omits SDK-require Rejected because temporary implementation boundaries would become permanent package identities. -### Collapse lower crates into `radroots-sdk` +### Collapse lower crates into `radroots_sdk` Rejected because domain, protocol, SPI, backend, and adapter packages have independent consumers and semver responsibilities. @@ -1494,18 +1494,18 @@ Rejected. Code generation is a private build concern and must not enlarge the ru histories; record the 17/2 package allocation and synchronized contract hashes without forming or importing a third repository. 3. Switch workspace to resolver 3 and MSRV 1.97.1. -4. Create final hyphenated package manifests with `publish = false` during migration. +4. Create final snake-case package manifests with `publish = false` during migration. 5. Refactor identity/public-key ownership and remove all secret material. 6. Split authority among identity, event contracts, and signing. 7. Remove the duplicate TradeId and make trade algorithm-only. -8. Create `radroots-protocol`. -9. Create `radroots-secrets`. -10. Create `radroots-storage` and `radroots-storage-sqlite`; migrate event/outbox/journal/private storage. +8. Create `radroots_protocol`. +9. Create `radroots_secrets`. +10. Create `radroots_storage` and `radroots_storage_sqlite`; migrate event/outbox/journal/private storage. 11. Remove Studio state from SDK storage. -12. Redesign `radroots-transport`; separate source/sink. -13. Narrow `radroots-nostr` and `radroots-transport-nostr`. -14. Refactor and retain `radroots-nostr-connect`. -15. Create `radroots-sync`. +12. Redesign `radroots_transport`; separate source/sink. +13. Narrow `radroots_nostr` and `radroots_transport_nostr`. +14. Refactor and retain `radroots_nostr_connect`. +15. Create `radroots_sync`. 16. Rename/refocus GeoNames. 17. Refactor SDK root, features, errors, lifecycle, and commit semantics. 18. Add the curated `radroots` façade. diff --git a/docs/specs/radroots_crates_release_v1.sha256 b/docs/specs/radroots_crates_release_v1.sha256 @@ -1,4 +1,4 @@ -8ddb51b5f186cb7ebcd7d2cd60217dce183ad9c87d7363f91fbaa6ff8db9777e radroots_crates_release_v1.md -a9dfec76ec11a1f1817133b0ad40dc062df3b2b5f77c3c96eeb92f0eff718aa7 radroots_crates_release_v1.toml -6e4a1c00d762e36e18e530d8e88846d500aeb8889d6f36d7ef906a055ef30a37 radroots_crates_release_v1_inventory.csv -dc5a24247df8feb6bad11985475cd3ccb5b7740a0dce8ad5198f47da7aff3480 radroots_crates_release_v1.dot +05d550f393f085b6cbaa0817e289e2487c0ed0861c7979c9225d9dc71f1ca6d4 radroots_crates_release_v1.md +30d56267f33647524b3093051a4504afe7f330ab8700d7db09985af5b981b62e radroots_crates_release_v1.toml +479f4a09dcad343161c9c644cbde18919eb4365cc295c296ed8ea1458e213882 radroots_crates_release_v1_inventory.csv +d47de10be596a4d33fee102a4f0617f66700b49515a75a1f42d62c9710043059 radroots_crates_release_v1.dot diff --git a/docs/specs/radroots_crates_release_v1.toml b/docs/specs/radroots_crates_release_v1.toml @@ -15,28 +15,28 @@ canonical_repositories = [ [repositories.lib] url = "https://github.com/radrootslabs/lib" packages = [ - "radroots-core", - "radroots-identity", - "radroots-blossom", - "radroots-protocol", - "radroots-event", - "radroots-event-codec", - "radroots-trade", - "radroots-signing", - "radroots-transport", - "radroots-nostr", - "radroots-nostr-connect", - "radroots-secrets", - "radroots-storage", - "radroots-storage-sqlite", - "radroots-transport-nostr", - "radroots-sync", - "radroots-geonames", + "radroots_core", + "radroots_identity", + "radroots_blossom", + "radroots_protocol", + "radroots_event", + "radroots_event_codec", + "radroots_trade", + "radroots_signing", + "radroots_transport", + "radroots_nostr", + "radroots_nostr_connect", + "radroots_secrets", + "radroots_storage", + "radroots_storage_sqlite", + "radroots_transport_nostr", + "radroots_sync", + "radroots_geonames", ] [repositories.sdk] url = "https://github.com/radrootslabs/sdk" -packages = ["radroots-sdk", "radroots"] +packages = ["radroots_sdk", "radroots"] [repository_policy] new_repository_forbidden = true @@ -54,7 +54,7 @@ package_realistic_validation_required = true preview_packages_withheld = true [[package]] -name = "radroots-core" +name = "radroots_core" crate = "radroots_core" publish_order_hint = 1 tier = "foundation" @@ -86,7 +86,7 @@ root_exports = [ forbidden = "Identifiers, identities, event kinds, networking, persistence, clocks, filesystem paths, process behavior, or application configuration." [[package]] -name = "radroots-identity" +name = "radroots_identity" crate = "radroots_identity" publish_order_hint = 2 tier = "foundation" @@ -109,7 +109,7 @@ root_exports = [ forbidden = "Secret keys, key generation, NIP-49 encryption, keyrings, files, SQLite, runtime paths, upstream nostr::Event values, signer sessions, or host account selection." [[package]] -name = "radroots-blossom" +name = "radroots_blossom" crate = "radroots_blossom" publish_order_hint = 3 tier = "protocol primitive" @@ -132,7 +132,7 @@ root_exports = [ forbidden = "HTTP clients, upload scheduling, cache management, filesystem traversal, application media policy, or global authentication state." [[package]] -name = "radroots-protocol" +name = "radroots_protocol" crate = "radroots_protocol" publish_order_hint = 4 tier = "versioned wire contract" @@ -154,7 +154,7 @@ root_exports = [] forbidden = "Native clients, storage, network I/O, executor/runtime ownership, domain reducers, upstream dependency types, unversioned serialized DTOs, or package names containing protocol generations." [[package]] -name = "radroots-event" +name = "radroots_event" crate = "radroots_event" publish_order_hint = 5 tier = "domain protocol model" @@ -163,10 +163,10 @@ responsibility = "Canonical Radroots event-domain models, validated event identi default_features = ["std", "serde"] features = ["std", "serde", "knowledge"] required_radroots_dependencies = [ - "radroots-core", - "radroots-identity", - "radroots-blossom", - "radroots-protocol", + "radroots_core", + "radroots_identity", + "radroots_blossom", + "radroots_protocol", ] optional_radroots_dependencies = [] modules = [ @@ -201,7 +201,7 @@ root_exports = [ forbidden = "Live Nostr clients, relay pools, signing backends, SQLite, outbox claims, retry scheduling, application state, or duplicate trade/order identifier concepts." [[package]] -name = "radroots-event-codec" +name = "radroots_event_codec" crate = "radroots_event_codec" publish_order_hint = 6 tier = "deterministic algorithm" @@ -210,9 +210,9 @@ responsibility = "Deterministic canonical encoding, decoding, ID/signature verif default_features = ["std", "json"] features = ["std", "serde", "json", "knowledge", "manifests"] required_radroots_dependencies = [ - "radroots-event", - "radroots-blossom", - "radroots-protocol", + "radroots_event", + "radroots_blossom", + "radroots_protocol", ] optional_radroots_dependencies = [] modules = ["admission", "canonical", "decode", "encode", "manifest", "verify"] @@ -220,7 +220,7 @@ root_exports = ["Codec", "DecodeError", "EncodeError", "VerificationError"] forbidden = "nostr-sdk clients, relay networking, persistence, background work, upstream client errors, or host configuration." [[package]] -name = "radroots-trade" +name = "radroots_trade" crate = "radroots_trade" publish_order_hint = 7 tier = "domain algorithm" @@ -229,9 +229,9 @@ responsibility = "Trade validation, evidence models, deterministic reduction, co default_features = ["std", "serde", "json"] features = ["std", "serde", "json"] required_radroots_dependencies = [ - "radroots-core", - "radroots-identity", - "radroots-event", + "radroots_core", + "radroots_identity", + "radroots_event", ] optional_radroots_dependencies = [] modules = ["evidence", "model", "reducer", "validation", "workflow"] @@ -246,7 +246,7 @@ root_exports = [ forbidden = "A second TradeId definition, actor authorization, signers, event-store access, SQLx, filesystem state, transport delivery, outbox mutation, or process scheduling." [[package]] -name = "radroots-signing" +name = "radroots_signing" crate = "radroots_signing" publish_order_hint = 8 tier = "host SPI" @@ -255,9 +255,9 @@ responsibility = "Object-safe author/signing SPI, actor provenance, authorizatio default_features = ["std", "serde"] features = ["std", "serde"] required_radroots_dependencies = [ - "radroots-identity", - "radroots-event", - "radroots-protocol", + "radroots_identity", + "radroots_event", + "radroots_protocol", ] optional_radroots_dependencies = [] modules = [ @@ -280,7 +280,7 @@ root_exports = [ forbidden = "Raw secret-key ownership, keyrings, relay networking, NIP-46 session persistence, SQL, UI prompts, or executor creation." [[package]] -name = "radroots-transport" +name = "radroots_transport" crate = "radroots_transport" publish_order_hint = 9 tier = "network SPI" @@ -289,9 +289,9 @@ responsibility = "Transport-neutral target identities, capability/status models, default_features = ["std", "serde"] features = ["std", "serde"] required_radroots_dependencies = [ - "radroots-identity", - "radroots-event", - "radroots-protocol", + "radroots_identity", + "radroots_event", + "radroots_protocol", ] optional_radroots_dependencies = [] modules = [ @@ -319,7 +319,7 @@ root_exports = [ forbidden = "Closed enums that prevent new transports, Reticulum-specific constants, Nostr URLs at the generic root, storage/outbox access, retries, scheduler ownership, or silent fallback." [[package]] -name = "radroots-nostr" +name = "radroots_nostr" crate = "radroots_nostr" publish_order_hint = 10 tier = "protocol adapter" @@ -328,17 +328,17 @@ responsibility = "Portable conversion between Radroots native event/identity typ default_features = ["std", "events"] features = ["std", "events", "signing", "nip17", "blossom"] required_radroots_dependencies = [ - "radroots-identity", - "radroots-event", - "radroots-event-codec", + "radroots_identity", + "radroots_event", + "radroots_event_codec", ] -optional_radroots_dependencies = ["radroots-signing", "radroots-blossom"] +optional_radroots_dependencies = ["radroots_signing", "radroots_blossom"] modules = ["blossom", "event", "filter", "key", "nip17", "signing", "tag"] root_exports = ["Error"] forbidden = "nostr-sdk relay pools, reqwest clients, runtime ownership, broad aliases of upstream nostr types at the root, account persistence, or outbox orchestration." [[package]] -name = "radroots-nostr-connect" +name = "radroots_nostr_connect" crate = "radroots_nostr_connect" publish_order_hint = 11 tier = "security protocol" @@ -347,10 +347,10 @@ responsibility = "Nostr Connect/NIP-46 URIs, methods, permissions, requests, res default_features = ["serde"] features = ["serde"] required_radroots_dependencies = [ - "radroots-identity", - "radroots-event", - "radroots-nostr", - "radroots-protocol", + "radroots_identity", + "radroots_event", + "radroots_nostr", + "radroots_protocol", ] optional_radroots_dependencies = [] modules = [ @@ -376,7 +376,7 @@ root_exports = [ forbidden = "Relay-pool implementation, secret persistence, approval UI, global sessions, Tokio runtime ownership, or Myc-specific service storage." [[package]] -name = "radroots-secrets" +name = "radroots_secrets" crate = "radroots_secrets" publish_order_hint = 12 tier = "security SPI" @@ -407,7 +407,7 @@ root_exports = [ forbidden = "Public secret bytes, Clone/Debug/Serialize for secret-bearing values, identity profiles, domain tables, arbitrary key/value storage, hidden key generation, or process-global vaults." [[package]] -name = "radroots-storage" +name = "radroots_storage" crate = "radroots_storage" publish_order_hint = 13 tier = "storage SPI" @@ -416,10 +416,10 @@ responsibility = "Backend-neutral canonical event, operation journal, outbox, tr default_features = ["memory", "serde"] features = ["memory", "serde"] required_radroots_dependencies = [ - "radroots-event", - "radroots-trade", - "radroots-transport", - "radroots-protocol", + "radroots_event", + "radroots_trade", + "radroots_transport", + "radroots_protocol", ] optional_radroots_dependencies = [] modules = [ @@ -446,7 +446,7 @@ root_exports = [ forbidden = "SQL text, SQLx pools or transactions, filesystem paths, application UI state, concrete retry loops, Nostr clients, or unconstrained raw key/value escape hatches." [[package]] -name = "radroots-storage-sqlite" +name = "radroots_storage_sqlite" crate = "radroots_storage_sqlite" publish_order_hint = 14 tier = "native storage backend" @@ -455,9 +455,9 @@ responsibility = "SQLite implementation of the storage SPIs with schema migratio default_features = [] features = [] required_radroots_dependencies = [ - "radroots-storage", - "radroots-event-codec", - "radroots-secrets", + "radroots_storage", + "radroots_event_codec", + "radroots_secrets", ] optional_radroots_dependencies = [] modules = [ @@ -473,7 +473,7 @@ root_exports = ["SqliteStorage", "OpenOptions", "OpenMode", "Paths", "Error"] forbidden = "Public SqlitePool/Connection/Transaction handles, caller-supplied arbitrary SQL, Studio state, global connection pools, runtime installation, or silent schema downgrade." [[package]] -name = "radroots-transport-nostr" +name = "radroots_transport_nostr" crate = "radroots_transport_nostr" publish_order_hint = 15 tier = "native network adapter" @@ -482,10 +482,10 @@ responsibility = "Concrete Nostr EventSource/EventSink implementation: relay URL default_features = [] features = [] required_radroots_dependencies = [ - "radroots-transport", - "radroots-nostr", - "radroots-event-codec", - "radroots-protocol", + "radroots_transport", + "radroots_nostr", + "radroots_event_codec", + "radroots_protocol", ] optional_radroots_dependencies = [] modules = ["auth", "client", "relay", "sink", "source", "status"] @@ -499,7 +499,7 @@ root_exports = [ forbidden = "Event-store ingestion, outbox claiming, retry scheduling, projection refresh, global relay clients, direct SQL, or transport fallback." [[package]] -name = "radroots-sync" +name = "radroots_sync" crate = "radroots_sync" publish_order_hint = 16 tier = "local-first orchestration" @@ -508,13 +508,13 @@ responsibility = "Shared pull, verification, canonical admission, duplicate hand default_features = ["serde"] features = ["serde"] required_radroots_dependencies = [ - "radroots-event", - "radroots-event-codec", - "radroots-signing", - "radroots-transport", - "radroots-storage", - "radroots-trade", - "radroots-protocol", + "radroots_event", + "radroots_event_codec", + "radroots_signing", + "radroots_transport", + "radroots_storage", + "radroots_trade", + "radroots_protocol", ] optional_radroots_dependencies = [] modules = ["ingest", "policy", "projection", "pull", "push", "status"] @@ -530,7 +530,7 @@ root_exports = [ forbidden = "Creating an executor, spawning hidden workers, installing timers globally, owning process lifecycle, storing UI state, or transport-specific branches outside adapters." [[package]] -name = "radroots-geonames" +name = "radroots_geonames" crate = "radroots_geonames" publish_order_hint = 17 tier = "concrete data provider" @@ -553,7 +553,7 @@ root_exports = [ forbidden = "Generic multi-provider abstraction before a second provider exists, runtime-path policy, hidden downloads, SDK configuration types, SQLx/reqwest types in the public API, or test-fixture features." [[package]] -name = "radroots-sdk" +name = "radroots_sdk" crate = "radroots_sdk" publish_order_hint = 18 tier = "advanced front door" @@ -574,24 +574,24 @@ features = [ "full", ] required_radroots_dependencies = [ - "radroots-core", - "radroots-identity", - "radroots-protocol", - "radroots-event", - "radroots-event-codec", - "radroots-trade", - "radroots-signing", - "radroots-transport", - "radroots-storage", + "radroots_core", + "radroots_identity", + "radroots_protocol", + "radroots_event", + "radroots_event_codec", + "radroots_trade", + "radroots_signing", + "radroots_transport", + "radroots_storage", ] optional_radroots_dependencies = [ - "radroots-secrets", - "radroots-storage-sqlite", - "radroots-nostr", - "radroots-nostr-connect", - "radroots-transport-nostr", - "radroots-sync", - "radroots-geonames", + "radroots_secrets", + "radroots_storage_sqlite", + "radroots_nostr", + "radroots_nostr_connect", + "radroots_transport_nostr", + "radroots_sync", + "radroots_geonames", ] modules = [ "capability", @@ -628,12 +628,12 @@ features = [ "full", ] required_radroots_dependencies = [ - "radroots-sdk", - "radroots-core", - "radroots-identity", - "radroots-event", - "radroots-trade", - "radroots-transport", + "radroots_sdk", + "radroots_core", + "radroots_identity", + "radroots_event", + "radroots_trade", + "radroots_transport", ] optional_radroots_dependencies = [] modules = [ @@ -650,4 +650,4 @@ modules = [ "transport", ] root_exports = ["Client", "ClientBuilder", "Error", "Result"] -forbidden = "A public radroots::sdk namespace, wildcard reexport of radroots-sdk, duplicate engine implementation, CLI binary, hidden network/filesystem/keychain side effects, or exposure of every lower-crate symbol." +forbidden = "A public radroots::sdk namespace, wildcard reexport of radroots_sdk, duplicate engine implementation, CLI binary, hidden network/filesystem/keychain side effects, or exposure of every lower-crate symbol." diff --git a/docs/specs/radroots_crates_release_v1_inventory.csv b/docs/specs/radroots_crates_release_v1_inventory.csv @@ -1,20 +1,20 @@ publish_order_hint,package,crate,repository,tier,platform,initial_version,default_features,features,required_radroots_dependencies,optional_radroots_dependencies,direct_consumers,responsibility,forbidden -1,radroots-core,radroots_core,lib,foundation,no_std + alloc; std feature,0.1.0,std;serde,std;serde,,,radroots-event;radroots-trade;radroots-sdk;radroots,"Foundational value objects and deterministic invariants: decimal, currency, money, percentage, quantity, units, and pricing.","Identifiers, identities, event kinds, networking, persistence, clocks, filesystem paths, process behavior, or application configuration." -2,radroots-identity,radroots_identity,lib,foundation,no_std + alloc; std feature,0.1.0,std;serde,std;serde,,,radroots-event;radroots-signing;radroots-transport;radroots-nostr;radroots-nostr-connect;radroots-sdk;services,"Public identity and account value types: canonical public keys, identity IDs, account IDs, public profiles, and usernames.","Secret keys, key generation, NIP-49 encryption, keyrings, files, SQLite, runtime paths, upstream nostr::Event values, signer sessions, or host account selection." -3,radroots-blossom,radroots_blossom,lib,protocol primitive,no_std + alloc; std feature,0.1.0,std;serde,std;serde,,,radroots-event;radroots-event-codec;radroots-nostr;media clients,"Portable Blossom protocol primitives: canonical blob URLs, hashes, media descriptors, byte-verification typestates, and authorization claims.","HTTP clients, upload scheduling, cache management, filesystem traversal, application media policy, or global authentication state." -4,radroots-protocol,radroots_protocol,lib,versioned wire contract,no_std + alloc; std feature,0.1.0,std;serde,std;serde,,,radroots-event;radroots-signing;radroots-transport;radroots-storage;radroots-sync;radroots-sdk;radrootsd;bindings,"Versioned cross-process and cross-language schemas, capability catalogs, operation descriptors, stable error reports, schema IDs, and structural validation.","Native clients, storage, network I/O, executor/runtime ownership, domain reducers, upstream dependency types, unversioned serialized DTOs, or package names containing protocol generations." -5,radroots-event,radroots_event,lib,domain protocol model,no_std + alloc; std feature,0.1.0,std;serde,std;serde;knowledge,radroots-core;radroots-identity;radroots-blossom;radroots-protocol,,radroots-event-codec;radroots-trade;radroots-signing;radroots-transport;radroots-storage;radroots-sync;radroots-nostr;radroots-sdk;indexers,"Canonical Radroots event-domain models, validated event identifiers, tags, event contracts, authoring drafts, signed/verified typestates, and NIP-01 wire-neutral representations.","Live Nostr clients, relay pools, signing backends, SQLite, outbox claims, retry scheduling, application state, or duplicate trade/order identifier concepts." -6,radroots-event-codec,radroots_event_codec,lib,deterministic algorithm,no_std + alloc where selected features permit; std feature,0.1.0,std;json,std;serde;json;knowledge;manifests,radroots-event;radroots-blossom;radroots-protocol,,radroots-nostr;radroots-storage-sqlite;radroots-transport-nostr;radroots-sync;radroots-sdk;bindings,"Deterministic canonical encoding, decoding, ID/signature verification, contract validation, admission, and manifest generation for Radroots events.","nostr-sdk clients, relay networking, persistence, background work, upstream client errors, or host configuration." -7,radroots-trade,radroots_trade,lib,domain algorithm,no_std + alloc for model/reducer; std feature,0.1.0,std;serde;json,std;serde;json,radroots-core;radroots-identity;radroots-event,,radroots-storage;radroots-sync;radroots-sdk;RHI;applications,"Trade validation, evidence models, deterministic reduction, conflict analysis, and side-effect-free workflow plans over the canonical event trade model.","A second TradeId definition, actor authorization, signers, event-store access, SQLx, filesystem state, transport delivery, outbox mutation, or process scheduling." -8,radroots-signing,radroots_signing,lib,host SPI,no_std + alloc core; std feature,0.1.0,std;serde,std;serde,radroots-identity;radroots-event;radroots-protocol,,radroots-nostr;radroots-sync;radroots-sdk;CLI;Studio;FFI hosts,"Object-safe author/signing SPI, actor provenance, authorization checks, requests, receipts, progress, capabilities, and normalized signing errors.","Raw secret-key ownership, keyrings, relay networking, NIP-46 session persistence, SQL, UI prompts, or executor creation." -9,radroots-transport,radroots_transport,lib,network SPI,no_std + alloc data model; std feature,0.1.0,std;serde,std;serde,radroots-identity;radroots-event;radroots-protocol,,radroots-storage;radroots-transport-nostr;radroots-sync;radroots-sdk;services;future adapters,"Transport-neutral target identities, capability/status models, source and sink SPIs, delivery/fetch policies, bounded requests, provenance, and normalized outcomes.","Closed enums that prevent new transports, Reticulum-specific constants, Nostr URLs at the generic root, storage/outbox access, retries, scheduler ownership, or silent fallback." -10,radroots-nostr,radroots_nostr,lib,protocol adapter,no_std + alloc for conversion surface; std feature,0.1.0,std;events,std;events;signing;nip17;blossom,radroots-identity;radroots-event;radroots-event-codec,radroots-signing;radroots-blossom,radroots-nostr-connect;radroots-transport-nostr;radroots-sdk;Myc;radrootsd,"Portable conversion between Radroots native event/identity types and Nostr protocol types, typed NIP helpers, and concrete local signing adapters; no live relay client.","nostr-sdk relay pools, reqwest clients, runtime ownership, broad aliases of upstream nostr types at the root, account persistence, or outbox orchestration." -11,radroots-nostr-connect,radroots_nostr_connect,lib,security protocol,std for v1; protocol data kept portable,0.1.0,serde,serde,radroots-identity;radroots-event;radroots-nostr;radroots-protocol,,radroots-sdk;Myc;remote signer tooling,"Nostr Connect/NIP-46 URIs, methods, permissions, requests, responses, client/server state machines, timeout-independent protocol validation, and normalized errors.","Relay-pool implementation, secret persistence, approval UI, global sessions, Tokio runtime ownership, or Myc-specific service storage." -12,radroots-secrets,radroots_secrets,lib,security SPI,no_std + alloc core; std adapters,0.1.0,std;serde,std;serde;memory;file;keyring,,,radroots-storage-sqlite;radroots-sdk;signing hosts;services,"Secret references, provider and key-wrapping SPIs, versioned encrypted envelopes, zeroization-safe secret handling, and explicit memory/file/keyring adapters.","Public secret bytes, Clone/Debug/Serialize for secret-bearing values, identity profiles, domain tables, arbitrary key/value storage, hidden key generation, or process-global vaults." -13,radroots-storage,radroots_storage,lib,storage SPI,std for v1,0.1.0,memory;serde,memory;serde,radroots-event;radroots-trade;radroots-transport;radroots-protocol,,radroots-storage-sqlite;radroots-sync;radroots-sdk;indexers;tests;future backends,"Backend-neutral canonical event, operation journal, outbox, transport evidence, projection, private-artifact metadata, backup, status, and atomic commit interfaces, plus an in-memory reference backend.","SQL text, SQLx pools or transactions, filesystem paths, application UI state, concrete retry loops, Nostr clients, or unconstrained raw key/value escape hatches." -14,radroots-storage-sqlite,radroots_storage_sqlite,lib,native storage backend,std-only native backend,0.1.0,,,radroots-storage;radroots-event-codec;radroots-secrets,,radroots-sdk;CLI;Studio;mobile/FFI,"SQLite implementation of the storage SPIs with schema migration, WAL, locking, integrity, backup/restore, crash recovery, and encrypted private storage.","Public SqlitePool/Connection/Transaction handles, caller-supplied arbitrary SQL, Studio state, global connection pools, runtime installation, or silent schema downgrade." -15,radroots-transport-nostr,radroots_transport_nostr,lib,native network adapter,std-only; Tokio implementation detail in v1,0.1.0,,,radroots-transport;radroots-nostr;radroots-event-codec;radroots-protocol,,radroots-sdk;CLI;radrootsd;advanced hosts,"Concrete Nostr EventSource/EventSink implementation: relay URL policy, connection, NIP-42 authentication, bounded fetch pages, delivery, status, and relay-outcome normalization.","Event-store ingestion, outbox claiming, retry scheduling, projection refresh, global relay clients, direct SQL, or transport fallback." -16,radroots-sync,radroots_sync,lib,local-first orchestration,std-only in v1; executor-neutral public API,0.1.0,serde,serde,radroots-event;radroots-event-codec;radroots-signing;radroots-transport;radroots-storage;radroots-trade;radroots-protocol,,radroots-sdk;CLI;Studio;mobile/FFI;advanced hosts,"Shared pull, verification, canonical admission, duplicate handling, projection refresh, outbox signing/delivery, status, and retry-decision orchestration without owning scheduling.","Creating an executor, spawning hidden workers, installing timers globally, owning process lifecycle, storing UI state, or transport-specific branches outside adapters." -17,radroots-geonames,radroots_geonames,lib,concrete data provider,std-only,0.1.0,,,,,radroots-sdk;CLI;geocoding applications,"GeoNames asset specification, authenticated/integrity-checked acquisition, database lifecycle, and forward/reverse locality lookup using provider-owned types.","Generic multi-provider abstraction before a second provider exists, runtime-path policy, hidden downloads, SDK configuration types, SQLx/reqwest types in the public API, or test-fixture features." -18,radroots-sdk,radroots_sdk,sdk,advanced front door,std-only native engine,0.1.0,memory,memory;sqlite;sync;nostr;nip46;local-signing;radrootsd;geonames;knowledge;native;full,radroots-core;radroots-identity;radroots-protocol;radroots-event;radroots-event-codec;radroots-trade;radroots-signing;radroots-transport;radroots-storage,radroots-secrets;radroots-storage-sqlite;radroots-nostr;radroots-nostr-connect;radroots-transport-nostr;radroots-sync;radroots-geonames,CLI;Studio;FFI/mobile;advanced native applications,"Host-neutral asynchronous client engine, product operations, capability reporting, explicit storage/signing/transport composition, diagnostics, backup/restore, and safe commit semantics.","Global runtimes or subscribers, hidden workers, process signals, CLI parsing, UI state, Studio databases, raw SQLx/upstream client types, broad wildcard reexports, or a nominal no_std claim." -19,radroots,radroots,sdk,ordinary-user front door,std-only,0.1.0,client,client;native;nostr;nip46;radrootsd;geonames;knowledge;full,radroots-sdk;radroots-core;radroots-identity;radroots-event;radroots-trade;radroots-transport,,ordinary Rust applications;examples;documentation,"Canonical Rust onboarding package with curated modules, safe defaults, stable convenience builders, domain aggregation, examples, and primary documentation.","A public radroots::sdk namespace, wildcard reexport of radroots-sdk, duplicate engine implementation, CLI binary, hidden network/filesystem/keychain side effects, or exposure of every lower-crate symbol." +1,radroots_core,radroots_core,lib,foundation,no_std + alloc; std feature,0.1.0,std;serde,std;serde,,,radroots_event;radroots_trade;radroots_sdk;radroots,"Foundational value objects and deterministic invariants: decimal, currency, money, percentage, quantity, units, and pricing.","Identifiers, identities, event kinds, networking, persistence, clocks, filesystem paths, process behavior, or application configuration." +2,radroots_identity,radroots_identity,lib,foundation,no_std + alloc; std feature,0.1.0,std;serde,std;serde,,,radroots_event;radroots_signing;radroots_transport;radroots_nostr;radroots_nostr_connect;radroots_sdk;services,"Public identity and account value types: canonical public keys, identity IDs, account IDs, public profiles, and usernames.","Secret keys, key generation, NIP-49 encryption, keyrings, files, SQLite, runtime paths, upstream nostr::Event values, signer sessions, or host account selection." +3,radroots_blossom,radroots_blossom,lib,protocol primitive,no_std + alloc; std feature,0.1.0,std;serde,std;serde,,,radroots_event;radroots_event_codec;radroots_nostr;media clients,"Portable Blossom protocol primitives: canonical blob URLs, hashes, media descriptors, byte-verification typestates, and authorization claims.","HTTP clients, upload scheduling, cache management, filesystem traversal, application media policy, or global authentication state." +4,radroots_protocol,radroots_protocol,lib,versioned wire contract,no_std + alloc; std feature,0.1.0,std;serde,std;serde,,,radroots_event;radroots_signing;radroots_transport;radroots_storage;radroots_sync;radroots_sdk;radrootsd;bindings,"Versioned cross-process and cross-language schemas, capability catalogs, operation descriptors, stable error reports, schema IDs, and structural validation.","Native clients, storage, network I/O, executor/runtime ownership, domain reducers, upstream dependency types, unversioned serialized DTOs, or package names containing protocol generations." +5,radroots_event,radroots_event,lib,domain protocol model,no_std + alloc; std feature,0.1.0,std;serde,std;serde;knowledge,radroots_core;radroots_identity;radroots_blossom;radroots_protocol,,radroots_event_codec;radroots_trade;radroots_signing;radroots_transport;radroots_storage;radroots_sync;radroots_nostr;radroots_sdk;indexers,"Canonical Radroots event-domain models, validated event identifiers, tags, event contracts, authoring drafts, signed/verified typestates, and NIP-01 wire-neutral representations.","Live Nostr clients, relay pools, signing backends, SQLite, outbox claims, retry scheduling, application state, or duplicate trade/order identifier concepts." +6,radroots_event_codec,radroots_event_codec,lib,deterministic algorithm,no_std + alloc where selected features permit; std feature,0.1.0,std;json,std;serde;json;knowledge;manifests,radroots_event;radroots_blossom;radroots_protocol,,radroots_nostr;radroots_storage_sqlite;radroots_transport_nostr;radroots_sync;radroots_sdk;bindings,"Deterministic canonical encoding, decoding, ID/signature verification, contract validation, admission, and manifest generation for Radroots events.","nostr-sdk clients, relay networking, persistence, background work, upstream client errors, or host configuration." +7,radroots_trade,radroots_trade,lib,domain algorithm,no_std + alloc for model/reducer; std feature,0.1.0,std;serde;json,std;serde;json,radroots_core;radroots_identity;radroots_event,,radroots_storage;radroots_sync;radroots_sdk;RHI;applications,"Trade validation, evidence models, deterministic reduction, conflict analysis, and side-effect-free workflow plans over the canonical event trade model.","A second TradeId definition, actor authorization, signers, event-store access, SQLx, filesystem state, transport delivery, outbox mutation, or process scheduling." +8,radroots_signing,radroots_signing,lib,host SPI,no_std + alloc core; std feature,0.1.0,std;serde,std;serde,radroots_identity;radroots_event;radroots_protocol,,radroots_nostr;radroots_sync;radroots_sdk;CLI;Studio;FFI hosts,"Object-safe author/signing SPI, actor provenance, authorization checks, requests, receipts, progress, capabilities, and normalized signing errors.","Raw secret-key ownership, keyrings, relay networking, NIP-46 session persistence, SQL, UI prompts, or executor creation." +9,radroots_transport,radroots_transport,lib,network SPI,no_std + alloc data model; std feature,0.1.0,std;serde,std;serde,radroots_identity;radroots_event;radroots_protocol,,radroots_storage;radroots_transport_nostr;radroots_sync;radroots_sdk;services;future adapters,"Transport-neutral target identities, capability/status models, source and sink SPIs, delivery/fetch policies, bounded requests, provenance, and normalized outcomes.","Closed enums that prevent new transports, Reticulum-specific constants, Nostr URLs at the generic root, storage/outbox access, retries, scheduler ownership, or silent fallback." +10,radroots_nostr,radroots_nostr,lib,protocol adapter,no_std + alloc for conversion surface; std feature,0.1.0,std;events,std;events;signing;nip17;blossom,radroots_identity;radroots_event;radroots_event_codec,radroots_signing;radroots_blossom,radroots_nostr_connect;radroots_transport_nostr;radroots_sdk;Myc;radrootsd,"Portable conversion between Radroots native event/identity types and Nostr protocol types, typed NIP helpers, and concrete local signing adapters; no live relay client.","nostr-sdk relay pools, reqwest clients, runtime ownership, broad aliases of upstream nostr types at the root, account persistence, or outbox orchestration." +11,radroots_nostr_connect,radroots_nostr_connect,lib,security protocol,std for v1; protocol data kept portable,0.1.0,serde,serde,radroots_identity;radroots_event;radroots_nostr;radroots_protocol,,radroots_sdk;Myc;remote signer tooling,"Nostr Connect/NIP-46 URIs, methods, permissions, requests, responses, client/server state machines, timeout-independent protocol validation, and normalized errors.","Relay-pool implementation, secret persistence, approval UI, global sessions, Tokio runtime ownership, or Myc-specific service storage." +12,radroots_secrets,radroots_secrets,lib,security SPI,no_std + alloc core; std adapters,0.1.0,std;serde,std;serde;memory;file;keyring,,,radroots_storage_sqlite;radroots_sdk;signing hosts;services,"Secret references, provider and key-wrapping SPIs, versioned encrypted envelopes, zeroization-safe secret handling, and explicit memory/file/keyring adapters.","Public secret bytes, Clone/Debug/Serialize for secret-bearing values, identity profiles, domain tables, arbitrary key/value storage, hidden key generation, or process-global vaults." +13,radroots_storage,radroots_storage,lib,storage SPI,std for v1,0.1.0,memory;serde,memory;serde,radroots_event;radroots_trade;radroots_transport;radroots_protocol,,radroots_storage_sqlite;radroots_sync;radroots_sdk;indexers;tests;future backends,"Backend-neutral canonical event, operation journal, outbox, transport evidence, projection, private-artifact metadata, backup, status, and atomic commit interfaces, plus an in-memory reference backend.","SQL text, SQLx pools or transactions, filesystem paths, application UI state, concrete retry loops, Nostr clients, or unconstrained raw key/value escape hatches." +14,radroots_storage_sqlite,radroots_storage_sqlite,lib,native storage backend,std-only native backend,0.1.0,,,radroots_storage;radroots_event_codec;radroots_secrets,,radroots_sdk;CLI;Studio;mobile/FFI,"SQLite implementation of the storage SPIs with schema migration, WAL, locking, integrity, backup/restore, crash recovery, and encrypted private storage.","Public SqlitePool/Connection/Transaction handles, caller-supplied arbitrary SQL, Studio state, global connection pools, runtime installation, or silent schema downgrade." +15,radroots_transport_nostr,radroots_transport_nostr,lib,native network adapter,std-only; Tokio implementation detail in v1,0.1.0,,,radroots_transport;radroots_nostr;radroots_event_codec;radroots_protocol,,radroots_sdk;CLI;radrootsd;advanced hosts,"Concrete Nostr EventSource/EventSink implementation: relay URL policy, connection, NIP-42 authentication, bounded fetch pages, delivery, status, and relay-outcome normalization.","Event-store ingestion, outbox claiming, retry scheduling, projection refresh, global relay clients, direct SQL, or transport fallback." +16,radroots_sync,radroots_sync,lib,local-first orchestration,std-only in v1; executor-neutral public API,0.1.0,serde,serde,radroots_event;radroots_event_codec;radroots_signing;radroots_transport;radroots_storage;radroots_trade;radroots_protocol,,radroots_sdk;CLI;Studio;mobile/FFI;advanced hosts,"Shared pull, verification, canonical admission, duplicate handling, projection refresh, outbox signing/delivery, status, and retry-decision orchestration without owning scheduling.","Creating an executor, spawning hidden workers, installing timers globally, owning process lifecycle, storing UI state, or transport-specific branches outside adapters." +17,radroots_geonames,radroots_geonames,lib,concrete data provider,std-only,0.1.0,,,,,radroots_sdk;CLI;geocoding applications,"GeoNames asset specification, authenticated/integrity-checked acquisition, database lifecycle, and forward/reverse locality lookup using provider-owned types.","Generic multi-provider abstraction before a second provider exists, runtime-path policy, hidden downloads, SDK configuration types, SQLx/reqwest types in the public API, or test-fixture features." +18,radroots_sdk,radroots_sdk,sdk,advanced front door,std-only native engine,0.1.0,memory,memory;sqlite;sync;nostr;nip46;local-signing;radrootsd;geonames;knowledge;native;full,radroots_core;radroots_identity;radroots_protocol;radroots_event;radroots_event_codec;radroots_trade;radroots_signing;radroots_transport;radroots_storage,radroots_secrets;radroots_storage_sqlite;radroots_nostr;radroots_nostr_connect;radroots_transport_nostr;radroots_sync;radroots_geonames,CLI;Studio;FFI/mobile;advanced native applications,"Host-neutral asynchronous client engine, product operations, capability reporting, explicit storage/signing/transport composition, diagnostics, backup/restore, and safe commit semantics.","Global runtimes or subscribers, hidden workers, process signals, CLI parsing, UI state, Studio databases, raw SQLx/upstream client types, broad wildcard reexports, or a nominal no_std claim." +19,radroots,radroots,sdk,ordinary-user front door,std-only,0.1.0,client,client;native;nostr;nip46;radrootsd;geonames;knowledge;full,radroots_sdk;radroots_core;radroots_identity;radroots_event;radroots_trade;radroots_transport,,ordinary Rust applications;examples;documentation,"Canonical Rust onboarding package with curated modules, safe defaults, stable convenience builders, domain aggregation, examples, and primary documentation.","A public radroots::sdk namespace, wildcard reexport of radroots_sdk, duplicate engine implementation, CLI binary, hidden network/filesystem/keychain side effects, or exposure of every lower-crate symbol." diff --git a/tools/xtask/src/architecture.rs b/tools/xtask/src/architecture.rs @@ -591,10 +591,9 @@ fn validate_public_dependency_table( } else { None }; - let normalized_key = dependency_key.replace('_', "-"); let dependency_name = declared_package .or(path_package.as_deref()) - .unwrap_or(normalized_key.as_str()); + .unwrap_or(dependency_key.as_str()); if !policy.public_packages.contains(dependency_name) { continue; } @@ -1200,7 +1199,7 @@ adr_required = false fs::write( root.join("Cargo.toml"), format!( - "{}\n[workspace.dependencies]\nradroots_core = {{ package = \"radroots-core\", path = \"crates/dependency\", version = \"=0.1.0\" }}\n", + "{}\n[workspace.dependencies]\nradroots_core = {{ package = \"radroots_core\", path = \"crates/dependency\", version = \"=0.1.0\" }}\n", complete_workspace_manifest("\"crates/radroots\"") ), ) @@ -1212,19 +1211,19 @@ adr_required = false .expect("write public manifest"); fs::write( root.join("crates/dependency/Cargo.toml"), - "[package]\nname = \"radroots-core\"\nversion = \"0.1.0\"\n", + "[package]\nname = \"radroots_core\"\nversion = \"0.1.0\"\n", ) .expect("write dependency manifest"); let mut architecture = architecture(); architecture.package.push(ArchitecturePackage { - name: "radroots-core".to_owned(), + name: "radroots_core".to_owned(), }); architecture .repositories .get_mut("sdk") .expect("sdk repository") .packages - .push("radroots-core".to_owned()); + .push("radroots_core".to_owned()); validate_public_dependency_versions(&root, &architecture) .expect("path plus exact version public dependency"); diff --git a/tools/xtask/src/architecture/api_leakage.rs b/tools/xtask/src/architecture/api_leakage.rs @@ -1364,7 +1364,7 @@ mod tests { #[test] fn generic_sqlx_public_field_is_forbidden() { - let findings = scan_fixture("radroots-storage", GENERIC_SQLX); + let findings = scan_fixture("radroots_storage", GENERIC_SQLX); assert_eq!(findings.len(), 1); assert_eq!(findings[0].item, "StorageHandle"); assert_eq!(findings[0].forbidden_path, "sqlx"); @@ -1373,7 +1373,7 @@ mod tests { #[test] fn renamed_tokio_return_type_is_resolved() { - let findings = scan_fixture("radroots-sync", GENERIC_RENAMED_TOKIO); + let findings = scan_fixture("radroots_sync", GENERIC_RENAMED_TOKIO); assert_eq!(findings.len(), 1); assert_eq!(findings[0].item, "executor"); assert_eq!(findings[0].forbidden_path, "tokio"); @@ -1382,13 +1382,13 @@ mod tests { #[test] fn specified_nostr_adapter_may_expose_protocol_types() { - let findings = scan_fixture("radroots-nostr", ALLOWED_ADAPTER); + let findings = scan_fixture("radroots_nostr", ALLOWED_ADAPTER); assert!(findings.is_empty()); } #[test] fn private_implementation_types_are_not_public_api() { - let findings = scan_fixture("radroots-sdk", PRIVATE_IMPLEMENTATION); + let findings = scan_fixture("radroots_sdk", PRIVATE_IMPLEMENTATION); assert!(findings.is_empty()); } @@ -1405,7 +1405,7 @@ mod tests { let mut policy = policy(); policy.exception.push(ApiException { id: "RCRV1-API-999".to_owned(), - package: "radroots-sdk".to_owned(), + package: "radroots_sdk".to_owned(), source: "src/lib.rs".to_owned(), forbidden_path: "reqwest".to_owned(), items: vec!["temporary_client".to_owned()], @@ -1418,7 +1418,7 @@ mod tests { let finding = scan_workspace( root.path(), &policy, - &fixture_metadata(root.path(), "radroots-sdk", ADR_EXCEPTION), + &fixture_metadata(root.path(), "radroots_sdk", ADR_EXCEPTION), ) .expect("scan exception fixture") .pop() diff --git a/tools/xtask/src/architecture/core_contract.rs b/tools/xtask/src/architecture/core_contract.rs @@ -29,11 +29,11 @@ pub(super) fn validate(workspace_root: &Path) -> Result<(), String> { .and_then(toml::Value::as_array) .and_then(|packages| { packages.iter().find(|package| { - package.get("name").and_then(toml::Value::as_str) == Some("radroots-core") + package.get("name").and_then(toml::Value::as_str) == Some("radroots_core") }) }) .and_then(toml::Value::as_table) - .ok_or_else(|| format!("{ARCHITECTURE_RELATIVE} is missing radroots-core"))?; + .ok_or_else(|| format!("{ARCHITECTURE_RELATIVE} is missing radroots_core"))?; let manifest = read_toml(workspace_root, CORE_MANIFEST_RELATIVE)?; validate_manifest(core_spec, &manifest)?; @@ -48,9 +48,9 @@ fn validate_manifest(core_spec: &toml::value::Table, manifest: &toml::Value) -> .get("package") .and_then(toml::Value::as_table) .ok_or_else(|| format!("{CORE_MANIFEST_RELATIVE} is missing [package]"))?; - if package.get("name").and_then(toml::Value::as_str) != Some("radroots-core") { + if package.get("name").and_then(toml::Value::as_str) != Some("radroots_core") { return Err(format!( - "{CORE_MANIFEST_RELATIVE} package.name must be radroots-core" + "{CORE_MANIFEST_RELATIVE} package.name must be radroots_core" )); } let library = manifest @@ -77,7 +77,7 @@ fn validate_manifest(core_spec: &toml::value::Table, manifest: &toml::Value) -> .collect::<BTreeSet<_>>(); if actual_features != expected_features { return Err(format!( - "radroots-core public features must be exactly {expected_features:?}, found {actual_features:?}" + "radroots_core public features must be exactly {expected_features:?}, found {actual_features:?}" )); } let expected_default = spec_strings(core_spec, "default_features")?; @@ -87,7 +87,7 @@ fn validate_manifest(core_spec: &toml::value::Table, manifest: &toml::Value) -> )?; if actual_default != expected_default { return Err(format!( - "radroots-core default features must be exactly {expected_default:?}, found {actual_default:?}" + "radroots_core default features must be exactly {expected_default:?}, found {actual_default:?}" )); } let std_enables = value_strings( @@ -95,7 +95,7 @@ fn validate_manifest(core_spec: &toml::value::Table, manifest: &toml::Value) -> &format!("{CORE_MANIFEST_RELATIVE} features.std"), )?; if !std_enables.is_empty() { - return Err("radroots-core std must remain an empty additive marker".to_owned()); + return Err("radroots_core std must remain an empty additive marker".to_owned()); } let serde_enables = value_strings( features.get("serde"), @@ -104,7 +104,7 @@ fn validate_manifest(core_spec: &toml::value::Table, manifest: &toml::Value) -> let expected_serde = BTreeSet::from(["dep:serde".to_owned(), "rust_decimal/serde".to_owned()]); if serde_enables != expected_serde { return Err(format!( - "radroots-core serde feature must enable {expected_serde:?}, found {serde_enables:?}" + "radroots_core serde feature must enable {expected_serde:?}, found {serde_enables:?}" )); } @@ -137,7 +137,7 @@ fn validate_manifest(core_spec: &toml::value::Table, manifest: &toml::Value) -> }) }) { - return Err("radroots-core must not declare target-specific dependencies".to_owned()); + return Err("radroots_core must not declare target-specific dependencies".to_owned()); } let dependencies = manifest @@ -190,7 +190,7 @@ fn validate_crate_root( let expected_modules = spec_strings(core_spec, "modules")?; if modules != expected_modules { return Err(format!( - "radroots-core public modules must be exactly {expected_modules:?}, found {modules:?}" + "radroots_core public modules must be exactly {expected_modules:?}, found {modules:?}" )); } let specified_exports = spec_strings(core_spec, "root_exports")?; @@ -200,7 +200,7 @@ fn validate_crate_root( .collect::<BTreeSet<_>>(); if specified_exports != canonical_exports { return Err(format!( - "radroots-core canonical root exports must be exactly {canonical_exports:?}, found {specified_exports:?}" + "radroots_core canonical root exports must be exactly {canonical_exports:?}, found {specified_exports:?}" )); } let expected_exports = CORE_ROOT_EXPORTS @@ -209,7 +209,7 @@ fn validate_crate_root( .collect::<BTreeMap<_, _>>(); if exports != expected_exports { return Err(format!( - "radroots-core root exports must match the canonical contract; expected {expected_exports:?}, found {exports:?}" + "radroots_core root exports must match the canonical contract; expected {expected_exports:?}, found {exports:?}" )); } Ok(()) @@ -227,7 +227,7 @@ fn validate_dependency_names( .unwrap_or_default(); if actual != expected { return Err(format!( - "radroots-core {section} must be exactly {expected:?}, found {actual:?}" + "radroots_core {section} must be exactly {expected:?}, found {actual:?}" )); } Ok(()) @@ -242,7 +242,7 @@ fn reject_nonempty_dependency_section( .and_then(toml::Value::as_table) .is_some_and(|dependencies| !dependencies.is_empty()) { - return Err(format!("radroots-core must not declare {section}")); + return Err(format!("radroots_core must not declare {section}")); } Ok(()) } @@ -257,7 +257,7 @@ fn validate_dependency_shape( let dependency = dependencies .get(name) .and_then(toml::Value::as_table) - .ok_or_else(|| format!("radroots-core dependency {name} must use a dependency table"))?; + .ok_or_else(|| format!("radroots_core dependency {name} must use a dependency table"))?; if dependency.get("workspace").and_then(toml::Value::as_bool) != Some(true) || dependency .get("optional") @@ -271,7 +271,7 @@ fn validate_dependency_shape( != default_features { return Err(format!( - "radroots-core dependency {name} has a noncanonical workspace/optional/default-features shape" + "radroots_core dependency {name} has a noncanonical workspace/optional/default-features shape" )); } let mut expected_keys = BTreeSet::from(["workspace", "default-features"]); @@ -287,7 +287,7 @@ fn validate_dependency_shape( .collect::<BTreeSet<_>>(); if actual_keys != expected_keys { return Err(format!( - "radroots-core dependency {name} keys must be exactly {expected_keys:?}, found {actual_keys:?}" + "radroots_core dependency {name} keys must be exactly {expected_keys:?}, found {actual_keys:?}" )); } let actual_features = match dependency.get("features") { @@ -303,7 +303,7 @@ fn validate_dependency_shape( .collect::<BTreeSet<_>>(); if actual_features != expected_features { return Err(format!( - "radroots-core dependency {name} features must be {expected_features:?}, found {actual_features:?}" + "radroots_core dependency {name} features must be {expected_features:?}, found {actual_features:?}" )); } Ok(()) @@ -312,7 +312,7 @@ fn validate_dependency_shape( fn spec_strings(package: &toml::value::Table, field: &str) -> Result<BTreeSet<String>, String> { value_strings( package.get(field), - &format!("{ARCHITECTURE_RELATIVE} radroots-core.{field}"), + &format!("{ARCHITECTURE_RELATIVE} radroots_core.{field}"), ) } @@ -454,7 +454,7 @@ mod tests { const SPEC: &str = r#" [[package]] -name = "radroots-core" +name = "radroots_core" features = ["std", "serde"] default_features = ["std", "serde"] modules = ["currency", "decimal", "money", "percent", "pricing", "quantity", "unit"] @@ -463,7 +463,7 @@ root_exports = ["Currency", "Decimal", "Money", "Percent", "Quantity", "Quantity const MANIFEST: &str = r#" [package] -name = "radroots-core" +name = "radroots_core" [lib] name = "radroots_core" diff --git a/tools/xtask/src/architecture/dependency_boundary.rs b/tools/xtask/src/architecture/dependency_boundary.rs @@ -623,8 +623,8 @@ mod tests { let policy = policy(); let error = validate_metadata(&policy, &placements(&policy), &metadata(DOMAIN_TO_STORAGE)) .expect_err("domain must not depend on storage"); - assert!(error.contains("radroots-event (tier=domain rank=1)")); - assert!(error.contains("radroots-storage (tier=spi rank=2)")); + assert!(error.contains("radroots_event (tier=domain rank=1)")); + assert!(error.contains("radroots_storage (tier=spi rank=2)")); assert!(error.contains("alias=storage_alias")); assert!(error.contains("kind=normal")); assert!(error.contains("target=cfg(unix)")); @@ -636,8 +636,8 @@ mod tests { let policy = policy(); let error = validate_metadata(&policy, &placements(&policy), &metadata(SPI_TO_ADAPTER)) .expect_err("SPI must not depend on adapter"); - assert!(error.contains("radroots-transport (tier=spi rank=2)")); - assert!(error.contains("radroots-nostr (tier=adapter rank=3)")); + assert!(error.contains("radroots_transport (tier=spi rank=2)")); + assert!(error.contains("radroots_nostr (tier=adapter rank=3)")); assert!(error.contains("alias=protocol_adapter")); assert!(error.contains("kind=build")); assert!(error.contains("target=cfg(target_arch = \"wasm32\")")); @@ -649,8 +649,8 @@ mod tests { let policy = policy(); let error = validate_metadata(&policy, &placements(&policy), &metadata(SERVICE_TO_SDK)) .expect_err("service orchestration must not depend on SDK"); - assert!(error.contains("radroots-sync (tier=orchestration rank=4)")); - assert!(error.contains("radroots-sdk (tier=sdk rank=5)")); + assert!(error.contains("radroots_sync (tier=orchestration rank=4)")); + assert!(error.contains("radroots_sdk (tier=sdk rank=5)")); assert!(error.contains("alias=client_engine")); } @@ -666,12 +666,12 @@ mod tests { let policy = policy(); let owner = super::CargoPackage { id: "owner".to_owned(), - name: "radroots-trade".to_owned(), + name: "radroots_trade".to_owned(), dependencies: Vec::new(), }; let dependency = super::CargoPackage { id: "dependency".to_owned(), - name: "radroots-nostr".to_owned(), + name: "radroots_nostr".to_owned(), dependencies: Vec::new(), }; let kind = super::CargoDependencyKind { @@ -679,7 +679,7 @@ mod tests { target: None, }; let exact = super::CargoDependency { - name: "radroots-nostr".to_owned(), + name: "radroots_nostr".to_owned(), kind: Some("dev".to_owned()), features: vec!["std".to_owned(), "events".to_owned()], target: None, diff --git a/tools/xtask/src/contract/food_availability_projection.rs b/tools/xtask/src/contract/food_availability_projection.rs @@ -2640,7 +2640,7 @@ fn validate_blossom_dependency_values( if workspace_dependency .get("package") .and_then(toml::Value::as_str) - != Some("radroots-blossom") + != Some("radroots_blossom") || workspace_dependency .get("path") .and_then(toml::Value::as_str) diff --git a/tools/xtask/src/contract/nip09_reconciliation.rs b/tools/xtask/src/contract/nip09_reconciliation.rs @@ -590,7 +590,7 @@ struct CargoPackageFeatureSpec { const CARGO_PACKAGE_FEATURE_SPECS: &[CargoPackageFeatureSpec] = &[ CargoPackageFeatureSpec { package: "radroots_core", - cargo_package_name: "radroots-core", + cargo_package_name: "radroots_core", manifest_path: CORE_CARGO_MANIFEST_RELATIVE, default_features_enabled: false, selected_features: &["serde", "std"], @@ -606,7 +606,7 @@ const CARGO_PACKAGE_FEATURE_SPECS: &[CargoPackageFeatureSpec] = &[ }, CargoPackageFeatureSpec { package: "radroots_event_codec", - cargo_package_name: "radroots-event-codec", + cargo_package_name: "radroots_event_codec", manifest_path: EVENT_CODEC_CARGO_MANIFEST_RELATIVE, default_features_enabled: false, selected_features: &["nostr", "serde", "serde_json", "std"], @@ -614,7 +614,7 @@ const CARGO_PACKAGE_FEATURE_SPECS: &[CargoPackageFeatureSpec] = &[ }, CargoPackageFeatureSpec { package: "radroots_event", - cargo_package_name: "radroots-event", + cargo_package_name: "radroots_event", manifest_path: EVENT_CARGO_MANIFEST_RELATIVE, default_features_enabled: false, selected_features: &["serde", "std"], @@ -622,7 +622,7 @@ const CARGO_PACKAGE_FEATURE_SPECS: &[CargoPackageFeatureSpec] = &[ }, CargoPackageFeatureSpec { package: "radroots_blossom", - cargo_package_name: "radroots-blossom", + cargo_package_name: "radroots_blossom", manifest_path: BLOSSOM_CARGO_MANIFEST_RELATIVE, default_features_enabled: false, selected_features: &["std"], @@ -14393,25 +14393,25 @@ xtask = "run -q -p xtask --" let governed_packages = [ ( CORE_CARGO_MANIFEST_RELATIVE, - "radroots-core", + "radroots_core", "0.1.0", Some("radroots_core"), ), ( EVENT_CARGO_MANIFEST_RELATIVE, - "radroots-event", + "radroots_event", "0.1.0", Some("radroots_event"), ), ( EVENT_CODEC_CARGO_MANIFEST_RELATIVE, - "radroots-event-codec", + "radroots_event_codec", "0.1.0", Some("radroots_event_codec"), ), ( BLOSSOM_CARGO_MANIFEST_RELATIVE, - "radroots-blossom", + "radroots_blossom", "0.1.0", Some("radroots_blossom"), ), @@ -14423,7 +14423,7 @@ xtask = "run -q -p xtask --" ), ( TRANSPORT_CARGO_MANIFEST_RELATIVE, - "radroots-transport", + "radroots_transport", "0.1.0", Some("radroots_transport"), ), @@ -20525,7 +20525,7 @@ pub(crate) fn migration_for_version"#, let cargo_lock_path = workspace.path().join(CARGO_LOCK_RELATIVE); let cargo_lock = fs::read_to_string(&cargo_lock_path).expect("Cargo.lock"); let transport_lock_package = r#"[[package]] -name = "radroots-transport" +name = "radroots_transport" version = "0.1.0" dependencies = [ "futures", @@ -20535,7 +20535,7 @@ dependencies = [ ] "#; let future_transport_lock_package = r#"[[package]] -name = "radroots-transport" +name = "radroots_transport" version = "0.1.0" dependencies = [ "futures", diff --git a/tools/xtask/src/coverage.rs b/tools/xtask/src/coverage.rs @@ -4000,7 +4000,7 @@ test_threads = 0 let out = temp_dir_path("run_crate_runner"); let args = vec![ "--crate".to_string(), - "radroots-core".to_string(), + "radroots_core".to_string(), "--out".to_string(), out.display().to_string(), "--test-threads".to_string(), @@ -4033,13 +4033,13 @@ test_threads = 0 assert!( rendered_commands .iter() - .filter(|rendered| rendered.contains("report -p radroots-core")) + .filter(|rendered| rendered.contains("report -p radroots_core")) .all(|rendered| rendered.contains("--ignore-filename-regex")) ); assert!( rendered_commands .iter() - .filter(|rendered| rendered.contains("report -p radroots-core")) + .filter(|rendered| rendered.contains("report -p radroots_core")) .all(|rendered| rendered.contains(COVERAGE_EXTERNAL_IGNORE_FILENAME_REGEX)) ); fs::remove_dir_all(out).expect("remove run crate output dir"); @@ -4049,7 +4049,7 @@ test_threads = 0 fn coverage_ignore_filename_regex_excludes_external_and_sibling_workspace_paths() { let root = workspace_root(); let ignore_regex = - coverage_ignore_filename_regex(&root, "radroots-core").expect("build ignore regex"); + coverage_ignore_filename_regex(&root, "radroots_core").expect("build ignore regex"); assert!(ignore_regex.contains(COVERAGE_EXTERNAL_IGNORE_FILENAME_REGEX)); assert!(ignore_regex.contains("crates/identity")); assert!(ignore_regex.contains("crates/core/tests")); @@ -4341,7 +4341,7 @@ test_threads = 0 #[test] fn run_crate_with_runner_uses_default_output_dir_when_out_is_missing() { - let args = vec!["--crate".to_string(), "radroots-core".to_string()]; + let args = vec!["--crate".to_string(), "radroots_core".to_string()]; let mut output_path_seen = false; let mut runner = |cmd: Command, _: &str| { let rendered = cmd @@ -4371,7 +4371,7 @@ test_threads = 0 let out = temp_dir_path("run_crate_runner_fail"); let args = vec![ "--crate".to_string(), - "radroots-core".to_string(), + "radroots_core".to_string(), "--out".to_string(), out.display().to_string(), ]; @@ -4384,7 +4384,7 @@ test_threads = 0 write_file(&root.join("blocker"), "x"); let args = vec![ "--crate".to_string(), - "radroots-core".to_string(), + "radroots_core".to_string(), "--out".to_string(), root.join("blocker").join("nested").display().to_string(), ]; diff --git a/tools/xtask/tests/fixtures/dependency-boundaries/domain-to-storage.json b/tools/xtask/tests/fixtures/dependency-boundaries/domain-to-storage.json @@ -1,11 +1,11 @@ { "packages": [ { - "id": "fixture#radroots-event@0.1.0", - "name": "radroots-event", + "id": "fixture#radroots_event@0.1.0", + "name": "radroots_event", "dependencies": [ { - "name": "radroots-storage", + "name": "radroots_storage", "rename": "storage_alias", "kind": null, "features": ["memory"], @@ -15,19 +15,19 @@ ] }, { - "id": "fixture#radroots-storage@0.1.0", - "name": "radroots-storage", + "id": "fixture#radroots_storage@0.1.0", + "name": "radroots_storage", "dependencies": [] } ], "resolve": { "nodes": [ { - "id": "fixture#radroots-event@0.1.0", + "id": "fixture#radroots_event@0.1.0", "deps": [ { "name": "storage_alias", - "pkg": "fixture#radroots-storage@0.1.0", + "pkg": "fixture#radroots_storage@0.1.0", "dep_kinds": [ { "kind": null, @@ -38,7 +38,7 @@ ] }, { - "id": "fixture#radroots-storage@0.1.0", + "id": "fixture#radroots_storage@0.1.0", "deps": [] } ] diff --git a/tools/xtask/tests/fixtures/dependency-boundaries/service-to-sdk.json b/tools/xtask/tests/fixtures/dependency-boundaries/service-to-sdk.json @@ -1,11 +1,11 @@ { "packages": [ { - "id": "fixture#radroots-sync@0.1.0", - "name": "radroots-sync", + "id": "fixture#radroots_sync@0.1.0", + "name": "radroots_sync", "dependencies": [ { - "name": "radroots-sdk", + "name": "radroots_sdk", "rename": "client_engine", "kind": null, "features": ["memory"], @@ -15,19 +15,19 @@ ] }, { - "id": "fixture#radroots-sdk@0.1.0", - "name": "radroots-sdk", + "id": "fixture#radroots_sdk@0.1.0", + "name": "radroots_sdk", "dependencies": [] } ], "resolve": { "nodes": [ { - "id": "fixture#radroots-sync@0.1.0", + "id": "fixture#radroots_sync@0.1.0", "deps": [ { "name": "client_engine", - "pkg": "fixture#radroots-sdk@0.1.0", + "pkg": "fixture#radroots_sdk@0.1.0", "dep_kinds": [ { "kind": null, @@ -38,7 +38,7 @@ ] }, { - "id": "fixture#radroots-sdk@0.1.0", + "id": "fixture#radroots_sdk@0.1.0", "deps": [] } ] diff --git a/tools/xtask/tests/fixtures/dependency-boundaries/spi-to-adapter.json b/tools/xtask/tests/fixtures/dependency-boundaries/spi-to-adapter.json @@ -1,11 +1,11 @@ { "packages": [ { - "id": "fixture#radroots-transport@0.1.0", - "name": "radroots-transport", + "id": "fixture#radroots_transport@0.1.0", + "name": "radroots_transport", "dependencies": [ { - "name": "radroots-nostr", + "name": "radroots_nostr", "rename": "protocol_adapter", "kind": "build", "features": ["events"], @@ -15,19 +15,19 @@ ] }, { - "id": "fixture#radroots-nostr@0.1.0", - "name": "radroots-nostr", + "id": "fixture#radroots_nostr@0.1.0", + "name": "radroots_nostr", "dependencies": [] } ], "resolve": { "nodes": [ { - "id": "fixture#radroots-transport@0.1.0", + "id": "fixture#radroots_transport@0.1.0", "deps": [ { "name": "protocol_adapter", - "pkg": "fixture#radroots-nostr@0.1.0", + "pkg": "fixture#radroots_nostr@0.1.0", "dep_kinds": [ { "kind": "build", @@ -38,7 +38,7 @@ ] }, { - "id": "fixture#radroots-nostr@0.1.0", + "id": "fixture#radroots_nostr@0.1.0", "deps": [] } ] diff --git a/tools/xtask/tests/fixtures/dependency-boundaries/valid-downward.json b/tools/xtask/tests/fixtures/dependency-boundaries/valid-downward.json @@ -1,11 +1,11 @@ { "packages": [ { - "id": "fixture#radroots-transport-nostr@0.1.0", - "name": "radroots-transport-nostr", + "id": "fixture#radroots_transport_nostr@0.1.0", + "name": "radroots_transport_nostr", "dependencies": [ { - "name": "radroots-transport", + "name": "radroots_transport", "rename": "transport_spi", "kind": "dev", "features": [], @@ -15,19 +15,19 @@ ] }, { - "id": "fixture#radroots-transport@0.1.0", - "name": "radroots-transport", + "id": "fixture#radroots_transport@0.1.0", + "name": "radroots_transport", "dependencies": [] } ], "resolve": { "nodes": [ { - "id": "fixture#radroots-transport-nostr@0.1.0", + "id": "fixture#radroots_transport_nostr@0.1.0", "deps": [ { "name": "transport_spi", - "pkg": "fixture#radroots-transport@0.1.0", + "pkg": "fixture#radroots_transport@0.1.0", "dep_kinds": [ { "kind": "dev", @@ -38,7 +38,7 @@ ] }, { - "id": "fixture#radroots-transport@0.1.0", + "id": "fixture#radroots_transport@0.1.0", "deps": [] } ]