Static mutation-exposure analysis — which changed behavior your tests run but don't actually check.
ripr reads a PR diff and tells your reviewers and coding agents which changed
behavior the current tests reach but don't actually check — the question
mutation testing answers, asked at draft time without running a single mutant.
Where a test would not catch the change breaking, it routes one focused,
test-only repair: what to assert, where, the command that verifies it, and a
before/after receipt.
one PR
-> one gap
-> one focused test
-> one before/after receipt
cargo install ripr
ripr first-pr --root . --base origin/main --head HEADThat's the whole loop: ripr names the top repairable gap, you add one focused
test outside ripr, and the receipt records whether the gap closed. ripr.toml
is optional; the zero-config run is the intended first interface.
coverage: did this line run?
ripr: would any test notice this changed behavior breaking?
mutation testing: did a test fail when a real mutant ran?
ripr is static and advisory. It does not run mutants, report killed or
survived, replace coverage, or claim correctness or test adequacy. It names
the changed behavior that lacks a discriminator and the next test to add; a real
mutation runner like cargo-mutants confirms it under execution when the change
is ready. Coverage stays the execution-surface signal; ripr is the cheaper
draft-time question between them.
| Term | What it is |
|---|---|
| gap | a changed behavior whose tests are too weak to notice it breaking, with a stable canonical ID |
| card | the repair — what to assert, where, and why the current proof is weak |
| packet | a bounded, test-only work order for a human or agent: allowed files, forbidden files, stop conditions |
| verify | the focused command that checks the repair (cargo test …, pytest …) |
| receipt | the before/after record of whether the gap actually closed |
WARNING src/pricing.rs:88
Static exposure: weakly_exposed
Probe: predicate
Changed behavior:
if amount >= discount_threshold {
Evidence:
Reachability: related tests found
Infection: changed predicate can alter branch behavior
Propagation: branch appears to influence returned total
Revealability: tests assert returned values, but no equality-boundary case was found
Gap:
No detected test input for amount == discount_threshold.
Recommended next step:
Add below, equal, and above-threshold tests with exact assertions.
The wording is intentionally conservative: static analysis identifies evidence and gaps; it does not claim runtime mutation outcomes.
| You are a… | First action | Doc |
|---|---|---|
| VS Code user | Install EffortlessMetrics.ripr, open a Rust workspace, use the status bar, Problems, and hover evidence. |
Quickstart |
| CI owner | ripr init --ci github for an advisory PR summary and artifact packet. |
Quickstart |
| CLI user | ripr pilot --root ., then add one focused test for the top gap. |
Quickstart |
| Agent operator | ripr agent status --root . or a bounded, source-edit-free seam packet. |
LLM operator guide |
The mature loop is Rust/Cargo. Python repair-routing is usable alpha for
selected pytest/unittest workflows (repair cards, verify commands, bounded
agent packets, before/after receipts); TypeScript is an opt-in preview. ripr
is advisory static analysis — not a merge gate and not a mutation runner. This
README is a front door, not the metric source of truth: see
Support tiers for what is usable, preview, or
advisory, and the Capability matrix and
Metrics for detailed state. ripr-swarm is the development trunk; source
EffortlessMetrics/ripr is the
release and distribution authority.
| Need | Doc |
|---|---|
| Choose the first-hour path by surface | Quickstart |
| Map plain language to the internal model | Terminology |
| Understand the model (discrimination vs coverage) | Static exposure model |
| Know what is usable / preview / advisory | Support tiers |
| Understand JSON / context output | Output schema |
| Turn a gap into a test | Targeted test workflow |
| Prove one real PR's adoption | First successful PR workflow |
| Install and use the editor extension | Editor extension |
| See behavior contracts and architecture | Specs · Architecture · ADRs |
| Follow direction and active work | Roadmap · Plan · Campaigns · Codex Goals |
| Contribute a scoped PR | Contributing · Scoped PR contract · PR automation |
| Everything else | Documentation index |
Use the repo automation rather than remembering the gate order:
cargo xtask shape # safe local normalization
cargo xtask check-pr # the review-ready gateA good ripr PR is scoped by production risk, not line count: one production
delta plus its complete evidence package, preserving the
spec -> test -> code -> output contract -> metric chain. Large fixture,
golden, spec, or docs diffs are welcome when they make one production behavior
reviewable.
See Contributing, Scoped PR contract, and Agent instructions.
EffortlessMetrics/ripr-swarmis the public same-repo development landing zone for trusted agent and maintainer PRs. Package publishing, marketplace publishing, GitHub Releases, and public distribution authority remain inEffortlessMetrics/ripr. See Swarm development.
ripr is licensed under MIT OR Apache-2.0, at your option.
It targets Rust 2024 and requires Rust 1.95 or newer.