Two failures your CI reports as the opposite of what happened

SILENT_FAILURE
Exit 0. Nothing on disk.
Your build stayed green for a week.
FALSE_FAILURE
Work finished, cleanup crashed.
You re-ran a 40-minute job for nothing.

An exit code cannot tell PASS from SILENT_FAILURE — both return 0. ProveDone runs your command, then reads what it actually left on disk.

[O] out/ep12/final.mp4
[X] out/ep12/img  ← 12 vs usual 45 (dropped below 50% of baseline)
────────────────────────────────────────────
exit 0 | 1841.2s | SILENT_FAILURE

Nobody configured 45. It learned it from the runs that passed.

Nine checks, not one

Start without writing anything

node init.mjs .
  write  gates/build.json
  write  gates/test.json

It reads your package.json, Dockerfile and layout. Every guessed value is tagged with a _note so you know exactly what to confirm.

A typo is refused, not ignored

Gate build.json is not valid:
  - expect[0]: unknown key "minBtyes"

Refusing to run. A gate you cannot trust is worse than no gate.
Try it before you pay anything. The free playbook ships a runnable demo — node demo/try-it.mjs, two seconds, no dependencies, nothing installed. Five ways your pipeline lies to you →
Running it in CI? Team — $149 →

No dependencies. Node 18+. MIT. 28-case self-check included — run it on your machine before you trust a single verdict.
30-day refund. No form, no questions.