An AI-pairing interview phrasebook (⌘⇧P) — and why three sessions kept colliding in App.tsx
Shipped a shortcut-toggled, bilingual (EN/KO) phrasebook for a live AI pair-programming interview — built by a multi-agent workflow (research + per-category drafting + native/interviewer adversarial review). The honest finding: there's no public evidence the target company runs a branded AI round, so it's built on the industry standard. Also a dogfooding lesson: with three Claude sessions running, every UI feature collided in one file — App.tsx — because that's the single wiring hub.
What shipped
A new overlay, toggled with ⌘⇧P (VS Code command-palette convention; verified clear of macOS and every existing Talkak chord): a bilingual phrasebook for driving an AI in a live pair-programming interview. ~150 EN/KO phrases across 16 situations (clarify, plan, direct, tradeoffs, review, test, debug, refactor, narrate, push back, time-box, communicate, wrap up, orient in unfamiliar code, fall back to writing it yourself, choose algorithm/model), plus the ideal session arc, the core principles, and what the round actually grades. Type to filter; click any English line to copy.
It was built by a multi-agent workflow: parallel research (interview format) + recon (codebase/shortcut), then a pipeline that drafted each category and ran it through a native-speaker + senior-interviewer adversarial review to cut anything robotic, then a synthesis pass for the arc/principles and a completeness check.
The honest scope (built into the overlay)
The research returned an uncomfortable but important finding: there is no public evidence the target company runs a branded "AI pair-programming" round. So the content is built on the documented industry standard — Meta's AI-Enabled Coding interview (Oct 2025) and Google's pilot — and presented as the most likely shape, not a fact about one company. The overlay says so at the top. The other correction worth keeping: Karpathy's original "vibe coding" (accept AI output unreviewed) is the anti-pattern here; what's graded is staying the engine — you drive, review, run, and own.
The dogfooding lesson: App.tsx is the collision hub
This landed while two other Claude sessions were live in the same repo, building a sidebar drag-reorder and a usage-gauges feature. New component files never collided — PhrasebookOverlay.tsx, UsageGauges.tsx, Sidebar.tsx are each their own file. Everything collided in exactly one place: App.tsx. Because every feature wires itself in there — an import, a useState, a keydown case, a JSX mount. Three features from three sessions, interleaved in one file.
The consequence: the three couldn't be committed apart. App.tsx imports and mounts all three, so it only builds with all three present. The only consistent, buildable unit was the whole snapshot (verified: pnpm build + cargo check both green), so they shipped together.
The real fix is structural and on the list: a keybinding registry plus an <Overlays> mount component, so a feature self-registers instead of editing the shared hub. Until then the rule is the ADR-007 one — isolate parallel sessions in git worktrees, or serialize just the App.tsx wiring step while building the component files in parallel.
Update — backend scenario playbooks (same day)
The recruiter then confirmed OpenDoor's round is AI pair-programming (so the earlier "no public evidence" caveat is gone), and the candidate is a backend engineer. The phrasebook grew a second tab: Playbooks, organized by work scenario rather than by phrasing — because a bug-fix, a new-feature build, and an optimize pass have genuinely different flows, thinking, and delegation lines.
A second multi-agent workflow produced the taxonomy + 10 backend playbooks (fix-a-bug, new feature/endpoint, optimize & scale, data modeling, query writing/optimization, concurrency & correctness, API contract, refactor, debug an incident, external integration), each: how to recognize the scenario → the flow → senior thinking → delegate vs. do-yourself → scenario phrases → pitfalls. The taxonomy's honest core finding: a real Meta-style task braids 2-3 scenarios into one (add an endpoint → a test fails → debug → harden), so the playbooks are lenses on one task, not separate questions. Content generated straight from the workflow JSON into scenarios.data.ts (no manual transcription), rendered as collapsible cards in ScenarioPlaybooks.tsx, behind a Playbooks/Phrases tab in PhrasebookOverlay.tsx.
UX revision (same day): after feedback that the all-at-once view overwhelmed, the overlay became master/detail — a left sidebar grouped by characteristic (Overview · Scenarios · Phrases), the right pane showing only the selected item, with the flow drawn as a numbered pipeline diagram and the interview as a 3-phase diagram.
Naturalness fix (same day): a harsh native-senior audit (52 judges, 2 per set) scored the phrase bank ~55/100 — "textbook with a real-English veneer": over-complete, self-narrating lines with explainer clauses stapled on. A first blind find-replace of the rewrites mis-fired (it clobbered some of the strongest lines and the judge quotes did not exact-match the source), so it was reverted. The clean fix REGENERATED every spoken phrase (GROUPS + playbook phrases) under a hard anti-rule (clip, do not narrate the action, no explainer tails, keep real vocab) with a native-senior gate, then serialized the whole data files (no patch-matching). e.g. "Hold on, this is doing an O(n squared) scan inside the loop, so it’ll blow up on the bigger inputs." → "Wait — that’s O(n squared) inside the loop. It won’t scale."
Codex prep melted in (same day): added an "Opendoor prep" sidebar group from Jason's own prep doc — the parts the generic bank missed: an AI-DISABLED (pure-LLD) mode, copy-paste PROMPTS to type to the AI (good vs avoid), Opendoor positioning + manufacturing→homes domain bridge, API & error-code templates (offer/transition, 404/409/400), and resume→Opendoor spoken bridges. New file interview_extra.data.ts; rendered in PhrasebookOverlay. Study scaffolding (10-day plan, books, Cursor keys, full problem impls) intentionally left in the doc, not the glance overlay.
Big reference + visual expansion (same day): added a top toolbar (global search across everything + a 60-min phase timer), a visual System design section (8 cards — component stack, cache, state machine, outbox, idempotency, locking, real-time fanout, reconciliation — each rendered as a stack/flow/FSM/split diagram + what/why/"say this"), and a Reference section kept as separate layers per request: phrasal verbs/idioms (language) · tech terms (concepts) · design patterns · 8 must-code problems with L1→L5 ladders. Content from two workflows (reference glossaries; system-design cards); new files reference.data.ts, sysdesign.data.ts, SystemDesignViews.tsx, ReferenceViews.tsx.
Gap-fill (same day): after a coverage audit, added what was missing — a Java structure + skeleton + gotchas per must-code problem, the 5 full system-design TOPIC walkthroughs (Task Board, Transaction Workflow, Pricing/Offer, Reconciliation, Real-Time: prompt → components → key concepts → walk-order → opening line), a Java basics card, and the component palette. System design is now concepts(8) + full designs(5) + palette, and problems carry code. Two more workflows fed it.
Declutter + personal saver (same day): the sidebar grew to ~9 sections and overwhelmed, so it became a collapsible accordion (only section headers show; expand what you need). Added 📌 My phrases — a personal, persistent KO→EN saver (localStorage) the user fills in over time, completely separate from the generated content.
My phrases search (same day): added a filter box inside My phrases so the saved KO→EN collection is searchable by situation/Korean/English — for when you remember the situation but not the phrase.
AI correction in My phrases (same day): type Korean (+ optional rough English) → ✨ and the users OWN claude (BYO, claude -p, same pattern as the summary) rewrites it into ONE clear line of real-world dev/interview English. HARD rule baked into the prompt: no forced correction — if the draft is already clear it comes back essentially unchanged; only genuine unclear/awkward/textbook phrasing is fixed; intent is never distorted. Each entry stores 한글 / 영어 / AI-corrected, searchable. New correct.rs (Tauri command correct_phrase) — then tuned to Opus 4.8 (slow is fine; best "is this already clear?" judgment) with an even harder no-forced-correction + IT/software-dev-specialized prompt.
My phrases → its own window (same day): the most-used feature was buried in the ⌘⇧P sidebar, so it got pulled out into a standalone overlay with its own shortcut ⌘⇧O (no collisions). One keystroke, no mouse. Removed the "Mine" entry from the phrasebook sidebar.
Inline shortcut badges (same day): My phrases got keyboard shortcuts — ⌘↵ to Correct, ⌘S to Save — with a small kbd badge rendered right on each button. That inline badge is the answer to "how do I surface shortcuts so theyre recognizable instantly" — show the key where the action is (the full list still lives in the ⌘/ guide).
Usability details (same day): My phrases auto-focuses the Korean field the instant it opens (⌘⇧O → just type, no mouse). And the inline shortcut-badge pattern was spread to the main toolbar buttons — Split ⌘D, Stack ⌘⇧D, Close ⌘W, Keys ⌘/ — so the key shows right on the button.
Context-aware correction (same day): My phrases got a "상황/context" field. The Korean intent + the situation (who you're talking to, what's happening) + optional English draft all go to the correction, so the AI picks the right register for the moment instead of guessing from the bare phrase.
Auto-update (same day): added the Tauri updater — on launch the app checks talkak.daeseon.ai/latest.json and ASKS "업데이트할까요?" before downloading + installing + relaunching (updater.ts; tauri-plugin-updater/process; signed with a minisign key kept out of the repo). One catch: the currently-installed 0.2.x has no updater, so 0.2.8 is the last MANUAL install — every version after updates itself.