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}