Skip to content

feat(rvf): rvm-rvf loader, rvm-host adapters, rvm-launch state surface - #17

Merged
ruvnet merged 3 commits into
mainfrom
feat/rvforge-integration
Aug 5, 2026
Merged

feat(rvf): rvm-rvf loader, rvm-host adapters, rvm-launch state surface#17
ruvnet merged 3 commits into
mainfrom
feat/rvforge-integration

Conversation

@ruvnet

@ruvnet ruvnet commented Aug 5, 2026

Copy link
Copy Markdown
Owner

Closes the RVForge → RVM execution path on the RVM side, per ADR-155.

What lands

Crate Role Tests
rvm-rvf Format/machine boundary — container + footer decoding, per-segment hash and Ed25519 verification, capability mapping into rvm-cap, witness emission 99
rvm-host Per-OS adapters, isolation mechanisms, packaging 73
rvm-launch State, checkpoints, suspend/resume lineage rules 26

Workspace grows 14 → 17 crates. Also carries the docs commit mapping the two repositories' responsibilities, the compatibility matrix, and ADR-155.

The loading rules, enforced

  1. The root manifest is verified before executable memory is allocated.
  2. Every referenced segment is verified on its own — root-manifest validity is not transitive trust.
  3. Unsigned executable segments are rejected by default.
  4. RVF content is never executed during inspection. inspect and verify are distinct operations from run precisely so that pointing a scanner at a hostile artifact is safe.
  5. A witness record is emitted for every verification result, success and failure alike.

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_tests verify 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.rs was #![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

cargo test -p rvm-rvf -p rvm-host -p rvm-launch   198 passed, 0 failed
cargo clippy ... --all-targets -- -D warnings     clean
cargo check --workspace                            ok

🤖 Generated with claude-flow

https://claude.ai/code/session_01ParP55bZs2iTGEGvpnUecx

ruvnet added 3 commits August 5, 2026 08:59
…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
@ruvnet
ruvnet merged commit 705e7ea into main Aug 5, 2026
2 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant