Repository navigation
nvx-rs: delete NVXC v1 and FEATURES (SL4.4d) - #1545
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 104 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 38 more, which the job's summary lists. Test doubles
Relocated unchanged: 0; added: 6. Compared the merge base |
Contributor
There was a problem hiding this comment.
🟢 Approval recommended
No active review issues are recorded for the v2-only protocol cleanup.
No open issues 🎉
What changed in this PR
Completes the NVXC v2 migration for #1129 by removing v1 compatibility code after the host switched to v2. The guest agents and fake OpenVMM now serve only v2, preserving its existing streaming, capture, and restore behavior.
Changes:
- Deletes v1 codecs,
FEATURES,GuestFeatures, and the unused publicGuestFeaturesMissingerror code. - Removes guest and fake-OpenVMM version selection and v1-only output limits.
- Migrates remaining tests to v2, adds v1-rejection coverage, and updates documentation and API snapshots.
| File | Description |
|---|---|
scripts/test-layout-allowlist.json |
Removes the retired v1 test-hook allowance. |
nvx-rs/tests/vm_lifecycle.rs |
Uses v2 frames and versioned readiness replies. |
nvx-rs/tests/vectors/README.md |
Clarifies the retained v1 vectors’ role. |
nvx-rs/tests/cli.rs |
Retires tests using removed feature-advertisement options. |
nvx-rs/src/testing/fake_openvmm/tests.rs |
Adds v1 rejection checks and removes v1-only cases. |
nvx-rs/src/testing/fake_openvmm.rs |
Removes v1 serving paths, feature state, and output caps. |
nvx-rs/src/protocol/tests.rs |
Removes v1 tests while retaining shared payload checks. |
nvx-rs/src/protocol/mod.rs |
Removes obsolete modules and re-exports. |
nvx-rs/src/protocol/features.rs |
Deletes GuestFeatures and its supporting code. |
nvx-rs/src/protocol/exec.rs |
Deletes the v1 output-limit constant. |
nvx-rs/src/protocol/app.rs |
Deletes v1 framing and exit categories; retains shared definitions. |
nvx-rs/src/host/restore/tests/live_init.rs |
Migrates live restore exchanges to v2. |
nvx-rs/src/host/restore/tests.rs |
Removes the live tests’ v1-specific feature gate. |
nvx-rs/src/guest/managed_agent/tests/loopback/tests.rs |
Deletes the v1 helper and output-cap regression test. |
nvx-rs/src/guest/managed_agent/session/tests.rs |
Migrates session checks to v2 readiness and busy replies. |
nvx-rs/src/guest/managed_agent/session.rs |
Uses v2 exclusively for requests and replies. |
nvx-rs/src/guest/managed_agent/mod.rs |
Updates module documentation for v2-only operation. |
nvx-rs/src/guest/managed_agent/exec.rs |
Removes version branches and v1 output-cap handling. |
nvx-rs/src/guest/managed_agent/dispatch/tests/streams.rs |
Adds guest-side v1 rejection coverage. |
nvx-rs/src/guest/managed_agent/dispatch/tests/runtime.rs |
Migrates runtime test traffic to v2. |
nvx-rs/src/guest/managed_agent/dispatch/tests.rs |
Updates the harness and retires v1-only cases. |
nvx-rs/src/guest/managed_agent/dispatch.rs |
Deletes the FEATURES handler. |
nvx-rs/src/guest/init/tests/exec.rs |
Sets discard state directly after helper removal. |
nvx-rs/src/guest/init.rs |
Deletes the unused discard helper. |
nvx-rs/src/error.rs |
Removes GuestFeaturesMissing and its mappings. |
nvx-rs/README.md |
Documents v2-only behavior and revised test coverage. |
nvx-rs/public-api/windows.txt |
Records the removed public error variant. |
nvx-rs/public-api/linux.txt |
Records the removed public error variant. |
doc/usage.md |
Removes the obsolete error-code entry. |
doc/design/4.4-host-guest-control-interface.md |
Describes v2-only protocol behavior without feature negotiation. |
doc/design/4.3-isolation-and-resource-model.md |
Removes the account-feature advertisement reference. |
doc/acceptance-case-matrix.md |
Records the lifecycle test’s migration to v2. |
Review effort: Balanced
Pedro Henrique Penna (ppenna)
force-pushed
the
agents/slim-sl4-4c-nvxc-v2-host
branch
from
November 12, 2026 17:39
d354235 to
0c20546
Compare
Pedro Henrique Penna (ppenna)
force-pushed
the
agents/slim-sl4-4d-nvxc-v1-gone
branch
from
November 12, 2026 18:34
8376448 to
ff40a5c
Compare
Pedro Henrique Penna (ppenna)
force-pushed
the
agents/slim-sl4-4c-nvxc-v2-host
branch
from
November 12, 2026 18:58
0c20546 to
d669945
Compare
Base automatically changed from
agents/slim-sl4-4c-nvxc-v2-host
to
feature/nvx-refactor
November 12, 2026 19:33
Since SL4.4c, every NVX control path speaks NVXC v2, so version 1's frames, its FEATURES request and GuestFeatures were compatibility code that only the guest agents and the fake OpenVMM still served. SL4.4d (#1129) deletes them, and v2 is NVXC's only version. The protocol loses v1's magic and version, APP_FEATURES, the v1 codec (encode_app and decode_app), ExitCategory, GuestFeatures with its module, and MAX_OUTPUT_BYTES, the 1 MiB cap that only v1 applied, with the dead-code markers that SL4.4c left on them. The kind codes and error categories that v2 shares stay, since the guest loop and the fake still name v2's requests and answers with them; their gates narrow to the builds that still use them. The guest loop that nvx-init and the managed agent share decodes v2 alone: a frame of another version fails as a malformed request does, which ends the session with the data-application diagnostic. The session's per-request version, the FEATURES handler, v1's output cap and null standard input, and the BUSY answer to a v1 STOP during an execution go. The discard of an execution's output, which only the cap used, goes with nvx-init's Exec::discard. The fake OpenVMM serves v2 alone: its v1 handler, its output cap, its feature state and the fake_guest_features and fake_legacy_guest tokens go, and a frame of another version ends its session. The guest's dispatch, session and runtime test harnesses speak v2, the tests of v1 alone retire, and new tests show that the guest agent and the fake end the session of a v1 peer. tests/vm_lifecycle.rs and the live restore test speak v2's frames to nvx-init. The protocol's docs, the design of the control interface, the guest-agent guidelines, the vectors' README and the case matrix follow. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
ErrorCode::GuestFeaturesMissing reported a guest image that lacked the control features of NVXC v1's FEATURES request, which SL4.4c stopped sending and the previous commit deletes. Nothing reports the code any longer, so SL4.4d (#1129) deletes it, a public API removal inside leaving code, with its row in the README's and doc/usage.md's tables of codes, and the mention of control features in ErrorKind::Unavailable. The public API snapshots lose the variant. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Pedro Henrique Penna (ppenna)
force-pushed
the
agents/slim-sl4-4d-nvxc-v1-gone
branch
from
November 12, 2026 19:37
ff40a5c to
675b0d9
Compare
Pedro Henrique Penna (ppenna)
marked this pull request as ready for review
November 12, 2026 19:37
Pedro Henrique Penna (ppenna)
merged commit Nov 12, 2026
55f44aa
into
feature/nvx-refactor
91 of 92 checks passed
Pedro Henrique Penna (ppenna)
deleted the
agents/slim-sl4-4d-nvxc-v1-gone
branch
November 12, 2026 20:06
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: NVXC v1's frames, FEATURES and
GuestFeatures, with the fake OpenVMM's v1 handler, 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 #1129 (SL4.4d, "NVXC v1 and FEATURES are gone"). Parent #1089, umbrella #1076.
It needed SL4.4c (#1541), which has merged: it starts from
5715bb6d709, the tip after it. The restack also took in the guest chain (SL6.11b, SL6.11d and SL6.13b), which deleted the managed agent's sandbox mode, so this PR's edits of the agent now apply to its direct mode alone, and one test that the chain added moves to v2 (see Changes to existing tests).What and why
Since SL4.4c, every NVX control path speaks NVXC v2, so v1's frames, its
FEATURESrequest andGuestFeatureswere compatibility code that only the guest agents and the fake OpenVMM still served, some of it under dead-code markers that SL4.4c left for this PR. As SL4.4d's Scope says, this PR deletes them, and v2 is NVXC's only version.The protocol.
protocol/app.rsloses v1'sAPP_MAGICandAPP_VERSION,APP_FEATURES, v1's codec (encode_appanddecode_app) andExitCategory, with SL4.4c'sexpect(dead_code)onExitCategory::parse;protocol/exec.rslosesMAX_OUTPUT_BYTES, the 1 MiB output cap that only v1 applied; andprotocol/features.rs, withGuestFeatures, its constants and SL4.4c's module-levelallow, is deleted. The kind codes,AppFrame,APP_HEADER_LENand the error categories that v2 shares with v1 stay: the guest loop and the fake still translate each v2 request into them, as SL4.4b made them do. Their gates narrow to the builds that still use them (AppFrameandAPP_EXITto the guest's).The guest loop that nvx-init and the managed agent share (
guest/managed_agent/session.rs,exec.rsanddispatch.rs) decodes v2 alone. A frame of another version fails to decode, as a malformed v2 frame does, so the session ends with thedata-applicationdiagnostic. The session's per-request version (v2,v2()andanswer_in) goes, with v1's encoding of answers and a joined activation'sREADYin v1; the dispatch'sFEATUREShandler goes; an execution loses v1's output cap (output_bytes,output_limitedand theoutput-limitending) and v1's null standard input; andSTOPduring an execution no longer checks the version. The discard of an execution's output, which only the cap used, goes withWorkload::discard, and then with nvx-init'sExec::discard(guest/init.rs), which the compiler flags as unused once its last caller goes.The fake OpenVMM (
testing/fake_openvmm.rs) serves v2 alone, as the flagged section below explains.The public error code
ErrorCode::GuestFeaturesMissing, which nothing reports since SL4.4c stopped asking for features, goes in the second commit: it isFEATUREShandling, so this public-API removal stays inside leaving code. The public-API snapshots lose the variant,doc/usage.md's and the README's tables of codes lose its row, andErrorKind::Unavailable's docs stop naming control features.Docs.
nvx-rs/README.md(the layout,nvx::protocol, "Guest protocol", the fake's tokens, the tests and the codes),doc/design/4.4-host-guest-control-interface.md(v1,FEATURESand the output limit go, with Table 4.5; 4.4.2 to 4.4.4 describe v2 alone; and Table 4.2's shutdown ends a running execution first, where v1 shut down only between executions),doc/guest-agent-guidelines.md(below),doc/design/4.3-isolation-and-resource-model.md,nvx-rs/tests/vectors/README.md,doc/usage.mdand the case matrix (vm-lifecycle's row) follow.The guest-agent guidelines (
doc/guest-agent-guidelines.md, from SL7.9) said four things of nvx-init's executions that held only for v1; SL6.10c's review found the first two:busy, aBUSYframe, where they said "withEBUSY", a status thatBUSYdoesn't carry.Not in this PR, as the Scope says: changes to v2's framing, streaming, capture or restore, negotiation or a v1 fallback, cleanups of v2 code that stays, and unrelated guest, host or fake code.
BOOT_CONTRACT_VERSION,CONTROL_CONTRACT_REVISIONand their generated copies stay unchanged.Done when
FEATURESorGuestFeaturescode or caller remains. What still saysFEATURESinnvx-rs/is v2's docs and tests of its refusal, the CPUID leaves of the time code, and the vectors below.guest::managed_agent::dispatch::tests::streams::a_request_of_version_1_ends_the_session(the agent ends the session of v1'sPINGvector, with thedata-applicationdiagnostic andEPROTO) andtesting::fake_openvmm::tests::version_1_requests_end_the_session(the fake closes the connection after v1'sPING, and after v1'sFEATURESin a v2 frame). SL4.4b'sversion_2_has_no_features_requestshows the agent's refusal of the latter, SL4.4c'sready_must_carry_the_protocol_versionthe host's refusal of another version, and SL4.4a'sprotocol::app::v2::tests::malformed_frames_are_refusedthe codec's refusal of v1's frames.FEATURESrequest, so each of them would fail if a host path sent one:tests/cli.rspasses 113 tests on Windows and 123 on Linux, with the rest of the CLI's tests.a_lost_session_is_replaced_with_the_same_activate_message_and_the_live_session_returns, the CLI's restore tests (host::cli::sandbox::lifecycle::start::tests::restore, whose named and one-off restores run their workloads on the session that the restore returns), the guest'srestored_ready_maps_and_first_exec_share_the_existing_start_transition, and every snapshot and restore scenario on MSHV, withsnapshot-coreandsnapshot-tierson WHP: theirsnapshot restore … --entrypointandrun --restore-snapshotrun the workload on that session, thensandbox execruns more.Judgment calls
AppFrameand theAPP_*kinds, so only v1's own items go; renaming that vocabulary would rewrite v2 code that stays.PINGwith a payload (theping-payloaddiagnostic),STOPwith one, andCANCEL's check are the dispatch's own validation of requests that stay, rather than v1 serving paths, so they stay byte for byte, as the Approach asks, though only v1 could reach them: v2's decoder refuses those payloads first. No test reachedping-payloadbefore either. I can delete them here if you see them as v1 code.request.input = truereplacessession.v2()in place, solaunch::direct_requestand its test keep theirinput: false; folding it in would rewrite v2 code that stays.Exec::discardgoes with the cap:Workload::discard, which only the cap called, was its last caller, and Clippy flags it once that goes.tests/vectors/nvxc-v1.txtstays unchanged, since its README's rule is that a vector changes only with a protocol version. v2's tests read itsPINGframe as the refused v1 peer, itsEXECandMAPSpayloads, which v2 carries unchanged, and itsNVXSrecords; its frames and its features payloads have no codec any longer, as the vectors' README and the README now say.live_restored_init_activationstays ignored. I moved it to v2's frames, with the rest ofhost::restore::tests::live_init, whose gate returns toclinow that it needs no v1 code; it compiles, and its other tests pass, but it needs SL7.7b's hand-made snapshot and named host admission, which no script provides, so it did not run; the restore scenarios cover its path.The fake OpenVMM (flagged, as the Scope asks)
Production (
testing/fake_openvmm.rs), all of it v1 orFEATUREShandling:Session::requestdecodes v2 alone: a frame of another version decodes to nothing, so the session ends, as a malformed record ends it.Request::Apploses its version flag,Sessionitsv2state, andsendits v1 encoding.FEATUREShandler goes, withGUEST_FEATURES, theguest_featuresandlegacy_guestoptions, and theirfake_guest_featuresandfake_legacy_guesttokens, which only v1'sFEATURESanswer read. AFEATURESrequest, now a kind that v2 doesn't have, ends the session.forward, which counted output againstMAX_OUTPUT_BYTES, gives way tosend, and theoutput-limitending with it.exittakes v2'sOutcomein place ofExitCategory, through whose mapping each v2 ending already passed unchanged, so everyEXITthat the fake sends keeps its bytes.STOPandCANCELno longer check the version, a refusal no longer swaps the version of its answer, and a workload's standard input no longer ends at once, as v1's did.Tests (
testing/fake_openvmm/tests.rs):the_current_guest_advertises_every_required_featureretires withFEATURES,version_2_workloads_send_output_past_the_cap_of_version_1loses its v1 half, andversion_1_requests_end_the_sessionis new.Size
Measured: 90 core lines by #1076's rule (95 counting gate-only lines), in 5 counted files (estimate 0 and 5; leaving code has no limit):
testing/fake_openvmm.rs39,guest/managed_agent/session.rs36,guest/managed_agent/exec.rs11,protocol/mod.rs2 andguest/managed_agent/dispatch.rs2. Each line is code around a deleted v1 branch, state or name that the deletion forces: v2 paths that lose their version check or nesting,sendcalls in place offorward, and import and re-export lists that lose the deleted names.protocol/app.rsonly narrows the gates of what stays (3 lines, withprotocol/mod.rs's 2 forAPP_EXIT) and loses v1's items;error.rs,guest/init.rsandprotocol/exec.rsonly lose code;guest/managed_agent/mod.rschanges only docs; andprotocol/features.rsis deleted; so they don't count, nor do tests, docs, the vectors' README, the case matrix, the allowlist and the snapshots. The estimate's 0 core lines counted the deletions only.Validation
The gates that the orchestration checkout's
local_gates.py --filesselects for these files (the adapter gates don't exist onfeature/nvx-refactor), run from this branch's own action definitions, with Rust 1.95.0. This head,675b0d9b3fa, has the tree of59dea76bbf0, the restack that I resolved and validated before SL4.4c merged, on SL4.4c's pre-merge headd66994591e9, whose commits merged unchanged. Before the restack, the same gates, the MSHV default suite and the WHP scenarios passed ate316b6386c5throughff40a5c22d7, which differed among themselves only in docs.59dea76bbf0cargo fmt --all --check;cargo clippy --locked … -- -D warningsin 22 configurations: on the host,--all-targets --all-features,--lib,--lib --no-default-featuresalone and withserde,--lib --binswithcliand withtesting, and--all-targetswith the defaults,cli,testingand no default features; forx86_64-unknown-linux-gnu,--all-targetswith all features, the defaults, no default features,cli,testing,guest,guest,testing,cli,guestandcli,testing; forx86_64-unknown-linux-musl,--all-targetsand--lib --binswithguest59dea76bbf0cargo test --locked:--all-features, the defaults,--lib --no-default-features, and--libwithclialone and withtestingalone;cargo build --lib --no-default-features; the ignoredopenvmm_vectorsandopenvmm_cpu_profilestests;RUSTDOCFLAGS="-D warnings" cargo doc --all-features;cargo +1.89 check --all-targets --all-features;public_api.py;check_test_layout.py;check_markdown_links.py; the case-matrix check (check_matrix.py … 99d2022085f)tests/cli.rs113 and the other targets; the defaults' lib 687; 191; 1038 and 221; 3 and 1; the snapshots match59dea76bbf0-D warningsin 12 configurations,check-nvx-rs's six (--all-targets --all-features,--lib,--lib --no-default-featuresalone and withserde, and--lib --binswithcliand withtesting) and--all-targetswithguest,guest,testing,cli,guest,cli,testing,testingandcli;cargo testwith--all-features, the defaults, and--libwithout default features, withguest, withtestingand withcli;cargo build --lib --no-default-features; doc; MSRV; theaarch64-apple-darwincheck;public_api.py;check_test_layout.py;nvx.py check-guest-binaries --toolchain 1.95.0(the musl Clippy and tests),build-guest-binariesandtest-guest-binariestests/cli.rs123 and the other targets; the defaults' lib 682; 191; 855; 224; 1027; the musl lib 855; the guest binaries' 33nvx.py test-microvm --backend mshv: the default suite, every scenario butsmp-lapic, with 1, 2, 4 and 8 processors, andnvx-rsbuilt from this head. Its Alpine initramfs, which holds the guest agents, came fromnvx.py build-initramfs --guest alpineat this head (61a8f86e…), with CI run 43281528285's kernel and Ubuntu distro layer, fromc0cf126efa2, whose kernel configuration this head keeps, and the scratch template and musl OpenVMM (14dc4116ec7, this base's pin) staged before, each checked by SHA-256 against its provenance, the layer's manifest, or the CI downloadsandbox-lifecycle'sexecstreamed all 2 MiB with anexitoutcome),managed-lifecycle,vm-lifecycle, structured outcomes, workload identity, and every snapshot and restore scenario. A first attempt reused a releasenvx-rsthat an earlier run had built from older sources, whosesnapshot capturehas no--net, whichuntiered-network-policycaught; this run built it from this headnvx.py test-microvm --backend whp: the public sandbox and snapshot scenarios (sandbox-lifecycle,managed-exec-config,sandbox-proxy-only,sandbox-ram-upper,sandbox-gpt-layer,snapshot-core,snapshot-tiersandvm-lifecycle) andmanaged-lifecycle, withnvx-rsbuilt from this head, that initramfs (copied from MSHV), the same kernel, distro layer and scratch template, and CI run 43185976865's Windows OpenVMM, whose provenance matches 43281528285's, each checked by SHA-256 on the hostsandbox exec, andsandbox-lifecycle'sexecstreamed all 2 MiBNot run: Linux/KVM, since one Linux backend runs the suite, and
live_restored_init_activation(see the judgment calls). CI run 43292063425 ran the full matrix at this head and passed: 33 jobs, with the microVM shards, the guests and sandboxes, and the platform jobs on Linux/MSHV, Linux/KVM and Windows/WHP, and the debug kernel on MSHV. It skipped 9 jobs by design: publishing, performance records and the merge-group canceller, which onlydevand merge groups run, OpenVMM's CI of the pinned revision, which this PR doesn't move, and the debug kernel on KVM and WHP.A code-review subagent reviewed the whole diff; its one finding, that the README overstated what the vectors cover, is fixed.
Changes to existing tests
check_test_changes.py --base origin/feature/nvx-refactorlists 104 changes: 88 to test code and 16 to the fake OpenVMM, plus 6 additions. Each kept test checks what it checked, through v2, unless this list says otherwise.FEATURES:protocol::tests:frames_match_their_vectors(v1's codec),features_match_their_vectors,the_host_requires_every_feature,exit_categories_match_the_guest_agent(ExitCategory),guest_features_report_what_a_guest_lacks,guest_features_use_distinct_bits,feature_definitions_keep_their_wire_values(its pin ofAPP_MAPSmoves torecord_definitions_keep_their_wire_values),both_agent_modes_announce_the_host_mapping_tableandlayered_sandboxes_need_per_execution_environments_and_mapping_tables, with the helpersframe_kindandGuestFeatures' test impl (REQUIREDandcontains), and the test hook ofExitCategory::parse.guest::managed_agent::dispatch::tests:agent_advertises_the_control_features_of_its_mode_and_stops(FEATURES) andoutput_beyond_the_cap_ends_the_workload_after_the_reads_that_fit(v1's cap).guest::managed_agent::session::tests::joined_activations_get_ready_in_their_own_versions, since aREADYhas one version now.guest::managed_agent::tests::loopback::tests::output_limit_forwards_nothing_after_the_cap, with its helperrun_exec_v1, which SL4.4c kept until this PR.testing::fake_openvmm::tests::the_current_guest_advertises_every_required_feature.tests/cli.rs'sstarts_ask_the_guest_for_no_features, which started guests that advertised no features (fake_guest_features=0) or refused the request (fake_legacy_guest=1): those tokens go with the fake's feature state, and every fake-backed CLI test now shows what it showed, since the fake ends the session of aFEATURESrequest.agent_refuses_feature_payloads_and_unannounced_mapping_tablesisagent_refuses_unannounced_mapping_tables, andversion_2_serves_ping_and_the_mapping_table_beside_version_1isversion_2_serves_ping_and_the_mapping_table;version_2_workloads_send_output_past_the_cap_of_version_1(the fake's) keeps its name and loses its v1 half.Harness::send,next_responseandresponses) frames requests in v2 and reads v2's answers, withoutREADY's version byte; the runtime tests'receive,prelaunch_terminationandonly_stdout_prefix, and the session tests'Peer::app,activate_bytesandqueue, do too (Peer::sendgives way tosend_v2). The tests that use them keep their names and checks:data_validation_diagnostics_preserve_the_c_failure_stage_and_status,refused_records_report_the_stage_at_which_the_c_agent_reported_them,data_before_the_first_reset_is_a_type_that_the_agent_does_not_take_yet,data_at_the_last_sequence_number_is_out_of_sequenceanda_stream_that_ends_reports_a_read_failure_inside_a_record_or_not(dispatch), the threeprivileged_layered_runtime_*tests (runtime),a_version_2_execution_forwards_output_past_the_old_cap(streams), anda_replacement_session_joins_one_activation_and_caches_ready_without_reapplying,changed_record_or_workload_bytes_during_application_fail_without_ready,an_unread_output_stream_cannot_extend_the_activation_deadline,capture_refuses_active_execution_without_kill_and_validates_the_existing_flagandrestored_capture_consumes_reset_and_acknowledges_the_existing_connection(session).BUSY. v2 refuses a request during an execution withBUSY, where v1 sent anERRORofEBUSY, soa_control_failure_after_a_lost_status_does_not_wait_again,a_lost_status_keeps_its_outcome_through_a_later_cancellation_or_timeout,a_running_workload_refuses_other_requests_and_ends_when_cancelled_or_lateand the session tests that refuse a request expect it.a_request_that_fails_after_validation_reports_the_data_stagesent v1'sSTOPwith a payload, which v2's decoder now refuses before validation ends, so it sends a restored agent'sACTIVATE, whose record fails to decode after the frame passes;direct_endings_do_not_wait_for_an_escaped_descendant_to_close_outputloses itsoutput-limitcase, and the flood that drove it, with v1's cap.guest::managed_agent::session::tests::a_failed_restored_activation_gives_init_the_status_of_its_class, which9dece3077caadded while v1 still ran, sends a request while a restored activation applies its record, to show that it fails the activation as the protocol's failure, with that class's status. It sent v1'sPING, through the session tests'Peer::send, which goes with v1; it now sends v2's, and still checks that the activation fails withEPROTOandACTIVATION_PROTOCOL.protocol::tests:capture_requests_round_trip_both_kill_flagsandactivate_requests_round_trip_records_and_workload_identitycheck their payloads without v1's frames;decoders_reject_malformed_inputkeeps the outer header's half and loses its gate;record_definitions_keep_their_wire_valuesdropsAPP_VERSIONand gainsAPP_MAPSand, in guest builds, the codes ofAPP_CAPTURE,APP_ACTIVATEandAPP_EXIT;exec_extension_keeps_its_wire_valuesdropsMAX_OUTPUT_BYTES.host::restore::tests::live_initspeaks v2's frames to nvx-init (itsACTIVATEandCAPTUREconstants give way to v2's encoder) and sendsSTDIN_ENDafter theEXEC, and its gate returns tocli;tests/vm_lifecycle.rs'sframeandacknowledgedsend v2'sPINGandSTOPand expectREADYto carry version 2, which the case matrix'svm-lifecyclerow now says.guest::init::tests::exec::ending_failures_are_reported_and_discarding_preserves_the_first_causesets the discard flag directly, sinceExec::discardgoes.protocol/app.rs, SL4.4c'sexpectonExitCategory::parse, goes (check_test_layout.py --tighten).