AI-free fluency (Bare mode)
Bare mode hands back what the tools did for you: recall each contract, run the code in your head, and practise exactly that.
Predict first
Before you read: predict
ExamHall's exam page shows the time left. In a practice round with no run button, a candidate wrote:
The server reports that the deadline passed 1.5 s ago, so the page calls formatRemainingTime(-1500).
What does it return?
export function formatRemainingTime(ms) { const total = Math.floor(ms / 1000); const h = Math.floor(total / 3600); const m = Math.floor(total / 60) % 60; const s = total % 60; return [h, m, s].map((n) => String(n).padStart(2, '0')).join(':');}The 30-second version
Some rounds still take the assistant away, and some take autocomplete and the run button too. Then the exact contract of each everyday call, what it returns, changes and does at the edges, comes from memory, and you predict output instead of running it. Keep that ability: write katas in a plain editor, predict before you run, drill every miss.
Bare mode hands back what the tools did for you: recall each contract, run the code in your head, and practise exactly that.
How it works
Step 1 of 11
Analogy: A trainee cab driver calling a route at the Knowledge examiner's desk
A trainee London cab driver follows a satnav on every shift. Twice a month she sits across from a Knowledge examiner, who names two points; she calls the route street by street, with no map and no device. A route she half-knows comes out with a wrong turn the satnav would have hidden. After each appearance she writes down every street she got wrong and rides those streets on her moped the next morning. A classmate who drove for months on the satnav alone finds that his routes have gone.
| At the examiner's desk | In a bare round |
|---|---|
| The satnav on an ordinary shift | The assistant, autocomplete and run button on a normal day |
| Calling the route aloud, no map | Writing the code and running it in your head |
| A wrong turn the satnav would have hidden | A contract misremembered at an edge |
| The missed streets, ridden the next morning | The miss list, drilled at the next session |
Breaks down when: streets change slowly, while runtimes and libraries change versions, so a contract you drill belongs to a version. Wrong inference: "a contract learnt once holds in every runtime." An examiner also hears only the route, while an interviewer reads the code too.
In real terms: in a bare round, the everyday contracts come from memory, and you can say what your code prints without running it.
Examples, run for real
4.1 EXH-3170: a bare session and its miss list
In a practice session for ExamHall's exam page, the candidate wrote formatRemainingTime in a plain editor in 15 minutes and ran nothing until she called it done. Then she ran the kata's 8-test list (EXH-3170) and wrote one miss-list line per red test. A week later, after drilling the list, she wrote it again from a blank file (MR !3470).
4.1 EXH-3170 week-1 draft 0 of 8 pass · every test throws TypeError: n.padStart is not a function
4.1 the same draft, padStart line fixed 6 of 8 pass · red: "1 ms left shows 00:00:01", "a passed deadline shows 00:00:00"
4.1 miss list, each line run: typeof (5).padStart is "undefined" (a string method) · Math.round(0.001) = 0, Math.ceil(0.001) = 1 · spec: a passed deadline, Math.max(-1500, 0) = 0
4.1 MR !3470 week-2 draft 8 of 8 pass
All three misses were contracts or spec cases she had never had to recall, because a run used to show them at once. The second draft passed without a run in between.
4.2 Payments ledger: predict, then run
Warming up on a payments ledger, she wrote down the result she expected for four everyday calls, then ran them:
4.2 entries.push({ id: 'JE-7' }) on 2 entries predicted the new entry got 3 miss
4.2 Math.floor(-25 / 100) predicted 0 got -1 miss
4.2 -25 % 100 predicted -25 got -25 hit
4.2 '1234'.padStart(3, '0') predicted '1234' got '1234' hit
The two misses went on her list; the hits did not. Each miss line names the call, her guess and the real result, so the next session starts with those two.
Try it
Answer first, then check. Nothing is saved.
Question 1 of 7
A payments ledger shows each line of a refund with two decimals, and its footer adds the same values up. Bare round, no run button:
What does it log?
const lines = [12.5, 7.25, 0.3];const cells = lines.map((x) => x.toFixed(2));const total = cells.reduce((sum, c) => sum + c, 0);console.log(total);Question 2 of 7
Bare round, no run button. ExamHall's exam page needs formatRemainingTime(ms): whole seconds rounded up, a passed deadline shown as 00:00:00, hours not capped. The helper and the frame are written:
Put the six lines of the body in order, the first line first.
const pad2 = (n) => String(n).padStart(2, '0'); export function formatRemainingTime(ms) { /* the six lines, in order */}Your order
- 1empty
- 2empty
- 3empty
- 4empty
- 5empty
- 6empty
Tap the lines in the order you expect.
Question 3 of 7
A candidate has chosen Monzo's backend pair-coding exercise, as Monzo's post of 1 March 2025 describes it (read 2026-10-06). For a week she has practised ledger functions alone, in Python, in a plain text editor with every other window closed.
Which statement about that exercise holds?
Question 4 of 7
In a plain editor, with no run button and 15 minutes, write formatPence(pence) for the ledger from a blank file that exports it: an integer number of pence becomes pounds with two decimals, commas between thousands, and a leading minus for a negative (123456 → £1,234.56, -5 → -£0.05, 0 → £0.00). First write the cases you would test beside it.
Then, and only then, run the check, and add one miss-list line per red test.
Question 5 of 7
A learner with a Google loop next spring has stopped all hand-written practice on her streaming-app katas and now writes every kata with an AI assistant.
Going by what Google's CEO Sundar Pichai said on the Lex Fridman Podcast (#471, 5 June 2025), which statement bears on her plan?
Question 6 of 7
A box office holds a fan's seats for ten minutes and shows the time left. The hold timer, written in a plain editor:
With 59,999 ms of the hold left, the page calls formatHoldTime(59999).
What does it show?
export function formatHoldTime(ms) { const m = Math.floor(ms / 60000); const s = Math.ceil((ms % 60000) / 1000); return `${String(m).padStart(2, '0')}:${String(s).padStart(2, '0')}`;}Question 7 of 7
A video app's series page draws three placeholder rows while the episodes load:
What does it log?
const slots = new Array(3).map((_, i) => `Episode ${i + 1}`);console.log(slots.length, slots.join(','));Go deeper
Pro tip
Before a bare round, spend ten minutes on your miss list: say each call's real result aloud, then write one of them from memory in a plain editor.
Related lessons
Checked against the tools and docs as of 2026-10-06.