Claude Code · Cursor · Codex · any MCP client
Your agent wrote the code. You still have to know what it does.
It prints after the agent's answer. A letter answers it. Say not now and it goes quiet.
filter panel close animation is janky on staging, hangs then snaps. fix
⏺ Read(src/components/FilterPanel.css)
⎿ Read 61 lines
⏺ Grep(pattern: "max-height", path: src/components)
⎿ 2 matches
⏺ Update(src/components/FilterPanel.css)
⎿ Updated 1 file, +11 -6
⏺ Bash(pnpm test src/components/__tests__/filter-panel.test.ts)
⎿ 4 passed
⏺ Done. The panel now starts closing on the first frame.
Atomic Reps · CSS
A panel holds 4000px of content and closes with the rule below. What does the box you can see do during the 300ms?
.panel { max-height: 9999px; transition: max-height 300ms linear; }
.panel.is-closed { max-height: 0; }From memory. Reply with a letter.
A Claude Code session, replayed. The last question is live; answer it here. In your terminal it lands the same way.
Atomic Reps is an MCP server for Claude Code, Cursor, Codex and any MCP client. After your agent finishes a task it prints one authored multiple-choice question about the code it just wrote; you answer with a letter, or ignore it and it goes quiet.
Two commands
npx atomicrepsnpx atomicreps connectThe first prints a code you type at atomicreps.com/connect. The second adds it to Claude Code, Cursor or Codex. Every repo you open after that has it.
Nothing here is written on the fly. Every question was built, checked and reviewed by an engineer before it could reach a terminal.
Each one looks easy and is obvious if you know the mechanism. You cannot look up what you did not know you misunderstood; the second of thought is the point.
How the questions are built- Never asked
- How many values does justify-content accept?
- Asked
- A panel holds 4000px of content and closes with max-height going from 9999px to 0 over 300ms. What does the box you can see do?
17 tokens in.
151 out.
On every model, the same.
Your token bill will not notice.
Your agent sends a topic, a few words about what it just touched, and prints the question it gets back word for word. Nothing is composed at request time, so the cheapest model carries it exactly like the newest. Measured on the session replayed above: 17 tokens in, about 151 out, 604 characters.
rep(topic: "css transitions, max-height")
⚛ Atomic Reps · CSS · 604 characters, about 151 tokens
The question is about the change you just shipped.
The edit
⏺ Update(Dockerfile)
⎿ COPY package.json moved above COPY .
⎿ +2 -1The rep · Docker
You moved COPY package.json above COPY . . Which change to the repo now still makes npm install run again?
The edit
⏺ Update(db/migrations/0042_orders_idx.sql)
⎿ CREATE INDEX ON orders (user_id)
⎿ +1 -0The rep · SQL
The query filters on user_id and orders by created_at. What does this index leave the planner still doing on every call?
The edit
⏺ Update(src/hooks/useSearch.ts)
⎿ AbortController in the effect cleanup
⎿ +6 -1The rep · React
The user types three characters in 200ms and three requests go out. After your change, which of them can still write to state?
It never argues and never re-pitches.
- You say "not now"
- ⚛ Muted for two hours.
"Stop for today" is a day. "Turn it off" stays off.
- You ignore two in a row
- ⚛ Quiet for the rest of today.
It comes back when you answer one, not when a timer says so.
- It arrives rarely
- Reps sit a long stretch of work apart, and the day has a ceiling. You never finish a task and find a quiz waiting.
- The network is slow
- The rep is fetched on a hard deadline and dropped, silently, if it misses. No build ever waits on a question.
Retrieval practice, in the numbers
AI can hand you the answer. The understanding you still have to earn.
- +21pp
A week later, people who tested themselves recalled 61%. Rereaders recalled 40%.
Roediger & Karpicke 2006 · graded on /research
- -17pp
Comprehension fell from 67% to 50% when the model drove the coding.
Anthropic RCT 2026 · N=52 · graded on /research
- -5.4pp
Unassisted exam, 32.1 to 26.7 of 100, with plain ChatGPT in practice. A version that withheld the answer erased the loss.
Bastani et al. 2025 · N≈1,000 · graded on /research
What these do not show: a result for this product. The evidence pages grade each study
Pick the door your editor already speaks.
Claude Code
claude mcp add --scope user atomicreps -- npx -y atomicreps mcpUser scope, so it is there in every repo you open. Running npx atomicreps connect writes the same line for you.
{
"mcpServers": {
"atomicreps": {
"command": "npx",
"args": ["-y", "atomicreps", "mcp"]
}
}
}Or skip the file: Add to Cursor
Codex
codex mcp add atomicreps -- npx -y atomicreps mcpPOST https://atomicreps.com/mcp
Authorization: Bearer <your token>The token is minted on your account page and shown once. Revoke it there and the door closes the same second.
Run it in the repo you have open right now.
The next time your agent says Done, you will know what it did.
npx atomicreps connect