Repository navigation
cli: run cold blockless VMs through the verified lifecycle (SL3.4a2) - #1441
Conversation
This pull request changes existing testsIt 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
... and 1 more, which the job's summary lists. End-to-end tests
Test doublesRelocated unchanged: 0; added: 70. Compared the merge base |
There was a problem hiding this comment.
🟡 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
67bb715 to
6bc5c0a
Compare
There was a problem hiding this comment.
🟡 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
There was a problem hiding this comment.
🟡 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
b6ba3e6 to
f346df0
Compare
There was a problem hiding this comment.
🟡 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
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
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>
f346df0 to
4beb1ce
Compare
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>
394c890
into
feature/nvx-refactor

Rebase onto
feature/nvx-refactor#1434 merged, so the branch drops its six inherited #1434 commits (
d0cf3f63..4fdf55db), replays its 24 own commits onto5b3d53912db2e5582e64130678e2983e4e54e3c7, adds two commits for the review findings, and one for a test that CI's environment exposed. The head is231b618f4839291f585edd45853c83e5127c3f39, tree2c25cb04c65f7a03f58de68b997ea04d018dfbd5.git range-diff 4fdf55db03..f346df02d0 5b3d53912d..a08aa41158reports 23 of the 24 own patches identical. The first,bbbb23821c(9f5d2c2abefore), differs only by these resolutions:nvx-rs/src/host/platform/{linux,windows}/mod.rs: the base added acfg(feature = "cli")re-export ofendpoint::endpoint_server_pid_untilfor [SL3.3b] Recover interrupted CLI launches under the sandbox lock #1446's recovery probe, where this commit addsendpoint::transport_from_handle. Both are kept, in oneusethat rustfmt places after the otherendpointimports.nvx-rs/src/host/vm/tests.rs: thecapture_configfixture, which host: prepare blockless capture launches #1454 added after this branch's original base, setsmemory_capacity_mib: None, theBootfield that this commit adds, as this commit already does forcold_config. The fixture keeps its behavior, a capture VM without memory capacity beyond its boot memory. It is the one existing test item thatcheck_test_changes.py --base origin/feature/nvx-refactorreports beyond the 60 that the dispositions below explain: 61 changed and 70 added.The two new commits address review 5852501708:
95dcce4dtest: 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 betweenenable_raw_modeandTerminalGuard::enable_interruptsno longer counts as ready.4beb1ce3cli: restore the console's entry input mode on Windows: crossterm's Windowsdisable_raw_modesets line input, echo and processed input instead of restoring them.TerminalGuardnow saves the console input mode before raw mode and restores exactly that mode when dropped, on the error path afterenable_interruptstoo. 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 onlywindows_console_output_handles_non_utf8_code_pagesonwindows-latest. Its private-console helper never recorded the Ctrl-C that it generates: a process created withCREATE_NEW_PROCESS_GROUPignores 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.231b618ftest: restore Ctrl-C processing in the private console helpers callsSetConsoleCtrlHandler(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-rswhere they apply: rustfmt; Clippy with-D warningsfor--all-targets --all-features,--lib,--lib --no-default-features,--lib --bins --features cliand--lib --bins --no-default-features --features testing, and for--all-targets --all-featuresand--lib --bins --features clionx86_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, andtest_microvm_tests; ShellCheck ofguest/common/nvx-hostmount; the test layout; and Markdown links.terminal_ctrl_c_cancels_boot_and_handshake_and_restores_the_terminalpasses for both phases, and the completecargo test --locked --all-featurespasses, 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 runuses the verifiedhost::vm::{create, spawn, stop}lifecycle and CLI-owned guest tokens in bothone-shot and managed modes. Restore and
--restore-network-policyretain theirexisting path.
Correction head
f346df02d0bb7fec4b3f3461243a9cb312b3c1a0, tree5d051191d3342b04a90af9161b60c790e7a0c97c.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..b6ba3e60commits onto the previouslyselected public dependency
4fdf55db0384354980a1267f64b5701d500969b8, tree2db5b7cfaa040d45ff217596b554037d13ccd641, 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
4fdf55dbaboveeba4c8b6; it makes no claim to adopt any later parent head. The existing PR base remainsfeature/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:
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
0x03remains ordinary stream data, not CLI cancellation.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.
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: Nonefor the required fieldthat 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
StillRunningrefusal(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..f346changes only the existing Python inventory test, while the completeRust 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 echofrom the held fake's console and a still-running CLI, then sends
0x03andrequires 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
9d4parallel Linux CLI run hit the unchanged three-secondforwarding-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/ tree5d051191, 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 anyremaining 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
crosstermdependency had complete notices but a stale hardcodedtest 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
rustixandlinux-raw-sysout of the old test-only category, and classifiesredox_syscalland the twowinapi-*-pc-windows-gnupackages 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.1exception 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.rsalone 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 productionfiles, 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_completesandfailed_attachment_drains_output_that_arrived_with_its_failureaccept theprivate 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, andunsupported_peer_verification_fails_without_retryingretain their existingtimeout/closure/authentication assertions and explicitly select ordinary
non-cancellable session behavior.
The fake's
Options,main,parse,serve_clientandboot_consolegain onlyprivate, 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_cratechanges 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/devinventory was also run and retained separately.These are parsed-item counts, not execution counts.