shipit-gate ๐Ÿ›‘๐Ÿš€

September 20, 2026 ยท View on GitHub

The AI deploy gate. Ask Jev if it's safe to ship โ€” before you push. Blocks scary Friday deploys. In ~200ms. For $0.

Powered by TypeSafe AI's Jev โ€” a System One model that returns typed, calibrated decisions instead of text. No hallucinated JSON. No "let me think step by step". Just a boolean, a confidence score, and a verdict.


See it in action (10 seconds, no API key)

git clone https://github.com/thecoderpanda/shipit-gate.git
cd shipit-gate && npm install && npm run build
./demo/run.sh

Runs three back-to-back deploys โ€” safe โœ…, risky ๐ŸŸก, blocked ๐Ÿ›‘ โ€” against real throwaway git repos, with a mocked Jev verdict. See ./demo/README.md.

The demo

$ shipit check

โ†’ collecting deploy signals...
โ†’ asking jev...

โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
  ๐Ÿ›‘ BLOCKED  โ€” Jev has evaluated your deploy
โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€

  Verdict:  Migration + late hour โ€” high rollback risk, wait for business hours.

  Signals
    time         Friday 17:42 America/Los_Angeles
    branch       feat/new-billing @ 4a9b21c (dirty)
    diff         37 files, +2140 -318
    risky areas  migrations, payments
    tests        pass

  Jev decision
    deploy_confidence  โ–ˆโ–ˆโ–ˆโ–ˆโ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘  0.21
    rollback_risk      โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–‘โ–‘โ–‘โ–‘  0.82
    blast_radius       critical
    reason_category    timing

  Why blocked:
    โ€ข Jev says block
    โ€ข deploy_confidence 0.21 < 0.50
    โ€ข rollback_risk 0.82 > 0.70
    โ€ข blast_radius = critical

  Override with: shipit check --force (not recommended on Friday)

Exit code: 1 โ†’ your CI job fails โ†’ your deploy is blocked.


Install

npm install -g shipit-gate

You'll need a TypeSafe AI API key:

export TYPESAFE_API_KEY=sk_...

Usage

One-off check

shipit check

Scaffold config

shipit init

Creates a .shipitrc.json you can commit.

Run tests before asking Jev

shipit check --test-command "npm test"

Machine-readable output (for CI)

shipit check --json > shipit-report.json

Emergency override

shipit check --force

Install as a git pre-push hook

cp node_modules/shipit-gate/examples/pre-push-hook.sh .git/hooks/pre-push
chmod +x .git/hooks/pre-push

Now every git push is gated by Jev.


Install as a GitHub Action

- name: Ask Jev if it is safe to ship
  env:
    TYPESAFE_API_KEY: ${{ secrets.TYPESAFE_API_KEY }}
  run: |
    npm install -g shipit-gate
    shipit check --base origin/${{ github.base_ref }}

The step fails if Jev blocks โ€” your merge is blocked.


Config: .shipitrc.json

{
  "target": "production",
  "baseRef": "origin/main",
  "testCommand": "npm test",
  "model": "typesafe-ai/jev",
  "blockOn": {
    "shouldBlock": true,
    "minConfidence": 0.5,
    "maxRollbackRisk": 0.7,
    "blockBlastRadius": ["critical"]
  }
}
FieldDefaultMeaning
targetproductionDeploy target name passed to Jev
baseReforigin/mainBase ref for diff signal
testCommandnullIf set, shipit runs it and passes result to Jev
modeltypesafe-ai/jevModel id (via Vercel AI Gateway)
blockOn.shouldBlocktrueHonor Jev's boolean verdict
blockOn.minConfidence0.5Fail if deploy_confidence below this
blockOn.maxRollbackRisk0.7Fail if rollback_risk above this
blockOn.blockBlastRadius["critical"]Fail if blast_radius in this list

What signals does shipit send to Jev?

  • Time โ€” weekday, hour, timezone, is-Friday, after-hours
  • Git โ€” branch, HEAD, dirty tree, recent commits, ahead/behind upstream
  • Diff โ€” files changed, insertions/deletions, whether it touches infra / migrations / auth / payments / config
  • Tests โ€” pass/fail + last 4KB of output
  • Env โ€” deploy target, CI system detected

Jev returns:

{
  should_block: boolean,
  deploy_confidence: number,   // 0..1
  rollback_risk: number,       // 0..1
  blast_radius: 'low' | 'medium' | 'high' | 'critical',
  reason_category: 'timing' | 'diff_risk' | 'tests' | 'dirty_tree' | 'safe' | 'other',
  human_summary: string,
  confidence: { [field]: number },
}

All in a single Jev call, ~200ms, ~$0.0001.


Why this exists

Every SRE team has the same unwritten rule: no deploys on Friday afternoon. Everyone breaks it anyway.

shipit-gate gives you a machine that never forgets. It has no ego, no deadline pressure, and it knows what a migration to a payments table on a Friday at 5pm looks like.

If Jev says wait, wait.


FAQ

Does this replace my CI? No. It's one more step. Think "spellcheck for deploys".

Does it need internet? Yes โ€” it calls Jev's API. Rejects fail closed (exit code 2).

Can I self-host? Not yet. Jev is currently API-only. Pluggable models are on the roadmap.

How do I bypass it in an emergency? shipit check --force or git push --no-verify. You own the pager.


Roadmap

  • Slack notification on block
  • Datadog / Sentry incident context as extra signal
  • shipit history โ€” track how often overrides preceded incidents
  • Plug-in signal collectors
  • Self-hosted mode with local classifier fallback

Contributing

PRs welcome. Add a signal, tighten the prompt, ship a demo repo.

License

MIT