feat(rvf): rvm-rvf loader, rvm-host adapters, rvm-launch state surface - #17
Merged
Conversation
…trix) Records the RVM side of the RVF execution contract: rvm-rvf loader (verify-before-load, capability mapping into rvm-cap, witness per verification), the embedded contract fields, and the published compatibility matrix. Scope stated honestly: ADR-155 is Accepted as a decision; this repo lands the loader, not the execution backends (rvm-host/launch/ffi/node), so an RVForge package can be verified and capability-mapped on RVM, not yet executed by it. RVForge v0.1.0 likewise produces verified staged bundles — native installers are the next phase, not a current output. Cross-repo: RuVector ADR-284/285/286/287/291. Co-Authored-By: claude-flow <ruv@ruv.net> Claude-Session: https://claude.ai/code/session_01ParP55bZs2iTGEGvpnUecx
Adds the three crates that close the RVForge -> RVM execution path described in ADR-155. rvm-rvf is the format/machine boundary: container and footer decoding, per-segment hash and Ed25519 signature verification, capability mapping into rvm-cap, and a witness record for every check. Verification happens before any executable memory is allocated, and root-manifest validity is never treated as transitive trust for the segments it lists. Two properties are enforced by test rather than convention: a skipped signature check is recorded as escalated, never as a pass; and each check emits exactly one record per subject, so a refusal cannot be dropped silently. rvm-host provides the per-OS adapters and rvm-launch the inspect / verify / run surface over them. 172 tests (73 host+launch, 99 rvf), clippy clean under -D warnings, workspace checks. compat_tests verify this crate's testkit reproduces the RuVector-side writer's bytes, so the two implementations are checked against each other rather than against a shared helper. Co-Authored-By: claude-flow <ruv@ruv.net> Claude-Session: https://claude.ai/code/session_01ParP55bZs2iTGEGvpnUecx
crates/rvm-launch/src/lib.rs was `#![no_std]` and nothing else, so checkpoint.rs, error.rs, state.rs and witness.rs sat in the directory without ever being compiled. The crate built, and contributed zero tests, which is why nothing complained. Declares the four modules and `extern crate alloc`, matching rvm-rvf and rvm-host. The modules already imported from alloc correctly in their test blocks; only the crate root was missing. Brings 26 previously-dead tests into the run, including the lineage rejection cases from ADR-288 §4 and the ADR-289 criterion 7 case that restoring into a different instance is allowed while restoring against a different base is refused. Co-Authored-By: claude-flow <ruv@ruv.net> Claude-Session: https://claude.ai/code/session_01ParP55bZs2iTGEGvpnUecx
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.
Closes the RVForge → RVM execution path on the RVM side, per ADR-155.
What lands
rvm-rvfrvm-cap, witness emissionrvm-hostrvm-launchWorkspace grows 14 → 17 crates. Also carries the docs commit mapping the two repositories' responsibilities, the compatibility matrix, and ADR-155.
The loading rules, enforced
inspectandverifyare distinct operations fromrunprecisely so that pointing a scanner at a hostile artifact is safe.Three of these are held by test rather than by convention, because all three are the kind of thing that decays quietly:
a_skip_is_recorded_as_escalated_not_as_a_pass— a signature check that could not run must never be counted as one that passed.every_check_produces_exactly_one_record_per_subject— a refusal cannot be dropped on the floor.refusals_are_the_events_recorded_as_rejected— the same property on the launch side.State lineage
Per ADR-288 §4, every delta and checkpoint carries the base RVF identity it belongs to, and a mismatch on open is a lineage rejection rather than a partial start. Instance identity is recorded as provenance but deliberately does not gate: ADR-289 acceptance criterion 7 requires suspending under one host adapter and resuming under another, so the far-side instance is new by construction.
Cross-implementation checks
compat_testsverify that this crate's testkit reproduces the RuVector-side writer's bytes, and that tampering breaks hash and signature together. The two implementations are checked against each other rather than both against a shared helper, so a bug in one is not masked by the same bug in the other.Note on the second commit
rvm-launch/src/lib.rswas#![no_std]and nothing else — its four modules were never declared, so they did not compile and contributed no tests while still appearing to build cleanly. The second commit declares them. Worth a reviewer's eye, since that failure mode is invisible to a green build.Verification
🤖 Generated with claude-flow
https://claude.ai/code/session_01ParP55bZs2iTGEGvpnUecx