Checks for AI-written changes
The 21 things Ship Check looks for in the diff a coding agent leaves behind. Each page explains why agents produce it, shows an example, and says what to do.
- 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.
test-integrity - 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.
migration-safety - Command that deletes or overwrites dataRecursive deletes, dropped databases, truncates, unfiltered bulk deletes, force pushes.
destructive-ops - New endpoint with no visible auth checkA new endpoint with no visible auth, or a webhook that does not check the sender's signature.
auth-surface - Permission or validation check deletedA validation, permission or rate-limit call deleted without a replacement.
removed-guard - API key or credential committedCredentials committed in the change. Masked in every output.
secrets - Untrusted input reaching SQL, HTML, a shell or evalUntrusted data reaching SQL, HTML, a shell, eval or an outbound URL.
injection-sink - Issue or PR text interpolated into CIIssue or PR text interpolated into a CI script or an AI action.
workflow-prompt-injection - Environment variable read but never declaredCode reading an environment variable nothing declares.
env-drift - Import of a package nothing installsAn import with no matching installed package: the offline sign of a hallucinated dependency.
dependency-risk - Dependency bumped across a major versionA dependency moved across a breaking version boundary.
dependency-bump - Exported function changed while callers still use itA public function or export removed or re-signed while other code still calls it.
breaking-export - Schedule, retry or timeout change that multiplies loadSchedules run more often, retries added without backoff, timeouts raised, CI concurrency that does nothing.
ops-deltas - Database or API call inside a loopA database, HTTP or model call made once per loop iteration.
io-in-loop - Async call with no awaitAn async call whose result, and whose failure, is dropped.
unawaited-async - File, socket or timer opened and never closedA file, socket, cursor or interval opened and never released.
resource-leak - Error caught and silently discardedAn empty catch, except or rescue; an error assigned to _ in Go.
swallowed-errors - Type or lint error silenced instead of fixedType or lint errors silenced without a stated reason.
suppressed-diagnostics - TODOs and stubs left in finished workTODOs, stubs and placeholder values left in the change.
unfinished-work - Debug prints and debugger statements left inDebugger statements and stray debug prints in application code.
debug-leftovers - Change reaches CI, infrastructure or build outputCI, infrastructure or generated files touched, or a change too large to review.
scope-creep