Code › tail-villain
Why I Built a Villain
The starting point of Tail Villain, built around the gap between knowing something and retrieving it under interview pressure
Whenever an interview was coming, the same thing would happen. I would open Notion and find dozens of pages on distributed systems design, cache consistency strategies, and database transaction isolation levels. I understood them while studying and had implemented them myself, but the moment someone asked, “How did you handle consistency guarantees in a distributed environment?” twelve years of experience would suddenly vanish into fog.
It wasn’t that I hadn’t experienced it. I couldn’t retrieve it.
There’s a concept called the Ebbinghaus forgetting curve. Half of what you learn disappears within a day, and a week later, almost none of it remains in a retrievable state. Countering that loss requires pulling information back out at the right intervals so the brain decides it is worth keeping.
The problem is that managing “the right intervals” manually is no small feat. Few people systematically track which topics need review today or which ones are at risk of fading, so the knowledge accumulates in notes, feels solid on the page, and evaporates under pressure.
Neuroscience has an explanation for why this happens. Under acute stress, the amygdala activates and temporarily suppresses the prefrontal cortex, which is responsible for memory retrieval and logical reasoning. According to Amy Arnsten, a neuroscientist at Yale, uncontrollable stress can cause a rapid and dramatic loss of prefrontal cognitive ability. Even familiar knowledge can become inaccessible under pressure because the brain has shifted into survival mode.
I looked for tools that handled this, from widely used general-purpose LLMs such as ChatGPT, Claude, and Gemini to foreign mock interview platforms, flashcard apps, and spaced repetition systems. Each one fell a little short in its own way, and none fit together the way I needed.
So I started building something.
Building it revealed something even more important than retention.
Reading a note can feel like knowing something because the words look familiar and the concept seems clear, but that is passive recognition. Interviews test retrieval instead: whether I can explain something without looking, defend it without losing composure, and keep my reasoning intact when a follow-up question exposes a gap in the first answer.
The gap between recognizing something and being able to articulate it under pressure is where most interview preparation fails.
What I actually needed was not a smarter flashcard system, but something that would argue with me systematically.
That’s where the villain came from.
The most uncomfortable interview moments are not the questions I cannot answer. They come when I answer confidently, watch the interviewer’s expression suggest something is wrong, and then hear the follow-up that exposes how shallow the answer was: “You said A earlier, but now it sounds like B. Which is it?”
That pressure is the real test, and building tolerance to it requires creating constrained conditions and practicing through them repeatedly.
I built an AI interviewer that does not accept surface answers. It follows up, remembers the previous context, catches contradictions, and asks why again and again.
The first persona was Kovill, the follow-up question villain. Cold and precise, Kovill is impossible to bluff and can make me realize mid-answer that I do not actually understand what I am talking about.
The obvious question is why not use ChatGPT, Claude, or Gemini. Honestly, it is possible, and a detailed prompt can create a practice session for a specific situation and role. But the setup is tedious every time, context eventually gets lost, and the practice tends to fizzle out.
Tracking where I struggled before also means repeatedly feeding that information into memory. An LLM is non-deterministic, so there is no guarantee it will surface the right memory when needed, and the available memory is limited. Frankly, managing all of that is just another chore.
tail-villain is not just a tool but a system. It accumulates data across sessions, surfaces weak spots, and feeds the results into what comes next. Building it as one system also makes it possible to keep adding capabilities such as voice interviews, feedback reports, and company-specific modes.
ChatGPT starts fresh every time, while tail-villain is designed to remember where I left off in a structured form.
It started as a tool for developers. I am a developer myself, so beginning with the problem I knew best seemed like the right place to start.
But building it changed my thinking. The gap between knowing something and being able to explain and defend it under pressure is not specific to software engineering. Designers presenting work to stakeholders, product managers explaining roadmap decisions, and salespeople handling objections all face the same situation when they must demonstrate their knowledge to people looking for weaknesses.
The villain is domain-agnostic. It pushes back, probes deeper, refuses to let weak answers slide, and keeps forcing the user to sharpen them.
tail-villain launched in beta in May 2026 at tailvillain.com, and this series documents how it got there.
Some knowledge only comes from building something from zero to one: designs that did not work, LLM prompts that had to be rewritten, improvements driven by evaluation, and the edge cases encountered along the way. I decided to write it down before it fades.