use chrono::{DateTime, Utc};
use serde::{Deserialize, Serialize};
pub const CORTEX_CONTEXT_TRUST_SCHEMA: &str = "cortex_context_trust";
pub const AXIOM_EXECUTION_TRUST_SCHEMA: &str = "axiom_execution_trust";
pub const AUTHORITY_FEEDBACK_LOOP_SCHEMA: &str = "authority_feedback_loop";
pub const TRUST_EXCHANGE_SCHEMA_VERSION: u16 = 1;
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
#[serde(deny_unknown_fields)]
pub struct CortexContextTrust {
pub schema: String,
pub version: u16,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub cortex_context_trust_ref: Option<String>,
pub context_id: String,
pub compatibility_trust_label: CompatibilityTrustLabel,
pub proof_state: ContextProofState,
pub truth_ceiling: TruthCeiling,
pub semantic_trust: ContextSemanticTrust,
#[serde(default)]
pub provenance_refs: Vec<String>,
#[serde(default = "ContradictionState::default_unknown")]
pub contradiction_state: ContradictionState,
#[serde(default = "PromotionState::default_candidate")]
pub promotion_state: PromotionState,
pub quarantine_state: ContextQuarantineState,
pub redaction_state: ContextRedactionState,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub confidence: Option<ContextConfidence>,
pub policy_result: ContextPolicyResult,
#[serde(default)]
pub allowed_claim_language: Vec<ContextAllowedClaimLanguage>,
#[serde(default)]
pub forbidden_uses: Vec<ContextForbiddenUse>,
#[serde(default)]
pub allowed_use: Vec<ContextAllowedUse>,
#[serde(default)]
pub evidence_refs: Vec<String>,
pub source_anchors: Vec<ContextSourceAnchor>,
#[serde(default)]
pub residual_risk: Vec<String>,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
#[serde(rename_all = "snake_case")]
pub enum CompatibilityTrustLabel {
Untrusted,
Advisory,
Observed,
Validated,
AuthorityClaimed,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
#[serde(deny_unknown_fields)]
pub struct ContextProofState {
pub state: ContextProofStateValue,
pub failing_edges: Vec<String>,
pub proof_refs: Vec<String>,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
#[serde(rename_all = "snake_case")]
pub enum ContextProofStateValue {
Missing,
Partial,
Closed,
Failed,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Deserialize)]
#[serde(rename_all = "kebab-case")]
pub enum TruthCeiling {
None,
Advisory,
Observed,
Validated,
PromotedByCortex,
}
impl Serialize for TruthCeiling {
fn serialize<S: serde::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
serializer.serialize_str(self.wire_string())
}
}
impl TruthCeiling {
#[must_use]
pub const fn wire_string(self) -> &'static str {
match self {
Self::None => "none",
Self::Advisory => "advisory",
Self::Observed => "observed",
Self::Validated => "validated",
Self::PromotedByCortex => "promoted-by-cortex",
}
}
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
#[serde(deny_unknown_fields)]
pub struct ContextSemanticTrust {
pub provenance_class: ContextProvenanceClass,
pub trust_weight: f64,
pub weighting_basis: String,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
#[serde(rename_all = "snake_case")]
pub enum ContextProvenanceClass {
Unknown,
Claimed,
Observed,
Derived,
Curated,
Promoted,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
#[serde(rename_all = "snake_case")]
pub enum ContradictionState {
NoneKnown,
Unresolved,
Resolved,
Unknown,
}
impl ContradictionState {
fn default_unknown() -> Self {
Self::Unknown
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
#[serde(rename_all = "snake_case")]
pub enum PromotionState {
Candidate,
Observed,
Validated,
Promoted,
Stale,
Quarantined,
}
impl PromotionState {
fn default_candidate() -> Self {
Self::Candidate
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
#[serde(rename_all = "snake_case")]
pub enum ContextQuarantineState {
Clear,
Quarantined,
DerivedFromQuarantined,
Unknown,
}
impl ContextQuarantineState {
#[must_use]
pub const fn propagates_quarantine(self) -> bool {
matches!(
self,
Self::Quarantined | Self::DerivedFromQuarantined | Self::Unknown
)
}
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
#[serde(deny_unknown_fields)]
pub struct ContextRedactionState {
pub status: ContextRedactionStatus,
pub redaction_refs: Vec<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub blocks_critical_premise: Option<bool>,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
#[serde(rename_all = "snake_case")]
pub enum ContextRedactionStatus {
None,
Redacted,
PartiallyRedacted,
Unknown,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
#[serde(deny_unknown_fields)]
pub struct ContextConfidence {
pub value: ContextConfidenceValue,
pub scale: ContextConfidenceScale,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
#[serde(untagged)]
pub enum ContextConfidenceValue {
Numeric(f64),
Discrete(String),
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
#[serde(rename_all = "snake_case")]
pub enum ContextConfidenceScale {
Discrete,
Numeric,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
#[serde(deny_unknown_fields)]
pub struct ContextPolicyResult {
pub decision_id: String,
pub result: ContextPolicyResultValue,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
#[serde(rename_all = "snake_case")]
pub enum ContextPolicyResultValue {
Deny,
ReviewRequired,
Partial,
Allow,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
#[serde(rename_all = "snake_case")]
pub enum ContextAllowedClaimLanguage {
Candidate,
Observed,
Validated,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
#[serde(rename_all = "snake_case")]
pub enum ContextForbiddenUse {
ExecutionPermission,
DurableTruthPromotion,
ReleaseClaim,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
#[serde(rename_all = "snake_case")]
pub enum ContextAllowedUse {
RenderOnly,
AdvisoryReasoning,
PlanningInput,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
#[serde(deny_unknown_fields)]
pub struct ContextSourceAnchor {
pub source_id: String,
pub source_type: ContextSourceAnchorType,
pub r#ref: String,
pub hash: String,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
#[serde(rename_all = "snake_case")]
pub enum ContextSourceAnchorType {
Event,
Memory,
Principle,
Doctrine,
Ledger,
ContextPack,
External,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
#[serde(deny_unknown_fields)]
pub struct AxiomExecutionTrust {
pub schema: String,
pub version: u16,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub axiom_execution_trust_ref: Option<String>,
pub action_id: String,
pub execution_trust_level: ExecutionTrustLevel,
pub repo_trust: RepoTrust,
pub actor_attestation: ActorAttestation,
pub policy_decision: ExecutionPolicyDecision,
pub token_scope: TokenScope,
pub tool_provenance: ExecutionToolProvenance,
pub source_anchors: Vec<ExecutionSourceAnchor>,
pub runtime_mode: String,
#[serde(default)]
pub evidence_refs: Vec<String>,
#[serde(default)]
pub residual_risk: Vec<String>,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
#[serde(rename_all = "snake_case")]
pub enum ExecutionTrustLevel {
Dev,
LocalUnsigned,
SignedLocal,
ExternallyAnchored,
AuthorityGrade,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
#[serde(deny_unknown_fields)]
pub struct RepoTrust {
pub result: RepoTrustResult,
pub evaluation_ref: String,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
#[serde(rename_all = "snake_case")]
pub enum RepoTrustResult {
Trusted,
Partial,
Untrusted,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
#[serde(deny_unknown_fields)]
pub struct ActorAttestation {
pub identity_ref: String,
pub attestation_ref: String,
pub operator_approval_ref: String,
pub operator_approval_hash: String,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
#[serde(deny_unknown_fields)]
pub struct ExecutionPolicyDecision {
pub decision_id: String,
pub result: ExecutionPolicyResult,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
#[serde(rename_all = "snake_case")]
pub enum ExecutionPolicyResult {
Deny,
ReviewRequired,
Partial,
Allow,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
#[serde(deny_unknown_fields)]
pub struct TokenScope {
pub token_id: String,
pub audience: String,
pub scope_hash: String,
pub operation_hash: String,
pub manifest_hash: String,
pub request_hash: String,
pub expires_at: DateTime<Utc>,
pub revocation_result: TokenRevocationResult,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
#[serde(rename_all = "snake_case")]
pub enum TokenRevocationResult {
Active,
Revoked,
Inactive,
Unknown,
}
impl TokenRevocationResult {
#[must_use]
pub const fn must_reject(self) -> bool {
matches!(self, Self::Revoked | Self::Inactive)
}
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
#[serde(deny_unknown_fields)]
pub struct ExecutionToolProvenance {
pub tool_id: String,
pub tool_version: String,
pub command_ref: String,
pub source_commit: String,
pub dependency_lock_ref: String,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
#[serde(deny_unknown_fields)]
pub struct ExecutionSourceAnchor {
pub source_id: String,
pub source_type: ExecutionSourceAnchorType,
pub r#ref: String,
pub hash: String,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
#[serde(rename_all = "snake_case")]
pub enum ExecutionSourceAnchorType {
Command,
File,
Test,
Ledger,
Runtime,
Approval,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
#[serde(deny_unknown_fields)]
pub struct AuthorityFeedbackLoop {
pub schema: String,
pub version: u16,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub authority_feedback_loop_ref: Option<String>,
pub loop_id: String,
pub started_at: DateTime<Utc>,
pub initiating_context: FeedbackInitiatingContext,
pub axiom_action: FeedbackAxiomAction,
pub returned_artifacts: Vec<FeedbackReturnedArtifact>,
pub amplification_risk: AmplificationRisk,
#[serde(default)]
pub independent_evidence_refs: Vec<String>,
#[serde(default)]
pub external_grounding_refs: Vec<String>,
pub contradiction_scan_ref: String,
pub quarantine_state: ContextQuarantineState,
pub confidence_ceiling: ConfidenceCeiling,
pub same_loop_promotion_allowed: bool,
pub authority_claims: FeedbackAuthorityClaims,
pub target_domain_validation: TargetDomainValidation,
#[serde(default)]
pub residual_risk: Vec<String>,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
#[serde(deny_unknown_fields)]
pub struct FeedbackInitiatingContext {
pub context_id: String,
pub cortex_context_trust_ref: String,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
#[serde(deny_unknown_fields)]
pub struct FeedbackAxiomAction {
pub action_id: String,
pub axiom_execution_trust_ref: String,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
#[serde(deny_unknown_fields)]
pub struct FeedbackReturnedArtifact {
pub artifact_id: String,
pub lineage_ref: String,
pub lifecycle_state: ArtifactLifecycleState,
pub reproducibility_level: ReproducibilityLevel,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
#[serde(rename_all = "snake_case")]
pub enum ArtifactLifecycleState {
Candidate,
Observed,
Validated,
Promoted,
Stale,
Quarantined,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Deserialize)]
#[serde(rename_all = "kebab-case")]
pub enum ReproducibilityLevel {
Deterministic,
BoundedNondeterministic,
Observational,
NonReproducible,
}
impl Serialize for ReproducibilityLevel {
fn serialize<S: serde::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
serializer.serialize_str(self.wire_string())
}
}
impl ReproducibilityLevel {
#[must_use]
pub const fn wire_string(self) -> &'static str {
match self {
Self::Deterministic => "deterministic",
Self::BoundedNondeterministic => "bounded-nondeterministic",
Self::Observational => "observational",
Self::NonReproducible => "non-reproducible",
}
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
#[serde(rename_all = "snake_case")]
pub enum AmplificationRisk {
Low,
Medium,
High,
Critical,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
#[serde(rename_all = "snake_case")]
pub enum ConfidenceCeiling {
Untrusted,
Advisory,
Observed,
Validated,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
#[serde(deny_unknown_fields)]
pub struct FeedbackAuthorityClaims {
pub durable_truth_promotion: AuthorityClaimStatus,
pub full_execution_authority: AuthorityClaimStatus,
pub review_required: bool,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
#[serde(rename_all = "snake_case")]
pub enum AuthorityClaimStatus {
Denied,
ReviewRequired,
EligibleAfterIndependentValidation,
}
impl AuthorityClaimStatus {
#[must_use]
pub const fn claims_authority(self) -> bool {
matches!(self, Self::EligibleAfterIndependentValidation)
}
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
#[serde(deny_unknown_fields)]
pub struct TargetDomainValidation {
pub required: bool,
pub independent_validation_ref: Option<String>,
pub result: TargetDomainValidationResult,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
#[serde(rename_all = "snake_case")]
pub enum TargetDomainValidationResult {
Pending,
Pass,
Fail,
Partial,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
#[serde(deny_unknown_fields)]
pub struct QuarantineOutput {
pub invariant: String,
pub reason: String,
pub source_ref: Option<String>,
}
impl QuarantineOutput {
#[must_use]
pub fn new(invariant: impl Into<String>, reason: impl Into<String>) -> Self {
Self {
invariant: invariant.into(),
reason: reason.into(),
source_ref: None,
}
}
#[must_use]
pub fn with_source_ref(mut self, source_ref: impl Into<String>) -> Self {
self.source_ref = Some(source_ref.into());
self
}
}
#[derive(Debug, Clone, Default, PartialEq, Eq, Serialize, Deserialize)]
#[serde(deny_unknown_fields)]
pub struct NamedQuarantineOutputs {
#[serde(default, skip_serializing_if = "Option::is_none")]
pub source_context: Option<QuarantineOutput>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub token_revocation: Option<QuarantineOutput>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub repo_trust: Option<QuarantineOutput>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub policy_denial: Option<QuarantineOutput>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub target_validation: Option<QuarantineOutput>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub derived_artifact: Option<QuarantineOutput>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub contradiction: Option<QuarantineOutput>,
}
impl NamedQuarantineOutputs {
#[must_use]
pub fn any_present(&self) -> bool {
self.source_context.is_some()
|| self.token_revocation.is_some()
|| self.repo_trust.is_some()
|| self.policy_denial.is_some()
|| self.target_validation.is_some()
|| self.derived_artifact.is_some()
|| self.contradiction.is_some()
}
pub fn invariants(&self) -> impl Iterator<Item = &str> {
[
self.source_context.as_ref(),
self.token_revocation.as_ref(),
self.repo_trust.as_ref(),
self.policy_denial.as_ref(),
self.target_validation.as_ref(),
self.derived_artifact.as_ref(),
self.contradiction.as_ref(),
]
.into_iter()
.flatten()
.map(|q| q.invariant.as_str())
}
}
#[derive(Debug, Clone, PartialEq, Eq, Hash, Serialize, Deserialize)]
#[serde(deny_unknown_fields)]
pub struct TrustExchangeFieldError {
pub invariant: String,
pub reason: String,
}
impl TrustExchangeFieldError {
#[must_use]
pub fn new(invariant: impl Into<String>, reason: impl Into<String>) -> Self {
Self {
invariant: invariant.into(),
reason: reason.into(),
}
}
}
pub type TrustExchangeValidation = Result<(), Vec<TrustExchangeFieldError>>;
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
#[serde(deny_unknown_fields)]
pub struct CortexContextTrustEnvelope {
pub cortex_context_trust: CortexContextTrust,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
#[serde(deny_unknown_fields)]
pub struct AxiomExecutionTrustEnvelope {
pub axiom_execution_trust: AxiomExecutionTrust,
}
pub fn parse_cortex_context_trust(
input: &str,
) -> Result<CortexContextTrust, TrustExchangeFieldError> {
let value: serde_json::Value = serde_json::from_str(input).map_err(|err| {
TrustExchangeFieldError::new(
"cortex_context_trust.envelope.invalid_json",
format!("invalid JSON: {err}"),
)
})?;
let inner = match value.get("cortex_context_trust") {
Some(inner) => inner.clone(),
None => value,
};
serde_json::from_value(inner).map_err(|err| {
TrustExchangeFieldError::new(
"cortex_context_trust.envelope.schema_drift",
format!("envelope failed schema check: {err}"),
)
})
}
pub fn parse_axiom_execution_trust(
input: &str,
) -> Result<AxiomExecutionTrust, TrustExchangeFieldError> {
let value: serde_json::Value = serde_json::from_str(input).map_err(|err| {
TrustExchangeFieldError::new(
"axiom_execution_trust.envelope.invalid_json",
format!("invalid JSON: {err}"),
)
})?;
let inner = match value.get("axiom_execution_trust") {
Some(inner) => inner.clone(),
None => value,
};
serde_json::from_value(inner).map_err(|err| {
TrustExchangeFieldError::new(
"axiom_execution_trust.envelope.schema_drift",
format!("envelope failed schema check: {err}"),
)
})
}
pub fn parse_authority_feedback_loop(
input: &str,
) -> Result<AuthorityFeedbackLoop, TrustExchangeFieldError> {
serde_json::from_str(input).map_err(|err| {
TrustExchangeFieldError::new(
"authority_feedback_loop.envelope.schema_drift",
format!("envelope failed schema check: {err}"),
)
})
}
pub const AXIOM_EXECUTION_TRUST_SOURCE_COMMIT_STALE_INVARIANT: &str =
"axiom_execution_trust.tool_provenance.source_commit.stale";
pub const CORTEX_AXIOM_ACCEPTED_SOURCE_COMMITS_ENV: &str = "CORTEX_AXIOM_ACCEPTED_SOURCE_COMMITS";
pub const DEFAULT_ACCEPTED_AXIOM_SOURCE_COMMITS: &[&str] = &[
"44b9a25dfbe5a93e64120f53b65730828d1af91c",
"062d0d42ac5ef300fa3e04ef5b49b14864babcdd",
"9a15d281ddcc2bcf36956fbe6d6c5736d8ce706a",
"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
];
#[must_use]
pub fn accepted_axiom_source_commits() -> Vec<String> {
if let Ok(raw) = std::env::var(CORTEX_AXIOM_ACCEPTED_SOURCE_COMMITS_ENV) {
return raw
.split(',')
.map(|piece| piece.trim().to_ascii_lowercase())
.filter(|piece| !piece.is_empty())
.collect();
}
DEFAULT_ACCEPTED_AXIOM_SOURCE_COMMITS
.iter()
.map(|sha| (*sha).to_string())
.collect()
}
#[must_use]
pub fn is_axiom_source_commit_fresh(candidate: &str, accepted: &[String]) -> bool {
let lowered = candidate.to_ascii_lowercase();
accepted.iter().any(|sha| sha == &lowered)
}
const SHA256_PATTERN_PREFIX: &str = "sha256:";
const SHA256_HEX_LEN: usize = 64;
fn is_sha256_hash(value: &str) -> bool {
if let Some(hex) = value.strip_prefix(SHA256_PATTERN_PREFIX) {
hex.len() == SHA256_HEX_LEN
&& hex
.chars()
.all(|c| c.is_ascii_hexdigit() && !c.is_ascii_uppercase())
} else {
false
}
}
fn is_commit_sha(value: &str) -> bool {
value.len() == 40
&& value
.chars()
.all(|c| c.is_ascii_hexdigit() && !c.is_ascii_uppercase())
}
fn push(errors: &mut Vec<TrustExchangeFieldError>, invariant: &str, reason: impl Into<String>) {
errors.push(TrustExchangeFieldError::new(invariant, reason));
}
fn require_nonblank(
errors: &mut Vec<TrustExchangeFieldError>,
value: &str,
invariant: &str,
reason: &str,
) {
if value.trim().is_empty() {
push(errors, invariant, reason);
}
}
impl CortexContextTrust {
pub fn validate(&self) -> TrustExchangeValidation {
let mut errors: Vec<TrustExchangeFieldError> = Vec::new();
if self.schema != CORTEX_CONTEXT_TRUST_SCHEMA {
push(
&mut errors,
"cortex_context_trust.schema.mismatch",
format!(
"schema must be `{CORTEX_CONTEXT_TRUST_SCHEMA}`, got `{}`",
self.schema
),
);
}
if self.version != TRUST_EXCHANGE_SCHEMA_VERSION {
push(
&mut errors,
"cortex_context_trust.version.mismatch",
format!(
"version must be {TRUST_EXCHANGE_SCHEMA_VERSION}, got {}",
self.version
),
);
}
require_nonblank(
&mut errors,
&self.context_id,
"cortex_context_trust.context_id.missing",
"context_id must be a non-empty string",
);
if self
.proof_state
.failing_edges
.iter()
.any(|e| e.trim().is_empty())
{
push(
&mut errors,
"cortex_context_trust.proof_state.failing_edges.blank_entry",
"proof_state.failing_edges entries must not be blank",
);
}
if self
.proof_state
.proof_refs
.iter()
.any(|e| e.trim().is_empty())
{
push(
&mut errors,
"cortex_context_trust.proof_state.proof_refs.blank_entry",
"proof_state.proof_refs entries must not be blank",
);
}
if matches!(
self.proof_state.state,
ContextProofStateValue::Missing | ContextProofStateValue::Failed
) {
push(
&mut errors,
"cortex_context_trust.proof_state.state.unusable",
"proof_state.state must be `closed` or `partial` for Cortex consumption",
);
}
require_nonblank(
&mut errors,
&self.semantic_trust.weighting_basis,
"cortex_context_trust.semantic_trust.weighting_basis.missing",
"semantic_trust.weighting_basis must be a non-empty string",
);
if !(0.0..=1.0).contains(&self.semantic_trust.trust_weight) {
push(
&mut errors,
"cortex_context_trust.semantic_trust.trust_weight.out_of_range",
"semantic_trust.trust_weight must be in [0, 1]",
);
}
if matches!(
self.semantic_trust.provenance_class,
ContextProvenanceClass::Unknown
) {
push(
&mut errors,
"cortex_context_trust.semantic_trust.provenance_class.unknown",
"semantic_trust.provenance_class must be a known class",
);
}
if matches!(self.redaction_state.status, ContextRedactionStatus::Unknown) {
push(
&mut errors,
"cortex_context_trust.redaction_state.status.unknown",
"redaction_state.status must be a known status",
);
}
if self
.redaction_state
.redaction_refs
.iter()
.any(|e| e.trim().is_empty())
{
push(
&mut errors,
"cortex_context_trust.redaction_state.redaction_refs.blank_entry",
"redaction_state.redaction_refs entries must not be blank",
);
}
require_nonblank(
&mut errors,
&self.policy_result.decision_id,
"cortex_context_trust.policy_result.decision_id.missing",
"policy_result.decision_id must be a non-empty string",
);
if self.allowed_claim_language.len() < 3 {
push(
&mut errors,
"cortex_context_trust.allowed_claim_language.insufficient_coverage",
"allowed_claim_language must include candidate, observed, and validated",
);
}
if self.forbidden_uses.len() < 3 {
push(
&mut errors,
"cortex_context_trust.forbidden_uses.insufficient_coverage",
"forbidden_uses must include execution_permission, durable_truth_promotion, release_claim",
);
}
if self.source_anchors.is_empty() {
push(
&mut errors,
"cortex_context_trust.source_anchors.missing",
"source_anchors must contain at least one anchor",
);
}
for anchor in &self.source_anchors {
require_nonblank(
&mut errors,
&anchor.source_id,
"cortex_context_trust.source_anchors.source_id.missing",
"source_anchors[].source_id must be a non-empty string",
);
require_nonblank(
&mut errors,
&anchor.r#ref,
"cortex_context_trust.source_anchors.ref.missing",
"source_anchors[].ref must be a non-empty string",
);
if !is_sha256_hash(&anchor.hash) {
push(
&mut errors,
"cortex_context_trust.source_anchors.hash.invalid_format",
"source_anchors[].hash must match sha256:<64 lowercase hex>",
);
}
}
if errors.is_empty() {
Ok(())
} else {
Err(errors)
}
}
}
impl AxiomExecutionTrust {
pub fn validate(&self) -> TrustExchangeValidation {
let mut errors: Vec<TrustExchangeFieldError> = Vec::new();
if self.schema != AXIOM_EXECUTION_TRUST_SCHEMA {
push(
&mut errors,
"axiom_execution_trust.schema.mismatch",
format!(
"schema must be `{AXIOM_EXECUTION_TRUST_SCHEMA}`, got `{}`",
self.schema
),
);
}
if self.version != TRUST_EXCHANGE_SCHEMA_VERSION {
push(
&mut errors,
"axiom_execution_trust.version.mismatch",
format!(
"version must be {TRUST_EXCHANGE_SCHEMA_VERSION}, got {}",
self.version
),
);
}
require_nonblank(
&mut errors,
&self.action_id,
"axiom_execution_trust.action_id.missing",
"action_id must be a non-empty string",
);
require_nonblank(
&mut errors,
&self.repo_trust.evaluation_ref,
"axiom_execution_trust.repo_trust.evaluation_ref.missing",
"repo_trust.evaluation_ref must be a non-empty string",
);
require_nonblank(
&mut errors,
&self.actor_attestation.identity_ref,
"axiom_execution_trust.actor_attestation.identity_ref.missing",
"actor_attestation.identity_ref must be a non-empty string",
);
require_nonblank(
&mut errors,
&self.actor_attestation.attestation_ref,
"axiom_execution_trust.actor_attestation.attestation_ref.missing",
"actor_attestation.attestation_ref must be a non-empty string",
);
require_nonblank(
&mut errors,
&self.actor_attestation.operator_approval_ref,
"axiom_execution_trust.actor_attestation.operator_approval_ref.missing",
"actor_attestation.operator_approval_ref must be a non-empty string",
);
if !is_sha256_hash(&self.actor_attestation.operator_approval_hash) {
push(
&mut errors,
"axiom_execution_trust.actor_attestation.operator_approval_hash.invalid_format",
"actor_attestation.operator_approval_hash must match sha256:<64 lowercase hex>",
);
}
require_nonblank(
&mut errors,
&self.policy_decision.decision_id,
"axiom_execution_trust.policy_decision.decision_id.missing",
"policy_decision.decision_id must be a non-empty string",
);
require_nonblank(
&mut errors,
&self.token_scope.token_id,
"axiom_execution_trust.token_scope.token_id.missing",
"token_scope.token_id must be a non-empty string",
);
require_nonblank(
&mut errors,
&self.token_scope.audience,
"axiom_execution_trust.token_scope.audience.missing",
"token_scope.audience must be a non-empty string",
);
for (field, value, invariant) in [
(
"scope_hash",
&self.token_scope.scope_hash,
"axiom_execution_trust.token_scope.scope_hash.invalid_format",
),
(
"operation_hash",
&self.token_scope.operation_hash,
"axiom_execution_trust.token_scope.operation_hash.invalid_format",
),
(
"manifest_hash",
&self.token_scope.manifest_hash,
"axiom_execution_trust.token_scope.manifest_hash.invalid_format",
),
(
"request_hash",
&self.token_scope.request_hash,
"axiom_execution_trust.token_scope.request_hash.invalid_format",
),
] {
if !is_sha256_hash(value) {
push(
&mut errors,
invariant,
format!("token_scope.{field} must match sha256:<64 lowercase hex>"),
);
}
}
require_nonblank(
&mut errors,
&self.tool_provenance.tool_id,
"axiom_execution_trust.tool_provenance.tool_id.missing",
"tool_provenance.tool_id must be a non-empty string",
);
require_nonblank(
&mut errors,
&self.tool_provenance.tool_version,
"axiom_execution_trust.tool_provenance.tool_version.missing",
"tool_provenance.tool_version must be a non-empty string",
);
require_nonblank(
&mut errors,
&self.tool_provenance.command_ref,
"axiom_execution_trust.tool_provenance.command_ref.missing",
"tool_provenance.command_ref must be a non-empty string",
);
if !is_commit_sha(&self.tool_provenance.source_commit) {
push(
&mut errors,
"axiom_execution_trust.tool_provenance.source_commit.invalid_format",
"tool_provenance.source_commit must be a 40-character lowercase hex SHA",
);
}
require_nonblank(
&mut errors,
&self.tool_provenance.dependency_lock_ref,
"axiom_execution_trust.tool_provenance.dependency_lock_ref.missing",
"tool_provenance.dependency_lock_ref must be a non-empty string",
);
if self.source_anchors.is_empty() {
push(
&mut errors,
"axiom_execution_trust.source_anchors.missing",
"source_anchors must contain at least one anchor",
);
}
for anchor in &self.source_anchors {
require_nonblank(
&mut errors,
&anchor.source_id,
"axiom_execution_trust.source_anchors.source_id.missing",
"source_anchors[].source_id must be a non-empty string",
);
require_nonblank(
&mut errors,
&anchor.r#ref,
"axiom_execution_trust.source_anchors.ref.missing",
"source_anchors[].ref must be a non-empty string",
);
if !is_sha256_hash(&anchor.hash) {
push(
&mut errors,
"axiom_execution_trust.source_anchors.hash.invalid_format",
"source_anchors[].hash must match sha256:<64 lowercase hex>",
);
}
}
require_nonblank(
&mut errors,
&self.runtime_mode,
"axiom_execution_trust.runtime_mode.missing",
"runtime_mode must be a non-empty string",
);
if errors.is_empty() {
Ok(())
} else {
Err(errors)
}
}
#[must_use]
pub fn token_expired_at(&self, now: DateTime<Utc>) -> bool {
self.token_scope.expires_at < now
}
}
impl AuthorityFeedbackLoop {
pub fn validate(&self) -> TrustExchangeValidation {
let mut errors: Vec<TrustExchangeFieldError> = Vec::new();
if self.schema != AUTHORITY_FEEDBACK_LOOP_SCHEMA {
push(
&mut errors,
"authority_feedback_loop.schema.mismatch",
format!(
"schema must be `{AUTHORITY_FEEDBACK_LOOP_SCHEMA}`, got `{}`",
self.schema
),
);
}
if self.version != TRUST_EXCHANGE_SCHEMA_VERSION {
push(
&mut errors,
"authority_feedback_loop.version.mismatch",
format!(
"version must be {TRUST_EXCHANGE_SCHEMA_VERSION}, got {}",
self.version
),
);
}
require_nonblank(
&mut errors,
&self.loop_id,
"authority_feedback_loop.loop_id.missing",
"loop_id must be a non-empty string",
);
require_nonblank(
&mut errors,
&self.initiating_context.context_id,
"authority_feedback_loop.initiating_context.context_id.missing",
"initiating_context.context_id must be a non-empty string",
);
require_nonblank(
&mut errors,
&self.initiating_context.cortex_context_trust_ref,
"authority_feedback_loop.initiating_context.cortex_context_trust_ref.missing",
"initiating_context.cortex_context_trust_ref must be a non-empty string",
);
require_nonblank(
&mut errors,
&self.axiom_action.action_id,
"authority_feedback_loop.axiom_action.action_id.missing",
"axiom_action.action_id must be a non-empty string",
);
require_nonblank(
&mut errors,
&self.axiom_action.axiom_execution_trust_ref,
"authority_feedback_loop.axiom_action.axiom_execution_trust_ref.missing",
"axiom_action.axiom_execution_trust_ref must be a non-empty string",
);
if self.returned_artifacts.is_empty() {
push(
&mut errors,
"authority_feedback_loop.returned_artifacts.missing",
"returned_artifacts must contain at least one artifact",
);
}
for artifact in &self.returned_artifacts {
require_nonblank(
&mut errors,
&artifact.artifact_id,
"authority_feedback_loop.returned_artifacts.artifact_id.missing",
"returned_artifacts[].artifact_id must be a non-empty string",
);
require_nonblank(
&mut errors,
&artifact.lineage_ref,
"authority_feedback_loop.returned_artifacts.lineage_ref.missing",
"returned_artifacts[].lineage_ref must be a non-empty string",
);
}
require_nonblank(
&mut errors,
&self.contradiction_scan_ref,
"authority_feedback_loop.contradiction_scan_ref.missing",
"contradiction_scan_ref must be a non-empty string",
);
if !self.target_domain_validation.required {
push(
&mut errors,
"authority_feedback_loop.target_domain_validation.required.must_be_true",
"target_domain_validation.required must be true",
);
}
if errors.is_empty() {
Ok(())
} else {
Err(errors)
}
}
#[must_use]
pub const fn violates_same_loop_invariant(&self) -> bool {
self.same_loop_promotion_allowed
}
#[must_use]
pub const fn claims_durable_authority(&self) -> bool {
self.authority_claims
.durable_truth_promotion
.claims_authority()
|| self
.authority_claims
.full_execution_authority
.claims_authority()
}
}
#[cfg(test)]
mod tests {
use super::*;
use chrono::TimeZone;
const VALID_CTX: &str =
include_str!("../tests/fixtures/pai-axiom/valid-cortex-context-trust.json");
const VALID_EXEC: &str =
include_str!("../tests/fixtures/pai-axiom/valid-axiom-execution-trust.json");
#[test]
fn parse_valid_cortex_context_trust_round_trips() {
let envelope = parse_cortex_context_trust(VALID_CTX).expect("valid fixture parses");
assert_eq!(envelope.schema, CORTEX_CONTEXT_TRUST_SCHEMA);
assert_eq!(envelope.version, TRUST_EXCHANGE_SCHEMA_VERSION);
assert_eq!(envelope.context_id, "ctx_valid_behavior_change");
assert_eq!(envelope.quarantine_state, ContextQuarantineState::Clear);
assert!(matches!(
envelope.proof_state.state,
ContextProofStateValue::Closed
));
envelope.validate().expect("valid fixture validates");
let reserialized = serde_json::to_value(&envelope).unwrap();
assert_eq!(reserialized["schema"], "cortex_context_trust");
assert_eq!(reserialized["truth_ceiling"], "validated");
}
#[test]
fn parse_valid_axiom_execution_trust_round_trips() {
let envelope = parse_axiom_execution_trust(VALID_EXEC).expect("valid fixture parses");
assert_eq!(envelope.schema, AXIOM_EXECUTION_TRUST_SCHEMA);
assert_eq!(envelope.version, TRUST_EXCHANGE_SCHEMA_VERSION);
assert_eq!(envelope.action_id, "action_valid_authority_grade");
assert_eq!(envelope.token_scope.audience, "cortex-admission");
assert_eq!(
envelope.token_scope.revocation_result,
TokenRevocationResult::Active
);
envelope.validate().expect("valid fixture validates");
let reserialized = serde_json::to_value(&envelope).unwrap();
assert_eq!(reserialized["schema"], "axiom_execution_trust");
assert_eq!(reserialized["execution_trust_level"], "authority_grade");
}
#[test]
fn missing_token_audience_emits_stable_invariant() {
let value: serde_json::Value = serde_json::from_str(VALID_EXEC).unwrap();
let mut inner = value["axiom_execution_trust"].clone();
inner["token_scope"]["audience"] = serde_json::Value::String(String::new());
let envelope: AxiomExecutionTrust = serde_json::from_value(inner).unwrap();
let errors = envelope.validate().expect_err("empty audience must fail");
assert!(errors
.iter()
.any(|e| e.invariant == "axiom_execution_trust.token_scope.audience.missing"));
}
#[test]
fn missing_operator_approval_hash_emits_stable_invariant() {
let value: serde_json::Value = serde_json::from_str(VALID_EXEC).unwrap();
let mut inner = value["axiom_execution_trust"].clone();
inner["actor_attestation"]["operator_approval_hash"] =
serde_json::Value::String("not-a-hash".to_string());
let envelope: AxiomExecutionTrust = serde_json::from_value(inner).unwrap();
let errors = envelope.validate().expect_err("bad hash must fail");
assert!(errors.iter().any(|e| e.invariant
== "axiom_execution_trust.actor_attestation.operator_approval_hash.invalid_format"));
}
#[test]
fn invalid_source_commit_emits_stable_invariant() {
let value: serde_json::Value = serde_json::from_str(VALID_EXEC).unwrap();
let mut inner = value["axiom_execution_trust"].clone();
inner["tool_provenance"]["source_commit"] =
serde_json::Value::String("not-a-commit".to_string());
let envelope: AxiomExecutionTrust = serde_json::from_value(inner).unwrap();
let errors = envelope.validate().expect_err("bad commit must fail");
assert!(errors
.iter()
.any(|e| e.invariant
== "axiom_execution_trust.tool_provenance.source_commit.invalid_format"));
}
#[test]
fn proof_state_failed_emits_stable_invariant() {
let value: serde_json::Value = serde_json::from_str(VALID_CTX).unwrap();
let mut inner = value["cortex_context_trust"].clone();
inner["proof_state"]["state"] = serde_json::Value::String("failed".to_string());
inner["proof_state"]["failing_edges"] = serde_json::json!(["proof.audit.missing"]);
let envelope: CortexContextTrust = serde_json::from_value(inner).unwrap();
let errors = envelope
.validate()
.expect_err("failed proof state must fail");
assert!(errors
.iter()
.any(|e| e.invariant == "cortex_context_trust.proof_state.state.unusable"));
}
#[test]
fn extra_top_level_field_fails_closed() {
let json = serde_json::json!({
"schema": "cortex_context_trust",
"version": 1,
"context_id": "ctx",
"compatibility_trust_label": "validated",
"proof_state": {"state": "closed", "failing_edges": [], "proof_refs": ["p"]},
"truth_ceiling": "validated",
"semantic_trust": {"provenance_class": "observed", "trust_weight": 1, "weighting_basis": "x"},
"quarantine_state": "clear",
"redaction_state": {"status": "none", "redaction_refs": []},
"policy_result": {"decision_id": "p", "result": "allow"},
"source_anchors": [{
"source_id": "s",
"source_type": "event",
"ref": "r",
"hash": "sha256:0000000000000000000000000000000000000000000000000000000000000000"
}],
"rogue_field": true
});
let err = serde_json::from_value::<CortexContextTrust>(json)
.expect_err("deny_unknown_fields must reject rogue field");
assert!(err.to_string().contains("rogue_field"));
}
#[test]
fn revoked_token_is_must_reject() {
assert!(TokenRevocationResult::Revoked.must_reject());
assert!(TokenRevocationResult::Inactive.must_reject());
assert!(!TokenRevocationResult::Active.must_reject());
}
#[test]
fn token_expiry_check_uses_injected_now() {
let mut envelope = parse_axiom_execution_trust(VALID_EXEC).unwrap();
envelope.token_scope.expires_at = Utc.with_ymd_and_hms(2025, 1, 1, 0, 0, 0).unwrap();
let now = Utc.with_ymd_and_hms(2026, 1, 1, 0, 0, 0).unwrap();
assert!(envelope.token_expired_at(now));
}
#[test]
fn same_loop_promotion_invariant_is_structural() {
let loop_record = AuthorityFeedbackLoop {
schema: AUTHORITY_FEEDBACK_LOOP_SCHEMA.to_string(),
version: 1,
authority_feedback_loop_ref: None,
loop_id: "loop_x".to_string(),
started_at: Utc::now(),
initiating_context: FeedbackInitiatingContext {
context_id: "ctx".to_string(),
cortex_context_trust_ref: "ref".to_string(),
},
axiom_action: FeedbackAxiomAction {
action_id: "act".to_string(),
axiom_execution_trust_ref: "ref".to_string(),
},
returned_artifacts: vec![FeedbackReturnedArtifact {
artifact_id: "art".to_string(),
lineage_ref: "lin".to_string(),
lifecycle_state: ArtifactLifecycleState::Candidate,
reproducibility_level: ReproducibilityLevel::Observational,
}],
amplification_risk: AmplificationRisk::Low,
independent_evidence_refs: vec![],
external_grounding_refs: vec![],
contradiction_scan_ref: "scan".to_string(),
quarantine_state: ContextQuarantineState::Clear,
confidence_ceiling: ConfidenceCeiling::Advisory,
same_loop_promotion_allowed: true,
authority_claims: FeedbackAuthorityClaims {
durable_truth_promotion: AuthorityClaimStatus::Denied,
full_execution_authority: AuthorityClaimStatus::Denied,
review_required: true,
},
target_domain_validation: TargetDomainValidation {
required: true,
independent_validation_ref: None,
result: TargetDomainValidationResult::Pending,
},
residual_risk: vec![],
};
assert!(loop_record.violates_same_loop_invariant());
assert!(!loop_record.claims_durable_authority());
}
#[test]
fn named_quarantine_outputs_iterate_invariants() {
let outputs = NamedQuarantineOutputs {
source_context: Some(QuarantineOutput::new(
"axiom.admission.quarantine.propagated",
"source quarantine",
)),
token_revocation: Some(QuarantineOutput::new(
"axiom_execution_trust.token_scope.revoked",
"revoked",
)),
..Default::default()
};
let names: Vec<&str> = outputs.invariants().collect();
assert_eq!(names.len(), 2);
assert!(names.contains(&"axiom.admission.quarantine.propagated"));
assert!(names.contains(&"axiom_execution_trust.token_scope.revoked"));
}
#[test]
fn quarantine_state_propagation_predicate() {
assert!(ContextQuarantineState::Quarantined.propagates_quarantine());
assert!(ContextQuarantineState::DerivedFromQuarantined.propagates_quarantine());
assert!(ContextQuarantineState::Unknown.propagates_quarantine());
assert!(!ContextQuarantineState::Clear.propagates_quarantine());
}
#[test]
fn source_commit_stale_invariant_is_stable() {
assert_eq!(
AXIOM_EXECUTION_TRUST_SOURCE_COMMIT_STALE_INVARIANT,
"axiom_execution_trust.tool_provenance.source_commit.stale"
);
}
#[test]
fn accepted_source_commits_env_var_name_is_stable() {
assert_eq!(
CORTEX_AXIOM_ACCEPTED_SOURCE_COMMITS_ENV,
"CORTEX_AXIOM_ACCEPTED_SOURCE_COMMITS"
);
}
#[test]
fn default_accept_list_includes_adr_0042_pin() {
assert!(DEFAULT_ACCEPTED_AXIOM_SOURCE_COMMITS
.contains(&"44b9a25dfbe5a93e64120f53b65730828d1af91c"));
}
#[test]
fn default_accept_list_includes_known_good_v2_corpus() {
assert!(DEFAULT_ACCEPTED_AXIOM_SOURCE_COMMITS
.contains(&"9a15d281ddcc2bcf36956fbe6d6c5736d8ce706a"));
assert!(DEFAULT_ACCEPTED_AXIOM_SOURCE_COMMITS
.contains(&"062d0d42ac5ef300fa3e04ef5b49b14864babcdd"));
}
#[test]
fn default_accept_list_entries_are_well_formed_commits() {
for sha in DEFAULT_ACCEPTED_AXIOM_SOURCE_COMMITS {
assert!(
is_commit_sha(sha),
"default accept-list entry `{sha}` must be a 40-char lowercase-hex commit SHA",
);
}
}
#[test]
fn freshness_predicate_admits_accepted_sha() {
let accepted: Vec<String> = DEFAULT_ACCEPTED_AXIOM_SOURCE_COMMITS
.iter()
.map(|sha| (*sha).to_string())
.collect();
assert!(is_axiom_source_commit_fresh(
"44b9a25dfbe5a93e64120f53b65730828d1af91c",
&accepted
));
}
#[test]
fn freshness_predicate_refuses_unknown_sha() {
let accepted: Vec<String> = DEFAULT_ACCEPTED_AXIOM_SOURCE_COMMITS
.iter()
.map(|sha| (*sha).to_string())
.collect();
assert!(!is_axiom_source_commit_fresh(
"0000000000000000000000000000000000000000",
&accepted
));
assert!(!is_axiom_source_commit_fresh(
"1234567890abcdef1234567890abcdef12345678",
&accepted
));
}
#[test]
fn freshness_predicate_is_case_insensitive_on_candidate() {
let accepted = vec!["44b9a25dfbe5a93e64120f53b65730828d1af91c".to_string()];
assert!(is_axiom_source_commit_fresh(
"44B9A25DFBE5A93E64120F53B65730828D1AF91C",
&accepted
));
assert!(is_axiom_source_commit_fresh(
"44b9a25dfbe5a93e64120f53b65730828d1af91c",
&accepted
));
}
#[test]
fn freshness_predicate_empty_accept_list_refuses_everything() {
let accepted: Vec<String> = Vec::new();
assert!(!is_axiom_source_commit_fresh(
"44b9a25dfbe5a93e64120f53b65730828d1af91c",
&accepted
));
}
#[test]
fn accepted_axiom_source_commits_env_var_replaces_default() {
let prior = std::env::var(CORTEX_AXIOM_ACCEPTED_SOURCE_COMMITS_ENV).ok();
std::env::set_var(
CORTEX_AXIOM_ACCEPTED_SOURCE_COMMITS_ENV,
" AAAAaaaaAAAAaaaaAAAAaaaaAAAAaaaaAAAAaaaa , 1111111111111111111111111111111111111111 ,,",
);
let resolved = accepted_axiom_source_commits();
assert_eq!(resolved.len(), 2);
assert!(resolved.contains(&"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa".to_string()));
assert!(resolved.contains(&"1111111111111111111111111111111111111111".to_string()));
assert!(!resolved.contains(&"44b9a25dfbe5a93e64120f53b65730828d1af91c".to_string()));
match prior {
Some(value) => std::env::set_var(CORTEX_AXIOM_ACCEPTED_SOURCE_COMMITS_ENV, value),
None => std::env::remove_var(CORTEX_AXIOM_ACCEPTED_SOURCE_COMMITS_ENV),
}
}
}