Defending the take-home in the review call
The call tests how you reason about and change your own code, not whether it was right.
Predict first
Before you read: predict
Review call on your ExamHall proctor-dashboard take-home. Your tile reducer and one poll reply:
[{ "candidate": "c-17", "status": "flagged", "at": "10:04:12" },
{ "candidate": "c-17", "status": "writing", "at": "10:04:09" }]
The reviewer says: “When two status changes for one candidate arrive in the same poll, the tile can show the older one.” Which reply fits published code-review guidance for the author of the code?
export function applyPoll(tiles, changes) { for (const c of changes) tiles[c.candidate] = c.status; return tiles;}The 30-second version
Open on your own screen with a short run of the main path, then go into the code. Sort each comment: a defect gets “good catch”, the fix and its test; a design preference gets your trade-off and a quick settle. Change code live in small tested steps, counting the tests before and after.
The call tests how you reason about and change your own code, not whether it was right.
How it works
Step 1 of 12
Analogy: A bespoke shoemaker's trial-shoe fitting
The client stands, then walks a few steps across the shop in the trial shoe; the maker does not parade every stitch. Asked why the sole is leather, she answers from her order card: it breathes, and it slips on wet stone. When the client says the heel slips, she checks, says so, and adds a heel grip. When he would have liked brogue punching, she calls it taste, says what plain leather buys, and they settle. Asked for a padded tongue, she fits it, then has him walk again. Re-lasting the whole shoe waits for the next fitting.
| At the fitting | In the review call |
|---|---|
| A few steps across the shop | A short run of the main path |
| The order card's reasons | The README's decisions |
| “The heel slips”: checked, a heel grip | A defect: good catch, the fix and its test |
| Brogue punching: taste, settled | A design preference: trade-off, settle |
| Walking again after the padded tongue | Every test run again after a live change |
| Re-lasting booked for the next fitting | A big change agreed as a follow-up |
Breaks down when: the client's foot settles every question of fit, while a reviewer's preference is often one reasonable view among several. Wrong inference: “whatever the reviewer prefers is right.” A fit is also felt at once, while a code change shows only when its tests run.
In real terms: before you answer any comment, decide whether it names a defect or a preference.
Examples, run for real
EXH-2320 is a synthetic review call on the ExamHall proctor-dashboard take-home. At 25:00 of 45 the reviewer asks for “pause the exam for all candidates”. The candidate first argued that pausing was out of scope, then rewrote the countdown module as a class to add it “properly”, without running the suite first. MR !2620 is the re-run on the same request.
EXH-2320 · first call · request at 25:00 of 45: "pause the exam for all candidates"
before the change: suite not run
countdown rewritten as a class: 0 of 7 pass · 7 failing, each with: m.join is not a function
MR !2620 · re-run · same request at 25:00
before the change: 6 of 6 pass
the reviewer's case added as a test: 6 of 7 pass · failing: the reviewer's pause test (pauseAll is not exported)
pauseAll and resumeAll added beside the existing functions: 7 of 7 pass
In the first call every test failed, because each one calls join, which the rewrite had turned into a method. With no count from before, she could not say whether the module had worked before she touched it. The argument about scope had used up time the change then needed.
In the re-run she says “six of six” before typing anything. She adds the reviewer's case as a test and shows it failing, which proves the test can see the missing pause. She adds two functions beside the existing ones, leaves join and extend as they were, and reports “seven of seven: the six old tests and the pause”.
The script counts tests on the author's fixtures; it does not judge the call or what a real reviewer would score.
Try it
Answer first, then check. Nothing is saved.
Question 1 of 5
In the review call on her chat take-home, the reviewer asks for muting: “a muted conversation still counts its own unread messages, but they leave the badge total until it is unmuted.” Her inbox.mjs, with the mute she has just added:
Her six tests pass: receive counts one, markRead clears a conversation, two conversations add up, the badge shows 99+ past 99, a new conversation starts at 0 and markRead leaves others alone. The reviewer's test mutes one of two conversations, sends two messages to each, checks the muted one's own count and the badge, then unmutes it and checks the badge again.
Which one-line change makes that test pass with her six still passing?
const conv = (ib, id) => ib.get(id) ?? ib.set(id, { unread: 0, muted: false }).get(id);export const inbox = () => new Map();export function receive(ib, id) { conv(ib, id).unread += 1; }export function markRead(ib, id) { conv(ib, id).unread = 0; }export function mute(ib, id, on) { conv(ib, id).muted = on; }export function unreadIn(ib, id) { return conv(ib, id).unread; }export function badge(ib) { let n = 0; for (const c of ib.values()) n += c.unread; return n > 99 ? '99+' : String(n);}Question 2 of 5
In the review call on her chat take-home, the reviewer says: “We noticed search scans every message on each query. Why not an index?” Her README lists the scan among her decisions, with its cost.
Which reply fits published code-review guidance?
Question 3 of 5
Her chat take-home's review call is at Monzo, which publishes how the call runs (read 2026-10-01). She is planning how to start it.
Which opening fits that published description?
Question 4 of 5
Her chat take-home's messages.mjs:
Its five tests are edit changes the text, edit keeps the send time, shown keeps the order, search finds a word and search ignores case, which searches for Hello. In the call the reviewer asks her to mark edited messages. She makes edit's body const i = ms.findIndex((m) => m.id === id); ms[i] = { id, text, edited: true };, adds a sixth test, edit marks the message, and runs the suite: 4 pass, 2 fail, edit keeps the send time and search ignores case.
What can she truthfully tell the reviewer?
export function add(ms, id, text, sentAt) { ms.push({ id, text, sentAt }); }export function edit(ms, id, text) { ms.find((m) => m.id === id).text = text; }export function shown(ms) { return ms.map((m) => `${m.sentAt} ${m.text}`); }export function search(ms, q) { return ms.filter((m) => m.text.toLowerCase().includes(q)).map((m) => m.id); }Question 5 of 5
The last minutes of a 45-minute review call on her chat take-home. At 39:30 the reviewer says: “Unread counts are kept in each browser tab, so two tabs show different numbers.” It is now 40:00. Moving the counts to the server touches four files, and no test covers them yet.
What does she reply?
Go deeper
Pro tip
Keep a second terminal open in the repository with the test command already typed, so running the suite during the call takes one keypress.
Related lessons
- Read first: The README as a design doc
- Read first: Narrating while you code
- Related: I don't know, but here's how I'd reason
- Related: Scope and time-box a take-home
- Related: Senior quality signals in a take-home
- Related: Orienting in an unfamiliar codebase fast
- Related: The trade-off sentence: what it gives, what it costs, why you'd pick it, when you'd switch
- Related: Climbing the follow-up ladder: a mechanism, a number or a signal on every rung
- Related: Live walkthrough and improving the MR
- Related: Testing strategy under a time-box
Checked against the tools and docs as of 2026-10-01.