Repository navigation
nvx-rs: serve NVXC v2 in the guest loop and the fake OpenVMM (SL4.4b) - #1531
Pedro Henrique Penna (ppenna) merged 3 commits into
Conversation
This pull request changes existing testsIt modifies or removes 35 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
Test doubles
Relocated unchanged: 0; added: 41. Compared the merge base |
There was a problem hiding this comment.
🟡 Changes recommended
The fake can block control requests under output backpressure and hang timed cat executions, while mixed-version activation retries can send READY responses using the wrong protocol version.
3 open issues
What changed in this PR
This PR adds NVXC v2 serving to the shared guest loop and fake OpenVMM, building on the codec from #1528. It implements the server-side portion of #1128 while retaining v1 for the later host migration.
Changes:
- Adds streamed stdin, write acknowledgements, uncapped output, and guest-side output backpressure.
- Adds v2 request handling, execution cancellation and stopping, plus fake workload input through
cat. - Adds streaming tests and updates protocol feature gates and documentation.
| File | Description |
|---|---|
| scripts/test-layout-allowlist.json | Removes the obsolete codec allowance. |
| nvx-rs/src/testing/fake_openvmm/tests.rs | Tests v2 input, output, and execution control. |
| nvx-rs/src/testing/fake_openvmm.rs | Adds v2 serving and the cat command. |
| nvx-rs/src/protocol/mod.rs | Gates v2 exports for server users. |
| nvx-rs/src/protocol/app/v2.rs | Documents server-side streaming semantics. |
| nvx-rs/src/protocol/app.rs | Updates codec gates and removes dead-code suppression. |
| nvx-rs/src/guest/sys/poll.rs | Adds writable-descriptor polling. |
| nvx-rs/src/guest/sys/mod.rs | Re-exports the new polling helper. |
| nvx-rs/src/guest/managed_agent/session/tests.rs | Adapts tests to decoded request variants. |
| nvx-rs/src/guest/managed_agent/session.rs | Adds version-aware framing and queued writes. |
| nvx-rs/src/guest/managed_agent/mod.rs | Documents v2 guest behavior. |
| nvx-rs/src/guest/managed_agent/exec.rs | Implements streamed input, backpressure, and v2 stopping. |
| nvx-rs/src/guest/managed_agent/dispatch/tests/streams.rs | Adds guest streaming and compatibility tests. |
| nvx-rs/src/guest/managed_agent/dispatch/tests/runtime.rs | Adapts runtime helpers to execution interfaces. |
| nvx-rs/src/guest/managed_agent/dispatch/tests.rs | Registers the streaming tests. |
| nvx-rs/src/guest/managed_agent/dispatch.rs | Enables nonblocking control I/O and handles execution stops. |
| nvx-rs/README.md | Documents v2 servers and feature gates. |
Review effort: Balanced
c6a68e5 to
beb8611
Compare
eda49e1 to
927dce9
Compare
The managed agent's loop waits on its control console and on an execution's pipes with readable_or_hung_up, which polls each descriptor for input or hangup. Serving NVXC version 2 (SL4.4b, #1128) needs that wait to cover descriptors that the agent writes too: the console while records wait in its send queue, and an execution's standard input while bytes wait to enter its pipe. sys::ready polls each descriptor for input or hangup, or, where its flag is set, for space to write, and returns whether each one woke, in the caller's order. readable_or_hung_up is ready with every flag clear, so its callers keep their behavior. Part of #1128 (SL4.4b). Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
beb8611 to
c935635
Compare
There was a problem hiding this comment.
🟡 Changes recommended
The current queue ordering can indefinitely starve STDIN_ACK under continuous output, exhausting the host’s stdin window even while it continues reading output.
1 open issue
3 resolved since last review
Review effort: Balanced
NVXC v2's codec (SL4.4a) has no serving peer, so no host can stream an execution's input and output. SL4.4b (#1128) has the guest loop that nvx-init's layered roots and the managed agent share serve v2 beside v1, on nvx-init's plain-process core. The session decodes a request of either version, and answers it in its version. v2 keeps v1's header and the codes of the kinds that both have, so PING, EXEC, MAPS through the MappingTable, CAPTURE, ACTIVATE, CANCEL and STOP reach the existing handlers, in their existing order, and only their framing changes: READY carries the protocol version, the busy refusal is BUSY, and EXIT names v2's outcome. STDIN and STDIN_END feed the running execution's standard input. FEATURES, which v2 lacks, fails to decode, as any malformed frame does. ACTIVATE requests that join one activation each get READY in their own version, and STDIN or STDIN_END while the activation's record applies fails it, as any other request does. An execution of v2 runs alone: as in v1, a second EXEC gets BUSY, as does any request but its CANCEL and nvx-init's CAPTURE and ACTIVATE, which keep their handling. Its workload reads a pipe, into which each turn of the loop writes what STDIN sent, as the pipe takes it, and acknowledges with STDIN_ACK what it wrote, and which it closes once STDIN_END came and every byte went in. Bytes beyond the 64 KiB window, or after the end, end the session, as a malformed request does, and bytes that a closed pipe never took stay unacknowledged. Its output has no cap, and each turn reads at most one chunk of it, so that its output cannot keep the loop from serving control requests. A STOP of v2 cancels it, so that its EXIT reports the cancellation before STOPPED, and the session ends; a RESET abandons that STOP with the rest of the earlier epoch's work, and a STOP of v1, or during an execution of v1, still gets BUSY. STDIN and STDIN_END of an execution that ended get no answer, as its CANCEL gets none. While an execution of v2 runs, the session streams: its records go through a send queue, which never waits for the console, so that the agent keeps serving CANCEL, STOP and STDIN while the host does not read, and the loop polls the console writable while the queue holds bytes. While the queue holds 64 KiB, the loop reads none of the workload's output, which then waits on its pipes, and holds back STDIN_ACK, which acknowledges before EXIT what the pipe took meanwhile. Each turn sends what the console takes of the queue before it acknowledges input, and reads output only then, so that output cannot starve the acknowledgements. A RESET sends the queue before its ACK, and the EXIT, the first record sent without streaming, waits until the console took the queue and itself. The control descriptor is nonblocking in every session, as nvx-init's was, so the session's reads and writes always poll. v1 stays as it was, FEATURES and its output cap included. The codec's expect(dead_code) now covers only the builds without the guest loop, and names the fake OpenVMM and SL4.4c's host. dispatch::tests::streams covers v2's PING, MAPS through the table, STOP, capture and activation, beside v1 on one session; the absence of FEATURES; BUSY, CANCEL and STOP during an execution; input that cat reads until its explicit end, with acknowledgements that follow its writes; a workload that never reads its input, which leaves exactly the window unacknowledged, and a byte beyond it that ends the session; output past v1's cap; and a host that reads nothing, while which the workload waits on its pipes and a CANCEL still ends it. session::tests covers ACTIVATE requests of both versions that join one activation, and STDIN while the record applies; it and dispatch::tests::runtime take the session's request type. Part of #1128 (SL4.4b). Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
The CLI's integration tests run against the fake OpenVMM, which served only NVXC v1, so SL4.4c could not switch them to v2. SL4.4b (#1128) has the fake serve v2 beside v1, with the guest loop's observable behavior. The fake decodes a request of either version and answers it in its version: READY carries the protocol version, the busy refusal is BUSY, and EXIT names v2's outcome, while PING, EXEC, MAPS and STOP keep their handling. A workload of v2 runs alone, and another EXEC gets BUSY, as other requests do while it runs, each refusal in the version of the request that it refuses. Its output has no cap. Its standard input is what STDIN frames sent, which the fake holds until the workload reads it, and acknowledges as it does, until STDIN_END: the new script command cat copies it to standard output until its end, or until the workload's timeout. More than the 64 KiB window unacknowledged, or input after its end, ends the session. A STOP while the workload sleeps or reads its input ends it with the cancelled outcome, and the fake acknowledges the STOP and stops, unless fake_ignore_stop=1 ignores the STOP, as between workloads, or fake_drop_stop=1 closes the connection after the EXIT without the acknowledgement. STDIN and STDIN_END of a workload that ended get no answer. A workload of v1 reads no input and keeps its 1 MiB cap, and FEATURES and GuestFeatures stay v1's alone. With both servers in place, the codec is gated by the features of its users, testing and guest on Linux x86-64, so its expect(dead_code) and its seam in the test-layout allowlist go, and cli builds it again once SL4.4c's host speaks it. The codec's docs say what NVX's peers do with an execution of v2, and the README which programs serve it. The fake's tests, on Unix, drive its control session over a socket pair: cat's input until its explicit end, with an acknowledgement of each read, a cat that waits for input until its timeout, and a byte beyond the window that ends the session; output past v1's cap, which v1 still caps on the same session; and BUSY, CANCEL and STOP while a workload runs. Part of #1128 (SL4.4b). Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
c935635 to
23bf183
Compare
2216377
into
feature/nvx-refactor

Part of #1128 (SL4.4b, "nvx-init and the fake VMM serve NVXC v2"). Parent #1089, umbrella #1076.
Was stacked on #1528 (SL4.4a), which merged as
992164142d8: this PR is rebased ontofeature/nvx-refactorat that commit, and shows only its own three commits (see "Rebase", below).What and why
SL4.4a's NVXC v2 codec has no serving peer, so no host can stream an execution's input and output. As SL4.4b's Scope says, this PR has the guest loop that nvx-init and the managed agent share, and the fake OpenVMM, serve v2 beside v1, alike: one execution at a time, with
BUSYfor a secondEXEC;CANCELandSTOPwhile it runs; standard input with an explicit end, acknowledged only once its bytes entered the child's pipe, with at most 64 KiB unacknowledged; output without a total cap, which the guest stops reading while its send queue is full; andPING,MAPSthrough theMappingTable, capture and activation over v2, in their existing order. Every host path still speaks v1, which both servers keep serving unchanged,FEATURESandGuestFeaturesincluded, until SL4.4c switches the host and SL4.4d deletes v1.Each request in its own version (
guest/managed_agent/session.rs).Session::accept_requestdecodes a request of either version, by its header's version byte, and the session answers it in that version. v2 keeps v1's header and the codes of the kinds that both have, so a v2PING,EXEC,MAPS,CAPTURE,ACTIVATE,CANCELorSTOPreaches the existing handler, through the same order of capture and restore, and only its framing changes:send_appencodesREADYwith the protocol version (and, afterACTIVATE,ReadyActivation's bytes), thebusyrefusal asBUSY, andEXITwith v2's outcome (exit,signal,timeout,cancelled, otherwisefailed).STDINandSTDIN_ENDcome back asRequest::Stdin.ACTIVATErequests that join one activation each getREADYin their own version, and aSTDINorSTDIN_ENDwhile a restored activation's record applies fails the activation, as any request butACTIVATEdoes since #1515. A v2FEATURESfails to decode, as any malformed frame does.One execution, its input and its output (
guest/managed_agent/exec.rs,dispatch.rs). nvx-init's plain-process core runs a v2 execution with a pipe on its standard input; no second engine or multiplexer comes in:EXECgetsBUSY, as does any request but the execution'sCANCELand nvx-init'sCAPTUREandACTIVATE, which keep their handling. A v2STOPcancels the execution: itsEXITreportscancelled, thenSTOPPEDfollows, and the session ends. ASTOPof v1, or during an execution of v1, still getsBUSY, and aRESETabandons theSTOPwith the rest of the earlier epoch's work.Inputkeeps whatSTDINsent until the pipe takes it: each turn of the loop writes what the pipe takes without blocking, acknowledges it withSTDIN_ACK(bytes written since the previous acknowledgement), and closes the pipe onceSTDIN_ENDcame and every byte went in. Bytes beyond the 64 KiB window, or after the end, end the session, as a malformed request does; bytes that a closed pipe never took stay unacknowledged.Backpressure (
session.rs,exec.rs,guest/sys/poll.rs). While a v2 execution runs, the session streams: its records go through a send queue that never waits for the console, so that the agent keeps servingCANCEL,STOPandSTDINwhile the host reads nothing, and the loop polls the console writable while the queue holds bytes (sys::ready, which also polls the child's stdin for writing). While the queue holds 64 KiB, the loop reads none of the child's stdout or stderr, which then wait on their pipes, and holds backSTDIN_ACK, which it sends beforeEXITfor what the pipe took meanwhile. ARESETsends the queue before itsACK, and theEXIT, the first record sent without streaming, waits until the console took the queue and itself. The control descriptor is now nonblocking in every mode, as nvx-init's layered session already made it, so the session's reads and writes always poll; v1's behavior doesn't change.The fake OpenVMM (
testing/fake_openvmm.rs) serves the same v2 behavior: it answers each request in its version; a v2 workload runs alone, with each refusal in the refused request's version, and has no output cap; its standard input is whatSTDINsent, which the new script commandcatcopies to standard output, and which the fake acknowledges ascatreads it, untilSTDIN_ENDor the workload's timeout; more than the window unacknowledged, or input after its end, ends the session; a v2STOPwhile the workload sleeps or reads ends it withcancelled, thenSTOPPED, unlessfake_ignore_stop=1ignores it orfake_drop_stop=1closes the connection after theEXIT. A v1 workload reads no input and keeps its 1 MiB cap;FEATURESandGuestFeaturesstay v1's alone.Docs. The codec's module docs say what NVX's peers do with a v2 execution, the managed agent's module docs and
nvx-rs/README.md'snvx::protocolsection which programs serve v2, and the fake's module docs its v2 behavior andcat.Not in this PR, as the Scope says: switching the host or the CLI's tests to v2 (SL4.4c), deleting either server's v1,
FEATURESorGuestFeatures(SL4.4d), more than one concurrent execution, a total output limit, dropping output or reading through a full send queue, and any change to capture or restore sequencing.BOOT_CONTRACT_VERSIONandCONTROL_CONTRACT_REVISIONstay unchanged: neither #1076 nor #1128 asks v2 to bump them. Everything is crate-private, so the public-API snapshots don't change.Judgment calls
STOPduring a v2 execution cancels it and answersSTOPPEDafter itsEXIT, so the host sees how the execution ended before the session does.STDINandSTDIN_ENDof an execution that ended are dropped, as its lateCANCELis in v1, since the host can't know that theEXITcrossed them.mod v2compiles wheretestingorgueston Linux x86-64 does, like SL6.12's gates, so itsexpect(dead_code)and its seam inscripts/test-layout-allowlist.jsongo now, rather than when SL4.4c adds the host; SL4.4c addscliback to the gate with the host's use. (Acli-only build doesn't compile the codec or its tests meanwhile;--all-featuresandtestingbuilds run them.)Rebase
Rebased from
beb8611de91ontofeature/nvx-refactorat992164142d8(SL4.4a's merged commit, whosenvx-rspatch is the one that this PR was stacked on), with these resolutions:Workload's input methods lose their sandbox arms,launchopens the input pipe of every v2 execution, and the judgment call about that mode's input is gone. The module docs say "It also serves", as one mode remains, andexec.rsno longer importsFileDescriptor.ACTIVATEcomes while its record applies. A v2STDINorSTDIN_ENDthere now does the same, rather than ending the session withEPROTOalone;session::tests::standard_input_while_the_record_applies_fails_the_activation_as_the_protocols_failurecovers it, and restore: report the attribution of a restore that fails in its guest (SL5.1d) #1515'sa_failed_restored_activation_gives_init_the_status_of_its_classtakes the session's request type.Harness::new(),Harness::with_system(system, n),AgentConfig::for_test(),HostMappings::announced(n)), whichdispatch::tests::streamsnow uses.output_beyond_the_cap_ends_the_workload_after_the_reads_that_fitis untouched. Thestreamstests don't rely on a pipe that their workload can grow: the output test'shead -conly checks the total, the backpressure test's 6.9 MB ofseqoutput outgrows any pipe, and the window test's input pipe is the agent's own.Size
Measured: 460 core lines, 454 by #1076's rule, and 5 counted files (estimate 450 and 5; stop at 600), counting the added or changed lines that are neither blank nor comments:
guest/managed_agent/exec.rs139,guest/managed_agent/session.rs135,testing/fake_openvmm.rs135,guest/managed_agent/dispatch.rs26 andguest/sys/poll.rs18.protocol/mod.rs's 6 lines gate re-exports by the features that use them, andprotocol/app.rsonly regatesmod v2, so neither counts;guest/sys/mod.rsaddsreadyto its re-exports (1 line, in both totals). Tests, docs and the allowlist don't count.Validation
After the rebase. At
c935635d361, the rebased head before the fix for Copilot's last comment:nvx-rsonubuntu-latestandwindows-latest, the musl and MSVC binaries, the guest artifacts, the microVM tests on KVM (guests and sandboxes, both shards), MSHV (the same and the debug kernel) and WHP (guests and sandboxes, both shards), the packages, the platform tests on all three backends, and the performance gate.check_matrix.py, andcheck_test_changes.py --base origin/feature/nvx-refactor.guest1033,testing225; the muslcheck-guest-binaries1117 and the guest binaries' 33 tests; doc, the public API (no change), MSRV and macOS.--features bundledis gone with SL6.6a.At this head,
23bf183219f, which only movessend_queuedbeforeInput::writeinexec::run: each commit passedcargo fmt --check, the Clippy matrix below, now also forx86_64-unknown-linux-muslwithguest, andcheck_test_layout.py; the MSHV gates passed again (the area's tests 229, all features 2205, the defaults 726, no default features 190,guest1032,testing225, the muslcheck-guest-binaries1118 and the guest binaries' 33 tests, with every Clippy, doc, the public API, MSRV and macOS); and CI run 43260539653 passed the same 33 jobs, with the same 9 skipped.Before the rebase, at
beb8611de91oneda49e156dc, SL4.4a's head then: the gates that the orchestration checkout'slocal_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 andNVX_BUNDLE=skip. Each commit also passed alonecargo clippy --locked -- -D warningsfor Windows (--all-targets --all-features,--lib --binswithtesting,--lib --no-default-features) and forx86_64-unknown-linux-gnu(--all-targetswith all features and withguest,testingandclialone;--lib --binswithguest,testingandcli,guest), andcheck_test_layout.py.cargo fmt --all --checkcargo clippy --locked -- -D warnings:--all-targets --all-features,--lib,--lib --no-default-features,serdealone,--lib --bins --features cli,--lib --bins --no-default-features --features testing;--all-targets --all-featuresforx86_64-unknown-linux-gnu, and--all-targets --no-default-features --features guestforx86_64-unknown-linux-muslcargo test --locked --all-features/cargo test --locked/cargo build --locked --lib --no-default-features/cargo test --locked --lib --no-default-features/--lib --no-default-features --features testingRUSTDOCFLAGS="-D warnings" cargo doc --locked --no-deps --all-features;cargo +1.89 check --locked --all-targets --all-featurescheck_test_layout.py,check_markdown_links.py, validate-nvx'spython -m compileall -q scripts,python -m unittest scripts/test_*.py ...,test_adversarial.py,test_hosts.py,nvx.py test-microvm --helpcheck_matrix.pyagainst99d2022085f;check_test_changes.py --base eda49e156dccargo test --locked --all-features --lib -- guest::managed_agent testing::fake_openvmm protocol::app guest::sys::poll guest::initcargo fmt --all --check;cargo clippy --locked -- -D warningswith--all-targets --all-features,--lib,--lib --no-default-features,serde,--lib --binswithcliand withtesting, and--all-targetswithguest,guest,testingandcli,guestcargo test --locked:--all-features, the defaults,--lib --no-default-features,--lib --no-default-features --features guest,--lib --no-default-features --features testing; the bundled-artifacts testRUSTDOCFLAGS="-D warnings" cargo doc;python3 scripts/public_api.py;cargo +1.89 check --all-targets --all-features;cargo check --all-targets --all-features --target aarch64-apple-darwinnvx.py check-guest-binaries --toolchain 1.95.0(musl Clippy and tests),build-guest-binaries,test-guest-binaries;check_test_layout.py--no-default-features(246),testing(281), bundling (21), the guest binaries' build and their 33 tests, and the layout pass.--all-featuresfails 33 tests,guestalone 7, and the muslcheck-guest-binariesthe same 7. The base,eda49e156dc, fails the same 28 and 7 on this host, where ending a process group fails withEINVALon kernel 6.6 (nvx-init: cannot end ProcessGroup: Invalid argument); the other 5 are this PR'sstreamstests that start a child, which fail the same way there and pass on MSHV.nvx.py test-microvm --backend kvm, and--backend mshv: the default suite, every scenario butsmp-lapic, with 1, 2, 4 and 8 processors, v1 on every host path. Its Alpine initramfs came fromnvx.py build-initramfs --guest alpinewith this head's nvx-init and managed agent (the same199b01e7…on both hosts), with a static muslnvx-rsbuilt from this head, and CI run 43185976865's kernel, Ubuntu distro layer, scratch template and OpenVMM (14dc4116ec7, this base's pin), checked by SHA-256A code-review subagent reviewed the whole diff. I folded its valid findings: a
STOPcounts only during a v2 execution, aRESETabandons it, the input that the pipe took while the queue was full is acknowledged beforeEXIT, a v2 execution reads one output chunk a turn, and the fake honorsfake_ignore_stopandfake_drop_stopwhile a workload runs and refuses in the request's version. Its remaining finding, v2 input in the agent's sandbox mode, is a judgment call above. Copilot's review found three issues: I fixed two, theREADYs of joinedACTIVATEs of mixed versions and acatthat ignored its timeout, and answered the third, a send queue in the fake, in its thread. Its review of the rebased head found one more, output that could starveSTDIN_ACKwhile the queue was full, which I fixed.I ran no microVM on WHP locally: nothing here is specific to Windows or a backend, and the guest code is the same on every backend; CI's runs cover WHP, as run 43254720952 did.
Changes to existing tests
python scripts/check_test_changes.py --base origin/feature/nvx-refactor(this PR's base, which holds SL4.4a's codec) reports 35 changes to existing tests, 41 added test items and none relocated unchanged, so this PR carries thetests-modifiedlabel:protocol::app::v2::tests, its module, imports, helpers and tests): their code is unchanged, and they now compile wheretesting, orgueston Linux x86-64, does, rather than also withclialone (Judgment calls, above).guest::managed_agent::session::tests'sa_replacement_session_joins_one_activation_and_caches_ready_without_reapplying,changed_record_or_workload_bytes_during_application_fail_without_ready,failed_application_never_reports_ready_or_admits_root_dependent_work, restore: report the attribution of a restore that fails in its guest (SL5.1d) #1515'sa_failed_restored_activation_gives_init_the_status_of_its_classand the helperqueue, anddispatch::tests::runtime's helperprelaunch_termination, matchRequest::Appwhere they unwrapped the frame, andprelaunch_terminationpassesexec::run's newstopargument. Their assertions don't change.testing::fake_openvmm, which the Scope names):Sessiongains the session's version, the workload's standard input and a v2STOP, andignore_stop;sendencodes v2 frames,requestdecodes either version,runanswers in the request's version and acknowledges aSTOPthat ended a workload,interrupttakesSTDIN,STDIN_ENDandSTOP,exec_scriptrunscat,exitsends v2's outcome,forwardcaps only v1's output, andserve_clientsets up the new fields.scripts/test-layout-allowlist.jsontightensnvx-rs/src/protocol/app.rsfrom 1 seam to none, since theexpect(dead_code)hook goes.guest::managed_agent::dispatch::tests::streams(Linux):version_2_serves_ping_and_the_mapping_table_beside_version_1,version_2_has_no_features_request,version_2_carries_capture_and_activation_with_their_payloads,a_version_2_execution_takes_its_input_until_its_end_and_acknowledges_what_it_wrote,a_version_2_execution_never_has_more_than_the_window_unacknowledged,a_version_2_execution_runs_alone_and_ends_on_cancel_or_stop,a_version_2_execution_forwards_output_past_the_old_capandthe_agent_reads_no_output_while_its_send_queue_is_full, with their helpers;guest::managed_agent::session::tests'sjoined_activations_get_ready_in_their_own_versionsandstandard_input_while_the_record_applies_fails_the_activation_as_the_protocols_failure, with the peer'ssend_v2;testing::fake_openvmm::tests(Unix,cli):version_2_workloads_read_their_input_until_its_end_under_the_window(which also times out acatthat waits for input),version_2_workloads_send_output_past_the_cap_of_version_1andversion_2_workloads_run_alone_and_end_on_cancel_or_stop, with theirHost,Reply,scriptandtimedhelpers.Every old test of the area is kept: the guest loop's (
dispatch::testsand itsruntimemodule,session::tests, the managed agent's loopback tests), the fake's and the codec's. No test is moved or retired. The new tests are unit tests, which the case matrix doesn't inventory; the one matrix row that names a test that this PR touches,failed_application_never_reports_ready_or_admits_root_dependent_work, still names it, and SL5.2'scheck_matrix.pypasses.