Skip to main content

lash/
scenario_contracts.rs

1use lash_core::runtime::ScenarioContractSpec;
2
3pub const AGENT_SCENARIO_CONTRACTS: &[ScenarioContractSpec] = &[
4    ScenarioContractSpec {
5        suite: "agent",
6        test_name: "agent_scenario_foreground_labeled_tool_call",
7        display_name: "foreground labeled tool call",
8        owned_invariant: "Facade root turn, app tool execution, label graph, final value, and remote DTO round trip.",
9        semantic_oracle: "agent.foreground_tool_call_round_trip",
10        required_sim_evidence: &["tool_result", "provider_turn"],
11        oracle_id: "sim.oracle.scenario.agent-contract.v1",
12    },
13    ScenarioContractSpec {
14        suite: "agent",
15        test_name: "agent_scenario_started_process_labeled_tool_call",
16        display_name: "started process labeled tool call",
17        owned_invariant: "Started Lashlang process calling an app tool with process graph completion.",
18        semantic_oracle: "agent.started_process_tool_call_graph",
19        required_sim_evidence: &["process_wake", "tool_result", "provider_turn"],
20        oracle_id: "sim.oracle.scenario.agent-contract.v1",
21    },
22    ScenarioContractSpec {
23        suite: "agent",
24        test_name: "agent_scenario_process_durable_input_request_tool",
25        display_name: "durable input suspension",
26        owned_invariant: "Live durable input suspension, external resolution, process event, and final value.",
27        semantic_oracle: "agent.durable_input_suspension_resolution",
28        required_sim_evidence: &["durable_effect", "process_wake", "observer_reconnect"],
29        oracle_id: "sim.oracle.scenario.agent-contract.v1",
30    },
31    ScenarioContractSpec {
32        suite: "agent",
33        test_name: "agent_scenario_shell_nonzero_and_pipeline_results_are_data",
34        display_name: "shell nonzero and pipeline results are data",
35        owned_invariant: "Shell failures and pipelines remain data at the facade boundary.",
36        semantic_oracle: "agent.shell_results_are_data",
37        required_sim_evidence: &["exec_code", "tool_result"],
38        oracle_id: "sim.oracle.scenario.agent-contract.v1",
39    },
40    ScenarioContractSpec {
41        suite: "agent",
42        test_name: "agent_scenario_shell_output_survives_print_projection_in_variable",
43        display_name: "shell output survives print projection in variable",
44        owned_invariant: "Large shell output survives print projection and remains addressable.",
45        semantic_oracle: "agent.shell_output_print_projection_survives",
46        required_sim_evidence: &["exec_code", "provider_turn"],
47        oracle_id: "sim.oracle.scenario.agent-contract.v1",
48    },
49    ScenarioContractSpec {
50        suite: "agent",
51        test_name: "agent_scenario_started_process_labeled_subagent_spawn",
52        display_name: "started process labeled subagent spawn",
53        owned_invariant: "Started process spawns a subagent and records child session execution graphs.",
54        semantic_oracle: "agent.started_process_subagent_spawn",
55        required_sim_evidence: &["process_wake", "multi_session"],
56        oracle_id: "sim.oracle.scenario.agent-contract.v1",
57    },
58    ScenarioContractSpec {
59        suite: "agent",
60        test_name: "agent_scenario_nested_process_start_await",
61        display_name: "nested process start await",
62        owned_invariant: "Nested process start/await produces deterministic process ids and graph lineage.",
63        semantic_oracle: "agent.nested_process_start_await",
64        required_sim_evidence: &["process_wake", "multi_session"],
65        oracle_id: "sim.oracle.scenario.agent-contract.v1",
66    },
67    ScenarioContractSpec {
68        suite: "agent",
69        test_name: "agent_scenario_session_turn_process_child",
70        display_name: "session turn process child",
71        owned_invariant: "Host session-turn process API creates and awaits a child session turn.",
72        semantic_oracle: "agent.session_turn_process_child",
73        required_sim_evidence: &["process_wake", "provider_turn", "multi_session"],
74        oracle_id: "sim.oracle.scenario.agent-contract.v1",
75    },
76    ScenarioContractSpec {
77        suite: "agent",
78        test_name: "agent_scenario_failed_child_preserves_failure_graph",
79        display_name: "failed child preserves failure graph",
80        owned_invariant: "Child failure path preserves failure graph and avoids provider-exhaustion false failures.",
81        semantic_oracle: "agent.failed_child_preserves_failure_graph",
82        required_sim_evidence: &[
83            "worker_stale_completion",
84            "backend_failure",
85            "multi_session",
86        ],
87        oracle_id: "sim.oracle.scenario.agent-contract.v1",
88    },
89    ScenarioContractSpec {
90        suite: "agent",
91        test_name: "agent_scenario_parallel_spawn_and_join",
92        display_name: "parallel process spawn and join",
93        owned_invariant: "Parallel process starts join deterministically with unique process ids.",
94        semantic_oracle: "agent.parallel_spawn_and_join",
95        required_sim_evidence: &["process_wake", "worker_stale_completion", "multi_session"],
96        oracle_id: "sim.oracle.scenario.agent-contract.v1",
97    },
98    ScenarioContractSpec {
99        suite: "agent",
100        test_name: "agent_scenario_tuple_values_finish_as_json_arrays",
101        display_name: "tuple values finish as json arrays",
102        owned_invariant: "Facade final values preserve tuple-to-JSON array projection.",
103        semantic_oracle: "agent.tuple_values_finish_as_json_arrays",
104        required_sim_evidence: &["final_value"],
105        oracle_id: "sim.oracle.scenario.agent-contract.v1",
106    },
107];
108
109#[cfg(test)]
110mod tests {
111    use std::collections::BTreeSet;
112
113    use super::*;
114
115    #[test]
116    fn agent_scenario_contract_metadata_is_unique_and_complete() {
117        assert_eq!(AGENT_SCENARIO_CONTRACTS.len(), 11);
118        let mut names = BTreeSet::new();
119        for contract in AGENT_SCENARIO_CONTRACTS {
120            assert_eq!(contract.suite, "agent");
121            assert!(contract.test_name.starts_with("agent_scenario_"));
122            assert!(!contract.display_name.trim().is_empty());
123            assert!(!contract.owned_invariant.trim().is_empty());
124            assert!(contract.semantic_oracle.starts_with("agent."));
125            assert!(!contract.required_sim_evidence.is_empty());
126            assert_eq!(contract.oracle_id, "sim.oracle.scenario.agent-contract.v1");
127            assert!(names.insert(contract.test_name));
128        }
129    }
130}