Repository navigation
Description
Parent: #1086, in #1076. Needs: #1099, #1100, #1102, #1104, #1105, #1111, #1113, #1114, #1117. Unblocks: #1119, #1130. No PR of this group merges before the API-ready commit.
Goal. NVX's tests no longer need the test adapter. CI builds each feature set; compile-only examples in nvx-rs/examples/ cover the documented host and guest paths; checklist tests in nvx-rs/tests/ cover the documented security requirements; a case matrix gives each old test a fate; and smoke tests on real VMs prove cold boots and snapshots end to end, including the CLI's 12 cold cells (#624).
Notes.
- The guest example has no public space. Its space steps compile in nvx-init.
PRs, in order. Each PR has one goal, leaves dev green, and names in its description each old test of its area as kept, rewritten or retired, with each change that check_test_changes.py reports. Its tests follow the repository's test layout: a module's unit tests, and the code that only they use, sit in its tests.rs or tests/ and move with it. The estimates count core lines (code, not comments, docs or tests) and counted files; each PR records its measured values. Each PR does what its Scope says and no more: a case, input or layout that its Scope doesn't name, and whatever "Not in this PR" lists, is out of scope. Address every review comment within the scope, and ask before acting on one that asks for more. A PR whose measured core lines pass the stop that its Estimate names (twice the estimate, at most 600) stops and asks before continuing.
-
SL5.1a: Every feature set builds, the documented examples compile, and every old test has a fate.
- Objective: The replacement acceptance suite proves the final public surface without depending on the test adapter. It builds every feature set, compiles the documented examples and records a disposition for every existing adapter, CI and documentation test before any coverage is removed.
- Contents: CI builds each feature set (
host,guest,serde,cli,testingand no default features, of which SL0.4 addedcliandtesting); compile-only host and guest examples live innvx-rs/examples/; the security checklist tests live innvx-rs/tests/. The guest example omits the space, whose steps compile in nvx-init as a unit test of the private space. A short checklist test covers each security requirement that the docs offilesystem,vmandsnapshotstate: the path rules, the image checks (users keep image directories writable only by their own account), the stability of exported paths, and the launch's liveness, endpoint-owner, recovery and scratch claims. The case matrix, in the repository, lists each test of the adapter, of CI and of the docs as kept, rewritten or retired, by name. The matrix lists today's 156 adapter cases, the two thatdevadded among them, and the current microVM scenarios, from the current manifests and workflows. - Scope:
- CI builds
nvxwith each ofhost,guest,serde,cli,testingand no default features, denying warnings; SL0.4 addedcliandtesting, andserdealone is new here. - Compile-only host and guest examples live in
nvx-rs/examples/; the guest example omits the private space, whose steps compile in nvx-init as a unit test. - Security checklist tests in
nvx-rs/tests/cover documented filesystem path rules, image-directory ownership, stable exported paths, and launch liveness, endpoint-owner, recovery and scratch obligations. - A repository case matrix names all 156 adapter cases, including the two current additions, plus current CI, documentation and microVM cases, each marked kept, rewritten or retired.
- CI builds
- Not in this PR:
- A new test framework or runner: use Cargo checks and the repository's existing CI mechanisms.
- The guest space as public API: it is nvx-init's private reference implementation.
- Real-VM cold-boot or snapshot execution: SL5.1b and SL5.1c add those smoke tests.
- New coverage categories, budgets or exhaustive combinations beyond the named checklist and case matrix.
- Deleting adapter code or gates: SL5.2 does that after this group's replacement tests pass.
- Approach: Add the fixed CI command for
serdealone, the one named configuration that CI doesn't build yet, compile-only examples undernvx-rs/examples/, and focused checklist tests undernvx-rs/tests/. Reuse the documented examples rather than building a harness. Compile the guest space steps as an nvx-init unit test. Generate or maintain the matrix from the current manifests, workflows and adapter scenario list as a fixed inventory; do not create discovery infrastructure. - Done when:
- CI builds
nvxwith each ofhost,guest,serde,cli,testingand no default features, denying warnings. - The documented host and guest examples compile, with the guest space steps checked in nvx-init.
- Each named security obligation has its short checklist test in
nvx-rs/tests/. - Every adapter, CI, documentation and current microVM case has one named disposition in the matrix.
- CI builds
- Needs: SL4.3, in nvx-rs slimming 3.2.1: NVXC asks for a capture and activates a restore, and a blocking driver restores #1113; SL2.8b, in nvx-rs slimming 2.2.1: a VM is created in a private directory, with its restore-ready listener, then spawned #1099; SL2.11b, in nvx-rs slimming 2.2.2: a VM stops only with a proved exit, and can be reattached #1100; SL2.14, in nvx-rs slimming 2.3.2: snapshots have one strict format, and a capture finishes into it #1102; SL7.1b, in nvx-rs slimming 2.4.1: the guest's space becomes reference code, with runtime mounts, one switch and the view #1104; SL7.4b, in nvx-rs slimming 2.4.2: activation holds no fence, and a capture is one guest call #1105.
- Estimate: 50 core lines (CI), 2 counted files. Past 100 core lines, stop and ask before continuing.
-
SL5.1b: Cold boots work end to end on real VMs.
- Objective: The final cold-boot paths are exercised on actual hypervisors before the adapter is removed. The smoke lane proves the public create, spawn, reattach and stop lifecycle and the twelve supported CLI combinations.
- Contents: Smoke tests in the existing VM lane: create, spawn, reattach and stop. the CLI's 12 cold cells: EROFS and GPT, with a scratch or RAM upper, on KVM, MSHV and WHP (nvx-rs: final acceptance for the image-backed runtime #624). Today's real-VM cold scenarios (
managed-exec-config,sandbox-lifecycle,sandbox-proxy-onlyandsandbox-ram-upper) keep running, or get a fate. - Scope:
- Test-only changes in the existing real-VM lane and its current microVM harness.
- One lifecycle smoke path covering create, spawn, reattach from saved caller values, and stop.
- The twelve cold cells: EROFS and GPT, each with a scratch or RAM upper, on KVM, MSHV and WHP.
- The existing
managed-exec-config,sandbox-lifecycle,sandbox-proxy-onlyandsandbox-ram-upperscenarios, each retained or assigned a disposition in the case matrix.
- Not in this PR:
- A new VM harness, runner pool or test framework: extend the existing real-VM lane.
- Snapshot capture or restore coverage: SL5.1c owns those cases.
- Additional filesystem formats, upper types or hypervisors: the acceptance matrix has exactly twelve cells.
- Recreating retired adapter scenarios or broadening the smoke tests into exhaustive fault injection.
- Production API or CLI behavior changes: this PR is test-only.
- Approach: Express the twelve cells as the fixed product of the two named root formats, two named uppers and three existing backends, using the current VM lane and harness. Reuse the four public sandbox scenarios where they already prove a cell or lifecycle step; do not introduce a matrix abstraction beyond what the existing harness needs.
- Done when:
- The real-VM smoke test creates, spawns, reattaches to and stops a VM through the public API.
- All twelve EROFS/GPT, scratch/RAM-upper and KVM/MSHV/WHP cold cells pass.
- The four named current cold scenarios still run or have explicit dispositions in the case matrix.
- Needs: SL5.1a, above; SL3.4b, in nvx-rs slimming 3.1.6: a managed
sandbox run, and one exec at a time #1111. - Estimate: 0 core lines (tests), 1 counted file.
-
SL5.1c: Snapshots work end to end on real VMs.
- Objective: Strict snapshots are exercised end to end on actual hypervisors before the old adapter disappears. The tests prove capture, validation and restore with nvx-init, serialized concurrent restores, preserved network behavior and useful failure attribution.
- Contents: Smoke tests: capture, open and restore, with nvx-init as the guest; concurrent restores of one snapshot under the CLI's lock. A failed restore reports its attribution. Today's
snapshot-core,snapshot-tiersanduntiered-network-policyscenarios are rewritten on strict snapshots, or retired only in their raw-snapshot parts; the restore's DNS, egress, forwards and publication stay covered. - Scope:
- Test-only changes in the existing real-VM lane and its current microVM harness.
- Capture,
Snapshot::openand restore of a strict snapshot, with nvx-init as the guest. - Concurrent restores of one snapshot while the CLI holds that snapshot's exclusive lock.
- A failed restore whose reported error identifies its attribution.
- Rewrite
snapshot-core,snapshot-tiersanduntiered-network-policyfor strict snapshots, retiring only raw-snapshot portions while retaining DNS, egress, forwards and listener publication coverage.
- Not in this PR:
- A new snapshot harness or test framework: use the existing real-VM lane.
- Raw OpenVMM snapshot support or compatibility tests: the final CLI refuses raw restores.
- New snapshot tiers or storage policies beyond the strict snapshot behavior already planned.
- A library-owned restore driver or lock: the CLI drives restores and owns the per-snapshot lock.
- Production snapshot fixes unrelated to making these named smoke cases pass.
- Approach: Adapt the three named microVM scenarios in place and use the CLI's existing snapshot command path and lock. Keep one focused failure that checks attribution, and preserve the scenarios' existing network assertions. Do not duplicate the snapshot implementation, build a parallel orchestrator or retain raw-snapshot branches merely for old coverage.
- Done when:
- A real VM is captured, opened as a strict snapshot and restored with nvx-init.
- Concurrent restore attempts for one snapshot are serialized by the CLI's lock.
- The selected failed restore reports its attribution.
- DNS, egress, forwards and listener publication remain covered after the three named scenarios are rewritten or partly retired.
- Needs: SL5.1b, above; SL7.7b, in nvx-rs slimming 3.3.3: nvx-init captures and restores, and boots the new launches' layered roots #1117; SL3.8a, in nvx-rs slimming 3.2.2: the CLI captures and restores named snapshots #1114.
- Estimate: 0 core lines (tests), 1 counted file.
Tests. This group is the tests: builds of host, guest, serde and no default features; the documented host and guest examples, with the guest space's steps compiled in nvx-init; checklist tests for the security requirements in the docs of filesystem, vm and snapshot; the case matrix; smoke tests that create, spawn, reattach and stop a VM; the CLI's cold cells; and smoke tests that capture, open and restore a snapshot with nvx-init, run concurrent restores under the CLI's lock, and check a failed restore's attribution.
Done when: every PR above has merged, with dev green; every feature set and documented example compiles; the case matrix gives every old test a fate; and the real-VM smoke tests pass.
Activity
esaurez commentedon Nov 10, 2026
Workstream source/progress checkpoint - 2026-11-10 UTC
Checked boxes below mean merged scope, not merely an implemented first iteration. Implementation branches are source checkpoints, not automatic qualification, Ready or merge approval. Some starting inputs are frozen/anonymous commits rather than standalone branches; their exact SHAs and known merged producer refs are recorded explicitly.
SL5.1a - First implementation committed; not merged.
esaurez/slim-4.1.1-sl5.1a-private-20261108; exact head547101c9e913069346ca08aa1983adfef07ea890.c2a199d83b7a0d0836723cd45c292470634cb57b.2ce9ed2ac40469aeed03a5c7fb46951287ecb601; unnamed producer input at43b66f0ff5361564caa6873e4c7ee4165e953130; unnamed producer input atbd8cf67d29f556b9b0551e517f1f2af963282e4b; unnamed producer input atddd62a60d043f8e7ce12065d0d07e0d1794c7fd4.SL5.1b - First implementation committed; not merged.
esaurez/private-sl51b-0325; exact heade30ce117c17e11a43676a5b87c233bb723e891db.esaurez/slim-4.1.1-sl5.1a-private-20261108; exact commit547101c9e913069346ca08aa1983adfef07ea890.0ffa01e7928684b09dd82de6c95c994d7af3d575.SL5.1c - no completed first-iteration handoff recorded. Inspect any preserved partial/prior work before implementing the issue's scope.
The original technical scope remains authoritative, supplemented only by any portable technical clarification in this issue. No machine-specific execution policy is part of this checkpoint.
ci: lint nvx with the serde feature alone
guest: compile the reference space's steps in nvx-init
nvx-rs: compile the documented host and guest workflows
nvx-rs: check the documented security requirements through the API
doc: give each adapter, CI and docs test a fate
ci: lint nvx with the serde feature alone
guest: compile the reference space's steps in nvx-init
nvx-rs: compile the documented host and guest workflows
nvx-rs: check the documented security requirements through the API
doc: give each adapter, CI and docs test a fate
ci: lint nvx with the serde feature alone
guest: compile the reference space's steps in nvx-init
92 remaining items
ci: stop building, running and gating on the runtime adapter
ci: lint nvx with the serde feature alone
guest: compile the reference space's steps in nvx-init
nvx-rs: compile the documented host and guest workflows
nvx-rs: check the documented security requirements through the API
doc: give each adapter, CI and docs test a fate
tests: run the CLI's cold cells of a GPT disk
tests: reattach to and stop a VM through the public API
doc: map the cold cells and the VM lifecycle in the case matrix
host: open the restore-ready socket with O_PATH on musl too
tests: rewrite snapshot-core and snapshot-tiers on named snapshots
doc: give the snapshot scenarios their fates in the case matrix
examples: ask the guest for its snapshot before a capture waits
examples: keep a VM whose spawn could not confirm its exit
ci: stop building, running and gating on the runtime adapter