Skip to main content

canic_host/deployment_truth/
model.rs

1use serde::{Deserialize, Serialize};
2
3///
4/// DeploymentPlanV1
5///
6#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
7pub struct DeploymentPlanV1 {
8    pub schema_version: u32,
9    pub plan_id: String,
10    pub deployment_identity: DeploymentIdentityV1,
11    pub trust_domain: TrustDomainV1,
12    pub fleet_template: String,
13    pub runtime_variant: String,
14    pub authority_profile: AuthorityProfileV1,
15    pub role_artifacts: Vec<RoleArtifactV1>,
16    pub expected_canisters: Vec<ExpectedCanisterV1>,
17    pub expected_pool: Vec<ExpectedPoolCanisterV1>,
18    pub expected_verifier_readiness: VerifierReadinessExpectationV1,
19    pub unresolved_assumptions: Vec<DeploymentAssumptionV1>,
20}
21
22///
23/// DeploymentInventoryV1
24///
25#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
26pub struct DeploymentInventoryV1 {
27    pub schema_version: u32,
28    pub inventory_id: String,
29    pub observed_at: String,
30    pub observed_identity: Option<DeploymentIdentityV1>,
31    pub local_config: LocalDeploymentConfigV1,
32    pub observed_canisters: Vec<ObservedCanisterV1>,
33    pub observed_pool: Vec<ObservedPoolCanisterV1>,
34    pub observed_artifacts: Vec<ObservedArtifactV1>,
35    pub observed_verifier_readiness: VerifierReadinessObservationV1,
36    pub unresolved_observations: Vec<DeploymentObservationGapV1>,
37}
38
39///
40/// DeploymentReceiptV1
41///
42#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
43pub struct DeploymentReceiptV1 {
44    pub schema_version: u32,
45    pub operation_id: String,
46    pub plan_id: String,
47    pub execution_context: Option<DeploymentExecutionContextV1>,
48    pub operation_status: DeploymentExecutionStatusV1,
49    pub started_at: String,
50    pub finished_at: Option<String>,
51    pub operator_principal: Option<String>,
52    pub root_principal: Option<String>,
53    pub previous_observed_deployment_epoch: Option<u64>,
54    pub phase_receipts: Vec<PhaseReceiptV1>,
55    pub role_phase_receipts: Vec<RolePhaseReceiptV1>,
56    pub final_inventory_id: Option<String>,
57    pub command_result: DeploymentCommandResultV1,
58}
59
60///
61/// DeploymentExecutionContextV1
62///
63#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
64pub struct DeploymentExecutionContextV1 {
65    pub workspace_root: Option<String>,
66    pub icp_root: Option<String>,
67    pub artifact_roots: Vec<String>,
68    pub backend: DeploymentExecutorBackendV1,
69    pub backend_capabilities: Vec<DeploymentExecutorCapabilityV1>,
70}
71
72///
73/// DeploymentExecutionPreflightV1
74///
75#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
76pub struct DeploymentExecutionPreflightV1 {
77    pub schema_version: u32,
78    pub plan_id: String,
79    pub safety_report_id: String,
80    pub authority_plan_id: String,
81    pub backend: DeploymentExecutorBackendV1,
82    pub status: DeploymentExecutionPreflightStatusV1,
83    pub planned_phases: Vec<String>,
84    pub required_capabilities: Vec<DeploymentExecutorCapabilityV1>,
85    pub missing_capabilities: Vec<DeploymentExecutorCapabilityV1>,
86    pub blockers: Vec<SafetyFindingV1>,
87}
88
89///
90/// DeploymentExecutionPreflightStatusV1
91///
92#[derive(Clone, Copy, Debug, Deserialize, Eq, PartialEq, Serialize)]
93pub enum DeploymentExecutionPreflightStatusV1 {
94    Ready,
95    Blocked,
96}
97
98///
99/// DeploymentExecutorBackendV1
100///
101#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
102pub enum DeploymentExecutorBackendV1 {
103    CurrentCli,
104    PocketIc,
105    DirectAgent,
106    Other { name: String },
107}
108
109///
110/// DeploymentExecutorCapabilityV1
111///
112#[derive(Clone, Copy, Debug, Deserialize, Eq, Ord, PartialEq, PartialOrd, Serialize)]
113pub enum DeploymentExecutorCapabilityV1 {
114    CreateCanister,
115    CanisterStatus,
116    UpdateSettings,
117    InstallCode,
118    Call,
119    Query,
120    StageArtifact,
121}
122
123///
124/// AuthorityReceiptV1
125///
126#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
127pub struct AuthorityReceiptV1 {
128    pub schema_version: u32,
129    pub operation_id: String,
130    pub check_id: Option<String>,
131    pub reconciliation_plan_id: String,
132    pub authority_report_id: String,
133    pub inventory_id: String,
134    pub authority_profile_hash: Option<String>,
135    pub operation_status: DeploymentExecutionStatusV1,
136    pub started_at: String,
137    pub finished_at: Option<String>,
138    pub attempted_actions: Vec<AuthorityAttemptedActionV1>,
139    pub verified_controller_observations: Vec<AuthorityControllerObservationV1>,
140    pub hard_failures: Vec<SafetyFindingV1>,
141    pub unresolved_observation_gaps: Vec<DeploymentObservationGapV1>,
142    pub unresolved_external_actions: Vec<AuthorityExternalActionV1>,
143    pub command_result: DeploymentCommandResultV1,
144}
145
146///
147/// AuthorityDryRunEvidenceV1
148///
149#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
150pub struct AuthorityDryRunEvidenceV1 {
151    pub schema_version: u32,
152    pub evidence_id: String,
153    pub check_id: String,
154    pub generated_at: String,
155    pub reconciliation_plan: AuthorityReconciliationPlanV1,
156    pub authority_report: AuthorityReportV1,
157    pub authority_receipt: AuthorityReceiptV1,
158}
159
160///
161/// AuthorityAttemptedActionV1
162///
163#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
164pub struct AuthorityAttemptedActionV1 {
165    pub subject: String,
166    pub canister_id: Option<String>,
167    pub role: Option<String>,
168    pub action: AuthorityActionV1,
169    pub result: RolePhaseResultV1,
170    pub error: Option<String>,
171}
172
173///
174/// AuthorityControllerObservationV1
175///
176#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
177pub struct AuthorityControllerObservationV1 {
178    pub subject: String,
179    pub canister_id: Option<String>,
180    pub role: Option<String>,
181    pub state: AuthorityReconciliationStateV1,
182    pub action: AuthorityActionV1,
183    pub observed_controllers: Vec<String>,
184    pub desired_controllers: Vec<String>,
185    pub controller_delta: AuthorityControllerDeltaV1,
186}
187
188///
189/// RoleArtifactManifestV1
190///
191#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
192pub struct RoleArtifactManifestV1 {
193    pub schema_version: u32,
194    pub manifest_id: String,
195    pub network: String,
196    pub artifact_root: Option<String>,
197    pub role_artifacts: Vec<RoleArtifactV1>,
198    pub unresolved_artifacts: Vec<DeploymentObservationGapV1>,
199}
200
201///
202/// DeploymentDiffV1
203///
204#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
205pub struct DeploymentDiffV1 {
206    pub schema_version: u32,
207    pub plan_identity: DeploymentIdentityV1,
208    pub observed_identity: Option<DeploymentIdentityV1>,
209    pub artifact_diff: Vec<DiffItemV1>,
210    pub controller_diff: Vec<DiffItemV1>,
211    pub pool_diff: Vec<DiffItemV1>,
212    pub embedded_config_diff: Vec<DiffItemV1>,
213    pub module_hash_diff: Vec<DiffItemV1>,
214    pub verifier_readiness_diff: Vec<DiffItemV1>,
215    pub resume_safety: ResumeSafetyV1,
216    pub hard_failures: Vec<SafetyFindingV1>,
217    pub warnings: Vec<SafetyFindingV1>,
218    pub resumable_phases: Vec<String>,
219}
220
221///
222/// SafetyReportV1
223///
224#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
225pub struct SafetyReportV1 {
226    pub schema_version: u32,
227    pub report_id: String,
228    pub diff_id: Option<String>,
229    pub status: SafetyStatusV1,
230    pub summary: String,
231    pub hard_failures: Vec<SafetyFindingV1>,
232    pub warnings: Vec<SafetyFindingV1>,
233    pub next_actions: Vec<String>,
234}
235
236///
237/// DeploymentCheckV1
238///
239#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
240pub struct DeploymentCheckV1 {
241    pub schema_version: u32,
242    pub check_id: String,
243    pub plan: DeploymentPlanV1,
244    pub inventory: DeploymentInventoryV1,
245    pub diff: DeploymentDiffV1,
246    pub report: SafetyReportV1,
247}
248
249///
250/// AuthorityReconciliationPlanV1
251///
252#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
253pub struct AuthorityReconciliationPlanV1 {
254    pub schema_version: u32,
255    pub plan_id: String,
256    pub inventory_id: String,
257    pub authority_profile_hash: Option<String>,
258    pub canister_actions: Vec<CanisterAuthorityActionV1>,
259    pub automatic_actions: Vec<AuthorityAutomaticActionV1>,
260    pub hard_failures: Vec<SafetyFindingV1>,
261    pub external_actions_required: Vec<AuthorityExternalActionV1>,
262}
263
264///
265/// AuthorityAutomaticActionV1
266///
267#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
268pub struct AuthorityAutomaticActionV1 {
269    pub subject: String,
270    pub canister_id: String,
271    pub role: Option<String>,
272    pub action: AuthorityActionV1,
273    pub observed_controllers: Vec<String>,
274    pub desired_controllers: Vec<String>,
275    pub controller_delta: AuthorityControllerDeltaV1,
276    pub reason: String,
277}
278
279///
280/// AuthorityControllerDeltaV1
281///
282#[derive(Clone, Debug, Default, Deserialize, Eq, PartialEq, Serialize)]
283pub struct AuthorityControllerDeltaV1 {
284    pub add_controllers: Vec<String>,
285    pub remove_controllers: Vec<String>,
286}
287
288///
289/// AuthorityReportV1
290///
291#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
292pub struct AuthorityReportV1 {
293    pub schema_version: u32,
294    pub report_id: String,
295    pub check_id: Option<String>,
296    pub reconciliation_plan_id: String,
297    pub inventory_id: String,
298    pub authority_profile_hash: Option<String>,
299    pub status: SafetyStatusV1,
300    pub summary: String,
301    pub counts: AuthorityReportCountsV1,
302    pub apply_readiness: AuthorityApplyReadinessV1,
303    pub action_counts: Vec<AuthorityActionCountV1>,
304    pub control_class_counts: Vec<AuthorityControlClassCountV1>,
305    pub observation_gaps: Vec<DeploymentObservationGapV1>,
306    pub automatic_actions: Vec<AuthorityAutomaticActionV1>,
307    pub hard_failures: Vec<SafetyFindingV1>,
308    pub external_actions_required: Vec<AuthorityExternalActionV1>,
309    pub next_actions: Vec<String>,
310}
311
312///
313/// AuthorityApplyReadinessV1
314///
315#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
316pub struct AuthorityApplyReadinessV1 {
317    pub can_apply_automatically: bool,
318    pub automatic_action_count: usize,
319    pub blockers: Vec<AuthorityApplyBlockerV1>,
320}
321
322///
323/// AuthorityApplyBlockerV1
324///
325#[derive(Clone, Copy, Debug, Deserialize, Eq, PartialEq, Serialize)]
326pub enum AuthorityApplyBlockerV1 {
327    UnsafeBlocked,
328    HardFailures,
329    ObservationGaps,
330    ExternalActions,
331}
332
333///
334/// AuthorityActionCountV1
335///
336#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
337pub struct AuthorityActionCountV1 {
338    pub action: AuthorityActionV1,
339    pub count: usize,
340}
341
342///
343/// AuthorityControlClassCountV1
344///
345#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
346pub struct AuthorityControlClassCountV1 {
347    pub control_class: CanisterControlClassV1,
348    pub count: usize,
349}
350
351///
352/// AuthorityReportCountsV1
353///
354#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
355pub struct AuthorityReportCountsV1 {
356    pub already_correct: usize,
357    pub can_apply_automatically: usize,
358    pub requires_external_action: usize,
359    pub unsafe_blocked: usize,
360    pub unknown: usize,
361    pub hard_failures: usize,
362}
363
364///
365/// CanisterAuthorityActionV1
366///
367#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
368pub struct CanisterAuthorityActionV1 {
369    pub canister_id: Option<String>,
370    pub role: Option<String>,
371    pub control_classification: CanisterControlClassV1,
372    pub observed_controllers: Vec<String>,
373    pub desired_controllers: Vec<String>,
374    pub controller_delta: AuthorityControllerDeltaV1,
375    pub action: AuthorityActionV1,
376    pub state: AuthorityReconciliationStateV1,
377    pub can_apply: bool,
378    pub reason: String,
379}
380
381///
382/// AuthorityExternalActionV1
383///
384#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
385pub struct AuthorityExternalActionV1 {
386    pub subject: String,
387    pub canister_id: Option<String>,
388    pub role: Option<String>,
389    pub control_classification: CanisterControlClassV1,
390    pub state: AuthorityReconciliationStateV1,
391    pub action: AuthorityActionV1,
392    pub observed_controllers: Vec<String>,
393    pub desired_controllers: Vec<String>,
394    pub controller_delta: AuthorityControllerDeltaV1,
395    pub reason: String,
396}
397
398///
399/// AuthorityActionV1
400///
401#[derive(Clone, Copy, Debug, Deserialize, Eq, PartialEq, Serialize)]
402pub enum AuthorityActionV1 {
403    None,
404    AddControllers,
405    RemoveControllers,
406    ReplaceControllerSet,
407    RequiresExternalController,
408    RequiresDestructiveImportConfirmation,
409    ObserveOnly,
410    AdoptPlanAvailable,
411    BlockedByPolicy,
412    UnknownObservation,
413}
414
415///
416/// AuthorityReconciliationStateV1
417///
418#[derive(Clone, Copy, Debug, Deserialize, Eq, PartialEq, Serialize)]
419pub enum AuthorityReconciliationStateV1 {
420    AlreadyCorrect,
421    CanApplyAutomatically,
422    RequiresExternalAction,
423    UnsafeBlocked,
424    Unknown,
425}
426
427///
428/// DeploymentIdentityV1
429///
430#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
431pub struct DeploymentIdentityV1 {
432    pub deployment_name: String,
433    pub network: String,
434    pub root_principal: Option<String>,
435    pub authority_profile_hash: Option<String>,
436    pub role_topology_hash: Option<String>,
437    pub deployment_manifest_digest: Option<String>,
438    pub canonical_runtime_config_digest: Option<String>,
439    pub role_embedded_config_set_digest: Option<String>,
440    pub artifact_set_digest: Option<String>,
441    pub pool_identity_set_digest: Option<String>,
442    pub canic_version: Option<String>,
443    pub ic_memory_version: Option<String>,
444}
445
446///
447/// TrustDomainV1
448///
449#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
450pub struct TrustDomainV1 {
451    pub root_trust_anchor: Option<String>,
452    pub migration_from: Option<String>,
453}
454
455///
456/// AuthorityProfileV1
457///
458#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
459pub struct AuthorityProfileV1 {
460    pub profile_id: String,
461    pub expected_controllers: Vec<String>,
462    pub staging_controllers: Vec<String>,
463    pub emergency_controllers: Vec<String>,
464}
465
466///
467/// RoleArtifactV1
468///
469#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
470pub struct RoleArtifactV1 {
471    pub role: String,
472    pub source: ArtifactSourceV1,
473    pub build_profile: String,
474    pub wasm_path: Option<String>,
475    pub wasm_gz_path: Option<String>,
476    pub wasm_gz_size_bytes: Option<u64>,
477    pub wasm_sha256: Option<String>,
478    pub wasm_gz_sha256: Option<String>,
479    pub wasm_gz_sha256_source: Option<ArtifactDigestSourceV1>,
480    pub observed_wasm_gz_file_sha256: Option<String>,
481    pub observed_wasm_gz_file_sha256_source: Option<ArtifactDigestSourceV1>,
482    pub installed_module_hash: Option<String>,
483    pub candid_path: Option<String>,
484    pub candid_sha256: Option<String>,
485    pub raw_config_sha256: Option<String>,
486    pub canonical_embedded_config_sha256: Option<String>,
487    pub embedded_topology_sha256: Option<String>,
488    pub builder_version: Option<String>,
489    pub rust_toolchain: Option<String>,
490    pub package_version: Option<String>,
491}
492
493///
494/// ArtifactDigestSourceV1
495///
496#[derive(Clone, Copy, Debug, Deserialize, Eq, PartialEq, Serialize)]
497pub enum ArtifactDigestSourceV1 {
498    ReleaseSetManifest,
499    ObservedFileDigest,
500    InstalledModuleHash,
501}
502
503///
504/// ArtifactSourceV1
505///
506#[derive(Clone, Copy, Debug, Deserialize, Eq, PartialEq, Serialize)]
507pub enum ArtifactSourceV1 {
508    LocalBuild,
509    ReleaseSet,
510    WasmStore,
511    External,
512    Unknown,
513}
514
515///
516/// ExpectedCanisterV1
517///
518#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
519pub struct ExpectedCanisterV1 {
520    pub role: String,
521    pub canister_id: Option<String>,
522    pub control_class: CanisterControlClassV1,
523}
524
525///
526/// ObservedCanisterV1
527///
528#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
529pub struct ObservedCanisterV1 {
530    pub canister_id: String,
531    pub role: Option<String>,
532    pub control_class: CanisterControlClassV1,
533    pub controllers: Vec<String>,
534    pub module_hash: Option<String>,
535    pub status: Option<String>,
536    pub root_trust_anchor: Option<String>,
537    pub canonical_embedded_config_digest: Option<String>,
538    pub role_assignment_source: Option<String>,
539}
540
541///
542/// CanisterControlClassV1
543///
544#[derive(Clone, Copy, Debug, Deserialize, Eq, PartialEq, Serialize)]
545pub enum CanisterControlClassV1 {
546    DeploymentControlled,
547    CanicManagedPool,
548    ExternallyImported,
549    JointlyControlled,
550    UserControlled,
551    UnknownUnsafe,
552}
553
554///
555/// ExpectedPoolCanisterV1
556///
557#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
558pub struct ExpectedPoolCanisterV1 {
559    pub pool: String,
560    pub canister_id: Option<String>,
561    pub role: Option<String>,
562}
563
564///
565/// ObservedPoolCanisterV1
566///
567#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
568pub struct ObservedPoolCanisterV1 {
569    pub pool: String,
570    pub canister_id: String,
571    pub role: Option<String>,
572    pub control_class: CanisterControlClassV1,
573}
574
575///
576/// LocalDeploymentConfigV1
577///
578#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
579pub struct LocalDeploymentConfigV1 {
580    pub config_path: Option<String>,
581    pub raw_config_sha256: Option<String>,
582    pub canonical_embedded_config_sha256: Option<String>,
583}
584
585///
586/// ObservedArtifactV1
587///
588#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
589pub struct ObservedArtifactV1 {
590    pub role: String,
591    pub artifact_path: String,
592    pub file_sha256: Option<String>,
593    pub file_sha256_source: Option<ArtifactDigestSourceV1>,
594    pub payload_sha256: Option<String>,
595    pub payload_size_bytes: Option<u64>,
596    pub source: ArtifactSourceV1,
597}
598
599///
600/// VerifierReadinessExpectationV1
601///
602#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
603pub struct VerifierReadinessExpectationV1 {
604    pub required: bool,
605    pub expected_role_epochs: Vec<RoleEpochExpectationV1>,
606}
607
608///
609/// VerifierReadinessObservationV1
610///
611#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
612pub struct VerifierReadinessObservationV1 {
613    pub status: ObservationStatusV1,
614    pub role_epochs: Vec<RoleEpochObservationV1>,
615}
616
617///
618/// RoleEpochExpectationV1
619///
620#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
621pub struct RoleEpochExpectationV1 {
622    pub role: String,
623    pub minimum_epoch: u64,
624}
625
626///
627/// RoleEpochObservationV1
628///
629#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
630pub struct RoleEpochObservationV1 {
631    pub role: String,
632    pub observed_epoch: Option<u64>,
633    pub status: ObservationStatusV1,
634}
635
636///
637/// DeploymentAssumptionV1
638///
639#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
640pub struct DeploymentAssumptionV1 {
641    pub key: String,
642    pub description: String,
643}
644
645///
646/// DeploymentObservationGapV1
647///
648#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
649pub struct DeploymentObservationGapV1 {
650    pub key: String,
651    pub description: String,
652}
653
654///
655/// PhaseReceiptV1
656///
657#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
658pub struct PhaseReceiptV1 {
659    pub phase: String,
660    pub started_at: String,
661    pub finished_at: Option<String>,
662    pub attempted_action: String,
663    pub verified_postcondition: VerifiedPostconditionV1,
664}
665
666///
667/// VerifiedPostconditionV1
668///
669#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
670pub struct VerifiedPostconditionV1 {
671    pub status: ObservationStatusV1,
672    pub evidence: Vec<String>,
673}
674
675///
676/// DeploymentExecutionStatusV1
677///
678#[derive(Clone, Copy, Debug, Deserialize, Eq, PartialEq, Serialize)]
679pub enum DeploymentExecutionStatusV1 {
680    NotStarted,
681    InProgress,
682    FailedBeforeMutation,
683    PartiallyApplied,
684    FailedAfterMutation,
685    Complete,
686}
687
688///
689/// DeploymentCommandResultV1
690///
691#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
692pub enum DeploymentCommandResultV1 {
693    NotFinished,
694    Succeeded,
695    Failed { code: String, message: String },
696}
697
698///
699/// RolePhaseReceiptV1
700///
701#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
702pub struct RolePhaseReceiptV1 {
703    pub role: String,
704    pub phase: String,
705    pub result: RolePhaseResultV1,
706    pub previous_module_hash: Option<String>,
707    pub target_module_hash: Option<String>,
708    pub observed_module_hash_after: Option<String>,
709    pub artifact_digest: Option<String>,
710    pub canonical_embedded_config_sha256: Option<String>,
711    pub error: Option<String>,
712}
713
714///
715/// RolePhaseResultV1
716///
717#[derive(Clone, Copy, Debug, Deserialize, Eq, PartialEq, Serialize)]
718pub enum RolePhaseResultV1 {
719    Applied,
720    Failed,
721    Skipped,
722    NotAttempted,
723    VerifiedAlreadyApplied,
724}
725
726///
727/// DiffItemV1
728///
729#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
730pub struct DiffItemV1 {
731    pub category: String,
732    pub subject: String,
733    pub expected: Option<String>,
734    pub observed: Option<String>,
735    pub severity: SafetySeverityV1,
736}
737
738///
739/// ResumeSafetyV1
740///
741#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
742pub struct ResumeSafetyV1 {
743    pub status: SafetyStatusV1,
744    pub reasons: Vec<String>,
745}
746
747///
748/// SafetyFindingV1
749///
750#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
751pub struct SafetyFindingV1 {
752    pub code: String,
753    pub message: String,
754    pub severity: SafetySeverityV1,
755    pub subject: Option<String>,
756}
757
758///
759/// SafetyStatusV1
760///
761#[derive(Clone, Copy, Debug, Deserialize, Eq, PartialEq, Serialize)]
762pub enum SafetyStatusV1 {
763    NotEvaluated,
764    Safe,
765    Warning,
766    Blocked,
767}
768
769///
770/// SafetySeverityV1
771///
772#[derive(Clone, Copy, Debug, Deserialize, Eq, PartialEq, Serialize)]
773pub enum SafetySeverityV1 {
774    Info,
775    Warning,
776    HardFailure,
777}
778
779///
780/// ObservationStatusV1
781///
782#[derive(Clone, Copy, Debug, Deserialize, Eq, PartialEq, Serialize)]
783pub enum ObservationStatusV1 {
784    NotObserved,
785    Observed,
786    Missing,
787    Inconclusive,
788}