commit e3210f132d41fd82dabad79cecb9634cda9ad09c
parent 8f77ddd88a6bb1aab96fc63cb8cc1fc864435ee5
Author: triesap <tyson@radroots.org>
Date: Tue, 7 Jul 2026 05:35:18 +0000
transport: normalize Reticulum preview identity
- use reticulum:preview-unavailable for first-party preview defaults and positive fixtures
- update runtime Reticulum preview tests for preview_unavailable outcomes
- align runtime worker deferred targets with shared transport statuses
- validate expanded transport, runtime, outbox, and publish-protocol lanes
Diffstat:
5 files changed, 34 insertions(+), 23 deletions(-)
diff --git a/crates/outbox/src/store.rs b/crates/outbox/src/store.rs
@@ -2265,7 +2265,7 @@ mod tests {
"transport.reticulum.preview",
1,
RadrootsTransportSatisfactionPolicy::all_accepted(),
- vec![reticulum_target("reticulum:preview-target")],
+ vec![reticulum_target("reticulum:preview-unavailable")],
),
true,
1_007,
diff --git a/crates/runtime/src/transport.rs b/crates/runtime/src/transport.rs
@@ -292,13 +292,12 @@ impl RadrootsRuntimeDeliveryTarget {
Self {
delivery_target_id,
target,
- status: RadrootsTransportDeliveryTargetStatus::Deferred,
+ status: RadrootsTransportDeliveryTargetStatus::DeferredUntilImplemented,
}
}
pub fn is_ready_for_attempt(&self) -> bool {
- self.status == RadrootsTransportDeliveryTargetStatus::Pending
- || self.status == RadrootsTransportDeliveryTargetStatus::Failed
+ self.status.is_ready_for_attempt()
}
}
@@ -522,8 +521,9 @@ mod tests {
use radroots_events::draft::{RadrootsSignedNostrEvent, RadrootsSignedNostrEventParts};
use radroots_transport::{
RadrootsTransportDeliveryReceipt, RadrootsTransportDeliveryTargetStatus,
- RadrootsTransportKind, RadrootsTransportOutcome, RadrootsTransportSatisfactionPolicy,
- RadrootsTransportTarget, RadrootsTransportTargetReceipt,
+ RadrootsTransportKind, RadrootsTransportOutcome, RadrootsTransportSatisfactionClass,
+ RadrootsTransportSatisfactionPolicy, RadrootsTransportTarget,
+ RadrootsTransportTargetReceipt,
};
struct StaticAdapter {
@@ -630,7 +630,7 @@ mod tests {
"nostr-delivery",
RadrootsRuntimeTransportPayload::DigestOnly("sha256:event".to_owned()),
vec![target(RadrootsTransportKind::Nostr, "wss://relay.example")],
- RadrootsTransportSatisfactionPolicy::AnyTarget,
+ RadrootsTransportSatisfactionPolicy::any_accepted(),
1_000,
)
.expect("request"),
@@ -638,7 +638,10 @@ mod tests {
.await
.expect("receipt");
- assert_eq!(receipt.satisfied_target_count(), 1);
+ assert_eq!(
+ receipt.satisfied_target_count(RadrootsTransportSatisfactionClass::Accepted),
+ 1
+ );
assert_eq!(
receipt.target_receipts[0].status,
RadrootsTransportDeliveryTargetStatus::Accepted
@@ -662,9 +665,9 @@ mod tests {
RadrootsRuntimeTransportPayload::DigestOnly("sha256:event".to_owned()),
vec![target(
RadrootsTransportKind::Reticulum,
- "reticulum:preview",
+ "reticulum:preview-unavailable",
)],
- RadrootsTransportSatisfactionPolicy::AnyTarget,
+ RadrootsTransportSatisfactionPolicy::any_accepted(),
1_000,
)
.expect("request"),
@@ -672,10 +675,13 @@ mod tests {
.await
.expect("receipt");
- assert_eq!(receipt.satisfied_target_count(), 0);
+ assert_eq!(
+ receipt.satisfied_target_count(RadrootsTransportSatisfactionClass::Accepted),
+ 0
+ );
assert_eq!(
receipt.target_receipts[0].status,
- RadrootsTransportDeliveryTargetStatus::Unavailable
+ RadrootsTransportDeliveryTargetStatus::PreviewUnavailable
);
}
@@ -716,7 +722,10 @@ mod tests {
);
let deferred = RadrootsRuntimeDeliveryTarget::deferred_until_implemented(
2,
- target(RadrootsTransportKind::Reticulum, "reticulum:preview"),
+ target(
+ RadrootsTransportKind::Reticulum,
+ "reticulum:preview-unavailable",
+ ),
);
let receipt = worker
.execute_job(RadrootsRuntimeDeliveryJob {
@@ -724,7 +733,7 @@ mod tests {
payload: RadrootsRuntimeTransportPayload::DigestOnly("sha256:event".to_owned()),
plans: vec![RadrootsRuntimeDeliveryPlan {
delivery_plan_id: 7,
- satisfaction_policy: RadrootsTransportSatisfactionPolicy::AnyTarget,
+ satisfaction_policy: RadrootsTransportSatisfactionPolicy::any_accepted(),
targets: vec![ready, deferred],
}],
now_ms: 1_000,
diff --git a/crates/transport/tests/transport.rs b/crates/transport/tests/transport.rs
@@ -109,9 +109,11 @@ fn satisfaction_policy_counts_target_statuses() {
#[test]
fn deferred_transport_outcomes_are_terminal_but_not_satisfied() {
- let target =
- RadrootsTransportTarget::new(RadrootsTransportKind::Reticulum, "reticulum:preview")
- .expect("target");
+ let target = RadrootsTransportTarget::new(
+ RadrootsTransportKind::Reticulum,
+ "reticulum:preview-unavailable",
+ )
+ .expect("target");
let receipt = RadrootsTransportDeliveryReceipt {
request_id: "reticulum-preview".to_owned(),
target_receipts: vec![RadrootsTransportTargetReceipt::new(
diff --git a/crates/transport_publish_protocol/src/lib.rs b/crates/transport_publish_protocol/src/lib.rs
@@ -629,7 +629,7 @@ mod tests {
too_many.target_policy = TransportPublishTargetPolicy::explicit_targets(vec![
TransportPublishTarget::nostr("wss://relay.example.com"),
TransportPublishTarget::reticulum_preview(
- "reticulum:preview",
+ "reticulum:preview-unavailable",
TransportPublishPreviewBehavior::RejectDeliveryAttempts,
),
]);
@@ -707,7 +707,7 @@ mod tests {
event: event(),
target_policy: TransportPublishTargetPolicy::explicit_targets(vec![
TransportPublishTarget::reticulum_preview(
- "reticulum:preview",
+ "reticulum:preview-unavailable",
TransportPublishPreviewBehavior::DeferDeliveryPlans,
),
]),
@@ -832,7 +832,7 @@ mod tests {
let explicit = TransportPublishTargetPolicy::explicit_targets(vec![
TransportPublishTarget::nostr("wss://relay.example"),
TransportPublishTarget::reticulum_preview(
- "reticulum:preview",
+ "reticulum:preview-unavailable",
TransportPublishPreviewBehavior::DeferDeliveryPlans,
),
]);
diff --git a/crates/transport_reticulum/tests/reticulum_preview.rs b/crates/transport_reticulum/tests/reticulum_preview.rs
@@ -120,8 +120,8 @@ fn endpoint_and_profile_validation_are_strict_and_canonical() {
fn reject_delivery_attempts_returns_unavailable_without_success_or_nostr_routing() {
let transport = RadrootsReticulumPreviewTransport::default();
let request = delivery_request(vec![
- reticulum_target("reticulum:preview-a"),
- reticulum_target("reticulum:preview-b"),
+ reticulum_target("reticulum:preview-unavailable"),
+ reticulum_target("reticulum:preview-unavailable-alt"),
]);
let receipt = transport.deliver(request).expect("delivery receipt");
@@ -149,7 +149,7 @@ fn deferred_delivery_plan_mode_never_counts_as_satisfied() {
RadrootsReticulumPreviewProfile::default()
.with_behavior(RadrootsReticulumPreviewBehavior::DeferDeliveryPlans),
);
- let request = delivery_request(vec![reticulum_target("reticulum:preview-deferred")]);
+ let request = delivery_request(vec![reticulum_target("reticulum:preview-unavailable")]);
let receipt = transport.deliver(request).expect("delivery receipt");
assert_eq!(receipt.target_receipts.len(), 1);