vurnix/ honest gate
deterministic · zero-dependency · any agent

The honest gate for
AI-written code.

AI coding agents don't just write bugs. Told to “make the tests pass”, they delete the failing assert, skip the test, or import a module that doesn't exist. The suite goes green; the code is still broken. Vurnix is the deterministic gate that makes those shortcuts impossible to hide.

$ pip install vurnix

then vurnix gate ./myproject — compile + phantom-import + honest test count, one verdict.

Real output. A cloud model, brought in to rescue a failing build, rewrote a 17-assertion test file down to 3 to go green. The gate caught it — and named the deleted test.

the one rule
A check that cannot run
is not a check that passed.

No model in the loop. No heuristics you have to trust — every check is plain code you can read, with a hard exit code. Missing a toolchain is a labelled SKIP, never a silent OK. Any failing check is a BLOCK and a non-zero exit. There is no “mostly green”.

01

How agents game the suite

Shortcuts a human reviewer rarely thinks to check for — and a deterministic checker always does.

01 / weaken

Delete the failing assert

The one line that proved the behaviour is simply removed. What's left still runs — it just tests nothing.

suite → green  ·  code still broken
02 / skip

Skip or xfail the test

A @skip or xfail quietly excuses the case that was catching the bug.

suite → green  ·  code still broken
03 / pad

Pad with assert True

New “tests” that assert nothing inflate the count so coverage floors look satisfied.

count → up  ·  nothing verified
04 / invent

Import what doesn't exist

from models import UrlRequest — no such module, anywhere. Valid syntax; fails cryptically later.

syntax → ok  ·  module → nowhere

Each one turns the suite green without fixing the code. Vurnix makes every one of them a hard, named failure — before anyone claims the tests pass.

02

The checkers

Six commands. Each is plain code with a hard exit code — usable standalone or as one composite gate.

CommandCatchesLanguages
vurnix integrity tests being weakened to go green — deleted asserts, new skip/xfail, always-true asserts, deleted test functions
pyjsgojava
vurnix coverage padded test counts — only distinct, non-trivial tests count; assert True and copy-paste duplicates don't
pyjsgojava
vurnix mutation weak tests — mutate the implementation; a mutant your tests don't kill is a coverage gap with a file:line name
py+ C-family
vurnix phantom invented imports — a module referenced in code that exists nowhere: not stdlib, not local, not vendored
py
vurnix compile code that doesn't even build, per file, before anyone claims “tests pass”
pyjsgojava
vurnix gate composite — compile + phantom + coverage floor, resolved to one honest verdict
all
03

Measured, not claimed

Every checker earned its place catching a real incident in our 12B-class local-model benchmarks.

173
asserts a rescue model silently dropped to go green
Caught and blocked by integrity, with the deleted test named.
69%/15%
mutation score: a behaviour-checking suite vs. status-code theatre, on the same CRUD app
A suite that only checks status == 200 scores ~15%; real behaviour ~70%.
4
languages carry the full honest stack: compile · coverage · anti-weakening · mutation
Python · JavaScript · Go · Java — SKIP-labelled when a toolchain is absent.
047
of 201 real-repo tasks delivered once an execution gate drove the fix-loop
Single-shot passed none; the gated loop turned failures into fixes.
55%75%
HumanEval-Go pass rate, single-shot vs. gated fix-loop
+20 points from letting a hard gate decide what “done” means.
from models
import UrlRequest
an import a local model invented — no such module, anywhere
Valid syntax; flagged by phantom before it failed cryptically at install.

Deterministic orchestration is commoditised. An honest gate that never reports a green it can't defend has no counterpart — that's the whole point.

The trust primitives, in the open.

These checkers are extracted from the gate of a local-first autonomous coding pipeline we run against small local models — an environment where every failure mode of agentic coding shows up early and often. The orchestration pipeline itself isn't in the box. These are its trust primitives: zero runtime dependencies, usable with any agent, harness, or CI.