commit 510e5fad77c0e82d6db604744aa37f645e8daf14
parent 70fcd1a9a364f17cea4eb6de1cce50bed6ea32e3
Author: triesap <tyson@radroots.org>
Date: Fri, 10 Jul 2026 10:13:23 +0000
transport: guard required target publishing
- add daemon source-boundary witnesses for required targets
- lock protocol membership validation at daemon ingress
- lock daemon delivery status to required target outcomes
- validate focused transport publish lanes
Diffstat:
1 file changed, 64 insertions(+), 0 deletions(-)
diff --git a/tests/source_boundary.rs b/tests/source_boundary.rs
@@ -209,6 +209,70 @@ fn transport_publish_store_egress_requires_protocol_validation() {
}
#[test]
+fn transport_publish_required_targets_stay_fingerprint_exact() {
+ let manifest_dir = Path::new(env!("CARGO_MANIFEST_DIR"));
+ let daemon_source = read_source(manifest_dir.join("src/core/transport_publish.rs").as_path());
+ let protocol_source = read_source(
+ manifest_dir
+ .join("../lib/crates/transport_publish_protocol/src/lib.rs")
+ .as_path(),
+ );
+
+ for required in [
+ "validate_delivery_policy_for_resolution",
+ "delivery_policy\n .validate_target_membership(target_fingerprints.as_slice())",
+ "fn required_outcomes_for_policy",
+ "target_outcome_fingerprint(outcome, index)",
+ "fingerprint == required",
+ "let required_outcomes = required_outcomes_for_policy(targets, outcomes);",
+ "required_outcomes.len() == targets.len()",
+ ] {
+ assert!(
+ daemon_source.contains(required),
+ "daemon transport publish must retain exact required-target witness `{required}`"
+ );
+ }
+
+ let satisfaction_arm = source_window(
+ daemon_source.as_str(),
+ "TransportPublishDeliveryPolicy::RequiredTargets { targets } => {",
+ "fn delivery_status(",
+ );
+ for required in [
+ "let nostr_required_targets = targets",
+ "target\n .fingerprint()",
+ "filter(|fingerprint| fingerprint == required)",
+ "RadrootsTransportSatisfactionPolicy::required_targets(",
+ ] {
+ assert!(
+ satisfaction_arm.contains(required),
+ "daemon RequiredTargets resolution arm must retain exact fingerprint witness `{required}`"
+ );
+ }
+ for forbidden in [
+ "RadrootsTransportSatisfactionPolicy::all_accepted()",
+ "RadrootsTransportSatisfactionPolicy::any_accepted()",
+ "RadrootsTransportSatisfactionPolicy::quorum_accepted(",
+ ] {
+ assert!(
+ !satisfaction_arm.contains(forbidden),
+ "daemon RequiredTargets resolution arm must not lower to count policy `{forbidden}`"
+ );
+ }
+
+ for required in [
+ "pub fn validate_target_membership",
+ "TransportPublishProtocolError::RequiredTargetNotInTargetSet { index }",
+ "Self::RequiredTargets { targets } => targets.len()",
+ ] {
+ assert!(
+ protocol_source.contains(required),
+ "transport publish protocol must retain exact required-target witness `{required}`"
+ );
+ }
+}
+
+#[test]
fn transport_publish_capabilities_expose_per_transport_readiness() {
let methods_source = read_source(
Path::new(env!("CARGO_MANIFEST_DIR"))