The model returns probabilities, not a review comment. A rule like weakens_tests >= 0.6 → block is one line of YAML.
When most of your commits are written by agents, the merge queue is the bottleneck. mergeone replaces its one slow question with five fast, typed, calibrated ones per pull request, and turns them into a verdict through a policy file you own.
PR state ──▶ decision model ──▶ calibrated probabilities ──▶ policy rules ──▶ verdict + route
(Jev / Haiku) is_logic_change 0.91 .mergeone.yaml pass · hold · block
weakens_tests 0.07 auto-merge · human · domain-review
message_matches_diff 0.88
touches_concurrency 0.63
needs_human_review 0.41
└── every decision + its input → gatelog
The model returns probabilities, not a review comment. A rule like weakens_tests >= 0.6 → block is one line of YAML.
0.6 means sixty percent. Isotonic maps fitted on labelled history ship with the binary; raw ECE 0.17 becomes 0.03.
Model down? The PR holds for a human. Every verdict is stored with its exact input, because a System One model gives no rationale.
Hundreds of open agent PRs become waves of non-conflicting changes that land in parallel; one typed question catches semantic conflicts files cannot.
gatebench is pre-registered: hypotheses and thresholds were committed before any model ran, and results are published whichever way they fall. 40,000 Kubernetes merges, four systems, two runs.
Rules, gradient boosting, Claude Haiku 5.5 and Jev all score PR-AUC ≈ 0.010 against a 0.0075 base rate. Pre-merge state does not contain that signal. Nobody else publishes this.
Behaviour change, weakened tests, concurrency risk and needs-human each reach ROC-AUC 0.87–0.96 with calibrated ECE under 0.05, in one request per PR. Jev meets the pre-registered bar on 5/5 questions at 347 ms and $0.074 per thousand.
| question | Jev AUC | Haiku AUC | Jev ECE (cal.) | Haiku ECE (cal.) |
|---|---|---|---|---|
| is_logic_change | 0.94 | 0.95 | 0.030 | 0.027 |
| weakens_tests | 0.96 | 0.96 | 0.031 | 0.009 |
| message_matches_diff | 0.80 | 0.78 | 0.037 | 0.045 |
| touches_concurrency | 0.95 | 0.96 | 0.016 | 0.017 |
| needs_human_review | 0.87 | 0.88 | 0.047 | 0.041 |
What still fails: routing the top 25% to humans captures only 44% of the judge's "needs a human" PRs (bar was 70%). That number is on this page on purpose.
mergeone is an MCP server. Register it once, add one line to your agent's instructions, and every merge goes through the gate instead of around it. The same calls exist over HTTP for everything else.
# register claude mcp add mergeone -- mergeone mcp --policy .mergeone.yaml # CLAUDE.md Before merging, call gate_decide. Merge only on "pass". # response { "verdict": "hold", "route": "human", "rule": "message-mismatch", "probs": { "message_matches_diff": 0.31, … } }