services_hardening_reconciliation_commit_contract.rs (3581B)
1 #![forbid(unsafe_code)] 2 3 use rhi::RHI_RECONCILIATION_COMMIT_CONTRACT_VERSION; 4 use serde_json::json; 5 6 const CONTRACT: &str = 7 include_str!("../contracts/services_hardening/reconciliation_commit.v1.json"); 8 const ROOT: &str = include_str!("../src/lib.rs"); 9 const SOURCE: &str = include_str!("../src/reconciliation_commit.rs"); 10 const README: &str = include_str!("../README"); 11 12 #[test] 13 fn machine_contract_freezes_the_complete_step_190_boundary() { 14 let contract: serde_json::Value = serde_json::from_str(CONTRACT).expect("contract"); 15 assert_eq!(contract["schema"], "radroots.rhi.reconciliation-commit"); 16 assert_eq!(contract["schema_version"], 1); 17 assert_eq!( 18 contract["contract_version"], 19 RHI_RECONCILIATION_COMMIT_CONTRACT_VERSION 20 ); 21 assert_eq!(contract["state_schema_version"], 6); 22 assert_eq!( 23 contract["transaction"]["fences_before_mutation"], 24 json!([ 25 "exact_live_lease_row", 26 "exact_trade_dirty_generation", 27 "exact_evidence_policy_digest", 28 "exact_per_source_prior_checkpoint" 29 ]) 30 ); 31 assert_eq!( 32 contract["checkpoint"]["advance_only_when"], 33 "completion_is_complete_and_candidate_is_strictly_newer_than_prior" 34 ); 35 assert_eq!( 36 contract["checkpoint"]["public_evidence"], 37 "sealed_and_minted_only_after_durable_commit_confirmation" 38 ); 39 assert_eq!( 40 contract["dirty_generation"]["advance_count_maximum_per_attempt"], 41 1 42 ); 43 assert_eq!( 44 contract["idempotency"]["lost_success_retry"], 45 "checked_before_live_lease_and_generation_fences" 46 ); 47 assert_eq!( 48 contract["idempotency"]["source_inventory_identity"], 49 "domain_separated_sha256_over_exact_ordered_persisted_facts_and_provenance" 50 ); 51 assert_eq!(contract["effects"]["source_or_relay"], false); 52 assert_eq!(contract["effects"]["ambient_clock"], false); 53 } 54 55 #[test] 56 fn commit_boundary_is_private_bounded_transactional_and_documented() { 57 assert!(ROOT.contains("mod reconciliation_commit;")); 58 assert!(!ROOT.contains("pub mod reconciliation_commit;")); 59 for required in [ 60 "RhiReconciliationCommitError", 61 "RhiReconciliationCommitErrorKind", 62 "RhiReconciliationSourceCommitOutcome", 63 "RHI_RECONCILIATION_COMMIT_CONTRACT_VERSION", 64 ] { 65 assert!(ROOT.contains(required), "root API is missing {required}"); 66 } 67 for required in [ 68 ".take(plan.requests().len().saturating_add(1))", 69 "validate_exact_lease(transaction, lease)", 70 "reconcile_existing(transaction, &plan, &parts)", 71 "SOURCE_INVENTORY_DIGEST_DOMAIN", 72 "accepted_inventory_sha256", 73 "advance_dirty_generation(", 74 "write_checkpoint(", 75 "committed_cursor_evidence(", 76 "ServiceSqliteTransactionErrorKind::CommitOutcomeUnknown", 77 ] { 78 assert!( 79 SOURCE.contains(required), 80 "commit boundary is missing {required}" 81 ); 82 } 83 for forbidden in [ 84 "std::fs", 85 "std::net", 86 "tokio::spawn", 87 "SystemTime", 88 "thread_rng", 89 "OsRng", 90 "pub fn transaction", 91 "pub fn sqlite_host", 92 ] { 93 assert!( 94 !SOURCE.contains(forbidden), 95 "commit boundary gained forbidden authority {forbidden}" 96 ); 97 } 98 assert!(README.contains("## Atomic reconciliation result commit")); 99 assert!(README.contains( 100 "[`reconciliation_commit.v1.json`](contracts/services_hardening/reconciliation_commit.v1.json)" 101 )); 102 }