Skip to main content

maple_runtime/types/
commitment.rs

1//! Commitment and consequence types
2
3use serde::{Deserialize, Serialize};
4use super::ids::{CommitmentId, ResonatorId};
5use super::temporal::TemporalAnchor;
6
7/// A commitment made by a Resonator
8///
9/// ARCHITECTURAL RULE: No consequence may occur without an explicit commitment.
10#[derive(Debug, Clone, Serialize, Deserialize)]
11pub struct Commitment {
12    pub id: CommitmentId,
13    pub resonator: ResonatorId,
14
15    /// What is being committed to?
16    pub content: CommitmentContent,
17
18    /// When was this commitment made?
19    pub created_at: TemporalAnchor,
20
21    /// Current status
22    pub status: CommitmentStatus,
23
24    /// Audit trail (if required by profile)
25    pub audit_trail: Option<AuditTrail>,
26
27    /// Risk assessment (if required by profile)
28    pub risk_assessment: Option<RiskAssessment>,
29}
30
31/// What is the Resonator committing to?
32#[derive(Debug, Clone, Serialize, Deserialize)]
33pub enum CommitmentContent {
34    /// Commitment to perform an action
35    Action {
36        description: String,
37        reversible: bool,
38    },
39
40    /// Commitment to maintain a state
41    State {
42        description: String,
43        duration: Option<u64>,
44    },
45
46    /// Commitment to respect a boundary
47    Boundary {
48        description: String,
49    },
50
51    /// Commitment to deliver a result
52    Result {
53        description: String,
54        deadline: Option<TemporalAnchor>,
55    },
56}
57
58/// Status of a commitment
59#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
60pub enum CommitmentStatus {
61    /// Commitment is pending execution
62    Pending,
63
64    /// Commitment is currently being fulfilled
65    Active,
66
67    /// Commitment has been fulfilled
68    Fulfilled,
69
70    /// Commitment was violated
71    Violated,
72
73    /// Commitment was revoked (with consent)
74    Revoked,
75}
76
77/// Audit trail for accountability
78#[derive(Debug, Clone, Serialize, Deserialize)]
79pub struct AuditTrail {
80    /// Events in the audit trail
81    pub events: Vec<AuditEvent>,
82
83    /// Digital signature (for non-repudiation)
84    pub signature: Option<Vec<u8>>,
85}
86
87/// An event in the audit trail
88#[derive(Debug, Clone, Serialize, Deserialize)]
89pub struct AuditEvent {
90    pub timestamp: TemporalAnchor,
91    pub event_type: AuditEventType,
92    pub description: String,
93}
94
95#[derive(Debug, Clone, Serialize, Deserialize)]
96pub enum AuditEventType {
97    Created,
98    Activated,
99    Progress,
100    Fulfilled,
101    Violated,
102    Revoked,
103}
104
105/// Risk assessment for financial operations
106#[derive(Debug, Clone, Serialize, Deserialize)]
107pub struct RiskAssessment {
108    /// Risk level (0.0 = no risk, 1.0 = maximum risk)
109    pub risk_level: f64,
110
111    /// Maximum potential impact
112    pub max_impact: Option<MonetaryValue>,
113
114    /// Mitigation strategies
115    pub mitigations: Vec<String>,
116
117    /// Approval required?
118    pub requires_approval: bool,
119}
120
121/// Monetary value (for iBank)
122#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
123pub struct MonetaryValue {
124    /// Amount in smallest unit (e.g., cents)
125    pub amount: i64,
126
127    /// Currency code (ISO 4217)
128    pub currency: Currency,
129}
130
131impl MonetaryValue {
132    pub fn new(amount: i64) -> Self {
133        Self {
134            amount,
135            currency: Currency::USD,
136        }
137    }
138}
139
140#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
141pub enum Currency {
142    USD,
143    EUR,
144    GBP,
145    JPY,
146    CNY,
147}
148
149/// Configuration for commitment management
150#[derive(Debug, Clone, Serialize, Deserialize)]
151pub struct CommitmentConfig {
152    /// Require audit trail?
153    pub require_audit_trail: bool,
154
155    /// Require risk assessment?
156    pub require_risk_assessment: bool,
157
158    /// Maximum consequence value (for iBank)
159    pub max_consequence_value: Option<MonetaryValue>,
160
161    /// Enable commitment revocation?
162    pub allow_revocation: bool,
163
164    /// Require consent for revocation?
165    pub require_consent_for_revocation: bool,
166}
167
168impl Default for CommitmentConfig {
169    fn default() -> Self {
170        Self {
171            require_audit_trail: false,
172            require_risk_assessment: false,
173            max_consequence_value: None,
174            allow_revocation: true,
175            require_consent_for_revocation: true,
176        }
177    }
178}
179
180/// Consequence of a commitment
181#[derive(Debug, Clone, Serialize, Deserialize)]
182pub struct Consequence {
183    /// Associated commitment
184    pub commitment_id: CommitmentId,
185
186    /// What happened?
187    pub outcome: ConsequenceOutcome,
188
189    /// When did it happen?
190    pub occurred_at: TemporalAnchor,
191
192    /// Was it reversible?
193    pub reversible: bool,
194
195    /// Reversal record (if reversed)
196    pub reversal: Option<ReversalRecord>,
197}
198
199#[derive(Debug, Clone, Serialize, Deserialize)]
200pub enum ConsequenceOutcome {
201    Success {
202        description: String,
203        impact: Option<String>,
204    },
205    Failure {
206        description: String,
207        reason: String,
208    },
209    Partial {
210        description: String,
211        completion_rate: f64,
212    },
213}
214
215#[derive(Debug, Clone, Serialize, Deserialize)]
216pub struct ReversalRecord {
217    pub reversed_at: TemporalAnchor,
218    pub reversal_method: String,
219    pub successful: bool,
220}