Skip to content

EffortlessMetrics/ripr

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

2,180 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

ripr logo

ripr

CI Codecov ripr open gaps ripr+ test-efficiency gaps docs.rs

GitHub release crates.io downloads VS Marketplace installs Open VSX downloads

MSRV License: MIT OR Apache-2.0

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.

The first useful run

one PR
-> one gap
-> one focused test
-> one before/after receipt
cargo install ripr
ripr first-pr --root . --base origin/main --head HEAD

That'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.

Where it fits

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.

What you get

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

Example output

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.

Start from the surface you already use

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

Status

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.

Docs

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

Contributing

Use the repo automation rather than remembering the gate order:

cargo xtask shape      # safe local normalization
cargo xtask check-pr   # the review-ready gate

A 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-swarm is the public same-repo development landing zone for trusted agent and maintainer PRs. Package publishing, marketplace publishing, GitHub Releases, and public distribution authority remain in EffortlessMetrics/ripr. See Swarm development.

License

ripr is licensed under MIT OR Apache-2.0, at your option.

It targets Rust 2024 and requires Rust 1.95 or newer.