rhi

Coordinated trade for connected markets
git clone https://radroots.dev/git/rhi.git
Log | Files | Refs | README | LICENSE

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 }