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.
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.
Deterministic evaluation
Works todayA verdict is a pure function of (gate, evidence, subject, approver). Same inputs, same verdict, always.
ranex gate evaluate HEADGates that cannot block are refused
Works todayA non-blocking gate is decoration, so the kernel refuses to construct one at all.
refused at constructionCredential-independence
Works todayRemoving every model credential from the machine must not change a single verdict — a stated invariant, not a preference.
invariant, CLAUDE.mdHeadless delegation
Works todayranex 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 delegateBounded fanout
Stated limitranex 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 gapsThe kernel merges
Works todayranex 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-010Flow graphs, scenarios, and the human gate
DesignedIntake 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, StatusWhat 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.
Absence blocks
Works todayA 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 constructionSubject-bound evidence
Works todayThe same command run against a different commit proves nothing about this one. Stale evidence stops counting automatically.
evidence pinned to a code digestSigned evidence
Works todayEd25519 signatures verified against a committed public keyring before a record is admitted. The verifier holds only public keys and cannot forge.
governance/producers.yamlClaim ↔ command binding
Works todayThe 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 argvRefusal with a reason
Works todayA 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 ≠ absentMaterialised subject
Works todayThe 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-executedDeliberate dependency provisioning
Works todayLocks 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 approveA skip is absence
Works todaySigned 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.jsonRanex gates Ranex
Works todayThe 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 manifestApproved dependencies can still lie
Stated limitAn 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.pyWho 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.
No self-approval
Works todayWhoever 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 unauthenticatedKeyless judging
Works todayA 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 judgeFrozen tests, judged by someone else
DesignedThe 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 trustworthyWhat'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.
No rewrites
Works todaySQLite triggers prohibit ordinary updates and deletes; the hash chain detects out-of-band row edits.
ranex journal verifyOperator verification
Works todayOne command recomputes the hash chain end to end, so an auditor does not have to trust the machine that wrote it.
ranex journal verifyRollback detection
Stated limitAn internally consistent earlier prefix still verifies after later rows are removed. A stated limit in the README, assigned — not hidden.
README, Known gapsThe 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.
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.
| Capability | Status | In the repository |
|---|---|---|
| evaluate() — a verdict is a pure function of gate, evidence, subject, approver | Works today | src/ranex/governed_execution/ |
| Absence blocks — a required claim with no satisfying evidence is FAIL | Works today | a fresh clone fails, naming the missing claim |
| No self-approval — whoever produced the evidence cannot approve it (approver identity is unauthenticated today) | Works today | producer ≠ approver, every evaluation, on unverified strings |
| Subject-bound evidence — stale evidence stops counting automatically | Works today | records pinned to a commit digest |
| Signed evidence — Ed25519, verified against a committed public keyring | Works today | governance/producers.yaml |
| Claim ↔ command binding — the catalog declares the argv that satisfies a claim | Works today | governance/gates.yaml |
| A skip is absence — undeclared skip, xfail, xpass, error or missing ID blocks | Works today | governance/suite_manifest.json — 943 IDs, 113 expected skips |
| Hermetic observation — the command runs against a materialisation of the commit | Works today | ranex run, environment built from empty |
| Deliberate dependency provisioning — clean re-derivation, human-approved delta | Works today | governance/deps.yaml · deps fetch / deps approve |
| Append-only, hash-chained journal an operator can recompute | Works today | ranex journal verify |
| Headless delegation in an isolated worktree, and a bounded fanout pool | Works today | ranex task delegate · ranex task fanout |
| Approver identity is unauthenticated — --approver is a plain string | Stated limit | README, Known gaps |
| The journal does not detect rollback or truncation | Stated limit | README, Known gaps |
| An approved, hash-correct wheel still chooses its own exit code | Stated limit | tests/security/test_slice006_approved_wheel_can_lie.py |
| The kernel merges — ranex task merge as the only governed publication path | Works today | ADR-012 · SLICE-010, closed |
| Flow graph → covering paths → scenarios → frozen contract tests | Designed | README, Status — designed, not built |
| Budget and escalation to a human in plain language | Designed | README, 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.