11# Cross-Platform OCI Runtime Development Plan
22
3- Status: ** Proposed **
3+ Status: ** In development **
44
55Scope: repository extraction, runtime architecture, delivery order, migration
66from certified ` crun ` , and release gates
@@ -9,7 +9,7 @@ Target repository: `git@github.com:A3S-Lab/OCI-Runtime.git`
99
1010Target monorepo path: ` crates/oci-runtime `
1111
12- Primary Rust package: ` a3s-oci-runtime `
12+ Primary Rust packages: ` a3s-oci-sdk ` and ` a3s-oci-runtime `
1313
1414## Executive decision
1515
@@ -26,21 +26,23 @@ container executor:
2626- a libkrun driver starts a Linux utility VM through KVM, HVF, or WHPX and asks
2727 a guest agent to execute the same container logic inside the guest.
2828
29- The first production objective is narrower than complete general-purpose
30- ` crun ` compatibility:
29+ The release objective is complete OCI Runtime Specification 1.3.0 conformance
30+ for every normative requirement applicable to Linux containers and each
31+ advertised native or utility-VM driver. A restricted A3S bundle profile may be
32+ used as an early implementation fixture, but it is not an acceptable
33+ production compatibility boundary and cannot be used to remove ` crun ` .
3134
32- 1 . replace the ` crun ` process boundary used by A3S Box for the supported A3S
33- Sandbox profile;
34- 2 . retain certified ` crun ` as a rollback backend while differential,
35- conformance, security-negative, and soak gates run;
36- 3 . remove ` crun ` only after the native Linux driver satisfies every mandatory
37- A3S Sandbox control and lifecycle requirement;
38- 4 . claim general OCI runtime compatibility only after the broader OCI
39- configuration and hook matrix passes.
35+ Development remains incremental:
4036
41- This order keeps the initial contract honest. A runtime that supports only the
42- A3S-generated bundle profile must report that profile explicitly and reject
43- unsupported OCI properties rather than silently ignore them.
37+ 1 . build and test the complete public Rust SDK and OCI model boundary;
38+ 2 . land lifecycle and driver operations behind truthful capability states;
39+ 3 . retain certified ` crun ` as a rollback and differential oracle;
40+ 4 . migrate A3S Box only after the complete applicable OCI configuration,
41+ lifecycle, hook, security, recovery, and soak gates pass.
42+
43+ Unsupported or inapplicable properties must fail before runtime state mutation.
44+ They must never be silently ignored or omitted while crossing the SDK, host,
45+ transport, durable-state, or guest-agent boundaries.
4446
4547KVM is an optional Linux VM backend, not an installation, startup, Sandbox, or
4648SDK prerequisite. Native Linux support on a host where ` /dev/kvm ` is absent,
@@ -64,19 +66,17 @@ Keeping it separate provides:
6466- a one-way dependency graph that prevents the runtime from importing product
6567 policy.
6668
67- The dependency direction must be:
69+ The Rust crate dependency direction must be:
6870
6971``` text
70- a3s-box
71- |
72- v
73- a3s-oci-runtime
74- |
75- v
76- a3s-libkrun-sys
72+ a3s-box ---------> a3s-oci-sdk <--------- a3s-oci-runtime
73+ |
74+ v
75+ a3s-libkrun-sys + platform driver
7776```
7877
7978` a3s-oci-runtime ` must not depend on ` a3s-box-core ` or ` a3s-box-runtime ` .
79+ ` a3s-oci-sdk ` must not depend on runtime drivers.
8080
8181## Product and security terminology
8282
@@ -126,6 +126,10 @@ option explicitly.
126126
127127- Implement the OCI create, start, state, kill, and delete lifecycle with
128128 durable, crash-reconcilable state.
129+ - Implement every normative OCI Runtime Specification 1.3.0 requirement
130+ applicable to Linux containers and the drivers advertised by the runtime.
131+ - Provide a complete async, strongly typed, ` Send + Sync ` Rust SDK for A3S Box
132+ without CLI construction or driver-specific imports.
129133- Support run, exec, pause, resume, process I/O, terminal resize, resource
130134 updates, and events required by A3S Box.
131135- Run Linux OCI bundles on:
@@ -145,8 +149,8 @@ option explicitly.
145149- Fail closed when a requested security or resource control cannot be applied.
146150- Ship version-matched host binaries, guest agent, kernel/firmware, libkrun
147151 library, protocol schema, and provenance records.
148- - Produce enough standard compatibility that the runtime can later be used by
149- a containerd shim without redesigning the core lifecycle.
152+ - Preserve complete OCI models and semantics so a future containerd shim does
153+ not require a second lifecycle implementation .
150154
151155## Non-goals for the first production release
152156
@@ -158,18 +162,23 @@ option explicitly.
158162- Host PID namespace sharing in a utility-VM backend.
159163- Cross-tenant sharing of a utility VM.
160164- CRI or containerd shim v2 before the standalone OCI lifecycle is stable.
161- - General OCI compatibility claims while hooks or configuration fields remain
162- rejected.
163165- Removing ` crun ` before rollback and differential gates pass.
164166
165167## Standards baseline
166168
167- The runtime must track the current OCI Runtime Specification and record the
169+ The runtime is pinned to OCI Runtime Specification 1.3.0 until an explicit
170+ standards-update commit advances the schemas, Rust models, property inventory,
171+ fixtures, validators, and conformance evidence together. It must record the
168172exact supported version and feature set in ` features ` output.
169173
170174The initial implementation must:
171175
172- - accept the OCI versions required by existing A3S bundles;
176+ - represent the complete official OCI ` Spec ` , ` Process ` , ` LinuxResources ` ,
177+ ` State ` , and ` Features ` models in the Rust SDK;
178+ - classify every OCI 1.3.0 schema property as applicable, inapplicable to the
179+ selected workload platform, or unsupported by the selected driver;
180+ - accept all applicable configuration after its semantic and enforcement
181+ implementation passes;
173182- implement the specified ` creating ` , ` created ` , ` running ` , and ` stopped `
174183 states;
175184- guarantee that ` create ` prepares the container but does not execute the
@@ -181,10 +190,10 @@ The initial implementation must:
181190- reject unsupported configuration before mutating runtime state.
182191
183192OCI Runtime Specification 1.3 includes a VM-specific configuration section
184- for hypervisor, kernel, VM image, vCPU, and memory intent. The runtime may
185- consume safe hardware intent from that section, but it must select only
186- certified A3S hypervisor and kernel artifacts. It must reject an untrusted
187- request to execute an arbitrary hypervisor path.
193+ for hypervisor, kernel, initrd, image, and parameter intent. The runtime must
194+ preserve those fields but may select only certified A3S hypervisor, kernel,
195+ firmware, and system-image artifacts. It must reject an untrusted request to
196+ execute an arbitrary path.
188197
189198References:
190199
@@ -199,7 +208,9 @@ References:
199208``` text
200209Box / OCI CLI / future containerd shim
201210 |
202- OCI runtime service API
211+ a3s-oci-sdk
212+ |
213+ OCI runtime service
203214 |
204215 durable state + operation journal
205216 |
@@ -364,6 +375,7 @@ OCI-Runtime/
364375|-- Cargo.toml
365376|-- crates/
366377| |-- core/ # pure lifecycle, state, errors, protocol types
378+ | |-- sdk/ # complete async Rust client and OCI model boundary
367379| |-- linux-executor/ # Linux-only isolation and process implementation
368380| |-- agent/ # static Linux guest binary
369381| |-- runtime/ # host orchestration and native/libkrun drivers
@@ -378,7 +390,7 @@ OCI-Runtime/
378390| |-- threat-model.md
379391| |-- protocol.md
380392| |-- state-and-recovery.md
381- | `-- supported- oci-profile .md
393+ | `-- oci-conformance .md
382394`-- scripts/
383395 |-- build-guest.ps1
384396 |-- package-runtime.ps1
@@ -530,7 +542,8 @@ Deliverables:
530542
531543- independent repository skeleton;
532544- architecture and threat-model documents;
533- - supported OCI profile document;
545+ - OCI 1.3.0 conformance contract and generated schema-property inventory;
546+ - complete async ` a3s-oci-sdk ` operation and model boundary;
534547- lifecycle state machine and recovery journal schemas;
535548- protocol schema with version negotiation;
536549- platform support and packaging matrix;
@@ -539,7 +552,9 @@ Deliverables:
539552Exit criteria:
540553
541554- no runtime code depends on Box;
542- - unsupported OCI fields have an explicit reject/defer decision;
555+ - every OCI 1.3.0 property has an implementation owner and applicability
556+ classification;
557+ - no complete OCI model field is lost at the SDK service boundary;
543558- create/start ordering and rollback behavior are testable as pure state
544559 transitions;
545560- security review accepts the trust boundary and state directory model.
@@ -634,12 +649,33 @@ Exit criteria:
634649 seccomp, capability, and cleanup tests;
635650- rootless and rootful certification lanes pass on x86_64 and aarch64 Linux.
636651
637- ### M5: Box experimental backend
652+ ### M5: Complete OCI 1.3 conformance
653+
654+ Deliverables:
655+
656+ - complete common, process, Linux, VM, state, feature, lifecycle, and hook
657+ semantics applicable to the advertised Linux-container drivers;
658+ - generated property and normative-requirement coverage;
659+ - upstream OCI schema and lifecycle validation;
660+ - differential, security-negative, recovery, and soak evidence;
661+ - exact feature output generated from the tested implementation.
662+
663+ Exit criteria:
664+
665+ - every applicable OCI Runtime Specification 1.3.0 MUST and MUST NOT has
666+ retained passing evidence;
667+ - no schema property is unclassified or silently ignored;
668+ - all unsupported workload-platform combinations fail before state mutation;
669+ - feature output contains no untested capability;
670+ - real WHPX and native Linux lanes pass the same lifecycle and configuration
671+ suites.
672+
673+ ### M6: Box experimental backend
638674
639675Deliverables:
640676
641- - released and digest-pinned runtime artifacts;
642- - Box ` A3sOci ` backend adapter;
677+ - released and digest-pinned runtime and SDK artifacts;
678+ - Box ` A3sOci ` backend adapter using ` a3s-oci-sdk ` only ;
643679- explicit experimental capability reporting;
644680- dual-runtime differential CI;
645681- migration and rollback documentation.
@@ -653,7 +689,7 @@ Exit criteria:
653689- no Box image, SDK, or product logic has moved into the runtime;
654690- rollback to certified ` crun ` is possible before a new execution starts.
655691
656- ### M6 : Replace certified crun for the A3S profile
692+ ### M7 : Replace certified crun
657693
658694Deliverables:
659695
@@ -673,19 +709,18 @@ Exit criteria:
673709 state schema;
674710- ` crun ` remains available for one deprecation release, then is removed.
675711
676- ### M7: Broader OCI and containerd compatibility
712+ ### After M7: containerd integration
677713
678- This milestone begins only after M6 and is not required to replace ` crun ` for
679- the restricted A3S bundle profile .
714+ Containerd integration begins only after the complete OCI release and Box
715+ migration gates pass .
680716
681717Deliverables may include:
682718
683- - the remaining OCI hook and configuration matrix;
684- - standard bundle and runtime conformance submissions;
685719- containerd shim v2 with separate sandbox and task lifecycles;
686720- snapshotter and block-rootfs integration.
687721
688- Compatibility claims must name the exact completed profile and test suite.
722+ Containerd support must reuse the same lifecycle and SDK/service contracts
723+ rather than introduce a second runtime implementation.
689724
690725## Validation gates
691726
@@ -739,7 +774,9 @@ and the native `a3s-oci` driver. Compare:
739774- exec behavior;
740775- cleanup and residual host resources.
741776
742- A difference must be documented as an intentional profile restriction or fixed.
777+ A difference must be explained by an OCI-permitted implementation choice or
778+ the submitted workload platform being inapplicable; otherwise it must be
779+ fixed.
743780
744781### Security-negative gates
745782
@@ -801,11 +838,13 @@ Existing guest-init code proves the needed primitives but is a single-container
801838implementation. It contains process-wide state and best-effort enforcement
802839that must not define the new runtime contract.
803840
804- ### OCI profile scope
841+ ### OCI completeness tracking
805842
806- M0 must publish a machine-readable feature/profile description. A3S Box may
807- depend only on features in that profile. Unsupported standard features are
808- rejected until implemented and tested.
843+ M0 must publish a machine-readable feature description and a generated OCI
844+ 1.3.0 property inventory. A3S Box may depend only on features advertised by
845+ the exact tested runtime build. During development, known but unenforced
846+ properties are rejected before create. Production promotion requires every
847+ applicable property and normative requirement to reach the conformant state.
809848
810849## First implementation slices
811850
@@ -840,7 +879,7 @@ executor is proven before it becomes guest infrastructure.
840879
841880Image pulls, arbitrary networking, Compose, CRI, TEE, snapshots, and Box SDK
842881integration are excluded from these first two slices. Box and SDK integration
843- is a blocking M5 gate, including the no-KVM Linux matrix.
882+ is a blocking M6 gate, including the no-KVM Linux matrix.
844883
845884## Migration and rollback
846885
@@ -856,7 +895,7 @@ is a blocking M5 gate, including the no-KVM Linux matrix.
856895 existing ` a3s-oci ` state is reconciled or explicitly quarantined.
857896- Runtime state schemas support an explicit read/upgrade path and reject
858897 unsupported downgrade rather than corrupting state.
859- - ` crun ` packaging is removed only after the M6 deprecation release.
898+ - ` crun ` packaging is removed only after the M7 deprecation release.
860899
861900## Definition of done
862901
@@ -869,6 +908,8 @@ The project replaces `crun` for A3S Box only when:
869908- Linux native and shared-utility-VM paths use the same reviewed
870909 ` LinuxExecutor ` ;
871910- Windows provides real shared-guest-kernel OCI execution without WSL;
911+ - every applicable OCI Runtime Specification 1.3.0 property and normative
912+ requirement has retained conformance evidence;
872913- every requested namespace, mount, cgroup, seccomp, capability, user, and
873914 resource control has active evidence or fails closed;
874915- create/start/state/kill/delete, exec, I/O, pause/resume, update, wait, and
0 commit comments