
Why does my AI RPG mix up characters? The speaker problem
Your AI RPG mixes up characters because it treats speech as prose and infers the speaker fresh every time it rereads the scene, and language models fill uncertainty with confident guesses. Nothing in a transcript-based game pins a line of dialogue to a mouth. So the innkeeper answers a question you asked the mercenary, two characters merge into one interchangeable voice by session three, and a threat you clearly remember one man making has quietly migrated to another. Fixing it takes the same move that fixes every other failure in this category: stop trusting the storyteller with a fact, and make the fact structural.
We build Branching Skies, a mobile AI RPG, and we ended up holding this particular fact to the strictest bar in the entire game: zero misattributions, measured, not aspired to. This post is about why the problem exists, what dialogue cards are, and what it took to get the error rate to actually be zero.
Why is who-said-what so hard for an AI narrator?
Because attribution in prose is inference, and inference from a language model comes with confident errors built in. When the model writes a scene, the connection between a quote and its speaker exists only in phrasing, he said, she replied, the man by the fire muttered. When it rereads that scene later, it re-infers those connections, and every reread is a fresh chance to reassign a line. Players experience the result as characters blurring together, which is why the complaint shows up in every AI story community in some form: the wrong character answering, voices flattening into one, words appearing in mouths that never said them.
In most apps this is an annoyance. In a game built on memory it is corruption, because the people in our world hold individual grudges. If the record hears an insult from the wrong mouth, the wrong person's opinion of you drops, and the world's memory is now confidently wrong, which is worse than forgetful.
What are dialogue cards?
The visible half of the fix: when a character in Branching Skies speaks, their words arrive on their own card with their name on it, separate from the narration around them. A tavern argument stops being a wall of text with quotes buried in it. You see the gambler's card, then the watchman's, each speaking in turn, and you can feel who is in the room. Playtesting taught us this changes how conversations register: a character whose words arrive under their own name has weight in a way a quoted paragraph never manages.
The invisible half is the part we actually sweated. A card is a claim, this exact person said these exact words, and a rendered claim had better be true. So cards are not the narrator's decision. Between the storyteller and your screen sits a verifier that checks every candidate line against the characters actually present in the scene, the same recorded scene state that tells the narrator who is standing in the room at that hour.
How do you make attribution never wrong?
By deciding which direction the system is allowed to fail in. Our first version tried to catch every way a line could be misattributed and block them, and it kept losing: each fix revealed a new edge, because enumerating everything that can go wrong is endless. The design that finally held inverts the logic. Only a line whose speaker the game can exactly verify gets a card. Everything else, however speech-like, stays as plain narration. The system never guesses.
That rule has a precise consequence: its errors are all misses, never misfires. A missed card costs polish, a paragraph that could have been a card and is not. A misfire would put words in the wrong mouth and poison the memory record downstream. Between those two costs there is no contest, and it is the identical decision-versus-narration split we use everywhere, from companion decisions in combat to quest milestones: the model narrates, structure decides.
How do you test a zero bar?
Not by reading a few good transcripts. A zero bar needs adversarial volume, so we fuzz it: twenty thousand generated scene variations thrown at the verifier, deliberately seeded with the ugly cases, ambiguous phrasing, nested quotes, speakers interrupting each other. The result across those runs was over seventeen thousand rendered cards and zero misattributions, with every refused card falling into the safe pile instead. Alongside the fuzz, we hand-audited live play sessions card by card, including multi-speaker scenes, and they came back clean with full coverage, every spoken line carded.
We publish numbers like these because measurement is the difference between a system and a vibe, and asking for the numbers is exactly how we suggest evaluating any AI campaign. A studio that claims its characters stay distinct should be able to tell you how it knows.
Where this is heading
Branching Skies is a curated, mobile-native AI RPG set in Syrinway, a world we ran as a homebrew tabletop campaign for close to a decade before writing a line of code. Dialogue cards, the never-guess verifier, and the measured zero-misattribution bar are working in our development builds today, and the numbers above come from our own test runs and logged sessions. The early beta list is open now. If you want a world where every voice belongs to someone, the form below is where that story starts.