Kenrow

AI code review your team won’t tune out

Kenrow flags what matters in every pull request, remembers what your team decides, and stays quiet about the rest.

[PAY-311] Retry failed charges with idempotency keyspayments-api #4917 · push 1Blocked · 1 P0
Reading order
1Retry loop
Retries 3 times with backoff instead of failing the order.
2Idempotency keys
A key per charge so a retry can't bill twice.
3Tests
A timeout, a decline and a double submit.
Verdict · shadow

Needs a person

Changes how charges are keyed. One P0 is open.
src/billing/retry.ts+38 −6
40export async function charge(order: Order) {
41 for (let attempt = 1; attempt <= 3; attempt++) {
42 const key = newKey();
43 const res = await provider.charge(order, { idempotencyKey: key });
44 if (res.ok) return res;
P0 · correctness · retry.ts:42

A new key on every attempt

The provider sees three different charges, so a slow first attempt can bill twice. Create the key once, before the loop.
const key = newKey(); for (let attempt = 1; attempt <= 3; attempt++) { const res = await provider.charge(order, { idempotencyKey: key });
Suggested change · applied on GitHub in one click, or dismissed with a reason

More code, same reviewers

Coding agents write more than your team can read. An AI reviewer that adds noise just makes the queue longer.

Signal

Every comment worth reading

One comment per real issue, followed until it's fixed. Nothing repeated, nothing padded.

P0 · OpenA new key on every attemptretry.ts:42
Fixed · 7f3a·c219Backoff ignores the Retry-After headerretry.ts:61
DismissedLog line includes the card's last 4 digits
“Allowed by PCI scope” · maya-chen · not raised again
charge.ts:18
OutdatedTimeout is hard-codedpush 2
Learning

Your team decides once

Overrule a finding and Kenrow remembers, on every pull request after it.

Proposed rule · payments-api

The last 4 card digits may be logged

Dismissed 4 times across 3 PRs, each time as allowed by PCI scope.
learning-agentWaiting on you
Trust

Know what's safe to merge

Every pull request gets a verdict and the reason for it, so you can check its track record on your own code.

Verdict · shadow

Needs a person

Touches billing retries and changes how charges are keyed. One P0 is open.
Verdict · shadow

Would approve

Docs only: 6 lines in the refunds runbook. No code paths change.
Context

Anyone can review any PR

No more waiting on the one person who knows that service.

Ask about this PR

You asked
Why would a retry bill twice?
Reading src/billing/retry.ts…
review-agentEach attempt calls newKey() inside the loop (retry.ts:42), so the provider sees three different charges. Moving the key above the loop makes the retries one charge.
Pricing

AI costs you can predict

Runs on your own Claude or Codex key, at list price. We charge per developer, never per token.

See pricing →
Model usage
Billed to you by Anthropic or OpenAI, no markup
Kenrow
Flat, per active developer. Free during the pilot
Reviews
No caps, however much your team ships
Surprises
None. We never switch to our own keys
Getting started

Your first review in minutes

No config files and no sales call. Sign in with GitHub and pick your repositories.

  1. Sign in with GitHubYour account
  2. Install on an organizationPick repositories
  3. Add your model keyAnthropic or OpenAI
  4. Open a pull requestReviewed in minutes
Security

Your code stays yours

Read-only access to your code, and the checkout is deleted after every review.

Your code
A shallow clone per review, deleted when the job ends
Webhook payloads
Kept 7 days, then deleted
Models
Your Anthropic or OpenAI key. We keep only the short excerpts findings quote
Your keys
Encrypted at rest; only the last 4 characters are ever shown again

Ship faster without lowering the bar

Try Kenrow on your next pull request.

Start free with GitHub