A3S OCI Runtime Roadmap

August 22, 2026 · View on GitHub

Status: In development

Standards baseline: OCI Runtime Specification 1.3.0

Primary consumer: A3S Box through a3s-oci-sdk

Release Contract

The production runtime must implement every normative OCI Runtime Specification 1.3.0 requirement applicable to Linux containers and every driver it advertises. A reduced A3S-only OCI profile is not an acceptable terminal state.

Complete means all of the following:

  1. every applicable config.json, state, and feature property is represented without loss;
  2. every applicable value and cross-field rule is validated before runtime state mutation;
  3. every requested control is enforced or the operation fails;
  4. lifecycle and hook ordering matches the specification;
  5. recovery preserves the same externally observable state;
  6. upstream OCI validation and lifecycle suites pass;
  7. the feature report describes only behavior that passed the same release build's tests.

The SDK is also a release blocker. A3S Box must be able to perform the complete supported lifecycle without constructing CLI commands or importing platform driver internals.

Repository Boundary

A3S OCI Runtime is the sole low-level execution engine. It owns exact OCI validation, actual container state, durable operation replay, process control, platform drivers, utility VMs, the guest agent, and runtime-scoped cleanup.

A3S Box owns product configuration and desired state, image distribution and builds, named volumes and product snapshots, network/IPAM/DNS policy, Compose, health and restart policy, log retention, and secret authorization. Box passes prepared, immutable execution inputs through a3s-oci-sdk; OCI Runtime does not pull images, build images, implement Compose, or become a Docker daemon.

The dependency direction is strict:

A3S Box or containerd shim
          |
          | a3s-oci-sdk over bounded local IPC
          v
OCI Runtime host service
          |
          +-- native Linux driver
          `-- utility-VM drivers (KVM / HVF / WHPX)
                          |
                          `-- authenticated Linux guest agent

Boundary rules:

  1. OCI Runtime must not depend on Box product crates or durable state types. Box-specific fixtures may test compatibility but cannot define runtime semantics.
  2. Box requests DedicatedVm, SharedGuestKernel, or SharedHostKernel. Runtime selects an enforcing driver and never silently weakens isolation.
  3. Runtime owns actual OCI state, process/VM identity, generation, exit status, operation journals, recovery, and quarantine. Callers own desired state and retain only an exact runtime reference.
  4. Image, storage, network, secret, and TEE policy stay outside the OCI core. Versioned extensions may attach already-authorized resources or expose runtime mechanisms without moving product policy into this repository.
  5. The containerd runtime-v2 shim belongs here and calls the SDK directly. It must not shell out to A3S Box or duplicate lifecycle state.

Delivery Milestones

The detailed workstreams below are not a strict waterfall. Integration begins with an early vertical slice so contract problems are found before every OCI field and platform feature is implemented.

MilestoneRuntime deliveryCross-repository exit gate
M0 - Boundary freezeGeneric public contracts, attachment schemas, driver/isolation vocabulary, and state ownershipBox depends only on a3s-oci-sdk; runtime behavior does not depend on Box types
M1 - Host serviceMulti-driver registry, secure Unix/Windows service endpoints, durable routing, state migration, restart reconciliation, and reattachment/cleanupA service restart at every lifecycle boundary preserves or safely terminates the exact workload
M2 - Windows experimentalLaunch-ready WHPX driver, protected runtime storage, pinned kernel, immutable system root, authenticated protocol-v10 agent, and leak gatesA fresh Windows host passes complete SDK lifecycle, I/O, filesystem, resource, recovery, and multi-container suites
M3 - Box cutoverStable SDK surface and Linux/KVM/HVF drivers needed by the unified Box adapterBox routes microvm and sandbox through the SDK with no silent fallback
M4 - containerdRuntime-v2 shim using OCI bundles and SDK operations directlycontainerd task, restart, I/O, and cleanup suites pass without invoking the Box CLI
M5 - parity extensionsStorage/network attachments, reusable guest sessions, checkpoint/restore, and TEE mechanismsBox storage, networking, warm-pool, snapshot, and security gates pass through public extensions
M6 - supported releaseOCI 1.3 evidence, adversarial security, upgrade compatibility, signed packages, and long-running real-host qualificationEvery advertised driver and operation has evidence from the exact release artifacts

Conformance is continuous across M1-M6. R5 is the final audit, not the first time normative requirements are enforced. Box migration starts after the M1 vertical slice and does not wait for every optional OCI feature.

Remaining Work Execution Plan

The detailed workstreams below are the canonical task checklist. This section orders that work; it does not maintain a second completion state.

WaveOutcomeCanonical workstreamsExit evidence
W0 - Evidence and host safetyClose normative classification, descriptor-relative ownership, and utility-VM transport recovery gaps before widening launch claimsR0, R1, R5No unclassified requirement or silent path fallback; every injected host/agent interruption recovers or cleans up the exact generation
W1 - Native Linux qualificationTurn the existing explicit Native Linux path into a packaged, reproducible A3S Box Sandbox baseline without KVMR3, R4Signed or checksummed packages pass the complete Rust, Python, TypeScript, and Go Sandbox suites on x86_64 and aarch64 with /dev/kvm absent and inaccessible
W2 - Real-driver restart continuityReattach supported live process, I/O, and filesystem sessions after an out-of-process runtime restart, or terminate them with exact durable evidenceR1, R6Native Linux and one utility-VM driver pass the same owner-death and service-restart matrix without duplicate effects, invented exit status, or leaked resources
W3 - Utility-VM experimental driversQualify immutable guest assets and complete WHPX first, followed by HVF and KVM through the same SDK and guest-agent contractR2, R2M, R2L, R3Each promoted driver independently passes lifecycle, I/O, filesystem, resource, recovery, negative-isolation, multi-container, and soak gates on a fresh host
W4 - A3S Box cutoverRoute both Box isolation choices through the SDK and remove fallback only after behavior and recovery parity passR6microvm and sandbox use recorded SDK routes with no direct VMM path, no silent fallback, and complete cross-platform behavior and soak evidence
W5 - Downstream adapters and extensionsAdd containerd and optional parity mechanisms without moving product policy into the runtimeR7, R8Each adapter or extension is version-negotiated, separately advertised, restart-safe, and tested through public SDK contracts
W6 - Supported releaseFinish upstream OCI, adversarial security, upgrade, packaging, and long-running qualification against exact release artifactsR5, M6The release report binds every advertised driver and operation to passing evidence from the published artifacts

R5 work runs throughout every wave. W6 is the final audit of evidence produced earlier, not a late conformance implementation phase. Work within a wave may run in parallel, but a readiness promotion waits for that wave's complete exit evidence.

Every retained real-host report must identify the source commit, package or runtime-asset digest, platform, architecture, driver, isolation class, schema version, and exact test profile. A green capability probe, an unretained local run, or evidence from a different artifact does not satisfy an exit gate.

Current Baseline

Completed:

  • independent A3S-Lab/OCI-Runtime repository and monorepo submodule;
  • pure OCI lifecycle transition contract;
  • versioned driver status, readiness, isolation, and evidence;
  • deterministic multi-driver selection and durable recorded-driver routing, including fail-closed startup audit for missing or isolation-drifted drivers;
  • protected Windows SDK host serving over a local named pipe with first-owner, DACL, remote-client rejection, concurrency, and shutdown-release gates;
  • explicit clone-wide guest-agent transport shutdown before utility-VM shim reap, providing the ownership boundary required by a long-lived VM driver;
  • single-owner utility-VM sessions with clone-safe guest access and idempotent retained cleanup evidence, exercised by WHPX/HVF lifecycle harnesses;
  • one shared 20-workload-operation guest-to-driver adapter, including exact-target file transfer and filesystem metadata/mutations, plus a qualification-only WHPX RuntimeDriver candidate that owns one VM per exact dedicated-VM generation, serializes same-ID launch without blocking distinct container VMs, retains retryable create sessions, reaps terminal failures and deletes once, and refuses bundles outside a protected, per-generation runtime share mounted separately from the system root; owner-death restart reconciliation retains an exact-generation stopped tombstone and replays authenticated exit evidence when available;
  • one platform-neutral dedicated utility-VM lifecycle shared by the public HVF driver and the Linux KVM candidate. It serializes Create per container, owns one VM per exact generation, validates isolation before moving a bundle, validates missing, linked, non-private, drifted, escaping-rootfs, and absolute-bind handoff sources before creating a Guest-visible share, retains retryable handoffs, removes terminal and conflicting generations, delegates all 20 workload operations and six OCI hook phases, recovers stopped tombstones, and shuts down each live owner at most once;
  • secure WHPX DLL loading and hypervisor capability probe;
  • native Linux namespace, cgroup v2, and pidfd signaling prerequisite reporting that does not touch /dev/kvm;
  • Linux KVM device, access, ioctl, and API-version reporting without libkrun initialization;
  • deterministic Linux x86_64 and AArch64 libkrun archives with one shared manifest binding archive, library, firmware, and exported-kernel identities;
  • isolated Linux libkrun create/configure/plain-vsock/release context evidence with runtime symlink and content-drift rejection, without opening /dev/kvm or entering a VM;
  • a shared Linux KVM lifecycle qualification entry for x86_64 and AArch64, with 16 KVM-gated lifecycle, multi-container, lifecycle-fault, and transport-fault cases plus an explicit zero-case unavailable report on runners that cannot open KVM;
  • a qualification-only Linux KVM Host Service entry that keeps the public candidate probe-only, but permits one explicitly scoped owner-death and restart gate to register the exact driver. The gate SIGKILLs a live service, requires pidfd-bound shim/worker cleanup and authenticated SIGKILL evidence, opens a distinct replacement service, replays stopped state and Wait, and performs stopped-only Delete with descriptor, endpoint, handoff, share, and recovery-report cleanup. CI emits zero-case unavailable evidence when KVM cannot be opened; fresh-host available reports are still outstanding;
  • a separate linux-kvm-bounded-soak-only-v1 Host Service entry that runs a default 25 fresh generations through one durable owner. Every wave retains exact generation and replay evidence plus process, descriptor, marker, endpoint, bundle-handoff, runtime-share, recovery-report, and configured Guest cgroupsPath lifetime checks. CI records zero completed iterations and skips the Alpine fixture when KVM cannot be opened;
  • one fail-closed a3s.oci.linux-kvm-provenance.v1 contract shared by the authenticated entry, post-probe failure, compatibility-drift, lifecycle, owner-restart, and soak reports. It requires a clean exact checkout, rejects a claimed revision that differs from the built checkout, and binds the Git object format, commit/tree, Linux platform/architecture, CLI and shim bytes, runtime manifest and selected runtime files, immutable system-image manifest, build/test profiles, libkrun-kvm, and DedicatedVm. PR qualification now records the actual checked-out merge commit rather than a different branch-head revision;
  • Apple Silicon and Hypervisor.framework capability reporting through a direct kern.hv_support query;
  • entitlement-aware direct Hypervisor.framework VM-object create/destroy evidence with versioned, fail-closed diagnostics;
  • isolated macOS libkrun context create/configure/plain-vsock/release evidence from a checksum-pinned, runtime-reverified arm64 bundle;
  • real macOS HVF guest entry using the pinned libkrun firmware kernel and a digest-verified Alpine arm64 userspace, with natural exit status, exact host-visible marker verification, bounded worker reap, and marker cleanup;
  • real macOS static arm64 guest-agent boot through AF_VSOCK and a private Unix socket, with LOCAL_PEERPID, direct shim-worker parent verification, one-time token authentication, protocol-v10 negotiation, exact advertisement of 20 workload operations plus one maintenance acknowledgement, process-group termination, exact endpoint removal, observed PID reap, and in-process descriptor-inventory restoration;
  • real macOS fixed-bundle create/state/start/kill/wait/delete evidence using the shared Windows lifecycle harness, including exact mutation retries, create/start separation, bounded running wait, exact repeated normal exit status, exact live process inventory, cgroup-v2 pause/resume with real workload-progress evidence, replay-safe live CPU/memory/cpuset/PID update, normalized cgroup-v2 stats, running and stopped observation, post-delete NotFound, and nominal process, endpoint, marker, and runtime-root cleanup;
  • real macOS no-delete cleanup after successful create, start, and kill boundaries, with exact fault identity, guest executor shutdown, endpoint and marker removal, shim/worker reap, descriptor-inventory restoration, and no new guest runtime root;
  • real macOS protocol-v9 create interruption at all four Host and five Guest request/dispatch/response transitions, with one exact crossing, nonce-bound Guest cleanup evidence, no normal delete, complete Guest runtime cleanup, and Host endpoint, process, and descriptor restoration, plus both explicit Host shutdown transitions after a successful create, with idempotent owner close and the same complete cleanup evidence;
  • bounded, versioned macOS HVF soak orchestration that starts a fresh utility VM for every complete two-container lifecycle, namespace-join, rootfs/mount, and PID-supervision matrix, and retains unique endpoint, process, descriptor, marker, runtime-root, and per-wave console evidence;
  • explicit native Linux driver integration that reuses the shared executor without linking or initializing libkrun;
  • real native Linux create/state/start/kill/wait/delete SDK evidence on x86_64 and aarch64, including exact repeated SIGKILL status and bounded running wait, plus public SDK exec replay, duplicate process-ID rejection, durable process journals, pidfd signal replay, stable per-process wait, and init-exit exec cleanup, exact init/exec oom_score_adj read-back, plus durable cgroup-v2 pause/resume and exact live process inventory, replay-safe resource update, and normalized stats with real workload-progress evidence, plus controlling PTY allocation, OCI consoleSize initial and resized dimensions, exact init LINUX32 personality, exec CPU affinity before and after workload cgroup membership, interactive I/O, merged output, and VEOF close, repeated with /dev/kvm absent and present but unusable;
  • type-checked joins for existing UTS, mount, IPC, network, cgroup, PID, user, and time namespaces, including retained rootfs execution after a mount join, three-pass user-namespace permission recovery, and shared native Linux/macOS utility-VM lifecycle evidence;
  • detached ID-mapped filesystem and bind mounts using exact dedicated or container user-namespace mappings, including native idmap versus ridmap recursion and unchanged source-ownership evidence plus shared native Linux/macOS utility-VM lifecycle evidence;
  • real native Linux no-delete cleanup after create, start, and kill on x86_64 and aarch64, including init-PID reap and executor, durable-state, marker, and session-root removal;
  • WHPX partition-object create/delete smoke on Windows;
  • isolated libkrun shim with a pinned, checksum-verified Windows runtime bundle;
  • libkrun context create/configure/release smoke on Windows;
  • real WHPX VM entry, Linux userspace command, virtiofs marker, and natural exit-code smoke on Windows;
  • real WHPX guest-agent boot through AF_VSOCK and the protected Windows pipe, with exact shim-PID authentication, protocol-v1 negotiation, and retained host/shim evidence;
  • Linux guest bootstrap executor for an exact fail-closed OCI profile, with a PID-authenticated abstract Unix create/start barrier, create-time UTS, mount, IPC, network, cgroup, PID, user, and time namespaces, parent-installed UID/GID maps, verified time offsets, hostname and domainname, isolated rootfs propagation, ordered OCI mounts with missing target creation, masked and read-only paths, read-only rootfs enforcement, pivot_root, authenticated host-visible PID reporting, exact-generation state, a dedicated namespace PID 1 supervisor with adopted-child reaping, bounded typed init rejection reporting, session idempotency, retained workload pidfd signaling, exact-target exec registries with retained rootfs and namespace descriptors, per-process pidfds and replay journals, stable process wait, cgroup-v2 pause/resume, live process inventory, init-exit supervision, and complete session cleanup;
  • helper-backed rootless native Linux create/start/exec/signal/wait/kill/delete evidence on x86_64 and aarch64, with container root mapped exactly to the nonzero effective host UID/GID, subordinate UID/GID ranges installed through verified setuid-root newuidmap/newgidmap, setgroups=deny, exact map and ownership read-back, ordered durable events, and complete cleanup;
  • single-container native Linux runtime ownership behind a private 0600 same-UID Unix SDK endpoint, with an owner-only root, automatic A3S Box FD 3/4/5 binding for one exact container ID, full transported lifecycle evidence, SIGINT/SIGTERM driver shutdown, inode-scoped socket removal, and empty executor-root evidence on x86_64 and aarch64 without KVM;
  • a long-lived multi-container Native Linux host owner behind the same private same-UID Unix SDK contract. It opens the durable service and experimental driver before publishing runtime.sock, accepts ordinary SDK attachments without Box process-local descriptors, preserves exact recorded-driver and generation routing across reopen, and performs bounded driver shutdown. The explicitly opted-in x86_64 and aarch64 Box production routes now prepare bundles and launch through this owner; default routing, transparent live-session reattachment, and cross-platform cutover remain;
  • shared Linux executor support for all six OCI hook phases in normative order, with runtime/container namespace placement, exact OCI state on stdin, bounded configuration, timeout and process-group cleanup, typed rollback for every failing prestart through poststart phase, warning-only poststop continuation, and native Linux lifecycle trace evidence;
  • direct A3S Box compiler compatibility fixture pinned to Box commit d24c951989c8ee8dbc772ccd0021713855613656, with schema/semantic loading and fail-closed executor planning for its absolute rootfs, annotations, capabilities, cgroup v2 resources, exact device allowlist, legacy cgroup mount normalization, and AArch64 seccomp policy;
  • public-SDK-only A3S Box lifecycle, process-session, filesystem, observability, and resource-control consumer at Box commit a16772c3, with isolation preflight before product reservation, distinct product/runtime identities and generations, exact endpoint/driver/configuration/attachment binding, attachment-schema negotiation before product mutation, stable SDK operation IDs, lost create/start response recovery without duplicate create, stopped-only cleanup, graceful-signal escalation, exact terminal projection, and memory-retaining pause/resume with capability preflight, claim-scoped replay identities, immutable binding validation, and lost-response reconciliation without repeating freezer mutations. The same in-process contract suite now binds captured and streaming exec to the exact OCI generation; rejects unavailable capabilities, stale generations, alternate rootfs, invalid IDs, empty commands, and changed keyed content before a second process can start; proves replay-safe stdin, cursor-checked output, signal/wait, PTY/resize, exact normal and signaled status, raw-log separation, timeout cleanup, and caller-cancellation cleanup. Exact live process targets, normalized stats, and strict ordered-event cursors are rechecked against the same runtime binding. Partial Box resource intent is compiled into one complete OCI contract, claimed before mutation, replayed after a lost response with one runtime effect, and published atomically to both managed restart state and compatibility state. An immutable create-intent digest keeps the original create operation replayable after later resource changes. File upload/download and filesystem stat/mkdir/move/list/remove use the same cross-platform session facade with capability and Box-generation preflight, bounded response conversion, target/shape drift rejection, and one-effect replay of explicitly retryable mutations. Native Linux executes those calls in a bounded parent-death helper that inherits only the retained root plus exact user/mount namespace descriptors, validates descriptor order and uniqueness, and enters the namespaces before applying container IDs. The native fixture now mounts /tmp as tmpfs so the real filesystem smoke covers namespace-owned mounts rather than only the image rootfs. The deterministic cross-process contract now retains the Box process stream and input handle through an observed owner disconnect, then continues inventory, stdin, output, signal, wait, and cleanup after reconnecting to a replacement durable host service. The x86_64 and aarch64 production owner routes and fresh-Box-process stopped-only restart gates now pass; real-driver live-session reattachment plus WHPX, default-routing, and broader cutover gates remain open;
  • Linux executor enforcement for exact capability sets with real bounding, effective, permitted, inheritable, and ambient kernel read-back, exec bounding ceilings, exact no_new_privileges read-back, private controller-enabled cgroup-v2 management, memory/CPU/cpuset/PID settings and live updates with read-back and rollback, normalized cgroup stats, transactional namespaced sysctls with exact read-back and pre-Create rollback, exact static device nodes within a bounded default-deny profile, and pure-Rust x86_64/AArch64 seccomp BPF retained across init and exec;
  • versioned control/workload cgroup topology for trusted A3S Box init: exact linux.resources enforcement on a3s-workload, derived outer control-plane headroom, pre-opened FD 6/7 membership handoff, read-only guest cgroupfs, workload-scoped update/freeze/stats, non-group OOM behavior, and complete topology cleanup;
  • real WHPX fixed-bundle create/state/start/kill/delete evidence, including exact mutation retries, pre-start non-execution, running and stopped observation, marker verification, post-delete NotFound, and nominal leak checks;
  • direct qualification-only WHPX RuntimeDriver evidence through the exact protected per-generation share, including create/start/kill/wait replay, authenticated shutdown-report publication, stopped-only delete, and process/share/recovery cleanup;
  • focused real-host WHPX transport regression evidence across one serial and two parallel lifecycles, network namespace, storage, volume-init, nine negative, and four owner-termination cases, including a request above the 4 KiB stream boundary;
  • a runtime-owned Windows libkrun bundle pinned to the 3 KiB host-to-guest stream segmentation and writable virtio-fs fsync fixes, with deterministic archive and payload checksums;
  • async, Send + Sync, transport-independent Rust SDK contract;
  • complete official OCI runtime model pass-through in the SDK;
  • strict, bounded OCI 1.0.0 through 1.3.0 bundle decoding;
  • pinned OCI Runtime Specification 1.3.0 schemas and upstream fixtures;
  • offline configuration, state, and features schema validation;
  • a CI-checked v2 support lock for all 423 schema properties and enum values: 257 enforced, two validated, 75 rejected as unsupported, 89 rejected as inapplicable native workload platforms, and zero pending or conformant;
  • a CI-checked inventory of all 764 RFC 2119 occurrences across the 15 normative OCI 1.3.0 documents;
  • rejection of unknown configuration properties;
  • immutable SHA-256 binding of the loaded config.json;
  • public a3s.oci.attachments.v1 derivation and validation for rootfs, mounts, networking, process I/O, secret classifications, and optional runtime extensions, with fail-closed protocol-3 negotiation, durable manifest retention, and exact digest replay;
  • exact config.json retention and fail-closed SDK wire deserialization;
  • OCI feature reporting for all eight Linux namespaces, 41 capability names, cgroup v2, x86_64/AArch64 seccomp actions and operators, and ID-mapped mounts, with unsupported managers, flags, and security modules disabled;
  • phase-aware, bounded common, Linux, and VM semantic validation boundary;
  • exhaustive SDK request validation on in-process and transport boundaries;
  • version-negotiated, length-delimited transport for every SDK operation;
  • tested Windows named-pipe and Unix-domain-socket client connectors;
  • authenticated, version-negotiated, bounded host/guest lifecycle protocol with exact bundle and response correlation, protocol-v1 compatibility, and protocol-v2 stable init wait plus protocol-v3 exact-target exec, process signal, and process wait messages, all dispatched by the shared Linux executor with version-filtered capability advertisement, plus protocol-v4 pause, resume, and live process inventory, protocol-v5 update and stats, protocol-v6 bounded process I/O, protocol-v7 terminal resize, and protocol-v8 durable process-I/O mutation contexts with exact session replay, plus protocol-v9 descriptor-confined file and filesystem sessions and protocol-v10 bounded Host acknowledgement of completed Guest replay records;
  • an exhaustive negotiated-version fault registry for all 21 guest operations, spanning four host request/response stages, five guest read/dispatch/write stages, and two host shutdown stages. An authenticated in-memory matrix injects every one of the 189 operation-stage pairs, proves one crossing and terminal disconnect per point. A portable agent-backed RuntimeDriver matrix also arms each of the nine transport stages exactly once for all 20 public workload operations across durable HostRuntimeService reopen. Pre-dispatch faults defer the guest request until the replacement connection; post-dispatch mutation faults replay the guest journal while read-only state and uncached wait observations are safely reissued. A fully written mutation response replays the completed durable record, while a fully written wait response replays its durable terminal cache. Every path preserves the exact generation; mutations retain one effect and reject changed retries, state resolves a current target to that exact generation, wait and wait-process return stable exact exit results while stale targets fail closed, exec preserves the exact process ID, PID, and terminal mode, and signal-process preserves the exact target and signal;
  • existing features CLI path routed through the Rust SDK;
  • reconnectable local SDK endpoints that expose the first broken-stream result without hidden replay, discard the poisoned stream, and renegotiate on the next caller-initiated request. Real Windows named-pipe and Unix-socket tests restart the server behind one retained RuntimeClient; caller-supplied from_io streams remain fail-closed and non-reconnectable;
  • cross-platform runtime-owner process restart coverage that launches two distinct test-binary processes on the same platform-local endpoint and durable HostRuntimeService state root. One retained client exposes owner death, reconnects to the replacement, recovers the exact generation and live exec target, replays create/start/exec with one deterministic test-driver dispatch each, and continues inventory, stdin, signal, wait, output, and cleanup through the replacement owner;
  • foreground run implemented only as a typed SDK composition of durable create, start, wait, and stable force-delete cleanup;
  • deterministic durable container enumeration with isolation filtering, complete record validation, host-service reopen evidence, and no driver dispatch;
  • durable exact-generation lifecycle and process events with global ordered cursors, replay-safe identities, bounded filtering, long polling, crash repair, host-service reopen evidence, and no driver dispatch;
  • single-writer durable state for the complete core lifecycle, with exact bundle snapshots, monotonic generations, generation fencing, global idempotent create/start/kill/delete journals, active-operation claims, terminal failure replay, crash reconciliation, and quarantine;
  • deterministic multi-driver registration with one owner per isolation class, identical advertised operation/Hook surfaces, create-time selection, and exact recorded-driver routing across host-service reopen;
  • async RuntimeDriver integration plus a tested host implementation of create, state, start, kill, delete, and driver-advertised wait, exec, signal-process, wait-process, pause, resume, processes, update, stats, read-output, write-stdin, close-stdin, and resize;
  • generation-scoped durable process records, global exec, per-process signal, write-stdin/close-stdin/resize, update, File upload, and Filesystem mkdir/move/remove journals, terminal failure replay, active-operation claims, and stable init/exec exit-status caching across host-service reopen;
  • typed, exhaustive recovery injection at all 741 registered durable commit stages and all 44 before/after RuntimeDriver boundaries, including startup recovery;
  • a pinned durable-state root capability used for descendant traversal, reads, enumeration, directory creation, file creation, file replacement, and quarantine moves. macOS, Linux, and Windows reject symlink/reparse-point substitution and path replacement; Linux additionally passes a real same-device bind-mount gate;
  • runtime-owned Windows state paths with protected DACLs limited to the runtime principal and LocalSystem, inheritance disabled, and every applied owner and ACL verified;
  • Windows, Linux, and macOS CI.

Not yet complete:

  • equivalent real-host utility-VM transport/reopen qualification for WHPX and the KVM backend; the complete 180-path HVF matrix is retained;
  • complete shared guest OCI executor;
  • a production workload driver;
  • OCI hook rollback, crash recovery, security-negative, and soak certification;
  • complete Linux configuration enforcement and driver feature parity;
  • production-ready native Linux execution;
  • real-driver live process and filesystem session reattachment;
  • A3S Box default routing and cross-platform real-host cutover;
  • containerd runtime-v2 task, restart, I/O, and cleanup integration;
  • versioned storage, networking, reusable-session, checkpoint/restore, and TEE extensions;
  • upstream conformance and security certification.

The built-in WHPX driver remains probe-only, and the default host service advertises only features. A host explicitly opened around a launch-ready RuntimeDriver advertises the five required core lifecycle operations, host-owned durable list and events, plus only the optional operations that driver implements.

Detailed Workstreams

R0 — Contract And Spec Ingestion

  • Create a3s-oci-sdk.
  • Use official Rust OCI types for Spec, Process, LinuxResources, State, and Features.
  • Define all OCI lifecycle and A3S Box control operations.
  • Add typed IDs, operation IDs, generation fencing, deadlines, isolation, I/O, stats, events, checkpoint, restore, and stable errors.
  • Strictly load and digest-bind OCI bundles.
  • Import the pinned OCI 1.3.0 JSON schemas and fixture inventory.
  • Generate and verify a schema-property and enum-value coverage manifest in CI. The v2 lock is rebuilt from 31 reviewed evidence bindings for 334 applicable items plus 89 generated platform rejections and must exactly classify all 423 inventory items.
  • Generate and verify a SHA-256-bound normative requirement inventory in CI.
  • Add phase-aware semantic validators for common, Linux, and VM configuration and enforce them at SDK request boundaries.
  • Close the remaining 17-entry pending normative evidence backlog.
    • Bind the common configuration and runtime-feature annotation map shapes, optional and empty forms, string values, and unknown-key preservation to pinned schema and bundle round-trip evidence.
    • Pin the OCI Image Specification reference used by Runtime Specification 1.3.0 and validate all eight standard image annotation values, including RFC 3339 creation times, portable Linux stop signals, and the JSON-array string representation used by converters for os.features. Classify conversion provenance and default stop orchestration under their external converter and caller responsibilities.
    • Report the exact built-in behavior-changing configuration annotations and merge annotation-backed extensions from the active driver capability inventory, while keeping probe-only discovery empty.
    • Validate every emitted feature document against the pinned schema and bind its version range, hooks, Linux availability, namespaces, cgroup, seccomp, AppArmor, SELinux, and ID-mapped-mount claims to one validated SDK OciLinuxSupport profile. Require every driver to publish it, freeze it at registration, reject mixed-driver profile drift, and consume the retained value in Features plus pre-durable Create, Exec, and Update admission. The Linux Agent consumes the same shared profile again during planning.
    • Bind common Root, Mounts, POSIX-platform Mounts, Process, and POSIX-platform User behavior to exact admission, planning, init/exec, and native workload evidence. The 37 promoted entries cover declared-root directory checks, mount order and root-relative destinations, optional mount fields, ID-mapped mounts, argv, environment, cwd, terminal default, UID/GID, supplementary groups, umask, and the Linux-only rejection of native non-Linux clauses. The conventional rootfs basename is recorded as reviewed bundle-author guidance while the runtime preserves every valid alternative.
    • Honor OCI configuration extensibility by retaining the exact raw document and digest while excluding unknown top-level and nested properties from the typed execution projection. Treat the dependency's deprecated top-level ID-mapping compatibility fields the same way instead of rejecting or applying them. Two requirements are owner-bound.
    • Classify the common platform sections at the Linux-only admission boundary: accept Linux and utility-VM configuration together, reject native FreeBSD, Solaris, Windows, and z/OS sections before mutation, and bind optional LSM, z/OS privilege, Windows username, hostname, and domainname fields to their existing exact enforcement boundaries. Eighteen requirements are owner-bound.
    • Bind all 14 OCI memory-controller entries to exact cgroup v2 Create and Update behavior or pre-mutation rejection. Preserve zero, encode -1 as max, validate finite total swap against a finite hard limit, allow memory.low above memory.max, and reject cgroup v1-only controls.
    • Bind all five OCI network-controller entries to an explicit cgroup v2 rejection boundary. Create and live Update identify net_cls and net_prio as cgroup v1-only controls and fail before cgroup or device-policy mutation for both class IDs and interface priorities.
    • Bind the 14 previously pending OCI Block I/O entries to cgroup v2 Create and Update behavior or explicit pre-mutation rejection. Together with the existing validated weight/leaf-weight relationship, all 15 Block I/O occurrences are owner-bound. Map default and per-device weights through BFQ or generic io.weight, merge all four per-device throttle lists into io.max, preserve omitted keyed values during partial updates, and reverse applied mutations on failure. Require device identity and throttle rates, map OCI zero rates to cgroup v2 max, reject duplicate devices, and report leafWeight as unavailable on cgroup v2.
    • Bind all three OCI HugeTLB entries to schema validation and exact cgroup-v2 Create and Update behavior. Preserve the full uint64 input range, require canonical page-size names that match live controls, apply reservation and usage limits together when supported, preserve omitted page sizes, reverse partial writes, and keep the controller optional until requested. Retain conditional real-kernel workload read-back on both Native Linux CI architectures.
    • Bind all five OCI RDMA entries to semantic validation and exact cgroup-v2 Create and Update behavior. Require at least one per-device limit, preserve omitted HCA fields, normalize the kernel signed-counter ceiling to max, verify effective keyed state, reverse partial writes, keep rdma optional until requested, and retain workload-only control/workload placement with conditional real-kernel read-back.
    • Bind all four OCI Unified entries to bounded cgroup-v2 Create and Update behavior. Preserve runtime-unknown controller files, enable each controller through the private hierarchy, reject unsafe or runtime-owned names and typed-file conflicts, preserve kernel-defined write formatting, skip readable Update no-ops, snapshot readable controls for rollback, accept write-only controls, and keep unified settings on the workload leaf. Retain real memory.high and normalized partial io.max read-back plus rootful/rootless live Update coverage on both Native Linux CI architectures.
    • Bind all 20 OCI Linux device entries to exact schema, planning, rootful enforcement, cleanup, and ordered cgroup-device evidence. Cover all four node types, paths outside /dev, conditional major/minor values, mode and mapped ownership, duplicate kernel identities, existing-target conflicts, the six defaults, /dev/ptmx, terminal /dev/console, and optional or empty device-access fields. Keep the declared/default device inventory as an immutable upper bound beneath ordered resource rules, including an omitted cgroupsPath, live allow-all updates, CAP_MKNOD, and a device source whose bind mount is later remounted with dev.
    • Bind all ten OCI cgroup-ownership entries to exact cgroup-v2 delegation. Require a newly created cgroup namespace and an exact writable OCI cgroup mount, map process.user.uid to its host UID, preserve the group, bound and validate the kernel delegate inventory, tolerate listed files that are absent, use the normative fallback when the inventory is missing, and leave every unlisted file untouched. Retain positive and read-only Native Linux lifecycle evidence with complete cleanup.
    • Bind all 19 OCI namespace, user-mapping, and time-offset entries. Schema tests require every namespace and mapping member; executor tests distinguish inherit, create, and join for all eight namespace types; descriptor-relative joins verify the requested namespace type and exact identity; UID/GID mappings retain bounded non-overlapping ranges without changing referenced filesystem ownership; and normalized monotonic and boottime offsets are written and read back. Seventeen previously pending requirements are now enforced alongside the two existing validation rules.
    • Bind all 36 OCI Seccomp and notification-state entries to exact schema, semantic, executor, feature-report, and fail-closed evidence. Supported x86_64/AArch64 policies retain every advertised action and argument operator through pure-Rust BPF installation. Empty and omitted optional fields remain valid; invalid errno and argument relationships fail deterministically; and unadvertised flags, architecture sets, and userspace notification requests fail during immutable init planning before runtime mutation. Notification transport and process-state requirements therefore remain unreachable instead of being silently ignored.
    • Bind all 24 OCI VM configuration entries to pinned schema, semantic, and selected-driver evidence. Validate every hypervisor, kernel, image, and hardware member, including required relationships and all image formats. Current A3S drivers keep utility-VM launch assets runtime-owned and reject a caller-provided vm section before durable generation reservation, bundle handoff, hypervisor launch, or mutating driver dispatch. A future driver must explicitly override this fail-closed policy and enforce every field it accepts.
    • Bind all 66 OCI runtime lifecycle entries to exact state, preflight, Create, rollback, warning, and process-barrier evidence. The runtime emits only the four standard states, preserves the Linux PID contract, applies or rejects every accepted configuration before committing Create, leaves no live container after failure, and durably recovers every injected mutation stage. Optional nonstandard states and properties remain omitted, while init and exec capability warnings are logged without changing the successful operation flow. Eleven entries move to enforced and four to conformant.
    • Separate external normative roles from runtime implementation claims. Fourteen bundle-packager, bundle-author, configuration-author, image-converter, runtime-caller, and specification-author entries now use a dedicated reviewed-external disposition with a mandatory rationale, stable boundary rule, and retained test evidence. Runtime validation adds the previously ambiguous OCI image os.features array mapping.
    • Bind the final two common value-policy entries to schema, semantic, executor-plan, selected-driver, and feature-report evidence. Invalid or unsupported values fail before durable mutation, and each configured service publishes the exact supported subset it will enforce.
    • Freeze the complete Linux configuration and feature-report ownership profile. The exact gates cover 190 config-linux.json and defs-linux.json items as 145 enforced and 45 rejected unsupported, all 218 config-linux.md requirements as 206 enforced, nine validated, and three conformant, and all 41 features-linux.md requirements as enforced by the runtime feature report.
    • Bind the two Linux runtime file-descriptor entries to the typed, collision-safe inherited-descriptor planner. A3S passes only the exact advertised control descriptors and deliberately adds no optional /dev/null descriptors.
    • Bind the two network-device termination entries to retained native evidence. The runtime moves interfaces into the container namespace during Create, never reconfigures them as part of workload lifecycle, and never moves them back during termination or cleanup.
    • Bind the six remaining cgroup entries to exact v2 behavior: optional fit checks fail when requested controls are unavailable; an omitted path receives a stable private generation-fenced location; unrequested extra controllers are not attached; representable v1 CPU, memory, and Block I/O settings convert to v2; and unrepresentable controls fail before mutation.
    • Bind rootfs propagation, masked paths, and read-only paths to shared planner plus native read-back evidence. Reject linux.mountLabel at the selected-driver preflight before durable reservation because SELinux mount labeling is not advertised.
    • Bind the final Features recommendation to the stable configured-service capability report. Runtime driver selection and its Linux support profile are frozen when the service is constructed; opening fails closed for mismatched drivers, and per-container execution cannot alter that report.
    • Classify every entry by common/process, Linux, VM, state, or feature semantics and record whether it is applicable to each driver profile.
    • Bind every applicable entry to an exact validator, enforcement owner, positive test, negative test, and retained evidence field; bind every inapplicable entry to a reviewed reason.
    • Make CI reject pending, unclassified, duplicate, stale, or source-digest-mismatched entries and require the generated ledger to reach zero pending entries.
  • Add version-negotiated local IPC transport for out-of-process callers.

Exit gate: every OCI 1.3.0 schema property is accounted for as accepted, rejected as inapplicable, or rejected because the selected driver cannot enforce it. No property is silently ignored.

R1 — Durable OCI Lifecycle

  • Add an absolute, single-writer runtime root with plain-path/reparse-point checks, bounded reads, and atomic file replacement.
  • Create, apply, and verify runtime ownership plus protected Windows state DACLs limited to the runtime principal and LocalSystem.
  • Use descriptor-relative path operations on every supported host and prove that symlink, mount, and Windows reparse-point replacement cannot move a validated runtime-owned path before mutation.
    • Pin the canonical state root as a cap_std::fs::Dir and resolve every descendant traversal, read, enumeration, directory creation, file open, file replacement, and quarantine move from retained directory handles.
    • On macOS and Linux, reject root-path redirection, layout-directory and transaction-file symlinks, foreign filesystem handles, and mount changes. Linux additionally passes a root-only bind-mount replacement gate in a private mount namespace using statx mount identities; macOS uses fstatfs filesystem identities.
    • Cross-compile the no-follow capability implementation and retained- parent Windows replacement path for x86_64-pc-windows-msvc.
    • Run the real Windows matrix for root/layout/transaction reparse-point substitution and file/directory replacement. The August 15, 2026 Windows CI gate covers real reparse points, already-open source-file commits, racing destination replacement, retained root/lock handles, and exact-handle directory moves without modifying an external target.
  • Add atomic creating/created records with exact configuration snapshots and monotonically increasing generations.
  • Add a global idempotent create journal keyed by OperationId.
  • Extend the operation journal to start, kill, and delete.
  • Extend idempotent journals to exec and per-process signal, including generation-scoped process claims and terminal failure replay.
  • Extend idempotent journals to pause and resume, including exact freezer observation, reconciliation, claim release, and terminal failure replay.
  • Extend idempotent journals to update, including exact retry, terminal failure replay, claim release, and fault-injected recovery.
  • Extend idempotent journals to write-stdin, close-stdin, and resize, including exact driver/guest replay, claim release, terminal failure replay, and fault-injected recovery.
  • Reclaim completed Native Linux guest mutation records only after the Host durably commits success or terminal failure. Keep prepared, retryable, and asynchronous in-flight effects replayable; acknowledge every derived stdin chunk identity; and reject mixed pending/completed acknowledgement batches atomically. Unit evidence fills all 4,096 guest slots before releasing them, and three complete containerd matrices pass through one unchanged Host PID.
  • Carry the same post-commit reclamation boundary across utility-VM protocol v10. Keep protocol-v1 through protocol-v9 acknowledgement as a compatibility no-op, bound each v10 batch to 1..=4,096 unique operation identities, and fan out safely across live HVF/WHPX sessions without holding session locks across transport I/O. The protocol matrix covers all 189 operation/stage pairs; the 20-operation Host reopen matrix proves that a response-write disconnect returns a retryable acknowledgement error, then replays the durable result without redispatch and acknowledges it once after reopen. A real Apple Silicon Guest negotiates v10 and advertises the exact 20 workload operations plus the maintenance acknowledgement.
  • Reconcile interrupted core lifecycle operations and quarantine failed create/delete state.
  • Implement driver-independent create, state, start, kill, and delete host orchestration.
  • Register multiple launch-ready drivers behind one host service, reject ambiguous isolation ownership and inconsistent advertised surfaces before state creation, and route every post-create operation by the durable driver identity rather than registration order.
  • Invoke an idempotent startup recovery handshake on each record's exact persisted driver, commit optional state observations before serving, and fault-inject both sides of that boundary.
  • Preserve the exact create/start barrier in the durable host/driver contract.
  • Verify the barrier against the real Linux guest bootstrap executor.
  • Fault-inject every registered core-lifecycle durable commit stage and every RuntimeDriver method boundary, then reopen and replay.
  • Fault-inject every versioned utility-VM host/agent request, response, disconnect, replay, and shutdown transition, then prove exact-generation recovery or complete cleanup after host-service reopen.
    • Release the clone-shared host transport immediately after terminal request-write, response EOF/read, correlation, or response-shape failure; prove retained clones cannot dispatch or keep the failed guest connection alive.
    • Expose negotiated-version fault points for every current operation at four host request/response stages, five guest read/dispatch/write stages, and two host shutdown stages. Prove that a create completed before its response is lost can reconnect over a newly authenticated stream and replay the exact OperationId and request with one effect, while changed content under that ID fails with Conflict.
    • Arm and cross all 189 current Guest operation-stage pairs over authenticated in-memory streams. Require each selected point exactly once, disconnect the session after every injected failure, and prove that a fault after a fully written response preserves that response but fails the next request.
    • Carry the post-dispatch create-response-loss case through a portable agent-backed RuntimeDriver: retain the durable creating record after the first retryable failure, open a new authenticated connection and driver, reopen HostRuntimeService, and resume the same generation with two driver dispatches but one guest effect. Reject changed content at both the durable host and guest journals. Real utility-VM reopen evidence remains required.
    • Expand portable create recovery across all nine host/guest transport stages and require each selected boundary exactly once. Prove pre-dispatch faults perform the first effect after reopen, post-dispatch faults replay one cached guest effect, and a fully written response replays directly from the completed durable host journal without a second driver dispatch.
    • Carry read-only state through all nine portable reopen stages after an exact durable create. Resolve a current host target to the exact generation, expose every retryable first-call transport failure, reopen through a new authenticated connection and driver, and reissue the query even after a fully written first response. Keep durable state unchanged and reject a stale generation at both the host and guest boundaries without driver dispatch from the host.
    • Apply the same nine-stage portable reopen matrix to start after an exact durable create. Keep the host record created after every retryable first-call failure even when the guest already reached running, resume through the original operation on a new authenticated connection and driver, and prove exactly one start effect. A fully written start response must replay from the completed durable journal without another dispatch.
    • Apply the same nine-stage portable reopen matrix to kill after an exact durable create and start. Keep the host record running after every retryable first-call failure even when the guest already reached stopped, resume through the original operation on a new authenticated connection and driver, and prove exactly one kill effect. A fully written kill response must replay from the completed durable journal without another dispatch.
    • Apply the same nine-stage portable reopen matrix to stopped-only delete after an exact durable create, start, and kill. Keep the stopped host record after every retryable first-call failure even when the guest already removed the generation, resume cleanup through the original operation on a new authenticated connection and driver, and prove exactly one delete effect. A fully written response must leave no live host record and replay from the completed durable journal without driver recovery or another dispatch.
    • Carry init wait through all nine portable reopen stages after an exact durable create, start, and signal-9 kill. Reissue an uncached observation on the replacement connection after every retryable first-call failure and require the same exact signal result. A fully written response must survive reopen in the durable terminal cache without another driver or guest dispatch; all later waits must use that cache, and stale host and guest generations must fail closed.
    • Carry exec through all nine portable reopen stages after an exact durable create and start. Keep the prepared process claim resumable after every retryable first-call failure, replay post-dispatch effects through the exact guest request journal, and replay a fully written response from the completed durable host journal without another dispatch. Preserve the exact generation, process ID, PID, and terminal mode, require one exec effect, and reject changed content under the same operation ID at both boundaries.
    • Carry signal-process through all nine portable reopen stages after an exact durable create, start, and exec. Resolve the current host target to the exact generation and process ID, keep the process claim resumable after each retryable first-call failure, replay the exact guest mutation after dispatch, and replay a fully written response from the durable host journal. Require one signal effect and reject a changed signal under the same operation ID at both boundaries.
    • Carry wait-process through all nine portable reopen stages after an exact durable create, start, exec, and signal. Reissue an uncached process observation after retryable first-call failures, then durably cache one exact exit result. A fully written response and every later retry must avoid another driver or guest dispatch; current targets resolve to the exact generation and process ID, and stale targets fail closed at both boundaries.
    • Carry pause through all nine portable reopen stages after an exact durable create and start. Keep the host record running and unpaused after every retryable first-call failure even when the guest is already frozen, resume through the original operation on a new authenticated connection and driver, and prove exactly one pause effect. A fully written response must replay from the durable host journal without another dispatch, and changed targets under the same operation ID must fail closed at both boundaries.
    • Carry resume through all nine portable reopen stages after an exact durable create, start, and pause. Keep the host record running and paused after every retryable first-call failure even when the guest is already thawed, retry the original operation on a new authenticated connection and driver, and prove exactly one resume effect. A fully written response must replay from the durable host journal without another dispatch, and changed targets under the same operation ID must fail closed at both boundaries.
    • Carry read-only processes through all nine portable reopen stages after an exact durable create, start, and exec. Resolve the current host target to the exact generation, return the same live init and exec process identities after reconnect, and reissue the observation after every retryable first-call failure, including a fully written first response. Keep durable state unchanged and reject stale generations before host driver dispatch and at the guest boundary.
    • Carry update through all nine portable reopen stages after an exact durable create and start. Keep the complete OCI LinuxResources request resumable after every retryable first-call failure, replay post-dispatch effects through the exact guest request journal, and replay a fully written response from the durable host journal without another dispatch. Require one resource-update effect and reject changed resources under the same operation ID at both boundaries.
    • Carry read-only stats through all nine portable reopen stages after an exact durable create and start. Resolve the current host target to the exact generation, validate the same normalized CPU, memory, process-count, and named metrics after reconnect, and reissue the observation after every retryable first-call failure, including a fully written first response. Keep durable state unchanged and reject stale generations before host driver dispatch and at the guest boundary.
    • Carry read-only read-output through all nine portable reopen stages for an exact running init process. Resolve the current host target to the exact container generation, preserve the inclusive byte cursor and response limit, and return the same contiguous stdout chunk after reconnect. Reissue the poll after every retryable first-call failure, including a fully written first response, and reject stale process generations before host driver dispatch and at the guest boundary.
    • Carry replay-safe write-stdin through all nine portable reopen stages for a running init process. Resolve the current host target to the exact generation, retain the original operation context and input bytes, and keep the durable claim resumable after each retryable first-call failure. Replay a post-dispatch guest request without a second input effect, replay a fully written response from the completed host journal without another dispatch, and reject changed bytes under the same operation ID at both boundaries.
    • Carry replay-safe close-stdin through all nine portable reopen stages for a running init process. Resolve the current host target to the exact generation, retain the original operation context, and keep the durable claim resumable after each retryable first-call failure. Replay a post-dispatch guest request without a second close effect, replay a fully written response from the completed host journal without another dispatch, and reject changed process targets under the same operation ID at both boundaries.
    • Carry replay-safe resize through all nine portable reopen stages for an exact terminal exec process. Resolve the current host target to the exact generation and process ID, retain the original operation context and terminal dimensions, and keep the durable claim resumable after each retryable first-call failure. Replay a post-dispatch guest request without a second resize effect, replay a fully written response from the completed host journal without another dispatch, and reject changed dimensions under the same operation ID at both boundaries.
    • Carry a journaled file upload through all nine portable file reopen stages. Resolve the current host target to the exact generation and retain the path, user, base64 payload, operation context, and acknowledgement. Keep the v3 Host journal resumable before commit, then replay its typed response without driver dispatch after commit. A lost post-commit Guest acknowledgement stays retryable and is repeated by the next owner. Reject changed upload content permanently at the Host and reject stale generations at the Guest boundary and before Host driver dispatch.
    • Carry a journaled directory creation through all nine portable filesystem reopen stages. Resolve the current host target to the exact generation and retain the path, user, operation context, and directory metadata response. Keep the v3 Host journal resumable before commit, then replay its typed response without driver dispatch after commit. Repeat a lost post-commit Guest acknowledgement through the replacement owner and retain permanent Host changed-path fencing. Reject stale generations at the Guest boundary and before Host driver dispatch. This completes the portable 20-operation, 180-pair matrix without claiming real utility-VM replacement evidence.
    • Cross the four host-side create request/response transitions inside fresh, authenticated utility VMs. The qualification-only client injector records the exact negotiated protocol-v9 point once, returns a retryable Unavailable result, never attempts normal delete, and requires the Guest executor, VM, endpoint, shim, bridge process, workload marker, runtime root, and host descriptor inventory to return to baseline. The Apple Silicon HVF gate passed all four stages once and then five repeated four-stage waves (24 fresh VMs total) with a valid unprivileged UID/GID mapping. The machine-readable evidence now uses the expanded a3s.oci.oci-vm-transport-fault-cleanup.v3 schema.
    • Cross the five Guest-side create read/dispatch/response transitions inside fresh authenticated utility VMs. The qualification handoff is versioned, accepted only for Guest stages, and bound to the exact validated OperationId carried by create. The one-shot Guest injector emits a nonce-bound console record only after the Linux executor has completed cleanup. The four pre-response points expose a retryable disconnect on the current call; the fully written response is delivered and a follow-up request must expose the disconnect. Apple Silicon HVF passed all five stages in five fresh VMs with exact endpoint, process, descriptor, marker, and runtime-root cleanup.
    • Cross both explicit Host shutdown stages in fresh authenticated utility VMs. Require a successful exact create first, inject one retryable error before or after orderly stream shutdown, then prove clone-wide idempotent close and complete Guest, VM, endpoint, process, marker, runtime-root, and Host descriptor cleanup. Apple Silicon HVF passed both points in two fresh VMs, then passed the complete eleven-stage matrix in eleven fresh VMs with a3s.oci.oci-vm-transport-fault-cleanup.v3 evidence.
    • Resume one real create after host-before-request-write through both HostRuntimeService reopen and actual HVF VM/session-owner replacement. The first VM returns a retryable Unavailable, closes with complete Host and Guest cleanup, and leaves the durable record in creating. A new service and fresh authenticated VM accept that exact record through DriverRecovery::none, reuse its OperationId and generation, complete create, force-delete it, and return every resource inventory to baseline. The August 10, 2026 Apple Silicon gate passed with two distinct endpoint, shim, and VM-worker identities under a3s.oci.oci-vm-reopen-replacement.v2.
    • Carry the other three Host-side create request/response stages through the same durable reopen and actual HVF owner replacement. The selected point is explicit in the CLI and retained report; every run requires the original OperationId and generation, a distinct endpoint/shim/VM-worker owner, force delete, and complete Host and Guest cleanup. The August 10, 2026 four-stage matrix passed in eight fresh VMs.
    • Carry all five Guest-side create stages through the same durable reopen and actual HVF owner replacement. The first four points retain creating and complete on the replacement Guest. The fully written response retains created; a State probe exposes the disconnect, then an explicit recreated-process recovery rebuilds the pre-start workload, reconciles a changed Guest PID when necessary, and repairs the completed Create journal before replay. Nonce-bound Guest evidence, exact OperationId and generation reuse, two distinct owners, force delete, and complete cleanup are required. Rebinding the record and repairing the journal each pass all seven durable file-commit fault stages. The August 10, 2026 five-stage matrix passed in ten fresh VMs; three additional post-response waves passed in six fresh VMs, including a real replacement PID change.
    • Carry all nine Host/Guest state stages through durable service reopen and an actual HVF owner replacement. State has no request OperationId, so Guest qualification binds the boot-time nonce, exact operation, and stage; the evidence returns that nonce after cleanup. The durable record stays in created, replacement recovery rebuilds the pre-start process with the original Create identity and generation, and the reissued State response must equal the recovered record. A fully written first response also requires a follow-up disconnect probe. The August 10, 2026 matrix passed all nine stages in 18 fresh VMs, including real Guest PID changes, distinct owners, force delete, and complete Host and Guest cleanup.
    • Carry all nine Host/Guest start stages through durable service reopen and an actual HVF owner replacement. The first eight paths keep the durable record in created; replacement recovery rebuilds the pre-start process, rebinds its PID, and reuses the original Create and Start identities before completing Start. A fully written response instead keeps running; replacement recovery recreates and starts the process, repairs the completed Create and Start journals with the new PID, and lets the unchanged Start replay return without another driver dispatch. Every path resets any first-owner marker, verifies the replacement workload, force-deletes the generation, and restores Host and Guest inventories. The August 10, 2026 matrix passed all nine stages in 18 fresh VMs.
    • Carry all nine Host/Guest kill stages through durable service reopen and an actual HVF owner replacement. The first eight paths keep the durable record in running; replacement recovery recreates and starts the workload, rebinds its PID, repairs the completed Create and Start journal responses, and completes the unchanged signal-9 Kill identity once. A fully written response instead keeps stopped; recovery recreates, starts, and kills the replacement workload to rebuild the Guest tombstone, then the completed durable Kill journal replays without an API-driven driver dispatch. Every path verifies the replacement workload before Kill, uses stopped-only Delete, and restores Host and Guest inventories. The August 10, 2026 matrix passed all nine stages in 18 fresh VMs.
    • Carry all nine Host/Guest delete stages through durable service reopen and an actual HVF owner replacement. The first eight paths retain the exact stopped live record and a Prepared Delete journal. Replacement recovery recreates, starts, and kills the workload with the original setup identities, rebuilds the Guest stopped tombstone, and dispatches the unchanged stopped-only Delete once. A fully written response instead leaves no live record and a SucceededEmpty journal; the fresh owner performs no workload recovery or driver Delete and replays that exact journal. Every path reuses the original Delete identity and generation, uses two distinct endpoint/shim/VM-worker owners, and restores Host and Guest inventories. The August 10, 2026 matrix passed all nine stages in 18 fresh VMs.
    • Carry all nine Host/Guest init wait stages through durable service reopen and an actual HVF owner replacement after exact Create, Start, and signal-9 Kill setup. The first eight paths retain the stopped generation without an init-exit cache; replacement recovery recreates, starts, and kills the workload with the original setup identities, then dispatches the exact resolved Wait target and timeout once and durably caches signal=9, oom_killed=false. A fully written first response already leaves that cache committed, so the replacement Host and every later Wait return without another driver or Guest dispatch. Every path rejects a stale Guest generation with NotFound and a stale Host generation with Conflict before driver dispatch, uses two distinct endpoint/shim/VM-worker owners, performs stopped-only Delete, and restores Host and Guest inventories. The August 10, 2026 matrix passed all nine stages in 18 fresh VMs.
    • Carry all nine Host/Guest terminal exec stages through durable service reopen and an actual HVF owner replacement after exact Create and Start. The Linux executor now waits for close-on-exec proof before reporting a successful Exec, so pre-exec failures return through the typed start barrier instead of becoming false process records. The first eight paths retain a Prepared Exec journal and a prepared process record with no live PID; replacement recovery recreates and starts the init process, then the unchanged Exec identity dispatches once. A fully written first response instead retains the exact live ProcessRecord and Succeeded journal; replacement recovery recreates both init and Exec, rebinds their Guest PIDs, repairs the completed journals, and the Host replay returns without another API-driven dispatch. Every path preserves the generation, process ID, terminal mode, and complete request identity; rejects stale and changed Host and Guest requests; accepts a first-owner marker only when it exactly matches the nonce; requires the replacement long-running terminal process to write that marker; force-deletes the generation; and restores Host and Guest inventories. The August 10, 2026 matrix passed all nine stages in 18 fresh VMs under a3s.oci.oci-vm-operation-reopen-replacement.v6.
    • Carry all nine Host/Guest signal-process stages through durable service reopen and an actual HVF owner replacement after exact Create, Start, and a long-running terminal Exec. The first eight paths retain a Prepared SignalProcess journal; replacement recovery recreates init and Exec, then the unchanged signal-10 request dispatches once. A fully written response instead retains SucceededEmpty. Recovery recreates Exec, waits for its nonce-bound readiness marker after the SIGUSR1 trap is installed, and reapplies the committed signal before Host replay returns without another API-driven dispatch. Every path preserves the generation, process ID, complete Exec and SignalProcess identities, and terminal mode; rejects stale and changed Host and Guest requests; requires the replacement trap to write the exact signal marker; force-deletes the generation; and restores Host and Guest inventories. The August 11, 2026 matrix passed all nine stages in 18 fresh VMs under a3s.oci.oci-vm-operation-reopen-replacement.v7.
    • Carry all nine Host/Guest non-init wait-process stages through durable service reopen and an actual HVF owner replacement after exact Create, Start, terminal Exec, and signal-10 setup. Recovery always rebuilds the Exec, waits for its nonce-bound readiness marker, and reapplies the committed signal. The first eight paths have no Host process-exit cache, so the unchanged exact target and 15-second timeout dispatch once after reopen. A fully written response already holds signal=10, oom_killed=false; replacement and later waits return from that cache with no driver dispatch, while the rebuilt exited process is not advertised as live. Every path preserves setup identities, terminal mode, generation, and process ID; rejects stale Host and Guest generations; force-deletes the still-running init; and restores Host and Guest inventories. The August 11, 2026 matrix passed all nine stages in 18 fresh VMs under a3s.oci.oci-vm-operation-reopen-replacement.v8.
    • Carry all nine Host/Guest pause stages through durable service reopen and an actual HVF owner replacement after exact Create and Start. The first eight paths retain an unpaused running record and a Prepared Pause journal; recovery recreates and starts init, rebinds its PID, repairs the completed Create and Start responses, and dispatches the unchanged Pause once. A fully written response instead retains the paused running record and a Succeeded journal. Recovery recreates and starts init, waits for its exact nonce-bound readiness marker, reapplies the committed freezer state, and repairs the Create, Start, and Pause journal PIDs before Host replay returns without API-driven dispatch. Every path preserves generation and complete request identities, rejects changed and stale Host and Guest requests, force-deletes the paused generation, and restores Host and Guest inventories. The August 11, 2026 Apple Silicon matrix passed all nine stages in 18 fresh VMs under a3s.oci.oci-vm-operation-reopen-replacement.v9.
    • Carry all nine Host/Guest resume stages through durable service reopen and an actual HVF owner replacement after exact Create, Start, and Pause. Every recovery recreates and starts init, waits for the exact nonce-bound readiness marker, and reapplies the setup Pause with its original identity. The first eight paths retain a paused running record and Prepared Resume journal, then dispatch the unchanged Resume once. A fully written response instead retains an unpaused running record and Succeeded journal; recovery replays Pause and the committed Resume before returning recreated-running evidence, so Create, Start, Pause, and Resume responses all bind to the replacement PID and the Host retry does not dispatch. Every path preserves generation and complete request identities, rejects changed and stale Host and Guest requests, force-deletes the resumed generation, and restores Host and Guest inventories. The August 11, 2026 Apple Silicon matrix passed all nine stages in 18 fresh VMs under a3s.oci.oci-vm-operation-reopen-replacement.v10.
    • Carry all nine Host/Guest read-only processes stages through durable service reopen and an actual HVF owner replacement after exact Create, Start, and live terminal Exec setup. Recovery always recreates init and Exec, rebinds both durable PIDs, repairs their completed responses, and verifies the nonce-bound replacement markers. The Processes query then resolves the same exact generation and returns exactly those two logical process identities from the fresh Guest. Because the query is not journaled, every replacement path dispatches it once, including when the first owner wrote a complete response. Every path rejects stale Host and Guest generations, force-deletes the live generation, and restores both owner inventories. The August 11, 2026 Apple Silicon matrix passed all nine stages in 18 fresh VMs under a3s.oci.oci-vm-operation-reopen-replacement.v11.
    • Carry all nine Host/Guest update stages through durable service reopen and an actual HVF owner replacement after exact Create and Start. The first eight paths retain a Prepared Update journal and dispatch the unchanged exact target plus complete LinuxResources once after recovery recreates the running init. A fully written response retains a Succeeded journal; recovery waits for the fresh nonce-bound workload marker and reapplies the committed resource request before returning recreated-running evidence, so the Host retry repairs the Update response PID and does not dispatch again. Every path preserves the operation, target, resources, and generation; rejects changed resources and stale Host and Guest generations; reads two replacement Stats snapshots proving the 512 MiB memory limit and monotonic live counters; force-deletes the generation; and restores both owner inventories. The August 11, 2026 Apple Silicon matrix passed all nine stages in 18 fresh VMs under a3s.oci.oci-vm-operation-reopen-replacement.v12.
    • Carry all nine Host/Guest read-only stats stages through durable service reopen and an actual HVF owner replacement after exact Create, Start, and committed Update setup. Every recovery recreates and starts init, waits for its nonce-bound readiness marker, reapplies the complete resource profile to the fresh cgroup, and repairs the completed Create, Start, and Update response PIDs. Stats has no Host response journal, so the replacement query dispatches exactly once at every stage, including after the first owner wrote a complete snapshot. Both delivered snapshots must prove the exact 512 MiB profile and required live counters; the completed first-owner path additionally requires a newer, distinct replacement snapshot. Every path preserves the target and generation, rejects stale Host and Guest generations, force-deletes the generation, and restores both owner inventories. The August 11, 2026 Apple Silicon matrix passed all nine stages in 18 fresh VMs under a3s.oci.oci-vm-operation-reopen-replacement.v13.
    • Carry all nine Host/Guest read-only read-output stages through durable service reopen and actual HVF owner replacement. Recovery rebuilds the exact Create, Start, and non-terminal captured-output Exec requests, repairs all completed response PIDs, and dispatches the same cursor, byte-limit, and long-poll query once to every fresh owner. A delivered first response must match the nonce-bound stdout chunk, while replacement output must come from the rebuilt Exec. Stale Host and Guest generations fail closed, force delete removes the generation, and both owner inventories return to baseline. The August 11, 2026 Apple Silicon matrix passed all nine stages in 18 fresh VMs under a3s.oci.oci-vm-operation-reopen-replacement.v14.
    • Carry all nine Host/Guest write-stdin stages through durable service reopen and actual HVF owner replacement. Recovery always rebuilds the exact pipe-backed Exec. The first eight stages leave the Host journal resumable and dispatch the write once after reopen; when the first owner committed the response, recovery replays those exact bytes into the fresh Exec before Host open completes and the API retry returns from the durable journal without another driver call. Exact effect markers, request identity, changed-payload rejection, stale generations, PID rebinding, force delete, and both owner cleanup inventories are required. The August 11, 2026 Apple Silicon matrix passed all nine stages in 18 fresh VMs under a3s.oci.oci-vm-operation-reopen-replacement.v15.
    • Carry all nine Host/Guest close-stdin stages through durable service reopen and actual HVF owner replacement. Recovery always rebuilds the exact pipe-backed Exec. The first eight stages leave the Host journal resumable and dispatch the close once after reopen; when the first owner committed the response, recovery closes the fresh Exec input before Host open completes and the API retry returns from the durable journal without another driver call. Exact EOF markers, request identity, changed-target rejection, stale generations, PID rebinding, force delete, and both owner cleanup inventories are required. The August 11, 2026 Apple Silicon matrix passed all nine stages in 18 fresh VMs under a3s.oci.oci-vm-operation-reopen-replacement.v16.
    • Carry all nine Host/Guest resize stages through durable service reopen and actual HVF owner replacement. Recovery always rebuilds the exact terminal-backed Exec. The first eight stages leave the Host journal resumable and dispatch the resize once after reopen; when the first owner committed the response, recovery restores 120x40 in the fresh terminal before Host open completes and the API retry returns without another driver call. Exact SIGWINCH effect markers, request identity, changed-dimension rejection, stale generations, PID rebinding, force delete, and both owner cleanup inventories are required. The August 11, 2026 Apple Silicon matrix passed all nine stages in 18 fresh VMs under a3s.oci.oci-vm-operation-reopen-replacement.v17.
    • Carry all nine Host/Guest file stages through service reopen and actual HVF owner replacement. The v3 Host journal retains the exact upload and typed response. Prepared paths dispatch once after reopen. At guest-after-response-write, the first API call exposes the post-commit acknowledgement disconnect; recovery rebuilds the upload in the fresh /tmp filesystem, and Host replay returns without another driver dispatch. Exact binary bytes, response shape, permanent changed-content rejection, stale generations, explicit removal, force delete, and both owner cleanup inventories are required. The August 15, 2026 Apple Silicon matrix passed all nine stages in 18 fresh VMs under a3s.oci.oci-vm-operation-reopen-replacement.v18.
    • Carry all nine Host/Guest filesystem stages through service reopen and actual HVF owner replacement. The v3 Host journal retains the exact MakeDir request and typed response. Prepared paths dispatch once after reopen. At guest-after-response-write, the first API call exposes the post-commit acknowledgement disconnect; recovery rebuilds the directory in the fresh /tmp filesystem, and Host replay returns without another driver dispatch. Exact directory metadata, request identity, permanent changed-path rejection, stale generations, replacement Stat, explicit Remove, force delete, and both owner cleanup inventories are required. The August 15, 2026 Apple Silicon matrix passed all nine stages in 18 fresh VMs under a3s.oci.oci-vm-operation-reopen-replacement.v19, completing all 180 real operation-stage paths across all 20 workload operations.
    • Requalify guest-after-response-write for all 14 journaled mutations against real Apple Silicon HVF with protocol v10 acknowledgement. Every first API call returns retryable Unavailable after its Host outcome is durable, every replacement owner reconstructs any VM-local effect, Host replay avoids a second API-driven dispatch, and Guest evidence is released only after commit. The August 15, 2026 focused matrix passed 14/14 cases.
  • Repeat the retained real-host operation-stage and shutdown qualification on WHPX and the future KVM backend before promoting either driver's readiness. This is a per-driver release gate; it does not reopen the protocol contract or the completed HVF matrix.
  • Implement all OCI hook phases with typed prestart, createRuntime, createContainer, startContainer, and poststart failure rollback, bounded timeout/process-group cleanup, and warning-only poststop behavior.
  • Implement run as a client composition, not a second lifecycle.

Exit gate: lifecycle tests pass under fault injection at every durable write and host/agent transition. The durable-write and RuntimeDriver portions pass; the real HVF host/agent operation-stage matrix passes, while equivalent real-driver coverage remains open for the other utility-VM backends.

R2 — Windows WHPX Utility VM

  • Load and probe Windows Hypervisor Platform securely.

  • Create and delete a real WHPX partition object.

  • Pin the a3s-libkrun-sys 3.1.0 FFI ABI and stage a runtime-owned, checksum-verified Windows bundle for the isolated shim, with firmware provenance from A3S-Lab/Box@93fc281 and segmented WHPX stream plus writable virtio-fs flush fixes from A3S-Lab/libkrun@dc5519f.

  • Create, configure, and release a real context using the Windows WHPX libkrun build.

  • Configure a plain-vsock device and the fixed guest control port through the Windows named-pipe mapping ABI without enabling TSI.

  • Enter the VM and execute a guest command through WHPX.

  • Configure one vCPU, bounded memory, a diagnostic rootfs share, and console output.

  • Define and test the versioned host/guest lifecycle protocol over a transport-independent byte stream.

  • Bind the host half of the Windows agent bridge with a verified protected DACL, first-instance ownership, remote-client rejection, expected-shim PID verification, and authenticated protocol negotiation over a real named pipe.

  • Implement the Linux guest binary, bounded AF_VSOCK connection retry, secret-zeroizing bootstrap, and static musl build.

  • Replace the diagnostic path with a protected runtime-owned share.

    • Separate the guest system root from a protected writable share, export only shares/<container>/<generation> with a fixed virtio-fs tag, mount it before agent token access, and reject external or cross-generation bundles before VM launch.
    • Move one-time token and recovery-report handoff into the exact share and require versioned shim evidence that the device was configured.
    • Add an explicit digest-bound product bundle-handoff extension that stages by create-operation identity, moves only after the runtime allocates the real generation, and preserves exact replay and owned cleanup.
    • Add an SDK-owned portable-rootfs metadata contract used by Box and replay Linux ownership, modes, and symlink identity inside the guest before OCI mounts, with bounded all-before-mutation validation and one-shot consumption.
    • Run the qualification-only RuntimeDriver nominal lifecycle through that share on a real WHPX host and retain its versioned lifecycle, replay, authenticated recovery-publication, and cleanup evidence.
    • Run the owner-death and service-restart matrix through that share on a fresh WHPX-enabled Windows host and retain its machine-readable evidence. Clean commit 2d91cd0 emitted a3s.oci.whpx-recovery-smoke-run.v1 after exact owner termination, both Recover fault boundaries, service reopen, terminal replay, stopped-only delete, and complete transient cleanup.
  • Boot the pinned A3S Linux kernel and immutable system root.

    • Record source revisions, reproducible build inputs, checksums, and the runtime-to-guest compatibility level in the release evidence.
    • Mount the immutable system root separately from the protected per-generation runtime share and reject any digest or provenance drift before VM entry.
    • Run the complete WHPX SDK and recovery matrices against those exact assets on a fresh Windows host.

    The August 15, 2026 implementation builds the Alpine 3.22.5 x86_64 ext4 image twice and requires byte-for-byte equality, binds Linux 6.12.91 and the Box/libkrun/firmware source revisions in a3s.oci.windows-system-image.v1, pins the manifest, image, krun.dll, and libkrunfw.dll with read-only Windows handles, rejects reparse paths and identity changes, and rehashes every asset immediately before VM entry. The shim attaches the image as a read-only virtio-blk root and exports bundle/token/recovery data only through the separate writable runtime share. These two implementation items do not close the parent gate until a fresh WHPX host retains the full matrix.

  • Establish the named-pipe/vsock bridge.

  • Negotiate the guest protocol and retain boot evidence.

  • Run a fixed configured process through distinct OCI create and start calls.

  • Factor native and transport-backed guest execution through one exact twenty-operation driver adapter.

  • Implement a one-VM-per-container WHPX RuntimeDriver candidate with exact-generation routing, retry/terminal-failure ownership, delete and whole-driver cleanup, and protected-root bundle containment tests. Keep it probe-only and non-registerable until the remaining exit gates pass.

  • Reconcile owner-death cleanup after host restart as an exact-generation stopped tombstone. Permit state, idempotent kill, empty process inventory, and delete while rejecting live-only operations and never synthesizing an exit status.

  • Retain exact init exit evidence across WHPX owner death and host-service restart, including before/after recovery faults.

    • Define a versioned and bounded exact-generation report, authenticate it with the ephemeral agent session token, and emit it only after complete guest executor shutdown.
    • Have the owner-PID shim verify and copy the normalized report into protected host storage before its owner-death grace expires.
    • Consume the report through durable startup recovery, cache exact wait replay, retain the artifact through before/after recovery fault gates, and close the replacement-host/shim handoff race with a protected pending marker plus bounded retryable wait.
    • Run the complete owner-death and service-restart gate on a fresh WHPX-enabled Windows host and retain its machine-readable evidence.
  • Verify running state, exact create/kill/delete replay, signal-driven stopped state, post-delete NotFound, marker cleanup, and no new guest runtime directory on the nominal path.

  • Qualify the 3 KiB stream fix with serial and two-lane parallel lifecycle, network namespace, storage, volume-init, typed negative, and four-point owner-termination cleanup paths without residual host processes or guest runtime directories.

  • Prove in-process native handle reclamation independently of Windows process teardown.

    • Emit nonzero current-process handle counts immediately before libkrun context creation and after krun_start_enter returns. Shim schema v6 and Host validation require exact equality before cleanup can succeed.
    • Retain that exact evidence across the complete fresh-host WHPX SDK, recovery, negative, and soak matrices.

Exit gate: a fresh Windows host test boots a utility VM, runs the fixed OCI bundle, validates negative isolation cases, retains exact terminal evidence across host restart, and leaves no process, handle, or runtime-root leak. Only then may WHPX become experimental.

R2M — macOS HVF Utility VM qualification harness — 15/15 complete

  • Query Apple Silicon Hypervisor.framework support directly.
  • Add the minimal checked-in Hypervisor entitlement used to sign runtime development and CI artifacts.
  • Create and destroy a real process-owned HVF VM object through the system framework, with symbolic failure reporting and cleanup ownership.
  • Retain the versioned success or fail-closed unavailable report in the CLI and macOS CI.
  • Verify a signed round trip on a local Apple Silicon host and verify that a missing entitlement returns HV_DENIED.
  • Stage a runtime-owned, checksum-verified macOS libkrun bundle only for the isolated shim.
  • Create, configure plain agent vsock, and release one libkrun context without entering a VM.
  • Enter a real HVF VM in an isolated, bounded worker and require a guest-written host marker, natural zero exit, worker reap, and marker cleanup.
  • Retain fail-closed unavailable-HVF and missing-entitlement evidence without accepting pre-entry configuration as guest execution.
  • Boot the same pinned A3S Linux kernel and immutable system root through HVF, retain their digests in the host report, keep the writable per-generation share separate, and rerun the complete macOS SDK and soak matrices against those exact assets. The retained Apple Silicon run used manifest SHA-256 e7206ea5c645259fcc9f00d8b3042792d6a6b380436a0a38a1b85dda7c0d4284, raw-image SHA-256 e8f5f6713ac093b278b5851129f154b783c08bb8489fe6964bbd93dae0c43910, and agent SHA-256 ee7099e367c91b70a1c84cc6f8921da67e7aec4805e6b5c99b6aa683e7544ed1.
  • Establish the private macOS Unix endpoint and AF_VSOCK guest-agent bridge, verify that the peer is the shim's direct VM worker child, and authenticate version-negotiated protocol with a one-time token. The current immutable Guest negotiates protocol v10; retained v9 evidence remains valid for backward compatibility.
  • Run the same fixed create/state/start/kill/wait/delete OCI lifecycle used by WHPX, including bounded running wait, exact repeated exit status, pause/resume, live process inventory, resource update, normalized stats, and the exact six-device privileged profile. Keep durable target-cleanup evidence on the writable runtime share, create temporary source nodes only on Guest-local devtmpfs, and remove those sources at the Create barrier without weakening device identity validation.
  • Prove deterministic VM, process, descriptor, and filesystem cleanup without normal delete after successful create, start, and kill boundaries. Each phase requires exact endpoint removal, observed-PID reap, complete descriptor-inventory restoration, marker removal, and no new guest runtime root.
  • Add a bounded, versioned 25-wave HVF soak gate that creates a fresh VM for every complete two-container matrix, retains three primary generations per wave, rejects endpoint and descriptor drift, and uploads its JSON report and per-wave consoles in CI.
  • Retain fail-closed unavailable-virtualization, missing-entitlement, invalid-runtime-asset, missing-agent-rootfs, wrong-token, and unexpected-peer evidence without reporting false negotiation.
  • Expose the launch-ready HvfRuntimeDriver through a public Apple Silicon Host Service and CLI. Use one same-UID mode-0600 Unix socket below a real owner-only mode-0700 root, separate durable state/ from writable HVF runtime/, accept concurrent clients, scope disconnect failures to one connection, clean up only the bound inode, advertise all 20 driver operations and the runtime bundle-handoff extension, and reap every active VM once on graceful shutdown.
  • Abstract exact-generation VM launch and ownership behind testable factory/owner interfaces. Prove concurrent Create reuses one VM, interrupted Create resumes the moved bundle and starts one VM, and terminal Create failure reaps the VM and removes runtime-owned handoff state.
  • Advertise only DedicatedVm from both the macOS probe and the public HVF driver until trust-domain-aware shared-guest pooling exists.
  • Requalify the current public Host Service through RuntimeClient on the signed Apple Silicon build, including all 20 driver operations, public features/list/events, and Box-style bundle handoff without invoking a qualification-only lifecycle entry point. The August 13 closing run exercised all 23 advertised operations and consumed the exact staged bundle.
  • Kill the public Host Service while a real generation is live, require exact shim/worker owner-death cleanup and authenticated recovery evidence, reopen a replacement service, resume Creating or expose exact stopped/exit state, and prove no socket, process, descriptor, share, or runtime-root leak. The replacement was accepted only after its kernel peer PID differed from the killed service; it recovered exact signal=9, oom_killed=false state and restored the service descriptor inventory from 13 descriptors to 13.
  • Run a new 25/25 fresh-VM soak through the current public Host Service and retain current-commit evidence. Every wave used distinct shim/worker process identities, replayed create/kill/wait/delete exactly once, rejected stale generations, restored the 13-descriptor baseline, and left no endpoint, bundle handoff, runtime share, recovery report, socket, or process behind. The August 14 revision-bound rerun at a5a6b535fb69e16c10708fbc94927cf515e6b4d7 included the Guest-local device source fix, exercised all 23 public Host Service operations, recovered the killed owner through a distinct replacement, and completed 25/25 fresh VMs. Lifecycle, replacement, and soak each restored the 14-descriptor baseline with no transient residue.

Exit gate: a fresh Apple Silicon host test boots the utility VM, completes the fixed OCI lifecycle through the authenticated guest agent, validates negative isolation cases, and leaves no process, descriptor, or runtime-root leak. Only then may HVF become experimental. The August 13, 2026 Apple Silicon qualification passed the same immutable-image multi-container matrix, all 3 no-delete cleanup points, all 11 transport fault points, all 180 operation replacement paths, the asset/authentication/entitlement negatives, and 25/25 fresh-VM soak waves with 75 primary generations and a stable 10-descriptor baseline. The built-in HVF capability is therefore experimental. That evidence qualifies the historical R2M harness. Separate August 13, 2026 closing runs through the public Host Service passed the three real-host gates above against signed Apple Silicon artifacts, including a complete post-fix rerun after Unix socket path capacity became a configuration-time invariant. An August 14, 2026 revision-bound rerun then covered the Guest-local devtmpfs device-source correction with the same three gates and zero residue. The currently advertised macOS/HVF public product path is therefore 100% function-complete and remains experimental. Signed release-package qualification, upstream OCI conformance, adversarial security review, upgrade and rollback compatibility, and longer release soak remain promotion gates before supported.

The August 15, 2026 focused follow-up closed durable Host journaling for File upload and Filesystem mkdir/move/remove, raised the durable operation schema to v3, and passed all 18 real-HVF File/Filesystem owner-replacement paths. It also passed the unified post-commit acknowledgement contract for all 14 journaled mutations. These are function-completeness fixes; they do not remove the release-promotion gates above.

R2L — Linux KVM Utility VM

  • Report /dev/kvm presence, access, ioctl, and API-version evidence independently from Native Linux readiness.

  • Pin and verify the Linux libkrun runtime, firmware, and firmware-exported A3S Linux kernel for x86_64 and AArch64. The build accepts only the exact two-file archive for the selected architecture, and the isolated shim repeats real-file, size, digest, kernel-size, address, and kernel-digest checks before native API use.

  • Create, configure VM resources and a plain agent vsock, and release one dynamically loaded libkrun context on Linux x86_64 and AArch64 without opening /dev/kvm or entering a VM. Positive CI and tampered-file plus symbolic-link negatives retain the boundary.

  • Bind the verified native runtime and kernel to the immutable system root and static guest agent as one compatibility set for every advertised architecture. CI builds byte-reproducible x86_64 and AArch64 ext4 roots, proves that each contains the exact supplied static agent, embeds the exact target bundle from the strict shared asset manifest, and configures the descriptor-pinned root read-only in an isolated libkrun context. Manifest, image, target, runtime, symbolic-link, replacement, and same-size content drift all fail closed before VM entry.

  • Start the KVM worker in an isolated shim, mount only the protected per-generation runtime share, and authenticate the AF_VSOCK guest-agent session without falling back to host-kernel execution.

    The current candidate implements the isolated worker, descriptor-pinned runtime share and KVM device, pidfd-bound direct shim owner, kernel-verified direct Unix peer, one-time token handoff, protocol-v10 negotiation, exact immutable boot evidence, and process/endpoint/handoff cleanup. The x86_64 and AArch64 CI lanes require real authenticated entry whenever their KVM probe is available and otherwise retain explicit post-configuration KVM failure evidence. This parent remains open until both advertised architectures retain successful real-entry reports.

  • Implement the launch-capable KVM RuntimeDriver candidate through the shared twenty-operation adapter with exact-generation routing, bounded shutdown, and complete process, endpoint, share, and runtime-root ownership. KvmRuntimeDriver::open_candidate verifies the KVM probe, immutable manifest, private empty bootstrap root, and separate writable runtime share before a launch. The shared lifecycle enforces DedicatedVm, atomic bundle handoff, concurrent Create fencing, retryable and terminal cleanup, stopped recovery, all 20 workload operations, and all six OCI hook phases. Candidate capability remains probe-only, explicitly disables Native Linux fallback, and cannot register with HostRuntimeService until the real-entry, full-matrix, and soak gates pass.

  • Run the same lifecycle, process I/O, filesystem, resource, namespace, multi-container, fault-cleanup, owner-death, and service-restart matrices used to qualify WHPX and HVF.

    • Wire the shared Utility VM lifecycle to Linux x86_64/AArch64 and add a 16-case CI entry for the complete 20-operation lifecycle, two-container isolation, three lifecycle cleanup boundaries, and all 11 Host/Guest transport interruption points. The a3s.oci.linux-kvm-lifecycle-matrix.v2 report retains endpoint, shim-process, runtime-state, bootstrap, token/recovery, and marker cleanup. Runners without usable KVM emit unavailable with zero cases and skip the Alpine fixture rather than manufacturing a pass.
    • Add a qualification-only Unix Host Service and real-process recovery entry. It binds the override to linux-kvm-owner-death-restart-only-v1, kills the exact live service with SIGKILL, requires the shim and worker to exit with authenticated recovery evidence, reopens through a distinct kernel-authenticated socket peer, and verifies exact stopped/Wait replay plus stopped-only Delete and zero transient residue. Runners without KVM retain an explicit zero-case a3s.oci.linux-kvm-recovery-matrix.v2 report without downloading Alpine.
    • Add a separately scoped bounded KVM soak for x86_64 and AArch64. One durable Host Service runs 25 fresh exact generations by default and retains per-wave generation/replay, process-incarnation, descriptor, marker, endpoint, bundle-handoff, runtime-share, recovery-report, console, and configured Guest cgroupsPath lifetime evidence. Unavailable runners emit a3s.oci.linux-kvm-soak-matrix.v2 with zero completed iterations and do not download Alpine.
    • Close the KVM-independent driver isolation preflight before any Guest share or VM exists. Dedicated-VM Create now rejects SharedHostKernel, SharedGuestKernel, an inexact generation, or a missing atomic handoff contract before mutation. Missing, linked, non-private, digest-drifted, escaping-rootfs, and absolute-bind handoff sources are fully validated before shares/<container>/<generation> is created. The same production path and cleanup assertions run on Linux x86_64 and AArch64 CI without requiring /dev/kvm.
    • Retain the available 16-case lifecycle, owner-death/restart, and 25-wave soak reports on fresh x86_64 and AArch64 KVM hosts, then complete the remaining real-entry Guest negative-isolation profiles.
  • Retain fail-closed context evidence for invalid, missing, symbolic-link, or drifted Linux libkrun, firmware, and exported-kernel assets.

  • Retain real-entry fail-closed evidence for an initialization-failing KVM device and compatibility drift across the system root and guest agent.

    • Cover absent, inaccessible, ioctl-failing, and wrong-version KVM devices in the independent probe, and repeat real-character-device, read/write, identity, and API-version checks immediately before libkrun so an unusable entry device returns versioned evidence instead of relying on a native-process abort.
    • Add a qualification-only post-probe failure on KVM-capable hosts. The worker opens and pins the real /dev/kvm, requires API version 12, records kvm_post_probe_failure_injected=true in shim schema v7, and exits before native VM entry. The real-host gate requires exit code 2, no bridge or protocol negotiation, and exact endpoint, shim-process, token-handoff, and runtime-share inventory restoration.
    • Run the complete system-root and guest-agent compatibility-drift matrix at the configured real-entry worker boundary on x86_64 and AArch64. The 14-case a3s.oci.linux-kvm-compatibility-drift.v2 gate covers manifest and raw-image replacement, same-size mutation, and symlinks; architecture and runtime-target mismatch; Guest Agent version and digest drift; and runtime archive, libkrun, firmware, and exported-kernel provenance drift. Every case fails before KVM-device access or VM entry and restores endpoint, shim-process, token-handoff, and runtime-share inventories, so the two CI architectures retain the matrix even without a usable KVM device.

Exit gate: a fresh KVM-capable Linux host boots the pinned utility VM, passes the complete SDK and recovery matrices through the authenticated guest agent, and leaves no process, descriptor, cgroup, endpoint, share, or runtime-root leak. Only then may KVM become experimental.

R3 — Shared Linux Executor And Guest Agent

  • Multi-container guest registry with per-container generations, proven with two distinct bundles, simultaneous create barriers, independent start/kill/wait/delete, nonblocking wait/state progress, exact replay isolation, generation-1 fencing after generation-2 recreation, and complete cleanup through native Linux and the macOS utility VM.
  • Create a new UTS namespace and apply the configured hostname and domainname before the created barrier.
  • Create a new mount namespace, make the inherited mount tree recursively private, self-bind the rootfs, and complete pivot_root before the created barrier.
  • Apply OCI mount entries in listed order, including safe missing directory/file target creation, bind/rbind, common VFS flags, propagation modes, and filesystem-specific data.
  • Own the complete OCI 1.3 Linux mount-option registry in the SDK, consume every required and recommended control option without forwarding it as filesystem data, preserve unknown filesystem-specific options, reject the optional unimplemented tmpcopyup behavior explicitly, and derive the sorted feature report from the same registry. All 82 Linux mount-option normative entries are owner-bound: 80 enforced and two optional entries conformant through explicit rejection and honest feature reporting.
  • After all mounts are in place, create the conditional OCI Linux /dev/fd, /dev/stdin, /dev/stdout, and /dev/stderr links without replacing conflicting container content. Verify their exact targets through native Linux v19 and Apple Silicon utility-VM v11 retained evidence.
  • Create new IPC, network, and cgroup namespaces atomically before the created barrier.
  • Create a new PID namespace, retain a dedicated namespace PID 1 supervisor, run the configured container process as PID 2+, and authenticate the launcher-to-supervisor-to-process identity chain before the created barrier.
  • Prove executor shutdown cleanup without delete after successful create, start, and kill through native Linux and the macOS utility-VM path.
  • Open and retain a pidfd for every authenticated configured process, reject kernels without pidfd_open and pidfd_send_signal, and deliver lifecycle and cleanup signals without a numeric-PID reuse race. Prove the path through native Linux and the macOS utility VM.
  • Retain exact normal-or-signal configured-process termination, return the same result from repeated waits, enforce bounded wait timeouts, and prove one container's wait does not block another container's state request.
  • Create new rootful user and time namespaces, install and read back exact UID/GID mappings through the authenticated parent, apply and verify monotonic/boottime offsets, switch to mapped namespace-root credentials before rootfs mutation, and prove the path through native Linux and the macOS utility VM.
  • Create a new rootless user namespace from a non-root native executor, require exact size-1 effective-UID/GID mappings for container root, install subordinate ranges through fixed root-owned setuid mapping helpers, deny supplementary groups, read back both maps and setgroups=deny, and prove the core lifecycle plus exec and ordered events on x86_64 and aarch64.
  • Open and type-check all existing namespace descriptors before mutation, join non-user namespaces around the user-namespace capability transition, preserve PID/time next-child semantics, and prove UTS, mount, IPC, network, cgroup, PID, user, and time joins through native Linux and the macOS utility-VM path.
  • Apply private, shared, slave, and unbindable rootfs propagation, masked paths, read-only paths, and read-only rootfs enforcement; prove the same create/start barrier and exact cleanup through native Linux and the macOS utility VM.
  • Supply OCI's Linux ABI default filesystems in newly created mount namespaces when their exact destinations are omitted. Mount /proc and an eligible read-only /sys before configured child mounts, mount /dev/pts and writable /dev/shm after a configured /dev, and preserve exact caller destinations. Do not expose host sysfs when a non-initial user namespace inherits networking; Linux rejects a fresh sysfs there. Prove the rootful, new-network, and rootless security paths through Native Linux.
  • Apply all OCI recursive VFS mount attributes with mount_setattr, descriptor-pin each destination, and prove top-level and nested submount enforcement through native Linux and the macOS utility VM.
  • Apply ID-mapped filesystem and bind mounts through the Linux mount API, use either exact per-mount mappings or the newly created container user namespace, distinguish non-recursive idmap from recursive ridmap, and prove filesystem ownership through native Linux and the macOS utility VM plus unchanged bind sources and exact recursion through native Linux.
  • Apply and verify OCI capability bounding, effective, permitted, inheritable, and ambient sets; read all five sets back from the kernel, prevent exec from exceeding the configured init bounding ceiling, and retain distinct init and exec profiles in Native Linux smoke v18.
  • Apply OCI process.noNewPrivileges through one shared init/exec path, require exact PR_GET_NO_NEW_PRIVS read-back, and retain workload-level /proc/self/status evidence for init and exec.
  • Implement and retain the OCI warning-only policy for requested capabilities that the kernel cannot map or grant. Init and exec resolve each requested set against the kernel ceiling, bounding set, and current grant authority, enforce the remaining set exactly, and send one bounded, validated warning per unavailable capability over the authenticated internal control socket. The agent logs each warning before accepting exec success; malformed, duplicate, or unbounded warning frames fail closed.
  • Validate, retain, and apply every OCI process.rlimits type before credential reduction for both init and exec; reject duplicates, inverted soft/hard values, and unbounded plans; read every successful setrlimit back through getrlimit, fail closed on either value changing, and retain distinct init and exec RLIMIT_NOFILE evidence in the native Linux report.
  • Validate and retain OCI process.oomScoreAdj, apply it to init and exec through procfs retained before namespace and root changes, leave the inherited value untouched when omitted, require exact kernel read-back before credential reduction, and bind all three OCI requirements to unit and real Native Linux evidence.
  • Validate and retain OCI process.ioPriority, apply all three Linux I/O classes to init and exec before credential reduction, preserve inherited priority when omitted, reject out-of-range or nonzero idle class data, and require exact syscall read-back plus real Native Linux evidence.
  • Validate, retain, and apply OCI process.scheduler to init and exec with Linux sched_setattr/sched_getattr: preserve inherited scheduling when omitted; support all seven OCI policies and flags; reject duplicate flags, invalid nice/realtime/deadline relationships, and unavailable SCHED_ISO with stable typed errors; preserve the exact OCI flag spellings across SDK transport; and require real Native Linux kernel read-back.
  • Validate and enforce OCI process.execCPUAffinity only for exec. Normalize CPU lists before launch, apply and read back initial before the workload cgroup transition, join through the inherited cgroup.procs descriptor, then apply and read back final. Omitted or empty phases make no affinity syscall, init ignores the field, and Native Linux, HVF, and WHPX lifecycle probes verify the final kernel mask.
  • Validate and enforce OCI linux.personality for configured init. Accept only the LINUX and LINUX32 domains, reject every nonempty flag list before mutation, perform no syscall when the field is omitted, and require exact syscall and workload read-back on Native Linux, HVF, and WHPX.
  • Validate and enforce OCI linux.memoryPolicy for configured init. Recognize all seven OCI modes and all three flags from one SDK registry, validate bounded node lists and Linux mode/flag relationships, apply the policy before credential reduction and seccomp, and require exact syscall plus workload read-back on Native Linux, HVF, and WHPX. Omission preserves the inherited policy without issuing a syscall.
  • Implement the OCI 1.3 Intel RDT lifecycle in the runtime-namespace parent. Create or reuse the requested CLOS, apply l3CacheSchema, memBwSchema, and schemata in normative order with read-back, assign the authenticated init PID before runtime hooks, manage a dedicated monitoring group, preserve explicit CLOS ownership, and recover exact runtime-owned paths after owner death. Omission does not inspect or mutate resctrl.
  • Qualify Intel RDT on a CAT/MBA-capable x86_64 Linux host, including real-kernel CLOS and monitoring limits, assignment inheritance, delete, failed-Create rollback, and owner-death cleanup with zero resctrl residue.
  • Parse OCI Linux sysctls once in the SDK, accept only known IPC, network, UTS-domain, and user-namespace controls, reject aliases and host-global mutation, and apply bounded deterministic writes through retained procfs. Verify every value, reverse all prior writes when Create fails before ready, and retain native x86_64/aarch64 IPC and network read-back evidence.
  • Implement OCI 1.3 linux.netDevices in the runtime-namespace parent. Validate a bounded source-sorted plan and an independent network namespace; reject missing sources, exact target collisions, loopback devices, and master-attached interfaces; support appended %d name templates; move interfaces through retained namespace descriptors; preserve stable link attributes and permanent global addresses; and bring every moved interface up. Retain reverse-order failed-Create rollback until the created state is durably committed, reject rootless requests before mutation without explicit network-device authority, and advertise linux.netDevices.enabled=true from the same implementation. Native Linux qualification covers real dummy-device move/rename, MTU/MAC/address/state read-back, conflict, partial rollback, rootless rejection, and cleanup. Ten OCI requirements are owner-bound.
  • Make the OCI feature report fail closed against the pinned schema, derive its accepted specification range and seccomp values from SDK-owned registries, and prove every advertised seccomp action, architecture, and operator against the shared executor. Forty-one feature requirements are owner-bound. Subsequent common-configuration, platform, extensibility, namespace, ID-mapping, time-offset, PIDs, memory, Block I/O, Linux-device, HugeTLB, RDMA, Unified, network-controller, Seccomp, and VM-configuration promotions plus Linux default-filesystem, runtime-lifecycle, common value, file-descriptor, cgroup, rootfs, network-device, mount-label, and stable feature-report evidence leave 578 enforced, 51 validated, 12 conformant, 14 reviewed-external, and zero pending entries.
  • Compile and install pure-Rust x86_64/AArch64 seccomp BPF with OCI argument comparisons, stacked default/specific actions, and retained exec policy.
  • Apply and read back cgroup v2 memory limit/reservation/swap, CPU shares/quota/burst/period/cpuset/idle, PID limits, Block I/O default and per-device weight plus read/write BPS/IOPS limits, HugeTLB usage plus optional reservation limits for every requested live page size, keyed RDMA HCA handle/object limits, and bounded unified control-file settings whose controllers are present and enableable. Preserve zero and map the OCI memory and PIDs -1 sentinel to cgroup v2 max for Create and Update, reject values below -1, keep reservation independent of the hard limit, require finite total swap to have a compatible finite memory limit, and reject cgroup v1-only memory and net_cls/net_prio network controls before mutation. Keep control-workload-v1 finite while accepting zero for the exact workload leaf and adding only its configured headroom to the management envelope. Allow independent CPU quota and period requests, reject cgroup v1 realtime controls, and order live quota/burst changes without a transient invalid state. Join init and exec to the same owned leaf; freeze and thaw that leaf through cgroup.freeze and verify the exact transition through cgroup.events. Keep Block I/O on the workload leaf, preserve omitted keyed values during partial updates, verify every write, and roll back in reverse order if a later resource or device-policy mutation fails. Keep HugeTLB, RDMA, and Unified settings on the workload leaf as well, preserve omitted page sizes and HCA fields, and preflight every dynamic control, unified file, and RDMA device before device-policy mutation.
  • Create a private controller-enabled cgroup-v2 manager, apply generation-fenced typed resource updates with exact read-back and reverse-order rollback, accept kernel-defined Unified writes with readable no-op/rollback snapshots, and expose normalized CPU, memory, PID, and event statistics through native Linux and the shared utility-VM lifecycle harness.
  • Preserve OCI linux.cgroupsPath identity in one SDK parser, resolve absolute values from the visible cgroup v2 mount, keep relative values stable below one private manager, confine rootless absolute values to the verified delegation, and retain exact normal and owner-death cleanup paths. Native x86_64/aarch64 gates read both host memberships, recreate the relative value at the same location, and require both leaves to disappear after delete.
  • Delegate writable cgroup-v2 ownership only for the OCI 1.3 exact mount and new-namespace profile. Resolve the configured process UID through the container user mapping, forbid rootless transfer to subordinate identities, preserve GID, and mutate only the retained cgroup directory plus existing kernel-listed delegate files. Bound and validate the inventory, use the normative fallback only when it is absent, and verify positive, read-only, unlisted-file, and cleanup behavior on a real Linux kernel.
  • Add the opt-in control-workload-v1 topology for a trusted configured init: retain exact workload limits in linux.resources, derive a bounded outer management envelope, create fixed control/workload children, pass collision-checked membership FDs, keep guest cgroupfs read-only, and update, freeze, inspect, and clean up the workload topology through the same cgroup owner.
  • Enforce rootful OCI block, character, unbuffered-character, and FIFO nodes at normalized paths inside or outside /dev, with exact identity, mode, mapped ownership, existing-target conflict handling, and durable cleanup. Supply the six default nodes, /dev/ptmx, and terminal-backed /dev/console; retain the bounded A3S Box rootless profile and ordered cgroup-device policy path.
  • Complete the remaining process and rootless configuration boundary.
    • Enforce supplementary credentials, I/O priority, exec CPU affinity, and supported rootless ID-mapping shapes before executor mutation; reject every unsupported shape.
    • Advertise and enforce the exact supported LSM set, with fail-closed behavior and positive and negative evidence for every reported module.
    • Extend seccomp classification and enforcement to every advertised architecture and notification mode; reject every other requested action, flag, or architecture before launch.
    • Replace the Box-specific device profile boundary with an exact generated support policy or reject broader OCI device requests without mutating the rootfs or cgroup by requiring an explicit cgroup path before any device-policy mutation.
  • Complete the remaining cgroup v2 resource boundary.
    • Bind every OCI CPU field to cgroup v2 or an explicit pre-mutation rejection. Preserve omitted current values during partial updates, return Unsupported for unavailable burst or idle controls, and keep burst and idle on the exact workload leaf rather than the derived control-workload-v1 management envelope.
    • Enforce cgroup v2 Block I/O default and per-device weights plus all four throttle lists with exact keyed read-back and rollback; reject the cgroup v1-only leaf-weight model before mutation.
    • Enforce HugeTLB usage and reservation controls for canonical live page sizes, including full-range uint64 decoding, kernel-aligned read-back, partial Update preservation, reverse rollback, optional-controller propagation, and workload-only control/workload placement.
    • Enforce keyed RDMA handle/object limits with controller and device preflight, partial-update preservation, exact read-back, reverse rollback, and workload-only control/workload placement.
    • Enforce bounded OCI Unified control-file maps with dynamic controller propagation, runtime-unknown and write-only file support, safe-name and typed-ownership validation, writable-file preflight, kernel-defined read-back formatting, readable no-op/rollback snapshots, and workload-only control/workload placement.
    • Add rootful device-access BPF with exact block/char allowlists, access subsets, and live filter replacement on update.
    • Make the OCI declared/default device inventory an immutable cgroup-v2 BPF upper bound for rootful and delegated-rootless execution. Generate a private generation-fenced cgroup path when linux.cgroupsPath is omitted, intersect ordered linux.resources.devices rules with that boundary, and preserve it when rules are cleared. Native ARM64 Linux evidence grants CAP_MKNOD, permits a declared node, rejects an undeclared node, remounts a nodev device source with dev, rejects the late access, and returns executor, session, and cgroup inventories to zero.
    • Qualify the rootless delegation model and device support for every advertised profile on real hosts. The v4 rootless gate retains an exact user-owned cgroup-v2 descriptor, starts a parent-bound privileged helper before Tokio, permanently drops the owner to its real UID/GID, and accepts only structured install/replace/remove requests for normalized descendants. The first bounded profile is the exact six-device A3S Box fixture. Its smoke verifies retained device-node mounts, read-only replacement, failed-update rollback, resource-rule clear/restore with the inventory boundary retained, durable events, helper shutdown, and complete cgroup/runtime cleanup. Runtime commit bed43d2 passed both x86_64 and aarch64 real-host lanes in CI run 31714178349. Both retained v4 reports record available, UID/GID 20000, verified helper, nodes, updates, events, deletion replay, durable-state removal, and empty cgroup, runtime, session, and marker cleanup. This is the only advertised rootless device profile; broader device and controller profiles remain outside that boundary.
    • Supply the six normative default device nodes for an ordinary rootless launch through the same bounded helper without requiring or fabricating a linux.resources.devices access policy. Recreate the helper for both sides of owner-death recovery and verify the nodes from inside the workload.
    • Define a fail-closed authority contract for default devices when a container joins an externally owned user namespace. Pin and type-check the descriptor, observe bounded non-overlapping UID/GID maps from inside the namespace, recheck its device/inode identity immediately before setns, and use the observed namespace-root mapping with the existing detached device-source and exact-cleanup path. Native Linux multi-container v19 and real Apple Silicon utility-VM multi-container v11 verify all six nodes from inside the joined-user workload.
    • Run create, update, stats, pause/resume, recovery, and cleanup evidence for every newly advertised controller on x86_64 and aarch64.
  • Reap adopted orphan and zombie processes under namespace PID 1, terminate all remaining namespace processes after the configured process exits, and preserve that process's exact exit code or terminating signal.
  • Add exact-generation container exec with a reserved init process ID, shared fail-closed OCI process planning, retained rootfs and all configured namespace descriptors, authenticated helper/parent/PID/root/namespace identities, per-process pidfds, replay-safe signal, stable repeated wait, WNOWAIT process-group cleanup, and automatic exec termination when init or the agent session exits. Prove the path through native Linux and the shared utility-VM lifecycle harness.
  • Put configured and exec workloads in separately supervised process groups, retain each leader with pidfd plus non-reaping wait ownership, use waitid(WNOWAIT) in fork supervisors, serialize signal/reap through a cross-process lease, and fan replay-safe kill(all=true) signals across every live group without requiring delegated cgroup v2. Prove descendant delivery and the closed PGID-reuse race with real Linux regressions and the rootless native lifecycle.
  • Add exact-generation live init/exec process inventory plus replay-safe pause/resume, and prove with a progress-producing workload that cgroup freeze stops execution and resume restarts it through native Linux and the shared utility-VM lifecycle harness.
  • Ordered hooks with OCI state on stdin.
  • Backpressured piped stdin, bounded captured stdout/stderr, controlling PTYs, OCI consoleSize initial terminal dimensions, resize, merged terminal output, VEOF close, signals, and byte-accurate output cursors.
  • Native inherited descriptor handoff for the A3S Box exec listener on FD 3, PTY listener on FD 4, and dedicated init log on FD 5, with type/role/count validation, collision-safe child dup2, stable host/agent replay schemas, non-native rejection, exact listener/log lifecycle evidence, and cleanup.
  • Update and stats.
  • Persist exact-generation lifecycle and process events behind a global nonzero sequence, deterministic replay identity, bounded pagination and filtering, exclusive cursors, long polling, crash repair, and host-service reopen. The configured host owns and advertises events without driver or guest dispatch, and native Linux verifies the exact lifecycle stream.

Exit gate: the same executor passes its lifecycle, configuration, security, and recovery suites in the Windows guest and on native Linux.

R4 — Native Linux Without KVM

  • Report native namespace, cgroup v2, and pidfd signaling prerequisites without opening /dev/kvm or initializing libkrun.
  • Report optional KVM absence, permission failure, ioctl failure, and API version independently from native readiness.
  • Add the native Linux driver without linking or initializing libkrun.
  • Reuse the R3 Linux executor directly.
  • Prove runtime binary startup, feature inspection, Rust SDK loading, and the rootful lifecycle through the versioned create-attachment contract, including exact repeated init wait plus public SDK exec/signal/wait, pause/resume, process inventory, resource update, and normalized stats plus PTY allocation, resize, interactive I/O, and VEOF without KVM on x86_64 and aarch64.
  • Prove the helper-backed non-root core lifecycle with subordinate UID/GID ownership and setgroups=deny on x86_64 and aarch64.
  • Qualify explicit rootless cgroup-v2 delegation on x86_64 and aarch64. The v4 lifecycle gate covers create, update, stats, pause/resume, replay, events, and runtime-owned subtree cleanup on both architectures. A separate owner-SIGKILL gate now reopens the exact delegation as the same non-root UID/GID and requires stopped-only recovery plus complete cgroup cleanup. Runtime commit 49cea11 passed both real-host lanes in CI run 31674526443; the retained x86_64 and aarch64 v2 recovery reports bind UID/GID 20000, verified delegation use, workload termination, stopped-only deletion, and an empty runtime-created cgroup subtree.
  • Prove shutdown cleanup without delete after create, start, and kill on x86_64 and aarch64 without KVM.
  • Add the Sandbox-scoped native runtime owner, bind its protected Unix SDK endpoint, route the complete lifecycle through a3s-oci-sdk, fence inherited Box descriptors to one container ID, and prove signal-driven cleanup on x86_64 and aarch64 without KVM.
  • Add a bounded, versioned native complex-container soak that repeatedly drives concurrent lifecycle, query, captured exec, pause, durable service reopen, resume, generation reuse, and leak checks across four independent slots on x86_64 and aarch64 without KVM. CI defaults to 25 waves, verifies 100 complete lifecycles from dynamic operation counts, and retains each architecture's JSON report.
  • Retain a versioned real-driver configuration matrix for private, host-inherited, and donor-shared network namespaces; shared/read-only bind and private-tmpfs storage; inline/script/direct/nonzero init; and independent prestart/createRuntime/createContainer/startContainer/poststart rollback, timeout, and warning-only poststop behavior on x86_64 and aarch64.
  • Prove the Box-owned production bundle and explicitly opted-in long-lived Native Linux owner composition on x86_64 and aarch64 through the Rust, Python, TypeScript, and Go SDK lifecycle, exec, filesystem, route-aware stats, pause/resume, snapshot restore, restart, and cleanup surfaces.
  • Safely reconcile abrupt Native Linux owner death on x86_64 and aarch64. Bind the launcher and all helper chains to their authenticated parents, persist PID-start-time/config-digest/cgroup recovery evidence per exact generation, kill the owner with SIGKILL, reopen the real driver in a distinct process, commit only a stopped tombstone, refuse invented wait evidence, and prove stopped-only delete plus complete transient cleanup. Live process-session reattachment remains an R6 gate.
  • Prove packaged installation and A3S Box product startup without KVM.
  • Run the full Sandbox SDK suite with /dev/kvm absent and inaccessible.
  • Fail explicit dedicated-VM requests before runtime state or driver mutation.
  • Reject unavailable dedicated-VM selection in A3S Box before image mutation.

Exit gate: A3S Box Sandbox and its Rust, Python, TypeScript, and Go SDK tests pass on supported x86_64 and aarch64 Linux hosts without KVM.

R5 — Full OCI 1.3 Conformance

  • Complete common configuration and process semantics and bind every accepted or rejected field to the zero-pending normative evidence ledger. The pinned gate freezes all 79 common configuration schema items outside the separately reviewed VM section: 69 are enforced, two are validated, four unsupported Linux process fields are rejected, and four native non-Linux sections are rejected as inapplicable. All 278 config.md requirements are frozen as 227 enforced, 35 validated, 13 reviewed external, and three conformant entries with no pending owner. Arbitrary annotation keys and values remain exact JSON metadata through bundle decoding and Linux executor planning, including escaped NUL and control characters; they are not incorrectly treated as C strings. Empty keys and bounded resource limits still fail closed. This closes common configuration semantics, not Linux configuration, cross-driver lifecycle, security, or release conformance.
  • Complete Linux configuration enforcement and generate feature reporting from the same driver-specific support data used by validation and execution.
  • Complete applicable VM configuration semantics without executing untrusted hypervisor, kernel, or firmware paths during validation. The pinned gate freezes all 26 VM-related schema items and all 24 normative VM requirements: four absolute runtime-path requirements are semantically validated, while the remaining 20 requirements and every caller-provided hypervisor, kernel, image, and hardware field are bound to the selected driver's fail-closed runtime-owned-asset policy. Dedicated negative evidence rejects NUL bytes in every executable VM path and parameter. The Host Service rejects the complete schema-valid vm section before durable generation reservation, bundle handoff, platform mutation, or mutating driver dispatch. This closes bundle-supplied VM configuration semantics, not utility-VM lifecycle, security, real-host, or packaged-artifact qualification.
  • Pass the pinned OCI JSON schema suites for config, state, and features using fixtures emitted by every advertised driver profile. The exhaustive SDK gate runs all 19 vendored positive, schema-negative, and malformed-JSON cases and SHA-256-binds the exact fixture inventory and canonical LF text. A separate Host Service matrix validates the checked-in Native Linux, Linux KVM, macOS HVF, and Windows WHPX configurations, each generated Features document, and created, running, and stopped State documents. This closes schema compatibility only, not the remaining semantic, lifecycle, security, or release-artifact gates.
  • Pass upstream lifecycle validation tools on every supported platform and architecture using the exact packaged runtime binaries.
  • Cross-check supported bundles with upstream OCI lifecycle validation tools without shipping a second runtime backend.
  • Run hook-order, rollback, crash-recovery, security-negative, and long-running soak suites on every advertised driver profile.
  • Publish an exact, generated support manifest with no unclassified field. The schema-support v2 lock records 257 enforced, two validated, 75 rejected unsupported, 89 rejected inapplicable, zero pending, and zero conformant items. This closes field classification only; release conformance still requires the remaining lifecycle, security, cross-driver, upstream-tool, and packaged-artifact gates above.

Exit gate: the release report contains retained evidence for every applicable normative MUST and MUST NOT requirement in OCI Runtime Specification 1.3.0.

R6 — A3S Box Migration

  • Add the pinned a3s-oci-sdk dependency to A3S Box.
  • Implement the Box adapter using SDK types only.
  • Route explicitly opted-in new Linux Sandbox records through Box-owned resource and bundle preparation into the long-lived Native Linux host owner, with a persisted route and no fallback after selection.
  • Add an early cross-platform vertical slice for create, state, start, wait, kill, delete, exact exit status, and runtime-service restart before completing every optional OCI field.
  • Route both Box isolation choices through the SDK: microvm requests DedicatedVm, while sandbox requests SharedHostKernel.
  • Persist only the exact OCI container ID, generation, endpoint, driver, isolation, configuration digest, and attachment digest needed for reconciliation; stop persisting runtime-owned process, VM, socket, pipe, and cgroup identities in new records.
  • Preserve memory-retaining pause/resume through exact SDK targets with operation capability checks, durable replay identities, immutable binding validation, and lost-response reconciliation.
  • Preserve captured and streaming exec, initial and streaming stdin, cursor-checked output, signal/wait, PTY/resize, exact terminal status, and cancellation-safe timeout cleanup through exact-generation SDK operations.
  • Preserve exact-generation process inventory, resource updates, normalized stats, and ordered events through the public SDK, including capability preflight, binding drift rejection, durable Box claims, and lost-response replay.
  • Preserve exact-generation file upload/download and filesystem stat/mkdir/move/list/remove through the public SDK with bounded payloads, capability preflight, mutation replay identities, descriptor-confined rootfs resolution, and Box type conversion.
  • Preserve Box log policy and complete stop, kill, recovery, and cleanup parity.
  • Prove the production x86_64 Native Linux owner/Box process restart boundary: kill the exact owner, cascade launcher/init termination, rebind through a fresh Box process, reconcile stopped state without invented exit evidence, delete the exact old generation, and restart the next Box and OCI generations.
  • Prove Box process-session recovery across an out-of-process runtime restart on real native Linux and utility-VM drivers.
  • Complete the Box cross-platform behavior and soak suites against A3S OCI Runtime.
  • Qualify the Box R17 resource profile against control-workload-v1, including exact CPU/memory/PID enforcement, control-service survival under workload OOM pressure, and zero leaked processes or cgroups. A3S Box PR #180 used OCI Runtime e6b840b73a4e5c3bbfa72c2b5d6fd89104a60f9a to resolve the fixed control and workload children, verify the derived outer headroom and exact workload limits, observe real CPU throttling, PID exhaustion, and workload OOM, then complete a post-OOM exec through the surviving control transport. Its required CI gate passed all advertised R17 profiles in 67.20 seconds and required the final process, cgroup, mount, provider-home, and runtime-state inventory to equal the clean baseline.
  • Remove external-runtime discovery, direct invocation, configuration, and fallback paths.
  • Remove Box's direct libkrun, VMM, guest-init, and containerd-shim paths only after their replacement gates pass through the packaged OCI Runtime.

The Native Linux side now exposes a packaged, long-lived multi-container host service suitable for the unified Box adapter. Box persists an explicit box_vm or oci_sdk route before preflight, prepares its product resources and minimal OCI bundle, and passes the opt-in x86_64 and aarch64 production-owner composition through all four SDKs. Separate gates on both architectures now prove owner/Box process restart with safe stopped-only reconciliation and explicit next-generation restart. The broader gate remains unchecked until live session reattachment passes on the real driver, the same production composition passes WHPX, and the default/MicroVM cutover is complete. OCI Runtime independently proves that abrupt Native Linux owner death safely terminates and reconciles the exact generation without inventing terminal evidence.

R7 — containerd Runtime V2

  • Define the supported containerd runtime-v2 API and version matrix, the shim binary and package layout, and the exact mapping from containerd namespace and task identity to OCI container ID and runtime generation.
  • Load the containerd-provided OCI bundle and translate create, start, state, wait, kill, delete, exec, resize, close-I/O, and stats operations into public a3s-oci-sdk calls without invoking A3S Box or importing driver internals.
  • Preserve containerd stdin/stdout/stderr and terminal semantics through the SDK's bounded process-I/O contract, including reconnect, EOF, resize, exact exit status, and cancellation cleanup.
  • Reconcile shim and containerd restart at every lifecycle boundary using the runtime's durable generation and operation identities; prove that restart never duplicates a mutation, reroutes a driver, or invents process state.
  • Run real containerd and ctr integration suites for lifecycle, exec, I/O, signals, stats, restart, forced cleanup, stale identity, and parallel tasks against every advertised driver profile.
  • Publish the shim with signed or checksummed runtime packages and retain the exact containerd, shim, SDK, runtime, and driver compatibility record.

Contract v1 now freezes containerd.task.v2.Task, the exact 16 implemented methods and explicit Checkpoint gap, runtime type io.containerd.a3s-oci.v2, binary and Linux archive entry containerd-shim-a3s-oci-v2, installation at /usr/local/bin/containerd-shim-a3s-oci-v2, the exact compatibility matrix, and sha256-length-framed-u64be-v1 identity vectors. Tagged Linux archives include the shim and contract document; RuntimeInfo exposes the contract, identity, generation, and exact development-qualification annotations. The same code-owned contract now freezes 23 exact Task and FIFO-pump routes and derives their 18-operation public-SDK union. Endpoint admission consumes that union directly, version and RuntimeInfo output expose it, and manifest tests reject A3S Box, Runtime implementation, Agent, or Core dependencies in the shim crate.

Current Native Linux development evidence covers containerd 2.2.2 lifecycle, exec, pause/resume, update, stats, PID inventory, exact init and exec exits, separate stdout/stderr plus stdin from empty input through 4 MiB, Created/Running/Stopped daemon-restart boundaries, terminal exec resize before and after daemon restart, schema-v8 durable exec incarnations plus init/exec stdin, signal, and resize sequences, exact pending input payloads, signals, and terminal sizes, Open/Closing/Closed stdin state, output cursors, and per-task control sequencing, live terminal-exec input and output continuation without replay after manual shim replacement, including a pending WriteStdin operation committed remotely before the replacement can observe its response and replayed with exactly one input effect, plus a committed CloseStdin boundary that persists Closing, loses the original response, replays through the replacement, commits Closed, and delivers one terminal EOF effect without reopening its FIFO, plus a committed exec SignalProcess boundary that retains sequence 1 SIGSTOP as pending, commits it remotely, replaces the shim, joins the completed operation, and then proves the real process transitions through SIGCONT→SIGSTOP→SIGCONT under fresh sequences 2 through 4, stale task incarnation and runtime-generation replacement, a four-task parallel Create/Start/running-restart/137-cleanup matrix, and exact cleanup after shim SIGKILL with init Created or Running and exec Added or Running. A durable pre-generation create intent now also replays an in-flight Create through its exact incarnation and operation identity after shim SIGKILL, obtains the one runtime generation, and force-cleans it without task, process, bundle, or runtime-state residue. A post-commit Start boundary runs the exact stable Start identity while shim metadata still records Created, then kills the shim and proves bounded DeleteShim cleanup terminates and deletes that running exact generation. A separate post-commit Delete boundary removes the exact runtime generation before killing the shim, then proves DeleteShim treats only that generation's NotFound result plus a successful replay of its stable normal or force Delete identity as a completed remote effect. It then finishes local metadata, rootfs, and bundle cleanup without touching caller-owned container metadata; unconfirmed state loss fails closed. A post-commit Exec boundary submits the exact stable generation-scoped process identity while shim metadata still records the exec as Added, verifies its live PID, then proves DeleteShim reaps both init and exec and removes the exact generation without touching caller-owned metadata. A post-commit SignalProcess boundary starts an exec, suspends the shim before submitting its exact stable SIGKILL identity directly to the runtime, observes the exact signal-9 exit while the init remains Running at its original PID, then kills the stopped shim and proves bounded cleanup removes both processes and the exact generation. A post-commit Kill boundary also submits the exact stable SIGSTOP mutation against a running generation, kills the shim while the stopped process remains live, and proves bounded cleanup delivers the terminal signal and reaps the exact PID. Post-commit Pause, Resume, and PID-limit Update boundaries retain the same exact generation, verify the real paused state or applied pids.max, then kill the shim and prove the same bounded cleanup converges without leaked cgroups or processes. Paused cleanup uses the exact force Delete operation so the runtime thaws and stops the generation as one cleanup operation instead of waiting on a frozen terminal signal. Repeated controls now use a monotonically increasing durable sequence instead of one fixed operation identity: two different Updates and two complete Pause/Resume cycles dispatch distinct mutations, identical completed retries do not dispatch twice, concurrent same-task controls are serialized, and an in-flight retry retains the same sequence across shim metadata reopen. Canonical JSON request fingerprints keep unordered resource maps stable across shim, host, and guest reconstruction. Runtime operation schema v2 records that encoding explicitly while retaining schema-v1 retry validation with the legacy serializer. The August 14, 2026 Ubuntu arm64/containerd 2.2.2 release build also freezes the Runtime before a terminal ResizePty, persists the next per-exec sequence and size, freezes the original shim, commits that exact Resize directly, and replaces the shim before its local journal can observe the response. The replacement replays the same sequence without a second terminal effect, commits the observed size, suppresses an identical retry, and proves that A→B→A allocates fresh identities and restores the real PTY to A instead of replaying the first A. The latest gate also runs one exec to exit 7, deletes it, reuses the same containerd exec ID, restarts containerd while the replacement is Added, and requires exit 23 from a fresh SDK process identity. Its durable per-task exec sequence survives DeleteProcess; exit monitors are incarnation-bound so a late result cannot terminate or poison the replacement. The latest qualification also releases each Native Linux guest mutation record only after its Host result is durable, including every derived chunk identity for a stdin payload larger than the 4 MiB guest frame limit. Three complete 46.92, 47.39, and 47.23-second matrices passed consecutively through Host PID 3605 with installed shim SHA-256 a0e7dce493308ebea0b4642dd81a9e489109a8b3709f2a1ede62b015cc123482. The matching Host and agent SHA-256 values were f097da3529c47a06b32271550417ed810d698a2a6e385f122771c197b7de2b67 and be0b13215c21a2312f8a3e8d79cc9a39ed1a4b07b539f3d557e0f4e168c3345a. The qualification recreates the killed task ID with a new incarnation and generation and leaves no matching task, container, shim, agent child, workload process, bundle, live runtime record, prepared Host operation, session, marker, workload cgroup, or zombie. The remaining R7 items stay open until the remaining failure boundaries, every advertised driver profile, and the published release-artifact compatibility record pass.

Exit gate: containerd task, restart, I/O, and cleanup suites pass through the public SDK without the Box CLI, a direct VMM path, duplicate lifecycle state, or leaked runtime resources.

R8 — Optional Parity Extensions

  • Add versioned extension discovery and negotiation so an optional operation is advertised only when the selected driver and exact release artifact passed its own gate.
  • Accept already-authorized storage attachments with immutable identity, access mode, ownership, and cleanup contracts while leaving named-volume and snapshot policy in A3S Box.
  • Accept already-authorized network attachments with exact namespace, interface, and cleanup identities while leaving IPAM, DNS, and network policy in A3S Box.
  • Add reusable guest-session ownership with trust-domain, isolation, generation, capacity, reset, and leak fences; never reuse a guest across an incompatible or undeclared trust boundary.
  • Implement checkpoint and restore as generation-fenced SDK operations with immutable artifact identity, compatibility validation, durable replay, rollback, and exact restored-process evidence.
  • Carry TEE launch measurements and attestation evidence through typed SDK contracts without moving attestation authorization or product policy into the runtime.
  • Run Box storage, networking, warm-session, snapshot, restart, and security suites through only the public extensions on each driver that advertises them.

Exit gate: every advertised extension has a versioned contract, fail-closed capability report, recovery semantics, exact release-artifact evidence, and a passing Box consumer gate. Unadvertised optional extensions do not block a supported core runtime release.

Platform Promotion

DriverProbe-onlyExperimentalSupported
Windows libkrun/WHPXCapability and partition smokeFixed bundle plus full SDK lifecycleOCI, security, recovery, and soak gates
Native LinuxHost feature inventoryFull A3S Box Sandbox suite without KVMOCI and adversarial gates on x86_64/aarch64
Linux libkrun/KVMKVM capability evidenceSame guest lifecycle as WHPXDriver-specific isolation and soak gates
macOS libkrun/HVFHVF capability and signed VM-object evidenceSame guest lifecycle as WHPXDriver-specific isolation and soak gates

Promotion is monotonic and evidence-based. Host hypervisor availability alone never enables workload launch.

Commit And Integration Policy

Each coherent, tested increment is committed and pushed to git@github.com:A3S-Lab/OCI-Runtime.git. The a3s monorepo gitlink is updated only after the runtime commit is remotely available and all focused checks pass. Unrelated dirty submodules are never staged.