Repository navigation
nvx-rs: delete the bundled feature and its build script (SL6.6a) - #1524
Merged
Pedro Henrique Penna (ppenna) merged 2 commits intoNov 12, 2026
Merged
Pedro Henrique Penna (ppenna) merged 2 commits into
Pedro Henrique Penna (ppenna) merged 2 commits into
Conversation
Contributor
This pull request changes existing testsIt modifies or removes 58 existing test asset(s), listed below. Review each with care: a change to a test can hide a regression that the test caught. See doc/contribute.md#changes-to-existing-tests. Test code
CI test wiring
Relocated unchanged: 0; added: 0. Compared the merge base |
Contributor
There was a problem hiding this comment.
🟢 Approval recommended
No active review issues block approval of the build-time artifact bundling removal.
No open issues 🎉
What changed in this PR
Removes build-time artifact bundling from nvx as SL6.6a of the library-slimming workstream (#1122). Artifact discovery retains its explicit paths, environment-selected directory, and release directory beside the executable.
Changes:
- Deletes the
bundledfeature, build script, release pin, andArtifacts::bundledAPI. - Simplifies crate packaging and removes bundling-specific CI checks and source-inventory entries.
- Updates tests, public API snapshots, and documentation to match the removal.
| File | Description |
|---|---|
scripts/test_public_api.py |
Removes bundled from the feature-selection fixture. |
scripts/test_nvx_tools.py |
Removes bundling coverage and deleted-file fixtures. |
scripts/test_guest_binaries.py |
Updates source-identity and dependency fixtures. |
scripts/test_crate_release.py |
Expects one package build without bundle settings. |
scripts/public_api.py |
Removes the obsolete feature exclusion. |
scripts/nvx_tools/nvx_rs.py |
Removes the build script from executable inputs. |
scripts/nvx_tools/crate_release.py |
Builds the package once without bundling logic. |
scripts/nvx_tools/build_constants.py |
Removes the build script from guest inputs. |
nvx-rs/src/lib.rs |
Removes bundling feature documentation. |
nvx-rs/src/host/cli/download.rs |
Removes the documentation comparison with bundling. |
nvx-rs/src/host/artifacts/tests.rs |
Retires bundle tests and updates discovery checks. |
nvx-rs/src/host/artifacts/mod.rs |
Removes the bundled API and discovery fallback. |
nvx-rs/src/contract.rs |
Removes the obsolete build-script documentation constraint. |
nvx-rs/README.md |
Removes bundling instructions and updates build documentation. |
nvx-rs/public-api/windows.txt |
Removes both Windows listings of Artifacts::bundled. |
nvx-rs/public-api/linux.txt |
Removes both Linux listings of Artifacts::bundled. |
nvx-rs/Cargo.toml |
Removes the feature, links, and build dependencies. |
nvx-rs/build.rs |
Deletes build-time release staging. |
nvx-rs/artifacts.json |
Deletes the bundled release pin. |
doc/usage.md |
Updates provenance and guest-source input descriptions. |
doc/project-structure.md |
Removes deleted files and staging descriptions. |
doc/distribution.md |
Removes bundled-release publication requirements. |
doc/contribute.md |
Removes the bundling check from validation guidance. |
doc/ci.md |
Updates packaging, input, and feature-check documentation. |
doc/acceptance-case-matrix.md |
Records bundling retirement and revised CI counts. |
.github/workflows/nvx-rs-mutants.yml |
Removes the bundle-skip environment setting. |
.github/actions/check-nvx-rs/action.yml |
Removes the bundling check and bundle-skip settings. |
Review effort: Balanced
Pedro Henrique Penna (ppenna)
force-pushed
the
agents/slim-sl6-1-sandbox-store
branch
from
November 12, 2026 07:58
5bffcd7 to
ba716d4
Compare
Base automatically changed from
agents/slim-sl6-1-sandbox-store
to
feature/nvx-refactor
November 12, 2026 08:12
Pedro Henrique Penna (ppenna)
force-pushed
the
agents/slim-sl6-6a-bundled
branch
from
November 12, 2026 08:15
683f85a to
30203cf
Compare
The bundled feature staged a pinned NVX release at build time: its build script downloaded the package that artifacts.json pinned, or copied the release that NVX_BUNDLE_DIR named, for the Linux package that NVX_BUNDLE_HYPERVISOR chose, unless NVX_BUNDLE=skip. It exported the staged directory to the library as NVX_BUNDLED_ARTIFACTS_DIR, and to the build scripts of dependents as DEP_NVX_ARTIFACTS_DIR, through links = "nvx". Nothing in NVX uses it, and #1076 releases the crate without it, so the feature, the build script, links = "nvx", artifacts.json and the four variables go. Artifacts::bundled, which returned the staged release, goes with the feature, and Artifacts::discover loses its fourth source, the staged directory: a discovery that finds no source suggests the variables and a release beside the executable, but no longer the feature. The public API snapshots lose Artifacts::bundled on each platform. NVX_OPENVMM, NVX_KERNEL, NVX_INITRD, NVX_ARTIFACTS_DIR, the release beside the executable, NVX_AUTO_DOWNLOAD and NVX_RS keep their meaning, and contract::manifest_mismatches, which the build script also called, stays for discovery and downloads, with the time ABI's and the restore packet's fields. contract.rs no longer has to build alone, since no build script includes it any more. The tooling stops building, checking or listing the feature and its files: check-nvx-rs drops its bundling step and NVX_BUNDLE=skip, and so does the mutants workflow; the crate release no longer requires the build script or artifacts.json in the package, and builds the package once, with every feature, rather than once for each Linux package that it bundled; and the inventories of the guest binaries' sources and of the nvx-rs that nvx.py builds, which fail on a listed file that is missing, no longer list nvx-rs/build.rs. The README, the docs and the case matrix follow, where CI's bundling step retires. The bundle's tests retire: the_bundle_is_a_compatible_release, the crate release's test_windows_builds_its_one_bundle, and test_nvx_rs_bundles_a_release_in_the_current_layout, which checked the bundling step. the_bundle_is_the_last_resort becomes discovery_fails_when_no_source_is_present, which keeps its check of the error and checks that the error no longer suggests the feature. The other discovery tests stop passing a bundle source, the release test expects one build, and the guest-binary and provenance fixtures no longer hold build.rs or artifacts.json; one case of an input that the guest identity omits names nvx-rs/README.md in place of the deleted artifacts.json. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
public_api.py documented the crate with every feature but bundled, whose build script downloaded a release, and default, which only names others. With bundled deleted, only default remains to leave out, so the listing names no feature that no longer exists, and its docs and doc/ci.md say that it documents every feature. The arguments that it passes Cargo, and so the snapshots, stay the same. test_lists_feature_gated_items_as_any_other drops bundled from the features that it gives feature_arguments, which still enables each of the others by name, without default. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Pedro Henrique Penna (ppenna)
marked this pull request as ready for review
November 12, 2026 11:03
Pedro Henrique Penna (ppenna)
force-pushed
the
agents/slim-sl6-6a-bundled
branch
from
November 12, 2026 11:03
30203cf to
58681a9
Compare
Pedro Henrique Penna (ppenna)
marked this pull request as draft
November 12, 2026 11:05
Pedro Henrique Penna (ppenna)
marked this pull request as ready for review
November 12, 2026 11:05
Pedro Henrique Penna (ppenna)
merged commit Nov 12, 2026
671a192
into
feature/nvx-refactor
90 checks passed
This was referenced Nov 12, 2026
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Leaving code only. This PR changes only code that this effort removes from NVX: the
bundledfeature, with its build script (nvx-rs/build.rs),links = "nvx",nvx-rs/artifacts.json, the bundle variables (NVX_BUNDLE_DIR,NVX_BUNDLE_HYPERVISOR,NVX_BUNDLE=skipandDEP_NVX_ARTIFACTS_DIR) andArtifacts::bundled, with the edits that remove references to them. Nothing that stays changes, and no later PR uses what it changes, so the size limits for kept code don't apply.Part of #1122 (SL6.6a, "The
bundledfeature is gone"). Parent #1087, umbrella #1076.It doesn't depend on SL6.3's deletions, the old configs and launch code: nothing there uses the feature, its build script, its variables or
Artifacts::bundled. #1122 lists SL6.3 first, so this PR merges after it.What and why
The
bundledfeature staged a pinned NVX release at build time. Its build script downloaded the package thatartifacts.jsonpinned, or copied the release thatNVX_BUNDLE_DIRnamed, for the Linux package thatNVX_BUNDLE_HYPERVISORchose, unlessNVX_BUNDLE=skip. It verified the release against itsSHA256SUMSandcontract::manifest_mismatches, and exported the staged directory to the library and, throughlinks = "nvx", to the build scripts of dependents asDEP_NVX_ARTIFACTS_DIR. Nothing in NVX uses it, and #1076 releases the crate without it. This PR does SL6.6a's Scope:nvx-rs/build.rs,nvx-rs/artifacts.json, thebundledfeature,links = "nvx", and the[build-dependencies]that only the build script used.Cargo.lockdoesn't change, sincehoststill enablessha2andserde_jsonfor the library.Artifacts::bundledgoes, the public method that returned the staged release (alwaysNonewithout the feature), with the privateBUNDLED_DIR(NVX_BUNDLED_ARTIFACTS_DIR) and the bundle parameter of the privatediscover_with.Artifacts::discoverloses its fourth source, the staged directory. Its three other sources, in the same order, stay, and so do their variables and error codes. Its error no longer suggests building the crate with the feature. The public API snapshots lose two lines on each platform,nvx::Artifacts::bundledandnvx::host::artifacts::Artifacts::bundled. Nothing is added. No other crate-private code became unused: the warning-denied builds of each feature set pass.NVX_OPENVMM,NVX_KERNEL,NVX_INITRD,NVX_ARTIFACTS_DIR, thenvx/release beside the executable,NVX_AUTO_DOWNLOADandNVX_RSkeep their meaning.contract::manifest_mismatches, with the time ABI's and the restore packet's fields, stays for discovery (check_manifest) and the CLI's downloads.contract.rsonly loses the sentence that it had to build alone because the build script included it.BOOT_CONTRACT_VERSIONandCONTROL_CONTRACT_REVISIONdon't change.bundledand its files:check-nvx-rsdrops itsCheck artifact bundlingstep, and theNVX_BUNDLE: skipof its Lint, Test, documentation, MSRV and macOS steps, whose--all-featuresbuilds now run no build script. The mutants workflow drops itsNVX_BUNDLE: skiptoo.crate_release.pyno longer requiresbuild.rsorartifacts.jsonin the package, and no longer strips the bundle variables from the build's environment. It builds the package once, with every feature, rather than once for each Linux package that it bundled:bundle_hypervisorsgoes, with theplatformparameters ofbuild_packageandpackage_releasethat only it read.GuestRustBuildConstants.SOURCE_FILESinbuild_constants.py) and the inventory of thenvx-rsthatnvx.pybuilds (nvx_rs.source_files()) no longer listnvx-rs/build.rs. Both fail on a listed file that is missing.nvx.pystill records and checks the provenance of thenvx-rsthat it builds (Validation).host::artifactsand the CLI's downloads;Cargo.toml's comments;nvx-rs/README.md(the layout,host::artifacts,download, the features table, the guest binaries' inputs, the test commands andcheck-nvx-rs's summary, and theBundled artifactssection, which goes);doc/ci.md(the guest images' inputs, the crate release's checks andcheck-nvx-rs);doc/usage.md(the inputs ofnvx-rs's provenance and of the guest binaries' identity);doc/distribution.md(the published crate's bundle, and the manual publish snippet'scargo check --features bundled);doc/project-structure.md; anddoc/contribute.md.Check artifact bundlingstep retires, so the CI section counts 69 tests: 42 kept, 3 rewritten and 24 retired. The notes ofcrate-packageandcrate-releasesay that the package holds no build script orartifacts.json, and thatcrate-packagebuilds it once.One reference removal beyond the Scope's list, in its own commit (
30203cfd) so that it can be dropped:scripts/public_api.py, whichcheck-nvx-rsruns, documented the crate "with every feature butbundled" and keptbundledinEXCLUDED_FEATURES. With the feature gone it leaves out onlydefault, and its docs anddoc/ci.mdsay that it documents every feature. The arguments that it passes Cargo, and so the snapshots, don't change. Its test's fixture dropsbundled.Deliberately kept:
contract::tests::release_manifests_must_match_every_bundled_contract, a test of the retained manifest check, where "bundled" means the contracts that a release bundles.nvx-rs/build.rsas the path-sorting example ofubuntu.py's comment and oftest_ubuntu_input_digest_orders_paths_alike_on_every_os, which name a file in a temporary directory, not an inventory.check_test_changes.py's generic rule for any crate'sbuild.rs, and the generic descriptions of Cargo's dep-info ("each path that the build script watches") inguest_binaries.py,test_guest_binaries.pyanddoc/usage.md, whose check stays.Size
Measured as #1076 defines them:
host/artifacts/mod.rs(the call ofdiscover_withand the error's last line), 15 incrate_release.py(its onecargo build, re-indented out of the loop over the bundles, with its message, and the call that no longer passesplatform), and 1 inpublic_api.py(EXCLUDED_FEATURES). The rest are deletions, comments and docs.nvx-rs/Cargo.toml,src/lib.rs,src/contract.rs,src/host/artifacts/mod.rs,src/host/cli/download.rs,.github/actions/check-nvx-rs/action.yml,.github/workflows/nvx-rs-mutants.yml,scripts/nvx_tools/crate_release.py,build_constants.pyandnvx_rs.py, andscripts/public_api.py.nvx-rs/build.rsis only deleted, and doesn't count.Old tests of the area
host::artifacts::tests::the_bundle_is_a_compatible_release(built only withbundled): the staged release.scripts/test_crate_release.py::ReleaseTests.test_windows_builds_its_one_bundle: the per-platform bundles of the package's build.scripts/test_nvx_tools.py::CiConfigurationTests.test_nvx_rs_bundles_a_release_in_the_current_layout: theCheck artifact bundlingstep, which goes.check-nvx-rsstepCheck artifact bundling, the synthetic-release test of the feature (the case matrix's row).host::artifacts::tests::the_bundle_is_the_last_resortbecomesdiscovery_fails_when_no_source_is_present. It keeps its check that a discovery without any source fails withUnavailableand namesNVX_ARTIFACTS_DIR. Its check that the bundle comes last retires with the bundle. It checks instead that the error no longer suggests the feature, which fails before this PR.host::artifactsandcontract, the image-staging tests and the CLI's download tests. Those that the report lists below change only to stop naming what left.Test changes
python scripts/check_test_changes.py --base origin/feature/nvx-refactorlists 58 changes to existing tests, hencetests-modified:nvx-rs/src/host/artifacts/tests.rs:no_bundle, the empty bundle source that the discovery tests passed;the_directory_variable_accepts_a_repository_checkout,explicit_variables_win_and_must_be_completeandthe_directory_variable_precedes_the_executable_directory, which no longer pass that source todiscover_with, which no longer takes one; rustfmt joins one call that now fits a line;the_bundle_is_the_last_resort, renamed todiscovery_fails_when_no_source_is_present(rewritten, above);the_bundle_is_a_compatible_release(retired, above).scripts/test_crate_release.py:CRATE_FILES, whose fixture crate no longer holdsbuild.rsandartifacts.json, as the package no longer must;ReleaseTests.setUp, which no longer puts the bundle variables in the job's environment, andReleaseTests.package, which no longer takes aplatform;ReleaseTests.test_the_first_version_is_the_declared_one, which expects onecargo build --locked --all-featuresof the packed sources in place of one per KVM and MSHV bundle, without its checks of the bundle variables;ReleaseTests.test_windows_builds_its_one_bundle(retired, above).scripts/test_guest_binaries.py:_fake_guest_build, whose default dep-info no longer listsnvx-rs/build.rs, which the identity no longer covers;GuestBinaryBuildTests.test_source_identity_covers_the_guest_build_inputs_onlyandtest_source_identity_changes_only_with_the_guest_build_inputs, which no longer expectnvx-rs/build.rsin the identity or namenvx-rs/artifacts.jsonamong the files outside it;test_source_inventory_preserves_the_callers_root_spelling,test_source_identity_follows_a_content_preserving_module_moveandtest_build_uses_fresh_remapped_target_and_writes_manifest, whose fixture checkouts and dep-info no longer holdbuild.rs;test_build_refuses_inputs_that_the_source_identity_omits, whose "file in the checkout" case namesnvx-rs/README.mdin place of the deletednvx-rs/artifacts.json.scripts/test_nvx_tools.py:NvxRsTests.test_source_digest_covers_the_build_inputs_in_any_line_endings, which no longer expectsnvx-rs/build.rsin the inventory or writes it in its fixtures, and no longer checks that the deletedartifacts.jsonis outside the inventory;CiConfigurationTests.test_only_guest_binary_inputs_rebuild_the_guest_images, which no longer copies the deletednvx-rs/artifacts.jsonandnvx-rs/build.rsinto its fixture checkout;BuildTests.test_device_io_provenance_uses_shared_rust_source_digest, whose fixture checkout no longer holdsbuild.rs;CiConfigurationTests.test_nvx_rs_bundles_a_release_in_the_current_layout(retired, above).scripts/test_public_api.py: modifiedListingTests.test_lists_feature_gated_items_as_any_other, whose features no longer includebundled(commit30203cfd)..github/actions/check-nvx-rs/action.yml: 35 removed lines, theCheck artifact bundlingstep (retired, above), and theenv:andNVX_BUNDLE: skiplines of the Lint, Test, Build documentation, MSRV and macOS steps, which check the same as before.Validation
local_gates.py --files(fromdev) selects, for these files,test-changes,markdown-links,test-layout,quality-code, thecheck-nvx-rssteps andnvx-cli(validate-nvx) on both systems, andopenvmm-ci. I ran them from this branch's action definitions, which no longer have the bundling step or the runtime adapter's steps.quality-code's ShellCheck and shfmt, and.github/specula, cover no file that this PR changes.openvmm-cichecks the unchangedopenvmmpin, and is left to CI.The tables below ran on
683f85a9, before the restack ontofeature/nvx-refactoratbaf560d1(#1520, SL6.1). The restack had no conflicts and changed no line of these commits:git range-diffshows=for both. After the restack, at30203cfd:cargo fmt --all --check, everyclippyofcheck-nvx-rswith-D warnings,cargo test --locked --all-features(lib 1183 passed, 12 ignored, and every integration and doc test),cargo test --locked, the build and tests without default features,cargo docwith-D warnings,cargo package --locked(552 files) andpublic_api.py: passed. Thevalidate-nvxunittest list passed, 1822 tests with 73 skipped.nvx-kvm-test: thevalidate-nvxunittest list (1822 tests, 38 skipped),public_api.py,build-guest-binariesandtest-guest-binaries,cargo fmt, everyclippyofcheck-nvx-rs, the integration and doc tests with every feature, the default and no-default-feature tests, andcargo package --locked: passed. The lib's tests with every feature: 2005 passed, and the same 28guest::tests failed as before the restack, below.check_matrix.py <worktree> 99d2022085fpassed: the CI section's 69 rows match its counts.check_test_changes.py --base origin/feature/nvx-refactorlists the same 58 changes.At the merge turn, rebased onto
9b8f35e0(#1530, SL6.3), at58681a95. Two text conflicts came up: the case matrix's summary table, which keeps SL6.3's counts with this PR's CI row (69 tests: 42 kept, 3 rewritten, 24 retired, recounted), anddoc/project-structure.md's tree, which keeps SL6.3'stests/line.git range-diffshows no other change, and nothing on the new base uses what this PR deletes. Results:clippyofcheck-nvx-rsandcargo fmt, the tests with every, the default and no default features (lib 1051 passed, 15 ignored),cargo doc, MSRV 1.89,cargo package --locked(527 files),public_api.py, ruff, the test-layout and link checks, and thevalidate-nvxunittest list (1833 tests, 73 skipped): passed.nvx-kvm-test: thevalidate-nvxunittest list (1833 tests, 38 skipped),public_api.py, the guest binaries' build and test,cargo fmt, everyclippy, the integration and doc tests with every feature, the default and no-default-feature tests andcargo package --locked: passed. The lib with every feature: 1857 passed, and the same 28guest::tests as before failed, by name.check_matrix.py <worktree> 99d2022085fpassed, andcheck_test_changes.pylists the same 58 changes.Windows, this workstation (Rust 1.95.0):
cargo fmt --all --checkcargo clippy --lockedwith-D warnings:--all-targets --all-features,--lib,--lib --no-default-features, andserde,cliandtestingalonecargo test --locked --all-featurescargo test --locked,cargo build --locked --lib --no-default-features,cargo test --locked --lib --no-default-featuresRUSTDOCFLAGS=-D warnings cargo doc --locked --no-deps --all-featurescargo +1.89 check --locked --all-targets --all-features(MSRV)cargo check --locked --all-targets --all-features --target aarch64-apple-darwincargo package --lockedbuild.rsorartifacts.json, and the packed crate buildspython scripts/public_api.py --updateArtifacts::bundledlines leave each snapshotruff check scripts .github/specula,ruff format --check ...,pyright --pythonplatform Linux,--pythonplatform Windowspython -m compileall -q scripts, andvalidate-nvx'spython -m unittest scripts/test_*.py ...listpython scripts/check_test_layout.py,python scripts/check_markdown_links.pynvx-rsprovenance:cargo build --release --locked --features cli --manifest-path nvx-rs/Cargo.toml --target-dir nvx-rs/target,python scripts/nvx.py record-nvx-rs-provenance, thenrelease._validate_nvx_rs_provenancenvx_rs.source_files()lists nobuild.rscheck_matrix.py)host/storeandhost/templatefiles that SL6.1 and SL6.2 deleted, and Python tests that its base revision lacked. After the restack it passes, aboveLinux,
nvx-kvm-test(Azure Linux 3, kernel 6.6, KVM, virtual machine), in a worktree of this branch with its own target directory, every signal at its default disposition:python3 scripts/nvx.py verify,python3 -m compileall -q scripts,validate-nvx's unittest listpython3 scripts/public_api.pypython3 scripts/nvx.py build-guest-binaries,test-guest-binariesbuild.rspython3 scripts/nvx.py check-guest-binaries --toolchain 1.95.0guest::tests (1115 passed), the identical 26 at5bffcd7f, this PR's base before the restack, on this hostcargo fmt, and everyclippyofcheck-nvx-rswith-D warningscargo test --locked --all-featuresguest::tests failed, the identical 28 at5bffcd7fon this host (2005 passed there, with the retiredthe_bundle_is_a_compatible_release).--test '*' --no-fail-fastand--doc, which the lib's failure stops: passedcargo test --locked,build/test --lib --no-default-features,docwith-D warnings, MSRV 1.89, macOS checkThe failing
guest::tests (guest::entry,guest::exec,guest::init::tests::exec,guest::managed_agent::dispatchand its loopback tests) fail alike at the base on this host's kernel 6.6. This PR changes no guest code.Not run, left to CI: microVM scenarios on KVM, MSHV and WHP. The runtime doesn't change: the CLI never used
Artifacts::bundled, and discovery's other sources stay as they are. CI also covers the guest images, which rebuild because their identity's inventory andCargo.tomlchange, andcrate-packageandcrate-release, which run only ondev's full runs and whose logictest_crate_release.pyandcargo packagecover here.