Review what your coding agent changed before you push
Coding agents finish the way they were told to: tests green, task marked done. Ship Check reads the change they left behind and flags what a passing run hides, from deleted assertions to a migration that breaks the version of your app that is still running.
npx intentiai checkRuns offline on your machine. Works after any agent, or any person.
What it looks like
$ npx intentiai check
Changed: 5 files (+25 / -5)
Findings: 7 critical, 3 high, 3 medium
CRITICAL Column legacy_status is dropped from users
while the running app may still read it
CRITICAL Webhook in webhook.ts trusts payloads
without checking the signature
CRITICAL 3 assertions removed from pay.test.ts
HIGH Scheduled job runs 288x more often
Output on a seeded demo repository. Open the full sample report.
What it checks
- Tests weakened to get a green runTests deleted, skipped, narrowed with .only, stripped of assertions, loosened in place, or propped up with a sleep; coverage gates lowered.
- Migration that locks a table or breaks a live deploySchema changes that lock or rewrite a table, or drop something the running app still reads.
- Command that deletes or overwrites dataRecursive deletes, dropped databases, truncates, unfiltered bulk deletes, force pushes.
- New endpoint with no visible auth checkA new endpoint with no visible auth, or a webhook that does not check the sender's signature.
- Permission or validation check deletedA validation, permission or rate-limit call deleted without a replacement.
- API key or credential committedCredentials committed in the change. Masked in every output.
- Untrusted input reaching SQL, HTML, a shell or evalUntrusted data reaching SQL, HTML, a shell, eval or an outbound URL.
- Issue or PR text interpolated into CIIssue or PR text interpolated into a CI script or an AI action.
- Environment variable read but never declaredCode reading an environment variable nothing declares.
- Import of a package nothing installsAn import with no matching installed package: the offline sign of a hallucinated dependency.
- Dependency bumped across a major versionA dependency moved across a breaking version boundary.
- Exported function changed while callers still use itA public function or export removed or re-signed while other code still calls it.
- Schedule, retry or timeout change that multiplies loadSchedules run more often, retries added without backoff, timeouts raised, CI concurrency that does nothing.
- Database or API call inside a loopA database, HTTP or model call made once per loop iteration.
- Async call with no awaitAn async call whose result, and whose failure, is dropped.
- File, socket or timer opened and never closedA file, socket, cursor or interval opened and never released.
- Error caught and silently discardedAn empty catch, except or rescue; an error assigned to _ in Go.
- Type or lint error silenced instead of fixedType or lint errors silenced without a stated reason.
- TODOs and stubs left in finished workTODOs, stubs and placeholder values left in the change.
- Debug prints and debugger statements left inDebugger statements and stray debug prints in application code.
- Change reaches CI, infrastructure or build outputCI, infrastructure or generated files touched, or a change too large to review.
Add your own agent as a second reviewer
npx intentiai check --agent claude hands the findings to your own coding agent, on your own plan. It explains or rules out each finding, and reports problems the deterministic checks cannot see. See the docs for supported agents and running it automatically after every task.
How accurate it is
On 30 recent commits from six open-source projects in Go, Rust, Java, Python and TypeScript, 13 of its 14 findings were correct. It is built to be right when it speaks, and to say plainly when a check could not run.
Questions
Which coding agents does Ship Check work with?
Any of them. It reads the git diff, not the agent, so it works the same after Claude Code, Codex, Cursor, Copilot or a human. It can also run automatically when an agent finishes a task.
Does it use an LLM?
Not by default. The checks are deterministic and run offline. Add --agent claude and your own coding agent reviews the findings on your own plan: it explains or rules out each one and reports what the checks cannot see.
Does my code leave my machine?
No. The report is an HTML file on your machine. Only --share uploads anything: the findings, file paths, and up to four quoted lines per finding. Never whole files, the diff, or your git history.
What can it not catch?
Mistakes about meaning, such as a condition applied to the wrong users or a subtly wrong default. A model reviewer catches more of those, which is why --agent exists.