rhi

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

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 }