Skip to content

Commit fa06c89

Browse files
author
Roy Lin
committed
docs: require complete OCI runtime conformance
1 parent baaf0d8 commit fa06c89

1 file changed

Lines changed: 95 additions & 54 deletions

File tree

docs/cross-platform-oci-runtime-development-plan.md

Lines changed: 95 additions & 54 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
# Cross-Platform OCI Runtime Development Plan
22

3-
Status: **Proposed**
3+
Status: **In development**
44

55
Scope: repository extraction, runtime architecture, delivery order, migration
66
from certified `crun`, and release gates
@@ -9,7 +9,7 @@ Target repository: `git@github.com:A3S-Lab/OCI-Runtime.git`
99

1010
Target 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

4547
KVM is an optional Linux VM backend, not an installation, startup, Sandbox, or
4648
SDK 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
168172
exact supported version and feature set in `features` output.
169173

170174
The 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

183192
OCI 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

189198
References:
190199

@@ -199,7 +208,9 @@ References:
199208
```text
200209
Box / 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:
539552
Exit 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

639675
Deliverables:
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

658694
Deliverables:
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

681717
Deliverables 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
801838
implementation. It contains process-wide state and best-effort enforcement
802839
that 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

841880
Image pulls, arbitrary networking, Compose, CRI, TEE, snapshots, and Box SDK
842881
integration 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

Comments
 (0)