commit 7c5671ff6fb42f3ef10f488c2474bfd16e1bb0ff
parent 14fbc4be3f84e81f2a8a7789eea2d4b12d9b65c6
Author: triesap <tyson@radroots.org>
Date: Tue, 4 Aug 2026 15:06:43 +0000
refactor: close transport compatibility quarantine
Diffstat:
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.",
+]