The gate
node cli.cjs ci --target https://preview-123.example.dev
Runs against a preview URL, writes a summary at <out>/ci-summary.md and
.json, and exits non-zero when there are new ship-blockers.
“New” is the important word
A gate that fails on every pre-existing problem gets switched off in a week. This one compares against the accepted baseline for the branch, so it fails on what your change introduced rather than on the backlog you inherited.
By default ci runs audit,launch, which need a key like they do
anywhere else. If you want a free gate, run vitals and guard
instead. Both are deterministic and both exit non-zero on new ship-blockers.
A free gate
node cli.cjs vitals --target "$PREVIEW_URL"
node cli.cjs guard
No key, no bill, no flake: both are deterministic, and they are the two that belong in a pipeline. Add the reasoning checks later, on a schedule rather than on every push, once you know what they cost you.
Reading the result
The JSON summary carries the counts and the new findings with their ids, which is what you want if you are posting it somewhere yourself. The Markdown is written to be pasted into a pull request without editing.