Run PreFlight anywhere releases happen.
The same check, from your terminal or your pipeline. The exit code carries the decision, so a release can gate on it. Every run issues the same signed receipt.
$ preflight verify https://api.quote.example/mcp
Installation
The hosted web, API, and MCP surfaces are live. The CLI package is prepared in the public repository and will use the preflight binary once npm publication is verified.
git clone https://github.com/Vinaystwt/preflight.git
cd preflight
npm run build --prefix packages/cli
node packages/cli/dist/index.js --helpVerify an endpoint
Point it at a live endpoint. PreFlight discovers, pays as a buyer, and decides.
preflight verify https://api.quote.example/mcpVerify from a manifest
The current CLI verifies an endpoint or Agent ID. Manifest-file input is planned for the same release-gate contract, but the hosted API already accepts confirmed manifests.
curl -i https://api.usepreflight.xyz/api/v1/verify-releaseExit codes
The process exit code is the contract a pipeline gates on.
0
RELEASE
1
BLOCK
2
UNKNOWN
3
INFRASTRUCTURE
Verify a signed receipt
Anyone can check a receipt against PreFlight's published Ed25519 key, offline of the report.
$ preflight verify-receipt rcpt_df8dc…10cff
GitHub Actions
# .github/workflows/preflight.yml
name: preflight
on: [deployment_status]
jobs:
verify:
runs-on: ubuntu-latest
steps:
- run: preflight verify ${{ vars.ENDPOINT }}
# exit 0 RELEASE · 1 BLOCK · 2 UNKNOWN · 3 infrastructureOther CI
Any runner works: the command returns the decision as its exit code and machine JSON on stdout.
JSON output
$ preflight verify <endpoint> --json
{
"decision": "RELEASE",
"report_id": "pfr_…",
"receipt_id": "rcpt_…",
"receipt_signature": "…",
"badge_url": "https://api.usepreflight.xyz/api/v1/badge/pfr_….svg",
"chain_anchor_tx": null
}Payment behavior
A check is 0.10 USDT over x402. Your agent or CI wallet pays. A run that never completes is not charged, and a safe retry does not charge twice.
Troubleshooting
A non-zero exit with code 3 means PreFlight could not run the check (network, endpoint unreachable). Codes 0 to 2 are real decisions. Use --json for machine parsing.