use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Serialize, Deserialize)]
#[serde(rename_all = "snake_case")]
pub enum ProtocolCriticalCapabilityClass {
Admission,
Ownership,
Evidence,
Transition,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Serialize, Deserialize)]
#[serde(rename_all = "snake_case")]
pub enum ProtocolCriticalCapabilityLifecycleState {
Issued,
Consumed,
Rejected,
Invalidated,
Committed,
RolledBack,
Expired,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub enum ProtocolCriticalCapabilityArtifact {
OwnershipCapability(crate::session::OwnershipCapability),
OwnershipReceipt(crate::session::OwnershipReceipt),
ReadinessWitness(crate::session::ReadinessWitness),
CancellationWitness(crate::session::CancellationWitness),
TimeoutWitness(crate::session::TimeoutWitness),
DelegationReceipt(crate::transfer_semantics::DelegationReceipt),
}
impl ProtocolCriticalCapabilityArtifact {
#[must_use]
pub fn class(&self) -> ProtocolCriticalCapabilityClass {
match self {
Self::OwnershipCapability(_) => ProtocolCriticalCapabilityClass::Ownership,
Self::OwnershipReceipt(_) | Self::DelegationReceipt(_) => {
ProtocolCriticalCapabilityClass::Transition
}
Self::ReadinessWitness(_) | Self::CancellationWitness(_) | Self::TimeoutWitness(_) => {
ProtocolCriticalCapabilityClass::Evidence
}
}
}
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub struct ProtocolCriticalCapabilityLifecycleRecord {
pub tick: Option<u64>,
pub artifact: ProtocolCriticalCapabilityArtifact,
pub lifecycle: ProtocolCriticalCapabilityLifecycleState,
pub reason: Option<String>,
}
fn from_authority_audit_record(
record: &crate::session::AuthorityAuditRecord,
) -> ProtocolCriticalCapabilityLifecycleRecord {
use crate::session::AuthorityArtifact;
let artifact = match &record.artifact {
AuthorityArtifact::OwnershipCapability(capability) => {
ProtocolCriticalCapabilityArtifact::OwnershipCapability(capability.clone())
}
AuthorityArtifact::OwnershipReceipt(receipt) => {
ProtocolCriticalCapabilityArtifact::OwnershipReceipt(receipt.clone())
}
AuthorityArtifact::Readiness(witness) => {
ProtocolCriticalCapabilityArtifact::ReadinessWitness(witness.clone())
}
AuthorityArtifact::Cancellation(witness) => {
ProtocolCriticalCapabilityArtifact::CancellationWitness(witness.clone())
}
AuthorityArtifact::Timeout(witness) => {
ProtocolCriticalCapabilityArtifact::TimeoutWitness(witness.clone())
}
};
ProtocolCriticalCapabilityLifecycleRecord {
tick: record.tick,
artifact,
lifecycle: record.event.into(),
reason: record.reason.clone(),
}
}
fn from_delegation_audit_record(
record: &crate::transfer_semantics::DelegationAuditRecord,
) -> ProtocolCriticalCapabilityLifecycleRecord {
let lifecycle = match record.status {
crate::transfer_semantics::DelegationStatus::Committed => {
ProtocolCriticalCapabilityLifecycleState::Committed
}
crate::transfer_semantics::DelegationStatus::RolledBack => {
ProtocolCriticalCapabilityLifecycleState::RolledBack
}
};
ProtocolCriticalCapabilityLifecycleRecord {
tick: Some(record.tick),
artifact: ProtocolCriticalCapabilityArtifact::DelegationReceipt(record.receipt.clone()),
lifecycle,
reason: record.reason.clone(),
}
}
#[must_use]
pub fn capability_lifecycle_audit_log_v1(
authority_audit_log: &[crate::session::AuthorityAuditRecord],
delegation_audit_log: &[crate::transfer_semantics::DelegationAuditRecord],
) -> Vec<ProtocolCriticalCapabilityLifecycleRecord> {
let mut records: Vec<_> = authority_audit_log
.iter()
.map(from_authority_audit_record)
.chain(
delegation_audit_log
.iter()
.map(from_delegation_audit_record),
)
.collect();
records.sort_by_key(|record| record.tick.unwrap_or(0));
records
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub struct ProtocolCriticalCapabilityBoundaryEntry {
pub surface: String,
pub class: ProtocolCriticalCapabilityClass,
pub lifecycle: Vec<ProtocolCriticalCapabilityLifecycleState>,
pub rust_module: String,
pub lean_module: String,
pub rationale: String,
}
fn entry(
surface: &str,
class: ProtocolCriticalCapabilityClass,
lifecycle: &[ProtocolCriticalCapabilityLifecycleState],
rust_module: &str,
lean_module: &str,
rationale: &str,
) -> ProtocolCriticalCapabilityBoundaryEntry {
ProtocolCriticalCapabilityBoundaryEntry {
surface: surface.to_string(),
class,
lifecycle: lifecycle.to_vec(),
rust_module: rust_module.to_string(),
lean_module: lean_module.to_string(),
rationale: rationale.to_string(),
}
}
#[must_use]
pub fn protocol_critical_capability_boundary() -> Vec<ProtocolCriticalCapabilityBoundaryEntry> {
use ProtocolCriticalCapabilityClass::{
Admission as AdmissionClass, Evidence as EvidenceClass, Ownership as OwnershipClass,
Transition as TransitionClass,
};
use ProtocolCriticalCapabilityLifecycleState::{
Committed, Consumed, Expired, Invalidated, Issued, Rejected, RolledBack,
};
vec![
entry(
"runtime_admission",
AdmissionClass,
&[Issued, Rejected],
"rust/machine/src/runtime_contracts.rs",
"lean/Runtime/Proofs/TheoremPack/AdmissionBoundary.lean",
"Admits or rejects runtime/profile execution before protocol-critical execution begins.",
),
entry(
"theorem_pack_capabilities",
AdmissionClass,
&[Issued, Rejected],
"rust/machine/src/composition.rs",
"lean/Runtime/Proofs/TheoremPack/API.lean",
"Carries proof-backed eligibility that higher-level runtime admission consumes.",
),
entry(
"ownership_capability",
OwnershipClass,
&[Issued, Invalidated, Expired, Rejected],
"rust/machine/src/session/overview.rs",
"lean/Runtime/Proofs/Conservation/Authority.lean",
"Proves which actor may currently mutate session-local protocol-critical state.",
),
entry(
"readiness_witness",
EvidenceClass,
&[Issued, Consumed, Rejected, Invalidated, Expired],
"rust/machine/src/session/overview.rs",
"lean/Runtime/Proofs/AuthorityMetatheory.lean",
"Justifies a protocol-critical readiness decision under one live owner generation.",
),
entry(
"authoritative_read",
EvidenceClass,
&[Issued, Consumed, Rejected],
"rust/machine/src/semantic_objects.rs",
"lean/Runtime/Proofs/Conservation/Evidence.lean",
"Carries evidence-bearing protocol input that may author canonical truth.",
),
entry(
"materialization_proof",
EvidenceClass,
&[Issued, Consumed, Rejected],
"rust/machine/src/semantic_objects.rs",
"lean/Runtime/Proofs/Conservation/Evidence.lean",
"Witnesses proof-bearing success on the sanctioned materialization path.",
),
entry(
"canonical_handle",
EvidenceClass,
&[Issued, Consumed, Rejected, Invalidated],
"rust/machine/src/semantic_objects.rs",
"lean/Runtime/Proofs/Conservation/Evidence.lean",
"Provides the strong reference required on parity-critical follow-on paths.",
),
entry(
"ownership_receipt",
TransitionClass,
&[Issued, Committed, RolledBack, Rejected, Invalidated, Expired],
"rust/machine/src/session/overview.rs",
"lean/Runtime/Proofs/Conservation/Authority.lean",
"Stages and commits explicit ownership transfer rather than ambient authority mutation.",
),
entry(
"semantic_handoff",
TransitionClass,
&[Committed, RolledBack, Rejected, Invalidated],
"rust/machine/src/semantic_objects.rs",
"lean/Runtime/Proofs/Conservation/Authority.lean",
"Represents explicit protocol-visible authority transfer and old-owner revocation.",
),
entry(
"reconfiguration_transition",
TransitionClass,
&[Issued, Committed, RolledBack, Rejected],
"rust/machine/src/composition.rs",
"lean/Runtime/Proofs/ReconfigurationObserver.lean",
"Captures protocol-critical cutover and membership/runtime transition artifacts.",
),
]
}
#[must_use]
pub fn rust_first_class_capability_module_boundary() -> &'static [&'static str] {
&[
"rust/machine/src/capabilities.rs",
"rust/machine/src/runtime_contracts.rs",
"rust/machine/src/session/overview.rs",
"rust/machine/src/semantic_objects.rs",
"rust/machine/src/composition.rs",
]
}
#[must_use]
pub fn lean_first_class_capability_module_boundary() -> &'static [&'static str] {
&[
"lean/Runtime/Proofs/Capabilities.lean",
"lean/Runtime/Proofs/AuthorityMetatheory.lean",
"lean/Runtime/Proofs/Conservation/Authority.lean",
"lean/Runtime/Proofs/Conservation/Evidence.lean",
"lean/Runtime/Proofs/ReconfigurationObserver.lean",
"lean/Runtime/Proofs/TheoremPack/AdmissionBoundary.lean",
]
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn capability_boundary_surfaces_are_unique_and_classified() {
let boundary = protocol_critical_capability_boundary();
assert!(
!boundary.is_empty(),
"protocol-critical capability boundary should not be empty"
);
let mut surfaces = std::collections::BTreeSet::new();
for entry in &boundary {
assert!(
surfaces.insert(entry.surface.as_str()),
"duplicate capability boundary surface: {}",
entry.surface
);
assert!(
!entry.lifecycle.is_empty(),
"capability surface must declare lifecycle states: {}",
entry.surface
);
assert!(
!entry.rust_module.is_empty() && !entry.lean_module.is_empty(),
"capability surface must declare both Rust and Lean boundaries: {}",
entry.surface
);
}
}
#[test]
fn capability_boundaries_cover_all_four_classes() {
let classes: std::collections::BTreeSet<_> = protocol_critical_capability_boundary()
.into_iter()
.map(|entry| entry.class)
.collect();
assert_eq!(
classes,
[
ProtocolCriticalCapabilityClass::Admission,
ProtocolCriticalCapabilityClass::Ownership,
ProtocolCriticalCapabilityClass::Evidence,
ProtocolCriticalCapabilityClass::Transition,
]
.into_iter()
.collect()
);
}
}