Skip to content
MrJev

lorenzini

Claude Code skills that wait for CodeRabbit, Copilot or Codex to finish reviewing a pull request, then judge whether the verdict actually permits a merge.

View on GitHub →

Hands-on review

Three skills that wait for CodeRabbit, Copilot and Codex and decide whether the verdict really permits a merge. Jev is the shadow, not the gate.

Good for

  • Waiting on a bot review without reading 'no comments' as 'no findings'
  • A worked example of fail-closed design, with the ledger to prove it
  • Gate logic that keeps working when the model is unreachable

Watch out for

  • No licence file, so nobody can legally reuse it
  • The Jev part is opt-in shadow classification, not the verdict
  • Needs `gh` authenticated and `jq`; it refuses to run without either

Tested Sep 21, 2026 at 06c79ea3fedb · debian in Docker with no network; its 98 assertions, plus the shipping poller driven against a stub `gh` we wrote to fake two review shapes

How we reviewed this: we ran its three test files in Docker with no network, then wrote our own stub gh and fed the shipping poller two review shapes we crafted — one with findings hidden in a collapsed section, one where the reviewer’s own count disagreed with what was posted — to see what verdict came out. We also ran it with the Jev shadow check enabled and no key at all. No Jev calls.

What it does

Three Claude Code skills poll a third-party pull-request reviewer — CodeRabbit, GitHub Copilot or Codex — and decide whether what it said amounts to a pass. The README is clear that this is not a code reviewer: “They do not review source code; they adjudicate what the reviewer reported.”

The rule the whole thing is built on is one line:

Never infer a pass from absence.

Every automated reviewer the author has watched puts findings somewhere the summary doesn’t count them — a collapsed <details> block, a comment thread, a bucket for findings that fall outside the diff. An empty result and a failed read look identical, and so do “reviewed, nothing found” and “the reviewer never ran”.

The ledger

docs/fail-open-ledger.md is 500 lines documenting eleven incidents where an earlier version of this tool returned an unearned pass, each with the repository, pull request number, commit and date, and closing with a section on what the pattern across them is. The framing is exactly right:

A gate that fails closed wastes a poll. A gate that fails open merges a defect and tells you it was fine.

It gets better. Entry 1 carries a note that the entry itself was false for two days: the cross-check it described as implemented was not in the code, and when it was added, the first implementation was dead — the literal is **Comments generated:** 3, with emphasis markers between the colon and the number, so a pattern for Comments generated: 3 matched nothing. A guard that cannot fire, written while fixing guards that did not fire, recorded as such in the document that lists them.

The same care is in the source. Almost every branch in the 1,100-line poller carries the pull request, head SHA and date where its absence was observed, including a measured transcript of three CodeRabbit review objects arriving three minutes apart, two of them empty replies that an earlier version had read as completion.

What we made it do

We wrote a stub gh and handed the real poller two reviews.

Findings hidden in a collapsed section. The review body says Actionable comments posted: 0 and then carries a <details> block titled “🧹 Nitpick comments (3)”. Zero inline comments. A summary-reading gate calls this clean:

RESULT=NITPICKS count=3

It printed the contents of the hidden section too.

The reviewer’s own count disagreeing with what was posted. Body says Actionable comments posted: 3; nothing was posted inline:

CodeRabbit reports 3 actionable comment(s) for this commit, but only
0 were found on it (0 open, 0 dispositioned).
Something it posted is not being counted. Do not read this as clean:
the gap is the finding.
RESULT=MISCOUNT claimed=3 counted=0

And two failures we caused by accident, which are the best evidence of all. Our first stub didn’t implement the GraphQL review-threads query. The poller said “Could not read the review threads. Retrying rather than counting zero findings” and ended at RESULT=TIMEOUT — not CLEAN. Then we ran the suite in a container without jq, and every script stopped at RESULT=ERROR jq not found. The one-line rule holds in the two places it is easiest to forget: a broken dependency and an endpoint that will not answer.

The verdict vocabulary is ten words wide — CLEAN, NITPICKS, SUGGESTIONS, PREMERGE, MISCOUNT, UNREPLIED, HOLD, OTHERBOT, TIMEOUT, ERROR — which is the right shape for something a merge decision hangs on.

Where Jev actually sits

This is the part worth understanding before you install it: Jev is not the gate. The classification is deterministic pattern matching, and the model runs opt-in (JEV_SHADOW=1) over every collapsed <details> label, to catch bucket names the hardcoded patterns don’t know, writing to a shadow log rather than into the verdict.

We confirmed that separation costs nothing when the model is unavailable. With JEV_SHADOW=1, no key and no network, the same review still produced RESULT=NITPICKS count=3, and jev.sh on its own exits 2 with “no key” and prints nothing else.

The question set lives in its own versioned file with a note we would quote at anyone building a classifier out of prompt text: “Changing one word here changes what this file classifies.” v1 scored 27/30 on the gold set and missed “Nitpick comments” at 0.37 because the word “nitpick” wasn’t in the criteria; one added sentence took it to 0.70. The file records its own measurements — 29/30, hidden-bucket recall 8/8, zero label flips over three repeats, dated — and the runner writes a new result file per variant rather than overwriting the comparison. Those are the author’s numbers; we did not re-run them, since that needs live calls.

jev.sh itself is 84 lines of curl and jq that pin the model (jev-latest “silently changes models, and a classifier’s version is part of its contract”), log a hash of the question set with every call, and read the key from the environment or a 0600 file — never printed, never passed on a command line.

Maintenance

Eighty-one commits in two days, 98 assertions passing offline, and tests that source the helpers from the shipping scripts rather than copying them, with a comment explaining why: “a copy drifts, and a test passing against a copy of the gate says nothing about the gate.”

There is no licence file, and gh reports none. For a repository whose whole value is a method other people should copy, that is the one thing to fix.

Verdict

The most carefully reasoned small project we have reviewed, and the rare case where the documentation is the artifact: read docs/fail-open-ledger.md even if you never install the skills, because the failure shape it catalogues — a filter that matches nothing being indistinguishable from a clean result — is in most of the tools in this directory.

Install it if you merge on bot reviews. Understand that Jev is the shadow here, not the judge, and ask the author for a licence before you build on it.

For the opposite arrangement, where the model is the gate, see Jevvy.

See how it compares with other tools in Best Jev tools, tested hands-on.

Review updated Sep 21, 2026. Numbers quoted from the project are its author's own; we don't publish our own measurements of Jev.

More in Agent Integrations (MCP & Skills)

Hermes Jev Skills

★ 718▲ 619

kerpopule/hermes-jev-skills

Bundle of skills that hand an agent's small decisions to Jev: model routing, skill selection, retrieval filtering, compaction, and computer use, with a routing dashboard. Works with Hermes, Claude Code, and Codex.

PythonReviewed

Awesome Jev Skills

★ 464▲ 246

wuyoscar/jev-skill

Nine installable agent skills — triage, routing, code review, document and UI work — with a catalogue of scenarios to copy.

PythonReviewed

jev-mcp

★ 320▲ 263

jkudish/jev-mcp

Proof-of-concept MCP server with ready-made tools for fact checking, prompt-injection detection, and semantic ranking.

JavaScriptReviewed

Get new Jev projects every week

New Jev releases, pricing changes, and the best new projects, once a week. No spam; unsubscribe anytime.

Powered by Buttondown. See our privacy policy.