services_hardening_reconciliation_attempt_contract.rs (4522B)
1 #![forbid(unsafe_code)] 2 3 use rhi::{RHI_RECONCILIATION_ATTEMPT_CONTRACT_VERSION, RHI_RECONCILIATION_ATTEMPT_MAX_SOURCES}; 4 use serde_json::json; 5 6 const CONTRACT: &str = 7 include_str!("../contracts/services_hardening/reconciliation_attempts.v1.json"); 8 const LIB_SOURCE: &str = include_str!("../src/lib.rs"); 9 const ATTEMPT_SOURCE: &str = include_str!("../src/reconciliation_attempt.rs"); 10 const README: &str = include_str!("../README"); 11 12 #[test] 13 fn machine_contract_freezes_the_complete_step_188_boundary() { 14 let contract: serde_json::Value = serde_json::from_str(CONTRACT).expect("contract"); 15 assert_eq!(contract["schema"], "radroots.rhi.reconciliation-attempts"); 16 assert_eq!(contract["schema_version"], 1); 17 assert_eq!( 18 contract["contract_version"], 19 RHI_RECONCILIATION_ATTEMPT_CONTRACT_VERSION 20 ); 21 assert_eq!(contract["state_schema_version"], 5); 22 assert_eq!( 23 contract["configuration_authority"], 24 "contracts/services_hardening/evidence_policy.v1.json" 25 ); 26 assert_eq!( 27 contract["attempt_identity"], 28 json!({ 29 "algorithm": "sha256", 30 "domain": "radroots.rhi.reconciliation_attempt.v1\\0", 31 "preimage": ["job_id_32_bytes", "attempt_count_u16_be"] 32 }) 33 ); 34 assert_eq!( 35 contract["selector_identity"]["event_kinds"], 36 json!([3470, 3471, 3472, 3473, 3474]) 37 ); 38 assert_eq!(contract["selector_identity"]["exact_tag"], "#d"); 39 assert_eq!( 40 contract["selector_identity"]["cursor_binding"], 41 "contracts/services_hardening/reconciliation_replay.v1.json" 42 ); 43 assert_eq!( 44 contract["plan"]["source_count_maximum"], 45 RHI_RECONCILIATION_ATTEMPT_MAX_SOURCES 46 ); 47 assert_eq!(contract["plan"]["result_event_maximum"], 4_096); 48 assert_eq!( 49 contract["plan"]["result_original_event_bytes_maximum"], 50 8_388_608 51 ); 52 assert!( 53 contract["source_request"] 54 .as_array() 55 .expect("source-request fields") 56 .iter() 57 .any(|field| field == "trade_id") 58 ); 59 assert_eq!( 60 contract["completion_codes"], 61 json!([ 62 "complete", 63 "incomplete_timeout", 64 "incomplete_unavailable", 65 "incomplete_resource_limit", 66 "incomplete_unknown", 67 "unsupported" 68 ]) 69 ); 70 assert_eq!( 71 contract["result"]["inventory_ingestion_bound"], 72 "configured_source_count_plus_one" 73 ); 74 assert_eq!(contract["effects"]["sqlite"], false); 75 assert_eq!(contract["effects"]["source_or_relay"], false); 76 assert_eq!(contract["effects"]["ambient_clock"], false); 77 assert_eq!(contract["effects"]["ambient_entropy"], false); 78 assert_eq!( 79 contract["deferred"], 80 json!([ 81 "source_execution", 82 "durable_source_result_commit", 83 "checkpoint_advance", 84 "manifest", 85 "reducer", 86 "attestation", 87 "publication" 88 ]) 89 ); 90 } 91 92 #[test] 93 fn model_is_private_bounded_pure_and_documented() { 94 assert!(LIB_SOURCE.contains("mod reconciliation_attempt;")); 95 assert!(!LIB_SOURCE.contains("pub mod reconciliation_attempt;")); 96 for required in [ 97 "RhiReconciliationAttemptPlan", 98 "RhiReconciliationSourceRequest", 99 "RhiReconciliationSourceResult", 100 "RhiReconciliationAttemptResults", 101 ] { 102 assert!( 103 LIB_SOURCE.contains(required), 104 "root API is missing {required}" 105 ); 106 } 107 assert!(README.contains("## Bounded reconciliation source attempts")); 108 assert!(README.contains( 109 "[`reconciliation_attempts.v1.json`](contracts/services_hardening/reconciliation_attempts.v1.json)" 110 )); 111 for required in [ 112 ".take(plan.requests.len().saturating_add(1))", 113 "attempt_started_at >= lease.lease_expires()", 114 "state_metadata::evidence_policy_digest(normalized)", 115 "outcome == RhiTradeSourceCompletion::IncompleteTimeout", 116 ] { 117 assert!( 118 ATTEMPT_SOURCE.contains(required), 119 "attempt boundary is missing {required}" 120 ); 121 } 122 for forbidden in [ 123 "sqlx::", 124 "std::fs", 125 "std::net", 126 "tokio::", 127 "SystemTime", 128 "thread_rng", 129 "OsRng", 130 "RhiTradeSourceCursor", 131 ] { 132 assert!( 133 !ATTEMPT_SOURCE.contains(forbidden), 134 "attempt model gained deferred authority {forbidden}" 135 ); 136 } 137 }