This document defines the verification architecture for A3S-Lab/Runtime.
The target is not merely a green crate test suite. The target is evidence that
the provider-neutral contract, durable lifecycle coordinator, state store, real
providers, and consuming control paths preserve the same semantics through
retries, crashes, contention, scale, and provider loss.
All build and runtime execution described here must run on Linux CI runners or an A3S OS test runner. Developer laptops are not part of the execution matrix. Servers must obtain source through Git at an exact commit; source archives must not be copied from a workstation.
The plan covers five boundaries:
- The public contract in
src/contract/. ManagedRuntimeClient,FileRuntimeStateStore, provider registration, and the exported conformance suite.- Every concrete
RuntimeDriveragainst its real provider. - The A3S Cloud projection, node command journal, reconciliation, and observation path that consume this crate.
- Performance, fault recovery, security, resource cleanup, and production canary evidence.
The A3S OS product runtime APIs that happen to use the word "runtime" are not
automatically in scope. They enter this plan only when they construct or carry
the Rust a3s-runtime protocol.
Source inspection on 2026-07-17 established this baseline. It must be refreshed at the start of an implementation or release campaign.
| Area | Current evidence | Gap |
|---|---|---|
| Runtime repository CI | No repository workflow is present | A green commit has no independent build or test evidence |
| Core integration tests | tests/general_runtime.rs contains 16 lifecycle, conflict, recovery, state, registry, and conformance scenarios |
Most boundary combinations, crash points, cross-process races, and capacity limits are untested |
| Shared conformance | One happy-path Task and Service flow with replay checks | Optional features and negative/fault profiles are not covered |
| Real provider | A3S Cloud contains DockerRuntimeDriver |
No other concrete Runtime driver is implemented |
| Real Docker tests | Three tests cover common conformance, create-before-state-update recovery, and external provider loss | They return success without running unless A3S_CLOUD_TEST_DOCKER=1 |
| A3S Box | Documented as a future provider | No RuntimeDriver exists, so Box conformance cannot currently be claimed |
| Non-functional testing | No benchmark, fuzz, mutation, multi-process crash, or soak harness is present | No regression or durability evidence exists |
Existing tests are useful regression assets, but their presence is not proof that they passed for a given commit. Every report must bind results to an exact Runtime commit, provider commit, provider build, fixture digest, and host.
These invariants are the basis of every test oracle.
- Every wire record accepts only its declared schema and fields.
(unit_id, generation, canonical_spec_digest)is immutable.- A request ID identifies exactly one request kind and digest.
- Exact request replay returns the same logical result.
- Stale generations and conflicting content fail before provider mutation.
- A mutable artifact tag never replaces the declared digest.
- Capability rejection occurs before state reservation and provider dispatch.
- Provider observations, exec results, removals, evidence, and attestations cannot substitute caller-owned identity.
- Task convergence means
succeeded; Service convergence meansrunningand, when configured,healthy. - Terminal observations are immutable.
- Explicit removal creates a durable generation-aware tombstone.
- A missing previously observed provider resource becomes
unknown, notnot_foundor success. - An ambiguous acknowledgement retries the same provider identity and must not create a duplicate resource.
- After confirmed provider loss has been persisted as
unknown, a same- generation apply may adopt one replacement provider identity. Subsequent replay must return that replacement without another create. - A deadline at or before the current clock prevents reservation and dispatch.
- Provider operation timeouts remain bounded independently of the pre-dispatch request deadline check.
- A completed state write survives process restart and host reboot.
- A failed or interrupted write never destroys the last valid record.
- A pending receipt survives an ambiguous provider result.
- Concurrent operations preserve every accepted receipt and never create an untracked provider resource.
- Same-unit serialization and different-unit parallelism have explicit, measured behavior.
- State paths, files, locks, and temporary writes never follow a symbolic-link boundary and retain owner-only permissions.
- Corrupt, truncated, mismatched, or future-schema state fails closed before provider work.
- Every advertised capability has a real passing test.
- Every unadvertised optional feature is rejected before provider dispatch.
- Resource limits are verified by provider inspection and observable behavior, not only by request construction.
- A provider restart, agent restart, or external resource deletion converges to one durable outcome with zero duplicate resources.
- A successful suite leaves no provider resources, state roots, ports, mounts, processes, or test volumes outside its declared retention policy.
Tests must not encode accidental behavior. ADR 0002 resolves the lifecycle and operation decisions below, and ADR 0003 resolves the interactive streaming exec boundary. The table retains the motivating risks and required release oracles.
| Decision | Motivating risk | Required test oracle |
|---|---|---|
| Wire schema boundary | Top-level log, exec, and inspection types do not all carry schema identifiers although the README says all wire records do | Define which types cross a versioned boundary; require a schema on each top-level wire record or narrow the compatibility claim |
| Provider identity binding | Capabilities carry a string validated differently from ProviderId, and the managed client does not bind it to a selected factory |
Use one grammar and prove reported, registered, and observed provider identities cannot disagree |
| Generation handoff | Reserving a newer generation replaces the stored observation before the old provider resource is necessarily stopped or removed | Define caller, managed client, or driver ownership of the prior resource; prove no orphan on success, error, or crash |
| Cross-operation concurrency | State locking does not span an asynchronous provider call | Define ordering for apply/apply, apply/stop, apply/remove, stop/remove, and generation races |
| Recovery identity | Recovery from unknown can differ from ambiguous-ack reattachment |
Permit identity replacement only after durable unknown; all other identity changes fail |
| Operation postconditions | Apply rejects only accepted, while stop can accept any otherwise valid transition |
Define whether calls return only converged results or may return transitional observations, then test each allowed result |
| Task output fulfillment | A Task may request outputs, but capabilities do not express output collection and the current Docker driver returns none | Make output support mandatory or capability-gated; prove every requested output is collected, bounded, and digest-bound before convergence |
| Logs by state | Current-generation logs may be useful after Task completion or Service stop | Define allowed states, removal behavior, cursor retention, and provider-loss behavior |
| Exec by state | Generation matching alone does not prove a runnable unit | Require running, or explicitly delegate a narrower rule to providers |
| Bidirectional streaming exec | A disconnected stream can leave unbounded buffers, duplicate stdin, unacknowledged output, leaked sessions, or conflicting terminal owners | Runtime v0.2 exposes only bounded unary exec; a distinct versioned optional capability must prove backpressure, ordering, half-close, cancellation, deadline, reconnect, terminal ownership, and restart cleanup before publication |
| Stop after loss | A provider may be absent while durable state is unknown |
Define whether stop returns unknown, is idempotent success, or requires recovery |
| Receipt retention | Records reject more than 10,000 receipts but have no retention/compaction policy | Define bounded retention without breaking exact replay guarantees |
| Deadline semantics | Deadlines are checked only before dispatch | Define whether drivers receive remaining budget and how late results are persisted |
The suite is divided into layers so fast deterministic checks run frequently while destructive checks run only in isolated environments.
| Layer | Purpose | Environment | Trigger | Maximum target duration |
|---|---|---|---|---|
| L0 | Format, lint, docs, unit, golden protocol, property checks | Ephemeral Linux CI | Every pull request | 10 minutes |
| L1 | Managed lifecycle, file state, multi-process contention, deterministic fault driver | Ephemeral Linux CI | Every pull request | 20 minutes |
| L2 | Real provider capability and conformance profiles | Dedicated Linux provider runner | Merge and nightly | 30 minutes per provider |
| L3 | Crash, reboot, disk fault, scale, resource enforcement, and leak tests | Disposable A3S OS worker or VM | Nightly or weekly | 2 hours |
| L4 | Long soak and safe production canary | Dedicated soak worker; shared production only for non-destructive canary | Release candidate | 24 to 72 hours |
No layer may silently convert an unavailable prerequisite into a passing test.
A skipped provider job must be reported as SKIPPED, and a release gate that
requires that provider must fail.
The initial automation uses the crate's documented commands from the Runtime repository root:
cargo fmt --all --check
cargo test --all-targets
cargo clippy --all-targets -- -D warnings
RUSTDOCFLAGS="-D warnings" cargo doc --no-deps
The real Docker gate runs from the A3S Cloud repository root:
A3S_CLOUD_TEST_DOCKER=1 cargo test -p a3s-cloud-node-agent \
--test docker_conformance real_docker_passes_all_advertised_runtime_profiles \
-- --ignored --exact --nocapture --test-threads=1
The Docker test is explicitly ignored in ordinary workspace runs. Its dedicated job must select the ignored test by exact name and fail unless the Docker enable flag, isolated provider restart target, and provider socket are present. This prevents an unavailable provider from being counted as a passing certification.
The Runtime crate must declare a minimum supported Rust version before release; L0 tests that version and current stable on the production Linux architectures.
Each implemented case receives a stable ID in the test name and evidence
manifest. Boundary tests use minimum-1, minimum, maximum, and maximum+1
where the type permits those values.
| IDs | Required coverage |
|---|---|
CT-SCHEMA-* |
Correct, missing, old, future, malformed, and unknown-field behavior for every public record |
CT-ID-* |
Empty, 1 byte, maximum length, overlength, control characters, Unicode byte length, path-like characters, and provider ID grammar |
CT-DIGEST-* |
Digest algorithm, hexadecimal length, invalid bytes, deterministic output across processes and architectures, and one-field mutation sensitivity |
CT-JSON-* |
Golden JSON decode/encode, enum tags, field names, missing required fields, duplicate JSON keys, and map-order independence |
CT-URI-* |
Artifact URI schemes, authority/path boundaries, digest binding, credentials, query/fragment, and mutable tags in each provider adapter |
CT-PATH-* |
Absolute paths, repeated separators, dot segments, .., NUL, CR/LF, maximum length, and mount/secret/output collision policy |
Golden fixtures are versioned test data. Updating one requires an explicit schema review; snapshot acceptance is never automatic.
| IDs | Required coverage |
|---|---|
SPEC-PROCESS-* |
Entrypoint fallback, command/argument counts and sizes, working directory, environment names/values, and deterministic map order |
SPEC-MOUNT-* |
Artifact, volume, and tmpfs sources; read-only behavior; zero/overflow size; duplicate names and targets; cross-kind collisions |
SPEC-SECRET-* |
Opaque references, environment/file/registry-credential targets, file modes, duplicate names/targets, collision with process environment and mounts, and non-disclosure |
SPEC-NET-* |
None/outbound/service modes, TCP/UDP, zero port, duplicate name/socket, 64-port boundary, and service-only publication |
SPEC-HEALTH-* |
HTTP/TCP/command probes, named-port binding, status ranges, path validation, timing relationships, start period, and thresholds |
SPEC-RESOURCE-* |
CPU, memory, PIDs, optional ephemeral storage, Task timeout, zero values, numeric maxima, and provider conversion overflow |
SPEC-ISOLATION-* |
Process, container, sandbox, and confidential requirements; capability rejection; provider mapping and evidence |
SPEC-RESTART-* |
Never, always, and on-failure policies; retry boundaries; Task/Service restrictions; provider enforcement |
SPEC-CLASS-* |
Every Task/Service restriction for health, timeout, restart policy, and outputs |
SPEC-OUTPUT-* |
Names, absolute paths, media types, size limits, duplicates, and succeeded-Task-only observations |
SPEC-SEMANTICS-* |
Optional profile digest validation and evidence binding |
Ephemeral storage is conditional: a provider needs
ResourceControl::EphemeralStorage only when the specification requests a
quota. CPU, memory, and PIDs remain required for every unit.
Test every required family, duplicate entry, malformed provider identity, empty optional family, and complete missing-capability ordering. Generate a spec that independently requires each enum value and optional feature. Verify that the registry rejects duplicate providers, has no default, never falls back, and surfaces factory construction failures unchanged.
Capability claims are tested twice:
- Pure matching proves that the contract calculates requirements correctly.
- Real-provider probes prove that each advertised claim works.
Generate and verify the full state-transition matrix for Task and Service. Cover provider identity, build identity, monotonic observation time, start and finish ordering, terminal timestamps, health, outputs, usage, evidence, attestation, failure details, and convergence.
The matrix must include:
- every allowed transition;
- every forbidden transition;
- same-state refresh;
- all transitions to and from
unknownallowed by the final contract; - terminal equality replay and every attempted terminal mutation;
- provider identity substitution before and after confirmed loss;
- a Service attempting
succeededand a Task carrying health; - duplicate output artifacts and evidence bound to another specification.
| IDs | Required scenarios |
|---|---|
LC-APPLY-* |
First apply; pending replay; completed replay; same generation/new request; generation conflict; stale and next generation; rejected capability; expired deadline |
LC-INSPECT-* |
Never seen; active refresh; terminal cache; removed tombstone; provider absent to durable unknown; malformed provider response |
LC-STOP-* |
Running, already stopped, terminal Task, absent, removed, unknown, exact replay, request conflict, unsupported feature, and deadline |
LC-REMOVE-* |
Running, stopped, Task terminal, already absent with new request, exact replay, identity substitution, and provider error |
LC-LOG-* |
Current/stale/future/removed generation, stdout/stderr filter, limits, strict sequence, cursor resume, invalid cursor, rotation gap, large chunk, and capability rejection |
LC-EXEC-* |
Allowed/forbidden states, timeout, exit range, stdout/stderr bounds, truncation, identity substitution, generation checks, replay policy, and capability rejection |
Every mutation test records state immediately before reservation, after reservation, after provider completion, and after durable completion.
Run on a real Linux filesystem with hostile fixtures for the root, locks,
units, lock file, record file, and temporary-file boundary. Cover symbolic
links, hard links where relevant, non-regular files, permission changes,
different umasks, wrong ownership, read-only filesystem, ENOSPC, inode
exhaustion, truncated JSON, invalid UTF-8, unknown schema, key mismatch, and a
record exceeding the receipt limit.
After every successful write, assert directory mode 0700, file and lock mode
0600, valid JSON, matching storage key, and a directory sync. After every
injected failure, assert that either the prior record or the complete new record
is readable; a partially published record is never acceptable.
Use subprocess tests and named failpoints around:
- lock acquisition;
- initial reservation construction;
- temporary-file creation;
- partial and complete writes;
- file sync;
- permission tightening;
- atomic publish;
- directory sync;
- provider create/start/stop/remove;
- observation or removal completion.
For each point, kill the process, create a new client from the same state root, replay the same request, and compare provider inventory with durable state. Cancel the caller future at each asynchronous boundary as a separate case; dropping a future must not make a later state mutation or provider result unrecoverable.
Run each race in thread, task, and independent-process variants where the boundary permits it:
- 2, 32, and 128 identical apply requests;
- same specification with distinct request IDs;
- conflicting content with one request ID;
- generations N and N+1 concurrently;
- apply versus inspect, stop, and remove;
- stop versus remove;
- observation refresh versus remove;
- 1,000 different units concurrently;
- 10,001 sequential receipts for one unit.
Pass criteria are deterministic accepted/error classes, no lost completed receipt, no invalid record, no deadlock, and exactly the provider resources allowed by the generation-handoff decision.
Replace the single all-or-nothing conformance path with composable profiles. The shared Runtime repository owns the oracles; provider repositories own fixtures and destructive cleanup.
| Profile | Mandatory evidence |
|---|---|
| Base | Valid capabilities, Task success/failure/timeout, Service start/inspect/stop/remove, exact replay, generation conflict, tombstone |
| Recovery | Create-before-ack crash, client restart, provider restart, external deletion to unknown, one same-generation replacement, duplicate-resource detection |
| Networking | Every advertised network mode and protocol, loopback publication, outbound denial/allowance, port collision behavior |
| Mounts | Every advertised mount kind, read-only enforcement, persistence, isolation, cleanup |
| Health | Every advertised probe kind, threshold transitions, timeout, start period, unhealthy exit |
| Resources | Every advertised control verified by provider configuration and workload behavior |
| Logs | Stream filtering, total order, cursor resume, same-timestamp records, limit, rotation gap, retention, large records |
| Exec | Bounded unary state policy, timeout, exit code, output bounds, truncation, identity and generation binding |
| Security | Digest pinning, label/metadata tamper, namespace separation, secret handling, least privilege, hostile input |
| Evidence | Usage, evidence claims, profile binding, attestation validity for each advertised optional feature |
The harness must always run the Base and Recovery profiles. It discovers optional profiles from capabilities and fails if an advertised capability has no fixture or passing probe.
This table describes source claims, not release certification.
| Capability | Docker driver in A3S Cloud | A3S Box driver |
|---|---|---|
| Task and Service | Advertised | Not implemented |
| OCI/Docker manifest | Advertised with digest-pinned URI | Not implemented at this boundary |
| Isolation | container |
Intended sandbox; no adapter evidence |
| Network | none, outbound, service | Not implemented at this boundary |
| Mounts | named volume, tmpfs | Not implemented at this boundary |
| Health | HTTP, TCP, command | Not implemented at this boundary |
| Resources | CPU, memory, PIDs, Task timeout | Not implemented at this boundary |
| Features | durable identity, stop, remove, logs | Not implemented at this boundary |
| Not advertised | exec, usage, attestation, secrets, artifact mounts, ephemeral quota | No claims are testable yet |
An A3S Box row may become a release gate only after a real RuntimeDriver
exists and maps IsolationLevel::Sandbox without provider-specific fields in
the public contract.
- Pull and reuse a digest-pinned image; reject tag-only, digest mismatch, credentials in the URI, malformed registry responses, and interrupted pull.
- Validate all managed labels and reject label tampering, wrong node, namespace collision, and multiple matching containers.
- Prove Task exit 0, nonzero exit, signal exit, timeout, and daemon error.
- Prove HTTP, TCP, and command health success and failure thresholds.
- Verify CPU, memory/swap, PIDs, network mode, loopback port binding, restart policy, volume mode, and hardened tmpfs through Docker inspect and behavior.
- Exercise stdout/stderr ordering, nanosecond timestamp ties, cursor replay, log rotation gap, filters, and one-MiB record rejection.
- Restart the node agent and Docker daemon at each recovery window.
- Count labeled containers and test volumes before and after every case; both deltas must be zero after cleanup.
The Docker job must set A3S_CLOUD_TEST_DOCKER=1 explicitly and verify the
daemon before the test binary starts. A missing socket is a failed provider job,
not a passed test with early returns.
The first real consumer is A3S Cloud. Its release suite must prove:
- an immutable
WorkloadRevisionprojects to the expected Service spec and digest; - scheduler capability matching rejects an ineligible node before dispatch;
- the node command journal deduplicates exact commands and rejects conflicts;
- command lease expiry, redelivery, observation loss, and reordering converge;
- control-plane and node-agent restart preserve one provider resource;
- generation updates and rollback follow the generation-handoff decision;
- runtime observations remain bound to the selected node and deployment;
- ordered log cursors survive transport batching and reconnect;
- stop, cancel, deferred cleanup, and reconciliation leave no untracked unit.
Bench or another caller must add a separate profile-projection suite before it can claim Runtime compatibility. Product-specific scoring, privacy, and scheduling remain outside the Runtime crate, but their projection digest and generic resource/isolation requirements are in scope.
| Fault | Expected result |
|---|---|
| Transport error before provider mutation | Pending receipt; exact retry dispatches safely |
| Provider create succeeds, acknowledgement is lost | Retry reattaches the same resource; count remains one |
| Provider resource is externally deleted | Inspect persists unknown; one reapply creates one replacement |
| Agent is killed at every state/provider boundary | Restart and replay converge without invalid state or orphan |
| Provider daemon restarts | Operations remain bounded and later reconcile without duplicates |
| Host reboots after file or provider sync | Durable state and provider inventory converge |
| Disk becomes full or read-only | Prior record remains valid; no provider work after failed reservation |
| State file is truncated or tampered | Fail closed; no provider mutation |
| Clock jumps backward/forward | Request deadline and observation monotonicity remain deterministic |
| Duplicate provider resources are injected | Inspect/apply fails closed and reports the invariant violation |
| Network is partitioned or latency exceeds timeout | Bounded error, durable pending state where acknowledgement is ambiguous |
| Caller future is cancelled or provider task panics | Durable state remains replayable and later work cannot publish an untracked result |
Daemon restart, host reboot, disk faults, and broad network faults must never be run on a shared production node. They require a disposable worker or nested VM in the A3S OS environment.
- Fuzz every public JSON decoder, validation function, digest function, state record decoder, log cursor decoder, and provider artifact URI adapter.
- Add property tests for validation boundaries and transition invariants.
- Run contract-only tests under Miri where supported and use a concurrency model checker for any in-memory coordinator introduced later.
- Verify state path confinement against symlink replacement and time-of-check/ time-of-use attempts from another process.
- Verify provider namespaces cannot discover, stop, remove, log, or exec units owned by another namespace or node.
- Verify error, audit, evidence, and log artifacts never contain secret values or registry credentials.
- Verify OCI digest pinning after pull and before create.
- Run dependency license, advisory, and supply-chain policy checks as a release input; they supplement rather than replace behavioral tests.
Fuzz regressions are checked in as minimal fixtures. Release candidates require a bounded continuous fuzz run for every target and zero unresolved crashes, panics, hangs, or uncontrolled allocations.
Measure minimum, typical, and maximum-size records for:
- specification validation and digest calculation;
- capability matching;
- observation and transition validation;
- state reserve, load, update, removal, and exact replay;
- records containing 1, 100, 1,000, and 10,000 receipts;
- same-unit contention and different-unit throughput at 1, 8, 32, and 128 clients.
Measure cold-image and warm-image Task apply, Service apply-to-healthy, inspect, stop, remove, log pagination, provider restart recovery, and external loss recovery. Record p50, p95, p99, throughput, CPU, RSS, file descriptors, disk bytes, network bytes, and resource cleanup latency.
- Correctness counters allow zero lost receipts, duplicate resources, corrupt records, unexplained log gaps, or leaked resources.
- A pull request fails when a controlled benchmark shows a statistically significant regression greater than 10% in median or 15% in p95 against the same runner class.
- Absolute latency SLOs are frozen only after three clean baselines on the production-equivalent runner; they must not be guessed from laptop results.
- A 10,000-cycle churn test must finish with zero provider resources, mounts, ports, state roots outside retention, and a non-growing file descriptor count.
- A 24-hour merge soak and 72-hour release soak must show no monotonic RSS, state-temporary-file, or provider-resource growth after workload count returns to baseline.
The runner checks out exact commits without uploading source:
git fetch --prune origin
git worktree add --detach /var/tmp/a3s-runtime-tests/<run-id> <runtime-sha>
Provider and consumer repositories use their own exact SHAs. The evidence manifest records all of them. A dirty worktree is rejected.
Every run has:
- a globally unique run ID and provider namespace;
- a dedicated state root and evidence directory;
- pinned fixture image digests;
- loopback-only dynamic service ports;
- CPU, memory, PIDs, disk, duration, and concurrency limits;
- a process-level cleanup trap and an independent TTL sweeper;
- pre-run and post-run inventories keyed by managed labels.
Shared production nodes run only L4 canaries: one bounded Task, one loopback Service, inspect, logs when supported, stop, and remove. They never restart a daemon, reboot the host, corrupt state, fill disk, alter firewall policy, use production secrets, or mount production data.
L3 and destructive L4 work runs on a disposable A3S OS worker that matches the production kernel, architecture, provider version, filesystem, and security policy.
Preflight records host identity, kernel, architecture, cgroup mode, filesystem, provider build, available CPU/memory/disk/inodes, existing managed resources, and active deployments. The run does not start without the configured safety headroom.
Abort immediately on namespace collision, unexpected non-test resource selection, failed cleanup, host free-space/inode threshold, sustained host load threshold, production service error-budget burn, or a provider invariant violation. Cleanup and evidence capture still run after an abort.
Each run produces one immutable bundle:
evidence/<run-id>/
├── manifest.json
├── environment.json
├── preflight.json
├── junit.xml
├── coverage/
├── benchmarks/
├── faults/
├── provider-inventory-before.json
├── provider-inventory-after.json
├── logs/
└── cleanup.json
manifest.json contains run ID, timestamps, trigger, Runtime/provider/consumer
SHAs, fixture digests, selected layers and case IDs, configuration digest, and
final status. cleanup.json lists every created resource and proves removal or
an explicitly retained diagnostic artifact. Evidence is redacted before
upload, checksummed, retained by release policy, and linked from the commit or
release check.
- Resolve the contract decisions in Section 5.
- Add Linux CI for format, lint, docs, unit, integration, and compatibility fixtures.
- Declare and test the minimum supported Rust version and current stable.
- Add shared fixture builders, stable case IDs, golden JSON, property tests, and transition-matrix generation.
- Add a deterministic driver with call tracing and failures before and after every provider boundary.
- Make skipped mandatory prerequisites fail their owning job.
Exit: L0 and L1 are required checks, all protocol/lifecycle rows have an identified test, and no unresolved P0 semantic decision remains.
- Add multi-process state contention, failpoint, process-kill, permission,
corrupt-state,
ENOSPC, and restart tests. - Implement and verify the chosen generation and concurrent-operation model.
- Define and test receipt retention/compaction.
Exit: every crash point preserves a valid durable state and produces no untracked provider mutation in the deterministic provider model.
- Expand conformance into the profiles in Section 9.
- Run the mandatory Docker job on a dedicated Linux runner with the gate explicitly enabled.
- Add Docker fault, resource, log, namespace, and leak cases.
- Run A3S Cloud consumer restart and reconciliation flows.
Exit: every advertised Docker capability has passing real-provider evidence; Base and Recovery pass; pre/post resource deltas are zero.
- Add stable benchmark runners, fuzz targets, security cases, 10,000-cycle churn, and 24/72-hour soak automation.
- Establish three clean baselines and freeze provider-specific SLOs.
Exit: all correctness, regression, leak, and soak gates in Section 14 pass.
- For each new driver, supply fixtures for every advertised conformance profile.
- Add A3S Box only after its
RuntimeDriverexists and verify thesandboxisolation mapping on production-equivalent Linux. - Run the bounded L4 canary and verify cleanup.
Exit: the provider matrix is evidence-backed for the release SHAs, and the production canary bundle proves zero leaked resources and no safety stop.
A Runtime release is blocked unless:
- L0 and L1 pass for the exact release commit.
- Golden compatibility changes have explicit schema approval.
- The transition, request replay, generation, deadline, and state durability matrices have no missing P0 row.
- Base and Recovery pass for every provider declared production-supported.
- Every advertised optional capability has passing profile evidence.
- Required consumer end-to-end flows pass at pinned consumer commits.
- Performance regression, resource leak, fuzz, and soak gates pass at the release level required by the change risk.
- Provider inventory after the final run matches the pre-run baseline.
- The evidence bundle is complete, redacted, checksummed, and reviewable.
Passing a mock-only suite, an environment-gated test that did not execute, or a narrow provider smoke test is not sufficient evidence for a release claim.