Skip to content
ProveGate
GitHubGet started
open-source · CLI + method

Your coding agent's “done” is not evidence. Gate it on exit codes.

Seven phases where every autonomous boundary is a machine-checkable gate — a verification command’s exit code, or an independent cross-model reviewer’s structured verdict. Nothing pushes to a remote without a human. Hardened over ~390 production work items. MIT, agent-agnostic, bring your own gates.

zsh — ~/app
$ npm install -D provegate
added 1 package
$ npx gate init
[init] next: see QUICKSTART.md
$ npx gate run PRD-001
phase 4pnpm check-types· exit 0passed
phase 5pnpm test· exit 0passed
phase 6review artifact (Critical 0)passed
✓ phases 4–7 passed. merged into LOCAL main.
→ handoff card ready — you run `git push`.
Read the specHow gates work
MIT · zero deps · local-only · no telemetry · Node ≥ 22
┌─ HANDOFF CARD ────────────────────────────────────────
PRD-001 (fix-login-timeout)
merged: feat/prd-001-fix-login-timeout → LOCAL main (no-ff)
phase 4: typecheck + lint + build
phase 5: §11 verification commands
phase 6: review artifact (verdict pass, Critical 0)
post-merge: build green
→ READY TO PUSH — run `git push` yourself (the runner never pushes)
└───────────────────────────────────────────────────────
listed but not run is never passedone test killed what 80+ agents could notpush is always yours

// the problem

Strong generators. Unreliable narrators.

Neither the agent's claim, nor a panel of agents' consensus, nor a human's felt sense of progress can serve as a gate. Only executed evidence can.

22.58%

of validated failure episodes are inaccurate self-reporting — the agent claiming a test or deploy passed when it did not. Its share grows as models improve.

20,574-session field study
80+ agents

unanimously endorsed an OpenSSL padding-oracle vulnerability that does not exist — ten of them dedicated reviewers. One executed test killed it.

security review campaign
19% slower

Experienced devs forecast a 24% speedup and felt a 20% speedup — and were measurably slower. Felt progress is not evidence either.

METR RCT · 16 devs · 246 tasks

// the core rule

A phase boundary is a gate only when a machine can check it: a command’s exit code, or an independent reviewer’s structured verdict. The implementing agent’s own assessment is never a gate. And neither is a panel of agents’ consensus, nor a human’s felt sense of progress.

// how it works

Run the gates. Read the evidence. Nothing else counts.

ProveGate wraps your agent's workflow in checks a machine settles. The CLI prints exactly what ran, what passed, and what did not — then hands the push back to you.

gate run — PRD-001
$ gate run PRD-001
01

Declare the gates

Each check is a command with an expected exit code, declared in gates.manifest.json. No prose, no vibes — a gate is a thing a machine can run.

02

Agent works the phases

The agent implements, tests, audits and learns autonomously. Every claim it makes is re-run, not trusted.

03

Evidence decides

Green is earned by exit 0 or an operator verdict. Listed but not run is never passed — the handoff card records what actually ran.

// playground

Edit the manifest. Read the plan.

This is the whole model: gates in, evidence out. gates.manifest.json declares the per-phase commands; phases 5, 6 and 7 carry built-in gates it cannot remove. Edit it and the plan below re-reads it live.

gates.manifest.json
$ gate run --dry-run PRD-001
── Phase 4 Implementation
• pnpm check-types
• pnpm lint
• pnpm build
• pnpm test
── Phase 5 Testing
• gate: §11 verification commands (from the PRD)
── Phase 6 Final Auditing
• gate: independent-review ledger + schema
── Phase 7 Learning
• gate: durable artifacts touched in merge diff
── Phase 7 Learning
• pnpm verify:brain
── archive wip→completed (pre-merge)
── merge feature → LOCAL main (no-ff) + post-merge gates
── handoff card → HUMAN runs `git push` (the runner never pushes)
nothing runs · nothing merges · this is a plan
[run] 8 gates planned — nothing executed, nothing merged, nothing pushed

a plan, not a run — validation and chain order are the shipped ones; verdicts come only from `gate run`.

// the method

Phases 1–3 human, 4–7 autonomous. Push is always yours.

Humans own intent and release. The machine owns the verified middle.

1
PRD
2
Readiness
3
Tasks
4
Implement
5
Test
6
Audit
7
Learn
Push (you)

// the seven phases

Every phase, and who owns it.

Select a phase to see what happens and who decides. A human owns 1–3 and the push; the agent works 4–7 — and earns nothing without evidence.

Test

machine gate · agent

The PRD’s declared verification commands run. A command that was listed but not executed is never passed.

// operator gates

When a command can't decide, a person does.

Some checks aren't machine-settleable — a release sign-off, a security judgement. Route those to a named owner; the acceptance is recorded like any other evidence, and the merge gate refuses while the row is unaccepted.

machine gates pass, exit 0
owner records the acceptance
the merge gate validates it
owner acceptsmerge

An agent never writes an acceptance for itself: recording one is a deliberate action by an allowlisted owner, and the merge gate refuses a row that has none.

$ gate push
No. Push is yours.
The runner contains no code path that pushes to a remote. That decision stays with a human.

// the evidence ledger

Listed but not run is never passed.

Every gate leaves a record: the command, the machine verdict, the exit code, and where the evidence lives. Auditable after the fact, by anyone.

PRD-001 · phases 4–7
CheckCommandVerdictExitEvidence
typespnpm check-typespassed00 errors
testpnpm testpassed0481 passed
staging smokemanualoperatorowner-signed
perf budgetpnpm benchblockeddependency broken

The vocabulary is closed: passed operator blocked — never a silent pass.

// proof, and its honest limits

Showing the limits next to the proof is the point.

ProveGate is measured, not breathless. The evidence is real — and so are the conditions under which it doesn't apply.

evidence
~390 production PRDs shipped through the workflow on a multi-tenant SaaS TypeScript monorepo, including multi-wave parallel execution.
Scored era: 0 critical post-ship findings. Unscored era: 2. A 143-findings × 83-scores study forced the redesign.
This repo runs its own method. gate run landed the commits that built gate run.
limits we state out loud
The evidence is observational and single-project. No RCT, no speedup claim.
Gates cost effort to author; below trivial size, the honest answer is: don’t use the workflow.
Verification is only as good as the commands written. And the landscape moves.

// anatomy of a gate

One line, and nothing hidden.

This is a single line of gate run output. Every part is evidence a machine produced — the glyph carries the status on its own, so the line survives NO_COLOR.

····

// the difference

Self-attestation vs. evidence.

An agent saying it's done and a gate proving it are not the same event. ProveGate only records the second one.

Self-attestation

“I ran the tests and they pass.” — unverified
Green is claimed, never re-run
Failures surface after merge, in production
No record of what actually executed
trust me

ProveGate evidence

The command is re-run independently, every time
Green is earned by exit 0 or an operator verdict
Failures block the handoff before they propagate
Every check and verdict lands in the handoff card and the review artifact
exit 0

// where it sits

Spec-driven development gates what you intend to build. ProveGate gates what you actually shipped — complementary, downstream of the spec.

// why provegate

Built for engineers who don't trust vibes.

Exit-0 semantics

A gate passes on exit 0 and fails on anything else. The contract is the one your shell already understands.

Operator gates

Some things a command can’t settle — a release sign-off, a judgement call. Route those to a named owner; the acceptance is recorded and the merge gate validates it.

Independent audit

Phase 6 is blocking and independent — by default a different model family. A pass mechanically requires Critical: 0; an absent reviewer never counts.

Handoff cards

Each phase hands off with a card: what ran, what passed, and whether the boundary is clear to cross.

CLI-native

Runs where you already work. Plain output, real exit codes, scriptable — no daemon, no dashboard, no account.

A greppable evidence trail

Workflow state, review artifacts and handoff cards are files in your repo. Reproducible, greppable, and honest about what was not run.

// install

Install however you ship.

One package, zero runtime dependencies, Node ≥ 22. The gates are the same either way — they are your commands, not ours.

terminal
$ npm install -D provegate
npx gate init

// command reference

Thirteen commands. The one it refuses is load-bearing.

No daemon, no dashboard, no account. Everything runs where you already work and prints exactly what it did — and the runner has no code path that pushes, so gate push refuses.

gate initscaffold the workflow tree + starter configs
gate newcreate the next PRD from the shipped template
gate openclaim a PRD: lease its conflict surface or refuse on overlap
gate renewextend your lease (idempotent refresh)
gate releasedrop a PRD lease under the claim mutex
gate statusrebuild workflow state from artifacts and show it
gate queueshow the PRD queue (--json for machines)
gate checklint a PRD for readiness
gate doctordiagnose an install, read-only
gate memorydeterministic local recall over the knowledge base
gate runrun gated phases 4–7 + local merge
gate landthe merge step only
gate pushrefuses — push is always yours

MIT · zero deps · local-only · no telemetry · Node ≥ 22

// ci integration

Same gates in CI. Exit codes travel.

A gate is a command, so it drops into any pipeline unchanged — no plugin, no adapter, no ProveGate-specific runner. The one thing CI must not do is push on your behalf, and it can't: the runner has no push code path.

.github/workflows/ci.yml
name: CI
on: [push, pull_request]

jobs:
  verify:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - uses: actions/setup-node@v4
        with: { node-version: 22 }
      - run: npm ci
      - run: npm run check-types
      - run: npm run lint
      - run: npm test
      - run: npm run build

// quickstart

Green in four steps.

1
Install the CLI

One package, no runtime dependencies. Node ≥ 22.

2
gate init

Scaffolds the workflow tree and starter configs. Nothing is ever overwritten.

3
Declare your gates

Per-phase commands in gates.manifest.json; per-PRD verification commands in the PRD itself.

4
gate run

Runs phases 4–7, merges into your LOCAL base branch, prints the handoff card. You push.

// faq

Honest answers.

// get started

Two commands to your first gate.

Install the CLI and initialize the workflow. ProveGate reads your gates from gates.manifest.json and the PRD, then prints the evidence.

No lock-in
Gates are just commands. Delete ProveGate and your checks still run in CI exactly as before.
Push stays with you
ProveGate never pushes or deploys on your behalf. It verifies and merges locally; you decide what propagates.
terminal
$ npm install -D provegate
npx gate init
gates.manifest.json
{
  "phases": {
    "4": [
      "pnpm check-types",
      "pnpm lint",
      "pnpm build",
      "pnpm test"
    ],
    "7": ["pnpm verify:brain"]
  }
}

Prove it, then propagate.

Open source. CLI-first. Free forever for the checks that keep your agents honest.

Star on GitHubRead the docs