1use serde::{Deserialize, Serialize};
2
3#[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#[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#[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#[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#[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#[derive(Clone, Copy, Debug, Deserialize, Eq, PartialEq, Serialize)]
93pub enum DeploymentExecutionPreflightStatusV1 {
94 Ready,
95 Blocked,
96}
97
98#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
102pub enum DeploymentExecutorBackendV1 {
103 CurrentCli,
104 PocketIc,
105 DirectAgent,
106 Other { name: String },
107}
108
109#[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#[derive(Clone, Copy, Debug, Deserialize, Eq, PartialEq, Serialize)]
127pub enum ArtifactTransportV1 {
128 LocalCli,
129 WasmStore,
130 DirectAgent,
131}
132
133#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
137pub struct StagingReceiptV1 {
138 pub schema_version: u32,
139 pub role: String,
140 pub artifact_identity: String,
141 pub transport: ArtifactTransportV1,
142 pub wasm_store_locator: Option<String>,
143 pub prepared_chunk_hashes: Vec<String>,
144 pub published_chunk_count: usize,
145 pub verified_postcondition: VerifiedPostconditionV1,
146}
147
148#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
152pub struct AuthorityReceiptV1 {
153 pub schema_version: u32,
154 pub operation_id: String,
155 pub check_id: Option<String>,
156 pub reconciliation_plan_id: String,
157 pub authority_report_id: String,
158 pub inventory_id: String,
159 pub authority_profile_hash: Option<String>,
160 pub operation_status: DeploymentExecutionStatusV1,
161 pub started_at: String,
162 pub finished_at: Option<String>,
163 pub attempted_actions: Vec<AuthorityAttemptedActionV1>,
164 pub verified_controller_observations: Vec<AuthorityControllerObservationV1>,
165 pub hard_failures: Vec<SafetyFindingV1>,
166 pub unresolved_observation_gaps: Vec<DeploymentObservationGapV1>,
167 pub unresolved_external_actions: Vec<AuthorityExternalActionV1>,
168 pub command_result: DeploymentCommandResultV1,
169}
170
171#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
175pub struct AuthorityDryRunEvidenceV1 {
176 pub schema_version: u32,
177 pub evidence_id: String,
178 pub check_id: String,
179 pub generated_at: String,
180 pub reconciliation_plan: AuthorityReconciliationPlanV1,
181 pub authority_report: AuthorityReportV1,
182 pub authority_receipt: AuthorityReceiptV1,
183}
184
185#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
189pub struct AuthorityAttemptedActionV1 {
190 pub subject: String,
191 pub canister_id: Option<String>,
192 pub role: Option<String>,
193 pub action: AuthorityActionV1,
194 pub result: RolePhaseResultV1,
195 pub error: Option<String>,
196}
197
198#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
202pub struct AuthorityControllerObservationV1 {
203 pub subject: String,
204 pub canister_id: Option<String>,
205 pub role: Option<String>,
206 pub state: AuthorityReconciliationStateV1,
207 pub action: AuthorityActionV1,
208 pub observed_controllers: Vec<String>,
209 pub desired_controllers: Vec<String>,
210 pub controller_delta: AuthorityControllerDeltaV1,
211}
212
213#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
217pub struct RoleArtifactManifestV1 {
218 pub schema_version: u32,
219 pub manifest_id: String,
220 pub network: String,
221 pub artifact_root: Option<String>,
222 pub role_artifacts: Vec<RoleArtifactV1>,
223 pub unresolved_artifacts: Vec<DeploymentObservationGapV1>,
224}
225
226#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
230pub struct DeploymentDiffV1 {
231 pub schema_version: u32,
232 pub plan_identity: DeploymentIdentityV1,
233 pub observed_identity: Option<DeploymentIdentityV1>,
234 pub artifact_diff: Vec<DiffItemV1>,
235 pub controller_diff: Vec<DiffItemV1>,
236 pub pool_diff: Vec<DiffItemV1>,
237 pub embedded_config_diff: Vec<DiffItemV1>,
238 pub module_hash_diff: Vec<DiffItemV1>,
239 pub verifier_readiness_diff: Vec<DiffItemV1>,
240 pub resume_safety: ResumeSafetyV1,
241 pub hard_failures: Vec<SafetyFindingV1>,
242 pub warnings: Vec<SafetyFindingV1>,
243 pub resumable_phases: Vec<String>,
244}
245
246#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
250pub struct SafetyReportV1 {
251 pub schema_version: u32,
252 pub report_id: String,
253 pub diff_id: Option<String>,
254 pub status: SafetyStatusV1,
255 pub summary: String,
256 pub hard_failures: Vec<SafetyFindingV1>,
257 pub warnings: Vec<SafetyFindingV1>,
258 pub next_actions: Vec<String>,
259}
260
261#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
265pub struct DeploymentCheckV1 {
266 pub schema_version: u32,
267 pub check_id: String,
268 pub plan: DeploymentPlanV1,
269 pub inventory: DeploymentInventoryV1,
270 pub diff: DeploymentDiffV1,
271 pub report: SafetyReportV1,
272}
273
274#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
278pub struct AuthorityReconciliationPlanV1 {
279 pub schema_version: u32,
280 pub plan_id: String,
281 pub inventory_id: String,
282 pub authority_profile_hash: Option<String>,
283 pub canister_actions: Vec<CanisterAuthorityActionV1>,
284 pub automatic_actions: Vec<AuthorityAutomaticActionV1>,
285 pub hard_failures: Vec<SafetyFindingV1>,
286 pub external_actions_required: Vec<AuthorityExternalActionV1>,
287}
288
289#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
293pub struct AuthorityAutomaticActionV1 {
294 pub subject: String,
295 pub canister_id: String,
296 pub role: Option<String>,
297 pub action: AuthorityActionV1,
298 pub observed_controllers: Vec<String>,
299 pub desired_controllers: Vec<String>,
300 pub controller_delta: AuthorityControllerDeltaV1,
301 pub reason: String,
302}
303
304#[derive(Clone, Debug, Default, Deserialize, Eq, PartialEq, Serialize)]
308pub struct AuthorityControllerDeltaV1 {
309 pub add_controllers: Vec<String>,
310 pub remove_controllers: Vec<String>,
311}
312
313#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
317pub struct AuthorityReportV1 {
318 pub schema_version: u32,
319 pub report_id: String,
320 pub check_id: Option<String>,
321 pub reconciliation_plan_id: String,
322 pub inventory_id: String,
323 pub authority_profile_hash: Option<String>,
324 pub status: SafetyStatusV1,
325 pub summary: String,
326 pub counts: AuthorityReportCountsV1,
327 pub apply_readiness: AuthorityApplyReadinessV1,
328 pub action_counts: Vec<AuthorityActionCountV1>,
329 pub control_class_counts: Vec<AuthorityControlClassCountV1>,
330 pub observation_gaps: Vec<DeploymentObservationGapV1>,
331 pub automatic_actions: Vec<AuthorityAutomaticActionV1>,
332 pub hard_failures: Vec<SafetyFindingV1>,
333 pub external_actions_required: Vec<AuthorityExternalActionV1>,
334 pub next_actions: Vec<String>,
335}
336
337#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
341pub struct AuthorityApplyReadinessV1 {
342 pub can_apply_automatically: bool,
343 pub automatic_action_count: usize,
344 pub blockers: Vec<AuthorityApplyBlockerV1>,
345}
346
347#[derive(Clone, Copy, Debug, Deserialize, Eq, PartialEq, Serialize)]
351pub enum AuthorityApplyBlockerV1 {
352 UnsafeBlocked,
353 HardFailures,
354 ObservationGaps,
355 ExternalActions,
356}
357
358#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
362pub struct AuthorityActionCountV1 {
363 pub action: AuthorityActionV1,
364 pub count: usize,
365}
366
367#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
371pub struct AuthorityControlClassCountV1 {
372 pub control_class: CanisterControlClassV1,
373 pub count: usize,
374}
375
376#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
380pub struct AuthorityReportCountsV1 {
381 pub already_correct: usize,
382 pub can_apply_automatically: usize,
383 pub requires_external_action: usize,
384 pub unsafe_blocked: usize,
385 pub unknown: usize,
386 pub hard_failures: usize,
387}
388
389#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
393pub struct CanisterAuthorityActionV1 {
394 pub canister_id: Option<String>,
395 pub role: Option<String>,
396 pub control_classification: CanisterControlClassV1,
397 pub observed_controllers: Vec<String>,
398 pub desired_controllers: Vec<String>,
399 pub controller_delta: AuthorityControllerDeltaV1,
400 pub action: AuthorityActionV1,
401 pub state: AuthorityReconciliationStateV1,
402 pub can_apply: bool,
403 pub reason: String,
404}
405
406#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
410pub struct AuthorityExternalActionV1 {
411 pub subject: String,
412 pub canister_id: Option<String>,
413 pub role: Option<String>,
414 pub control_classification: CanisterControlClassV1,
415 pub state: AuthorityReconciliationStateV1,
416 pub action: AuthorityActionV1,
417 pub observed_controllers: Vec<String>,
418 pub desired_controllers: Vec<String>,
419 pub controller_delta: AuthorityControllerDeltaV1,
420 pub reason: String,
421}
422
423#[derive(Clone, Copy, Debug, Deserialize, Eq, PartialEq, Serialize)]
427pub enum AuthorityActionV1 {
428 None,
429 AddControllers,
430 RemoveControllers,
431 ReplaceControllerSet,
432 RequiresExternalController,
433 RequiresDestructiveImportConfirmation,
434 ObserveOnly,
435 AdoptPlanAvailable,
436 BlockedByPolicy,
437 UnknownObservation,
438}
439
440#[derive(Clone, Copy, Debug, Deserialize, Eq, PartialEq, Serialize)]
444pub enum AuthorityReconciliationStateV1 {
445 AlreadyCorrect,
446 CanApplyAutomatically,
447 RequiresExternalAction,
448 UnsafeBlocked,
449 Unknown,
450}
451
452#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
456pub struct DeploymentIdentityV1 {
457 pub deployment_name: String,
458 pub network: String,
459 pub root_principal: Option<String>,
460 pub authority_profile_hash: Option<String>,
461 pub role_topology_hash: Option<String>,
462 pub deployment_manifest_digest: Option<String>,
463 pub canonical_runtime_config_digest: Option<String>,
464 pub role_embedded_config_set_digest: Option<String>,
465 pub artifact_set_digest: Option<String>,
466 pub pool_identity_set_digest: Option<String>,
467 pub canic_version: Option<String>,
468 pub ic_memory_version: Option<String>,
469}
470
471#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
475pub struct TrustDomainV1 {
476 pub root_trust_anchor: Option<String>,
477 pub migration_from: Option<String>,
478}
479
480#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
484pub struct AuthorityProfileV1 {
485 pub profile_id: String,
486 pub expected_controllers: Vec<String>,
487 pub staging_controllers: Vec<String>,
488 pub emergency_controllers: Vec<String>,
489}
490
491#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
495pub struct RoleArtifactV1 {
496 pub role: String,
497 pub source: ArtifactSourceV1,
498 pub build_profile: String,
499 pub wasm_path: Option<String>,
500 pub wasm_gz_path: Option<String>,
501 pub wasm_gz_size_bytes: Option<u64>,
502 pub wasm_sha256: Option<String>,
503 pub wasm_gz_sha256: Option<String>,
504 pub wasm_gz_sha256_source: Option<ArtifactDigestSourceV1>,
505 pub observed_wasm_gz_file_sha256: Option<String>,
506 pub observed_wasm_gz_file_sha256_source: Option<ArtifactDigestSourceV1>,
507 pub installed_module_hash: Option<String>,
508 pub candid_path: Option<String>,
509 pub candid_sha256: Option<String>,
510 pub raw_config_sha256: Option<String>,
511 pub canonical_embedded_config_sha256: Option<String>,
512 pub embedded_topology_sha256: Option<String>,
513 pub builder_version: Option<String>,
514 pub rust_toolchain: Option<String>,
515 pub package_version: Option<String>,
516}
517
518#[derive(Clone, Copy, Debug, Deserialize, Eq, PartialEq, Serialize)]
522pub enum ArtifactDigestSourceV1 {
523 ReleaseSetManifest,
524 ObservedFileDigest,
525 InstalledModuleHash,
526}
527
528#[derive(Clone, Copy, Debug, Deserialize, Eq, PartialEq, Serialize)]
532pub enum ArtifactSourceV1 {
533 LocalBuild,
534 ReleaseSet,
535 WasmStore,
536 External,
537 Unknown,
538}
539
540#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
544pub struct ExpectedCanisterV1 {
545 pub role: String,
546 pub canister_id: Option<String>,
547 pub control_class: CanisterControlClassV1,
548}
549
550#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
554pub struct ObservedCanisterV1 {
555 pub canister_id: String,
556 pub role: Option<String>,
557 pub control_class: CanisterControlClassV1,
558 pub controllers: Vec<String>,
559 pub module_hash: Option<String>,
560 pub status: Option<String>,
561 pub root_trust_anchor: Option<String>,
562 pub canonical_embedded_config_digest: Option<String>,
563 pub role_assignment_source: Option<String>,
564}
565
566#[derive(Clone, Copy, Debug, Deserialize, Eq, PartialEq, Serialize)]
570pub enum CanisterControlClassV1 {
571 DeploymentControlled,
572 CanicManagedPool,
573 ExternallyImported,
574 JointlyControlled,
575 UserControlled,
576 UnknownUnsafe,
577}
578
579#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
583pub struct ExpectedPoolCanisterV1 {
584 pub pool: String,
585 pub canister_id: Option<String>,
586 pub role: Option<String>,
587}
588
589#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
593pub struct ObservedPoolCanisterV1 {
594 pub pool: String,
595 pub canister_id: String,
596 pub role: Option<String>,
597 pub control_class: CanisterControlClassV1,
598}
599
600#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
604pub struct LocalDeploymentConfigV1 {
605 pub config_path: Option<String>,
606 pub raw_config_sha256: Option<String>,
607 pub canonical_embedded_config_sha256: Option<String>,
608}
609
610#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
614pub struct ObservedArtifactV1 {
615 pub role: String,
616 pub artifact_path: String,
617 pub file_sha256: Option<String>,
618 pub file_sha256_source: Option<ArtifactDigestSourceV1>,
619 pub payload_sha256: Option<String>,
620 pub payload_size_bytes: Option<u64>,
621 pub source: ArtifactSourceV1,
622}
623
624#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
628pub struct VerifierReadinessExpectationV1 {
629 pub required: bool,
630 pub expected_role_epochs: Vec<RoleEpochExpectationV1>,
631}
632
633#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
637pub struct VerifierReadinessObservationV1 {
638 pub status: ObservationStatusV1,
639 pub role_epochs: Vec<RoleEpochObservationV1>,
640}
641
642#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
646pub struct RoleEpochExpectationV1 {
647 pub role: String,
648 pub minimum_epoch: u64,
649}
650
651#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
655pub struct RoleEpochObservationV1 {
656 pub role: String,
657 pub observed_epoch: Option<u64>,
658 pub status: ObservationStatusV1,
659}
660
661#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
665pub struct DeploymentAssumptionV1 {
666 pub key: String,
667 pub description: String,
668}
669
670#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
674pub struct DeploymentObservationGapV1 {
675 pub key: String,
676 pub description: String,
677}
678
679#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
683pub struct PhaseReceiptV1 {
684 pub phase: String,
685 pub started_at: String,
686 pub finished_at: Option<String>,
687 pub attempted_action: String,
688 pub verified_postcondition: VerifiedPostconditionV1,
689}
690
691#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
695pub struct VerifiedPostconditionV1 {
696 pub status: ObservationStatusV1,
697 pub evidence: Vec<String>,
698}
699
700#[derive(Clone, Copy, Debug, Deserialize, Eq, PartialEq, Serialize)]
704pub enum DeploymentExecutionStatusV1 {
705 NotStarted,
706 InProgress,
707 FailedBeforeMutation,
708 PartiallyApplied,
709 FailedAfterMutation,
710 Complete,
711}
712
713#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
717pub enum DeploymentCommandResultV1 {
718 NotFinished,
719 Succeeded,
720 Failed { code: String, message: String },
721}
722
723#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
727pub struct RolePhaseReceiptV1 {
728 pub role: String,
729 pub phase: String,
730 pub result: RolePhaseResultV1,
731 pub previous_module_hash: Option<String>,
732 pub target_module_hash: Option<String>,
733 pub observed_module_hash_after: Option<String>,
734 pub artifact_digest: Option<String>,
735 pub canonical_embedded_config_sha256: Option<String>,
736 pub error: Option<String>,
737}
738
739#[derive(Clone, Copy, Debug, Deserialize, Eq, PartialEq, Serialize)]
743pub enum RolePhaseResultV1 {
744 Applied,
745 Failed,
746 Skipped,
747 NotAttempted,
748 VerifiedAlreadyApplied,
749}
750
751#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
755pub struct DiffItemV1 {
756 pub category: String,
757 pub subject: String,
758 pub expected: Option<String>,
759 pub observed: Option<String>,
760 pub severity: SafetySeverityV1,
761}
762
763#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
767pub struct ResumeSafetyV1 {
768 pub status: SafetyStatusV1,
769 pub reasons: Vec<String>,
770}
771
772#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
776pub struct SafetyFindingV1 {
777 pub code: String,
778 pub message: String,
779 pub severity: SafetySeverityV1,
780 pub subject: Option<String>,
781}
782
783#[derive(Clone, Copy, Debug, Deserialize, Eq, PartialEq, Serialize)]
787pub enum SafetyStatusV1 {
788 NotEvaluated,
789 Safe,
790 Warning,
791 Blocked,
792}
793
794#[derive(Clone, Copy, Debug, Deserialize, Eq, PartialEq, Serialize)]
798pub enum SafetySeverityV1 {
799 Info,
800 Warning,
801 HardFailure,
802}
803
804#[derive(Clone, Copy, Debug, Deserialize, Eq, PartialEq, Serialize)]
808pub enum ObservationStatusV1 {
809 NotObserved,
810 Observed,
811 Missing,
812 Inconclusive,
813}