Your coding agent says it's done. Make it prove it.

looprail runs the agent CLIs you already have (Claude Code, Codex, Copilot, Gemini, aider, opencode, local models) in one loop that only exits when real tests pass and a critic on a different provider signs off. Cross-model review is the point: a vendor can't be its own honest reviewer.

View on GitHub try it offline, no keys: npx looprail demo

8 agent adapters1,250+ testsMIT$0 API keys, reuses your CLI logins

looprail run

      

the loop

The loop is the product

Prompt-level rules ("never modify the tests") demonstrably don't hold. Production reward-hacking studies show agents deleting assertions, patching pytest configs, and special-casing test inputs. looprail's answer is structural: anchor every check to something the model can't fake.

executor real tests blind critic verified fail → iterate with feedback

rails

Rails the agent can't argue with

Every rail is deterministic: file hashes, exit codes, registry responses, diffs. No rail needs its own model call, so no rail can be gamed the way a prompt can.

protect: tests

Test files are hashed at run start. Any edit fails the iteration with a revert instruction; a repeat halts the run. Covers the documented exploits, from deleted assertions to conftest and jest-config patching.

blind: true

The critic reviews the actual git diff since run start, never the worker's own description of what it did. A model can lie about its work; it can't lie about the diff.

scope: [globs]

An allowlist of what the task may touch. Asked for a modal fix and got twelve files? Out-of-scope changes fail the iteration with a revert instruction.

verify_deps: true

Every package the agent adds is checked against its registry. Hallucinated names fail the iteration; freshly published lookalikes get flagged as a squat signal.

ledger: true

Every verdict lands in a hash-chained, committable file: who judged what, on which model, with a digest of the judged output. Rewrite history and the chain breaks, verifiably.

rails: max_cost_usd

Hard ceilings on iterations, dollars, and wall-clock. Checked before each node starts, counting real and estimated spend. A loop halts the moment it would go over, not one expensive step later.

quickstart

Quickstart

No API keys of its own. Adapters reuse each CLI's existing login.

# see the whole loop first - offline, nothing installed, ~5 seconds
npx looprail demo

# then in your project
npm install -g looprail
looprail init          # detects your agent CLIs + your real test command
looprail run --dry-run # preview nodes, models, budget - spends nothing
looprail run           # exit 0 only when it's actually done

long run

Built for the long run

cross-provider by construction

Self-review is barely better than a coin flip, and judges prefer output that looks like their own. The strongest critic is on a different provider than the worker, something no single vendor's orchestration can offer about itself. How it compares →

unattended without fear

Queue goals overnight; gates park instead of failing and notify you. Resume never re-bills finished work. Rate-limited provider? The agent's fallback chain hops to another one. Watch everything from one dashboard.

long loops that don't rot

context: fresh rebuilds the executor's prompt each iteration from goal, plan, feedback, and its own on-disk notes, never a growing transcript. Disk is the memory.

spec in, verified build out

init --from-spec prd.md: the planner maps every requirement to implementing and verifying nodes, an independent critic re-reads the spec and fails on gaps, and you approve the plan at a gate before anything executes.