Code review that has read the whole repo
inline reviews every pull request against the codebase around it, runs your suite in a sandbox, and holds the merge when it finds something real.
Every pull request the agent has processed, newest first.
| Pull request | Verdict | Findings | Cost | When |
|---|---|---|---|---|
acme/payments-api#4127 Add idempotency keys to the charge endpoint by priya · nextjs · Opus 5 | substantiveHigh risk | 4 | $0.312 | 2m ago |
acme/payments-api#4126 Bump stripe SDK to the current major by dependabot · nextjs · Haiku 4.5 | trivial | 0 | $0.002 | 9m ago |
acme/ledger#881 Session state machine + per-tenant rate limiter by tomas · dotnet · Opus 5 | substantiveMed risk | 2 | $0.134 | 24m ago |
acme/mobile#2310 Retry image uploads on transient 5xx by jules · expo · Opus 5 | substantive | 1 | $0.098 | 1h ago |
acme/ledger#879 Document-access audit log by priya · dotnet · Opus 5 | substantive | 6 | $0.661 | 3h ago |
acme/web#5502 Fix dimmed rows that never reset after filtering by karri · nextjs · Opus 5 | substantive | 2 | $0.147 | 4h ago |
acme/web#5501 Update the onboarding copy by sam · nextjs · Haiku 4.5 | skipped | 0 | $0.001 | 5h ago |
acme/etl#640 Backfill tenant ids on historical charge rows by tomas · python · Opus 5 | substantiveHigh risk | 3 | $0.221 | 6h ago |
acme/mobile#2309 Cache the session token across cold starts by jules · expo · Opus 5 | substantive | 1 | $0.076 | 8h ago |
Idempotency key is written after the charge, not before
Two requests carrying the same key can both pass the existence check before either row lands, so the customer is charged twice. Insert the key first and treat the unique-violation as the replay path.
Your agents already speak to it
inline is an MCP server. Point any agent that speaks the protocol at it and you get the same engine, guidelines, and repo memory the pull-request bot uses, before the pull request exists.
The review,
not a summary
Findings are anchored to a line, carry a severity and a confidence, and have survived a validation pass that discards anything the reviewer cannot defend from the code it read. Haiku triages first, so a dependency bump never pays for an Opus review.
Learn more$0.312
88,402
61,180
9,744
1m 47s
This PR adds idempotency keys to the charge endpoint and a replay cache in front of it. The data model is right, but the key is persisted after the charge rather than before it, so concurrent retries can double charge; the replay cache is also keyed without the tenant id, which lets one tenant read another tenant's cached response.
Idempotency key is written after the charge, not before
Replay cache key omits the tenant id (IDOR)
Retry budget is never reset between attempts
Included
It runs your tests
before it says anything
Every review gets a sandbox: dependencies installed, the suite run, and throwaway tests written for changed code nothing covers. You get the terminal trace and the artifacts, not a claim. What the run proves decides whether the merge is held.
Learn more- Install dependenciesnpm ci
- Type checknpx tsc --noEmit
- Existing suitenpx vitest run
- Authored testsnpx vitest run charges.spec.ts
- Browser flownpx playwright test checkout
- Idempotency key is written after the chargethread resolved
- Replay cache key omits the tenant idcode changed by 8f4c1ab
- Retry budget is never reset between attemptsawaiting a reply
Included
Read the change
in the order it was built
Every reviewed pull request gets a hosted walkthrough: the diff reorganized into ordered layers, each with a note on why it exists, and a chat grounded in that exact diff so a reviewer can ask instead of guess.
Learn more- 1Schemaidempotency_keys table
- 2Persistencekey insert + unique index
- 3Endpointcharge path rewiring
- 4Testsreplay + concurrency cases
The key has to land before the money moves, so a concurrent retry loses the unique-index race instead of charging twice.
It gets better
at your repo
When a pull request closes, inline harvests what happened to each finding: reactions, resolved threads, and whether the flagged code actually changed. Repeated dismissals become proposed rules you approve, and a per-repo profile carries what it has learned into the next review.
Learn moreEvery charge goes through `src/charges.ts`; nothing calls the Stripe SDK directly.
Rows carry `tenantId`; a query without it is a bug, not a style choice.
Services return `Result<T>`; only route handlers throw.
`replay-cache.ts` has caused three incidents; treat changes there as high risk.
The review your agent
can ask for
Ask for a review from inside your agent and get one against your uncommitted tree. Or have the agent post a plan first, with wireframes and open questions, and wait for a human to sign it off before a single file is written.
Learn more- Does the replay cache need the tenant id in the key?
- Should a lost race return 409 or the original charge?
- Unique index on (tenant_id, key), agreed
Included
It knows
what calls what
A symbol, call and import graph of your default branch is built per commit. A review resolves the pull request head to the nearest indexed ancestor, overlays the diff, and can walk the real dependency closure of the change instead of grepping for it.
Learn more- charge()src/charges.tschanged
- keys.insert()src/keys.tscalled by
- replayCache.get()src/replay-cache.tscalled by
- POST /v1/chargessrc/app/api/charges/route.tsimports
- refundJob()src/jobs/refund.tsimports
Advisories, judged
against your code
inline matches advisories to your lockfiles, then asks whether the vulnerable path is reachable from anything you ship. What survives that gets a remediation pull request, patched and verified in a sandbox before a human sees it.
Learn moreAdvisories matched to your lockfiles, then assessed for reachability in your code.
| Package | Severity | Status | Assess cost |
|---|---|---|---|
fast-jwt@3.3.1npmCVE-2026-21841 Signature bypass on ES256 tokens acme/payments-api | critical | confirmed | $0.041 |
Newtonsoft.Json@12.0.3nugetGHSA-5crp Deeply nested payloads exhaust the stack acme/ledger | high | confirmed | $0.038 |
postcss@8.4.31npmCVE-2026-11097 Parser confusion in source maps acme/web | medium | not affected | $0.009 |
tar-fs@2.1.1npmGHSA-pq67 Path traversal when extracting archives acme/mobile | high | open | $0.012 |
urllib3@2.0.6pypiCVE-2026-30820 Redirect leaks the Authorization header acme/etl | medium | dismissed | $0.007 |
feature/inline-fix-cve-2026-21841
Bump fast-jwt to 4.0.2 and pin the ES256 curve
- Reachable from POST /v1/charges
- Patch applied and the suite re-run in a sandbox
- No behavior change outside token verification
Included
The rest of it,
on the same rail
The pull request is where inline starts, not where it stops. Cloud posture, CI health, runtime errors, prompt quality and vendor coverage all land in one console, triaged by the same models and grounded in the same repositories.
Learn more65
4
2
2
5
6m 12s
12
8,104
431
37
3
$18.4k
142
3.8/5
9
Suppressed is not deleted. The reason is kept, and you can read it.
Agents are principals
too
Permissions are a module and action statement resolved over platform, organization and repository scopes. An agent key carries its own scopes, intersected with its owner's permissions and re-resolved on every call, so delegating work never widens what can be reached.
Learn moreAn agent's authority is its own scopes intersected with its owner's permissions, resolved per call and per repository.
Put it on one repository
Connect GitHub, enable a repo, and the next pull request opened gets a review.