Your agents ship the code. You stay able to explain it.
Ella reads every change your coding agents make and keeps the why: what changed, what it assumes, and what could break. Ask her before you edit, before you deploy, and when production breaks.
@eric @ella why did the Stripe webhook change last night?
app/api/webhooks/stripe/route.ts commit 4f2a91c, written by Claude Code
| @@ -18,6 +18,8 @@ POST(req) | ||
| 18 | const event = constructEvent(body, sig); | |
| 19 | const id = event.id; | |
| 20 | + | const isNew = await saveEventId(id); 1 |
| 21 | + | if (!isNew) return ok(); // a retry |
| 22 | if (event.type === "payment_intent.succeeded") { | |
| 23 | const intent = event.data.object; | |
| - | await capture(intent); | |
| 24 | + | await capture(intent, { idempotencyKey: id }); 2 |
| 25 | } |
- 1Why it changed. Stripe retries a webhook when the reply is slow. The old handler ran
capture()on every retry, so a customer was charged twice on Sep 30. - 2What it assumes. Stripe event ids are unique, and the
stripe_eventstable exists in production (migration 0007). - !Still open. The refunds webhook uses the old pattern and can double-refund. This is the third payment fix with the same cause.
Ask before you edit, before you ship, and when it breaks
Ella answers from your app's own history: the reasons your agents recorded, the structure of your code, and your production errors. Every answer points at files and commits you can check.
Before you edit
- Billing changed 4 times in 3 weeks, all by Claude Code.
- Webhooks skip repeats since Oct 1: event ids go in
stripe_events. - Refunds still use the old handler. Treat it as high risk.
- Checkout tests haven't run since Sep 28.
Before you ship
GET /api/ordersreturns every order with no sign-in check (route.ts:5).NEXT_PUBLIC_STRIPE_SECRET_KEYships your secret key to the browser.- I didn't check database policies or business logic.
When it breaks
TypeError: Cannot read properties of null (reading 'user_id') in /api/orders- Likely cause: last night's change assumed every order has a user. Guest checkout orders don't.
- Path: Checkout page, Orders API,
orderstable. - A fix prompt for your agent is ready, with this context included.
Three minutes to set up, then it stays out of your way
Install the CLI and plugin
One npm install, then the Claude Code plugin, or an MCP entry for Cursor and Codex.
npm install -g @coderetro/local coderetro login coderetro init --cloud --agentsWork with your agent as usual
When a session ends, the agent records a Change Digest: intent, root cause, approach, rejected options, assumptions and risks. Secrets are stripped on your machine before anything is sent.
Ask Ella
In your editor through MCP, in the terminal, or in the web app with your App Map, confidence check and recurring issues. Your own tools can call the same MCP server.
Built on MCP, so it fits your workflow
Any MCP client can ask Ella for context, record a change, run a check or investigate an error. Wire her into your agent rules, your CI, or an on-call bot of your own.
# Claude Code
claude mcp add coderetro -- coderetro mcp
# Cursor: .cursor/mcp.json
{ "mcpServers": { "coderetro": { "command": "coderetro", "args": ["mcp"] } } }
# then, in any agent
> @ella what should I know before editing lib/billing?Your code stays on your machine
The local agent is open source under Apache-2.0, so you can read exactly what it sends. Local-only mode keeps everything on your computer.
What leaves your machine
- The digest your agent writes: intent, reasoning, assumptions, risks
- File paths, routes, table and service names, environment variable names
- Check findings with short, redacted excerpts
- Your source code, unless you turn on snippets
- Secrets, tokens and email addresses, which are stripped first
- Environment variable values
Early access opens in small groups
We're testing with indie developers and small teams shipping with Claude Code, Cursor and Codex.