chio-kernel 0.1.2

Chio runtime kernel: capability validation, guard evaluation, receipt signing
Documentation
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
use super::*;

pub(super) fn next_version(version: u64) -> Result<u64, AdmissionOperationError> {
    version
        .checked_add(1)
        .filter(|next| *next <= I_JSON_MAX_SAFE_INTEGER)
        .ok_or(AdmissionOperationError::VersionOverflow)
}

pub(super) fn dispatch_committed_version_from_prepared(
    kind: AdmissionOperationKind,
    requirements: AdmissionParticipantRequirements,
    prepared_version: u64,
) -> Result<u64, AdmissionOperationError> {
    validate_positive_ijson("prepared_operation_version", prepared_version)?;
    if !kind.uses_dispatch() {
        return Err(AdmissionOperationError::StateKindMismatch {
            kind,
            state: AdmissionOperationState::DispatchCommitted,
        });
    }
    let mut state = AdmissionOperationState::Prepared;
    let mut version = prepared_version;
    for next in [
        AdmissionOperationState::BrokerAttemptRegistered,
        AdmissionOperationState::BudgetAuthorized,
        AdmissionOperationState::ApprovalReserved,
        AdmissionOperationState::ReadyToDispatch,
        AdmissionOperationState::CapturePending,
        AdmissionOperationState::DispatchCommitted,
    ] {
        if is_legal_transition(kind, requirements, state, next) {
            state = next;
            version = next_version(version)?;
        }
    }
    if state != AdmissionOperationState::DispatchCommitted {
        return Err(AdmissionOperationError::StateKindMismatch {
            kind,
            state: AdmissionOperationState::DispatchCommitted,
        });
    }
    Ok(version)
}

pub(super) fn validate_positive_ijson(
    field: &'static str,
    value: u64,
) -> Result<(), AdmissionOperationError> {
    if value == 0 {
        return Err(AdmissionOperationError::ZeroVersionOrEpoch);
    }
    if value > I_JSON_MAX_SAFE_INTEGER {
        return Err(AdmissionOperationError::UnsafeInteger { field });
    }
    Ok(())
}

pub(super) fn validate_store_fence(
    fence: &StoreMutationFence,
) -> Result<(), AdmissionOperationError> {
    if validate_positive_ijson("store_owner_epoch", fence.owner_epoch).is_err()
        || BoundedAdmissionText::<MAX_ADMISSION_IDENTIFIER_BYTES>::try_new(
            "store_uuid",
            fence.store_uuid.clone(),
        )
        .is_err()
        || BoundedAdmissionText::<MAX_ADMISSION_IDENTIFIER_BYTES>::try_new(
            "store_lease_id",
            fence.lease_id.clone(),
        )
        .is_err()
    {
        return Err(AdmissionOperationError::InvalidStoreFence);
    }
    Ok(())
}

pub(super) fn validate_artifact_digests(
    digests: &[AdmissionDigest],
) -> Result<(), AdmissionOperationError> {
    if digests.len() > MAX_AUTHORIZATION_ARTIFACT_DIGESTS
        || digests.windows(2).any(|pair| pair[0] >= pair[1])
    {
        return Err(AdmissionOperationError::InvalidAuthorizationArtifactDigests);
    }
    Ok(())
}

pub(super) fn attachment_supported(
    kind: AdmissionOperationKind,
    requirements: AdmissionParticipantRequirements,
    attachment: &AdmissionAttachment,
) -> bool {
    match attachment {
        AdmissionAttachment::ThresholdProposalHash(_)
        | AdmissionAttachment::ThresholdProposal(_) => requirements.approval,
        AdmissionAttachment::SupplementalAuthorizationDigest(_) => match kind {
            AdmissionOperationKind::ToolDispatch => true,
            AdmissionOperationKind::GovernedEconomicMutation => {
                requirements.supplemental_authorization
            }
            AdmissionOperationKind::GovernedActiveResponse => false,
        },
        AdmissionAttachment::BrokerAttempt(_) => requirements.broker_attempt,
        AdmissionAttachment::BudgetHoldId(_) => requirements.budget_capture,
        AdmissionAttachment::ApprovalSetHash(_) => requirements.approval,
        AdmissionAttachment::ExecutionNonceId(_) => requirements.execution_nonce,
        AdmissionAttachment::OutcomeEligibilityDigest(_) => requirements.outcome_eligibility,
        AdmissionAttachment::PaymentParticipantId(_) => requirements.payment,
        AdmissionAttachment::ToolOutcomeId(_) => kind == AdmissionOperationKind::ToolDispatch,
        AdmissionAttachment::ChannelReservationProposalDigest(_)
        | AdmissionAttachment::ChannelReservationDigest(_) => requirements.channel,
        AdmissionAttachment::CreditExposureReservationDigest(_) => {
            kind == AdmissionOperationKind::ToolDispatch && requirements.credit_exposure
        }
    }
}

pub(super) fn attachment_allowed(
    kind: AdmissionOperationKind,
    requirements: AdmissionParticipantRequirements,
    state: AdmissionOperationState,
    attachment: &AdmissionAttachment,
) -> bool {
    if !attachment_supported(kind, requirements, attachment) {
        return false;
    }
    match attachment {
        AdmissionAttachment::SupplementalAuthorizationDigest(_)
            if kind == AdmissionOperationKind::GovernedEconomicMutation =>
        {
            state == AdmissionOperationState::Prepared
        }
        AdmissionAttachment::ToolOutcomeId(_) => matches!(
            state,
            AdmissionOperationState::DispatchCommitted | AdmissionOperationState::Finalizing
        ),
        AdmissionAttachment::ChannelReservationProposalDigest(_) => {
            state == AdmissionOperationState::Prepared
        }
        AdmissionAttachment::ChannelReservationDigest(_) => matches!(
            state,
            AdmissionOperationState::BudgetAuthorized | AdmissionOperationState::ApprovalReserved
        ),
        AdmissionAttachment::CreditExposureReservationDigest(_) => {
            state == AdmissionOperationState::BrokerAttemptRegistered
        }
        _ => matches!(
            state,
            AdmissionOperationState::Prepared
                | AdmissionOperationState::BrokerAttemptRegistered
                | AdmissionOperationState::ApprovalRequired
                | AdmissionOperationState::BudgetAuthorized
                | AdmissionOperationState::ApprovalReserved
        ),
    }
}

pub(super) fn validate_state_attachments(
    kind: AdmissionOperationKind,
    requirements: AdmissionParticipantRequirements,
    state: AdmissionOperationState,
    attachments: &AdmissionOperationAttachmentsV1,
) -> Result<(), AdmissionOperationError> {
    if let Some(attachment) = attachments.0.iter().find(|attachment| {
        !attachment_supported(kind, requirements, attachment)
            || match attachment {
                AdmissionAttachment::ToolOutcomeId(_) => !matches!(
                    state,
                    AdmissionOperationState::DispatchCommitted
                        | AdmissionOperationState::Finalizing
                        | AdmissionOperationState::Completed
                        | AdmissionOperationState::OutcomeUnknownAfterDispatch
                ),
                AdmissionAttachment::ChannelReservationDigest(_) => !matches!(
                    state,
                    AdmissionOperationState::BudgetAuthorized
                        | AdmissionOperationState::ApprovalReserved
                        | AdmissionOperationState::ReadyToDispatch
                        | AdmissionOperationState::CapturePending
                        | AdmissionOperationState::DispatchCommitted
                        | AdmissionOperationState::Finalizing
                        | AdmissionOperationState::Completed
                        | AdmissionOperationState::CompensatedBeforeDispatch
                        | AdmissionOperationState::NotAcceptedAfterDispatchCommit
                        | AdmissionOperationState::OutcomeUnknownAfterDispatch
                ),
                AdmissionAttachment::CreditExposureReservationDigest(_) => !matches!(
                    state,
                    AdmissionOperationState::BudgetAuthorized
                        | AdmissionOperationState::ApprovalReserved
                        | AdmissionOperationState::ReadyToDispatch
                        | AdmissionOperationState::CapturePending
                        | AdmissionOperationState::DispatchCommitted
                        | AdmissionOperationState::Finalizing
                        | AdmissionOperationState::Completed
                        | AdmissionOperationState::CompensatedBeforeDispatch
                        | AdmissionOperationState::NotAcceptedAfterDispatchCommit
                        | AdmissionOperationState::OutcomeUnknownAfterDispatch
                ),
                _ => false,
            }
    }) {
        return Err(AdmissionOperationError::ForbiddenAttachment {
            field: attachment.field_name(),
        });
    }
    if kind == AdmissionOperationKind::ToolDispatch
        && matches!(
            state,
            AdmissionOperationState::Finalizing | AdmissionOperationState::Completed
        )
        && !attachments.has_slot(AdmissionAttachmentKind::ToolOutcome.slot())
    {
        return Err(AdmissionOperationError::MissingParticipantAttachment {
            field: "tool_outcome_id",
        });
    }
    if kind == AdmissionOperationKind::GovernedEconomicMutation
        && requirements.supplemental_authorization
        && matches!(
            state,
            AdmissionOperationState::MutationReady
                | AdmissionOperationState::MutationSubmitted
                | AdmissionOperationState::EconomicMutationApplied
                | AdmissionOperationState::EconomicMutationNotApplied
        )
        && !attachments.has_slot(AdmissionAttachmentKind::SupplementalAuthorization.slot())
    {
        return Err(AdmissionOperationError::MissingParticipantAttachment {
            field: "supplemental_authorization_digest",
        });
    }
    let reached = |milestone| match milestone {
        AdmissionOperationState::BrokerAttemptRegistered => matches!(
            state,
            AdmissionOperationState::BrokerAttemptRegistered
                | AdmissionOperationState::ApprovalRequired
                | AdmissionOperationState::BudgetAuthorized
                | AdmissionOperationState::ApprovalReserved
                | AdmissionOperationState::ReadyToDispatch
                | AdmissionOperationState::CapturePending
                | AdmissionOperationState::DispatchCommitted
                | AdmissionOperationState::Finalizing
                | AdmissionOperationState::Completed
                | AdmissionOperationState::NotAcceptedAfterDispatchCommit
                | AdmissionOperationState::OutcomeUnknownAfterDispatch
        ),
        AdmissionOperationState::BudgetAuthorized => matches!(
            state,
            AdmissionOperationState::BudgetAuthorized
                | AdmissionOperationState::ApprovalReserved
                | AdmissionOperationState::ReadyToDispatch
                | AdmissionOperationState::CapturePending
                | AdmissionOperationState::DispatchCommitted
                | AdmissionOperationState::Finalizing
                | AdmissionOperationState::Completed
                | AdmissionOperationState::NotAcceptedAfterDispatchCommit
                | AdmissionOperationState::OutcomeUnknownAfterDispatch
        ),
        AdmissionOperationState::ApprovalReserved => matches!(
            state,
            AdmissionOperationState::ApprovalReserved
                | AdmissionOperationState::ReadyToDispatch
                | AdmissionOperationState::CapturePending
                | AdmissionOperationState::DispatchCommitted
                | AdmissionOperationState::Finalizing
                | AdmissionOperationState::Completed
                | AdmissionOperationState::NotAcceptedAfterDispatchCommit
                | AdmissionOperationState::OutcomeUnknownAfterDispatch
        ),
        _ => matches!(
            state,
            AdmissionOperationState::ReadyToDispatch
                | AdmissionOperationState::CapturePending
                | AdmissionOperationState::DispatchCommitted
                | AdmissionOperationState::Finalizing
                | AdmissionOperationState::Completed
                | AdmissionOperationState::NotAcceptedAfterDispatchCommit
                | AdmissionOperationState::OutcomeUnknownAfterDispatch
                | AdmissionOperationState::MutationReady
                | AdmissionOperationState::MutationSubmitted
                | AdmissionOperationState::EconomicMutationApplied
        ),
    };
    let approval_artifacts_required = requirements.approval
        && reached(AdmissionOperationState::ApprovalReserved)
        && (kind == AdmissionOperationKind::GovernedActiveResponse || attachments.has_slot(0));
    let required = [
        (
            requirements.broker_attempt
                && reached(AdmissionOperationState::BrokerAttemptRegistered),
            2,
            "broker_attempt",
        ),
        (
            requirements.budget_capture && reached(AdmissionOperationState::BudgetAuthorized),
            3,
            "budget_hold_id",
        ),
        (approval_artifacts_required, 0, "threshold_proposal_hash"),
        (approval_artifacts_required, 4, "approval_set_hash"),
        (
            requirements.execution_nonce && reached(AdmissionOperationState::ReadyToDispatch),
            5,
            "execution_nonce_id",
        ),
        (
            requirements.outcome_eligibility && reached(AdmissionOperationState::ReadyToDispatch),
            6,
            "outcome_eligibility_digest",
        ),
        (
            requirements.payment && reached(AdmissionOperationState::ReadyToDispatch),
            7,
            "payment_participant_id",
        ),
        (
            requirements.channel && reached(AdmissionOperationState::BrokerAttemptRegistered),
            9,
            "channel_reservation_proposal_digest",
        ),
        (
            requirements.channel && reached(AdmissionOperationState::ReadyToDispatch),
            10,
            "channel_reservation_digest",
        ),
        (
            requirements.credit_exposure && reached(AdmissionOperationState::BudgetAuthorized),
            11,
            "credit_exposure_reservation_digest",
        ),
    ];
    if let Some((_, _, field)) = required
        .into_iter()
        .find(|(needed, slot, _)| *needed && !attachments.has_slot(*slot))
    {
        return Err(AdmissionOperationError::MissingParticipantAttachment { field });
    }
    if state == AdmissionOperationState::ApprovalRequired {
        for (slot, field) in [
            (0, "threshold_proposal_hash"),
            (3, "budget_hold_id"),
            (12, "threshold_proposal"),
        ] {
            if !attachments.has_slot(slot) {
                return Err(AdmissionOperationError::MissingParticipantAttachment { field });
            }
        }
    }
    if let Some(proposal) = attachments
        .0
        .iter()
        .find_map(|attachment| match attachment {
            AdmissionAttachment::ThresholdProposal(proposal) => Some(proposal),
            _ => None,
        })
    {
        let digest = proposal
            .artifact_digest()
            .map_err(|_| AdmissionOperationError::ThresholdProposalMismatch)?;
        let bound = attachments
            .0
            .iter()
            .find_map(|attachment| match attachment {
                AdmissionAttachment::ThresholdProposalHash(digest) => Some(digest.as_str()),
                _ => None,
            });
        if bound != Some(digest.as_str()) {
            return Err(AdmissionOperationError::ThresholdProposalMismatch);
        }
    }
    Ok(())
}

pub(super) fn validate_state_requirements(
    kind: AdmissionOperationKind,
    requirements: AdmissionParticipantRequirements,
    state: AdmissionOperationState,
) -> Result<(), AdmissionOperationError> {
    let valid = if kind == AdmissionOperationKind::GovernedEconomicMutation {
        matches!(
            state,
            AdmissionOperationState::Prepared
                | AdmissionOperationState::MutationReady
                | AdmissionOperationState::MutationSubmitted
                | AdmissionOperationState::EconomicMutationApplied
                | AdmissionOperationState::EconomicMutationNotApplied
        )
    } else {
        match state {
            AdmissionOperationState::BrokerAttemptRegistered => requirements.broker_attempt,
            AdmissionOperationState::ApprovalRequired => {
                requirements.budget_capture && requirements.approval
            }
            AdmissionOperationState::BudgetAuthorized | AdmissionOperationState::CapturePending => {
                requirements.budget_capture
            }
            AdmissionOperationState::ApprovalReserved => requirements.approval,
            AdmissionOperationState::MutationReady
            | AdmissionOperationState::MutationSubmitted
            | AdmissionOperationState::EconomicMutationApplied
            | AdmissionOperationState::EconomicMutationNotApplied => false,
            AdmissionOperationState::Prepared
            | AdmissionOperationState::ReadyToDispatch
            | AdmissionOperationState::DispatchCommitted
            | AdmissionOperationState::Finalizing
            | AdmissionOperationState::Completed
            | AdmissionOperationState::CompensatedBeforeDispatch
            | AdmissionOperationState::NotAcceptedAfterDispatchCommit
            | AdmissionOperationState::OutcomeUnknownAfterDispatch => true,
        }
    };
    if valid {
        Ok(())
    } else {
        Err(AdmissionOperationError::StateKindMismatch { kind, state })
    }
}

pub(super) fn predispatch_state_enabled(
    requirements: AdmissionParticipantRequirements,
    state: AdmissionOperationState,
) -> bool {
    match state {
        AdmissionOperationState::Prepared | AdmissionOperationState::ReadyToDispatch => true,
        AdmissionOperationState::BrokerAttemptRegistered => requirements.broker_attempt,
        AdmissionOperationState::ApprovalRequired => {
            requirements.budget_capture && requirements.approval
        }
        AdmissionOperationState::BudgetAuthorized | AdmissionOperationState::CapturePending => {
            requirements.budget_capture
        }
        AdmissionOperationState::ApprovalReserved => requirements.approval,
        _ => false,
    }
}

pub(super) fn dispatch_state_for(
    kind: AdmissionOperationKind,
    state: AdmissionOperationState,
) -> Result<AdmissionDispatchState, AdmissionOperationError> {
    if kind == AdmissionOperationKind::GovernedEconomicMutation {
        return if matches!(
            state,
            AdmissionOperationState::Prepared
                | AdmissionOperationState::MutationReady
                | AdmissionOperationState::MutationSubmitted
                | AdmissionOperationState::EconomicMutationApplied
                | AdmissionOperationState::EconomicMutationNotApplied
        ) {
            Ok(AdmissionDispatchState::NotApplicable)
        } else {
            Err(AdmissionOperationError::StateKindMismatch { kind, state })
        };
    }
    if !kind.uses_dispatch() {
        return Err(AdmissionOperationError::StateKindMismatch { kind, state });
    }
    match state {
        AdmissionOperationState::Prepared
        | AdmissionOperationState::BrokerAttemptRegistered
        | AdmissionOperationState::ApprovalRequired
        | AdmissionOperationState::BudgetAuthorized
        | AdmissionOperationState::ApprovalReserved
        | AdmissionOperationState::ReadyToDispatch => Ok(AdmissionDispatchState::NotCommitted),
        AdmissionOperationState::CapturePending => Ok(AdmissionDispatchState::CapturePending),
        AdmissionOperationState::DispatchCommitted => Ok(AdmissionDispatchState::Committed),
        AdmissionOperationState::Finalizing => Ok(AdmissionDispatchState::Finalizing),
        AdmissionOperationState::Completed
        | AdmissionOperationState::CompensatedBeforeDispatch
        | AdmissionOperationState::NotAcceptedAfterDispatchCommit
        | AdmissionOperationState::OutcomeUnknownAfterDispatch => {
            Ok(AdmissionDispatchState::Terminal)
        }
        _ => Err(AdmissionOperationError::StateKindMismatch { kind, state }),
    }
}

pub(super) fn validate_dispatch_commit(
    operation: &AdmissionOperationV1,
) -> Result<(), AdmissionOperationError> {
    let requires_commit = operation.binding.kind.uses_dispatch()
        && matches!(
            operation.state,
            AdmissionOperationState::DispatchCommitted
                | AdmissionOperationState::Finalizing
                | AdmissionOperationState::Completed
                | AdmissionOperationState::NotAcceptedAfterDispatchCommit
                | AdmissionOperationState::OutcomeUnknownAfterDispatch
        );
    match (&operation.dispatch_commit, requires_commit) {
        (Some(binding), true)
            if binding.coordinator_lease_epoch == operation.coordinator_lease_epoch
                && binding.committed_version <= operation.version
                && match operation.binding.kind {
                    AdmissionOperationKind::ToolDispatch => {
                        binding.provider_attempt.as_ref() == operation.provider_attempt()
                            && binding.provider_attempt.as_ref().is_some_and(|attempt| {
                                attempt.operation_id == operation.binding.operation_id().as_str()
                            })
                    }
                    AdmissionOperationKind::GovernedActiveResponse => {
                        binding.provider_attempt.is_none()
                    }
                    AdmissionOperationKind::GovernedEconomicMutation => false,
                }
                && (operation.state != AdmissionOperationState::DispatchCommitted
                    || binding.committed_version == operation.version) =>
        {
            binding.validate()
        }
        (None, false) => Ok(()),
        _ => Err(AdmissionOperationError::DispatchStateMismatch),
    }
}

pub(super) fn is_legal_transition(
    kind: AdmissionOperationKind,
    requirements: AdmissionParticipantRequirements,
    from: AdmissionOperationState,
    to: AdmissionOperationState,
) -> bool {
    if kind == AdmissionOperationKind::GovernedEconomicMutation {
        return matches!(
            (from, to),
            (
                AdmissionOperationState::Prepared,
                AdmissionOperationState::MutationReady
            ) | (
                AdmissionOperationState::MutationReady,
                AdmissionOperationState::MutationSubmitted
            ) | (
                AdmissionOperationState::Prepared
                    | AdmissionOperationState::MutationReady
                    | AdmissionOperationState::MutationSubmitted,
                AdmissionOperationState::EconomicMutationNotApplied
            ) | (
                AdmissionOperationState::MutationSubmitted,
                AdmissionOperationState::EconomicMutationApplied
            )
        );
    }
    if !kind.uses_dispatch() {
        return false;
    }
    if to == AdmissionOperationState::CompensatedBeforeDispatch {
        return from.is_pre_dispatch() && predispatch_state_enabled(requirements, from);
    }
    let ready_source = if requirements.approval {
        AdmissionOperationState::ApprovalReserved
    } else if requirements.budget_capture {
        AdmissionOperationState::BudgetAuthorized
    } else {
        AdmissionOperationState::Prepared
    };
    match to {
        AdmissionOperationState::BrokerAttemptRegistered => {
            requirements.broker_attempt && from == AdmissionOperationState::Prepared
        }
        AdmissionOperationState::BudgetAuthorized => {
            requirements.budget_capture
                && ((requirements.approval && from == AdmissionOperationState::ApprovalRequired)
                    || from
                        == if requirements.broker_attempt {
                            AdmissionOperationState::BrokerAttemptRegistered
                        } else {
                            AdmissionOperationState::Prepared
                        })
        }
        AdmissionOperationState::ApprovalRequired => {
            requirements.budget_capture
                && requirements.approval
                && from
                    == if requirements.broker_attempt {
                        AdmissionOperationState::BrokerAttemptRegistered
                    } else {
                        AdmissionOperationState::Prepared
                    }
        }
        AdmissionOperationState::ApprovalReserved => {
            requirements.approval
                && from
                    == if requirements.budget_capture {
                        AdmissionOperationState::BudgetAuthorized
                    } else {
                        AdmissionOperationState::Prepared
                    }
        }
        AdmissionOperationState::ReadyToDispatch => {
            from == ready_source
                || (kind == AdmissionOperationKind::ToolDispatch
                    && requirements.budget_capture
                    && requirements.approval
                    && from == AdmissionOperationState::BudgetAuthorized)
        }
        AdmissionOperationState::CapturePending => {
            requirements.budget_capture && from == AdmissionOperationState::ReadyToDispatch
        }
        AdmissionOperationState::DispatchCommitted => {
            from == if requirements.budget_capture {
                AdmissionOperationState::CapturePending
            } else {
                AdmissionOperationState::ReadyToDispatch
            }
        }
        AdmissionOperationState::Finalizing
        | AdmissionOperationState::NotAcceptedAfterDispatchCommit
        | AdmissionOperationState::OutcomeUnknownAfterDispatch => {
            from == AdmissionOperationState::DispatchCommitted
                || (to == AdmissionOperationState::OutcomeUnknownAfterDispatch
                    && from == AdmissionOperationState::Finalizing)
        }
        AdmissionOperationState::Completed => from == AdmissionOperationState::Finalizing,
        _ => false,
    }
}