"Knot.ai" — Adaptive AI Interview Panel

A spoken interview platform where a panel of five AI personas holds real-time voice conversations that adapt to every answer, hand off between rounds without repeating themselves, and produce an evidence-grounded report that can only quote statements verified against the transcript. Interview flow is driven by deterministic proxy state machines rather than prompt instructions alone, with a streak-based difficulty ladder, shared context digests between rounds, fuzzy-matched evidence verification, and interruptible barge-in voice at roughly 160ms.
- My role
- Solo — design, voice pipeline, interview engine, report grounding
- Built for
- Hackathon build (Echo Sphere × Agora) · Aug–Sep 2026
“Instruction is not control. The model supplies judgement and phrasing; the server decides what happens.”
The Brief
Interview practice today means reading questions off a screen. Real interviews are spoken, they get harder when you do well, they pin you down when you are vague, and they are run by several people who each want something different and compare notes afterwards.
The obvious build — hand the whole interview to an LLM and ask it nicely — failed in testing. Against an LLM-driven candidate, the interviewer model tunnel-visioned on one topic and escalated difficulty freely, ignoring “adjust by one level” and “cover three areas” the moment they competed with its own instincts.
The Approach
I split the job. The model does what only a model can: understand an answer, judge it, and phrase the next question in character. Everything countable became a state machine in an OpenAI-compatible proxy that Agora’s voice engine calls on every turn — difficulty is a streak-based ladder clamped to 1–5, topic coverage rotates on a counter, and the right/partial/wrong verdict is emitted as an out-of-band tag that the proxy speaks itself, so what the candidate hears and what the report tallies can never disagree.
A panel of five personas (technical, hiring manager, stakeholder, product, behavioural) hands off between rounds through a short digest — covered topics, grounded bullets, end difficulty — which is the only thing that crosses into the next interviewer’s prompt. Afterwards, the report can only say what the candidate actually said: every strength and weakness carries a quote, and a verification pass drops any claim whose quote cannot be found in the transcript.
How It Works
- 01Candidatespeaks; can barge in
- 02AgoraASR · VAD · TTS
- 03Knot proxypre-screen, difficulty ladder, director note
- 04Claudejudgement + next question
- 05SQLiteturn log = source of truth
Key Decisions
Pose as the LLM
Agora’s engine speaks the OpenAI chat-completions dialect, so the Fastify server exposes /v1/chat/completions and owns every turn — re-injecting the persona prompt and a per-turn director note, which also survives Agora truncating history to 32 messages.
Cheap, deterministic pre-screen
Before the model sees a turn, regex checks catch what regex reliably can: answers under 8 words, hedging with no concrete signal, and genuine self-retractions. Any flag forces a narrow follow-up and holds or lowers difficulty.
Fuzzy-but-strict evidence matching
Quotes match on a normalised substring, then an 80% token-overlap fallback against the cited turn — so a lightly paraphrased quote still grounds, but an invented metric or technology does not. The report shows how many claims were cut.
Barge-in at ~160ms
interrupt_duration_ms: 160 with AI VAD and noise suppression, and Claude’s tokens streamed straight to TTS so the interviewer starts speaking before the sentence is finished.
Learned the Hard Way
BrokeAsking the model to say an exact verdict sentence — it substituted “That’s a solid overview”.
FixedThe model emits a <right>/<partial>/<wrong> tag; the proxy speaks the sentence, verbatim by construction.
BrokeThe contradiction detector fired on any shared long word — by round three it flagged everything.
FixedTightened to a real self-retraction: an “I/we” subject plus topical overlap right after a negation.
BrokeAgora TTS fails silently — the agent joins, reports RUNNING, and never publishes audio.
FixedA /health/tts pre-flight that names the missing credentials, plus an 18-second audio watchdog in the browser.
- The interview brain is verified against a mocked Agora (
npm run sim); the live voice path is the thinner-tested surface. - State is single-node — in-memory per round, plus SQLite for the transcript.
- Runs on Render’s free plan, which sleeps after ~15 minutes idle; a cold start mid-interview breaks the voice loop.