Repository navigation
Releases
v2.6.0 — structural levers
Post-v2.5 structural levers (v2.5 proved prompt-level gains are at the cheap-model ceiling). All behavior-preserving — new knobs default off / provider-default.
- Reasoning controls (
accuracy.analyst_thinking,reasoning_effort): DeepSeek V4 thinking is a request parameter (default on); endpoint-safe (sent only when set). Measured: disabling analyst thinking collapses recall ~91%->61%, so reasoning stays on. - SAST grounding (
sast.enabled, opt-in): Semgrep hits feed the verifier's triage — the documented 2025-26 precision lever. Live-path (needs Semgrep in the runner). - Real-PR benchmark (
evals/realpr.py): discovers real merged bug-fix PRs, reverses them to reintroduce the bug, scores recall on real bugs.
230 tests. DECISIONS D35-D36.
v2.5.0 — research levers (opt-in, measured)
Five $0 research levers — confirmation-bias debiasing, per-agent calibration, diverse-lens ensemble, verdict-first CoT, and a rubric meta-judge verifier — built behind config toggles. Benchmark expanded to 37 fixtures / 7 languages with misleading-title debias probes and new bug classes (SSRF, insecure deserialization, eval, open redirect, ReDoS, weak crypto, TLS-off, secret logging).
Measured 3-run A/B on deepseek-v4-flash: levers-off baseline 101/111 (91%), debias+calibration 98/111 (88%). Every lever arm landed within run-to-run noise of baseline — no measurable accuracy gain — so all levers ship off by default (opt-in via config; mode: thorough enables them). Honest-numbers rule: we don't ship a behavior-changing default without an eval that justifies it.
215 tests, ruff clean. See DECISIONS D29–D34.
v2.1.0 — the adoption layer
v2.1 turns an accurate reviewer into one teams adopt and keep — every feature $0 because you bring the key. Built after a full file-by-file self-review.
New — features teams adopt for
- One-click fixes — precise fixes render as GitHub
suggestionblocks (commit with one click). - Merge gating —
gate.levelposts a Check Run that fails on unresolved High/Critical findings; make it a required check to block risky merges. Off by default. - Incremental review — re-reviews only the files changed since the last push; no more re-flagging settled code.
- Finding suppression —
review.suppressglobs and inlinepr-sentinel: ignore[category]markers. - Custom guidance —
agents.guidance/agents.instructions(read from the base branch, so a PR cannot inject). - Presets —
mode: fast | balanced | thorough. - Risk labels, REQUEST_CHANGES, merge-readiness score (0–100), confidence display (ensemble agreement).
- Adaptive sampling — one sample on clean code, the full vote only where something was found (~40% fewer calls).
- Cross-file pass (opt-in) — catches stale callers / signature mismatches per-file review misses.
Fixed (from the self-review)
- Pooled GitHub client + retry/backoff; parallel context fetch; robust >65k-char comment cap; reviewer attribution recovery; precise test-path detection.
Hardening / health
- Digest-pinned base image, Dependabot, issue/PR templates, CODE_OF_CONDUCT, CHANGELOG, self-review (dogfood) workflow.
200 tests (LLM + GitHub mocked). Live-verified end-to-end: gating, labels, readiness score, and inline comments on a real PR. Install: uses: moazmo/pr-sentinel@v2. Optional features need one extra permission each (gating: checks: write, labels: issues: write).
v2.0.1 — accuracy-per-dollar
PR Sentinel v2: review accuracy as a systems problem, not a model-size problem. The same cheap model, wrapped in a system that samples, anchors, and verifies, beats its own naive single pass — measured, with published false-positive rates.
The leaderboard (same deepseek-v4-flash, 51 fixture-runs)
| Config | Caught | Clean-fixture false positives | Cost/review |
|---|---|---|---|
| Naive single pass | 47/51 (92%) | 2 | ~$0.002 |
| v2 (ensemble + verifier) | 49/51 (96%) | 0 | ~$0.005 |
What is new in v2
- Line-numbered diffs + evidence anchoring — every finding must quote a line that literally exists in the diff, or it is dropped before posting. Hallucinations become structurally impossible.
- Self-consistency ensemble — each analyst reviews 3× and findings are majority-voted (DeepSeek caching keeps this ~1.3x cost, not 3x).
- Verifier pass — a dedicated agent adjudicates every finding against the code before the reviewer writes prose.
- Inline review comments — findings post anchored to diff lines; the rest stay in one sticky summary.
- On-demand commands —
@pr-sentinel review | ask | describe, gated to repo owners/members/collaborators. - Native Anthropic provider, two-tier model routing, JSON-mode with fallback, pooled connections, cache-aware cost reporting.
- 17-fixture / 5-language eval suite (Python/JS/TS/Go/Java) with hard negatives and two prompt-injection vectors.
163 tests, all LLM/GitHub mocked. Live-verified end-to-end: inline comments, cross-agent attribution, and the ask command answering a grounded question about a real PR.
Install: uses: moazmo/pr-sentinel@v2. See the README for the workflow and config.
v1.0.3
Five specialized LLM agents review each PR and post one prioritized, transparent comment. Runs in your CI, BYOK (OpenAI / DeepSeek / OpenRouter / Groq / Ollama). Injection-hardened, never breaks your CI. Eval: 34/35 fixture-runs, zero clean-fixture false positives.
v1.0.2
Multi-agent code review for pull requests. Five specialized LLM agents (Architect, Security, Performance, Test, Reviewer) review every PR and post one prioritized, transparent comment.
Highlights
- Runs in your CI as a Docker action (prebuilt GHCR image, pulls in seconds)
- BYOK via the OpenAI-compatible protocol: OpenAI, DeepSeek, OpenRouter, Groq, local Ollama
- Hybrid dedup: deterministic clustering + reviewer LLM semantic merge
- Injection-hardened: PR content treated as untrusted data, schema-validated output, secret scrubbing, config read from the base branch
- Never breaks your CI: every failure degrades to a comment + clean exit; hard cost caps
- Evals: 34/35 fixture-runs over 5 runs on deepseek-v4-pro, zero clean-fixture false positives
Fixes since v1.0.0
- action.yml failed to load due to a secrets-context expression in an input description (caught by live E2E)
- Robust JSON extraction (balanced-bracket scanner) — no more findings lost to model formatting hiccups
- Analyst temperature 0.0 + one re-ask on non-JSON output: measurably lower run-to-run variance
Install: see the 30-second workflow in the README.