sdk

Radroots SDK and bindings
git clone https://radroots.dev/git/sdk.git
Log | Files | Refs | README

commit a7e63f6ccea6fdc60047d583c54e816a95576366
parent b6ce7f66f838ecb89e3a1d40c376d1017b858512
Author: triesap <tyson@radroots.org>
Date:   Mon, 27 Jul 2026 18:52:09 +0000

workspace: correct crate names to snake case

- rename the SDK package and lower registry identities to snake case
- align local patches, lock resolution, and dependency selectors
- update release contracts, synchronized specs, and documentation
- teach architecture fixtures to enforce exact snake-case package names

Diffstat:
M.cargo/config.toml | 20++++++++++----------
MAGENTS.md | 6+++---
MCONTRIBUTING.md | 2+-
MCargo.lock | 354++++++++++++++++++++++++++++++++++++++++----------------------------------------
MCargo.toml | 20++++++++++----------
MREADME | 2+-
Mcontracts/releases/api_boundaries.toml | 48++++++++++++++++++++++++------------------------
Mcontracts/releases/package_tiers.toml | 40++++++++++++++++++++--------------------
Mcontracts/releases/publication.toml | 72++++++++++++++++++++++++++++++++++++------------------------------------
Mcrates/sdk/Cargo.toml | 2+-
Mcrates/sdk/README.md | 10+++++-----
Mdocs/implementation/HISTORY_PRESERVATION.md | 2+-
Mdocs/implementation/PUBLICATION_FREEZE.md | 4++--
Mdocs/implementation/TRACEABILITY.md | 14+++++++-------
Mdocs/specs/README.md | 4++--
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/dependency_boundary.rs | 18+++++++++---------
Mtools/xtask/src/check.rs | 40++++++++++++++++++++--------------------
Mtools/xtask/src/smoke.rs | 2+-
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++++++++--------
29 files changed, 868 insertions(+), 869 deletions(-)

diff --git a/.cargo/config.toml b/.cargo/config.toml @@ -6,28 +6,28 @@ xtask = "run -p radroots_sdk_xtask --" # this repository configuration. [patch.crates-io] radroots_authority = { path = "../lib/crates/authority" } -radroots-blossom = { path = "../lib/crates/blossom" } -radroots-core = { path = "../lib/crates/core" } +radroots_blossom = { path = "../lib/crates/blossom" } +radroots_core = { path = "../lib/crates/core" } radroots_event_store = { path = "../lib/crates/event_store" } -radroots-event = { path = "../lib/crates/event" } -radroots-event-codec = { path = "../lib/crates/event_codec" } +radroots_event = { path = "../lib/crates/event" } +radroots_event_codec = { path = "../lib/crates/event_codec" } radroots_event_index = { path = "../lib/crates/event_index" } radroots_geocoder = { path = "../lib/crates/geocoder" } -radroots-identity = { path = "../lib/crates/identity" } -radroots-nostr = { path = "../lib/crates/nostr" } -radroots-nostr-connect = { path = "../lib/crates/nostr_connect" } +radroots_identity = { path = "../lib/crates/identity" } +radroots_nostr = { path = "../lib/crates/nostr" } +radroots_nostr_connect = { path = "../lib/crates/nostr_connect" } radroots_nostr_signer = { path = "../lib/crates/nostr_signer" } radroots_outbox = { path = "../lib/crates/outbox" } radroots_protocol_contract_v1 = { path = "../lib/crates/protocol_contract_v1" } radroots_protected_store = { path = "../lib/crates/protected_store" } radroots_secret_vault = { path = "../lib/crates/secret_vault" } -radroots-transport = { path = "../lib/crates/transport" } +radroots_transport = { path = "../lib/crates/transport" } radroots_transport_publish_protocol = { path = "../lib/crates/transport_publish_protocol" } -radroots-transport-nostr = { path = "../lib/crates/transport_nostr" } +radroots_transport_nostr = { path = "../lib/crates/transport_nostr" } radroots_transport_reticulum = { path = "../lib/crates/transport_reticulum" } radroots_replica_store = { path = "../lib/crates/replica_store" } radroots_replica_schema = { path = "../lib/crates/replica_schema" } radroots_replica_sync = { path = "../lib/crates/replica_sync" } radroots_runtime_paths = { path = "../lib/crates/runtime_paths" } radroots_sql_core = { path = "../lib/crates/sql_core" } -radroots-trade = { path = "../lib/crates/trade" } +radroots_trade = { path = "../lib/crates/trade" } diff --git a/AGENTS.md b/AGENTS.md @@ -24,7 +24,7 @@ overrides this file for its subtree. - This repository owns the Radroots SDK workspace, including Rust SDK APIs, generated language bindings, FFI layers, WebAssembly surfaces, package metadata, and SDK validation flows. -- It owns `radroots-sdk` and the ordinary-user `radroots` facade. The 17 +- It owns `radroots_sdk` and the ordinary-user `radroots` facade. The 17 lower release-v1 packages remain owned by the standalone `radrootslabs/lib` repository. - Do not make this repository responsible for downstream apps, private @@ -54,11 +54,11 @@ overrides this file for its subtree. ## Architecture and generation rules -- `radroots-sdk` is the advanced front door. It owns host-neutral client +- `radroots_sdk` is the advanced front door. It owns host-neutral client semantics, not global runtimes, hidden workers, logging installation, UI state, Studio databases, or process lifecycle. - `radroots` is a curated ordinary-user facade. It has no public `sdk` - namespace and does not wildcard-reexport `radroots-sdk`. + namespace and does not wildcard-reexport `radroots_sdk`. - Cross-repository dependencies on the lower package family use registry versions in release candidates, never production sibling paths or Git overrides. diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md @@ -9,7 +9,7 @@ editing, read these files in order: 4. the affected manifests, implementation, contracts, generators, and tests The release-v1 architecture identifier is `radroots.crates.release.v1`. This -repository owns `radroots-sdk` and the ordinary-user `radroots` facade; the +repository owns `radroots_sdk` and the ordinary-user `radroots` facade; the standalone core-library repository owns the other 17 public packages. ## Workflow diff --git a/Cargo.lock b/Cargo.lock @@ -1957,205 +1957,78 @@ name = "radroots" version = "0.1.0" [[package]] -name = "radroots-blossom" -version = "0.1.0" -dependencies = [ - "mediatype", - "serde", - "sha2", - "unicode-general-category", - "url", -] - -[[package]] -name = "radroots-core" -version = "0.1.0" +name = "radroots_authority" +version = "1.0.0-alpha.1" dependencies = [ - "rust_decimal", - "serde", + "radroots_event", + "radroots_nostr", ] [[package]] -name = "radroots-event" +name = "radroots_blossom" version = "0.1.0" dependencies = [ - "dto_bindgen", - "hex", - "jiff-tzdb", - "radroots-blossom", - "radroots-core", - "secp256k1", + "mediatype", "serde", - "serde_json", "sha2", "unicode-general-category", "url", ] [[package]] -name = "radroots-event-codec" +name = "radroots_core" version = "0.1.0" dependencies = [ - "hex", - "nostr", - "radroots-blossom", - "radroots-core", - "radroots-event", - "serde", - "serde_json", - "sha2", -] - -[[package]] -name = "radroots-identity" -version = "0.1.0" -dependencies = [ - "k256", - "radroots_protected_store", - "radroots_runtime_paths", - "radroots_secret_vault", - "serde_json", - "thiserror 2.0.18", - "tracing", -] - -[[package]] -name = "radroots-nostr" -version = "0.1.0" -dependencies = [ - "nostr", - "nostr-sdk", - "radroots-event", - "radroots-event-codec", - "radroots-identity", - "serde", - "serde_json", - "thiserror 1.0.69", -] - -[[package]] -name = "radroots-nostr-connect" -version = "0.1.0" -dependencies = [ - "nostr", + "rust_decimal", "serde", - "serde_json", - "thiserror 1.0.69", - "url", ] [[package]] -name = "radroots-sdk" +name = "radroots_core_bindings" version = "0.1.0" dependencies = [ - "base64 0.22.1", - "futures", - "hex", - "nostr", - "radroots-core", - "radroots-event", - "radroots-event-codec", - "radroots-identity", - "radroots-nostr", - "radroots-nostr-connect", - "radroots-trade", - "radroots-transport", - "radroots-transport-nostr", - "radroots_authority", - "radroots_event_store", - "radroots_geocoder", - "radroots_nostr_signer", - "radroots_outbox", - "radroots_protected_store", - "radroots_replica_schema", - "radroots_replica_store", - "radroots_replica_sync", - "radroots_runtime_contract_v1", - "radroots_runtime_paths", - "radroots_secret_vault", - "radroots_sql_core", - "radroots_transport_publish_protocol", - "radroots_transport_reticulum", - "reqwest", - "serde", - "serde_json", - "sha2", - "sqlx", - "tempfile", - "tokio", - "tokio-tungstenite", - "uuid", + "dto_bindgen", + "dto_bindgen_core", + "radroots_core", ] [[package]] -name = "radroots-trade" +name = "radroots_event" version = "0.1.0" dependencies = [ - "base64 0.22.1", "dto_bindgen", - "dto_bindgen_core", "hex", - "radroots-core", - "radroots-event", - "radroots-event-codec", - "radroots_authority", - "radroots_event_store", + "jiff-tzdb", + "radroots_blossom", + "radroots_core", + "secp256k1", "serde", "serde_json", "sha2", - "sqlx", - "thiserror 1.0.69", + "unicode-general-category", + "url", ] [[package]] -name = "radroots-transport" +name = "radroots_event_bindings" version = "0.1.0" dependencies = [ - "serde", - "sha2", + "dto_bindgen_backend_ts", + "radroots_event", ] [[package]] -name = "radroots-transport-nostr" +name = "radroots_event_codec" version = "0.1.0" dependencies = [ - "futures", + "hex", "nostr", - "radroots-event", - "radroots-nostr", - "radroots-transport", - "radroots_event_store", - "radroots_outbox", + "radroots_blossom", + "radroots_core", + "radroots_event", "serde", "serde_json", - "thiserror 1.0.69", - "tokio", - "url", -] - -[[package]] -name = "radroots_authority" -version = "1.0.0-alpha.1" -dependencies = [ - "radroots-event", - "radroots-nostr", -] - -[[package]] -name = "radroots_core_bindings" -version = "0.1.0" -dependencies = [ - "dto_bindgen", - "dto_bindgen_core", - "radroots-core", -] - -[[package]] -name = "radroots_event_bindings" -version = "0.1.0" -dependencies = [ - "dto_bindgen_backend_ts", - "radroots-event", + "sha2", ] [[package]] @@ -2163,10 +2036,10 @@ name = "radroots_event_codec_wasm" version = "0.1.0-alpha.2" dependencies = [ "nostr", - "radroots-blossom", - "radroots-core", - "radroots-event", - "radroots-event-codec", + "radroots_blossom", + "radroots_core", + "radroots_event", + "radroots_event_codec", "serde", "serde_json", "wasm-bindgen", @@ -2194,10 +2067,10 @@ version = "1.0.0-alpha.1" dependencies = [ "getrandom 0.2.17", "hex", - "radroots-blossom", - "radroots-event", - "radroots-event-codec", - "radroots-transport", + "radroots_blossom", + "radroots_event", + "radroots_event_codec", + "radroots_transport", "serde", "serde_json", "sha2", @@ -2223,11 +2096,24 @@ dependencies = [ ] [[package]] +name = "radroots_identity" +version = "0.1.0" +dependencies = [ + "k256", + "radroots_protected_store", + "radroots_runtime_paths", + "radroots_secret_vault", + "serde_json", + "thiserror 2.0.18", + "tracing", +] + +[[package]] name = "radroots_identity_bindings" version = "0.1.0" dependencies = [ "dto_bindgen_backend_ts", - "radroots-identity", + "radroots_identity", ] [[package]] @@ -2243,14 +2129,39 @@ dependencies = [ ] [[package]] +name = "radroots_nostr" +version = "0.1.0" +dependencies = [ + "nostr", + "nostr-sdk", + "radroots_event", + "radroots_event_codec", + "radroots_identity", + "serde", + "serde_json", + "thiserror 1.0.69", +] + +[[package]] +name = "radroots_nostr_connect" +version = "0.1.0" +dependencies = [ + "nostr", + "serde", + "serde_json", + "thiserror 1.0.69", + "url", +] + +[[package]] name = "radroots_nostr_signer" 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", "serde", "serde_json", @@ -2265,9 +2176,9 @@ name = "radroots_outbox" version = "1.0.0-alpha.1" dependencies = [ "hex", - "radroots-event", - "radroots-transport", + "radroots_event", "radroots_event_store", + "radroots_transport", "serde", "serde_json", "sha2", @@ -2346,9 +2257,9 @@ version = "1.0.0-alpha.1" dependencies = [ "base64 0.22.1", "hex", - "radroots-core", - "radroots-event", - "radroots-event-codec", + "radroots_core", + "radroots_event", + "radroots_event_codec", "radroots_replica_schema", "radroots_replica_store", "radroots_sql_core", @@ -2363,7 +2274,7 @@ name = "radroots_replica_sync_wasm" version = "0.1.0-alpha.2" dependencies = [ "base64 0.22.1", - "radroots-event", + "radroots_event", "radroots_replica_sync", "radroots_sdk_sql_wasm_runtime", "serde", @@ -2412,6 +2323,49 @@ dependencies = [ ] [[package]] +name = "radroots_sdk" +version = "0.1.0" +dependencies = [ + "base64 0.22.1", + "futures", + "hex", + "nostr", + "radroots_authority", + "radroots_core", + "radroots_event", + "radroots_event_codec", + "radroots_event_store", + "radroots_geocoder", + "radroots_identity", + "radroots_nostr", + "radroots_nostr_connect", + "radroots_nostr_signer", + "radroots_outbox", + "radroots_protected_store", + "radroots_replica_schema", + "radroots_replica_store", + "radroots_replica_sync", + "radroots_runtime_contract_v1", + "radroots_runtime_paths", + "radroots_secret_vault", + "radroots_sql_core", + "radroots_trade", + "radroots_transport", + "radroots_transport_nostr", + "radroots_transport_publish_protocol", + "radroots_transport_reticulum", + "reqwest", + "serde", + "serde_json", + "sha2", + "sqlx", + "tempfile", + "tokio", + "tokio-tungstenite", + "uuid", +] + +[[package]] name = "radroots_sdk_sql_wasm_runtime" version = "0.1.0-alpha.2" dependencies = [ @@ -2429,8 +2383,8 @@ dependencies = [ "dto_bindgen_backend_ts", "dto_bindgen_core", "flate2", - "radroots-event", "radroots_core_bindings", + "radroots_event", "radroots_event_bindings", "radroots_event_index", "radroots_identity_bindings", @@ -2462,19 +2416,65 @@ dependencies = [ ] [[package]] +name = "radroots_trade" +version = "0.1.0" +dependencies = [ + "base64 0.22.1", + "dto_bindgen", + "dto_bindgen_core", + "hex", + "radroots_authority", + "radroots_core", + "radroots_event", + "radroots_event_codec", + "radroots_event_store", + "serde", + "serde_json", + "sha2", + "sqlx", + "thiserror 1.0.69", +] + +[[package]] name = "radroots_trade_bindings" version = "0.1.0" dependencies = [ "dto_bindgen", "dto_bindgen_core", - "radroots-trade", + "radroots_trade", +] + +[[package]] +name = "radroots_transport" +version = "0.1.0" +dependencies = [ + "serde", + "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", ] @@ -2482,7 +2482,7 @@ dependencies = [ name = "radroots_transport_reticulum" version = "1.0.0-alpha.1" dependencies = [ - "radroots-transport", + "radroots_transport", ] [[package]] diff --git a/Cargo.toml b/Cargo.toml @@ -49,27 +49,27 @@ dto_bindgen = { version = "0.1.0" } dto_bindgen_backend_ts = { version = "0.1.0" } dto_bindgen_core = { version = "0.1.0" } radroots_authority = { version = "=1.0.0-alpha.1", default-features = false } -radroots_blossom = { package = "radroots-blossom", version = "=0.1.0", default-features = false } -radroots_core = { package = "radroots-core", version = "=0.1.0", default-features = false } +radroots_blossom = { package = "radroots_blossom", version = "=0.1.0", default-features = false } +radroots_core = { package = "radroots_core", version = "=0.1.0", default-features = false } radroots_event_store = { version = "=1.0.0-alpha.1", default-features = false } -radroots_event = { package = "radroots-event", version = "=0.1.0", default-features = false } -radroots_event_codec = { package = "radroots-event-codec", version = "=0.1.0", default-features = false } +radroots_event = { package = "radroots_event", version = "=0.1.0", default-features = false } +radroots_event_codec = { package = "radroots_event_codec", version = "=0.1.0", default-features = false } radroots_event_index = { version = "=1.0.0-alpha.1", default-features = false } radroots_geocoder = { version = "=1.0.0-alpha.1" } -radroots_identity = { package = "radroots-identity", version = "=0.1.0", default-features = false, features = [ +radroots_identity = { package = "radroots_identity", version = "=0.1.0", default-features = false, features = [ "std", ] } -radroots_nostr = { package = "radroots-nostr", version = "=0.1.0", default-features = false } -radroots_nostr_connect = { package = "radroots-nostr-connect", version = "=0.1.0", default-features = false } +radroots_nostr = { package = "radroots_nostr", version = "=0.1.0", default-features = false } +radroots_nostr_connect = { package = "radroots_nostr_connect", version = "=0.1.0", default-features = false } radroots_nostr_signer = { version = "=1.0.0-alpha.1", default-features = false } radroots_outbox = { version = "=1.0.0-alpha.1", default-features = false } radroots_protocol_contract_v1 = { version = "=1.0.0-alpha.1", default-features = false } radroots_protected_store = { version = "=1.0.0-alpha.1", default-features = false } radroots_runtime_contract_v1 = { path = "crates/runtime_contract_v1", version = "0.1.0", default-features = false } radroots_secret_vault = { version = "=1.0.0-alpha.1", default-features = false } -radroots_transport = { package = "radroots-transport", version = "=0.1.0", default-features = false } +radroots_transport = { package = "radroots_transport", version = "=0.1.0", default-features = false } radroots_transport_publish_protocol = { version = "=1.0.0-alpha.1", default-features = false } -radroots_transport_nostr = { package = "radroots-transport-nostr", version = "=0.1.0", default-features = false } +radroots_transport_nostr = { package = "radroots_transport_nostr", version = "=0.1.0", default-features = false } radroots_transport_reticulum = { version = "=1.0.0-alpha.1", default-features = false } radroots_replica_store = { version = "=1.0.0-alpha.1", default-features = false } radroots_replica_schema = { version = "=1.0.0-alpha.1", default-features = false } @@ -77,7 +77,7 @@ radroots_replica_sync = { version = "=1.0.0-alpha.1", default-features = false } radroots_runtime_paths = { version = "=1.0.0-alpha.1", default-features = false } radroots_sdk_sql_wasm_runtime = { path = "crates/sql_wasm_runtime", version = "0.1.0-alpha.2" } radroots_sql_core = { version = "=1.0.0-alpha.1", default-features = false } -radroots_trade = { package = "radroots-trade", version = "=0.1.0", default-features = false, features = [ +radroots_trade = { package = "radroots_trade", version = "=0.1.0", default-features = false, features = [ "serde_json", "std", ] } diff --git a/README b/README @@ -1,4 +1,4 @@ -# radroots-sdk +# radroots_sdk This is the README for `sdk` which contains the Rad Roots SDK, including Rust runtime APIs, generated bindings, FFI layers, and package surfaces. 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/publication.toml b/contracts/releases/publication.toml @@ -4,45 +4,45 @@ 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-sdk", "radroots"] +local_packages = ["radroots_sdk", "radroots"] external_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", ] [workspace_classification] diff --git a/crates/sdk/Cargo.toml b/crates/sdk/Cargo.toml @@ -1,5 +1,5 @@ [package] -name = "radroots-sdk" +name = "radroots_sdk" publish = false version.workspace = true edition.workspace = true diff --git a/crates/sdk/README.md b/crates/sdk/README.md @@ -1,4 +1,4 @@ -# radroots-sdk +# radroots_sdk Curated Radroots Rust SDK for local-first Radroots product workflows. @@ -78,10 +78,10 @@ not expose a public workflow-bypass namespace for product callers. Compile the SDK v1 product examples with: ```bash -cargo check -p radroots-sdk --example sdk_v1_listing_prepare --features runtime -cargo check -p radroots-sdk --example sdk_v1_knowledge_prepare --features knowledge -cargo check -p radroots-sdk --example sdk_v1_local_enqueue_and_mock_sync --features runtime,signer-adapters -cargo check -p radroots-sdk --example sdk_v1_myc_nip46_signer_setup --features runtime,signer-adapters +cargo check -p radroots_sdk --example sdk_v1_listing_prepare --features runtime +cargo check -p radroots_sdk --example sdk_v1_knowledge_prepare --features knowledge +cargo check -p radroots_sdk --example sdk_v1_local_enqueue_and_mock_sync --features runtime,signer-adapters +cargo check -p radroots_sdk --example sdk_v1_myc_nip46_signer_setup --features runtime,signer-adapters ``` `sdk_v1_listing_prepare` shows `RadrootsClient::builder()`, diff --git a/docs/implementation/HISTORY_PRESERVATION.md b/docs/implementation/HISTORY_PRESERVATION.md @@ -2,7 +2,7 @@ Step 015 is satisfied under `RCRV1-DEV-001` without importing or combining repository history. This repository remains the independent source authority -for `radroots-sdk`, the new `radroots` facade, bindings, and SDK tooling. +for `radroots_sdk`, the new `radroots` facade, bindings, and SDK tooling. ## Verified checkpoint diff --git a/docs/implementation/PUBLICATION_FREEZE.md b/docs/implementation/PUBLICATION_FREEZE.md @@ -1,7 +1,7 @@ # Crates.io publication freeze Crates.io publication is frozen for the complete release-v1 crate refactor. -Every workspace package, including `radroots-sdk` and the future `radroots` +Every workspace package, including `radroots_sdk` and the future `radroots` facade, must set: ```toml @@ -16,7 +16,7 @@ explicitly publishable. The only planned exception is release plan Step 305, after the final package inventory, resolved public dependency graph, API surface, target matrix, and security gates are green. That checkpoint may set `publication.frozen = false` -and enable exactly `radroots-sdk` and `radroots` for package-validation +and enable exactly `radroots_sdk` and `radroots` for package-validation staging. It does not authorize upload or any crates.io mutation. Changing the freeze requires an independently reviewed release-control commit. 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/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/sdk` repository owns packages 18-19, `radroots-sdk` and the +The `radrootslabs/sdk` repository owns packages 18-19, `radroots_sdk` and the ordinary-user `radroots` facade. The `radrootslabs/lib` repository owns -packages 1-17, from `radroots-core` through `radroots-geonames`. No third Rust +packages 1-17, from `radroots_core` through `radroots_geonames`. 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 @@ -589,10 +589,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; } @@ -1198,7 +1197,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\"") ), ) @@ -1210,19 +1209,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/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/check.rs b/tools/xtask/src/check.rs @@ -2144,24 +2144,24 @@ mod tests { }; const APPROVED_CRATES: [&str; 19] = [ - "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", ]; @@ -2203,7 +2203,7 @@ registry = "crates-io" final_enablement_step = 305 spec_id = "radroots.crates.release.v1" approved_packages = [{}] -local_packages = ["radroots-sdk", "radroots"] +local_packages = ["radroots_sdk", "radroots"] external_packages = [{}] [workspace_classification] @@ -2320,7 +2320,7 @@ retired = [] .expect("write policy"); fs::write( root.join("crates/sdk/Cargo.toml"), - "[package]\nname = \"radroots-sdk\"\nversion = \"0.1.0\"\npublish = [\"crates-io\"]\n", + "[package]\nname = \"radroots_sdk\"\nversion = \"0.1.0\"\npublish = [\"crates-io\"]\n", ) .expect("write SDK manifest"); fs::write( diff --git a/tools/xtask/src/smoke.rs b/tools/xtask/src/smoke.rs @@ -218,7 +218,7 @@ mod tests { #[test] fn smoke_consumer_manifest_uses_exact_direct_dependency_pin() { let manifest = - render_consumer_manifest(Path::new("/tmp/radroots-sdk"), "=0.44.2").expect("manifest"); + render_consumer_manifest(Path::new("/tmp/radroots_sdk"), "=0.44.2").expect("manifest"); assert!(manifest.contains("nostr = \"=0.44.2\"")); assert!(!manifest.contains("nostr = \"0.44.2\"")); 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": [] } ]