rvw
Layered, replicated, self-adjudicating code review orchestrator.
rvw turns LLM code review from a single noisy pass into a deterministic
pipeline: activate rule lanes in layers, fire every lane with N replicas in one
concurrent wave, merge findings by content-derived keys, adjudicate each
candidate against the actual source, and publish one synthesized report.
DISCOVER ──▶ MERGE ──▶ ADJUDICATE ──▶ REPORT ──▶ publish
lanes × collapse replicas vote Korean md GitHub review
replicas + folds on real source + coverage (inline anchors)
Why
Single-pass LLM review has three structural problems, each addressed by a measured design decision (see DECISIONS.md):
| Problem | Mechanism | Measured |
|---|---|---|
| One pass misses findings | 3 replicas per lane, one wave | recall 88% → 99% (ADR-006) |
| Scoped rules go blind outside their scope | mandatory unscoped-sweep lane |
3/3 deep defects only the sweep caught (ADR-005) |
| LLMs fabricate findings | separate adjudication lane, votes grounded in real source | 3/3 fabricated rejected, 0/6 genuine lost (ADR-007) |
Findings are forced through closed rule enums via strict --output-schema —
measured: the schema beats the prompt, and closed enums cost zero recall vs
free-form ids (ADR-004).
Install
pip install rvw # or: uv tool install rvw
Requires Python 3.12+ and a working Codex CLI
(codex exec) as the review runtime.
Quickstart
# One command: resolve PR → discover → merge → adjudicate → report
rvw review --target 1119 --repo-dir /path/to/pr-head-checkout
# Plan only (no execution): which lanes activate, how many runs
rvw plan --target 1119 --json
# Deterministic gate for CI: exit 0 PASS / 1 BLOCK
rvw auto --target 1119 --repo-dir /path/to/checkout
# Anchored PR gate: disposable checkout, exact coverage, keyed dispositions
rvw gate --target 1119
# Publish the report as a GitHub review (dry-run by default)
rvw publish --run <run-id> --execute
Concepts
- Rule — one atomic check (
slop/sot-violation,bug/severe-defect, …) - Lane — a named rule bundle + prompt executed as one review pass; rules form the closed output enum
- Layer — activation tier owning lanes:
base(always) →project(repo predicate) →scope(path predicate) →dynamic(per-PR brief) - Runtime — the execution engine (
codex exec --sandbox read-only) - Run — lane × runtime × replica
The registry lives outside the package (default ~/.hermes/review/):
layers.yaml + lanes/**.md (YAML frontmatter + prompt body) + policies/.
Everything is referenced by name so documents, lanes, and runtimes can be
swapped without touching code.
Specs
Normative behavior lives in the OpenSpec capability specifications. This README remains the public overview and is not the behavioral source of truth.
Pipeline guarantees
- Validity contract — a run counts only if: exit 0, artifact exists, strict-schema JSON validates, completion marker present. INVALID replicas are never promoted; an all-INVALID lane is re-dispatched exactly once.
- Deterministic merge — findings collapse by
(file, hunk, rule); cross-lane corroboration and replica agreement are computed, not guessed. Display folds (same-pattern-across-files, same-region) never merge verdicts and never chain transitively. - Source-grounded verdicts — adjudication replicas run inside the target checkout; REJECTED requires a verbatim disproving source quote, otherwise it is coerced to UNCERTAIN. Unresolved candidates are reported as unverified, never silently dropped.
- Approve is not expressible — the publish layer hardcodes COMMENT.
rvw autodecides PASS/BLOCK from a YAML threshold policy; nothing in the pipeline can emit an approving review.
Lane health
rvw lanes list # registry overview
rvw sample --lane slop-hygiene --fixture tests/fixtures/deep.ts
# novel-rule gap + replica site variance
rvw doctor # INVALID rate, /other rate, rejection rate
Development
git clone https://github.com/Soju06/rvw && cd rvw
uv sync --all-extras
uv run pytest -q -m "not live" # unit suite
uv run pytest -q -m live # exercises real codex (needs credentials)
Gates: ruff check · ruff format · ty check · pytest. Architecture
decisions are append-only in DECISIONS.md.
License
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file rvw-0.2.0.tar.gz.
File metadata
- Download URL: rvw-0.2.0.tar.gz
- Upload date:
- Size: 45.5 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
ce64461d1bfe5c880f121a35071d1477b297626d27c12315d0cb79a10ace30d0
|
|
| MD5 |
3e6be6b6fee7c181b874b411ac9bb53d
|
|
| BLAKE2b-256 |
74722327e26eac318333b8198b78094caa1de095ccbf6d0bfd0bcce6e330989c
|
Provenance
The following attestation bundles were made for rvw-0.2.0.tar.gz:
Publisher:
release.yml on Soju06/rvw
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
rvw-0.2.0.tar.gz -
Subject digest:
ce64461d1bfe5c880f121a35071d1477b297626d27c12315d0cb79a10ace30d0 - Sigstore transparency entry: 2270074738
- Sigstore integration time:
-
Permalink:
Soju06/rvw@46f543e589d6099d00fff689169a4346b907c410 -
Branch / Tag:
refs/tags/v0.2.0 - Owner: https://github.com/Soju06
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@46f543e589d6099d00fff689169a4346b907c410 -
Trigger Event:
push
-
Statement type:
File details
Details for the file rvw-0.2.0-py3-none-any.whl.
File metadata
- Download URL: rvw-0.2.0-py3-none-any.whl
- Upload date:
- Size: 56.1 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
795b4e71e210e7fa46c09de9c698de0f252d67dc48c22e22b1b3625522231ce1
|
|
| MD5 |
22abf5c8e7781f5abbd0f08a82b4e6c6
|
|
| BLAKE2b-256 |
0088ad8f08adb042e8f62bdcf30a475890410e1be5d76b1a5cbfe51b271a3b3e
|
Provenance
The following attestation bundles were made for rvw-0.2.0-py3-none-any.whl:
Publisher:
release.yml on Soju06/rvw
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
rvw-0.2.0-py3-none-any.whl -
Subject digest:
795b4e71e210e7fa46c09de9c698de0f252d67dc48c22e22b1b3625522231ce1 - Sigstore transparency entry: 2270074998
- Sigstore integration time:
-
Permalink:
Soju06/rvw@46f543e589d6099d00fff689169a4346b907c410 -
Branch / Tag:
refs/tags/v0.2.0 - Owner: https://github.com/Soju06
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@46f543e589d6099d00fff689169a4346b907c410 -
Trigger Event:
push
-
Statement type: