An API changes in one repository and breaks a consumer in another. The compiler only ever checks one repository at a time.
Carrick checks every call between your TypeScript services against the types on both sides, and fails the pull request the moment they disagree.
Carrick resolves the request and response types on both sides of every call that leaves a repository, following the routing topology and middleware chains that decide what a route actually returns. The result is one map of what each service promises and what its consumers expect.
When a change breaks that agreement, the scan catches it in CI, finds the consumer still reading the old shape, and posts the finding on the pull request that introduced it. Nobody had to predict the failure in advance and write a test for it.
The index this check reads is also served to coding agents over MCP, so an agent working in one repository can query the real routes, resolved types and function intents in the others instead of inferring them.
See what Carrick does
1 contract risk, 1 duplicate function and 1 version conflict across 7 repos.
In this PR
DispatchEvent(orders-api)formatCarrierName()(orders-api)Indexed 34 endpoints and 19 cross-service calls.
Contract risks (1)
GET /api/orders/:id/dispatchDate, consumer expectsstring(notifications-svc/handlers/dispatch.ts:47)Duplicates (1)
formatCarrierName()shared-utils/format.ts· 91% intent matchDependencies (1)
zod3.22.4·3.23.8·4.0.1Verified (19)
Full analysis in the Carrick dashboard.