Skip to main content

lash_core/runtime/
scenario_contracts.rs

1#[derive(Clone, Copy, Debug, Eq, PartialEq, serde::Serialize)]
2pub struct ScenarioContractSpec {
3    pub suite: &'static str,
4    pub test_name: &'static str,
5    pub display_name: &'static str,
6    pub owned_invariant: &'static str,
7    pub semantic_oracle: &'static str,
8    pub required_sim_evidence: &'static [&'static str],
9    pub oracle_id: &'static str,
10}
11
12const RUNTIME_REQUIRED_EVIDENCE: &[&str] = &[
13    "queued_ingress",
14    "cancellation",
15    "process_wake",
16    "worker_stale_completion",
17    "lease_time",
18];
19
20pub const RUNTIME_SCENARIO_CONTRACTS: &[ScenarioContractSpec] = &[
21    ScenarioContractSpec {
22        suite: "runtime",
23        test_name: "runtime_scenario_drains_command_before_turn_work_and_commits_checkpoint",
24        display_name: "command before turn work",
25        owned_invariant: "Session-command gate, checkpoint persistence, stale queue completion rejection, final queue drain.",
26        semantic_oracle: "runtime.command_before_turn_work",
27        required_sim_evidence: RUNTIME_REQUIRED_EVIDENCE,
28        oracle_id: "sim.oracle.scenario.runtime-contract.v1",
29    },
30    ScenarioContractSpec {
31        suite: "runtime",
32        test_name: "runtime_scenario_command_only_queue_drain_completes_without_turn_work",
33        display_name: "command-only queue drain",
34        owned_invariant: "Command-only queued work claims no turn work and explicitly commits.",
35        semantic_oracle: "runtime.command_only_queue_drain",
36        required_sim_evidence: RUNTIME_REQUIRED_EVIDENCE,
37        oracle_id: "sim.oracle.scenario.runtime-contract.v1",
38    },
39    ScenarioContractSpec {
40        suite: "runtime",
41        test_name: "runtime_scenario_queued_work_claim_keeps_pending_next_turn_input",
42        display_name: "queued work claim keeps pending next-turn input",
43        owned_invariant: "Queued turn work does not consume pending next-turn input.",
44        semantic_oracle: "runtime.queued_work_keeps_pending_input",
45        required_sim_evidence: RUNTIME_REQUIRED_EVIDENCE,
46        oracle_id: "sim.oracle.scenario.runtime-contract.v1",
47    },
48    ScenarioContractSpec {
49        suite: "runtime",
50        test_name: "runtime_scenario_claims_process_wake_at_active_checkpoint_boundary",
51        display_name: "active checkpoint process wake claim",
52        owned_invariant: "Process-wake turn work is eligible at the active-checkpoint claim boundary.",
53        semantic_oracle: "runtime.process_wake_claim",
54        required_sim_evidence: RUNTIME_REQUIRED_EVIDENCE,
55        oracle_id: "sim.oracle.scenario.runtime-contract.v1",
56    },
57    ScenarioContractSpec {
58        suite: "runtime",
59        test_name: "runtime_scenario_claims_queued_turn_input_and_completes_it",
60        display_name: "queued turn input completion",
61        owned_invariant: "Next-turn pending inputs are claimed, hidden while live, and completed by commit.",
62        semantic_oracle: "runtime.queued_turn_input_completion",
63        required_sim_evidence: RUNTIME_REQUIRED_EVIDENCE,
64        oracle_id: "sim.oracle.scenario.runtime-contract.v1",
65    },
66    ScenarioContractSpec {
67        suite: "runtime",
68        test_name: "runtime_scenario_observation_replay_keeps_original_turn_input",
69        display_name: "observation replay preserves live turn input",
70        owned_invariant: "Source-key observation replay preserves the original live input payload and id.",
71        semantic_oracle: "runtime.observation_replay_preserves_input",
72        required_sim_evidence: RUNTIME_REQUIRED_EVIDENCE,
73        oracle_id: "sim.oracle.scenario.runtime-contract.v1",
74    },
75    ScenarioContractSpec {
76        suite: "runtime",
77        test_name: "runtime_scenario_defers_checkpoint_turn_input_and_respects_cancel",
78        display_name: "checkpoint redrive cancel",
79        owned_invariant: "Active-turn input deferral, cancellation after deferral, and no later idle claim.",
80        semantic_oracle: "runtime.checkpoint_redrive_cancel",
81        required_sim_evidence: RUNTIME_REQUIRED_EVIDENCE,
82        oracle_id: "sim.oracle.scenario.runtime-contract.v1",
83    },
84    ScenarioContractSpec {
85        suite: "runtime",
86        test_name: "runtime_scenario_rejects_commit_after_session_lease_release",
87        display_name: "session lease release fault",
88        owned_invariant: "Released session lease/fence rejects a follow-up runtime commit.",
89        semantic_oracle: "runtime.lease_release_rejects_commit",
90        required_sim_evidence: RUNTIME_REQUIRED_EVIDENCE,
91        oracle_id: "sim.oracle.scenario.runtime-contract.v1",
92    },
93    ScenarioContractSpec {
94        suite: "runtime",
95        test_name: "runtime_scenario_reclaims_dead_session_lease_and_rejects_stale_observation",
96        display_name: "dead session lease reclaim",
97        owned_invariant: "Dead local holder lease reclaim advances the fence and stale observed-holder reclaim stays busy.",
98        semantic_oracle: "runtime.dead_lease_reclaim_rejects_stale",
99        required_sim_evidence: RUNTIME_REQUIRED_EVIDENCE,
100        oracle_id: "sim.oracle.scenario.runtime-contract.v1",
101    },
102];
103
104#[cfg(test)]
105mod tests {
106    use std::collections::BTreeSet;
107
108    use super::*;
109
110    #[test]
111    fn runtime_scenario_contract_metadata_is_unique_and_complete() {
112        assert_eq!(RUNTIME_SCENARIO_CONTRACTS.len(), 9);
113        let mut names = BTreeSet::new();
114        for contract in RUNTIME_SCENARIO_CONTRACTS {
115            assert_eq!(contract.suite, "runtime");
116            assert!(contract.test_name.starts_with("runtime_scenario_"));
117            assert!(!contract.display_name.trim().is_empty());
118            assert!(!contract.owned_invariant.trim().is_empty());
119            assert!(contract.semantic_oracle.starts_with("runtime."));
120            assert!(!contract.required_sim_evidence.is_empty());
121            assert_eq!(
122                contract.oracle_id,
123                "sim.oracle.scenario.runtime-contract.v1"
124            );
125            assert!(names.insert(contract.test_name));
126        }
127    }
128}