Core System Architecture Part 48 — Anonymous Service Discovery, Provider Selection, Capability Advertisement & Privacy-Preserving Marketplace Architecture

SIAR — Secure, Local-First, Multi-Transport Communication Platform

Series: Core System Architecture
Part: 48
Status: Architecture specification
Primary language: Rust
Builds on: Core System Architecture Parts 34–47

Primary purpose: define how SIAR discovers, validates, filters, ranks, rotates, and selects anonymous infrastructure providers while preserving privacy, preventing centralized usage correlation, integrating capability/price/health/reputation metadata, and keeping provider discovery independent from routing, payments, and user identity.


1. Purpose

As SIAR grows, anonymous services may be offered by multiple providers:

mixnet gateways
mailbox providers
bulk-storage providers
realtime relays
bridges
directory mirrors
censorship-resistance transports
anonymous file rendezvous services

A naive provider marketplace can create a powerful tracking point.

Example failure:

user account
→ searches providers
→ chooses relay
→ pays provider
→ uses mailbox
→ fetches files

all through one centralized service.

The governing principle is:

Provider discovery and selection must be based on signed, privacy-preserving capability metadata and local policy evaluation, not on identity-linked per-user marketplace queries.


2. Architectural Position

Signed Provider Catalogs
         │
         ▼
Provider Discovery Layer
         │
         ▼
Eligibility / Privacy Filters
         │
         ▼
Health / Diversity / Price Evaluation
         │
         ▼
Local Provider Selection
         │
         ▼
Service-Specific Provider Adapter

3. Core Separation

Keep separate:

Provider Identity
Operator Identity
Capability Advertisement
Price Advertisement
Provider Health
User Identity
Payment Identity
Routing Identity
Usage Identity

4. Non-Goals

Part 48 does not require:

centralized app-store marketplace
public user profiles
operator social network
token speculation
provider bidding per packet
auctioning individual user requests

5. Provider Types

#![allow(unused)]
fn main() {
pub enum AnonymousServiceType {
    MixnetGateway,
    Mailbox,
    BulkStorage,
    RealtimeRelay,
    Bridge,
    DirectoryMirror,
    Rendezvous,
    CensorshipTransport,
}
}

6. Provider Identity

Each provider has a cryptographic provider ID:

#![allow(unused)]
fn main() {
pub struct AnonymousProviderId(pub [u8; 32]);
}

7. Operator Identity

Several providers may belong to one operator.

#![allow(unused)]
fn main() {
pub struct ProviderOperatorId(pub [u8; 32]);
}

8. Why Separate Provider and Operator

A single operator can run:

gateway A
relay B
mailbox C

These must not automatically count as independent privacy domains.


9. Provider Descriptor

#![allow(unused)]
fn main() {
pub struct AnonymousProviderDescriptor {
    pub provider_id: AnonymousProviderId,
    pub operator_id: ProviderOperatorId,
    pub service_type: AnonymousServiceType,
    pub capabilities: ProviderCapabilities,
    pub pricing: Option<ProviderPriceRef>,
    pub health: ProviderHealthRef,
    pub policy: ProviderPolicyMetadata,
    pub valid_until: Timestamp,
    pub signature: ProviderDescriptorSignature,
}
}

10. Provider Descriptor Principle

Descriptor should describe:

what service exists
what capabilities it supports
what limits apply

not:

which users use it

11. Capability Advertisement

Capabilities must be explicit.


12. Provider Capabilities

#![allow(unused)]
fn main() {
pub enum ProviderCapabilities {
    Mixnet(MixnetProviderCapabilities),
    Mailbox(MailboxProviderCapabilities),
    Bulk(BulkProviderCapabilities),
    Realtime(RealtimeProviderCapabilities),
    Bridge(BridgeProviderCapabilities),
    Mirror(MirrorProviderCapabilities),
}
}

13. Mixnet Capabilities

Example:

#![allow(unused)]
fn main() {
pub struct MixnetProviderCapabilities {
    pub protocol_versions: Vec<MixnetProtocolVersion>,
    pub provider_cover: bool,
    pub provider_loop: bool,
    pub max_packet_size: usize,
    pub supports_reply_capabilities: bool,
}
}

14. Mailbox Capabilities

#![allow(unused)]
fn main() {
pub struct MailboxProviderCapabilities {
    pub max_object_size: u64,
    pub retention_classes: Vec<RetentionClass>,
    pub supports_multi_device: bool,
    pub supports_single_use_reply: bool,
}
}

15. Bulk Capabilities

#![allow(unused)]
fn main() {
pub struct BulkProviderCapabilities {
    pub max_object_size: u64,
    pub supports_resume: bool,
    pub supports_range_fetch: bool,
    pub supports_padding: bool,
    pub hides_sender_ip: bool,
    pub hides_receiver_ip: bool,
}
}

16. Realtime Capabilities

#![allow(unused)]
fn main() {
pub struct RealtimeProviderCapabilities {
    pub udp: bool,
    pub quic_datagram: bool,
    pub tcp_fallback: bool,
    pub supports_padding: bool,
    pub max_bitrate: u64,
}
}

17. Bridge Capabilities

#![allow(unused)]
fn main() {
pub struct BridgeProviderCapabilities {
    pub transports: Vec<PluggableTransportId>,
    pub probe_resistant: bool,
    pub tcp_only: bool,
    pub websocket: bool,
}
}

18. Capability Versioning

Every capability schema is versioned.


19. Unknown Capability

Ignore safely or reject if mandatory.


20. Provider Policy Metadata

May include:

jurisdiction category
retention policy
logging policy
abuse policy
minimum software version

21. Policy Honesty

Claims are only metadata until verified/audited.


22. Trust Classes

#![allow(unused)]
fn main() {
pub enum ProviderTrustClass {
    Unknown,
    Registered,
    Verified,
    Audited,
}
}

23. No "Trusted Forever"

Trust status must expire/revalidate.


24. Provider Catalog

#![allow(unused)]
fn main() {
pub struct ProviderCatalog {
    pub version: ProviderCatalogVersion,
    pub generated_at: Timestamp,
    pub valid_until: Timestamp,
    pub providers: Vec<AnonymousProviderDescriptor>,
    pub signatures: CatalogSignatureBundle,
}
}

25. Catalog Distribution

Possible:

directory authorities
signed mirrors
offline bundles
peer-assisted signed transfer

26. Mirror Trust

Clients trust:

catalog signature

not mirror.


27. Catalog Privacy

All clients should ideally fetch:

same broad catalog

rather than query exact desired provider category per user.


28. Why

Per-user query patterns can reveal:

needs censorship bridge
needs mailbox
needs high-bandwidth relay

29. Broad Snapshot Model

Preferred initial design:

download provider catalog
evaluate locally

30. Local Selection

Hard rule for strict mode.


31. Discovery API

#![allow(unused)]
fn main() {
pub trait ProviderCatalogSource {
    fn current_catalog(
        &self,
    ) -> Result<Arc<ProviderCatalog>, ProviderDiscoveryError>;
}
}

32. Marketplace Query Minimization

Avoid:

GET /best-relay-for-user-X

33. Private Discovery Query

If catalog becomes too large, future options:

PIR
OPRF-assisted lookup
bucketed anonymous queries

34. Initial Recommendation

Use signed local catalog until scale demands more advanced private lookup.


35. Provider Eligibility

Selection begins with hard constraints.


36. Eligibility Inputs

service type
protocol version
privacy requirement
health floor
operator revocation
policy compatibility
capacity
price class

37. Provider Requirements

#![allow(unused)]
fn main() {
pub struct ProviderRequirements {
    pub service_type: AnonymousServiceType,
    pub privacy_mode: PrivacyRoutingMode,
    pub required_capabilities: RequiredCapabilities,
    pub maximum_price: Option<ResourcePrice>,
    pub health_floor: ProviderHealthClass,
}
}

38. Hard Constraints First

Never let:

lower price
lower latency
higher capacity

override:

privacy requirement
protocol compatibility
revocation
operator diversity

39. Provider Filter

#![allow(unused)]
fn main() {
pub trait ProviderEligibilityFilter {
    fn eligible(
        &self,
        descriptor: &AnonymousProviderDescriptor,
        requirements: &ProviderRequirements,
    ) -> bool;
}
}

40. Privacy Requirement

Example:

Anonymous bulk transfer

requires:

hides sender IP
hides receiver IP

41. Strict Selection Failure

If no provider satisfies requirements:

service unavailable

not weaker provider.


42. Selection Inputs After Eligibility

Then optimize among eligible providers by:

health
operator diversity
capacity
price
latency class
historical reliability

43. Provider Score

Internal only.


44. Score Structure

#![allow(unused)]
fn main() {
pub struct ProviderScore {
    pub privacy_fit: u16,
    pub health: u16,
    pub capacity: u16,
    pub cost: u16,
    pub latency: u16,
}
}

45. No Public Universal Provider Score

Hard rule.


46. Selection Strategy

#![allow(unused)]
fn main() {
pub enum ProviderSelectionStrategy {
    PrivacyFirst,
    Balanced,
    CostAware,
    PerformanceAware,
}
}

47. Maximum Anonymity

Always:

PrivacyFirst

48. Provider Selector

#![allow(unused)]
fn main() {
pub trait AnonymousProviderSelector {
    fn select(
        &self,
        catalog: &ProviderCatalog,
        requirements: &ProviderRequirements,
        strategy: ProviderSelectionStrategy,
    ) -> Result<ProviderSelection, ProviderSelectionError>;
}
}

49. Provider Selection

#![allow(unused)]
fn main() {
pub struct ProviderSelection {
    pub primary: AnonymousProviderId,
    pub fallbacks: Vec<AnonymousProviderId>,
    pub policy_snapshot: ProviderSelectionPolicySnapshot,
}
}

50. Fallback Providers

All fallbacks must already satisfy hard constraints.


51. No Post-Failure Weakening

Hard rule.


52. Provider Rotation

Provider reuse can create linkability.


53. Rotation Policy

#![allow(unused)]
fn main() {
pub enum ProviderRotationPolicy {
    Stable,
    ShortEpoch,
    PerSession,
    Adaptive,
}
}

54. Stable

Lower churn.

Higher linkability.


55. ShortEpoch

Good default for privacy-sensitive services.


56. PerSession

Useful for:

call relays
rendezvous

57. Adaptive

Rotate based on:

health
privacy policy
operator concentration

58. Rotation Must Avoid Synchronization

All clients rotating simultaneously creates fingerprintable events.


59. Randomized Rotation Window

Use jitter.


60. Provider Stickiness

Some services need temporary stickiness.

Examples:

mailbox retention
bulk upload session
realtime call

61. Session-Bound Provider

Rotate only after session ends.


62. Mailbox Provider Migration

Use Part 35 migration flow.


63. Bulk Provider Migration

Use Part 40 rules.


64. Realtime Relay Migration

Use Part 44 rules.


65. Operator Diversity

Provider selection should track operator.


66. Cross-Service Diversity

Avoid:

same operator
=
gateway
mailbox
relay
bulk storage

where possible.


67. Why

One operator can correlate multiple service views.


68. Privacy Domain Graph

#![allow(unused)]
fn main() {
pub struct OperatorExposureGraph {
    pub operator: ProviderOperatorId,
    pub services: Vec<AnonymousServiceType>,
}
}

69. Exposure Policy

#![allow(unused)]
fn main() {
pub struct CrossServiceDiversityPolicy {
    pub max_services_per_operator: u8,
    pub require_independent_relay_and_mailbox: bool,
}
}

70. Maximum Anonymity

Prefer operator separation across:

entry
mailbox
bulk
realtime

when available.


71. Geographic Diversity

Optional.


72. Jurisdiction Diversity

Can be policy input.


73. Avoid Exact User-Location-Based Ranking

Hard rule.


74. Latency Classes

Use coarse:

Low
Medium
High
Unknown

75. Health Model

#![allow(unused)]
fn main() {
pub enum ProviderHealthClass {
    Healthy,
    Degraded,
    Unhealthy,
    Unknown,
}
}

76. Health Inputs

availability
queue depth
error rate
latency class
software freshness
capacity

77. Health Sources

provider self-report
independent observers
client-local experience

78. Self-Report Is Not Sufficient

Hard rule.


79. Independent Health Evidence

Signed.


80. Client-Local Experience

Useful but private.


81. Local Health Cache

#![allow(unused)]
fn main() {
pub struct LocalProviderExperience {
    pub provider: AnonymousProviderId,
    pub success_rate_bucket: ExperienceBucket,
    pub latency_bucket: ExperienceBucket,
}
}

82. No Remote Upload Required

Hard rule.


83. Provider Reputation

Infrastructure reputation from Part 39 can feed selection.


84. Keep Separate from User Reputation

Hard rule.


85. Provider Reputation Inputs

uptime
correct behavior
policy compliance
audit state
revocations

86. Price Integration

Part 47 signed price catalogs integrate here.


87. Provider Price Reference

#![allow(unused)]
fn main() {
pub struct ProviderPriceRef {
    pub catalog_version: u64,
    pub price_id: ProviderPriceId,
}
}

88. Price Selection Privacy

Evaluate locally.


89. No Per-User Dynamic Quote

Strict mode forbids unless privacy-preserving.


90. Price Classes

Could publish:

Free
Low
Medium
High

or exact signed price.


91. Resource Credit Compatibility

Provider advertises accepted credit classes.


92. Payment Compatibility

#![allow(unused)]
fn main() {
pub struct PaymentCapabilities {
    pub accepted_credit_classes: Vec<ResourceClass>,
    pub supports_prepaid: bool,
    pub supports_refunds: bool,
}
}

93. Selection Constraint

If wallet lacks accepted credit, provider may be ineligible.


94. No Identity-Linked Account Requirement in Strict Mode

Hard rule.


95. Marketplace Architecture

Marketplace means:

catalog
policy
selection
pricing
operator participation

not:

social storefront tracking users

96. Marketplace Governance

Needs:

provider admission
descriptor signing
policy requirements
revocation
dispute handling

97. Provider Admission

Can reuse Part 39 infrastructure governance.


98. Provider Admission Record

#![allow(unused)]
fn main() {
pub struct ProviderAdmissionRecord {
    pub provider_id: AnonymousProviderId,
    pub operator_id: ProviderOperatorId,
    pub service_type: AnonymousServiceType,
    pub state: ProviderAdmissionState,
}
}

99. Provider Admission State

#![allow(unused)]
fn main() {
pub enum ProviderAdmissionState {
    Pending,
    Eligible,
    Active,
    Suspended,
    Revoked,
    Retired,
}
}

100. Provider Descriptor Signing

Provider signs own descriptor.

Directory/governance signs inclusion.


101. Dual Trust

Client verifies:

provider descriptor signature
catalog inclusion signature

102. Provider Self-Claim

Cannot self-claim:

Audited
Verified

without governance evidence.


103. Audit Attestation

#![allow(unused)]
fn main() {
pub struct ProviderAuditAttestation {
    pub provider_id: AnonymousProviderId,
    pub auditor: AuditorId,
    pub audit_class: AuditClass,
    pub expires_at: Timestamp,
    pub signature: AuditSignature,
}
}

104. Audit Class

Examples:

Security
Privacy
Operational

105. Audit Expiry

Required.


106. Policy Claims

Examples:

no long-term logs
24h metadata retention
zero-access storage

107. Claim Verification

Architecture should distinguish:

SelfDeclared
GovernanceVerified
ThirdPartyAudited

108. Claim Assurance

#![allow(unused)]
fn main() {
pub enum ClaimAssurance {
    SelfDeclared,
    Verified,
    Audited,
}
}

109. UI Honesty

Do not display self-declared policy as independently verified.


110. Marketplace Anti-Manipulation

Threats:

fake reviews
fake uptime
fake capacity
self-dealing
operator clones
price manipulation

111. No Public User Review System Initially

Hard rule.


112. Why

Public reviews create:

Sybil spam
usage leakage
identity correlation

113. Better Reputation Sources

Use:

signed health evidence
audits
governance history
local client experience

114. Capacity Advertisement

Provider may advertise capacity class.


115. Capacity Class

#![allow(unused)]
fn main() {
pub enum ProviderCapacityClass {
    Small,
    Medium,
    Large,
    VeryLarge,
}
}

116. Capacity Verification

Independent probes where practical.


117. Selection Weight

Capacity can affect probability.


118. Weight Cap

Prevents one provider dominating.


119. Marketplace Concentration

Monitor:

operator share
provider share
ASN share
cloud share

120. Concentration Policy

#![allow(unused)]
fn main() {
pub struct MarketplaceConcentrationPolicy {
    pub max_operator_share: f32,
    pub max_provider_share: f32,
    pub max_asn_share: f32,
}
}

121. Strict Mode

Hard caps where possible.


122. Bootstrap Market

Small provider set may violate diversity.


123. Bootstrap State

Expose:

Reduced provider diversity

124. No Hidden Relaxation

Hard rule.


125. Provider Enumeration

Catalog itself may reveal all providers.


126. Is That a Problem?

For public infrastructure:

usually acceptable

For bridges:

not acceptable

127. Service-Specific Discovery Model

Public provider catalogs for:

mailbox
relay
bulk
gateway

Restricted distribution for:

bridges
censorship-sensitive endpoints

128. Bridge Discovery

Must remain Part 41 broker model.


129. Do Not Put Private Bridges in Public Catalog

Hard rule.


130. Directory Mirrors

Can be public.


131. Anonymous Search

Future marketplace may support query like:

need bulk provider with 10 GB + padding

without revealing user.


132. Private Query Techniques

Potential:

PIR
bucketed query
downloaded index shards

133. Initial Scale Strategy

Shard catalog by:

service type
protocol version

not user.


134. Catalog Shard

#![allow(unused)]
fn main() {
pub struct ProviderCatalogShard {
    pub service_type: AnonymousServiceType,
    pub version: ProviderCatalogVersion,
    pub providers: Vec<AnonymousProviderDescriptor>,
    pub signature: CatalogSignatureBundle,
}
}

135. Shard Privacy

Service-type fetch leaks coarse intent.


136. Strict Mode

Can prefetch several/common shards.


137. Catalog Cache

Local.


138. Cache Freshness

Bounded.


139. Stale Catalog

May use within grace period if:

not revoked
not expired

140. Emergency Revocation

Separate fast revocation feed.


141. Provider Revocation

#![allow(unused)]
fn main() {
pub struct ProviderRevocation {
    pub provider_id: AnonymousProviderId,
    pub reason: ProviderRevocationReason,
    pub effective_at: Timestamp,
    pub signature: GovernanceSignature,
}
}

142. Revocation Reasons

#![allow(unused)]
fn main() {
pub enum ProviderRevocationReason {
    KeyCompromise,
    MaliciousBehavior,
    PolicyViolation,
    VulnerableSoftware,
    OperatorRequest,
    Administrative,
}
}

143. Client Behavior

Never select revoked provider.


144. Active Sessions

Depending severity:

migrate
terminate
finish safely

145. Provider Migration

Service-specific.


146. Failover

Fallback list generated locally.


147. Failover Order

Can be randomized among similarly eligible providers.


148. Why Randomized

Avoid herd behavior.


149. Global Outage

If many clients fail over simultaneously:

stampede

150. Failover Jitter

Required.


151. Load Spreading

Provider selection can use:

capacity-weighted randomization

152. Deterministic Best Provider

Bad.

Creates concentration.


153. Better

Weighted random among privacy-eligible set.


154. Weighted Selection

#![allow(unused)]
fn main() {
pub trait WeightedProviderSelector {
    fn choose(
        &self,
        candidates: &[ProviderCandidate],
        rng: &mut dyn CryptoRngCore,
    ) -> Result<AnonymousProviderId, ProviderSelectionError>;
}
}

155. CSPRNG

Use secure randomness for selection where unpredictability matters.


156. Selection Seed

Do not persist globally across devices.


157. Multi-Device Selection

Devices can choose independently.


158. Correlation Risk

All devices using same provider can link account activity.


159. Strict Mode

Prefer independent providers where feasible.


160. Shared Mailbox Constraint

Some account-wide service may require shared provider.


161. Device-Scoped Provider State

Default where possible.


162. Provider Capability Negotiation

After selection, runtime still authenticates/negotiates.


163. Descriptor ≠ Runtime Truth

Provider may become stale/misconfigured.


164. Runtime Negotiation

#![allow(unused)]
fn main() {
pub trait ProviderCapabilityNegotiator {
    fn negotiate(
        &self,
        descriptor: &AnonymousProviderDescriptor,
        runtime: RuntimeProviderCapabilities,
    ) -> Result<NegotiatedProviderCapabilities, ProviderError>;
}
}

165. Downgrade Protection

Runtime cannot negotiate below required privacy capability.


166. Example

Descriptor says:

supports padding

runtime says no.

Strict mode:

reject

167. Capability Mismatch

Report to local diagnostics.

Optional governance report.


168. Provider Fingerprinting

Provider-specific protocol quirks can identify users/services.


169. Standardized Client Profiles

Use common protocol behavior where possible.


170. Marketplace Fingerprinting

Do not send:

full device model
OS build
contact count

during provider selection.


171. Request Minimization

Selection is local.

Connection sends only:

required protocol negotiation

172. Provider Access Credentials

Use:

scoped anonymous capability
quota credential

from Parts 35/47.


173. No Account Login to Provider

Strict mode.


174. Convenience Mode

Provider-specific account login may exist only as lower-privacy explicit mode.


175. Marketplace Payment Flow

catalog
→ local select
→ obtain compatible credit
→ connect with scoped credential

176. No Checkout Tracking Pixel Equivalent

Hard rule.


177. User Preferences

Possible:

prefer lowest cost
prefer strongest privacy
avoid specific operator
avoid jurisdiction
prefer audited providers

178. Preference Storage

Local.


179. Managed Policy

Organization may enforce:

approved providers only

180. Managed Policy Visibility

Explicit.


181. User Override

Depends on organization policy.


182. Provider Blocklist

Local user can block provider/operator.


183. Blocklist Privacy

Never upload unless explicitly synced E2EE.


184. Provider Favorites

Could increase linkability.

Use cautiously.


185. Manual Pinning

Advanced users may pin provider.


186. Pinning Warning

Stable provider selection may reduce unlinkability.


187. Provider Switching UX

Normal users need not see raw IDs.


188. UX Labels

Examples:

Private mailbox provider
Anonymous relay provider
Anonymous file provider

189. Advanced UX

Can show:

operator
audit status
cost class
health
capabilities

190. Do Not Expose Raw Selection Score

Hard rule.


191. Provider Marketplace UI

Optional.


192. Marketplace View

Could show provider cards without exposing user's usage history.


193. No "Users also chose"

Avoid social tracking.


194. No Personalized Recommendations Server-Side

Strict mode.


195. Local Recommendation Engine

Possible:

evaluate catalog locally

196. User Decision Inputs

Local:

privacy preference
budget
network constraints

197. Provider Discovery Service

#![allow(unused)]
fn main() {
pub trait AnonymousServiceDiscovery {
    fn providers(
        &self,
        service: AnonymousServiceType,
    ) -> Result<Vec<AnonymousProviderDescriptor>, ProviderDiscoveryError>;
}
}

198. Provider Policy Engine

#![allow(unused)]
fn main() {
pub trait ProviderPolicyEngine {
    fn evaluate(
        &self,
        provider: &AnonymousProviderDescriptor,
        requirements: &ProviderRequirements,
    ) -> ProviderPolicyDecision;
}
}

199. Policy Decision

#![allow(unused)]
fn main() {
pub enum ProviderPolicyDecision {
    Eligible,
    Ineligible(ProviderIneligibilityReason),
}
}

200. Ineligibility Reasons

#![allow(unused)]
fn main() {
pub enum ProviderIneligibilityReason {
    Revoked,
    UnsupportedProtocol,
    PrivacyRequirementMissing,
    HealthTooLow,
    OperatorConflict,
    PriceTooHigh,
    PolicyMismatch,
}
}

201. Selection Service

#![allow(unused)]
fn main() {
pub trait ProviderSelectionService {
    fn plan(
        &self,
        requirements: ProviderRequirements,
    ) -> Result<ProviderSelection, ProviderSelectionError>;
}
}

202. Selection Audit

Local-only decision trace.


203. Decision Trace

#![allow(unused)]
fn main() {
pub struct ProviderSelectionTrace {
    pub candidate_count: usize,
    pub rejected_counts: BTreeMap<ProviderIneligibilityReason, usize>,
    pub final_strategy: ProviderSelectionStrategy,
}
}

204. Privacy

No user identity.


205. Useful for Diagnostics

Shows:

no provider met strict privacy requirement

206. Marketplace Operator Registration

Provider operator joins through governance.


207. Listing Requirements

Could include:

key ownership
endpoint validation
capacity proof
policy declaration
pricing
software version

208. Listing Fee

If any, governance/business concern.

Not required architecturally.


209. No Pay-to-Rank in Strict Mode

Hard rule.


210. Sponsored Ranking

Should not override privacy/performance policy.

Prefer no sponsored ranking.


211. Marketplace Neutrality

Selection must be policy-driven, not commercial placement.


212. Transparency

Provider catalog changes can enter transparency log.


213. Catalog Events

provider added
provider suspended
provider revoked
price changed
policy changed

214. User Privacy

Transparency log contains no user selection events.


215. Marketplace Analytics

Safe aggregate:

number of active providers
capacity by service type
price ranges
health distribution

216. No Provider Popularity Tracking by Default

Hard rule.


217. Popularity Can Be Sensitive

It may reveal where users concentrate.


218. Capacity Planning

Use aggregate anonymous load from providers.


219. Differential Privacy

Potential for public market stats.


220. Small Provider Protection

Avoid publishing exact traffic for small operators.


221. Marketplace Abuse

Threats:

malicious provider
fake capability
fake price
bait-and-switch
selective denial
traffic discrimination

222. Capability Bait-and-Switch

Descriptor says:

privacy feature available

but runtime disables it.


223. Defense

Runtime capability validation.


224. Selective Denial

Provider may block some clients.


225. Detection

Local health evidence + independent probes.


226. Traffic Discrimination

Provider may prioritize certain users.


227. Strict Privacy Goal

Provider should not have stable user identity to discriminate by.


228. Price Manipulation

Signed catalog prevents silent local price rewrite.


229. Catalog Rollback

Reject older catalog after newer accepted.


230. Provider Key Rotation

Descriptor signed by current key.


231. Key Transition

Signed old→new transition or governance revalidation.


232. Operator Key Compromise

Suspend all affected providers pending revalidation.


233. Service Endpoint Rotation

Normal.


234. Endpoint Lifetime

Can be shorter than provider identity.


235. Provider Endpoint Privacy

Some services can use multiple endpoints.


236. Anycast/CDN

Possible, but operator/ASN metadata must reflect reality.


237. Public Provider Catalog Attack Surface

Parser must be strict/bounded.


238. Catalog Size Limits

Bound:

provider count
descriptor size
capability count
signature count

239. No Unbounded JSON

Use:

Postcard internally
RON for human-readable config
JSON only external interop if necessary

240. Signed Catalog Encoding

Canonical binary form required for signatures.


241. Canonicalization

Never sign ambiguous serialization.


242. Catalog Compression

Optional.

Decompress with hard limits.


243. Catalog Cache Database

Potential:

provider_catalogs
provider_descriptors
provider_health_cache
provider_audit_attestations
provider_revocations
provider_preferences
provider_selection_history_local

244. Selection History

Local only.


245. Why Store History

Useful for:

rotation
avoid unstable providers

246. History Retention

Bounded.


247. No Long-Term Behavioral Profile

Hard rule.


248. Provider Experience Decay

Old failures lose influence.


249. Backoff

Repeatedly failing provider gets temporary local penalty.


250. Penalty Scope

Local device only.


251. Marketplace Federation

Future:

multiple catalogs
multiple governance domains

252. Federation Risk

Duplicate providers / conflicting policy.


253. Canonical Provider Identity

Required.


254. Catalog Merge

Future logic:

verify each domain
deduplicate provider IDs
apply local trust policy

255. Cross-Domain Trust

Explicit local policy.


256. Initial Production Recommendation

Single SIAR governance catalog with signed mirrors.


257. Migration Roadmap

single catalog
→ multiple mirrors
→ independent auditors
→ multiple governance catalogs

258. Offline Provider Discovery

Signed catalog bundle can be imported.


259. Use Cases

censorship
air-gapped staging
emergency deployment

260. Bundle Freshness

Bounded.


261. Offline Selection

Allowed if provider endpoint reachable and revocation freshness acceptable.


262. Strict Mode

Stale revocation feed may block new selection.


263. Android

Catalog fetch/cache should be low-frequency.


264. Battery

Provider discovery must not poll constantly.


265. Desktop Daemon

Can refresh catalog in background.


266. Refresh Policy

#![allow(unused)]
fn main() {
pub struct CatalogRefreshPolicy {
    pub refresh_interval: Duration,
    pub max_staleness: Duration,
    pub jitter: Duration,
}
}

267. Jitter

Avoid synchronized catalog fetch.


268. Network Cost

Mobile can defer non-urgent refresh on metered network.


269. Emergency Revocation Feed

Still higher priority.


270. Observability

Safe local metrics:

catalog age
candidate counts
selection failure reason
provider health class

271. Forbidden Telemetry

No:

exact user's provider sequence
wallet linkage
contact linkage
mailbox mapping

272. Remote Metrics

If any, aggregate and privacy-reviewed.


273. Support Bundle

Can include:

catalog version
provider capability mismatch class
selection failure category

274. Redactions

No:

service credential
payment token
relationship ID

275. Testkit

Need fake marketplace/catalog.


276. Test Scenarios

healthy providers
revoked provider
capability mismatch
price change
operator concentration
catalog rollback
failover storm

277. Unit Tests

Test:

descriptor validation
catalog signature
eligibility
selection
rotation

278. Privacy Tests

Ensure:

selection remains local
catalog source sees no user requirements
cross-service provider IDs do not expose user identity

279. Operator Diversity Test

Strict mode avoids same operator across restricted service combination.


280. Capability Downgrade Test

Runtime capability weaker than descriptor.

Reject.


281. Revocation Test

Revoked provider never selected.


282. Price Rollback Test

Old price catalog rejected.


283. Catalog Rollback Test

Old provider catalog rejected after new accepted.


284. Failover Test

Only eligible fallback providers used.


285. Stampede Test

Mass provider outage produces jittered failover.


286. Load Distribution Test

Weighted random selection avoids one dominant provider.


287. Marketplace Concentration Test

Policy detects operator/ASN concentration.


288. Offline Bundle Test

Signed bundle works within freshness window.


289. Fuzzing

Fuzz:

provider descriptor
catalog
audit attestation
revocation
capability set

290. Property Tests

Properties:

revoked provider never eligible
strict privacy requirement cannot be overridden by price
fallback set contains only eligible providers
provider/operator IDs never equal user IDs

291. Formal Verification Targets

Good candidates:

eligibility policy
fallback resolver
operator diversity constraints
catalog anti-rollback

292. TLA+ Candidate

Provider rotation/failover state machine.


293. Kani Candidate

Eligibility hard-constraint evaluation.


294. Loom Candidate

Concurrent catalog refresh + active selection.


295. Performance Tests

Measure:

catalog parse
signature verification
local filtering
selection latency
cache memory

296. Scale Tests

Synthetic catalogs:

100
1,000
10,000
100,000

providers.


297. Large Catalog Strategy

Shard/index locally.


298. No Per-User Server Ranking

Hard rule even at scale.


299. Privacy Lab Integration

Part 42 should test:

provider-selection correlation
cross-service operator exposure
catalog-fetch intent leakage
rotation fingerprinting

300. Security Invariants

Mandatory:

1. Provider discovery does not require user identity.
2. Strict-mode provider selection is local from signed metadata.
3. Privacy requirements are evaluated before price/latency/performance.
4. Revoked or expired providers are never selected.
5. Fallback providers satisfy the same hard privacy constraints.
6. Provider IDs and operator IDs are separate from all user/contact/group IDs.
7. Same operator is not treated as independent across services in strict mode.
8. Bridge descriptors that require enumeration resistance are never placed in the public provider catalog.
9. Provider runtime negotiation cannot silently downgrade advertised privacy capability.
10. Price catalogs and provider catalogs are anti-rollback protected.
11. Marketplace governance never records user selection events in transparency logs.
12. Commercial ranking cannot override privacy eligibility.

301. Recommended Crate Layout

crates/
├── siar-provider-core/
├── siar-provider-catalog/
├── siar-provider-discovery/
├── siar-provider-policy/
├── siar-provider-selection/
├── siar-provider-health/
├── siar-provider-reputation/
├── siar-provider-audit/
├── siar-provider-marketplace/
├── siar-provider-observability/
└── siar-provider-testkit/

302. siar-provider-core

Owns:

provider IDs
service types
capability enums
errors

303. siar-provider-catalog

Signed catalog parsing/cache/anti-rollback.


304. siar-provider-discovery

Catalog/mirror/offline bundle retrieval.


305. siar-provider-policy

Hard eligibility and local policy.


306. siar-provider-selection

Weighted privacy-aware selection/rotation/failover.


307. siar-provider-health

Health evidence and local experience.


308. siar-provider-reputation

Infrastructure reputation only.


309. siar-provider-audit

Audit attestations and assurance level.


310. siar-provider-marketplace

Listing/governance/pricing integration.


311. siar-provider-observability

Privacy-safe diagnostics.


312. siar-provider-testkit

Fake providers/catalogs/outages.


313. Error Taxonomy

#![allow(unused)]
fn main() {
pub enum ProviderSelectionError {
    CatalogUnavailable,
    CatalogStale,
    SignatureInvalid,
    NoEligibleProvider,
    ProviderRevoked,
    CapabilityMissing,
    OperatorConflict,
    PriceConstraint,
    HealthConstraint,
    RuntimeCapabilityMismatch,
    Internal,
}
}

314. Initial Production Scope

Implement first:

signed provider catalog
local filtering
service-specific capability descriptors
operator IDs
health classes
signed price references
privacy-first weighted selection
fallback list
provider rotation
cross-service operator diversity
revocation feed
catalog anti-rollback
privacy-safe diagnostics

Then add:

private catalog queries
PIR/sharded discovery
multiple marketplace governance domains
third-party audits
advanced cross-service diversity optimization
differentially private market statistics

315. Definition of Done

Part 48 is complete when:

  • provider and operator identities are explicit and separate
  • provider capabilities are signed and versioned
  • provider catalogs can be distributed via signed mirrors/offline bundles
  • strict-mode selection happens locally
  • hard privacy constraints always precede cost/performance ranking
  • health, capacity, price, audit status, and operator diversity are integrated
  • cross-service operator exposure is controlled
  • provider rotation and jittered failover are defined
  • runtime capability negotiation cannot weaken required privacy
  • provider revocation and catalog anti-rollback are enforced
  • bridges requiring enumeration resistance remain outside public catalogs
  • commercial ranking cannot override privacy policy
  • diagnostics/telemetry avoid revealing user provider history
  • privacy, failover, concentration, rollback, capability mismatch, fuzz, and formal tests are specified

316. Final Architecture

                   SIGNED PROVIDER CATALOGS
                            │
                            ▼
                     LOCAL DISCOVERY
                            │
                            ▼
                    HARD ELIGIBILITY
             ┌──────────────┼──────────────┐
             │              │              │
          Privacy        Revocation     Capability
             │              │              │
             └──────────────┼──────────────┘
                            ▼
                    DIVERSITY / HEALTH
                            │
                            ▼
                      PRICE / LATENCY
                            │
                            ▼
                  WEIGHTED LOCAL SELECT
                            │
                            ▼
                 PROVIDER-SPECIFIC ADAPTER

Strict privacy selection model:

signed metadata
+
local policy
+
hard privacy constraints
+
operator diversity
+
health
+
cost/performance optimization

not:

send user profile to marketplace
→ marketplace tells user which provider to use

317. Final Principle

Provider choice is part of the anonymity architecture.

The correct model is:

signed capability advertisement
+
local privacy-aware selection
+
operator diversity
+
auditable governance
+
revocation
+
anti-rollback
+
privacy-preserving pricing integration

rather than:

centralized marketplace tracks every user selection

This architecture gives SIAR a scalable provider ecosystem without turning service discovery into a centralized map of anonymous infrastructure usage.