Skip to content

cli: run cold blockless VMs through the verified lifecycle (SL3.4a2) - #1441

Merged
Pedro Henrique Penna (ppenna) merged 27 commits into
feature/nvx-refactorfrom
private/simple-1109-02e4-sl34a2-20261110
Nov 11, 2026
Merged

Pedro Henrique Penna (ppenna) merged 27 commits into
feature/nvx-refactorfrom
private/simple-1109-02e4-sl34a2-20261110

Conversation

@esaurez

@esaurez Enrique Saurez (esaurez) commented Nov 10, 2026 •

Copy link
Copy Markdown
Contributor

Rebased onto feature/nvx-refactor@5b3d5391 and ready for review. The merge conflict that blocked CI is resolved, and the two findings of Copilot review 5852501708 are fixed in 95dcce4d and 4beb1ce3, with their threads answered and resolved. The sections after the rebase section describe the source as of f346df02.

Rebase onto feature/nvx-refactor

#1434 merged, so the branch drops its six inherited #1434 commits (d0cf3f63..4fdf55db), replays its 24 own commits onto 5b3d53912db2e5582e64130678e2983e4e54e3c7, adds two commits for the review findings, and one for a test that CI's environment exposed. The head is 231b618f4839291f585edd45853c83e5127c3f39, tree 2c25cb04c65f7a03f58de68b997ea04d018dfbd5. git range-diff 4fdf55db03..f346df02d0 5b3d53912d..a08aa41158 reports 23 of the 24 own patches identical. The first, bbbb23821c (9f5d2c2a before), differs only by these resolutions:

  • nvx-rs/src/host/platform/{linux,windows}/mod.rs: the base added a cfg(feature = "cli") re-export of endpoint::endpoint_server_pid_until for [SL3.3b] Recover interrupted CLI launches under the sandbox lock #1446's recovery probe, where this commit adds endpoint::transport_from_handle. Both are kept, in one use that rustfmt places after the other endpoint imports.
  • nvx-rs/src/host/vm/tests.rs: the capture_config fixture, which host: prepare blockless capture launches #1454 added after this branch's original base, sets memory_capacity_mib: None, the Boot field that this commit adds, as this commit already does for cold_config. The fixture keeps its behavior, a capture VM without memory capacity beyond its boot memory. It is the one existing test item that check_test_changes.py --base origin/feature/nvx-refactor reports beyond the 60 that the dispositions below explain: 61 changed and 70 added.

The two new commits address review 5852501708:

  • 95dcce4d test: report terminal readiness only after interrupts are enabled: the private-console helper publishes readiness only once line input and echo are off and processed input is on again, so the mode between enable_raw_mode and TerminalGuard::enable_interrupts no longer counts as ready.
  • 4beb1ce3 cli: restore the console's entry input mode on Windows: crossterm's Windows disable_raw_mode sets line input, echo and processed input instead of restoring them. TerminalGuard now saves the console input mode before raw mode and restores exactly that mode when dropped, on the error path after enable_interrupts too. The helper enters each phase with echo and processed input off, so its check that the CLI restores the entry mode fails without the fix: the previous guard restored 503 instead of the entry mode 498.

The first CI run, at 4beb1ce3, failed only windows_console_output_handles_non_utf8_code_pages on windows-latest. Its private-console helper never recorded the Ctrl-C that it generates: a process created with CREATE_NEW_PROCESS_GROUP ignores Ctrl-C and passes that on to every process that it starts, as the runner's Windows step evidently does, and the same run of that test fails locally in a process that ignores Ctrl-C. 231b618f test: restore Ctrl-C processing in the private console helpers calls SetConsoleCtrlHandler(None, 0) in that helper, and in the terminal Ctrl-C helper before it starts the CLI, each alone in its private console. Both tests pass afterwards in such a process.
Rechecked on Windows at this tree, with the commands of check-nvx-rs where they apply: rustfmt; Clippy with -D warnings for --all-targets --all-features, --lib, --lib --no-default-features, --lib --bins --features cli and --lib --bins --no-default-features --features testing, and for --all-targets --all-features and --lib --bins --features cli on x86_64-unknown-linux-musl; cargo +1.89 check --all-targets --all-features; cargo test --locked --all-features; scripts/public_api.py; Ruff and Pyright, for Windows and Linux, of the three changed Python files; BuildConstantsTests, including the notices inventory, and test_microvm_tests; ShellCheck of guest/common/nvx-hostmount; the test layout; and Markdown links. terminal_ctrl_c_cancels_boot_and_handshake_and_restores_the_terminal passes for both phases, and the complete cargo test --locked --all-features passes, in a process that ignores Ctrl-C as the runner's Windows step does. CI runs the full matrix on this head.

Scope and prepared input

Corrects terminal cancellation, ready-log forwarding and cancellation of pending
managed attachment. It also repairs the original terminal dependency's stale
notice-test inventory without changing dependencies, notices or production API.

Refs #1109, SL3.4a2: cold blockless nvx-rs run uses the verified
host::vm::{create, spawn, stop} lifecycle and CLI-owned guest tokens in both
one-shot and managed modes. Restore and --restore-network-policy retain their
existing path.

Correction head f346df02d0bb7fec4b3f3461243a9cb312b3c1a0, tree 5d051191d3342b04a90af9161b60c790e7a0c97c.
The original published head was b6ba3e60d2be043d2dedb9afdecf94fd1ccae09c;
its immutable pre-preparation lease and source remain preserved. The authorized
own-only integration replayed exactly the original thirteen owned
cf5f91467c050f1e9508403964b1b4546e2724ab..b6ba3e60 commits onto the previously
selected public dependency 4fdf55db0384354980a1267f64b5701d500969b8, tree
2db5b7cfaa040d45ff217596b554037d13ccd641, followed by this bounded correction.
No obsolete aggregate, producer replay, feature merge, or child rewrite was used.
The native pin remains 14dc4116ec7e57567633c4b7b07892aca3a58522.

Dependency boundary: this source consumes only the selected previously published PR1434 head 4fdf55db above eba4c8b6; it makes no claim to adopt any later parent head. The existing PR base remains feature/nvx-refactor, with the unmerged owned-command dependency retained. No parent retarget, native Stack registration or additional integration is implied. Applicable current-feature integration and full CI remain separate gates, not a synthetic merged-tree software qualification.

Three current review findings

All three findings in review 5850121393 were source-confirmed before editing:

  • 4531056518:
    raw-terminal keyboard Ctrl-C remains an OS interrupt while the CLI owns raw
    terminal mode, including boot-console and managed-handshake waits. The saved
    entry mode, including every control character, is restored on return or error.
    Quit/suspend characters are disabled only in that temporary native
    configuration, so Ctrl-backslash and Ctrl-Z remain guest-console bytes rather
    than SIGQUIT/SIGTSTP. No global signal-disposition policy is added. Redirected
    stdin byte 0x03 remains ordinary stream data, not CLI cancellation.
  • 4531056578:
    ready log chunks no longer incur a mandatory 10 ms idle-console wait.
    Both native transports perform a real zero-time console poll, rather than
    clamping zero to a blocking minimum. Each pass still services both streams,
    retains bounded buffers and output backpressure, and sleeps only without
    progress.
  • 4531056628:
    a forwarding failure cancels connection and protocol-handshake work before the
    scoped join can delay verified VM stop. Cancellation targets only the already
    verified connection, including pending I/O, and preserves the original
    forwarding error. No detached attachment thread, global-Ctrl-C-only shortcut,
    unverified termination, or double reap is introduced. The cancellation
    duplicate is released after attachment so it cannot keep failed established
    session I/O open.

The necessary integration binding preserves the dependency's public
three-argument spawn_vm(command, capability, log) and detached default.
Only the existing private VM caller selects foreground mode through a shared
private helper. The strict trusted log-job refusal remains. The compiled
dependency example supplies memory_capacity_mib: None for the required field
that this PR already had; this correction adds no public field, API, schema,
CLI flag, mode, or framework.

Preserved prior corrections

The four preceding corrections remain intact: artifact acquisition precedes
checking installable mount sources (4529923503); managed attachment forwards and
drains boot diagnostics while control is pending or fails (4529923574); actual
Windows console stderr streams replacement UTF-8 with bounded incomplete carry,
while redirected streams remain byte-exact (4529923625); and private-directory
cleanup distinguishes confirmed child exit from typed StillRunning refusal
(4529923668).

The older native-report ordering correction 4526951438 and the subsequent
canonical-interruption/no-secondary-diagnostic regression are preserved.
Requested reports publish after confirmed native exit, before interruption or
foreground errors and cleanup. Process ownership, directory privacy, checked
exports, artifact hold/lifetime, runtime identity, truthful status/outcome
handling, and the legacy restore branch are retained.

Exact-source qualification

39 distinct scoped Linux and 37 Windows
software requirements are covered by passing receipts and explicit identical-input
qualification.
Final-root commands actually executed on this head are 34 Linux
and 11 Windows. The remaining receipts executed at 9d4eb73f, not at this SHA:
9d4..f346 changes only the existing Python inventory test, while the complete
Rust source/test subtree is byte-identical
3ca746bb08443f48e531a14b225807b7c1d1eb23, as are the adapter, actions,
toolchain, native pin and notices. No old execution is relabeled a new-SHA run.
Both final source checkouts and actual pinned native Git checkouts were clean.
All 104 retained raw output hashes were independently checked against receipts.

Affected run/session/VM units and the complete CLI target passed, alongside
source verification, formatting, all five action-defined warning-denied Clippy
configurations, the production-feature release CLI build, no-default library
build, warning-denied docs, Rust 1.89 MSRV, the compiled external-launch example,
test layout/inventories, and protocol/host runtime-adapter format, Clippy, build,
tests, docs and MSRV. Linux also passed the public API snapshots for both Linux
and Windows.

Actual PTY and private ConPTY keyboard input exercises Ctrl-C during boot-console
wait and protocol handshake: status 130, held native-process exit, private VM
directory removal and exact caller terminal restoration are asserted. Windows
admits the key only after checking that every console member is the helper or
one of its two verified children; its input mode changes 503 -> 497 -> 503.
The native can share that console: CLI-exclusive native-stop causality is not
proved or claimed.

An additional Linux PTY case sends actual 0x1c/0x1a, requires their exact echo
from the held fake's console and a still-running CLI, then sends 0x03 and
requires status 130, confirmed native exit, directory cleanup and complete
terminal restoration.

Synchronized regressions separately exercise forwarding failure during connection
and handshake, retaining the original I/O error and confirming held-process exit
and directory cleanup within the bounded stop test. A deterministic ready-log,
idle-console case proves zero-wait polling and console fairness, with native
zero-read controls and established-session EOF checks. Existing Windows CP437
stdout/stderr, split UTF-8, invalid/incomplete EOF, raw pipe/file, report-ordering,
and interruption diagnostic controls remain.

One earlier 9d4 parallel Linux CLI run hit the unchanged three-second
forwarding-failure helper bound; its cause remains unattributed and its failure
is retained
. The identical-input isolated two-phase case, one unchanged default
parallel 93-case replay with an owned-process observer, and the one final-head
default full target passed. Neither the bound, assertions nor test were changed;
passing replays are not claimed as a causal fix.

Independent logical code/tests review by Claude Opus 5.5 / MAX / long context returned CLEAR for f346df02 / tree 5d051191, with initial/final clean/native guards and independently captured actual model/profile/usage evidence. Its earlier HIGH quit/suspend finding is addressed. This is a static scoped verdict, not formal GitHub approval, a full-CI verdict, or an attribution of the retained timing failure.

Publication checkpoint at f346df02, before the rebase above: Draft, not merge-ready. Fresh GitHub Copilot feedback, full CI and any
remaining parent/current-feature integration are separate gates. Request
admission is not a review verdict, and skipped CI is not green CI. This source
publication does not perform a final Ready/maintainer handoff, automatic merge,
queue request or merge. A separately authorized, head-guarded normal CI
activation is recorded independently; it is not a repeated dispatch/pulse loop.

No guest, kernel, native or image was rebuilt, and no broad hardware matrix was
replayed solely for this foreground host change. Controlled fake VMM processes
are used where deterministic connection/handshake failure and verified process
teardown are necessary. Old b6ba/6bc software and real MSHV/WHP receipts remain
historical only. Intermediate missing-cache, public/private binding compile,
process-reference fixture and inherited-stdin ConPTY fixture failures are
preserved honestly, not relabeled passing qualification.

Coupled dependency-notice compliance

The original crossterm dependency had complete notices but a stale hardcoded
test inventory. Actual locked normal CLI graphs for release musl and MSVC,
including the existing executed-procedural-macro notice policy, classify all 58
unique lock names as 38 covered runtime/macro names and 20 unshipped names.
The inventory adds the ten missing covered names, also moves rustix and
linux-raw-sys out of the old test-only category, and classifies
redox_syscall and the two winapi-*-pc-windows-gnu packages as other-target only.
Every cached crate archive checksum matches the lock, and its actual manifest
and license files match the cached bytes. All 12 affected existing notice rows
already match the versions and license alternatives: no notice text, dependency
pin, generator or production logic changed.

The existing completeness/disjointness/version/location assertions and the
cpufeatures 0.3.1 exception are unchanged. The actual final-head inventory,
runtime-notice and repository-license tests, scoped Ruff check/format and Python
static compilation passed on both hosts.

Size, limits and explicit exceptions

This PR was already oversized before the batch. The preserved original
conservative account is 1,025 core lines across 16 production files; applying the
policy's exclusion of two pure test-declaration lines gives 1,023 strict core
lines
, with 78 deletions separately. run.rs alone had 739 strict core lines
(741 in the conservative record), independently of incoming producer code.

The user explicitly approved only this bounded three-fix correction and its
necessary API-preserving bindings, including the precise sixth/seventh affected
files. The original new-batch estimate remains 140, its hard stop 280 core
lines
, and the approved bound seven production files. This is not a
permanent campaign waiver or a reset of the old baseline.

New correction: 241 added/changed core lines, 22
deletions separately, seven production files. Whole owned PR over selected
public dependency 4fdf55db: 1252 core lines across 18 production
files
, 88 deletions separately. Incoming unchanged dependency
work is separately 269 added core lines / 19 deletions / six production files.
The figures are diff-based, not summed or netted: edits can overlap the earlier
owned additions. Tests, test doubles, pure test declarations, docs, generated
files and lockfiles are excluded; production attributes/braces and real
refactoring are counted, without packing or reclassification.

Existing-test dispositions

No existing test or assertion is retired. In this batch,
attachment_keeps_forwarding_until_the_handshake_completes and
failed_attachment_drains_output_that_arrived_with_its_failure accept the
private cancellation argument without dropping their forwarding/drain assertions.
session_with, check_waits_for_openvmm_that_exits,
operations_bound_their_requests_by_their_deadlines,
failed_transfer_closes_the_session,
request_to_a_stalled_endpoint_times_out_and_closes_the_session, and
unsupported_peer_verification_fails_without_retrying retain their existing
timeout/closure/authentication assertions and explicitly select ordinary
non-cancellable session behavior.

The fake's Options, main, parse, serve_client and boot_console gain only
private, synchronized foreground gate fixtures; the console writer remains
owned by the fake process. No public API snapshot or liveness assertion was
weakened to accommodate a fourth public argument.

BuildConstantsTests.test_nvx_rs_third_party_notices_cover_every_linked_crate
changes only the evidenced classification sets and macro-policy comment; it
keeps every assertion. Existing legal text is untouched.

The earlier migration dispositions remain: cold/dry-run oracles use checked
configuration and foreground ownership; restore policy tests retain their old
lowering; config/platform/VM fixtures retain detached library and strict
inheritance assertions; download refusal cases retain their original assertions;
the real comma-share scenario retains denied-path, decoy, host-tree and remount
checks; and Windows console cases retain raw/UTF-8 assertions.

This batch's inventory reports 14 changed existing parsed items and 22 added
items, including helpers. The complete owned-range inventory below is against
the selected public dependency, not an attribution of inherited feature work.
The required origin/dev inventory was also run and retained separately.
These are parsed-item counts, not execution counts.

test code: modified helper fn effective_command_line in host::cli::run::tests [nvx-rs/src/host/cli/run/tests.rs:15 -> nvx-rs/src/host/cli/run/tests.rs:11]
test code: modified helper fn session_with in host::cli::session::tests [nvx-rs/src/host/cli/session/tests.rs:158 -> nvx-rs/src/host/cli/session/tests.rs:158]
test code: modified helper fn check_waits_for_openvmm_that_exits in host::cli::session::tests [nvx-rs/src/host/cli/session/tests.rs:736 -> nvx-rs/src/host/cli/session/tests.rs:736]
test code: modified helper fn prepared in host::cli::store::tests::launch [nvx-rs/src/host/cli/store/tests/launch.rs:14 -> nvx-rs/src/host/cli/store/tests/launch.rs:14]
test code: modified helper fn captured in host::config::tests [nvx-rs/src/host/config/tests.rs:658 -> nvx-rs/src/host/config/tests.rs:685]
test code: modified helper fn cold in host::config::tests [nvx-rs/src/host/config/tests.rs:1104 -> nvx-rs/src/host/config/tests.rs:1137]
test code: modified helper fn start_with in host::platform::windows::tests, impl HeldSpawn [nvx-rs/src/host/platform/windows/tests.rs:629 -> nvx-rs/src/host/platform/windows/tests.rs:641]
test code: modified helper fn cold_config in host::vm::tests [nvx-rs/src/host/vm/tests.rs:426 -> nvx-rs/src/host/vm/tests.rs:426]
test code: modified helper struct DryRun in cli/dry_run (tests) [nvx-rs/tests/cli/dry_run.rs:31 -> nvx-rs/tests/cli/dry_run.rs:31]
test code: modified helper fn dry_run in cli/dry_run (tests) [nvx-rs/tests/cli/dry_run.rs:49 -> nvx-rs/tests/cli/dry_run.rs:51]
test code: modified helper fn run_dry_runs in cli/dry_run (tests) [nvx-rs/tests/cli/dry_run.rs:378 -> nvx-rs/tests/cli/dry_run.rs:386]
test code: modified helper struct Launch in cli/one_shot (tests) [nvx-rs/tests/cli/one_shot.rs:27 -> nvx-rs/tests/cli/one_shot.rs:27]
test code: modified helper fn launch in cli/one_shot (tests) [nvx-rs/tests/cli/one_shot.rs:56 -> nvx-rs/tests/cli/one_shot.rs:58]
test code: modified helper fn run_launches in cli/one_shot (tests) [nvx-rs/tests/cli/one_shot.rs:323 -> nvx-rs/tests/cli/one_shot.rs:332]
test code: modified helper fn run_refusals in cli/validation (tests) [nvx-rs/tests/cli/validation.rs:729 -> nvx-rs/tests/cli/validation.rs:729]
test code: modified imports the imports of host::cli::run::tests [nvx-rs/src/host/cli/run/tests.rs:4 -> nvx-rs/src/host/cli/run/tests.rs:4]
test code: modified test fn single_share_targets_must_remain_one_kernel_token in host::cli::run::tests [nvx-rs/src/host/cli/run/tests.rs:41 -> nvx-rs/src/host/cli/run/tests.rs:38]
test code: modified test fn share_tokens_hide_no_virtio_mmio_device in host::cli::run::tests, proptest! [nvx-rs/src/host/cli/run/tests.rs:63 -> nvx-rs/src/host/cli/run/tests.rs:559]
test code: modified test fn policy_paths_attach_to_their_shares in host::cli::run::tests, proptest! (renamed to `restore_policy_paths_attach_to_their_shares`) [nvx-rs/src/host/cli/run/tests.rs:100 -> nvx-rs/src/host/cli/run/tests.rs:599]
test code: modified test fn aggregate_policy_paths_must_be_absolute in host::cli::run::tests, proptest! [nvx-rs/src/host/cli/run/tests.rs:146 -> nvx-rs/src/host/cli/run/tests.rs:645]
test code: modified test fn operations_bound_their_requests_by_their_deadlines in host::cli::session::tests [nvx-rs/src/host/cli/session/tests.rs:609 -> nvx-rs/src/host/cli/session/tests.rs:609]
test code: modified test fn failed_transfer_closes_the_session in host::cli::session::tests [nvx-rs/src/host/cli/session/tests.rs:640 -> nvx-rs/src/host/cli/session/tests.rs:640]
test code: modified test fn request_to_a_stalled_endpoint_times_out_and_closes_the_session in host::cli::session::tests [nvx-rs/src/host/cli/session/tests.rs:671 -> nvx-rs/src/host/cli/session/tests.rs:671]
test code: modified test fn unsupported_peer_verification_fails_without_retrying in host::cli::session::tests::endpoints [nvx-rs/src/host/cli/session/tests.rs:997 -> nvx-rs/src/host/cli/session/tests.rs:1102]
test code: modified test fn configurations_pass_with_or_without_a_nic_address_and_a_boot in host::config::tests [nvx-rs/src/host/config/tests.rs:120 -> nvx-rs/src/host/config/tests.rs:143]
test code: modified test fn cold_command_lines_keep_the_old_root_view_and_mapping_values in host::config::tests [nvx-rs/src/host/config/tests.rs:504 -> nvx-rs/src/host/config/tests.rs:529]
test code: modified test fn the_check_of_a_configuration_checks_its_boots_capture in host::config::tests [nvx-rs/src/host/config/tests.rs:614 -> nvx-rs/src/host/config/tests.rs:640]
test code: modified test fn caller_tokens_follow_rendered_tokens_without_any_rewriting in host::config::tests [nvx-rs/src/host/config/tests.rs:895 -> nvx-rs/src/host/config/tests.rs:923]
test code: modified test fn only_a_checked_cold_boot_has_a_kernel_command_line in host::config::tests [nvx-rs/src/host/config/tests.rs:914 -> nvx-rs/src/host/config/tests.rs:943]
test code: modified test fn caller_tokens_cannot_replace_rendered_tokens_under_kernel_name_matching in host::config::tests [nvx-rs/src/host/config/tests.rs:933 -> nvx-rs/src/host/config/tests.rs:963]
test code: modified test fn caller_owned_guest_tokens_and_noncolliding_names_stay_unchanged in host::config::tests [nvx-rs/src/host/config/tests.rs:1000 -> nvx-rs/src/host/config/tests.rs:1031]
test code: modified test fn mapping_table_is_the_exact_export_projection_counted_by_the_boot_token in host::config::tests [nvx-rs/src/host/config/tests.rs:1027 -> nvx-rs/src/host/config/tests.rs:1059]
test code: modified test fn cold_boot_command_lines_refuse_native_control_console_syntax in host::config::tests [nvx-rs/src/host/config/tests.rs:1145 -> nvx-rs/src/host/config/tests.rs:1179]
test code: modified test fn children_inherit_only_their_standard_handles in host::platform::windows::tests [nvx-rs/src/host/platform/windows/tests.rs:219 -> nvx-rs/src/host/platform/windows/tests.rs:219]
test code: modified test fn a_child_loses_only_the_inherited_handle_that_is_closed_in_it in host::platform::windows::tests [nvx-rs/src/host/platform/windows/tests.rs:308 -> nvx-rs/src/host/platform/windows/tests.rs:310]
test code: modified test fn children_inherit_the_allowed_handles_while_they_are_created in host::platform::windows::tests [nvx-rs/src/host/platform/windows/tests.rs:357 -> nvx-rs/src/host/platform/windows/tests.rs:361]
test code: modified test fn batch_files_are_refused_before_cmd_could_read_their_arguments in host::platform::windows::tests [nvx-rs/src/host/platform/windows/tests.rs:435 -> nvx-rs/src/host/platform/windows/tests.rs:441]
test code: modified test fn concurrent_spawns_that_allow_one_handle_all_inherit_it_and_restore_it in host::platform::windows::tests [nvx-rs/src/host/platform/windows/tests.rs:477 -> nvx-rs/src/host/platform/windows/tests.rs:485]
test code: modified test fn a_spawn_that_panics_in_its_window_restores_the_handles_and_lets_other_spawns_run in host::platform::windows::tests [nvx-rs/src/host/platform/windows/tests.rs:521 -> nvx-rs/src/host/platform/windows/tests.rs:531]
test code: modified test fn a_thread_that_holds_the_spawn_lock_spawns_under_it_until_its_last_lock_is_dropped in host::platform::windows::tests [nvx-rs/src/host/platform/windows/tests.rs:1202 -> nvx-rs/src/host/platform/windows/tests.rs:1216]
test code: modified test fn a_library_vm_outlives_the_caller_that_spawned_it_without_retaining_its_output_pipe in host::vm::tests [nvx-rs/src/host/vm/tests.rs:1440 -> nvx-rs/src/host/vm/tests.rs:1472]
test code: modified test fn current_cold_spawn_boots_a_guest_accepts_shell_input_and_exits_cleanly in host::vm::tests [nvx-rs/src/host/vm/tests.rs:1584 -> nvx-rs/src/host/vm/tests.rs:1657]
test code: modified test fn run_guides_failed_cold_boots_on_cpus_that_no_built_in_profile_serves in cli (tests) [nvx-rs/tests/cli.rs:2526 -> nvx-rs/tests/cli.rs:2526]
test code: modified test fn run_shares_relative_roots_with_absolute_policy_paths in cli (tests) [nvx-rs/tests/cli.rs:2707 -> nvx-rs/tests/cli.rs:2708]
test code: modified test fn commands_download_nothing_for_options_that_they_refuse in cli/download (tests) [nvx-rs/tests/cli/download.rs:118 -> nvx-rs/tests/cli/download.rs:144]
test code: modified test fn dry_runs_print_the_openvmm_command_and_launch_nothing in cli/dry_run (tests) [nvx-rs/tests/cli/dry_run.rs:1189 -> nvx-rs/tests/cli/dry_run.rs:1311]
test code: modified test fn the_openvmm_command_of_a_run_splits_back_into_its_arguments in cli/dry_run (tests) [nvx-rs/tests/cli/dry_run.rs:1240 -> nvx-rs/tests/cli/dry_run.rs:1394]
test code: modified test fn one_shot_runs_exit_with_the_workload_or_openvmm_status in cli/one_shot (tests) [nvx-rs/tests/cli/one_shot.rs:660 -> nvx-rs/tests/cli/one_shot.rs:681]
test code: modified test def FilesystemCommaPathsScenarioTests.test_scenario_shares_each_directory_alone_and_both_together in scripts/test_microvm_tests.py [scripts/test_microvm_tests.py:3887 -> scripts/test_microvm_tests.py:3887]
test code: modified test def BuildConstantsTests.test_nvx_rs_third_party_notices_cover_every_linked_crate in scripts/test_nvx_tools.py [scripts/test_nvx_tools.py:14388 -> scripts/test_nvx_tools.py:14388]
end-to-end tests: modified file scripts/nvx_tools/microvm_test_scripts/filesystem-comma-paths.sh.in [scripts/nvx_tools/microvm_test_scripts/filesystem-comma-paths.sh.in -> scripts/nvx_tools/microvm_test_scripts/filesystem-comma-paths.sh.in]
end-to-end tests: modified helper def run_filesystem_comma_paths in scripts/nvx_tools/microvm_tests.py [scripts/nvx_tools/microvm_tests.py:9978 -> scripts/nvx_tools/microvm_tests.py:9978]
test doubles: modified helper struct Options in testing::fake_openvmm [nvx-rs/src/testing/fake_openvmm.rs:341 -> nvx-rs/src/testing/fake_openvmm.rs:348]
test doubles: modified helper fn main in testing::fake_openvmm [nvx-rs/src/testing/fake_openvmm.rs:465 -> nvx-rs/src/testing/fake_openvmm.rs:486]
test doubles: modified helper fn run_one_shot in testing::fake_openvmm [nvx-rs/src/testing/fake_openvmm.rs:723 -> nvx-rs/src/testing/fake_openvmm.rs:831]
test doubles: modified helper fn run_microvm in testing::fake_openvmm [nvx-rs/src/testing/fake_openvmm.rs:770 -> nvx-rs/src/testing/fake_openvmm.rs:881]
test doubles: modified helper fn parse in testing::fake_openvmm [nvx-rs/src/testing/fake_openvmm.rs:1174 -> nvx-rs/src/testing/fake_openvmm.rs:1301]
test doubles: modified helper fn serve_client in testing::fake_openvmm [nvx-rs/src/testing/fake_openvmm.rs:2739 -> nvx-rs/src/testing/fake_openvmm.rs:2913]
test doubles: modified helper fn serve in testing::fake_openvmm [nvx-rs/src/testing/fake_openvmm.rs:2877 -> nvx-rs/src/testing/fake_openvmm.rs:3192]
test doubles: modified test fn restores_of_runs_resume_their_saved_guest_whatever_the_cli_tokens in testing::fake_openvmm::tests [nvx-rs/src/testing/fake_openvmm/tests.rs:635 -> nvx-rs/src/testing/fake_openvmm/tests.rs:635]
60 change(s) to existing tests; relocated unchanged: 0; added: 70

@esaurez Enrique Saurez (esaurez) added the tests-modified Changes existing tests, test data, or test wiring label Nov 10, 2026
@github-actions

github-actions Bot commented Nov 10, 2026 •

Copy link
Copy Markdown
Contributor

This pull request changes existing tests

It modifies or removes 61 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

Change What Before After
modified helper fn effective_command_line in host::cli::run::tests nvx-rs/src/host/cli/run/tests.rs:15 nvx-rs/src/host/cli/run/tests.rs:11
modified helper fn session_with in host::cli::session::tests nvx-rs/src/host/cli/session/tests.rs:158 nvx-rs/src/host/cli/session/tests.rs:158
modified helper fn check_waits_for_openvmm_that_exits in host::cli::session::tests nvx-rs/src/host/cli/session/tests.rs:736 nvx-rs/src/host/cli/session/tests.rs:736
modified helper fn prepared in host::cli::store::tests::launch nvx-rs/src/host/cli/store/tests/launch.rs:14 nvx-rs/src/host/cli/store/tests/launch.rs:14
modified helper fn captured in host::config::tests nvx-rs/src/host/config/tests.rs:678 nvx-rs/src/host/config/tests.rs:705
modified helper fn cold in host::config::tests nvx-rs/src/host/config/tests.rs:1124 nvx-rs/src/host/config/tests.rs:1157
modified helper fn start_with in host::platform::windows::tests, impl HeldSpawn`` nvx-rs/src/host/platform/windows/tests.rs:631 nvx-rs/src/host/platform/windows/tests.rs:643
modified helper fn cold_config in host::vm::tests nvx-rs/src/host/vm/tests.rs:74 nvx-rs/src/host/vm/tests.rs:74
modified helper fn capture_config in host::vm::tests nvx-rs/src/host/vm/tests.rs:111 nvx-rs/src/host/vm/tests.rs:112
modified helper struct DryRun in cli/dry_run (tests) nvx-rs/tests/cli/dry_run.rs:31 nvx-rs/tests/cli/dry_run.rs:31
modified helper fn dry_run in cli/dry_run (tests) nvx-rs/tests/cli/dry_run.rs:49 nvx-rs/tests/cli/dry_run.rs:51
modified helper fn run_dry_runs in cli/dry_run (tests) nvx-rs/tests/cli/dry_run.rs:378 nvx-rs/tests/cli/dry_run.rs:386
modified helper struct Launch in cli/one_shot (tests) nvx-rs/tests/cli/one_shot.rs:27 nvx-rs/tests/cli/one_shot.rs:27
modified helper fn launch in cli/one_shot (tests) nvx-rs/tests/cli/one_shot.rs:56 nvx-rs/tests/cli/one_shot.rs:58
modified helper fn run_launches in cli/one_shot (tests) nvx-rs/tests/cli/one_shot.rs:323 nvx-rs/tests/cli/one_shot.rs:332
modified helper fn run_refusals in cli/validation (tests) nvx-rs/tests/cli/validation.rs:729 nvx-rs/tests/cli/validation.rs:729
modified imports the imports of host::cli::run::tests nvx-rs/src/host/cli/run/tests.rs:4 nvx-rs/src/host/cli/run/tests.rs:4
modified test fn single_share_targets_must_remain_one_kernel_token in host::cli::run::tests nvx-rs/src/host/cli/run/tests.rs:41 nvx-rs/src/host/cli/run/tests.rs:38
modified test fn share_tokens_hide_no_virtio_mmio_device in host::cli::run::tests, proptest!`` nvx-rs/src/host/cli/run/tests.rs:63 nvx-rs/src/host/cli/run/tests.rs:563
modified test fn policy_paths_attach_to_their_shares in host::cli::run::tests, proptest!`` (renamed to restore_policy_paths_attach_to_their_shares) nvx-rs/src/host/cli/run/tests.rs:100 nvx-rs/src/host/cli/run/tests.rs:603
modified test fn aggregate_policy_paths_must_be_absolute in host::cli::run::tests, proptest!`` nvx-rs/src/host/cli/run/tests.rs:146 nvx-rs/src/host/cli/run/tests.rs:649
modified test fn operations_bound_their_requests_by_their_deadlines in host::cli::session::tests nvx-rs/src/host/cli/session/tests.rs:609 nvx-rs/src/host/cli/session/tests.rs:609
modified test fn failed_transfer_closes_the_session in host::cli::session::tests nvx-rs/src/host/cli/session/tests.rs:640 nvx-rs/src/host/cli/session/tests.rs:640
modified test fn request_to_a_stalled_endpoint_times_out_and_closes_the_session in host::cli::session::tests nvx-rs/src/host/cli/session/tests.rs:671 nvx-rs/src/host/cli/session/tests.rs:671
modified test fn unsupported_peer_verification_fails_without_retrying in host::cli::session::tests::endpoints nvx-rs/src/host/cli/session/tests.rs:997 nvx-rs/src/host/cli/session/tests.rs:1102
modified test fn configurations_pass_with_or_without_a_nic_address_and_a_boot in host::config::tests nvx-rs/src/host/config/tests.rs:120 nvx-rs/src/host/config/tests.rs:143
modified test fn cold_command_lines_keep_the_old_root_view_and_mapping_values in host::config::tests nvx-rs/src/host/config/tests.rs:524 nvx-rs/src/host/config/tests.rs:549
modified test fn the_check_of_a_configuration_checks_its_boots_capture in host::config::tests nvx-rs/src/host/config/tests.rs:634 nvx-rs/src/host/config/tests.rs:660
modified test fn caller_tokens_follow_rendered_tokens_without_any_rewriting in host::config::tests nvx-rs/src/host/config/tests.rs:915 nvx-rs/src/host/config/tests.rs:943
modified test fn only_a_checked_cold_boot_has_a_kernel_command_line in host::config::tests nvx-rs/src/host/config/tests.rs:934 nvx-rs/src/host/config/tests.rs:963
modified test fn caller_tokens_cannot_replace_rendered_tokens_under_kernel_name_matching in host::config::tests nvx-rs/src/host/config/tests.rs:953 nvx-rs/src/host/config/tests.rs:983
modified test fn caller_owned_guest_tokens_and_noncolliding_names_stay_unchanged in host::config::tests nvx-rs/src/host/config/tests.rs:1020 nvx-rs/src/host/config/tests.rs:1051
modified test fn mapping_table_is_the_exact_export_projection_counted_by_the_boot_token in host::config::tests nvx-rs/src/host/config/tests.rs:1047 nvx-rs/src/host/config/tests.rs:1079
modified test fn cold_boot_command_lines_refuse_native_control_console_syntax in host::config::tests nvx-rs/src/host/config/tests.rs:1296 nvx-rs/src/host/config/tests.rs:1330
modified test fn children_inherit_only_their_standard_handles in host::platform::windows::tests nvx-rs/src/host/platform/windows/tests.rs:221 nvx-rs/src/host/platform/windows/tests.rs:221
modified test fn a_child_loses_only_the_inherited_handle_that_is_closed_in_it in host::platform::windows::tests nvx-rs/src/host/platform/windows/tests.rs:310 nvx-rs/src/host/platform/windows/tests.rs:312
modified test fn children_inherit_the_allowed_handles_while_they_are_created in host::platform::windows::tests nvx-rs/src/host/platform/windows/tests.rs:359 nvx-rs/src/host/platform/windows/tests.rs:363
modified test fn batch_files_are_refused_before_cmd_could_read_their_arguments in host::platform::windows::tests nvx-rs/src/host/platform/windows/tests.rs:437 nvx-rs/src/host/platform/windows/tests.rs:443
modified test fn concurrent_spawns_that_allow_one_handle_all_inherit_it_and_restore_it in host::platform::windows::tests nvx-rs/src/host/platform/windows/tests.rs:479 nvx-rs/src/host/platform/windows/tests.rs:487
modified test fn a_spawn_that_panics_in_its_window_restores_the_handles_and_lets_other_spawns_run in host::platform::windows::tests nvx-rs/src/host/platform/windows/tests.rs:523 nvx-rs/src/host/platform/windows/tests.rs:533
modified test fn a_thread_that_holds_the_spawn_lock_spawns_under_it_until_its_last_lock_is_dropped in host::platform::windows::tests nvx-rs/src/host/platform/windows/tests.rs:1204 nvx-rs/src/host/platform/windows/tests.rs:1218
modified test fn a_library_vm_outlives_the_caller_that_spawned_it_without_retaining_its_output_pipe in host::vm::tests nvx-rs/src/host/vm/tests.rs:1515 nvx-rs/src/host/vm/tests.rs:1548
modified test fn current_cold_spawn_boots_a_guest_accepts_shell_input_and_exits_cleanly in host::vm::tests nvx-rs/src/host/vm/tests.rs:1659 nvx-rs/src/host/vm/tests.rs:1733
modified test fn run_guides_failed_cold_boots_on_cpus_that_no_built_in_profile_serves in cli (tests) nvx-rs/tests/cli.rs:2526 nvx-rs/tests/cli.rs:2526
modified test fn run_shares_relative_roots_with_absolute_policy_paths in cli (tests) nvx-rs/tests/cli.rs:2707 nvx-rs/tests/cli.rs:2708
modified test fn commands_download_nothing_for_options_that_they_refuse in cli/download (tests) nvx-rs/tests/cli/download.rs:118 nvx-rs/tests/cli/download.rs:144
modified test fn dry_runs_print_the_openvmm_command_and_launch_nothing in cli/dry_run (tests) nvx-rs/tests/cli/dry_run.rs:1189 nvx-rs/tests/cli/dry_run.rs:1311
modified test fn the_openvmm_command_of_a_run_splits_back_into_its_arguments in cli/dry_run (tests) nvx-rs/tests/cli/dry_run.rs:1240 nvx-rs/tests/cli/dry_run.rs:1394
modified test fn one_shot_runs_exit_with_the_workload_or_openvmm_status in cli/one_shot (tests) nvx-rs/tests/cli/one_shot.rs:660 nvx-rs/tests/cli/one_shot.rs:681
modified test def FilesystemCommaPathsScenarioTests.test_scenario_shares_each_directory_alone_and_both_together in scripts/test_microvm_tests.py scripts/test_microvm_tests.py:3887 scripts/test_microvm_tests.py:3887

... and 1 more, which the job's summary lists.

End-to-end tests

Change What Before After
modified file scripts/nvx_tools/microvm_test_scripts/filesystem-comma-paths.sh.in scripts/nvx_tools/microvm_test_scripts/filesystem-comma-paths.sh.in scripts/nvx_tools/microvm_test_scripts/filesystem-comma-paths.sh.in
modified helper def run_filesystem_comma_paths in scripts/nvx_tools/microvm_tests.py scripts/nvx_tools/microvm_tests.py:9978 scripts/nvx_tools/microvm_tests.py:9978

Test doubles

Change What Before After
modified helper struct Options in testing::fake_openvmm nvx-rs/src/testing/fake_openvmm.rs:341 nvx-rs/src/testing/fake_openvmm.rs:348
modified helper fn main in testing::fake_openvmm nvx-rs/src/testing/fake_openvmm.rs:465 nvx-rs/src/testing/fake_openvmm.rs:486
modified helper fn run_one_shot in testing::fake_openvmm nvx-rs/src/testing/fake_openvmm.rs:723 nvx-rs/src/testing/fake_openvmm.rs:831
modified helper fn run_microvm in testing::fake_openvmm nvx-rs/src/testing/fake_openvmm.rs:770 nvx-rs/src/testing/fake_openvmm.rs:881
modified helper fn parse in testing::fake_openvmm nvx-rs/src/testing/fake_openvmm.rs:1174 nvx-rs/src/testing/fake_openvmm.rs:1301
modified helper fn serve_client in testing::fake_openvmm nvx-rs/src/testing/fake_openvmm.rs:2739 nvx-rs/src/testing/fake_openvmm.rs:2913
modified helper fn serve in testing::fake_openvmm nvx-rs/src/testing/fake_openvmm.rs:2877 nvx-rs/src/testing/fake_openvmm.rs:3192
modified test fn restores_of_runs_resume_their_saved_guest_whatever_the_cli_tokens in testing::fake_openvmm::tests nvx-rs/src/testing/fake_openvmm/tests.rs:635 nvx-rs/src/testing/fake_openvmm/tests.rs:635

Relocated unchanged: 0; added: 70. Compared the merge base 5b3d53912db2 with 231b618f4839.

Base automatically changed from esaurez/issue1100-sl210-0c8e42ad-20261110 to feature/nvx-refactor November 10, 2026 14:52
@esaurez
Enrique Saurez (esaurez) requested a balanced review from Copilot November 10, 2026 15:30

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🟡 Changes recommended

Unresolved defects can turn successful runs into errors, discard requested outcome reports, garble Windows console text, and throttle output enough to block the guest.

4 open issues
What changed in this PR

Moves cold blockless nvx-rs run launches onto the verified host VM lifecycle for both one-shot and managed guests, advancing SL3.4a2 of #1109 while preserving the existing restore path.

Changes:

  • Builds checked VM configurations and export plans with CLI-owned guest tokens.
  • Adds foreground console forwarding, child-status retention, report publication, and cleanup after confirmed exit.
  • Updates lifecycle APIs, regression coverage, documentation, and terminal dependencies.
File Description
THIRD_PARTY_NOTICES.md Documents terminal-support dependencies.
tests/​runtime-adapter/​tests/​vm_clone.rs Adapts exit assertions to typed confirmation.
tests/​runtime-adapter/​tests/​common/​mod.rs Shortens temporary sandbox paths.
tests/​runtime-adapter/​src/​bin/​runtime-adapter-host.rs Handles typed waits and report errors.
scripts/​test_microvm_tests.py Checks revised aggregate-share scripts.
scripts/​nvx_tools/​microvm_tests.py Supplies planned aggregate access modes.
scripts/​nvx_tools/​microvm_test_scripts/​filesystem-comma-paths.sh.in Tests aggregate binds and host-enforced write denial.
nvx-rs/​tests/​supervisor.rs Updates process-exit assertions and cleanup.
nvx-rs/​tests/​store.rs Adapts store tests to typed waits.
nvx-rs/​tests/​fake_openvmm.rs Updates verified-process exit assertions.
nvx-rs/​tests/​cli/​validation.rs Revises checked-configuration refusal cases.
nvx-rs/​tests/​cli/​openvmm.rs Projects fixtures onto checked cold-launch arguments.
nvx-rs/​tests/​cli/​one_shot.rs Adds foreground, terminal, status, and report coverage.
nvx-rs/​tests/​cli/​lifecycle.rs Adapts lifecycle tests to typed waits.
nvx-rs/​tests/​cli/​dry_run.rs Updates cold-launch expectations and refusals.
nvx-rs/​tests/​cli/​download.rs Isolates executable copying on Unix.
nvx-rs/​tests/​cli.rs Revises cold-run guidance and share assertions.
nvx-rs/​tests/​checked_handoff.rs Requires explicit process-exit confirmation.
nvx-rs/​src/​testing/​fake_openvmm/​tests.rs Adapts restore tests to explicit output writers.
nvx-rs/​src/​testing/​fake_openvmm.rs Emulates cold console listeners and planned mappings.
nvx-rs/​src/​host/​vm/​tests/​reattach.rs Updates reattachment exit assertions.
nvx-rs/​src/​host/​vm/​tests.rs Tests confirmed stops and retained child status.
nvx-rs/​src/​host/​vm.rs Adds confirmed stop and foreground child ownership.
nvx-rs/​src/​host/​template/​store/​leases/​tests.rs Updates lease cleanup and exit assertions.
nvx-rs/​src/​host/​template/​clone/​tests/​restore.rs Adapts restore exit checks.
nvx-rs/​src/​host/​template/​clone/​tests/​launch.rs Updates launch wait and report assertions.
nvx-rs/​src/​host/​template/​clone/​records.rs Preserves legacy best-effort report reads.
nvx-rs/​src/​host/​spawn.rs Supports foreground and detached VM spawning.
nvx-rs/​src/​host/​report/​tests.rs Distinguishes missing, malformed, and unreadable reports.
nvx-rs/​src/​host/​report.rs Returns report-read errors separately from absence.
nvx-rs/​src/​host/​process/​tests/​linux.rs Updates last-thread exit confirmation checks.
nvx-rs/​src/​host/​process/​tests.rs Adapts polling tests to typed waits.
nvx-rs/​src/​host/​process.rs Introduces opaque process-exit proof.
nvx-rs/​src/​host/​platform/​windows/​tests.rs Adapts spawn tests and adds wait-only support.
nvx-rs/​src/​host/​platform/​windows/​spawn.rs Separates foreground and detached creation modes.
nvx-rs/​src/​host/​platform/​windows/​mod.rs Exposes revised spawn and transport helpers.
nvx-rs/​src/​host/​platform/​windows/​endpoint.rs Wraps duplicated pipes with independent transport events.
nvx-rs/​src/​host/​platform/​linux/​mod.rs Exposes the transport-handle adapter.
nvx-rs/​src/​host/​platform/​linux/​endpoint.rs Wraps duplicated verified socket handles.
nvx-rs/​src/​host/​instance/​locked.rs Retains legacy best-effort report handling.
nvx-rs/​src/​host/​config/​tests.rs Tests cold memory-capacity validation and arguments.
nvx-rs/​src/​host/​config/​mod.rs Adds cold-boot memory capacity.
nvx-rs/​src/​host/​cli/​sandbox/​options.rs Makes network conversion reusable by run.
nvx-rs/​src/​host/​cli/​sandbox/​mod.rs Shares network and report helpers.
nvx-rs/​src/​host/​cli/​sandbox/​lifecycle/​outcome.rs Publishes native reports without overwriting destinations.
nvx-rs/​src/​host/​cli/​sandbox/​lifecycle/​mod.rs Exposes report-copy functionality.
nvx-rs/​src/​host/​cli/​run/​tests.rs Tests planned shares and command-line budgets.
nvx-rs/​src/​host/​cli/​run/​guest_tokens/​tests.rs Covers modes, identities, and planned share tokens.
nvx-rs/​src/​host/​cli/​run/​guest_tokens.rs Renders CLI-owned blockless guest settings.
nvx-rs/​src/​host/​cli/​run.rs Routes cold runs through checked foreground lifecycle handling.
nvx-rs/​src/​error/​tests.rs Covers the new still-running error code.
nvx-rs/​src/​error.rs Adds the unconfirmed-exit error category.
nvx-rs/​README.md Documents confirmed stops and report semantics.
nvx-rs/​public-api/​windows.txt Records Windows public API additions.
nvx-rs/​public-api/​linux.txt Records Linux public API additions.
nvx-rs/​Cargo.toml Adds optional CLI terminal support.
nvx-rs/​Cargo.lock Locks terminal-support dependencies.
guest/​common/​nvx-hostmount Accepts validated child-relative share sources.
doc/​usage.md Documents cold-run restrictions and report behavior.

Review effort: Balanced

Comment thread nvx-rs/src/host/cli/run.rs Resolved
Comment thread nvx-rs/src/host/cli/run.rs Resolved
Comment thread nvx-rs/src/host/cli/run.rs Resolved
Comment thread nvx-rs/src/host/cli/run.rs Resolved

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🟡 Changes recommended

Unresolved issues can stop the VM on valid Windows console output, leak private directories after launch failures, hide boot diagnostics during control attachment, and incorrectly block artifact downloads needed by mount sources.

4 open issues
4 resolved since last review

Review effort: Balanced

Comment thread nvx-rs/src/host/cli/run.rs Resolved
Comment thread nvx-rs/src/host/cli/run.rs Resolved
Comment thread nvx-rs/src/host/cli/run.rs Resolved
Comment thread nvx-rs/src/host/cli/run.rs Resolved

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🟡 Changes recommended

Terminal Ctrl-C cannot cancel boot, output-forwarding failures can delay VM shutdown behind attachment timeouts, and idle-console polling throttles live log forwarding.

3 open issues
4 resolved since last review

Review effort: Balanced

Comment thread nvx-rs/src/host/cli/run.rs Resolved
Comment thread nvx-rs/src/host/cli/run.rs Resolved
Comment thread nvx-rs/src/host/cli/run.rs Resolved

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🟡 Changes recommended

Windows console handling fails to restore the caller’s original mode flags, and the readiness test can signal readiness before Ctrl-C cancellation is enabled.

2 open issues
3 resolved since last review

Review effort: Balanced

Comment thread nvx-rs/src/host/cli/run.rs Resolved
Comment thread nvx-rs/tests/cli/one_shot.rs Resolved
Enrique Saurez and others added 8 commits November 10, 2026 18:54
Implement issue1109 SL3.4a2 on qualified SL2.10 adeb1d4, without
replaying the donor's old stop-producer history. Keep restore and
restore-network-policy on their existing path.

Render CLI-owned guest tokens from the planned export, preserve cold
foreground streams, terminal mode, exact exit status and outcome
publication, and keep ordinary library spawns detached.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Copilot-Session: eb3cc7e0-f51e-45ed-b911-c7b214740e05
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Copilot-Session: eb3cc7e0-f51e-45ed-b911-c7b214740e05
…rage

Do not require install provenance or hash an override for a cold run that neither captures nor reattaches. Restore the public artifact identity implementation and remove its unused private extension and fixtures. Exercise metadata-free dry runs and overrides. Update the real comma-path guest scenario for planned aggregate binds, including all-read-only root remounts while retaining host write-denial checks.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Copilot-Session: eb3cc7e0-f51e-45ed-b911-c7b214740e05
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Copilot-Session: eb3cc7e0-f51e-45ed-b911-c7b214740e05
Remove the two no-longer-installed guest metadata entries from the fixture cleanup list, restoring this file exactly to the qualified base. Keep all six download test bodies and assertions unchanged.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Copilot-Session: eb3cc7e0-f51e-45ed-b911-c7b214740e05
Recheck the owned child before surfacing endpoint authentication races, use the standard Unicode-aware stdout path, avoid idle sleeps while streams advance, and publish requested native reports after confirmed exit even on foreground errors.

Add focused peer, private Windows console, streaming, output-error and interruption regressions.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Copilot-Session: eb3cc7e0-f51e-45ed-b911-c7b214740e05
Render invalid guest UTF-8 as replacement characters only when stdout is an actual Windows console. Carry at most three split-sequence bytes between reads and finish them only at console EOF or final drain. Keep redirected pipes and files byte-exact and preserve real I/O failures.

Extend the isolated CP437 console regression with invalid sequences, split-invalid input, incomplete endings, and raw pipe/file controls.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Copilot-Session: eb3cc7e0-f51e-45ed-b911-c7b214740e05
Allow only the isolated Windows console test helper to exercise documented Win32 calls, matching existing Windows endpoint-test opt-outs. Keep the host-wide unsafe-code denial and production code unchanged.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Copilot-Session: eb3cc7e0-f51e-45ed-b911-c7b214740e05
Enrique Saurez and others added 18 commits November 10, 2026 18:54
Initialize the cold-boot memory-capacity option in the newly integrated CLI journal fixture. None preserves its prior boot-memory behavior and all existing assertions.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Copilot-Session: eb3cc7e0-f51e-45ed-b911-c7b214740e05
Defer filesystem planning until artifacts are acquired, forward boot streams during managed attachment, decode only actual Windows console logs, and retain temporary evidence only when child exit is unconfirmed.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

Copilot-Session: 35f2ad55-f31c-4ab3-9c78-f119b029a3c0
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

Copilot-Session: 35f2ad55-f31c-4ab3-9c78-f119b029a3c0
Keep source-independent owner refusal in preflight without replacing the checked planner diagnostic. Check the download notification and final error separately in its regression fixture, and initialize console carry directly on each platform.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

Copilot-Session: 35f2ad55-f31c-4ab3-9c78-f119b029a3c0
Do not retry stopped output or report secondary drain errors after Ctrl-C. Recheck interruption around final drain and attachment failure reporting; exercise pending stopped logs in the existing isolated real-console software seam without starting or signaling a VM.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 35f2ad55-f31c-4ab3-9c78-f119b029a3c0
Keep fair output forwarding genuinely nonblocking while logs are ready, cancel both attachment phases before scoped join, and preserve the original forwarding cause and verified VM cleanup.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

Copilot-Session: 80075afd-7139-47a9-90c2-923b6b22bda5
…erminals

Add actual ConPTY and PTY keyboard input, held-process cleanup receipts, and the explicitly approved default field in the compiled dependency example. Retain the separate public-spawn API integration blocker.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

Copilot-Session: 80075afd-7139-47a9-90c2-923b6b22bda5
Keep the private ConPTY fixture isolated and retain explicit terminal/verified-cleanup observations without changing production scope.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

Copilot-Session: 80075afd-7139-47a9-90c2-923b6b22bda5
Keep the dependency public spawn_vm(command, capability, log) signature and detached default; route only the existing private VM caller through the shared private foreground-mode helper.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

Copilot-Session: 80075afd-7139-47a9-90c2-923b6b22bda5
Do not let the cancellation duplicate keep a failed established session open. Add a native transport regression on each supported host and retain generated formatting.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

Copilot-Session: 80075afd-7139-47a9-90c2-923b6b22bda5
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

Copilot-Session: 80075afd-7139-47a9-90c2-923b6b22bda5
Handle the existing optional process-start lookup explicitly rather than constructing an invalid ProcessRef fixture.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

Copilot-Session: 80075afd-7139-47a9-90c2-923b6b22bda5
Do not mistake inherited redirected standard input for CONIN$. Verify all console members are owned before injecting a keyboard interrupt and retain the accepted nonexclusive native-stop qualification.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

Copilot-Session: 80075afd-7139-47a9-90c2-923b6b22bda5
Leave only the terminal interrupt key as a host signal and restore all saved control characters. Exercise actual PTY input echoed by the held fake console, then Ctrl-C and verified cleanup.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 80075afd-7139-47a9-90c2-923b6b22bda5
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 80075afd-7139-47a9-90c2-923b6b22bda5
Use locked musl and MSVC normal CLI graphs, retaining the existing executed-procedural-macro policy. The required versioned notices already exist; runtime rustix/linux-raw-sys move out of the test-only classification and the Redox/GNU target packages remain unshipped.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 80075afd-7139-47a9-90c2-923b6b22bda5
The private-console helper published readiness once line input and echo were
off, which also matches the mode between enable_raw_mode, which clears
processed input, and TerminalGuard::enable_interrupts, which sets it again. A
Ctrl-C byte sent then reaches the guest instead of cancelling the CLI, or the
later check of the captured mode fails. Wait for processed input as well.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
On Windows, crossterm's disable_raw_mode sets line input, echo and processed
input instead of restoring their entry values, so a caller that ran nvx-rs with
echo off got it back on. TerminalGuard now saves the console input mode before
it enables raw mode, and restores exactly that mode when dropped, which also
covers the error path after enable_interrupts. On Unix, crossterm already
restores the termios that it saved.

The private-console helper now enters each phase with echo and processed input
off, so that its check that the CLI restores the entry mode fails for a guard
that sets those flags instead.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
@ppenna
Pedro Henrique Penna (ppenna) force-pushed the private/simple-1109-02e4-sl34a2-20261110 branch from f346df0 to 4beb1ce Compare November 11, 2026 02:54
@ppenna
Pedro Henrique Penna (ppenna) marked this pull request as ready for review November 11, 2026 02:54
A process created with CREATE_NEW_PROCESS_GROUP ignores Ctrl-C, and passes
that on to every process that it starts, such as the test process of a CI
runner's Windows step. The private-console helpers inherited it, so the
console output helper never recorded the Ctrl-C that it generates, and the
terminal Ctrl-C helper's CLI never cancelled. Each helper now restores normal
Ctrl-C processing for itself, alone in its private console, and the CLI that
it starts.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
@ppenna
Pedro Henrique Penna (ppenna) merged commit 394c890 into feature/nvx-refactor Nov 11, 2026
48 checks passed
@ppenna
Pedro Henrique Penna (ppenna) deleted the private/simple-1109-02e4-sl34a2-20261110 branch November 11, 2026 03:26
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

feat-nvx-refactor tests-modified Changes existing tests, test data, or test wiring

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants