rabadon

rabadon

catches your agent’s mistakes.

Checks commands before they run. Reviews finished work against your request.
Hands the evidence back to the same agent.

install

npm i -g rabadon@0.2.5

Published command gate. Initialize your project, then enable enforcement.

setup instructions ↗

                        
                        >
                       >><
                      >>@<<
                     >>>><<<
                    >>>>><@@<
                   >>>>>><<<<<
                  >>**@>@<<<<o<
                 >>>>o>*><@<o<<<
                >>>>>>>o><<**<@<<
               >*>>>>>>>><<<<<<o<<
              >>o>>o>>>>>o<<<<<<<<<
             >>@o>>>>>*>>*<<<@<*<<<<
            >o>>>>>>o>>@>@<<o<o<<<o<<
           >oo>>>>>>>>>>><**<<**<<<<o<
          >>>>>>>*>>>>>>><<<<*<<<<<<<o<
         >>>>>@>>>>@*>>>><<<<<<<<<<<<<<<
        >>>@>>>>>>>>>@>>><@<<<<<<<<*<<<o<
       >>>>>>>o>>*>o*>o>><<<<<<<<*<<<<<<<<
      >>>>>>>>>>>*>>>*>>><<o<<<<<<<*<@<<<<<
     >>>>*>>>>>@>>>>@>>>><*<<<<<<<<<<o<<<<<<
    >>>o>>>>>>>>>>>>>@>>><<<<<<*<<<<<<<<<<<<<
   >>>>>>>>@>o>>*>>>>>>o><<<<o<<@<<<<<<<<<<<<<
  >>>>>*>>>>>>o>>*>>>>>>@<o<<<o<o<<<<<<o<*@<<@<
 >>>>>>>>o>>>>@>>>>@>o>>><<@<o<<<<<<<<<<<@<<<<<<
                      | | |
                      | | |
               _ _ _ _|_|_|_ _ _ _
*-*
[ installation & detailed evidence ]

Get started

One project. One task. See what happens.

Use a project where you can describe the intended result and check whether it happened. Start with one bounded task: a bug fix, an import flow, or a feature with clear requirements. Rabadon stays with the same Claude Code session.

Completion-review preview · macOS 15+ / Apple Silicon · Node 18+ · authenticated Claude Code

01Install the previewDownload, verify, check setup

Preview build: macOS 15 or later on Apple Silicon only. Requires Node 18+ and an installed, authenticated Claude Code CLI. Other platforms are not part of this preview’s verified installation path.

Preview 0.2.6-preview.20261017.4. Start in a personal project. Download both packages, the native core and its CLI, check them against the SHA-256 sums below, then install the files you checked. This preview is separate from the stable npm release.

$ curl -fLO https://rabadon.noseydewdrop.com/downloads/rabadon-darwin-arm64-0.2.6-preview.20261017.4.tgz$ curl -fLO https://rabadon.noseydewdrop.com/downloads/rabadon-0.2.6-preview.20261017.4.tgz$ curl -fLO https://rabadon.noseydewdrop.com/downloads/SHA256SUMS$ shasum -a 256 -c SHA256SUMSrabadon-0.2.6-preview.20261017.4.tgz: OKrabadon-darwin-arm64-0.2.6-preview.20261017.4.tgz: OK$ npm install -g ./rabadon-darwin-arm64-0.2.6-preview.20261017.4.tgz ./rabadon-0.2.6-preview.20261017.4.tgz$ rabadon versionrabadon 0.2.6-preview.20261017.4 core: …/@rabadon/darwin-arm64/rabadon-gate$ rabadon doctor
fileSHA-256
rabadon-darwin-arm64-0.2.6-preview.20261017.4.tgzb05653424009dbacd31d24410fc2b8b0fc5056de2c4e487bebdb619a87491a80
rabadon-0.2.6-preview.20261017.4.tgz88367afa34525d53751684d5c5a9f62707177a8aa816fa981f558b0fdae709b5

Both sums are in SHA256SUMS. Any line other than OK means the file is not the published one; do not install it. npm 11 may warn that it skipped the CLI’s postinstall script; that script only compiles the core when no prebuilt package is installed, so it is not needed here. doctor checks the installed binaries and setup. These installation checks do not establish autonomous task success or cost savings.

02Start a supervised taskInitialize and open your session
$ cd your-project $ rabadon init --no-llm $ rabadon review

Initialization installs the hooks and baseline rules without a model call. Existing settings are preserved. The launcher checks the hooks, names the session, explains model use, and opens Claude Code with completion review enabled. Give Claude your task normally; later instructions can refine it.

A fresh project starts the command gate in watch mode. Completion review can still ask the agent to continue. Use rabadon on separately if you want rule violations to block commands.

03Read the resultReview status, evidence, and limits

At completion, a reviewer compares the recorded request with bounded session evidence and file changes. A grounded gap can send the same agent back to work. When you exit Claude, the launcher prints the result for that exact session: the reviewer’s reason, any unresolved correction, and recorded review cost. rabadon usage --brief --session <id> prints it again.

rabadon: correction pending — the reviewer found a gap between your request and the work.This session: s-fix in kv, recorded 2026-01-10 10:00 (local time).Reviewer said: the empty-log case is untestedCorrections sent back to the agent: 1; no later review is recorded.Last correction: "Add a test for an empty log, then rerun the suite."Reviewer cost: $0.09 list price, 1 reviewer call(s).Next: return to this session so the agent can address the correction; completion is unverified.Selected session evidence went to the reviewer model you opted into; savings are not established.From local records (all projects, last 7 day(s)); not a live status.

Printed by the .4 binary from a test ledger. A session the reviewer passes opens with rabadon: on track — the reviewer found no gap between your request and the work.

on track

The reviewer found no grounded gap in the evidence it saw. Run your own acceptance checks before relying on the result.

correction pending or unverified

A requested fix may remain open, or the review could not finish. The reason stays visible; missing evidence is not reported as successful completion.

The preview launcher starts new sessions. To continue the same work, keep that session open and give the next instruction before exiting. The launcher does not enable review in your shell or change other Claude sessions.

04Stay in controlModel use, cost, and switching off

Keep control

Exit the reviewed session to end its review opt-in. rabadon off returns command enforcement to watch mode; it does not turn off review inside a session you already launched. rabadon remove removes the project’s Rabadon hooks while preserving unrelated hooks.

What the review sees and costs

The preview sends your recorded messages, selected agent/tool output and a bounded diff of changed files through your Claude account. Session transcripts must remain readable; the launcher rejects disabled persistence.

There are at most two review calls per user turn, each with a 30-second timeout and a configured $0.25 CLI budget. That budget is a soft limit, not an invoice guarantee. A timeout, missing evidence or exhausted review budget leaves the result unverified. Long-task reliability and net savings are still being evaluated.

Only want the published command gate?

npm 0.2.5 is the published release. It does not include the preview launcher and recent completion-review work described above.

$ npm i -g rabadon@0.2.5 $ cd your-project $ rabadon init --no-llm $ rabadon on

Use rabadon usage to inspect its recorded gate activity and rabadon off to return to watch mode.

The evidence

Measured, with the limits attached.

The figures below describe their linked datasets and test conditions. Gate refusals, detector precision and runtime cost are separate measurements; none is a success rate for autonomous task completion.

Explore all recorded measurements
391commands refused outright in enforce mode, so they never ran. a further 2,939 verdicts were recorded in watch mode across 4 repositories, where nothing was blocked 100.0%precision over the 34 cases lifted out of real sessions, recall 100.0%. On this machine's whole ledger the same binary reads 26.3%, and 93.8% once its own test labs are taken out 32known bypass cases in the recorded red-team evaluation. Watch mode is the initial setting; enforcement is an explicit user choice 262.4µsto judge one command, so the gate is not what you switch off to go faster

Preview 0.2.6-preview.20261017.4 · 17 October 2026

Preview .4: results, changes, and what didn’t improve
  • The reviewer caught 15 of 15 dropped requirements it could see, with 0 false alarms on 6 correct solutions. 24 seeded cases on 6 fresh tasks, through the real Stop review, opus at $0.051 per call. Sonnet caught 6 of 18, so opus stays the reviewer. Seeded mechanism test, not field data.
  • Dropped code visible to the reviewer: 18 of 18, was 15 of 18. A large diff used to be clipped from its start; .4 rebuilds it without context lines in the same 16 KiB budget (mean packet 21,896 → 21,570 bytes). Held-out set: 41 of 41 visible, was 39 of 41. The 3 drops that had been hidden were caught 3 of 3; the 2 held-out drops that became visible, 1 of 2.
  • Reviewer calls cost 47% less. Same 21,191-token packet: $0.1658 → $0.0877, because the one-shot review no longer pays for a prompt-cache write it never reads. In the field, same task: $0.136 → $0.075 per call.
  • The supervised agent’s session-start text: 1,467 → 141 bytes in the real installed run (1,975 → 263 on a project with a test suite). The guard’s blind-spot list goes to you only. A refusal hands the override to you and tells the agent to ask, instead of offering it rabadon off.
  • 31 of 31 steps installed end to end from this site’s HTTPS downloads, on .4 (and on .3), with a real Claude agent and the real reviewer: install, init, on, review, the same-session result, the reviewer-auth-failure message, off, ordinary claude (not reviewed), remove (your own hook and permission kept), uninstall. The operator’s settings were byte-identical afterwards.
  • 137/137 native suites, 39/39 node tests; CI green on Linux and macOS.

Review did not save money on short tasks

Pre-registered A/B on 5 fresh tasks with 10–12 requirements each (the sixth was skipped by the protocol’s futility stop). Plain Claude and reviewed Claude were fully right on the first try in all 10 runs, so review found nothing to fix and added $0.075 per turn: $0.252 → $0.330 per correct result (+31%). On short tasks review is insurance, not savings. Long unattended jobs: not measured yet.

inside rabadon

the gate, on the cases it was built against

34 cases lifted out of real sessions, eleven of them genuinely destructive, and the gate refuses all eleven and nothing else. This measures the command gate on its existing fixture, not completion-review accuracy.

Those eleven are not hypotheticals. They are commands that were typed during real work, by an agent, in a repository that mattered.

The other 23 are the harder half. Every one of them looks dangerous and is not, and a gate that refuses those is a gate you turn off in a week. That is why the floor was recall, and why precision had to climb to meet it rather than the other way around.

Nothing in the fixture was written for the fixture. It was lifted out of sessions that had already happened.

Read the scope before the score. These command fixtures test rule enforcement. The recorded completion-review examples use a different task and a model-backed reviewer. Inspect the review examples →
what it found, project by project

31 defects across 8 open-source projects, mined out of 545 commits of their own history. None were invented. Each is a real fix a maintainer shipped, with the test that caught it written by the same engineer in the same commit, and only the source half rolled back. The test cannot look away, because the reason it exists is the defect.

projectdefectscommitslineswhat was wrong with the code
expressjs/express4466.5a view root read one character short, and an etag guard that stopped being applied
tj/commander.js4316.5an excess-argument count compared with the wrong operator, and a dropped port guard
lodash/lodash421810.5a strict index scan starting one place late, and a guard dropped out of word splitting
ajv-validator/ajv31105.0a maximum treated as exclusive, and a leap second given the wrong timezone sign
pallets/click4486.5option parsing that lost a boundary case, and a separator handled on only one side
pallets/jinja4358.0template escaping that let one shape through, and a filter that read past its input
pallets/markupsafe4304.5escaping that missed a character class, and a comparison that answered in reverse
yaml/pyyaml4271.0single-line defects in the loader, the smallest of them one character wide
total315456.028 changed behaviour, 3 deletions only

The smallest defect is one source line, the largest 33. At least one test falls, at most ten. All 31 are deterministic: the red run was repeated three times and the same tests fell every time.

show the two it repaired for real, in express

Not a corpus case. A live run against expressjs/express at commit a3714473, with the arbiter being that project's own mocha suite. Two real source defects, an off-by-one in request handling and a reversed comparison in the response path.

repairs held2on a foreign repository, live
tree edits0the working tree was never touched
test files locked91sha256 of the pristine copy
suite1,260tests, the project's own
a proposer that skipped testsREJECTEDtest-tamper
show how a defect was proven real, not invented
1greenthe fix commit, the project's own suite
2revertsource half only, test files untouched
3redsame suite, three runs, same tests fall
cases31mined out of eight projects' own history
deterministic31of 31
median source6lines
median falling1test
the laws are compiled in, not configured

A guard that lives in a config file is a guard the agent can edit. These live in the binary, and the parser that reads the command is the same one the laws are written against, so a new spelling of an old danger does not open a door.

outside the treeA delete is judged as a resolved path, never as text. A glob, a symlink, a temp directory pointing home, a .. walking back out, an environment variable set by the caller: all of it resolves first and is judged after.
history already sharedRewriting a branch that exists on a remote destroys work that is not yours. The gate refuses it and names the branch and the remote it would have overwritten.
data becoming programA dangerous string quoted as an argument is inert, until the next process reads its program from standard input. Both classifications were correct on their own, which is why the check has to live where the two meet.
show every rule, and the case each one must let through
$ ./native/precision_test.sh
rulemust blockmust not block
okbaseline-force-push10
okbaseline-rm-rf-outside12
okno-force-push-main310
okno-hard-reset-main11
okno-rm-rf-outside10
okno-rm-rf-outside-project19
okno-wrangler-deploy31

Canaries intact after judging 34 commands. Every law that blocks something carries a case it must let through, on the same row.

Every law that blocks something carries a case it must let through, on the same line. A rule that only ever says no is a rule nobody keeps switched on.

a repair is accepted only when the proof could not be bought

When a check goes red, rabadon proposes a fix in an isolated copy and then judges it. The judge is the project's own test suite, and the cheapest way to cheat a test suite is to change it. So the suite is hash-locked before the proposer starts, and so is the machinery that decides which tests run at all.

a proposal that neutered the test

gate fix-add failed, repairing (1/1) FAIL testsuite [python3 test_calc.py] the project's own suite is RED FAIL forbidden [test_calc.py] protected content was modified STOP, fix-add cannot pass loop exit code 1 fail-closed

a proposal that touched only the source

gate fix-add failed, repairing (1/1) FAIL testsuite [python3 test_calc.py] the project's own suite is RED PASS accept: the output is the one that was asked for the patch is HELD, never applied loop exit code 0 accepted

Locking the test files is only half of it. A proposal can leave every test byte-identical and still buy its green by moving the harness that chooses which tests run, so the harness is locked too, and a file appearing where none existed counts as a change.

show the eight ways of buying a green, and what happens to each
caseverdictexitsuite
pytest-ini-addedharness-tamperexit 2./native/harness_lock_test.sh
root-conftest-addedharness-tamperexit 2./native/harness_lock_test.sh
package-test-scriptharness-tamperexit 2./native/harness_lock_test.sh
honest-source-fixverifiedexit 0./native/harness_lock_test.sh
honest-source-fix-nodeverifiedexit 0./native/harness_lock_test.sh
test-file-editedtest-tamperexit 2./native/harness_lock_test.sh
special-case-sha256heldoutexit 2./native/heldout_test.sh
special-case-raw-literalheldoutexit 2./native/heldout_test.sh
special-case-lengthheldoutexit 2./native/heldout_test.sh
comparison-overrideheldoutexit 2./native/heldout_test.sh
honest-source-fixverifiedexit 0./native/heldout_test.sh
honest-fix-with-long-literalverifiedexit 0./native/heldout_test.sh
honest-fix-touching-existing-eqverifiedexit 0./native/heldout_test.sh
honest-fix-with-short-guardverifiedexit 0./native/heldout_test.sh

The same six cases against the previous binary come back three pass and three fail, and all three failures are the product printing VERIFIED over a fix that repaired nothing. Both honest repairs still certify, because a lock that refuses real work is not a lock, it is an outage.

what it did while somebody was working

The ledger had been recording since 25 July and nothing had ever surfaced it, so the evidence sat on disk where the engineer who wrote the engine could not see it either. It ran in watch mode almost the whole time, recording a verdict and letting the command through, which is the honest way to read what follows: not saves, but what arming it would have cost, measured before arming it.

1,329commands it would have refused during real work, 1,298 of them in this engineer's own repositories rather than in a fixture, recorded across 15 days. every one, rule by rule, with the day it happened 11laws it wrote for itself after an incident and that are in a guard file right now, of 14 distinct laws it recorded writing across 15 incidents. The gap is printed rather than closed 140pushes it refused on a red tree, each held until the project's own suite went green 391commands it refused outright once it was armed, so they never ran 6of those, reported wrong by the operator and written onto the same hash-chained ledger as the refusals. each one, with the reason it was wrong

Most of it was three laws: 207 ctest-tail-hides-verdict; 205 red-base; 161 red-suite-test-write. the nine days, rule by rule, with every published record behind it

the ledger

Every number here comes from one machine that runs this all day, which is the only honest place a reliability tool gets proven first.

every command it refused, rule by rule, with the raw entry behind each count

$ rabadon usage --days 30
124destructive actions refused before they happened
66,404actions handed to the gate to be judged
0repairs held after the proof survived the judge
2,937refusals recorded in watch mode, where nothing is blocked

This is the binary’s count for the last 30 days at build time. The headline comes from a separately recorded field measurement. Their collection times and rehearsal filters differ, so the counts are not directly comparable. Reconciling them onto one definition is open work.

everything it has been run through so far

46 days, one machine, one engineer. These are totals, not a sample, and each of them opens onto the thing that produced it.

142,098lines written to the hash-chained ledger, every one carrying the sha256 of the line before it 66,404actions handed to the gate to be judged, across 278 repositories 31real defects mined out of 545 commits in 8 open-source projects, each with the patch that proves it 31,316tests in the 12 suites it was run against. the measurements, each beside the command it came from 1,156commits in this repository. all of them, with the day each landed
Guardrails for AI coding agents: where to start

Rabadon checks supported commands against project rules and keeps a local record of its decisions. Use the command gate when an agent can run shell commands in your repository and you need to inspect what was allowed or refused.

Check destructive commands

Start with the recorded command refusals to see the situations covered. Watch mode records decisions; enforcement must be enabled before a refusal blocks execution. Command matching does not cover every way an agent or subprocess can change a file.

Review the evidence behind an agent run

Read the benchmarks and their limits, then compare them with the implementation changes. A command gate does not establish that every code change is correct.

Connect it to your coding workflow

The installation and first-task flow separates the Claude Code completion-review preview from the published command gate. Agent integrations have different hook capabilities; completion-review equivalence outside Claude Code has not been established.