Ranex
Who decides · What counts as evidence · No self-approval · The permanent record

The parts of the judge outside your loop

Four questions, one page each answers below: who decides, what counts as evidence, who cannot approve their own work, and what nobody can quietly edit afterward. Said plainly where the answer is designed and not yet built.

0
Model calls in a verdict
943
Frozen test IDs in the self-gate
GitHub
MIT
Open-source kernel
Pre-release
Working verdict path, stated gaps

Who can decide?

Three roles at the leaf nodes. None of them can pass a gate.

Models show up in exactly three places — proposing a diff, critiquing one, translating machine state into plain language — and none of those roles can pass a gate. evaluate() is the only decider in the system: a pure function of gate, evidence, subject, and approver. Workers build in their own worktree; only the kernel merges.

evaluate()
The only decider
0
Model calls in a verdict
3 roles
Proposer · critic · translator
None
Of them can decide

Deterministic evaluation

Works today

A verdict is a pure function of (gate, evidence, subject, approver). Same inputs, same verdict, always.

ranex gate evaluate HEAD

Gates that cannot block are refused

Works today

A non-blocking gate is decoration, so the kernel refuses to construct one at all.

refused at construction

Credential-independence

Works today

Removing every model credential from the machine must not change a single verdict — a stated invariant, not a preference.

invariant, CLAUDE.md

Headless delegation

Works today

ranex task delegate runs a real agent in a dispatched worktree, in an environment built from empty that refuses to start holding the signing key; a wall-clock bound kills the whole process group. The worker returns a diff, never a verdict.

ranex task delegate

Bounded fanout

Stated limit

ranex task fanout runs a bounded pool of workers, one worktree each, and the journal chain verifies after concurrent runs — but it is prototype scope: no A/B/C approval or child-grant admission yet, so it is not approved mutation authority in production.

prototype only, README Known gaps

The kernel merges

Works today

ranex task merge publishes a judged candidate only through ordered journalled checks — ancestry, merge-range, digest/evidence, and CAS each refuse red-first. Workers never merge; the kernel does, as a checked fast-forward.

ADR-012, SLICE-010

Flow graphs, scenarios, and the human gate

Designed

Intake to an owner-approved flow graph, mechanical compilation to scenarios and frozen contract tests — the human decides what the software should do; the kernel decides whether it happened. Designed, not built, and the README says so.

README, Status

What counts as evidence?

Bound to an exact commit digest, signed, and refused when absent.

Evidence is admitted only when it is bound to the exact commit it describes, signed by a registered producer, and produced by the command the committed catalog declares. A missing claim does not default to fine — absence is a FAIL. Anything else is refused, with a reason.

Ed25519
Signed records
Digest
Bound to the subject
argv
Claim ↔ command binding
Refused
Never silently absent

Absence blocks

Works today

A required claim with no satisfying evidence is FAIL — never a default, never a skip. On a fresh clone the gate fails by design, naming exactly the missing claim.

fail-closed by construction

Subject-bound evidence

Works today

The same command run against a different commit proves nothing about this one. Stale evidence stops counting automatically.

evidence pinned to a code digest

Signed evidence

Works today

Ed25519 signatures verified against a committed public keyring before a record is admitted. The verifier holds only public keys and cannot forge.

governance/producers.yaml

Claim ↔ command binding

Works today

The committed catalog declares the argv that satisfies a claim, and the kernel compares its digest — so a signed record of `true` no longer satisfies "tests executed".

digest-bound argv

Refusal with a reason

Works today

A record that fails verification is reported as refused, never as "no evidence" — because an attack and an unfinished task are not the same event.

refused ≠ absent

Materialised subject

Works today

The command runs against a materialisation of the subject commit — every blob checked against the object id the tree carries. Not your working tree.

ranex run --claim tests-executed

Deliberate dependency provisioning

Works today

Locks are re-derived clean and byte-compared, only SHA-256-addressed wheels enter the store, and a human approves the named package delta before a gated run.

ranex deps fetch / deps approve

A skip is absence

Works today

Signed structured outcomes are judged against a frozen suite manifest. An undeclared skip, xfail, xpass, error, or missing test ID blocks the gate; a zero exit code alone does not satisfy the gate.

governance/suite_manifest.json

Ranex gates Ranex

Works today

The kernel already judges this repository's own suite — 943 frozen test IDs, run provisioned, sealed, and offline against the real current commit.

943 IDs in the frozen manifest

Approved dependencies can still lie

Stated limit

An approved, hash-correct wheel still chooses its own exit code. Recorded in the repo as a passing security test that states the boundary — not smoothed over.

test_slice006_approved_wheel_can_lie.py

Who can't approve their own work?

The producer and the approver are never the same actor.

No self-approval: whoever produced the evidence cannot also record the approval, on every evaluation, with no exception path. The caveat ships every time it does: approver identity is unauthenticated today — --approver is a plain string, so this check compares unverified strings, not verified identities.

Producer
≠ approver, always
Unauthenticated
Approver identity, today
CANDIDATE
Never a worker's own PASS
Human's
Where the stamp stays

No self-approval

Works today

Whoever produced the evidence cannot record the approval — producer and approver are never the same actor, on every evaluation, with no exception path. The caveat that ships with this claim every time: approver identity is unauthenticated today, so this check compares unverified strings.

producer ≠ approver — identity unauthenticated

Keyless judging

Works today

A separate keyless invocation judges the worker's emission — producing a CANDIDATE that names its missing claims, never a PASS. The stamp stays a human's, out-of-band.

ranex task judge

Frozen tests, judged by someone else

Designed

The task that implements a scenario should never author or judge its own test: tests frozen before BUILD, red-then-green enforced, edge coverage as a gate rather than a metric. That general rule depends on flow-graph and scenario compilation, and the README lists both as designed, not built.

README, What makes a verdict trustworthy

What's the permanent record?

Append-only, hash-chained, and replayable by an operator.

Every verdict lands in an append-only, hash-chained record. Database triggers prohibit ordinary updates and deletes, each row links to the previous, and an operator can recompute the whole chain at any time.

Append-only
By construction
Hash-chained
Row to row
Replayable
Journal → full replay
SQLite
Local, in your repo

No rewrites

Works today

SQLite triggers prohibit ordinary updates and deletes; the hash chain detects out-of-band row edits.

ranex journal verify

Operator verification

Works today

One command recomputes the hash chain end to end, so an auditor does not have to trust the machine that wrote it.

ranex journal verify

Rollback detection

Stated limit

An internally consistent earlier prefix still verifies after later rows are removed. A stated limit in the README, assigned — not hidden.

README, Known gaps
Everything lives in your repository

The trust roots are committed

The gate catalog, the public keyring, and the frozen suite live under governance/ in the governed repository — reviewed like code, because they are code.

Committed governance state
Gate catalog
Claims and their bound commands
governance/gates.yaml
Public keyring
Producers — public halves only
governance/producers.yaml
Frozen suite
943 IDs · 113 expected skips
governance/suite_manifest.json
# Produce evidence: run the bound command hermetically
$ ranex run --claim tests-executed --producer worker -- uv run pytest -q
# Ask the kernel for a verdict
$ ranex gate evaluate HEAD --approver reviewer_alice
# Verify the record — recomputes the hash chain
$ ranex journal verify

On a fresh clone, gate evaluate fails by design. No evidence exists yet, and absence blocks.

Nothing that exists is behind a paywall

Every line below ships in the same MIT-licensed repository. There is no paid column, because there is no paid tier — and the limits are listed beside the capabilities, not below the fold.

CapabilityStatusIn the repository
evaluate() — a verdict is a pure function of gate, evidence, subject, approverWorks todaysrc/ranex/governed_execution/
Absence blocks — a required claim with no satisfying evidence is FAILWorks todaya fresh clone fails, naming the missing claim
No self-approval — whoever produced the evidence cannot approve it (approver identity is unauthenticated today)Works todayproducer ≠ approver, every evaluation, on unverified strings
Subject-bound evidence — stale evidence stops counting automaticallyWorks todayrecords pinned to a commit digest
Signed evidence — Ed25519, verified against a committed public keyringWorks todaygovernance/producers.yaml
Claim ↔ command binding — the catalog declares the argv that satisfies a claimWorks todaygovernance/gates.yaml
A skip is absence — undeclared skip, xfail, xpass, error or missing ID blocksWorks todaygovernance/suite_manifest.json — 943 IDs, 113 expected skips
Hermetic observation — the command runs against a materialisation of the commitWorks todayranex run, environment built from empty
Deliberate dependency provisioning — clean re-derivation, human-approved deltaWorks todaygovernance/deps.yaml · deps fetch / deps approve
Append-only, hash-chained journal an operator can recomputeWorks todayranex journal verify
Headless delegation in an isolated worktree, and a bounded fanout poolWorks todayranex task delegate · ranex task fanout
Approver identity is unauthenticated — --approver is a plain stringStated limitREADME, Known gaps
The journal does not detect rollback or truncationStated limitREADME, Known gaps
An approved, hash-correct wheel still chooses its own exit codeStated limittests/security/test_slice006_approved_wheel_can_lie.py
The kernel merges — ranex task merge as the only governed publication pathWorks todayADR-012 · SLICE-010, closed
Flow graph → covering paths → scenarios → frozen contract testsDesignedREADME, Status — designed, not built
Budget and escalation to a human in plain languageDesignedREADME, Status — designed, not built

The check mark means MIT, not paid. Rows marked Stated limit and Designed are here because the repository states them plainly — a governance tool that hides its own gaps has already failed its own test.

Want to see it up close?

The kernel is open source under MIT. Read the code that decides pass or fail, or see how to contribute.