Inspiration
AI coding agents love to say "done." Too often the code doesn't build, the tests fail, or the fix never happened. We wanted a referee that checks the claim against real evidence, and that no model, including the one that wrote the code, can talk out of a result.
What it does
ProofRail turns a task into a contract of checks (files, JSON fields, hashes, and approved test-command profiles) and runs them to produce a deterministic PASS, FAIL, or INCONCLUSIVE, with the evidence recorded: exit code, timings, and output.
- PASS and FAIL are separate from INCONCLUSIVE, which means "we couldn't establish the result" (missing evidence, timeout, unsafe path). It is never silently treated as a pass.
- Nemotron on Nebius is an optional assistant.
proposedrafts a contract from a plain-English task, andexplainturns a result into plain language. Neither can set or change a verdict. - A web UI (built from Stitch designs) shows the live result of each run, and a no-key demo mode shows the same workflow with clearly labelled simulated AI output.
How we built it
- Python standard library only, with no third-party dependencies. The engine, a strict contract validator, and a CLI.
- Command checks use trusted profiles defined in code, not shell strings. The first is pytest, with an argument allowlist, a scrubbed environment, timeouts, bounded output, and resource limits (Windows Job Objects, Linux rlimits). An optional Linux mode isolates the network and filesystem with bubblewrap.
- Hardened file access: path confinement, symlink and junction rejection, and race-resistant opens. Contract-supplied regexes run in a killed-on-timeout child process to prevent ReDoS.
- The AI layer is a standard-library client for Nebius Token Factory (default model
nvidia/nemotron-3-super-120b-a12b). Model replies are untrusted: strict JSON validation, every proposed check re-validated by the engine's own contract validator, rejects never repaired, drafts that require human review, and explanations written to separate files. - Over 300 automated Python tests plus JavaScript tests for the UI's result handling.
Challenges we ran into
- Making "AI-assisted" and "deterministic" coexist. We kept the assistant out of the verification path entirely, and tests prove the engine never imports it.
- Tests exposed real bugs: orphaned processes keeping output pipes open past a timeout,
pytest not installedbeing reported as a test failure, and a contract validator that accepted../paths a model could have proposed. - Cross-platform security. Windows and Linux needed different race and process-limit mechanisms, and symlink tests needed Linux (WSL) to run for real.
- Honest scoping: deciding what we could truthfully call isolated, signed, or tested.
Accomplishments that we're proud of
- A verdict that cannot be influenced by any model, enforced by structure and by tests rather than by promises.
- Strict handling of untrusted model output, including a hostile-provider test that tries to change verdicts and fails.
- Security work we could demonstrate: negative-control tests that prove each mitigation actually catches the attack.
- Everything runs offline with no credentials, and demo output is labelled as simulated everywhere it appears.
What we learned
- Treat a model as an advisor, never the judge: validate its output with the same rules you apply to any untrusted input.
- "Exit code 0" is not proof. A workspace's own code can fake a pass, so we label that limit instead of hiding it.
- Tests that include a deliberately broken control are the fastest way to find a weak mitigation.
What's next for ProofRail: Deterministic Verification for AI Agents
- Run and report on the live Nebius/Nemotron integration. So far it is tested against a local fake of the API.
- More command profiles (JavaScript, type checkers, linters) and OS isolation by default instead of opt-in.
- Show command evidence and AI explanations in the web UI.
- Signed, tamper-evident results, and a CI integration that gates agent pull requests on a ProofRail verdict.
- A contract editor, so humans review AI-proposed checks in the UI.
Built With
- bubblewrap
- claude-code
- ffmpeg
- html
- javascript
- json-schema
- nebius
- nebius-token-factory
- node.js
- nvidia-nemotron
- openscreen
- pytest
- python
- stitch
- tailwindcss
- vercel

Log in or sign up for Devpost to join the conversation.