Skip to main content

relay_knowledge/storage/contracts/
operations.rs

1use crate::domain::{
2    AuditStatus, GraphVersion, ProposalConflictSeverity, ProposalKind, ProposalProvenance,
3    ProposalState, ServiceOperatorState, WorkerKind,
4};
5
6/// Worker task input inserted after graph changes or service reconciliation.
7#[derive(Debug, Clone, PartialEq, Eq)]
8pub struct WorkerTaskSeed {
9    pub kind: WorkerKind,
10    pub source_scope: String,
11    pub evidence_id: Option<String>,
12    pub target_graph_version: GraphVersion,
13    pub input_fingerprint: String,
14    pub payload_json: String,
15    pub now_ms: u64,
16}
17
18/// Worker lease acquisition request.
19#[derive(Debug, Clone, PartialEq, Eq)]
20pub struct WorkerTaskClaimRequest {
21    pub kind: Option<WorkerKind>,
22    pub lease_owner: String,
23    pub lease_duration_ms: u64,
24    pub max_attempts: u32,
25    pub now_ms: u64,
26}
27
28/// Worker completion guarded by the active lease.
29#[derive(Debug, Clone, PartialEq, Eq)]
30pub struct WorkerTaskCompletion {
31    pub task_id: String,
32    pub lease_owner: String,
33    pub attempt_count: u32,
34    pub now_ms: u64,
35}
36
37/// Worker failure report for retry and dead-letter handling.
38#[derive(Debug, Clone, PartialEq, Eq)]
39pub struct WorkerTaskFailure {
40    pub task_id: String,
41    pub lease_owner: String,
42    pub attempt_count: u32,
43    pub error_kind: String,
44    pub error_message: String,
45    pub retry_backoff_ms: u64,
46    pub max_attempts: u32,
47    pub now_ms: u64,
48}
49
50/// New proposal to persist before manual approval.
51#[derive(Debug, Clone, PartialEq, Eq)]
52pub struct NewProposal {
53    pub proposal_id: String,
54    pub source_scope: String,
55    pub kind: ProposalKind,
56    pub title: String,
57    pub summary: String,
58    pub payload_json: String,
59    pub origin: String,
60    pub provenance: ProposalProvenance,
61    pub confidence_basis_points: u16,
62    pub conflicts: Vec<NewProposalConflict>,
63    pub now_ms: u64,
64}
65
66/// New proposal conflict to persist with a proposal.
67#[derive(Debug, Clone, PartialEq, Eq)]
68pub struct NewProposalConflict {
69    pub conflict_id: String,
70    pub existing_fact_kind: String,
71    pub existing_fact_id: String,
72    pub severity: ProposalConflictSeverity,
73    pub reason: String,
74}
75
76/// Proposal list filter.
77#[derive(Debug, Clone, PartialEq, Eq)]
78pub struct ProposalListRequest {
79    pub state: Option<ProposalState>,
80    pub limit: usize,
81}
82
83/// Proposal decision request.
84#[derive(Debug, Clone, PartialEq, Eq)]
85pub struct ProposalDecision {
86    pub proposal_id: String,
87    pub next_state: ProposalState,
88    pub actor: String,
89    pub reason: Option<String>,
90    pub now_ms: u64,
91}
92
93/// New durable audit event.
94#[derive(Debug, Clone, PartialEq, Eq)]
95pub struct NewAuditEvent {
96    pub operation: String,
97    pub interface: String,
98    pub request_id: String,
99    pub trace_id: String,
100    pub status: AuditStatus,
101    pub actor: Option<String>,
102    pub source_scope: Option<String>,
103    pub graph_version: u64,
104    pub detail_json: String,
105    pub message: Option<String>,
106    pub now_ms: u64,
107}
108
109/// Audit query filter.
110#[derive(Debug, Clone, PartialEq, Eq)]
111pub struct AuditQueryRequest {
112    pub operation: Option<String>,
113    pub limit: usize,
114}
115
116/// Service operator state update.
117#[derive(Debug, Clone, PartialEq, Eq)]
118pub struct ServiceOperatorUpdate {
119    pub state: ServiceOperatorState,
120    pub silent_updates_enabled: bool,
121    pub allowed_scopes: Vec<String>,
122    pub last_error: Option<String>,
123    pub now_ms: u64,
124}