lib

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

commit 7c5671ff6fb42f3ef10f488c2474bfd16e1bb0ff
parent 14fbc4be3f84e81f2a8a7789eea2d4b12d9b65c6
Author: triesap <tyson@radroots.org>
Date:   Tue,  4 Aug 2026 15:06:43 +0000

refactor: close transport compatibility quarantine

Diffstat:
Mcrates/transport/src/id.rs | 17-----------------
Mcrates/transport/src/lib.rs | 8++------
Mcrates/transport/src/target.rs | 57---------------------------------------------------------
Mcrates/transport/tests/package_boundary.rs | 31+++++++++++++++++++++----------
Mcrates/transport/tests/source_boundary.rs | 126++++++++++++++++++++++---------------------------------------------------------
Mdocs/implementation/DEVIATIONS.md | 16+++++++++++-----
Mdocs/implementation/deviations.toml | 41+++++++++++++++++++++++++++++++----------
7 files changed, 100 insertions(+), 196 deletions(-)

diff --git a/crates/transport/src/id.rs b/crates/transport/src/id.rs @@ -25,19 +25,6 @@ impl TransportId { /// Daemon-mediated transport. pub const RADROOTSD: Self = Self(ProtocolTransportKind::RADROOTSD); - /// Publish-frozen spelling retained only for external first-party consumers. - #[doc(hidden)] - #[allow(non_upper_case_globals)] - pub const Local: Self = Self::LOCAL; - /// Publish-frozen spelling retained only for external first-party consumers. - #[doc(hidden)] - #[allow(non_upper_case_globals)] - pub const Nostr: Self = Self::NOSTR; - /// Publish-frozen spelling retained only for external first-party consumers. - #[doc(hidden)] - #[allow(non_upper_case_globals)] - pub const Reticulum: Self = Self::RETICULUM; - /// Parses an exact canonical identity. pub fn parse(value: impl AsRef<str>) -> Result<Self, RadrootsTransportError> { ProtocolTransportKind::parse(value.as_ref()) @@ -61,10 +48,6 @@ impl TransportId { } } -/// Publish-frozen external-consumer alias; removed at Step 305. -#[doc(hidden)] -pub type RadrootsTransportKind = TransportId; - fn map_protocol_error(error: ProtocolError) -> RadrootsTransportError { match error { ProtocolError::EmptyTransportKind => RadrootsTransportError::EmptyTransportKind, diff --git a/crates/transport/src/lib.rs b/crates/transport/src/lib.rs @@ -26,7 +26,7 @@ pub use delivery::{ RadrootsTransportSatisfactionPolicy, RadrootsTransportTargetReceipt, }; pub use error::{Error, RadrootsTransportError}; -pub use id::{RadrootsTransportKind, TRANSPORT_ID_MAX_BYTES, TransportId}; +pub use id::{TRANSPORT_ID_MAX_BYTES, TransportId}; pub use kind::{ RadrootsTransportCapabilityAvailability, RadrootsTransportCapabilityMaturity, RadrootsTransportImplementationState, @@ -38,11 +38,7 @@ pub use status::{ RadrootsTransportCapabilities, RadrootsTransportDeliveryTargetStatus, RadrootsTransportOutcome, RadrootsTransportOutcomeKind, RadrootsTransportStatus, }; -pub use target::{ - RadrootsTransportMeshScopeId, RadrootsTransportTarget, RadrootsTransportTargetFingerprint, - RadrootsTransportTargetLabel, RadrootsTransportTargetSet, RadrootsTransportTargetUri, - TARGET_SET_MAX_ITEMS, Target, TargetSet, -}; +pub use target::{TARGET_SET_MAX_ITEMS, Target, TargetSet}; pub use transport::{RadrootsTransportFetchReceipt, RadrootsTransportFetchRequest}; #[cfg(test)] diff --git a/crates/transport/src/target.rs b/crates/transport/src/target.rs @@ -12,9 +12,6 @@ use core::net::Ipv6Addr; use core::str::FromStr; use sha2::{Digest, Sha256}; -const EXTERNAL_RETICULUM_ENDPOINT_URI: &str = "reticulum:local"; -const EXTERNAL_RETICULUM_SCOPE_ID: &str = "local"; - /// Maximum number of targets in one operation. pub const TARGET_SET_MAX_ITEMS: usize = 64; @@ -106,12 +103,6 @@ impl TargetScope { Ok(Self(value.to_string())) } - /// Publish-frozen external-consumer helper; removed at Step 305. - #[doc(hidden)] - pub fn local_reticulum() -> Self { - Self::parse(EXTERNAL_RETICULUM_SCOPE_ID).expect("external Reticulum scope id") - } - pub fn as_str(&self) -> &str { &self.0 } @@ -339,30 +330,6 @@ impl Target { Self::new_with_metadata(TransportId::NOSTR, uri, scope, label) } - /// Publish-frozen external-consumer helper; removed at Step 305. - #[doc(hidden)] - pub fn reticulum() -> Result<Self, RadrootsTransportError> { - Self::reticulum_with_metadata(EXTERNAL_RETICULUM_ENDPOINT_URI, None, None) - } - - /// Publish-frozen external-consumer helper; removed at Step 305. - #[doc(hidden)] - pub fn reticulum_with_metadata( - uri: impl AsRef<str>, - scope: Option<TargetScope>, - label: Option<TargetLabel>, - ) -> Result<Self, RadrootsTransportError> { - if uri.as_ref() != EXTERNAL_RETICULUM_ENDPOINT_URI { - return Err(RadrootsTransportError::InvalidTargetUri); - } - Self::new_with_metadata( - TransportId::RETICULUM, - uri, - Some(scope.unwrap_or_else(TargetScope::local_reticulum)), - label, - ) - } - pub fn local(uri: impl AsRef<str>) -> Result<Self, RadrootsTransportError> { Self::local_with_metadata(uri, None, None) } @@ -848,27 +815,3 @@ fn upper_hex_digit(byte: u8) -> bool { fn is_local_ws_relay_host(host: &str) -> bool { matches!(host, "localhost" | "127.0.0.1" | "[::1]") } - -/// Publish-frozen external-consumer alias; removed at Step 305. -#[doc(hidden)] -pub type RadrootsTransportTargetUri = EndpointUri; - -/// Publish-frozen external-consumer alias; removed at Step 305. -#[doc(hidden)] -pub type RadrootsTransportMeshScopeId = TargetScope; - -/// Publish-frozen external-consumer alias; removed at Step 305. -#[doc(hidden)] -pub type RadrootsTransportTargetLabel = TargetLabel; - -/// Publish-frozen external-consumer alias; removed at Step 305. -#[doc(hidden)] -pub type RadrootsTransportTargetFingerprint = TargetFingerprint; - -/// Publish-frozen external-consumer alias; removed at Step 305. -#[doc(hidden)] -pub type RadrootsTransportTarget = Target; - -/// Publish-frozen external-consumer alias; removed at Step 305. -#[doc(hidden)] -pub type RadrootsTransportTargetSet = TargetSet; diff --git a/crates/transport/tests/package_boundary.rs b/crates/transport/tests/package_boundary.rs @@ -182,23 +182,34 @@ fn source_and_sink_are_independent_dyn_compatible_host_spis() { assert!(!SINK.contains("fn fetch(")); assert!(!PREDECESSOR_MODELS.contains("pub trait RadrootsTransport")); - for required in [ - "Publish-frozen external-consumer helper; removed at Step 305.", - "#[doc(hidden)]\n pub fn reticulum(", - "#[doc(hidden)]\n pub fn reticulum_with_metadata(", - "#[doc(hidden)]\n pub fn local_reticulum(", + for retired in [ + "Publish-frozen external-consumer", + "pub fn reticulum(", + "pub fn reticulum_with_metadata(", + "pub fn local_reticulum(", + "RadrootsTransportTarget", + ] { + assert!( + !TARGET.contains(retired), + "retired external-consumer surface remains: `{retired}`" + ); + } + for retired in [ + "RadrootsTransportKind", + "pub const Local", + "pub const Nostr", + "pub const Reticulum", ] { assert!( - TARGET.contains(required), - "external-consumer quarantine is missing `{required}`" + !ID.contains(retired), + "retired transport identity remains: `{retired}`" ); } for required in [ "id = \"RCRV1-DEV-007\"", + "status = \"closed\"", "affected_steps = [\"122\", \"170\", \"215\", \"235\", \"305\"]", - "runtime-owned unpublished shim until Step 215", - "SDK-local unpublished target/satisfaction mapping until Step 235", - "external-consumer aliases/helpers until the fail-closed package-realistic Step 305 gate", + "Step 313 source census confirmed every external-consumer alias and helper is absent", ] { assert!( DEVIATIONS.contains(required), diff --git a/crates/transport/tests/source_boundary.rs b/crates/transport/tests/source_boundary.rs @@ -9,19 +9,16 @@ struct ForbiddenConcept { } const TRANSPORT_HARDENING_CRATE_SOURCE_ROOTS: &[&str] = &[ + "protocol/src/radrootsd/transport_publish", "transport/src", "transport_reticulum/src", - "transport_publish_protocol/src", "transport_nostr/src", - "outbox/src", ]; const GENERIC_TRANSPORT_STATUS_SOURCE_ROOTS: &[&str] = &[ - "event_store/src", "mesh_agent_proto/src", - "outbox/src", + "protocol/src/radrootsd/transport_publish", "transport/src", - "transport_publish_protocol/src", "transport_reticulum/src", ]; @@ -30,13 +27,10 @@ const CORE_STATUS_CONTRACT_SOURCE_ROOTS: &[&str] = &["transport/src", "transport const CORE_TRANSPORT_CONTRACT_SOURCE_ROOTS: &[&str] = &["transport/src"]; const TRANSPORT_CONSUMER_SOURCE_ROOTS: &[&str] = &[ - "event_store/src", "mesh/src", "mesh_agent_client/src", - "outbox/src", - "runtime/src", + "protocol/src/radrootsd/transport_publish", "transport_nostr/src", - "transport_publish_protocol/src", "transport_reticulum/src", ]; @@ -50,7 +44,7 @@ const RETIRED_TRANSPORT_TYPE_NAMES: &[&str] = &[ ]; const DELIVERY_PAYLOAD_CONTRACT_SOURCE_ROOTS: &[&str] = - &["transport/src", "runtime/src", "transport_reticulum/src"]; + &["transport/src", "transport_reticulum/src", "sync/src"]; const FOUNDATION_HARDENING_DOC_ROOTS: &[&str] = &["contracts", "docs"]; @@ -509,49 +503,17 @@ fn foundation_hardening_repo_sources_reject_retired_names_and_ambiguous_docs() { } #[test] -fn workspace_consumers_use_split_transport_spis_with_one_runtime_shim() { +fn workspace_consumers_use_only_the_final_split_transport_spis() { let crates_root = Path::new(env!("CARGO_MANIFEST_DIR")) .parent() .expect("transport crate parent"); - let runtime_source_raw = read_source(crates_root.join("runtime/src/transport.rs").as_path()); - let runtime_source = production_source(runtime_source_raw.as_str()); + assert!( + !crates_root.join("runtime").exists(), + "the predecessor runtime package must remain retired" + ); let reticulum_source_raw = read_source(crates_root.join("transport_reticulum/src/lib.rs").as_path()); let reticulum_source = production_source(reticulum_source_raw.as_str()); - - for required in [ - "Arc<dyn EventSource>", - "Arc<dyn EventSink>", - "pub fn register_source<T>", - "pub fn register_sink<T>", - "T: EventSource + 'static", - "T: EventSink + 'static", - ] { - assert!( - runtime_source.contains(required), - "runtime registry must expose final split SPI witness `{required}`" - ); - } - assert!( - runtime_source.contains("Arc<dyn RadrootsRuntimeTransportShim>"), - "mixed runtime delivery workers retain the sole runtime-owned unpublished shim until RCLD 40" - ); - assert!( - runtime_source.contains("pub trait RadrootsRuntimeTransportShim: Send + Sync"), - "the temporary runtime shim must have an explicit, searchable final-removal owner" - ); - let removed_reticulum_runtime_transport = - ["RadrootsRuntimeReticulum", "Pre", "viewTransport"].concat(); - for forbidden in [ - "pub trait RadrootsRuntimeTransportAdapter".to_owned(), - "dyn RadrootsRuntimeTransportAdapter".to_owned(), - removed_reticulum_runtime_transport, - ] { - assert!( - !runtime_source.contains(forbidden.as_str()), - "runtime transport source must not retain split adapter contract `{forbidden}`" - ); - } for required in [ "impl EventSource for RadrootsReticulumTransport", "impl EventSink for RadrootsReticulumTransport", @@ -561,11 +523,7 @@ fn workspace_consumers_use_split_transport_spis_with_one_runtime_shim() { "Reticulum preview must implement final split SPI witness `{required}`" ); } - assert!( - !reticulum_source - .contains("impl RadrootsRuntimeTransportShim for RadrootsReticulumTransport"), - "Reticulum preview must not implement the predecessor monolithic SPI" - ); + assert!(!reticulum_source.contains("RadrootsRuntimeTransportShim")); let nostr_sink = read_source(crates_root.join("transport_nostr/src/sink.rs").as_path()); let nostr_source = read_source(crates_root.join("transport_nostr/src/source.rs").as_path()); @@ -625,7 +583,7 @@ fn transport_publish_capabilities_keep_canonical_status_fields() { Path::new(env!("CARGO_MANIFEST_DIR")) .parent() .expect("transport crate parent") - .join("transport_publish_protocol/src/lib.rs") + .join("protocol/src/radrootsd/transport_publish/v5.rs") .as_path(), ); let source = production_source(source_raw.as_str()); @@ -633,24 +591,24 @@ fn transport_publish_capabilities_keep_canonical_status_fields() { for required in [ "pub transport: String,", "pub configured: bool,", - "pub implementation: TransportPublishImplementation,", - "pub maturity: TransportPublishCapabilityMaturity,", - "pub availability: TransportPublishCapabilityAvailability,", + "pub implementation: Implementation,", + "pub maturity: CapabilityMaturity,", + "pub availability: CapabilityAvailability,", "pub usable_for_delivery: bool,", - "pub capabilities: TransportPublishOperationCapabilities,", - "pub struct TransportPublishOperationCapabilities", + "pub capabilities: OperationCapabilities,", + "pub struct OperationCapabilities", "pub deliver: bool,", "pub fetch: bool,", "pub discovery: bool,", "pub gateway_forwarding: bool,", "pub receipt_observation: bool,", - "TransportPublishImplementation::Real", - "TransportPublishCapabilityMaturity::Preview", - "TransportPublishCapabilityAvailability::Unavailable", + "Implementation::Real", + "CapabilityMaturity::Preview", + "CapabilityAvailability::Unavailable", "configured: true", "usable_for_delivery: true", "usable_for_delivery: false", - "capabilities: TransportPublishOperationCapabilities", + "capabilities: OperationCapabilities", "deliver: true", "fetch: false", "discovery: false", @@ -764,13 +722,13 @@ fn transport_target_identity_sources_reject_silent_dedupe() { let protocol_source = read_source( crates_root - .join("transport_publish_protocol/src/lib.rs") + .join("protocol/src/radrootsd/transport_publish/v5.rs") .as_path(), ); for required in [ - "validate_explicit_target_uniqueness(targets)?;", - "TransportPublishProtocolError::DuplicateTarget { index }", - "duplicate_targets.validate(2)", + "target.validate_structure(index)?;", + "return Err(Error::DuplicateTarget { index });", + "Err(Error::DuplicateTarget { index: 1 })", ] { assert!( protocol_source.contains(required), @@ -778,20 +736,9 @@ fn transport_target_identity_sources_reject_silent_dedupe() { ); } - let outbox_source = read_source(crates_root.join("outbox/src/store.rs").as_path()); - for required in [ - "validate_unique_targets(&targets)?;", - "RadrootsTransportError::DuplicateTargetFingerprint", - "enqueue_rejects_duplicate_delivery_targets_before_persistence", - ] { - assert!( - outbox_source.contains(required), - "outbox source must retain duplicate target rejection witness `{required}`" - ); - } assert!( - !outbox_source.contains("ordered_unique_targets"), - "outbox source must not reintroduce silent ordered target dedupe before delivery-plan preparation" + !crates_root.join("outbox").exists(), + "the predecessor outbox package must remain retired" ); } @@ -803,16 +750,14 @@ fn required_target_semantics_stay_fingerprint_exact() { let protocol_source = read_source( crates_root - .join("transport_publish_protocol/src/lib.rs") + .join("protocol/src/radrootsd/transport_publish/v5.rs") .as_path(), ); for required in [ "Self::RequiredTargets { targets } => targets.len()", - "pub fn validate_target_membership", - "TransportPublishProtocolError::RequiredTargetNotInTargetSet { index }", - "let required_outcomes = required_policy_outcomes(targets, &job.targets)?;", - "required_outcomes.iter().any(|outcome|", - "fingerprint == *required", + "validate_required_target_fingerprints(targets.as_slice())", + "Error::DuplicateRequiredTargetFingerprint { index }", + "Matching fingerprints to native targets is intentionally deferred", ] { assert!( protocol_source.contains(required), @@ -943,22 +888,21 @@ fn transport_identity_is_extensible_and_reticulum_contracts_are_preview_owned() let protocol_source_raw = read_source( crates_root - .join("transport_publish_protocol/src/lib.rs") + .join("protocol/src/radrootsd/transport_publish/v5.rs") .as_path(), ); let protocol_source = production_source(protocol_source_raw.as_str()); assert!( - protocol_source.contains("RETICULUM_ENDPOINT_URI as RADROOTS_RETICULUM_ENDPOINT_URI"), - "transport publish protocol must consume the versioned protocol endpoint constant" + protocol_source.contains("pub const RETICULUM_ENDPOINT_URI: &str = \"reticulum:local\";"), + "versioned transport publish protocol must own its endpoint constant" ); assert!( !protocol_source.contains(["reticulum:", "pre", "view-unavailable"].concat().as_str()), "transport publish protocol must not duplicate the shared endpoint URI" ); assert!( - protocol_source - .contains("RETICULUM_UNAVAILABLE_MESSAGE as RADROOTS_RETICULUM_UNAVAILABLE_MESSAGE"), - "transport publish capabilities must consume the versioned protocol unavailable message" + protocol_source.contains("pub const RETICULUM_UNAVAILABLE_MESSAGE: &str = concat!("), + "versioned transport publish protocol must own its unavailable message" ); assert!( !protocol_source.contains("Reticulum transport is configured in preview mode"), diff --git a/docs/implementation/DEVIATIONS.md b/docs/implementation/DEVIATIONS.md @@ -13,11 +13,17 @@ silently change `radroots.crates.release.v1`. | `RCRV1-DEV-002` | 249 | Pull only the facade scaffold forward to immediately after Step 014 in `sdk`; do not repeat it later. | | `RCRV1-DEV-004` | 098, 155, 225, 260, 268, 294, 298-299, 301-304, 314 | Enforce a temporary 90% four-dimension coverage baseline during heavy development; restore 100% only through a future explicit contract update. | | `RCRV1-DEV-005` | 013, 019-026, 027-315 | Pin every Rust crate and internal Radroots dependency in `radrootslabs/lib` to exactly `0.1.0-alpha` until further explicit authority. | -| `RCRV1-DEV-007` | 122, 170, 215, 235, 305 | Remove the predecessor monolithic transport SPI now; quarantine publish-frozen runtime, SDK, CLI, and daemon consumer shims until their explicit removal gates. | -| `RCRV1-DEV-008` | 153, 155, 171, 179, 226, 288, 293, 313 | Activate final secrets dependency edges now; quarantine legacy vault/store consumers until their ordered storage, SDK, downstream, and final-removal gates. | -| `RCRV1-DEV-009` | 170, 179, 189, 196, 201, 213, 226, 235, 263, 269, 288, 292, 313 | Quarantine the four superseded storage packages until their independently buildable first-party consumers migrate, then remove them at Step 313. | -| `RCRV1-DEV-011` | 225, 226, 248 | Quarantine the superseded geocoder package until the standalone SDK adopts `radroots_geonames`, then remove it at the SDK retirement gate. | -| `RCRV1-DEV-012` | 279, 282-283 | Complete the mobile shared-engine cutover with bounded transport selectors and SDK-owned signing/Nostr composition before qualifying generated host artifacts. | + +## Closed records + +| ID | Closure | +| --- | --- | +| `RCRV1-DEV-007` | Final transport identities replaced every runtime, SDK, CLI, and daemon compatibility mapping; Step 313 removed the last hidden aliases/helpers. | +| `RCRV1-DEV-008` | Final secrets and storage owners replaced every vault/store predecessor; Step 313 removed the packages and remaining consumers. | +| `RCRV1-DEV-009` | Final storage and sync owners replaced the four predecessor packages; Step 313 removed the final SDK/CLI/index surfaces. | +| `RCRV1-DEV-010` | Step 301 removed the overdue Nostr-runtime and broad-network bridges after their consumer gates were green. | +| `RCRV1-DEV-011` | Step 248 completed the SDK GeoNames cutover and removed the geocoder bridge. | +| `RCRV1-DEV-012` | Steps 282-283 qualified the bounded selector, SDK signing/Nostr composition, and mobile bridge. | ## Record template diff --git a/docs/implementation/deviations.toml b/docs/implementation/deviations.toml @@ -68,7 +68,7 @@ closure_evidence = [ [[deviation]] id = "RCRV1-DEV-008" date = "2026-08-01" -status = "active" +status = "closed" approval = "All code-review recommendations and the full multi-RCLD implementation sequence were explicitly approved by the user." affected_steps = ["153", "155", "171", "179", "226", "288", "293", "313"] spec_anchors = [ @@ -87,14 +87,18 @@ verification = [ "SDK source-boundary tests confine predecessor imports to private_store.rs and require the final optional radroots_secrets dependency edge.", "Step 155 release-policy validation keeps every quarantine package non-publishable until its exact removal gate.", ] -unresolved_risk = "Publish-frozen compatibility code remains reachable inside legacy runtime/private-preview paths until Steps 179, 226, 288, 293, and 313; no package-realistic publication may proceed while it remains." +unresolved_risk = "None; the predecessor packages and all active manifest consumers are absent." normative_architecture_change = false adr_required = false +closure_evidence = [ + "crates/secrets/tests/consumer_migration.rs rejects every predecessor package directory, workspace dependency, and active manifest reference.", + "Step 313 source census confirmed the SDK, Myc, CLI, and library runtime paths use only radroots_secrets and final storage owners.", +] [[deviation]] id = "RCRV1-DEV-007" date = "2026-07-30" -status = "active" +status = "closed" approval = "All code-review recommendations and the full multi-RCLD implementation sequence were explicitly approved by the user." affected_steps = ["122", "170", "215", "235", "305"] spec_anchors = [ @@ -115,14 +119,18 @@ verification = [ "Steps 215 and 235 are the exact fail-closed final-removal gates for the remaining runtime and SDK mappings.", "Step 305 rejects publication until oss/cli and oss/radrootsd no longer require the documentation-hidden external-consumer aliases and Reticulum helpers.", ] -unresolved_risk = "Runtime, SDK, CLI, and daemon consumers retain bounded publish-frozen predecessor mappings; package-realistic publication remains blocked until every mapping is removed at its explicit gate." +unresolved_risk = "None; final consumers use TransportId, Target, TargetScope, TargetLabel, and TargetFingerprint directly." normative_architecture_change = false adr_required = false +closure_evidence = [ + "crates/transport/tests/package_boundary.rs rejects the hidden Reticulum constructors, legacy constant spellings, and prefixed target aliases.", + "Step 313 source census confirmed every external-consumer alias and helper is absent after the daemon cutover to final transport identities.", +] [[deviation]] id = "RCRV1-DEV-009" date = "2026-08-02" -status = "active" +status = "closed" approval = "All code-review recommendations and the full multi-RCLD implementation sequence were explicitly approved by the user." affected_steps = ["170", "179", "189", "196", "201", "213", "226", "235", "263", "269", "288", "292", "313"] spec_anchors = [ @@ -143,9 +151,13 @@ verification = [ "Workspace checks and tests prove current migration consumers remain buildable while publication stays frozen.", "Step 313 performs the all-first-party forbidden-name search and final package deletion." ] -unresolved_risk = "Private compatibility implementations remain reachable until all standalone consumers migrate; package-realistic publication remains blocked until Step 313 removes them." +unresolved_risk = "None; all four predecessor packages and their active dependency edges are absent." normative_architecture_change = false adr_required = false +closure_evidence = [ + "crates/storage_sqlite/tests/package_boundary.rs and crates/storage/tests/workspace_consumers.rs reject the four predecessor package identities.", + "Step 313 removed the final library packages, SDK runtime/event-index surfaces, and CLI source dependency branch after all standalone consumers migrated.", +] [[deviation]] id = "RCRV1-DEV-005" @@ -232,7 +244,7 @@ adr_required = false [[deviation]] id = "RCRV1-DEV-011" date = "2026-08-03" -status = "active" +status = "closed" approval = "All code-review recommendations and the full multi-RCLD implementation sequence were explicitly approved by the user." affected_steps = ["225", "226", "248"] spec_anchors = [ @@ -250,14 +262,18 @@ verification = [ "GeoNames package quarantine tests require the predecessor to remain private and absent from the approved publication inventory while the SDK source census remains non-empty.", "Step 248 must reject every remaining package, dependency, feature, import, and error-adapter reference to radroots_geocoder before deletion.", ] -unresolved_risk = "The standalone SDK remains coupled to the predecessor API until its ordered cutover; package-realistic publication is blocked until Step 248 removes the bridge." +unresolved_risk = "None; the SDK consumes radroots_geonames and the predecessor package is absent." normative_architecture_change = false adr_required = false +closure_evidence = [ + "crates/geonames/tests/package_boundary.rs rejects the superseded package directory and release-policy identity.", + "The SDK Step 248 checkpoint removed every radroots_geocoder dependency, feature, import, and error-adapter reference.", +] [[deviation]] id = "RCRV1-DEV-012" date = "2026-08-03" -status = "active" +status = "closed" approval = "All code-review recommendations and the full multi-RCLD implementation sequence were explicitly approved by the user." affected_steps = ["279", "282", "283"] spec_anchors = [ @@ -276,6 +292,11 @@ verification = [ "The Nostr adapter applies kind, author, and time constraints remotely and defensively filters returned events before page bounds.", "The shared-engine SDK and mobile integration gates must pass before Steps 282 and 283 are marked complete.", ] -unresolved_risk = "Steps 282 and 283 remain blocked until the SDK and mobile bridge checkpoints implement and verify the complete operation surface." +unresolved_risk = "None; the shared-engine and mobile qualification checkpoints completed with the final selector and SDK ownership model." normative_architecture_change = false adr_required = false +closure_evidence = [ + "crates/transport/tests/source_contract.rs verifies bounded canonical selector construction and request binding.", + "crates/transport_nostr/src/source.rs tests remote selector translation and defensive result filtering before page bounds.", + "Steps 282 and 283 qualified the SDK-owned signing, Nostr composition, and mobile presentation bridge without lower-package ownership leakage.", +]