Skip to main content

adk_computer_use/contracts/
safety.rs

1//! Versioned cross-runtime deterministic safety corpus shared with the
2//! TypeScript fake-desktop harness.
3
4use serde::{Deserialize, Serialize};
5
6/// Versioned cross-runtime deterministic safety corpus.
7#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
8#[serde(rename_all = "camelCase")]
9pub struct SafetyCorpus {
10    /// Schema version of the corpus.
11    pub schema_version: u32,
12    /// Human-readable description of the corpus.
13    pub description: String,
14    /// The scenarios in the corpus.
15    pub scenarios: Vec<SafetyScenario>,
16}
17
18/// A single deterministic safety scenario and its expected outcome.
19#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
20#[serde(rename_all = "camelCase")]
21pub struct SafetyScenario {
22    /// Unique scenario identifier.
23    pub id: String,
24    /// The injected fault under test.
25    pub fault: String,
26    /// The expected outcome after the fault.
27    pub expected: SafetyExpectation,
28}
29
30/// Expected effects, restores, and status for a [`SafetyScenario`].
31#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
32#[serde(rename_all = "camelCase")]
33pub struct SafetyExpectation {
34    /// Expected session status, when asserted.
35    #[serde(skip_serializing_if = "Option::is_none")]
36    pub status: Option<String>,
37    /// Expected error, when asserted.
38    #[serde(skip_serializing_if = "Option::is_none")]
39    pub error: Option<String>,
40    /// Expected receipt status, when asserted.
41    #[serde(skip_serializing_if = "Option::is_none")]
42    pub receipt_status: Option<String>,
43    /// Expected number of physical effects.
44    pub effects: u32,
45    /// Expected number of restores/rollbacks.
46    pub restores: u32,
47    /// Expected number of effects on replay, when asserted.
48    #[serde(skip_serializing_if = "Option::is_none")]
49    pub replay_effects: Option<u32>,
50}