Skip to main content

rustev_contract/
snapshot.rs

1//! Context snapshots, `rustev.snapshot/1` (spec 002, 3.7.3) and
2//! `rustev.snapshot/2` (spec 032, 3.1.1), whose entries may claim a grade.
3//!
4//! A snapshot is a list of entries, not a map, so two sources disagreeing
5//! about one field is representable and becomes `conflict` (E-07).
6
7use serde::{Deserialize, Serialize};
8use serde_json::Value;
9
10use crate::definition::ProvenanceClass;
11use crate::grade::Grade;
12use crate::ids::SnapshotId;
13use crate::limits::SNAPSHOT_V1;
14use crate::schema;
15use crate::time::Timestamp;
16
17#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, schemars::JsonSchema)]
18#[serde(deny_unknown_fields)]
19pub struct Snapshot {
20    pub schema: String,
21    pub entries: Vec<Entry>,
22}
23
24crate::document::versioned_document!(
25    Snapshot,
26    [schema::SNAPSHOT, schema::SNAPSHOT_V2],
27    "rustev.snapshot/1 or rustev.snapshot/2",
28    SNAPSHOT_V1,
29    SnapshotId
30);
31
32#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, schemars::JsonSchema)]
33#[serde(deny_unknown_fields)]
34pub struct Entry {
35    /// The declared input name.
36    pub field: String,
37    /// Decoded strictly against the input's declared type.
38    pub value: Value,
39    pub provenance: ProvenanceClass,
40    pub as_of_ms: Timestamp,
41    /// Which source supplied it; recorded, never trusted as authority.
42    pub source: String,
43    /// Snapshot 2: the grade the supplier observed; it can lower a grade,
44    /// never raise it (spec 032, 3.3.5).
45    #[serde(default, skip_serializing_if = "Option::is_none")]
46    pub grade: Option<Grade>,
47    /// Host-declared model producer, retained as evidence, never authorization.
48    #[serde(
49        default,
50        skip_serializing_if = "Option::is_none",
51        deserialize_with = "crate::screening::present"
52    )]
53    pub producer: Option<Producer>,
54}
55
56#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, schemars::JsonSchema)]
57#[serde(deny_unknown_fields)]
58pub struct Producer {
59    pub artifact_id: crate::ids::ArtifactId,
60    pub template_digest: TemplateDigest,
61    pub produced_at_ms: Timestamp,
62}
63#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, schemars::JsonSchema)]
64#[serde(rename_all = "snake_case")]
65pub enum TemplateDigest {
66    None,
67    #[serde(untagged)]
68    Digest(crate::ids::PromptTemplateId),
69}