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}