Skip to main content

maple_runtime/types/
commitment.rs

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