Repository navigation
Description
Parent: #1082, in #1076. Needs: #1101, #1104. Unblocks: #1115, #1117, #1118, #1120, #1123, #1127, #1130, #1131.
Goal. guest::clone becomes guest::activation: Activation holds no fence, and apply starts no process and reports the publication and the gateway, so the init starts the announcer itself. A capture is one guest call, guest::snapshot::capture, which returns Continued or Restored(Repaired), or a CaptureFailure whose disposition is Resumed or MustEnd { status }.
Notes.
guest::clonekeeps an alias until the test adapter goes (nvx-rs slimming 4.1.2: the test adapter is gone #1119).Devicesnames the devices by their MMIO windows, instead of the space'sDevice.
PRs, in order. Each PR has one goal, leaves dev green, and names in its description each old test of its area as kept, rewritten or retired, with each change that check_test_changes.py reports. Its tests follow the repository's test layout: a module's unit tests, and the code that only they use, sit in its tests.rs or tests/ and move with it. The estimates count core lines (code, not comments, docs or tests) and counted files; each PR records its measured values. Each PR does what its Scope says and no more: a case, input or layout that its Scope doesn't name, and whatever "Not in this PR" lists, is out of scope. Address every review comment within the scope, and ask before acting on one that asks for more. A PR whose measured core lines pass the stop that its Estimate names (twice the estimate, at most 600) stops and asks before continuing.
-
SL7.3: Activation starts no process, and holds no fence.
- Objective: Activation becomes a sans-I/O state machine with no admission fence, while applying an accepted record starts no process. The caller receives the publication and gateway needed to start ingress itself, and the root retains ownership of the view's binds.
- Contents:
guest::clonebecomesguest::activation, with an alias until SL5.2.Activationdrops its fence;applyusesview::applywith the record's DNS server and starts no announcer;Appliedreports the publication and the gateway, losesannouncerandannouncer_mut(NetworkErrorloses itsAnnouncervariant, andapply's system seam itsannounceandstop, so nothing butnvx-ingress startusesAnnouncer), and itsinto_partsreturns(Root, MachineId), since the root holds the view's binds. The test adapter follows. - Scope:
- Rename
guest::clonetoguest::activation, retaining aguest::clonealias until SL5.2; update the test adapter. - Remove the fence parameter and state from
Activation. - Make activation application call
view::applywith the record's DNS server and stop starting or stopping an announcer. - Add
Applied::{publication, gateway}, removeannouncerandannouncer_mut, and makeinto_partsreturn(Root, MachineId). - Remove the announcer variant from
NetworkErrorand theannounceandstopoperations from the application system seam.
- Rename
- Not in this PR:
- Starting
nvx-ingressfrom activation or adding a replacement process spawner: the init owns that work. - Deleting
Announcer,PROGRAMorStartError;nvx-ingress startstill uses them until SL6.13c. - Removing the
guest::clonealias before SL5.2 deletes the test adapter. - Redesigning activation inputs, actions or transport behavior beyond removing the fence.
- Starting
- Approach: Rename the module with a temporary alias, delete the fence plumbing, and return the record's existing publication plus the template's gateway through
Applied. Delegate view files toview::applyand remove only announcer-specific seam code; do not add a process callback or replacement fence abstraction. - Done when:
- Activation holds no fence, and tests that encoded fence closing or opening are rewritten or retired by name.
- Activation application starts no process and performs no announcer start or stop.
Applied::publicationreports the record's publication, andApplied::gatewayreports the template gateway.Applied::into_partsreturns(Root, MachineId), with the root retaining the view binds.- The test adapter builds through the temporary
guest::clonealias.
- Needs: SL7.2, in nvx-rs slimming 2.4.1: the guest's space becomes reference code, with runtime mounts, one switch and the view #1104; SL2.5b, in nvx-rs slimming 2.3.1: activation record v2 carries only what the guest applies #1101.
- Estimate: 250 core lines, 3 counted files. Past 500 core lines, stop and ask before continuing.
-
SL7.4a: A Fresh capture is one guest call.
- Objective: A Fresh guest capture becomes one bounded call that performs the pre-request checks and reports whether the guest resumed or must end. It replaces the separate preparation and barrier protocol without freezing or inspecting caller-owned executions.
- Contents:
guest::snapshot::capture(devices: &Devices, disks: Disks, deadline: Instant) -> Result<Captured, CaptureFailure>, with the non-exhaustiveDisks::Fresh: the mount checks, the time ABI's checks, the stall detectors, the generation ID and the request, with every step and wait before the request, the runtime lock's included, bounded bydeadline; the request itself has no deadline. Its checks are strict: a violation of the time ABI's checks returnsMustEndwith the violation's status, instead of stopping the VM. It neither freezes nor checks the guest's executions.Captured;CaptureFailure { stage, cause, disposition }, with the non-exhaustiveCaptureStage,CaptureCause, andDisposition::{Resumed, MustEnd { status }}; aPortReleaseat any stage isMustEnd, and keeps its cause.Devices, which names the devices by their MMIO windows instead of the space'sDevice,Mounted(origin,mount_point),OriginandMOUNT_TABLE_LIMITmove fromactivationintoguest::snapshot.Disks::Freshrefuses a restore packet that carries network settings, which a platform restore never has, instead of dropping them; the repair uses the time core's host-clock correction as it is. - Scope:
- Add
guest::snapshot::capture(&Devices, Disks, deadline) -> Result<Captured, CaptureFailure>with non-exhaustiveDisks::FreshandCaptured::Continued. - Run mount checks, strict time checks, stall-detector suppression, generation-ID reading and the capture request; bound every step and wait before the request, including the runtime lock, by
deadline. - Leave the request itself without a deadline.
- Add staged failures with
CaptureFailure, non-exhaustiveCaptureStageandCaptureCause, andDisposition::{Resumed, MustEnd { status }}. A strict time violation orPortReleaseisMustEnd, andPortReleasestays the cause. Other pre-request failures areResumedafter successful detector restoration andMustEndif restoration fails; request and release failures areMustEnd. - Move
Devices,Mounted,OriginandMOUNT_TABLE_LIMITfrom activation to snapshot; name devices by their MMIO windows, and reject Fresh restore network settings. - Document the caller's transport rule: after answering the capture request, send nothing until
capturereturns; afterContinuedor aResumedfailure, report on the same session.
- Add
- Not in this PR:
- Repairing a restored guest or returning
Restored(Repaired); SL7.4b adds that final part. - Freezing, counting or validating guest executions: their caller keeps them still.
- Deadlining the capture request while the host saves stopped processors.
- Additional disk modes beyond non-exhaustive
Disks::Fresh, or a general device-discovery abstraction. - Silently dropping restore network settings: a Fresh platform restore never carries them and this call refuses them.
- Repairing a restored guest or returning
- Approach: Compose the existing mount checks, time checks, suppression, generation-ID and request code inside one
snapshotfunction, using one caller deadline only before the request. Move the existing data types rather than wrapping them, and map existing failures directly to a stage, cause and disposition; do not add execution control or a capture coordinator. - Done when:
capturereturnsCaptured::Continuedwhen no snapshot was taken and the guest may continue.- Each pre-request step and wait, including the runtime lock, honors the caller's deadline; the request has no deadline.
- Each failure reports its stage and disposition, and a strict time violation returns
MustEndwith its status. - A
PortReleaseat any stage isMustEndand remains the cause even when rollback also fails. - Fresh capture refuses restore network settings and neither freezes nor checks executions.
- Needs: SL7.3, above.
- Estimate: 400 core lines, 4 counted files. Past 600 core lines, stop and ask before continuing.
-
SL7.4b: A restore is repaired before
capturereturns.- Objective: A restored guest is fully repaired before the single capture call returns. Successful restores return the repaired generation, CPU, memory and acknowledgement data; a repair failure tells the caller that the guest must end.
- Contents:
Captured::Restored(Repaired): the repair runs insidecapture, and its failure isMustEnd { status }.Repaired(generation_id,cpus,memory,acknowledged_at) and the repair's failure detail (RepairError,RepairCause,RepairStage,RangeFault,RepairProgress) move fromactivationintoguest::snapshot. - Scope:
- Extend
CapturedwithRestored(Repaired)and run the existing repair insideguest::snapshot::capture. - Move
Repaired, withgeneration_id,cpus,memoryandacknowledged_at, from activation intoguest::snapshot. - Move
RepairError,RepairCause,RepairStage,RangeFaultandRepairProgresswith the repair implementation into snapshot. - Map every repair failure to
CaptureFailurewithDisposition::MustEnd { status }. - Document the restored transport rule: after
capturereturnsRestored, take the session's reset and attach again before receiving the activation record.
- Extend
- Not in this PR:
- Changing repair order, retry behavior, status selection, CPU or memory operations: this PR moves the existing repair behind
capture. - Returning an unrepaired restore or exposing a separate public repair step.
- Changing the Fresh pre-request checks, deadline rules or
PortReleasehandling added by SL7.4a. - Renaming or cleaning up the repair types while moving them.
- Changing repair order, retry behavior, status selection, CPU or memory operations: this PR moves the existing repair behind
- Approach: Call the existing repair immediately after the capture result identifies a restore, then return its existing
Repairedvalue fromCaptured. Move the repair types intact and translate its current status intoMustEnd; do not create another repair state machine, callback or public intermediate result. - Done when:
capturereturnsCaptured::Restored(Repaired)only after inline repair succeeds.- The returned value reports the repaired generation ID, CPU count, memory size and acknowledgement time.
- Every repair failure is returned as
MustEnd { status }. - Tests that called repair separately are rewritten or retired, while their repair-result and failure coverage remains.
- Needs: SL7.4a, above.
- Estimate: 200 core lines, 2 counted files. Past 400 core lines, stop and ask before continuing.
Tests. capture returns Captured::Continued when no snapshot was taken, and the guest goes on; on a restore, it returns Captured::Restored(Repaired) only once the inline repair has succeeded, and Repaired::{generation_id, cpus, memory, acknowledged_at} report that repair. Each capture stage's failure has its disposition. A PortRelease at any stage is MustEnd, and keeps its cause, even if a rollback also fails. Every step and wait before the request, the runtime lock's included, honors the deadline, and the request itself has none. A violation of the time ABI's checks returns MustEnd with the violation's status, instead of stopping the VM. The repair runs inside capture, and its failure is MustEnd. Activation holds no fence; apply starts no process; Applied::publication reports the record's publication, and Applied::gateway the RootTemplate's gateway; and Applied::into_parts returns (Root, MachineId), while the root keeps the view's binds. The tests that encode the fence, the announcer's start or the separate repair are rewritten or retired by name, for example a_clone_bootstraps_takes_one_activate_and_opens_the_fence_once_ready, a_network_that_publishes_the_workload_s_listeners_starts_their_announcer_to_its_gateway, the_fence_closes_before_the_checks_and_the_detectors_are_suppressed_before_the_capture, a_restored_clone_gets_the_fence_closed_with_the_detectors_suppressed and a_clone_is_reseeded_then_acknowledged_once_and_reentry_returns_the_same_clone. The test adapter follows the rename.
Done when: every PR above has merged, with dev green.
Activity
esaurez commentedon Nov 10, 2026
Workstream source/progress checkpoint - 2026-11-10 UTC
Checked boxes below mean merged scope, not merely an implemented first iteration. Implementation branches are source checkpoints, not automatic qualification, Ready or merge approval. Some starting inputs are frozen/anonymous commits rather than standalone branches; their exact SHAs and known merged producer refs are recorded explicitly.
SL7.3 - merged via pull request 1346.
esaurez/slim-2.4.2-sl7.3-20261107at2b5b44fc38e3893de9e92d6f60caaabe67386101.feature/nvx-refactoratea2e02412b3ca14492bbfec44487ede486249bce; merge commit2b5b44fc38e3893de9e92d6f60caaabe67386101.SL7.4a - merged via pull request 1394.
esaurez/slim-2.4.2-sl7.4a-20261107at3a7bd293fbc3f997c1999e5c29000e2c13eeacae.feature/nvx-refactorat81f58751f77787bc3fc9e6abfe4a3cfe12696be1; merge commit3a7bd293fbc3f997c1999e5c29000e2c13eeacae.SL7.4b - merged via pull request 1395.
esaurez/slim-2.4.2-sl7.4b-20261106at0dd708cfa28ede292101feba561b1e3a3de9dcf7.feature/nvx-refactorat8b2a392ae6fd5f73f1b27fb2a0e109ce36d068e3; merge commit0dd708cfa28ede292101feba561b1e3a3de9dcf7.The original technical scope remains authoritative, supplemented only by any portable technical clarification in this issue. No machine-specific execution policy is part of this checkpoint.
guest: drop guest::clone, the alias of guest::activation
guest: drop guest::clone, the alias of guest::activation
guest: drop guest::clone, the alias of guest::activation