Skip to main content

deepstrike_sdk/runtime/
canonical_kernel.rs

1//! Typed Rust surface for the Canonical Kernel ABI.
2//!
3//! This module deliberately re-exports the core-owned wire values instead of wrapping them in
4//! SDK JSON DTOs. Rust callers therefore prepare a typed [`WireEnvelope`], receive the closed
5//! [`CanonicalPreparation`] enum, persist [`KernelRecord::record_bytes`], and commit with the
6//! digest core produced. There is no production direct-step method.
7
8pub use deepstrike_core::runtime::kernel::wire::{
9    CanonicalKernel, CheckpointAdvice, CheckpointBoundary, ConfigDefaults, Digest, DurableHead,
10    EffectKind, EffectsDisposition, InputId, KernelEffect, KernelFault, KernelFaultCode,
11    KernelInput, KernelPreparation, KernelRecord, KernelTerminal, OperationId, OperationLifecycle,
12    PlannedStep, PrepareToken, RestoreCost, StepDisposition, TailUsage, TerminalDisposition,
13    WireEnvelope, WireU64, canonical_digest,
14};
15
16pub type CanonicalPreparation = KernelPreparation<KernelRecord, PlannedStep>;
17pub type CanonicalCommit = deepstrike_core::runtime::kernel::wire::CommittedTransition<PlannedStep>;
18pub type CanonicalCheckpoint = deepstrike_core::runtime::kernel::wire::KernelCheckpoint;
19pub type CanonicalCheckpointCandidate = deepstrike_core::runtime::kernel::wire::CheckpointCandidate;
20
21#[cfg(test)]
22mod tests {
23    use serde_json::Value;
24
25    use super::{CanonicalKernel, CanonicalPreparation, WireEnvelope};
26
27    #[test]
28    fn typed_rust_api_reads_the_shared_canonical_golden() {
29        let fixture: Value = serde_json::from_str(include_str!(
30            "../../../tests/fixtures/kernel-wire/golden_lifecycle_agent_root.json"
31        ))
32        .expect("canonical fixture");
33        let envelope: WireEnvelope =
34            serde_json::from_value(fixture["links"][0]["envelope"].clone())
35                .expect("typed envelope");
36        let mut kernel = CanonicalKernel::default();
37
38        let CanonicalPreparation::Prepared(prepared) = kernel.prepare(&envelope) else {
39            panic!("golden configure must prepare");
40        };
41        assert_eq!(
42            prepared.record.record_digest().as_str(),
43            fixture["genesis_digest"].as_str().unwrap()
44        );
45        assert_eq!(
46            std::str::from_utf8(prepared.record.record_bytes().as_slice()).unwrap(),
47            serde_json::to_string(&fixture["links"][0]["record"]).unwrap()
48        );
49    }
50}