use super::super::capability::{
CapabilityAnnouncement, CapabilityFilter as LegacyFilter, CapabilityScope, GpuVendor,
PreparedScope, ScopeFilter,
};
use super::super::org::OrgId;
use super::super::org_revocation::OrgRevocationState;
use super::capability::{
resolve_candidate_keys, CapabilityFilter, CapabilityFold, CapabilityMembership,
HardwareSummary, VerifiedOwner,
};
#[cfg(any(test, feature = "fixtures"))]
use super::state::FoldError;
#[cfg(any(test, feature = "fixtures"))]
use super::ApplyOutcome;
use super::{EnvelopeMeta, Fold, FoldKind, NodeId, NodeState, SignedAnnouncement};
pub fn translate_filter(legacy: &LegacyFilter) -> CapabilityFilter {
let mut tag_groups_all: Vec<Vec<String>> = Vec::new();
if !legacy.require_models.is_empty() {
tag_groups_all.push(
legacy
.require_models
.iter()
.map(|m| format!("model:{m}"))
.collect(),
);
}
if !legacy.require_tools.is_empty() {
tag_groups_all.push(
legacy
.require_tools
.iter()
.map(|t| format!("tool:{t}"))
.collect(),
);
}
if legacy.require_gpu {
tag_groups_all.push(vec!["gpu:present".to_string()]);
}
if let Some(vendor) = legacy.gpu_vendor {
tag_groups_all.push(vec![format!("gpu:vendor:{}", gpu_vendor_canonical(vendor))]);
}
CapabilityFilter {
class: None,
tags_all: legacy.require_tags.clone(),
tags_any: Vec::new(),
tag_groups_all,
state: None,
region: None,
limit: 0,
}
}
pub fn membership_passes_range_filter(
membership: &CapabilityMembership,
legacy: &LegacyFilter,
) -> bool {
if let Some(min_mem) = legacy.min_memory_gb {
let mem = membership
.hardware
.as_ref()
.and_then(|h| h.memory_gb)
.unwrap_or(0);
if mem < min_mem {
return false;
}
}
if let Some(min_vram) = legacy.min_vram_gb {
let vram = membership
.hardware
.as_ref()
.and_then(|h| h.vram_gb)
.unwrap_or(0);
if vram < min_vram {
return false;
}
}
true
}
pub fn membership_passes_post_filter(
membership: &CapabilityMembership,
legacy: &LegacyFilter,
) -> bool {
if !membership_passes_range_filter(membership, legacy) {
return false;
}
if legacy.require_gpu {
let has_gpu = match &membership.hardware {
Some(h) => h.gpu_count > 0 || h.gpu_vendor.is_some(),
None => false,
};
if !has_gpu {
return false;
}
}
if let Some(want_vendor) = legacy.gpu_vendor {
let got = membership
.hardware
.as_ref()
.and_then(|h| h.gpu_vendor.as_deref())
.unwrap_or("");
if !gpu_vendor_matches(got, want_vendor) {
return false;
}
}
if !legacy.require_models.is_empty() || !legacy.require_tools.is_empty() {
let mut caps = super::super::capability::CapabilitySet::new();
for s in &membership.tags {
if let Ok(tag) = super::super::tag::Tag::parse(s) {
caps.tags.insert(tag);
}
}
if !legacy.require_models.is_empty()
&& !legacy.require_models.iter().any(|m| caps.has_model(m))
{
return false;
}
if !legacy.require_tools.is_empty()
&& !legacy.require_tools.iter().any(|t| caps.has_tool(t))
{
return false;
}
}
true
}
fn gpu_vendor_matches(canonical: &str, want: GpuVendor) -> bool {
matches!(
(canonical, want),
("nvidia", GpuVendor::Nvidia)
| ("amd", GpuVendor::Amd)
| ("intel", GpuVendor::Intel)
| ("apple", GpuVendor::Apple)
| ("qualcomm", GpuVendor::Qualcomm)
| ("unknown", GpuVendor::Unknown)
)
}
fn gpu_vendor_canonical(vendor: GpuVendor) -> &'static str {
match vendor {
GpuVendor::Nvidia => "nvidia",
GpuVendor::Amd => "amd",
GpuVendor::Intel => "intel",
GpuVendor::Apple => "apple",
GpuVendor::Qualcomm => "qualcomm",
GpuVendor::Unknown => "unknown",
}
}
#[cfg(any(test, feature = "fixtures"))]
pub fn apply_legacy_announcement(
fold: &Fold<CapabilityFold>,
ann: CapabilityAnnouncement,
floors: Option<&OrgRevocationState>,
skew_secs: u64,
) -> Result<ApplyOutcome, FoldError> {
let outer_signature_verified = ann.verify().is_ok();
let verified_owner =
verify_announced_owner_cert(&ann, outer_signature_verified, floors, skew_secs);
let fold_ann = translate_announcement(&ann, verified_owner);
fold.apply(fold_ann)
}
pub(crate) fn verify_announced_owner_cert(
ann: &CapabilityAnnouncement,
outer_signature_verified: bool,
floors: Option<&OrgRevocationState>,
skew_secs: u64,
) -> Option<VerifiedOwner> {
let cert = ann.owner_cert.as_ref()?;
if !outer_signature_verified {
tracing::debug!(
node_id = format!("{:#x}", ann.node_id),
org = %cert.org_id,
"dropping owner cert: enclosing announcement is not signature-verified \
(announcement handling unchanged)"
);
return None;
}
if cert.member != ann.entity_id {
tracing::debug!(
node_id = format!("{:#x}", ann.node_id),
org = %cert.org_id,
"dropping owner cert: member does not match announcing entity (announcement kept)"
);
return None;
}
if ann.entity_id.node_id() != ann.node_id {
tracing::debug!(
node_id = format!("{:#x}", ann.node_id),
entity_node_id = format!("{:#x}", ann.entity_id.node_id()),
org = %cert.org_id,
"dropping owner cert: announcing entity does not derive the announced node id \
— an ownership projection under a mismatched node id could never be \
retracted (announcement kept)"
);
return None;
}
if let Err(e) = cert.is_valid_with_skew(skew_secs) {
tracing::debug!(
node_id = format!("{:#x}", ann.node_id),
org = %cert.org_id,
error = %e,
"dropping unverifiable owner cert (announcement kept)"
);
return None;
}
if let Some(floors) = floors {
let floor = floors.floor_for(&cert.org_id, &cert.member);
if cert.generation < floor {
tracing::debug!(
node_id = format!("{:#x}", ann.node_id),
org = %cert.org_id,
generation = cert.generation,
floor,
"dropping owner cert below revocation floor (announcement kept)"
);
return None;
}
}
Some(VerifiedOwner::new(
&cert.member,
cert.org_id,
cert.generation,
))
}
pub(crate) fn recheck_projected_owner_floor(
fold: &Fold<CapabilityFold>,
floors: Option<&OrgRevocationState>,
member: &crate::adapter::net::identity::EntityId,
owner: &VerifiedOwner,
) -> usize {
let Some(floors) = floors else {
return 0;
};
let floor = floors.floor_for(&owner.org(), member);
if owner.generation() < floor {
retract_floored_ownership(fold, owner.org(), member, floor)
} else {
0
}
}
pub fn owner_org_for(fold: &Fold<CapabilityFold>, node_id: NodeId) -> Option<OrgId> {
fold.with_state(|state| {
let keys = state.by_node.get(&node_id)?;
keys.iter().find_map(|key| {
state
.entries
.get(key)
.and_then(|entry| entry.payload.owner.map(|owner| owner.org()))
})
})
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct OwnedPublisher {
pub node_id: NodeId,
pub member: crate::adapter::net::identity::EntityId,
pub owner_org: OrgId,
}
pub fn public_owned_providers(fold: &Fold<CapabilityFold>, tag: &str) -> Vec<OwnedPublisher> {
let legacy = LegacyFilter::default().require_tag(tag.to_string());
let fold_filter = translate_filter(&legacy);
fold.with_state_and_index(|state, index| {
let candidates = resolve_candidate_keys(state, index, &fold_filter);
let candidates = candidates.as_set();
let mut publishers: Vec<NodeId> = candidates.iter().map(|&(_, node)| node).collect();
publishers.sort_unstable();
publishers.dedup();
let mut out: Vec<OwnedPublisher> = Vec::with_capacity(publishers.len());
for node_id in publishers {
let Some(keys) = state.by_node.get(&node_id) else {
continue;
};
let mut agreed: Option<VerifiedOwner> = None;
let mut conflicted = false;
for key in keys {
let Some(entry) = state.entries.get(key) else {
continue;
};
let Some(owner) = entry.payload.owner else {
continue;
};
match agreed {
None => agreed = Some(owner),
Some(seen) => {
if seen.member_bytes() != owner.member_bytes() || seen.org() != owner.org()
{
conflicted = true;
break;
}
}
}
}
if conflicted {
continue;
}
if let Some(owner) = agreed {
out.push(OwnedPublisher {
node_id,
member: owner.member(),
owner_org: owner.org(),
});
}
}
out
})
}
pub fn retract_floored_ownership(
fold: &Fold<CapabilityFold>,
org: OrgId,
member: &crate::adapter::net::identity::EntityId,
floor: u32,
) -> usize {
let node_id = member.node_id();
if fold.with_state(|state| !state.by_node.contains_key(&node_id)) {
return 0;
}
let retracted = fold.with_state_mut(|state| {
let Some(keys) = state.by_node.get(&node_id) else {
return 0;
};
let keys: Vec<_> = keys.iter().copied().collect();
let mut retracted = 0;
for key in keys {
if let Some(entry) = state.entries.get_mut(&key) {
if let Some(owner) = entry.payload.owner {
if owner.org() == org && owner.generation() < floor {
entry.payload.owner = None;
retracted += 1;
}
}
}
}
retracted
});
if retracted > 0 {
fold.notify_projection_retracted(
format!("node:{node_id:#x}"),
format!("ownership retracted under org {org} at floor {floor} ({retracted} entries)"),
);
}
retracted
}
pub fn synthesize_capability_set(
fold: &Fold<CapabilityFold>,
node_id: NodeId,
) -> super::super::capability::CapabilitySet {
synthesize_capability_set_if_known(fold, node_id).unwrap_or_default()
}
pub fn synthesize_capability_set_if_known(
fold: &Fold<CapabilityFold>,
node_id: NodeId,
) -> Option<super::super::capability::CapabilitySet> {
fold.with_state(|state| {
let keys = state.by_node.get(&node_id)?;
let mut caps = super::super::capability::CapabilitySet::new();
for k in keys {
let Some(entry) = state.entries.get(k) else {
continue;
};
for s in &entry.payload.tags {
if let Ok(tag) = super::super::tag::Tag::parse(s) {
caps.tags.insert(tag);
}
}
for (mk, mv) in &entry.payload.metadata {
caps.metadata.insert(mk.clone(), mv.clone());
}
}
Some(caps)
})
}
const CAPABILITY_SET_CACHE_DEFAULT_CAPACITY: usize = 256;
pub struct CapabilitySetCache {
inner: parking_lot::Mutex<lru::LruCache<NodeId, CachedCapabilitySetEntry>>,
}
struct CachedCapabilitySetEntry {
generation: u64,
caps: std::sync::Arc<super::super::capability::CapabilitySet>,
}
impl CapabilitySetCache {
pub fn new() -> Self {
Self::with_capacity(CAPABILITY_SET_CACHE_DEFAULT_CAPACITY)
}
pub fn with_capacity(capacity: usize) -> Self {
let cap =
std::num::NonZeroUsize::new(capacity.max(1)).unwrap_or(std::num::NonZeroUsize::MIN);
Self {
inner: parking_lot::Mutex::new(lru::LruCache::new(cap)),
}
}
pub fn get_or_synthesize(
&self,
fold: &Fold<CapabilityFold>,
node_id: NodeId,
) -> std::sync::Arc<super::super::capability::CapabilitySet> {
let current_gen = fold.change_generation();
{
let mut lru = self.inner.lock();
if let Some(entry) = lru.get(&node_id) {
if entry.generation == current_gen {
return entry.caps.clone();
}
}
}
let caps = std::sync::Arc::new(synthesize_capability_set(fold, node_id));
{
let mut lru = self.inner.lock();
lru.put(
node_id,
CachedCapabilitySetEntry {
generation: current_gen,
caps: caps.clone(),
},
);
}
caps
}
pub fn clear(&self) {
self.inner.lock().clear();
}
pub fn len(&self) -> usize {
self.inner.lock().len()
}
pub fn is_empty(&self) -> bool {
self.inner.lock().is_empty()
}
}
impl Default for CapabilitySetCache {
fn default() -> Self {
Self::new()
}
}
impl std::fmt::Debug for CapabilitySetCache {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
f.debug_struct("CapabilitySetCache")
.field("len", &self.len())
.finish()
}
}
pub fn may_execute(
fold: &Fold<CapabilityFold>,
target_node: NodeId,
capability_tag: &str,
caller_node: NodeId,
) -> bool {
fold.with_state(|state| {
let (caller_subnet, caller_groups) = derive_caller_axes(state, caller_node);
may_execute_with_caller(
state,
target_node,
capability_tag,
caller_node,
caller_subnet.as_ref(),
&caller_groups,
)
})
}
pub fn may_admit(
fold: &Fold<CapabilityFold>,
target_node: NodeId,
capability_tag: &str,
caller_node: NodeId,
) -> bool {
fold.with_state(|state| {
let Some(keys) = state.by_node.get(&target_node) else {
return false;
};
let mut target_carries_tag = false;
let mut allowed_nodes: Vec<u64> = Vec::new();
let mut restricted_by_demoted_axis = false;
for k in keys {
let Some(entry) = state.entries.get(k) else {
continue;
};
if entry.payload.tags.iter().any(|t| t == capability_tag) {
target_carries_tag = true;
}
allowed_nodes.extend(entry.payload.allowed_nodes.iter().copied());
restricted_by_demoted_axis |= !entry.payload.allowed_subnets.is_empty()
|| !entry.payload.allowed_groups.is_empty();
}
if !target_carries_tag {
return false;
}
if allowed_nodes.is_empty() && !restricted_by_demoted_axis {
return true;
}
allowed_nodes.contains(&caller_node)
})
}
pub fn has_local_capability(
fold: &Fold<CapabilityFold>,
target_node: NodeId,
capability_tag: &str,
) -> bool {
fold.with_state(|state| {
let Some(keys) = state.by_node.get(&target_node) else {
return false;
};
keys.iter().any(|k| {
state
.entries
.get(k)
.is_some_and(|entry| entry.payload.tags.iter().any(|t| t == capability_tag))
})
})
}
pub fn may_execute_batch(
fold: &Fold<CapabilityFold>,
targets: &[NodeId],
capability_tag: &str,
caller_node: NodeId,
) -> Vec<bool> {
if targets.is_empty() {
return Vec::new();
}
fold.with_state(|state| {
let (caller_subnet, caller_groups) = derive_caller_axes(state, caller_node);
targets
.iter()
.map(|target_node| {
may_execute_with_caller(
state,
*target_node,
capability_tag,
caller_node,
caller_subnet.as_ref(),
&caller_groups,
)
})
.collect()
})
}
fn derive_caller_axes(
state: &super::state::FoldState<CapabilityFold>,
caller_node: NodeId,
) -> (
Option<super::super::subnet::SubnetId>,
Vec<super::super::group::GroupId>,
) {
let Some(caller_keys) = state.by_node.get(&caller_node) else {
return (None, Vec::new());
};
let mut subnet_candidates: Vec<super::super::subnet::SubnetId> = Vec::new();
let mut caller_groups: Vec<super::super::group::GroupId> = Vec::new();
for k in caller_keys {
let Some(entry) = state.entries.get(k) else {
continue;
};
for raw in &entry.payload.tags {
if let Some(subnet) = super::super::subnet::SubnetId::from_tag(raw) {
if !subnet_candidates.contains(&subnet) {
subnet_candidates.push(subnet);
}
continue;
}
if let Some(group) = super::super::group::GroupId::from_tag(raw) {
if !caller_groups.contains(&group) {
caller_groups.push(group);
}
}
}
}
let caller_subnet = if subnet_candidates.len() == 1 {
Some(subnet_candidates[0])
} else {
None
};
caller_groups.sort_by_key(|g| g.0);
(caller_subnet, caller_groups)
}
fn may_execute_with_caller(
state: &super::state::FoldState<CapabilityFold>,
target_node: NodeId,
capability_tag: &str,
caller_node: NodeId,
caller_subnet: Option<&super::super::subnet::SubnetId>,
caller_groups: &[super::super::group::GroupId],
) -> bool {
let Some(keys) = state.by_node.get(&target_node) else {
return false;
};
let mut target_carries_tag = false;
let mut allowed_nodes: Vec<u64> = Vec::new();
let mut allowed_subnets: Vec<super::super::subnet::SubnetId> = Vec::new();
let mut allowed_groups: Vec<super::super::group::GroupId> = Vec::new();
for k in keys {
let Some(entry) = state.entries.get(k) else {
continue;
};
if entry.payload.tags.iter().any(|t| t == capability_tag) {
target_carries_tag = true;
}
allowed_nodes.extend(entry.payload.allowed_nodes.iter().copied());
allowed_subnets.extend(entry.payload.allowed_subnets.iter().copied());
allowed_groups.extend(entry.payload.allowed_groups.iter().cloned());
}
if !target_carries_tag {
return false;
}
if allowed_nodes.is_empty() && allowed_subnets.is_empty() && allowed_groups.is_empty() {
return true;
}
if allowed_nodes.contains(&caller_node) {
return true;
}
if !allowed_subnets.is_empty() {
if let Some(subnet) = caller_subnet {
if allowed_subnets.contains(subnet) {
return true;
}
}
}
if !allowed_groups.is_empty() {
for g in caller_groups {
if allowed_groups.contains(g) {
return true;
}
}
}
false
}
pub fn translate_announcement(
ann: &CapabilityAnnouncement,
verified_owner: Option<VerifiedOwner>,
) -> SignedAnnouncement<CapabilityMembership> {
let views = ann.capabilities.views();
let hw_view = views.hardware();
let primary_gpu = hw_view.gpu.as_ref();
let gpu_count =
(primary_gpu.is_some() as u8).saturating_add(hw_view.additional_gpus.len() as u8);
let gpu_vendor = primary_gpu.map(|g| gpu_vendor_canonical(g.vendor).to_string());
let vram_gb = {
let mut total: u32 = 0;
if let Some(g) = primary_gpu {
total = total.saturating_add(g.vram_gb);
}
for g in &hw_view.additional_gpus {
total = total.saturating_add(g.vram_gb);
}
(gpu_count > 0).then_some(total)
};
let memory_gb = (hw_view.memory_gb > 0).then_some(hw_view.memory_gb);
let hardware = if primary_gpu.is_some() || memory_gb.is_some() {
Some(HardwareSummary {
gpu_vendor,
gpu_count,
memory_gb,
vram_gb,
})
} else {
None
};
let tags: Vec<String> = ann
.capabilities
.tags
.iter()
.map(|t| t.to_string())
.collect();
let region = tags
.iter()
.find_map(|t| t.strip_prefix("scope:region:").map(String::from));
SignedAnnouncement::placeholder(
CapabilityFold::KIND_ID,
0,
ann.node_id,
ann.version.max(1),
EnvelopeMeta {
announced_at: ann.timestamp_ns / 1_000,
ttl_secs: Some(ann.ttl_secs),
flags: 0,
},
CapabilityMembership {
class_hash: 0,
tags,
hardware,
state: NodeState::Idle,
region,
price_quote: None,
reflex_addr: ann.reflex_addr,
allowed_nodes: ann.allowed_nodes.clone(),
allowed_subnets: ann.allowed_subnets.clone(),
allowed_groups: ann.allowed_groups.clone(),
metadata: ann.capabilities.metadata.clone(),
owner: verified_owner,
},
)
}
pub fn find_nodes_matching(fold: &Fold<CapabilityFold>, legacy: &LegacyFilter) -> Vec<NodeId> {
let fold_filter = translate_filter(legacy);
let range_predicates_present = legacy.min_memory_gb.is_some()
|| legacy.min_vram_gb.is_some()
|| !legacy.require_modalities.is_empty()
|| legacy.min_context_length.is_some();
if fold_filter.is_permissive() && !range_predicates_present {
return fold.with_state(|state| {
let mut ids: Vec<NodeId> = state.by_node.keys().copied().collect();
ids.sort_unstable();
ids
});
}
let mut out: Vec<NodeId> = fold.with_state_and_index(|state, index| {
let candidates = resolve_candidate_keys(state, index, &fold_filter);
let candidates = candidates.as_set();
let mut ids: Vec<NodeId> = Vec::with_capacity(candidates.len());
for &key in candidates {
let Some(entry) = state.entries.get(&key) else {
continue;
};
if membership_passes_range_filter(&entry.payload, legacy) {
ids.push(key.1);
}
}
ids
});
out.sort_unstable();
out.dedup();
out
}
pub fn target_matches_filter(
fold: &Fold<CapabilityFold>,
node_id: NodeId,
legacy: &LegacyFilter,
) -> bool {
fold.with_state(|state| {
let Some(keys) = state.by_node.get(&node_id) else {
return false;
};
for key in keys {
let Some(entry) = state.entries.get(key) else {
continue;
};
let membership = &entry.payload;
let tags_ok = legacy
.require_tags
.iter()
.all(|t| membership.tags.iter().any(|m| m == t));
if !tags_ok {
continue;
}
if !membership_passes_post_filter(membership, legacy) {
continue;
}
return true;
}
false
})
}
#[cfg_attr(not(test), allow(dead_code))]
pub(crate) fn scope_from_membership_tags(tags: &[String]) -> CapabilityScope {
let mut tenants: Vec<String> = Vec::new();
let mut regions: Vec<String> = Vec::new();
let mut subnet_local = false;
for tag in tags {
let Some(body) = tag.strip_prefix("scope:") else {
continue;
};
if body == "subnet-local" {
subnet_local = true;
} else if let Some(id) = body.strip_prefix("tenant:") {
if !id.is_empty() {
tenants.push(id.to_string());
}
} else if let Some(name) = body.strip_prefix("region:") {
if !name.is_empty() {
regions.push(name.to_string());
}
}
}
if subnet_local {
CapabilityScope::SubnetLocal
} else {
match (tenants.is_empty(), regions.is_empty()) {
(true, true) => CapabilityScope::Global,
(false, true) => CapabilityScope::Tenants(tenants),
(true, false) => CapabilityScope::Regions(regions),
(false, false) => CapabilityScope::TenantsAndRegions { tenants, regions },
}
}
}
pub fn filter_by_predicate(
fold: &Fold<CapabilityFold>,
predicate: &super::super::predicate::Predicate,
) -> Vec<(NodeId, super::super::capability::CapabilitySet)> {
let publishers: Vec<NodeId> = fold.with_state(|state| state.by_node.keys().copied().collect());
let mut out = Vec::new();
for node_id in publishers {
let caps = synthesize_capability_set(fold, node_id);
let owned_tags: Vec<super::super::tag::Tag> = caps.tags.iter().cloned().collect();
let ctx = super::super::predicate::EvalContext::new(&owned_tags, &caps.metadata);
if predicate.evaluate_unplanned(&ctx) {
out.push((node_id, caps));
}
}
out
}
pub fn find_nodes_matching_scoped(
fold: &Fold<CapabilityFold>,
legacy: &LegacyFilter,
scope: &ScopeFilter<'_>,
same_subnet_lookup: impl Fn(NodeId, &[String]) -> bool,
) -> Vec<NodeId> {
let fold_filter = translate_filter(legacy);
let subnet_decides = matches!(scope, ScopeFilter::SameSubnet);
let prepared = PreparedScope::new(scope);
let mut out: Vec<NodeId> = fold.with_state_and_index(|state, index| {
let candidates = resolve_candidate_keys(state, index, &fold_filter);
let candidates = candidates.as_set();
let mut acc: Vec<NodeId> = Vec::with_capacity(candidates.len());
for &key in candidates {
let Some(entry) = state.entries.get(&key) else {
continue;
};
let membership = &entry.payload;
if !membership_passes_range_filter(membership, legacy) {
continue;
}
let admitted = if subnet_decides {
same_subnet_lookup(key.1, &membership.tags)
} else {
prepared.matches(&membership.tags, false)
};
if admitted {
acc.push(key.1);
}
}
acc
});
out.sort_unstable();
out.dedup();
out
}
#[cfg(test)]
mod tests {
use super::*;
use crate::adapter::net::behavior::fold::{
EnvelopeMeta, FoldKind, NodeState, SignedAnnouncement,
};
use crate::adapter::net::identity::EntityKeypair;
use std::collections::HashSet;
use std::time::Duration;
fn sign_member(
kp: &EntityKeypair,
node_id: NodeId,
class: u64,
tags: Vec<&str>,
hardware: Option<super::super::capability::HardwareSummary>,
) -> SignedAnnouncement<CapabilityMembership> {
SignedAnnouncement::sign(
kp,
super::super::capability::CapabilityFold::KIND_ID,
class,
node_id,
1,
EnvelopeMeta::default(),
CapabilityMembership {
class_hash: class,
tags: tags.into_iter().map(String::from).collect(),
hardware,
state: NodeState::Idle,
region: None,
price_quote: None,
reflex_addr: None,
allowed_nodes: Vec::new(),
allowed_subnets: Vec::new(),
allowed_groups: Vec::new(),
metadata: std::collections::BTreeMap::new(),
owner: None,
},
)
.expect("sign")
}
fn new_fold() -> Fold<CapabilityFold> {
Fold::with_sweep_interval(Duration::ZERO)
}
fn sign_member_owned(
kp: &EntityKeypair,
node_id: NodeId,
class: u64,
version: u64,
tags: Vec<&str>,
owner: Option<VerifiedOwner>,
) -> SignedAnnouncement<CapabilityMembership> {
SignedAnnouncement::sign(
kp,
super::super::capability::CapabilityFold::KIND_ID,
class,
node_id,
version,
EnvelopeMeta::default(),
CapabilityMembership {
class_hash: class,
tags: tags.into_iter().map(String::from).collect(),
hardware: None,
state: NodeState::Idle,
region: None,
price_quote: None,
reflex_addr: None,
allowed_nodes: Vec::new(),
allowed_subnets: Vec::new(),
allowed_groups: Vec::new(),
metadata: std::collections::BTreeMap::new(),
owner,
},
)
.expect("sign")
}
const EXPORTED_TAG: &str = "nrpc:fleet.telemetry";
fn owned(kp: &EntityKeypair, org: OrgId, generation: u32) -> Option<VerifiedOwner> {
Some(VerifiedOwner::new(kp.entity_id(), org, generation))
}
fn one(node_id: NodeId, kp: &EntityKeypair, owner_org: OrgId) -> Vec<OwnedPublisher> {
vec![OwnedPublisher {
node_id,
member: kp.entity_id().clone(),
owner_org,
}]
}
#[test]
fn public_owned_providers_exclude_unowned_candidates() {
let fold = new_fold();
let owned_kp = EntityKeypair::generate();
let plain_kp = EntityKeypair::generate();
let org = crate::adapter::net::behavior::org::OrgKeypair::generate().org_id();
fold.apply(sign_member_owned(
&owned_kp,
0xA1,
1,
1,
vec![EXPORTED_TAG],
owned(&owned_kp, org, 1),
))
.expect("apply owned");
fold.apply(sign_member_owned(
&plain_kp,
0xB2,
1,
1,
vec![EXPORTED_TAG],
None,
))
.expect("apply unowned");
assert_eq!(
public_owned_providers(&fold, EXPORTED_TAG),
one(0xA1, &owned_kp, org),
"only the owned candidate is eligible, with its verified publisher",
);
let legacy = LegacyFilter::default().require_tag(EXPORTED_TAG.to_string());
assert_eq!(find_nodes_matching(&fold, &legacy), vec![0xA1, 0xB2]);
}
#[test]
fn public_owned_providers_see_floor_retraction_atomically() {
let fold = new_fold();
let member = EntityKeypair::generate();
let node_id = member.entity_id().node_id();
let org = crate::adapter::net::behavior::org::OrgKeypair::generate().org_id();
fold.apply(sign_member_owned(
&member,
node_id,
1,
1,
vec![EXPORTED_TAG],
owned(&member, org, 1),
))
.expect("apply");
assert_eq!(
public_owned_providers(&fold, EXPORTED_TAG),
one(node_id, &member, org),
);
let retracted = retract_floored_ownership(&fold, org, member.entity_id(), 2);
assert_eq!(retracted, 1, "generation 1 sits below floor 2");
assert!(
public_owned_providers(&fold, EXPORTED_TAG).is_empty(),
"a retracted projection must remove the triple, not orphan it",
);
let legacy = LegacyFilter::default().require_tag(EXPORTED_TAG.to_string());
assert_eq!(
find_nodes_matching(&fold, &legacy),
vec![node_id],
"retraction clears ONLY the owner field; the entry stays discoverable",
);
}
#[test]
fn public_owned_providers_see_announcement_replacement_atomically() {
let fold = new_fold();
let kp = EntityKeypair::generate();
let org = crate::adapter::net::behavior::org::OrgKeypair::generate().org_id();
fold.apply(sign_member_owned(
&kp,
0xC3,
1,
1,
vec![EXPORTED_TAG],
owned(&kp, org, 1),
))
.expect("apply v1");
assert_eq!(
public_owned_providers(&fold, EXPORTED_TAG),
one(0xC3, &kp, org),
);
fold.apply(sign_member_owned(&kp, 0xC3, 1, 2, vec![EXPORTED_TAG], None))
.expect("apply v2");
assert!(
public_owned_providers(&fold, EXPORTED_TAG).is_empty(),
"a replacement without an owner cert must remove the triple",
);
}
#[test]
fn public_owned_providers_exclude_conflicting_projections() {
let fold = new_fold();
let kp = EntityKeypair::generate();
let org_x = crate::adapter::net::behavior::org::OrgKeypair::generate().org_id();
let org_y = crate::adapter::net::behavior::org::OrgKeypair::generate().org_id();
fold.apply(sign_member_owned(
&kp,
0xD4,
1,
1,
vec![EXPORTED_TAG],
owned(&kp, org_x, 1),
))
.expect("apply class 1");
fold.apply(sign_member_owned(
&kp,
0xD4,
2,
1,
vec![EXPORTED_TAG],
owned(&kp, org_y, 1),
))
.expect("apply class 2");
assert!(
public_owned_providers(&fold, EXPORTED_TAG).is_empty(),
"conflicting projections exclude the publisher entirely",
);
}
#[test]
fn public_owned_providers_exclude_conflicts_outside_the_requested_tag() {
let fold = new_fold();
let kp = EntityKeypair::generate();
let org_x = crate::adapter::net::behavior::org::OrgKeypair::generate().org_id();
let org_y = crate::adapter::net::behavior::org::OrgKeypair::generate().org_id();
fold.apply(sign_member_owned(
&kp,
0xE5,
1,
1,
vec![EXPORTED_TAG],
owned(&kp, org_x, 1),
))
.expect("apply tagged class");
fold.apply(sign_member_owned(
&kp,
0xE5,
2,
1,
vec!["nrpc:unrelated.service"],
owned(&kp, org_y, 1),
))
.expect("apply untagged class");
assert!(
public_owned_providers(&fold, EXPORTED_TAG).is_empty(),
"an owner conflict OUTSIDE the requested tag must still exclude the publisher",
);
let legacy = LegacyFilter::default().require_tag(EXPORTED_TAG.to_string());
assert_eq!(find_nodes_matching(&fold, &legacy), vec![0xE5]);
}
#[test]
fn public_owned_providers_tolerate_an_unowned_sibling_class() {
let fold = new_fold();
let kp = EntityKeypair::generate();
let org = crate::adapter::net::behavior::org::OrgKeypair::generate().org_id();
fold.apply(sign_member_owned(
&kp,
0xF6,
1,
1,
vec![EXPORTED_TAG],
owned(&kp, org, 1),
))
.expect("apply owned class");
fold.apply(sign_member_owned(
&kp,
0xF6,
2,
1,
vec!["nrpc:unrelated.service"],
None,
))
.expect("apply unowned class");
assert_eq!(
public_owned_providers(&fold, EXPORTED_TAG),
one(0xF6, &kp, org),
"an unowned sibling class must not exclude an unambiguously owned publisher",
);
}
#[test]
fn public_owned_providers_name_the_verified_publisher_not_the_node() {
let fold = new_fold();
let entity_a = EntityKeypair::generate();
let entity_b = EntityKeypair::generate();
assert_ne!(entity_a.entity_id(), entity_b.entity_id());
let org = crate::adapter::net::behavior::org::OrgKeypair::generate().org_id();
const SHARED_NODE: NodeId = 0xAB;
fold.apply(sign_member_owned(
&entity_a,
SHARED_NODE,
1,
1,
vec![EXPORTED_TAG],
owned(&entity_a, org, 1),
))
.expect("apply A");
let found = public_owned_providers(&fold, EXPORTED_TAG);
assert_eq!(found.len(), 1);
assert_eq!(
&found[0].member,
entity_a.entity_id(),
"the projection must name the entity whose cert verified",
);
assert_ne!(
&found[0].member,
entity_b.entity_id(),
"a different entity holding the same node id is not this publisher",
);
assert_eq!(found[0].node_id, SHARED_NODE);
}
#[test]
fn translate_filter_passes_require_tags_through_and_groups_models_tools_gpu() {
let legacy = LegacyFilter {
require_tags: vec!["gpu".into()],
require_models: vec!["llama3".into(), "mistral".into()],
require_tools: vec!["ffmpeg".into()],
require_gpu: true,
gpu_vendor: Some(GpuVendor::Nvidia),
..LegacyFilter::default()
};
let fold_filter = translate_filter(&legacy);
assert_eq!(fold_filter.tags_all, vec!["gpu".to_string()]);
assert_eq!(
fold_filter.tag_groups_all,
vec![
vec!["model:llama3".to_string(), "model:mistral".to_string()],
vec!["tool:ffmpeg".to_string()],
vec!["gpu:present".to_string()],
vec!["gpu:vendor:nvidia".to_string()],
]
);
}
#[test]
fn synthetic_index_tags_are_queryable_but_never_leak_into_enumeration() {
let fold = new_fold();
let kp = EntityKeypair::generate();
let hw = HardwareSummary {
gpu_vendor: Some("nvidia".into()),
gpu_count: 1,
memory_gb: Some(64),
vram_gb: Some(24),
};
fold.apply(sign_member(
&kp,
0xAA,
0x100,
vec![
"gpu",
"software.model.0.id=llama3",
"software.tool.0.tool_id=ffmpeg",
],
Some(hw),
))
.expect("apply AA");
let tags = super::super::capability::capability_tags_for(&fold, 0xAA);
assert!(tags.contains(&"gpu".to_string()));
assert!(tags.contains(&"software.model.0.id=llama3".to_string()));
assert!(
!tags.iter().any(|t| t.starts_with("model:")
|| t.starts_with("tool:")
|| t.starts_with("gpu:")),
"synthetic index tags leaked into enumeration: {tags:?}"
);
let by_model = find_nodes_matching(
&fold,
&LegacyFilter {
require_models: vec!["llama3".into()],
..LegacyFilter::default()
},
);
assert_eq!(by_model, vec![0xAA]);
let by_tool_and_gpu = find_nodes_matching(
&fold,
&LegacyFilter {
require_tools: vec!["ffmpeg".into()],
require_gpu: true,
gpu_vendor: Some(GpuVendor::Nvidia),
..LegacyFilter::default()
},
);
assert_eq!(by_tool_and_gpu, vec![0xAA]);
}
#[test]
fn membership_passes_post_filter_matches_models_via_canonical_tag_bundle() {
let legacy = LegacyFilter {
require_models: vec!["llama3".into()],
..LegacyFilter::default()
};
let pass = CapabilityMembership {
class_hash: 0x100,
tags: vec!["software.model.0.id=llama3".into()],
hardware: None,
state: NodeState::Idle,
region: None,
price_quote: None,
reflex_addr: None,
allowed_nodes: Vec::new(),
allowed_subnets: Vec::new(),
allowed_groups: Vec::new(),
metadata: std::collections::BTreeMap::new(),
owner: None,
};
assert!(membership_passes_post_filter(&pass, &legacy));
let fail = CapabilityMembership {
tags: vec!["software.model.0.id=mistral".into()],
..pass.clone()
};
assert!(!membership_passes_post_filter(&fail, &legacy));
let bare = CapabilityMembership {
tags: vec![],
..pass
};
assert!(!membership_passes_post_filter(&bare, &legacy));
}
#[test]
fn membership_passes_post_filter_enforces_min_memory_and_gpu() {
let legacy = LegacyFilter {
min_memory_gb: Some(64),
require_gpu: true,
..LegacyFilter::default()
};
let ok = CapabilityMembership {
class_hash: 0x100,
tags: vec![],
hardware: Some(super::super::capability::HardwareSummary {
gpu_vendor: Some("nvidia".into()),
gpu_count: 2,
memory_gb: Some(128),
vram_gb: Some(80),
}),
state: NodeState::Idle,
region: None,
price_quote: None,
reflex_addr: None,
allowed_nodes: Vec::new(),
allowed_subnets: Vec::new(),
allowed_groups: Vec::new(),
metadata: std::collections::BTreeMap::new(),
owner: None,
};
assert!(membership_passes_post_filter(&ok, &legacy));
let low_mem = CapabilityMembership {
hardware: Some(super::super::capability::HardwareSummary {
gpu_vendor: Some("nvidia".into()),
gpu_count: 2,
memory_gb: Some(32),
vram_gb: Some(80),
}),
..ok.clone()
};
assert!(!membership_passes_post_filter(&low_mem, &legacy));
let no_hw = CapabilityMembership {
hardware: None,
..ok
};
assert!(!membership_passes_post_filter(&no_hw, &legacy));
}
#[test]
fn find_nodes_matching_dedupes_publisher_across_classes() {
let fold = new_fold();
let kp = EntityKeypair::generate();
fold.apply(sign_member(&kp, 0xAA, 0x100, vec!["gpu"], None))
.expect("apply 0x100");
fold.apply(sign_member(&kp, 0xAA, 0x101, vec!["gpu"], None))
.expect("apply 0x101");
let mut legacy = LegacyFilter::default();
legacy.require_tags.push("gpu".into());
let nodes = find_nodes_matching(&fold, &legacy);
assert_eq!(nodes, vec![0xAA]);
}
#[test]
fn find_nodes_matching_range_only_filter_skips_permissive_fast_path() {
let fold = new_fold();
let kp = EntityKeypair::generate();
let big = HardwareSummary {
gpu_vendor: None,
gpu_count: 0,
memory_gb: Some(128),
vram_gb: None,
};
fold.apply(sign_member(&kp, 0xA1, 0x100, vec!["gpu"], Some(big)))
.expect("apply big");
fold.apply(sign_member(&kp, 0xA2, 0x100, vec!["gpu"], None))
.expect("apply no-hw");
let range_only = LegacyFilter {
min_memory_gb: Some(64),
..LegacyFilter::default()
};
assert!(translate_filter(&range_only).is_permissive());
let nodes = find_nodes_matching(&fold, &range_only);
assert_eq!(nodes, vec![0xA1]);
let all = find_nodes_matching(&fold, &LegacyFilter::default());
assert_eq!(all, vec![0xA1, 0xA2]);
}
#[test]
fn target_matches_filter_agrees_with_find_nodes_matching() {
let fold = new_fold();
let kp = EntityKeypair::generate();
let nvidia_hw = HardwareSummary {
gpu_vendor: Some("nvidia".into()),
gpu_count: 2,
memory_gb: Some(128),
vram_gb: Some(80),
};
fold.apply(sign_member(
&kp,
0xAA,
0x100,
vec![
"gpu",
"cuda",
"software.model.0.id=llama3",
"software.tool.0.tool_id=ffmpeg",
],
Some(nvidia_hw),
))
.expect("apply AA");
fold.apply(sign_member(&kp, 0xBB, 0x100, vec!["cpu-only"], None))
.expect("apply BB");
fold.apply(sign_member(
&kp,
0xCC,
0x100,
vec![
"model:llama3",
"tool:ffmpeg",
"gpu:present",
"gpu:vendor:nvidia",
],
None,
))
.expect("apply CC");
let probe = |legacy: &LegacyFilter, candidates: &[NodeId]| {
let bulk: HashSet<NodeId> = find_nodes_matching(&fold, legacy).into_iter().collect();
for &n in candidates {
assert_eq!(
bulk.contains(&n),
target_matches_filter(&fold, n, legacy),
"node 0x{:x} verdict mismatch for filter {:?}",
n,
legacy
);
}
};
probe(&LegacyFilter::default(), &[0xAA, 0xBB, 0xCC]);
let mut f = LegacyFilter::default();
f.require_tags.push("gpu".into());
probe(&f, &[0xAA, 0xBB, 0xCC]);
let model_hit = LegacyFilter {
require_models: vec!["llama3".into()],
..LegacyFilter::default()
};
probe(&model_hit, &[0xAA, 0xBB, 0xCC]);
let model_miss = LegacyFilter {
require_models: vec!["does-not-exist".into()],
..LegacyFilter::default()
};
probe(&model_miss, &[0xAA, 0xBB, 0xCC]);
let tool_hit = LegacyFilter {
require_tools: vec!["ffmpeg".into()],
..LegacyFilter::default()
};
probe(&tool_hit, &[0xAA, 0xBB, 0xCC]);
let gpu = LegacyFilter {
require_gpu: true,
..LegacyFilter::default()
};
probe(&gpu, &[0xAA, 0xBB, 0xCC]);
let vendor_hit = LegacyFilter {
gpu_vendor: Some(GpuVendor::Nvidia),
..LegacyFilter::default()
};
probe(&vendor_hit, &[0xAA, 0xBB, 0xCC]);
let vendor_miss = LegacyFilter {
gpu_vendor: Some(GpuVendor::Amd),
..LegacyFilter::default()
};
probe(&vendor_miss, &[0xAA, 0xBB]);
assert!(!target_matches_filter(
&fold,
0xDEAD,
&LegacyFilter::default()
));
}
#[test]
fn raw_tags_cannot_spoof_the_synthetic_model_tool_gpu_namespace() {
let fold = new_fold();
let kp = EntityKeypair::generate();
let nvidia_hw = HardwareSummary {
gpu_vendor: Some("nvidia".into()),
gpu_count: 1,
memory_gb: Some(64),
vram_gb: Some(24),
};
fold.apply(sign_member(
&kp,
0xAA,
0x100,
vec![
"software.model.0.id=llama3",
"software.tool.0.tool_id=ffmpeg",
],
Some(nvidia_hw),
))
.expect("apply AA");
fold.apply(sign_member(
&kp,
0xBB,
0x100,
vec![
"model:llama3",
"tool:ffmpeg",
"gpu:present",
"gpu:vendor:nvidia",
],
None,
))
.expect("apply BB");
let model = find_nodes_matching(
&fold,
&LegacyFilter {
require_models: vec!["llama3".into()],
..LegacyFilter::default()
},
);
assert_eq!(model, vec![0xAA]);
let tool = find_nodes_matching(
&fold,
&LegacyFilter {
require_tools: vec!["ffmpeg".into()],
..LegacyFilter::default()
},
);
assert_eq!(tool, vec![0xAA]);
let gpu = find_nodes_matching(
&fold,
&LegacyFilter {
require_gpu: true,
..LegacyFilter::default()
},
);
assert_eq!(gpu, vec![0xAA]);
let vendor = find_nodes_matching(
&fold,
&LegacyFilter {
gpu_vendor: Some(GpuVendor::Nvidia),
..LegacyFilter::default()
},
);
assert_eq!(vendor, vec![0xAA]);
for legacy in [
LegacyFilter {
require_models: vec!["llama3".into()],
..LegacyFilter::default()
},
LegacyFilter {
require_tools: vec!["ffmpeg".into()],
..LegacyFilter::default()
},
LegacyFilter {
require_gpu: true,
..LegacyFilter::default()
},
LegacyFilter {
gpu_vendor: Some(GpuVendor::Nvidia),
..LegacyFilter::default()
},
] {
assert!(
!target_matches_filter(&fold, 0xBB, &legacy),
"spoofer unexpectedly matched single-target path for {legacy:?}"
);
}
}
#[test]
fn target_matches_filter_applies_post_filter_predicates() {
let fold = new_fold();
let kp = EntityKeypair::generate();
let hw = HardwareSummary {
gpu_vendor: None,
gpu_count: 0,
memory_gb: Some(32),
vram_gb: None,
};
fold.apply(sign_member(&kp, 0xAA, 0x100, vec!["gpu"], Some(hw)))
.expect("apply AA");
let mut tight = LegacyFilter::default();
tight.require_tags.push("gpu".into());
tight.min_memory_gb = Some(64);
assert!(!target_matches_filter(&fold, 0xAA, &tight));
let mut loose = LegacyFilter::default();
loose.require_tags.push("gpu".into());
loose.min_memory_gb = Some(16);
assert!(target_matches_filter(&fold, 0xAA, &loose));
}
#[test]
fn scope_from_membership_tags_parses_canonical_strings() {
let global = scope_from_membership_tags(&["gpu".into(), "scope:global".into()]);
assert!(matches!(global, CapabilityScope::Global));
let subnet_local = scope_from_membership_tags(&["scope:subnet-local".into(), "gpu".into()]);
assert!(matches!(subnet_local, CapabilityScope::SubnetLocal));
let tenant = scope_from_membership_tags(&["scope:tenant:acme".into()]);
match tenant {
CapabilityScope::Tenants(ts) => assert_eq!(ts, vec!["acme".to_string()]),
other => panic!("expected Tenants, got {other:?}"),
}
let region = scope_from_membership_tags(&["scope:region:us-east".into()]);
match region {
CapabilityScope::Regions(rs) => assert_eq!(rs, vec!["us-east".to_string()]),
other => panic!("expected Regions, got {other:?}"),
}
}
#[test]
fn translate_announcement_projects_legacy_hardware_into_summary() {
use crate::adapter::net::behavior::capability::{
CapabilityAnnouncement, CapabilitySet, GpuInfo, GpuVendor as LegacyGpuVendor,
HardwareCapabilities,
};
use crate::adapter::net::identity::EntityId;
let caps = CapabilitySet::new().with_hardware(
HardwareCapabilities::new()
.with_memory(128)
.with_gpu(GpuInfo {
vendor: LegacyGpuVendor::Nvidia,
model: "h100".into(),
vram_gb: 80,
compute_units: 0,
tensor_cores: 0,
fp16_tflops_x10: 0,
}),
);
let ann = CapabilityAnnouncement::new(0xAA, EntityId::from_bytes([0u8; 32]), 7, caps);
let translated = translate_announcement(&ann, None);
assert_eq!(translated.node_id, 0xAA);
assert_eq!(translated.generation, 7);
let hw = translated.payload.hardware.expect("hardware summary set");
assert_eq!(hw.memory_gb, Some(128));
assert_eq!(hw.gpu_count, 1);
assert_eq!(hw.gpu_vendor.as_deref(), Some("nvidia"));
assert_eq!(hw.vram_gb, Some(80));
}
#[test]
fn translate_announcement_promotes_version_zero_to_generation_one() {
use crate::adapter::net::behavior::capability::{CapabilityAnnouncement, CapabilitySet};
use crate::adapter::net::identity::EntityId;
let ann = CapabilityAnnouncement::new(
0xAA,
EntityId::from_bytes([0u8; 32]),
0,
CapabilitySet::new(),
);
let translated = translate_announcement(&ann, None);
assert_eq!(translated.generation, 1);
}
#[test]
fn find_nodes_matching_scoped_excludes_subnet_local_non_same_subnet() {
let fold = new_fold();
let kp = EntityKeypair::generate();
fold.apply(sign_member(
&kp,
0xAA,
0x100,
vec!["gpu", "scope:subnet-local"],
None,
))
.expect("apply AA subnet-local");
fold.apply(sign_member(&kp, 0xBB, 0x100, vec!["gpu"], None))
.expect("apply BB global");
let mut legacy = LegacyFilter::default();
legacy.require_tags.push("gpu".into());
let lookup = |nid: NodeId, _tags: &[String]| nid == 0xBB;
let mut nodes =
find_nodes_matching_scoped(&fold, &legacy, &ScopeFilter::SameSubnet, lookup);
nodes.sort();
assert_eq!(nodes, vec![0xBB]);
}
#[test]
fn scoped_subnet_lookup_sees_the_selected_entry_tags() {
let fold = new_fold();
let kp = EntityKeypair::generate();
fold.apply(sign_member(
&kp,
0xCC,
0x100,
vec!["gpu", "region:eu"],
None,
))
.expect("apply CC");
let mut legacy = LegacyFilter::default();
legacy.require_tags.push("gpu".into());
let seen = std::cell::RefCell::new(Vec::new());
let nodes =
find_nodes_matching_scoped(&fold, &legacy, &ScopeFilter::SameSubnet, |nid, tags| {
seen.borrow_mut().push((nid, tags.to_vec()));
tags.iter().any(|t| t == "region:eu")
});
assert_eq!(nodes, vec![0xCC]);
let seen = seen.into_inner();
assert_eq!(seen.len(), 1, "closure must run once per candidate");
assert_eq!(seen[0].0, 0xCC);
assert!(
seen[0].1.iter().any(|t| t == "region:eu"),
"closure must receive the selected entry's tags; got {:?}",
seen[0].1
);
}
#[test]
fn capability_set_cache_returns_same_arc_on_hit() {
let fold = new_fold();
let kp = EntityKeypair::generate();
fold.apply(sign_member(&kp, 0xAB, 0x100, vec!["gpu"], None))
.expect("apply AB");
let cache = CapabilitySetCache::new();
let first = cache.get_or_synthesize(&fold, 0xAB);
let second = cache.get_or_synthesize(&fold, 0xAB);
assert!(
std::sync::Arc::ptr_eq(&first, &second),
"cache hit must return the same Arc instance"
);
assert!(
first.tags.iter().any(|t| t.to_string() == "gpu"),
"synthesized capability set should contain the published `gpu` tag: {:?}",
first.tags
);
}
#[test]
fn capability_set_cache_invalidates_on_fold_change() {
let fold = new_fold();
let kp = EntityKeypair::generate();
fold.apply(sign_member(&kp, 0xCD, 0x100, vec!["gpu"], None))
.expect("apply CD v1");
let cache = CapabilitySetCache::new();
let v1 = cache.get_or_synthesize(&fold, 0xCD);
let v1_tag_count = v1.tags.len();
let v2_ann = SignedAnnouncement::sign(
&kp,
super::super::capability::CapabilityFold::KIND_ID,
0x100,
0xCD,
2,
EnvelopeMeta::default(),
CapabilityMembership {
class_hash: 0x100,
tags: vec!["gpu".into(), "cuda".into(), "fp16".into()],
hardware: None,
state: NodeState::Idle,
region: None,
price_quote: None,
reflex_addr: None,
allowed_nodes: Vec::new(),
allowed_subnets: Vec::new(),
allowed_groups: Vec::new(),
metadata: std::collections::BTreeMap::new(),
owner: None,
},
)
.expect("sign v2");
fold.apply(v2_ann).expect("apply CD v2");
let v2 = cache.get_or_synthesize(&fold, 0xCD);
assert!(
!std::sync::Arc::ptr_eq(&v1, &v2),
"fold change must invalidate the cached entry"
);
assert!(
v2.tags.len() > v1_tag_count,
"post-mutation cache miss must reflect the new tag set"
);
}
#[test]
fn capability_set_cache_populates_for_unknown_node() {
let fold = new_fold();
let cache = CapabilitySetCache::new();
let first = cache.get_or_synthesize(&fold, 0xDEAD_BEEF);
assert!(first.tags.is_empty());
assert!(first.metadata.is_empty());
let second = cache.get_or_synthesize(&fold, 0xDEAD_BEEF);
assert!(
std::sync::Arc::ptr_eq(&first, &second),
"unknown-node entries still hit the cache on repeat access"
);
}
#[test]
fn synthesize_if_known_distinguishes_unknown_from_empty() {
let fold = new_fold();
let kp = EntityKeypair::generate();
fold.apply(sign_member(&kp, 0xB1, 0x100, vec!["gpu"], None))
.expect("apply tagged");
fold.apply(sign_member(&kp, 0xB2, 0x100, vec![], None))
.expect("apply untagged");
assert!(synthesize_capability_set_if_known(&fold, 0xDEAD).is_none());
let tagged =
synthesize_capability_set_if_known(&fold, 0xB1).expect("tagged publisher is known");
assert!(tagged.tags.iter().any(|t| t.to_string() == "gpu"));
let untagged = synthesize_capability_set_if_known(&fold, 0xB2)
.expect("untagged publisher is still known");
assert!(untagged.tags.is_empty());
assert!(synthesize_capability_set(&fold, 0xDEAD).tags.is_empty());
}
#[test]
fn capability_set_cache_invalidates_on_node_eviction() {
let fold = new_fold();
let kp = EntityKeypair::generate();
fold.apply(sign_member(&kp, 0xEE, 0x100, vec!["gpu"], None))
.expect("apply EE");
let cache = CapabilitySetCache::new();
let live = cache.get_or_synthesize(&fold, 0xEE);
assert!(
live.tags.iter().any(|t| t.to_string() == "gpu"),
"pre-eviction lookup should see the published tag"
);
fold.evict_node(0xEE, "swim-dead");
let after = cache.get_or_synthesize(&fold, 0xEE);
assert!(
!std::sync::Arc::ptr_eq(&live, &after),
"eviction must invalidate the cached entry"
);
assert!(
after.tags.is_empty(),
"post-eviction set must be empty, not the dead node's cached tags: {:?}",
after.tags
);
}
#[test]
fn may_execute_batch_matches_per_target_may_execute() {
let fold = new_fold();
let kp = EntityKeypair::generate();
let caller: NodeId = 0xCA;
let permissive: NodeId = 0xAA;
let restricted: NodeId = 0xBB;
let no_tag: NodeId = 0xCC;
fold.apply(sign_member(&kp, permissive, 0x100, vec!["nrpc:echo"], None))
.expect("permissive");
let restricted_ann = SignedAnnouncement::sign(
&kp,
super::super::capability::CapabilityFold::KIND_ID,
0x100,
restricted,
1,
EnvelopeMeta::default(),
CapabilityMembership {
class_hash: 0x100,
tags: vec!["nrpc:echo".into()],
hardware: None,
state: NodeState::Idle,
region: None,
price_quote: None,
reflex_addr: None,
allowed_nodes: vec![caller],
allowed_subnets: Vec::new(),
allowed_groups: Vec::new(),
metadata: std::collections::BTreeMap::new(),
owner: None,
},
)
.expect("sign restricted");
fold.apply(restricted_ann).expect("restricted apply");
fold.apply(sign_member(&kp, no_tag, 0x100, vec!["gpu"], None))
.expect("no-tag apply");
fold.apply(sign_member(&kp, caller, 0x100, vec!["scope:user"], None))
.expect("caller apply");
let targets = vec![permissive, restricted, no_tag, 0xDEAD ];
let tag = "nrpc:echo";
let batch = may_execute_batch(&fold, &targets, tag, caller);
let per_target: Vec<bool> = targets
.iter()
.map(|t| may_execute(&fold, *t, tag, caller))
.collect();
assert_eq!(
batch, per_target,
"batched verdicts must equal per-target verdicts"
);
assert_eq!(
batch,
vec![true, true, false, false],
"permissive admits, restricted admits caller via node axis, \
no-tag denies, unknown denies"
);
}
#[test]
fn has_local_capability_ignores_allow_lists() {
let fold = new_fold();
let kp = EntityKeypair::generate();
let restricted: NodeId = 0xBB;
let no_tag: NodeId = 0xCC;
let outsider: NodeId = 0xDD;
let restricted_ann = SignedAnnouncement::sign(
&kp,
super::super::capability::CapabilityFold::KIND_ID,
0x100,
restricted,
1,
EnvelopeMeta::default(),
CapabilityMembership {
class_hash: 0x100,
tags: vec!["nrpc:echo".into()],
hardware: None,
state: NodeState::Idle,
region: None,
price_quote: None,
reflex_addr: None,
allowed_nodes: vec![0x1234], allowed_subnets: Vec::new(),
allowed_groups: Vec::new(),
metadata: std::collections::BTreeMap::new(),
owner: None,
},
)
.expect("sign restricted");
fold.apply(restricted_ann).expect("apply restricted");
fold.apply(sign_member(&kp, no_tag, 0x100, vec!["gpu"], None))
.expect("apply no-tag");
assert!(!may_execute(&fold, restricted, "nrpc:echo", outsider));
assert!(has_local_capability(&fold, restricted, "nrpc:echo"));
assert!(!has_local_capability(&fold, no_tag, "nrpc:echo"));
assert!(!has_local_capability(&fold, restricted, "nrpc:other"));
assert!(!has_local_capability(&fold, 0xDEAD, "nrpc:echo"));
}
#[test]
fn may_execute_batch_empty_targets_returns_empty() {
let fold = new_fold();
let got = may_execute_batch(&fold, &[], "nrpc:noop", 0xCA);
assert!(got.is_empty());
}
#[test]
fn may_execute_batch_derives_caller_subnet_and_groups_once() {
let fold = new_fold();
let kp = EntityKeypair::generate();
let caller: NodeId = 0xCA;
let by_subnet: NodeId = 0xA1;
let by_group: NodeId = 0xA2;
let foreign: NodeId = 0xA3;
let caller_subnet =
super::super::super::subnet::SubnetId::from_tag(&format!("subnet:{}", "11".repeat(16)))
.expect("parse caller subnet tag");
let other_subnet =
super::super::super::subnet::SubnetId::from_tag(&format!("subnet:{}", "22".repeat(16)))
.expect("parse other subnet tag");
let caller_group =
super::super::super::group::GroupId::from_tag(&format!("group:{}", "33".repeat(32)))
.expect("parse caller group tag");
let caller_subnet_tag = caller_subnet.to_tag();
let caller_group_tag = caller_group.to_tag();
fold.apply(sign_member(
&kp,
caller,
0x100,
vec![
"scope:user",
caller_subnet_tag.as_str(),
caller_group_tag.as_str(),
],
None,
))
.expect("caller apply");
let restricted =
|node: NodeId,
subnets: Vec<super::super::super::subnet::SubnetId>,
groups: Vec<super::super::super::group::GroupId>| {
SignedAnnouncement::sign(
&kp,
super::super::capability::CapabilityFold::KIND_ID,
0x100,
node,
1,
EnvelopeMeta::default(),
CapabilityMembership {
class_hash: 0x100,
tags: vec!["nrpc:echo".into()],
hardware: None,
state: NodeState::Idle,
region: None,
price_quote: None,
reflex_addr: None,
allowed_nodes: Vec::new(),
allowed_subnets: subnets,
allowed_groups: groups,
metadata: std::collections::BTreeMap::new(),
owner: None,
},
)
.expect("sign restricted")
};
fold.apply(restricted(by_subnet, vec![caller_subnet], Vec::new()))
.expect("by_subnet apply");
fold.apply(restricted(by_group, Vec::new(), vec![caller_group]))
.expect("by_group apply");
fold.apply(restricted(foreign, vec![other_subnet], Vec::new()))
.expect("foreign apply");
let targets = vec![by_subnet, by_group, foreign];
let tag = "nrpc:echo";
let batch = may_execute_batch(&fold, &targets, tag, caller);
let per_target: Vec<bool> = targets
.iter()
.map(|t| may_execute(&fold, *t, tag, caller))
.collect();
assert_eq!(
batch, per_target,
"batched subnet/group verdicts must equal per-target verdicts"
);
assert_eq!(
batch,
vec![true, true, false],
"subnet-allowed admits, group-allowed admits, foreign subnet denies"
);
}
#[test]
fn may_admit_denies_what_may_execute_narrows_to() {
let fold = new_fold();
let kp = EntityKeypair::generate();
let caller: NodeId = 0xCA;
let by_subnet: NodeId = 0xA1;
let by_group: NodeId = 0xA2;
let by_node: NodeId = 0xA4;
let open: NodeId = 0xA5;
let caller_subnet =
super::super::super::subnet::SubnetId::from_tag(&format!("subnet:{}", "11".repeat(16)))
.expect("parse caller subnet tag");
let caller_group =
super::super::super::group::GroupId::from_tag(&format!("group:{}", "33".repeat(32)))
.expect("parse caller group tag");
let caller_subnet_tag = caller_subnet.to_tag();
let caller_group_tag = caller_group.to_tag();
fold.apply(sign_member(
&kp,
caller,
0x100,
vec![caller_subnet_tag.as_str(), caller_group_tag.as_str()],
None,
))
.expect("caller apply");
let restricted =
|node: NodeId,
nodes: Vec<u64>,
subnets: Vec<super::super::super::subnet::SubnetId>,
groups: Vec<super::super::super::group::GroupId>| {
SignedAnnouncement::sign(
&kp,
super::super::capability::CapabilityFold::KIND_ID,
0x100,
node,
1,
EnvelopeMeta::default(),
CapabilityMembership {
class_hash: 0x100,
tags: vec!["nrpc:echo".into()],
hardware: None,
state: NodeState::Idle,
region: None,
price_quote: None,
reflex_addr: None,
allowed_nodes: nodes,
allowed_subnets: subnets,
allowed_groups: groups,
metadata: std::collections::BTreeMap::new(),
owner: None,
},
)
.expect("sign restricted")
};
fold.apply(restricted(
by_subnet,
Vec::new(),
vec![caller_subnet],
Vec::new(),
))
.expect("by_subnet apply");
fold.apply(restricted(
by_group,
Vec::new(),
Vec::new(),
vec![caller_group],
))
.expect("by_group apply");
fold.apply(restricted(by_node, vec![caller], Vec::new(), Vec::new()))
.expect("by_node apply");
fold.apply(restricted(open, Vec::new(), Vec::new(), Vec::new()))
.expect("open apply");
assert!(may_execute(&fold, by_subnet, "nrpc:echo", caller));
assert!(may_execute(&fold, by_group, "nrpc:echo", caller));
assert!(
!may_admit(&fold, by_subnet, "nrpc:echo", caller),
"self-declared subnet membership must not admit",
);
assert!(
!may_admit(&fold, by_group, "nrpc:echo", caller),
"self-declared group membership must not admit",
);
assert!(may_admit(&fold, by_node, "nrpc:echo", caller));
assert!(may_admit(&fold, open, "nrpc:echo", caller));
assert!(!may_admit(&fold, 0xDEAD, "nrpc:echo", caller));
assert!(!may_admit(&fold, by_node, "nrpc:other", caller));
}
#[test]
fn multiple_subnet_tags_collapse_to_no_membership() {
let fold = new_fold();
let kp = EntityKeypair::generate();
let caller: NodeId = 0xCB;
let target: NodeId = 0xA6;
let s1 =
super::super::super::subnet::SubnetId::from_tag(&format!("subnet:{}", "aa".repeat(16)))
.expect("parse s1");
let s2 =
super::super::super::subnet::SubnetId::from_tag(&format!("subnet:{}", "bb".repeat(16)))
.expect("parse s2");
let (t1, t2) = (s1.to_tag(), s2.to_tag());
fold.apply(sign_member(
&kp,
caller,
0x100,
vec![t1.as_str(), t2.as_str()],
None,
))
.expect("caller apply");
fold.apply(
SignedAnnouncement::sign(
&kp,
super::super::capability::CapabilityFold::KIND_ID,
0x100,
target,
1,
EnvelopeMeta::default(),
CapabilityMembership {
class_hash: 0x100,
tags: vec!["nrpc:echo".into()],
hardware: None,
state: NodeState::Idle,
region: None,
price_quote: None,
reflex_addr: None,
allowed_nodes: Vec::new(),
allowed_subnets: vec![s1, s2],
allowed_groups: Vec::new(),
metadata: std::collections::BTreeMap::new(),
owner: None,
},
)
.expect("sign target"),
)
.expect("target apply");
assert!(
!may_execute(&fold, target, "nrpc:echo", caller),
"multiple distinct subnet tags contribute no membership",
);
assert!(!may_admit(&fold, target, "nrpc:echo", caller));
}
use crate::adapter::net::behavior::org::{OrgKeypair, OrgMembershipCert};
use crate::adapter::net::behavior::org_revocation::OrgRevocationState;
fn org_root() -> OrgKeypair {
OrgKeypair::from_bytes([0x42u8; 32])
}
fn signed_announcement_with_cert(
kp: &EntityKeypair,
cert: Option<OrgMembershipCert>,
) -> CapabilityAnnouncement {
let node_id = kp.entity_id().node_id();
use crate::adapter::net::behavior::capability::CapabilitySet;
let caps = CapabilitySet::new().add_tag("nrpc:echo".to_string());
let mut ann = CapabilityAnnouncement::new(node_id, kp.entity_id().clone(), 1, caps)
.with_owner_cert(cert);
ann.sign(kp);
ann
}
#[test]
fn verified_owner_cert_projects_owner_org() {
let fold = new_fold();
let kp = EntityKeypair::generate();
let cert = OrgMembershipCert::try_issue(&org_root(), kp.entity_id().clone(), 1, 3600)
.expect("issue");
let ann = signed_announcement_with_cert(&kp, Some(cert));
apply_legacy_announcement(&fold, ann, None, 0).expect("apply");
assert_eq!(
owner_org_for(&fold, kp.entity_id().node_id()),
Some(org_root().org_id())
);
}
#[test]
fn a_cert_whose_entity_does_not_derive_the_node_id_is_dropped() {
let kp = EntityKeypair::generate();
let real_node_id = kp.entity_id().node_id();
let cert = OrgMembershipCert::try_issue(&org_root(), kp.entity_id().clone(), 1, 3600)
.expect("issue");
use crate::adapter::net::behavior::capability::CapabilitySet;
let mismatched: NodeId = real_node_id ^ 0xFFFF_FFFF;
assert_ne!(mismatched, real_node_id, "fixture must actually differ");
let caps = CapabilitySet::new().add_tag("nrpc:echo".to_string());
let mut ann = CapabilityAnnouncement::new(mismatched, kp.entity_id().clone(), 1, caps)
.with_owner_cert(Some(cert));
ann.sign(&kp);
assert_eq!(
verify_announced_owner_cert(&ann, true, None, 0),
None,
"a cert under a mismatched node id must not project ownership",
);
let fold = new_fold();
apply_legacy_announcement(&fold, ann, None, 0).expect("apply");
let filter = LegacyFilter {
require_tags: vec!["nrpc:echo".into()],
..LegacyFilter::default()
};
assert!(
find_nodes_matching(&fold, &filter).contains(&mismatched),
"the announcement itself must be kept",
);
assert_eq!(
owner_org_for(&fold, mismatched),
None,
"no ownership may be projected under the mismatched node id",
);
let cert = OrgMembershipCert::try_issue(&org_root(), kp.entity_id().clone(), 1, 3600)
.expect("issue");
let bound = signed_announcement_with_cert(&kp, Some(cert));
let fold = new_fold();
apply_legacy_announcement(&fold, bound, None, 0).expect("apply");
assert_eq!(
owner_org_for(&fold, real_node_id),
Some(org_root().org_id()),
"a correctly-bound announcement still projects ownership",
);
}
#[test]
fn bad_owner_cert_is_dropped_but_announcement_is_kept() {
use crate::adapter::net::identity::EntityId;
let kp = EntityKeypair::generate();
let now = std::time::SystemTime::now()
.duration_since(std::time::UNIX_EPOCH)
.expect("clock")
.as_secs();
let stranger = EntityId::from_bytes([0x77u8; 32]);
let wrong_member =
OrgMembershipCert::try_issue(&org_root(), stranger, 1, 3600).expect("issue");
let mut tampered =
OrgMembershipCert::try_issue(&org_root(), kp.entity_id().clone(), 1, 3600)
.expect("issue");
tampered.signature[0] ^= 1;
let expired = OrgMembershipCert::issue_at(
&org_root(),
kp.entity_id().clone(),
1,
now - 2000,
now - 1000,
7,
);
let node_id = kp.entity_id().node_id();
for (label, cert) in [
("member mismatch", wrong_member),
("tampered signature", tampered),
("expired window", expired),
] {
let fold = new_fold();
let ann = signed_announcement_with_cert(&kp, Some(cert));
apply_legacy_announcement(&fold, ann, None, 0).expect("apply");
let filter = LegacyFilter {
require_tags: vec!["nrpc:echo".into()],
..LegacyFilter::default()
};
assert!(
find_nodes_matching(&fold, &filter).contains(&node_id),
"{label}: announcement must be kept"
);
assert_eq!(
owner_org_for(&fold, node_id),
None,
"{label}: cert must be dropped"
);
}
}
#[test]
fn floored_cert_is_dropped_at_ingest() {
use crate::adapter::net::behavior::org::OrgRevocationBundle;
let kp = EntityKeypair::generate();
let mut floors_map = std::collections::BTreeMap::new();
floors_map.insert(kp.entity_id().clone(), 5u32);
let bundle = OrgRevocationBundle::try_issue(&org_root(), &floors_map).expect("issue");
bundle.verify().expect("bundle verifies");
let mut floors = OrgRevocationState::empty();
floors.merge_bundle(&bundle);
let below = OrgMembershipCert::try_issue(&org_root(), kp.entity_id().clone(), 4, 3600)
.expect("issue");
let at = OrgMembershipCert::try_issue(&org_root(), kp.entity_id().clone(), 5, 3600)
.expect("issue");
let ann_below = signed_announcement_with_cert(&kp, Some(below));
let ann_at = signed_announcement_with_cert(&kp, Some(at));
assert_eq!(
verify_announced_owner_cert(&ann_below, true, Some(&floors), 0),
None,
"generation below floor must be dropped"
);
assert_eq!(
verify_announced_owner_cert(&ann_at, true, Some(&floors), 0),
Some(VerifiedOwner::new(kp.entity_id(), org_root().org_id(), 5)),
"generation at floor must project"
);
assert_eq!(
verify_announced_owner_cert(&ann_below, true, None, 0),
Some(VerifiedOwner::new(kp.entity_id(), org_root().org_id(), 4)),
"no floor state ⇒ every generation admissible"
);
}
#[test]
fn unsigned_announcement_never_projects_ownership() {
use crate::adapter::net::behavior::capability::CapabilitySet;
let kp = EntityKeypair::generate();
let cert = OrgMembershipCert::try_issue(&org_root(), kp.entity_id().clone(), 1, 3600)
.expect("issue");
let fold = new_fold();
let unsigned = CapabilityAnnouncement::new(
0xE1,
kp.entity_id().clone(),
1,
CapabilitySet::new().add_tag("nrpc:echo"),
)
.with_owner_cert(Some(cert.clone()));
assert!(unsigned.signature.is_none());
apply_legacy_announcement(&fold, unsigned, None, 0).expect("apply");
let filter = LegacyFilter {
require_tags: vec!["nrpc:echo".into()],
..LegacyFilter::default()
};
assert!(find_nodes_matching(&fold, &filter).contains(&0xE1));
assert_eq!(
owner_org_for(&fold, 0xE1),
None,
"unsigned announcement must not project ownership"
);
let fold = new_fold();
let mut tampered = signed_announcement_with_cert(&kp, Some(cert));
tampered.version += 1; apply_legacy_announcement(&fold, tampered, None, 0).expect("apply");
assert_eq!(
owner_org_for(&fold, 0xE2),
None,
"signature-invalid announcement must not project ownership"
);
}
#[test]
fn delayed_apply_after_floor_raise_still_retracts() {
use crate::adapter::net::behavior::org::OrgRevocationBundle;
let fold = new_fold();
let kp = EntityKeypair::generate();
let node_id = kp.entity_id().node_id();
let cert = OrgMembershipCert::try_issue(&org_root(), kp.entity_id().clone(), 4, 3600)
.expect("issue");
let ann = signed_announcement_with_cert(&kp, Some(cert));
let owner = verify_announced_owner_cert(&ann, true, None, 0).expect("verifies at floor 0");
let mut floors = OrgRevocationState::empty();
let mut floors_map = std::collections::BTreeMap::new();
floors_map.insert(kp.entity_id().clone(), 5u32);
let bundle = OrgRevocationBundle::try_issue(&org_root(), &floors_map).expect("issue");
bundle.verify().expect("bundle verifies");
floors.merge_bundle(&bundle);
let retracted = retract_floored_ownership(&fold, org_root().org_id(), kp.entity_id(), 5);
assert_eq!(
retracted, 0,
"callback fires before the apply — nothing to retract"
);
let fold_ann = translate_announcement(&ann, Some(owner));
fold.apply(fold_ann).expect("apply");
assert_eq!(
owner_org_for(&fold, node_id),
Some(org_root().org_id()),
"without the recheck the revoked projection would persist — the review-9 red"
);
let retracted = recheck_projected_owner_floor(&fold, Some(&floors), kp.entity_id(), &owner);
assert_eq!(retracted, 1);
assert_eq!(
owner_org_for(&fold, node_id),
None,
"final owner must be None"
);
assert!(may_execute(&fold, node_id, "nrpc:echo", 0xCA11));
}
#[test]
fn retraction_advances_the_fold_change_generation() {
let fold = new_fold();
let kp = EntityKeypair::generate();
let node_id = kp.entity_id().node_id();
let cert = OrgMembershipCert::try_issue(&org_root(), kp.entity_id().clone(), 4, 3600)
.expect("issue");
let ann = signed_announcement_with_cert(&kp, Some(cert));
apply_legacy_announcement(&fold, ann, None, 0).expect("apply");
assert_eq!(owner_org_for(&fold, node_id), Some(org_root().org_id()));
let before = fold.change_generation();
let retracted = retract_floored_ownership(&fold, org_root().org_id(), kp.entity_id(), 5);
assert_eq!(retracted, 1);
assert!(
fold.change_generation() > before,
"retraction must signal fold subscribers"
);
let before = fold.change_generation();
let retracted = retract_floored_ownership(&fold, org_root().org_id(), kp.entity_id(), 5);
assert_eq!(retracted, 0);
assert_eq!(fold.change_generation(), before);
}
#[test]
fn ownership_retraction_is_recorded_on_the_audit_plane() {
use crate::adapter::net::behavior::fold::audit::VecFoldAuditSink;
use crate::adapter::net::behavior::fold::AuditKind;
let fold = new_fold();
let kp = EntityKeypair::generate();
let node_id = kp.entity_id().node_id();
let cert = OrgMembershipCert::try_issue(&org_root(), kp.entity_id().clone(), 4, 3600)
.expect("issue");
let ann = signed_announcement_with_cert(&kp, Some(cert));
apply_legacy_announcement(&fold, ann, None, 0).expect("apply");
assert_eq!(owner_org_for(&fold, node_id), Some(org_root().org_id()));
let sink = std::sync::Arc::new(VecFoldAuditSink::new());
fold.set_audit_sink(Some(sink.clone()));
assert!(sink.is_empty(), "sink starts clean");
let retracted = retract_floored_ownership(&fold, org_root().org_id(), kp.entity_id(), 5);
assert_eq!(retracted, 1, "the stale projection was retracted");
assert_eq!(owner_org_for(&fold, node_id), None);
let events = sink.snapshot();
assert_eq!(events.len(), 1, "exactly one audit event; got {events:?}");
assert_eq!(
events[0].kind,
AuditKind::Custom("ownership-retracted"),
"the retraction is its own audit kind",
);
let detail = events[0].detail.as_deref().unwrap_or_default();
assert!(
detail.contains("floor 5") && detail.contains(&org_root().org_id().to_string()),
"the detail must name the org and the floor for an auditor; got {detail:?}",
);
let before = sink.len();
assert_eq!(
retract_floored_ownership(&fold, org_root().org_id(), kp.entity_id(), 9),
0,
);
assert_eq!(sink.len(), before, "a no-op retraction emits nothing");
}
#[test]
fn floor_raise_retracts_stale_ownership_immediately() {
let fold = new_fold();
let kp = EntityKeypair::generate();
let node_id = kp.entity_id().node_id();
let cert = OrgMembershipCert::try_issue(&org_root(), kp.entity_id().clone(), 4, 3600)
.expect("issue");
let ann = signed_announcement_with_cert(&kp, Some(cert));
apply_legacy_announcement(&fold, ann, None, 0).expect("apply");
assert_eq!(owner_org_for(&fold, node_id), Some(org_root().org_id()));
let retracted = retract_floored_ownership(&fold, org_root().org_id(), kp.entity_id(), 5);
assert_eq!(retracted, 1);
assert_eq!(
owner_org_for(&fold, node_id),
None,
"stale projection must retract without a re-announcement"
);
let filter = LegacyFilter {
require_tags: vec!["nrpc:echo".into()],
..LegacyFilter::default()
};
assert!(find_nodes_matching(&fold, &filter).contains(&node_id));
assert!(may_execute(&fold, node_id, "nrpc:echo", 0xCA11));
let fold = new_fold();
let cert7 = OrgMembershipCert::try_issue(&org_root(), kp.entity_id().clone(), 7, 3600)
.expect("issue");
let ann7 = signed_announcement_with_cert(&kp, Some(cert7));
apply_legacy_announcement(&fold, ann7, None, 0).expect("apply");
let retracted = retract_floored_ownership(&fold, org_root().org_id(), kp.entity_id(), 5);
assert_eq!(retracted, 0, "generation 7 ≥ floor 5 must survive");
assert_eq!(owner_org_for(&fold, node_id), Some(org_root().org_id()));
}
#[test]
fn owner_org_never_enters_may_execute() {
let kp = EntityKeypair::generate();
let caller: NodeId = 0xCA11;
let cert = || {
OrgMembershipCert::try_issue(&org_root(), kp.entity_id().clone(), 1, 3600)
.expect("issue")
};
for with_cert in [false, true] {
let fold = new_fold();
let ann = signed_announcement_with_cert(&kp, with_cert.then(cert));
apply_legacy_announcement(&fold, ann, None, 0).expect("apply");
assert!(
may_execute(&fold, kp.entity_id().node_id(), "nrpc:echo", caller),
"permissive verdict must not depend on owner_org (with_cert={with_cert})"
);
}
for with_cert in [false, true] {
let fold = new_fold();
let mut ann = signed_announcement_with_cert(&kp, with_cert.then(cert));
ann.allowed_nodes = vec![0xFFFF];
ann.sign(&kp);
apply_legacy_announcement(&fold, ann, None, 0).expect("apply");
assert!(
!may_execute(&fold, kp.entity_id().node_id(), "nrpc:echo", caller),
"restricted verdict must not depend on owner_org (with_cert={with_cert})"
);
}
}
}