services_hardening_reconciliation_job_contract.rs (4030B)
1 #![forbid(unsafe_code)] 2 3 use rhi::{RHI_RECONCILIATION_JOB_CONTRACT_VERSION, RHI_RECONCILIATION_JOB_MAX_ACTIVE}; 4 use serde_json::json; 5 6 const CONTRACT: &str = include_str!("../contracts/services_hardening/reconciliation_jobs.v1.json"); 7 const LIB_SOURCE: &str = include_str!("../src/lib.rs"); 8 const JOB_SOURCE: &str = include_str!("../src/reconciliation_job.rs"); 9 const README: &str = include_str!("../README"); 10 11 #[test] 12 fn machine_contract_freezes_the_complete_step_187_boundary() { 13 let contract: serde_json::Value = serde_json::from_str(CONTRACT).expect("contract"); 14 assert_eq!(contract["schema"], "radroots.rhi.reconciliation-jobs"); 15 assert_eq!(contract["schema_version"], 1); 16 assert_eq!( 17 contract["contract_version"], 18 RHI_RECONCILIATION_JOB_CONTRACT_VERSION 19 ); 20 assert_eq!(contract["state_schema_version"], 5); 21 assert_eq!(contract["backing_table"], "reconciliation_jobs"); 22 assert_eq!( 23 contract["job_identity"], 24 json!({ 25 "algorithm": "sha256", 26 "domain": "radroots.rhi.reconciliation_job.v1\\0", 27 "preimage": [ 28 "trade_id_16_bytes", 29 "input_generation_u64_be", 30 "evidence_policy_sha256_32_bytes" 31 ] 32 }) 33 ); 34 assert_eq!( 35 contract["active_job_bound"]["absolute_maximum"], 36 RHI_RECONCILIATION_JOB_MAX_ACTIVE 37 ); 38 assert_eq!( 39 contract["states"], 40 json!(["ready", "leased", "exhausted", "superseded", "completed"]) 41 ); 42 assert_eq!( 43 contract["injected_authority"], 44 json!(["wall_time_unix_ms", "lease_owner", "retry_jitter_ms"]) 45 ); 46 assert_eq!( 47 contract["state_shape_guard"], 48 json!({ 49 "introduced_schema_version": 8, 50 "historical_scan": "forward_only_fail_closed", 51 "invalid_rows_repaired_or_deleted": false, 52 "insert_trigger": "reconciliation_jobs_shape_guard_insert", 53 "update_trigger": "reconciliation_jobs_shape_guard_update", 54 "ready_requires_nonnull_next_attempt": true, 55 "leased_requires_nonnull_owner_and_expiry": true, 56 "terminal_requires_null_schedule_and_lease": true 57 }) 58 ); 59 for forbidden in [ 60 "ambient_clock", 61 "ambient_entropy", 62 "network_io", 63 "source_query_inside_transaction", 64 "unbounded_queue", 65 "raw_sqlite_handle", 66 "caller_selected_job_id", 67 "caller_selected_next_attempt_timestamp", 68 "delete_job", 69 ] { 70 assert!( 71 contract["forbidden"] 72 .as_array() 73 .expect("forbidden") 74 .iter() 75 .any(|value| value == forbidden), 76 "missing {forbidden}" 77 ); 78 } 79 assert_eq!( 80 contract["deferred"], 81 json!([ 82 "per_source_attempt_inventory", 83 "source_execution", 84 "source_completion_commit", 85 "manifest", 86 "reducer", 87 "attestation", 88 "publication" 89 ]) 90 ); 91 } 92 93 #[test] 94 fn module_and_sqlite_authority_remain_private() { 95 assert!(LIB_SOURCE.contains("mod reconciliation_job;")); 96 assert!(!LIB_SOURCE.contains("pub mod reconciliation_job;")); 97 assert!(LIB_SOURCE.contains("RhiReconciliationJobPolicy")); 98 assert!(README.contains("## Durable reconciliation jobs")); 99 assert!(README.contains( 100 "[`reconciliation_jobs.v1.json`](contracts/services_hardening/reconciliation_jobs.v1.json)" 101 )); 102 for forbidden in [ 103 "pub fn sqlite", 104 "pub fn transaction", 105 "pub fn connection", 106 "pub fn into_inner", 107 "pub fn owner", 108 "pub fn from_job_id", 109 "std::time::", 110 "SystemTime", 111 "thread_rng", 112 "OsRng", 113 "radroots_transport", 114 ] { 115 assert!( 116 !JOB_SOURCE.contains(forbidden), 117 "forbidden job authority {forbidden}" 118 ); 119 } 120 assert!(JOB_SOURCE.contains("ServiceSqliteTransaction")); 121 }