Skip to content

proofloop guard deploy -- ./deploy.sh

The last command before production.

Proofloop is the correctness gate for AI-written code. It catches what your agent got wrong before it ships, proves why, and remembers.

scroll — the deploy is already moving

Your agent wrote it.

Reviewed it.

And is about to ship it.

No engineer has read the diff.

Guardrails watch for dangerous commands.

Test suites check whatever got run.

No one guards correctness at the deploy moment.

The failures aren't malicious.

Confident little mistakes, shipped at full speed.

Exhibit A

The missing key

Referenced in the code. Set nowhere. The first request crashes.

payments.py:14 · STRIPE_API_KEY unset

Exhibit B

The localhost config

Works on the agent's machine. Ships to yours.

config.py:3 · API_BASE_URL=localhost:8000

Exhibit C

The skipped tests

Marked done. Never proven.

pytest · 0 runs this session

The gate cannot be talked past.

$ proofloop guard deploy -- ./deploy.sh

intercepted before execution

  • env_vars missing_env_var
  • tests tests_not_run
  • config config_mismatch
  • secrets clean

Deterministic checks decide. The model never votes — it only explains.

Deploy blocked

Let the record show —

record chk_001 → .proofloop/memory.jsonl · proof: .proofloop/runs/chk_001/ · exit 2

Blocked

Every verdict ships with a proof record.

Which check failed. The file and line. The command output that shows it. Reproducible — run it again with the same inputs and you get the same verdict, not a regenerated opinion.

Each interception is persisted to .proofloop/runs/ — the trace, the env scan, the build log.

PROOF RECORDchk_001
gate: deploy2026-07-04T21:14:09Z
env_vars✗ missing_env_var
db.py:3DATABASE_URL unset
env_vars✗ missing_env_var
payments.py:14STRIPE_API_KEY unset
tests✗ tests_not_run
session.jsonno run for this worktree
config✗ config_mismatch
config.py:3API_BASE_URL → localhost
config✗ config_mismatch
config.py:4DEBUG = True
secrets✓ clean
passed · 0 findings
inputs_hashsha256:9f3c41a8…de21
reproducible · same inputs, same verdictexit 2

A denial is not a dead stop.

The block tells your agent exactly how to fix it — structured feedback it applies, then re-runs. Same gate, new verdict.

  • $ export STRIPE_API_KEY=••••• DATABASE_URL=•••••
  • $ proofloop run tests -- pytest -q
  • 4 passed in 0.01s
  • $ proofloop guard deploy -- ./deploy.sh
  • ✅ GATE PASSED — executing: ./deploy.sh
  • ✦ Resolves chk_001 — the failure diagnosed there is now fixed.
Allowed

The gate remembers.

Every diagnosed failure is filed — the failure class, the evidence, the judgment. When the same mistake comes back, there is no re-deliberation and no model call.

recalled_from → chk_001

chk_001

missing_env_var

diagnosed

chk_002

gate_passed

resolves chk_001

chk_003

missing_env_var

recalled · 64 ms

Blocked in 64 ms.

Seen before — matches chk_001: same STRIPE_API_KEY failure.

It doesn't care which agent wrote it.

Same gate, same checks, same memory — whether the code came from Claude Code, Codex, or Cursor. A neutral judge is something no agent vendor can be.

Claude Code · Codex · Cursor — same bench

“Your guardrails stop the dangerous command. Proofloop stops the broken one.”
Allowed

Stop shipping broken deploys.

One command between your agent and production. Open source — and it gets smarter with every catch.

Star on GitHub