← All proposalsWork blog
Oil painting of a candlelit tavern at night, an innkeeper leaning across the bar in conversation with a hooded traveler, a tabby cat sitting on the bar between them

The Last Parser

A deep dive into Shroud of the Avatar's typed conversation system, the last of its line, forty years of NPCs that answer back, and thirty-three concrete proposals.

Talk is the oldest system in Shroud of the Avatar and the least examined. Across 148 scenes, 2,302 conversation files hold 32,973 topics and 42,276 answers, every one reachable by typing a word at an NPC, a mechanic the rest of the genre abandoned two decades ago. Thirty days of live telemetry show what the inheritance costs: players typed 2,216 things no NPC understood, five percent of them the name of one man in Highvale that nobody in his own town could point to, and 59 of them addressed to cats and dogs that said nothing back. Behind the window sit 97,951 voice clips in eight languages, a 40-entry per-NPC memory almost nothing reads, and a town clock that 97.9 percent of the world ignores. This page walks the machine end to end, traces forty years of talking NPCs from Ultima IV to the LLM wave, and lays out thirty-three concrete proposals in four tiers. Every card is open for comments and votes below.

0 · Executive summary 1 · The window we have 2 · Lessons: Ultima IV to the LLM wave 3 · The thirty-three proposals    Tier 1 · Words That Work (S1–S9)    Tier 2 · On Speaking Terms (S10–S16)    Tier 3 · The Town That Listens (S17–S27)    Tier 4 · The Oracle's Table (S28–S33)    Considered and rejected 4 · The composed conversation 5 · Sequencing 6 · Appendix
Section 0

Executive summary

In 1985, Ultima IV shipped the idea this whole page rests on: you talk to an NPC by typing a word, every character in the world answers to name, job, and health, and the deeper secrets are words you learn in one conversation and spend in another. Ultima V put the townsfolk on a clock. Ultima VI highlighted the askable words inside NPC speech, the compromise between mystery and mercy that this game's window still uses. Then Ultima VII dropped typing for click lists, and every later branch of the family tree inherited that ceiling: Morrowind's topic hyperlinks, World of Warcraft's gossip pane, the dialogue wheel. The wheel won for reasons that made sense at the time, controller ergonomics and the cost of recording voice for every variation. Both reasons have since inverted. Voice is generated now, not recorded, and the dominant interface of the 2020s is once again a text box you type into. Shroud of the Avatar, built by the man who wrote the 1985 original, is the only live commercial MMO still running the trunk of that tree.

The system underneath is in better shape than its reputation. Conversation resolves entirely on the player's machine, which is why typing at an NPC costs the server nothing at any concurrency. The corpus is enormous and largely sound: an audit for this page parsed every file and found exactly two broken compound gates, one truncated expression, and ten bad action verbs across 42,276 answers. The voice pipeline built this year gives roughly 1,700 NPCs speech in eight languages at a cost per line the 2006 industry could not imagine. And the authoring seat, Conversation Studio, shipped in July with thirty validation rules. The machine works. What the machine lacks is manners, memory, and a wound clock, and the live telemetry says exactly where:

  1. The parser fails silently, and mostly at new players. 2,216 typed lines went unanswered in thirty days, and about 35 percent of them landed in the three starter outskirts plus Soltown, on players deciding whether typing at NPCs is worth their time at all. The single worst offender is one name: michael, typed 103 times at ten different NPCs in Highvale Outskirts, none of whom know their own neighbor. When the parser misses, a chatbot bolted on years ago improvises a plausible nothing, and the game cannot even count how often, because the bot's answers and honest misses write the same log line.
  2. The town clock is not connected to anything. The game has an 8-period day, a time check already sitting in its gate evaluator, waypoint routes with per-stop delays and emotes, sitting and sleeping animations, an off-duty mode with recorded transition lines, and 143 closing-time responses already written into 86 files. None of it is wired to the clock. Of 5,093 dynamic spawners in the world, 4,988 ignore time of day entirely. The lamplighter who walked Britain at dusk in this game's own ancestor has no descendant here.
  3. The memory is already paid for and nobody spends it. The flag store supports counters, numeric gates, and daily, weekly, and hourly expiry. The server keeps a 40-entry ring of every keyword you have used with every NPC, and which answer you got. The virtue engine tracks courage, love, and truth, and an AI hook named ReactVirtue has sat unreferenced since it was written. With all of that shipped, an innkeeper greets the Avatar of Virtue on the hundredth visit exactly as she greets a stranger on the first.

Thirty-three proposals follow, in four tiers. Thirteen defects found during the audit are filed on the tracker (#4618 to #4630) and the cards cite them.

TierThemeCardsCost bandWho asked
1 · Words That WorkThe defect ledger: a miss counter that can finally tell bot answers from honest ones, bark dice that respect their own percentages, keyword highlights that actually ship, broken gates repaired, verbs that log instead of throw, replies that open at the top, questions that survive their own timeout, and 592 conversations restored to their own languagesS1–S9all smallevery player who typed a word no NPC understood, and the tracker issues #4618–#4630
2 · On Speaking TermsThe forgiving ear: typos land one letter off and still connect, misses come with a map, answers stop repeating, cats answer to woof, street noise learns manners and a mute button by categoryS10–S16small to mediumthe Oracle's typo storm, that_shawn_guy's seven muting reports, and the Cat of Soltown
3 · The Town That ListensThe new capabilities: a clock in the flag grammar, evening rounds town by town, neighbors who can point to Michael, innkeepers who remember you, virtue in your greeting, a conversations journal, street playlets, and the first NPCs a town owner can call their ownS17–S27medium to extra largethe index tile's own promise, wishlist threads 179050 and 179344, Takotora's daily requests, and forty years of genre precedent
4 · The Oracle's TableSix owner rulings with the evidence attached: the fallback bot, the outlander voice, affinity versus flags, the client-side clock, the Oracle's three doors, and the generative docketS28–S33rulings firstthe owner; every ruling gates cards above it
Section 1

The window we have

Right-click any townsperson in New Britannia and this window opens. It is the direct descendant of Ultima VI's 1990 compromise: type anything you like, and the words the NPC can expand on glow in their own speech. Every part of it works today, and every part of it carries a proposal.

The conversation window, as it ships today
Conversation
Innkeeper Abbott: Welcome back, outlander.       (1)
The stew pot is on and there are rooms
upstairs, unless the ferry has already        (2)
worn you out.

You: ferry
Innkeeper Abbott: She runs at dawn from the
north dock. Captain Kinsey keeps the manifest.

  [rooms] [rumors] [ferry]                  (3)
▲ hide topics                                 (4)

Local: [__________________]  [Vendor] [Goodbye]  (5)(6)
Six zones, six proposal themes
  • 1The NPC's own words are the map. Askable keywords glow inside the speech itself, the Ultima VI pattern. The markup loader that paints them carries a verified defect, it is compiled for the editor only, card S3; the honest-miss and typo work lives at cards S11 and S10.
  • 2Grey means remembered. "ferry" is dim because you already used it. A 40-entry per-NPC ring stores every keyword you have tried and which answer you saw, and it survives relog. Exactly two things read it today, both cosmetic. The callback card S20 puts it to work.
  • 3The strip pages through the ring, unused topics first. Long replies open scrolled to their end, a defect with a years-long forum thread, card S6.
  • 4One chevron for the whole world. Show or hide is a single account-wide option shared by every NPC, and while an NPC waits on a question the game seizes the strip for the answers. Questions themselves expire after seven minutes and are forgotten, card S7.
  • 5Two verbs get buttons; five are promises. Vendor and Goodbye are guaranteed by UI. The typed floor of name, job, help, buy, and sell fails on specific NPCs: Bancroft in Solace Bridge Outskirts ate eight typed "sell" attempts last month. The coverage lint lives in card S1.
  • 6The whole window runs on your machine. The server learns flags, loot, and journal writes, never the words. Every card on this page honors that line; see the constraint box below.

2,216 unanswered lines

Every time the parser comes up empty the client writes one log line: the NPC, the scene, and what the player typed. Thirty days of those lines are this page's best witness. Misses are rare in absolute terms, 2,216 against 8,935,775 skill casts in the same window, but they concentrate exactly where they hurt: about 35 percent land in the three starter outskirts plus Soltown, on players deciding whether typing at NPCs is worth their time at all.

every dead end, 30 days
2,216 unanswered lines
the new-player corridor
~35%: starter outskirts + Soltown
quest-item hunts
fire 48, key 31, red cloth 30, deed 20
basic verbs, wrong NPC
help 36, buy 32, sell 29, name 18, train 16
the Michael problem
"michael" 103 times, 10+ NPCs, one town
answers to forgotten questions
yes 37, ok 25: the NPC asked, then forgot
talking to animals
Cat 31, Dog 28: woof, meow, pet
other languages
feuer 13, ayuda 6, hilfe 4

The classes decompose almost the whole sample, and each one is a different card. "Michael" was asked of ten different NPCs in Highvale Outskirts, guard and blacksmith and neighbor alike, and nobody in town knows him: card S19 teaches towns their own residents. "yes" and "ok" die because an NPC's question expires after seven minutes and it forgets it asked: card S7. The Oracle collects a private typo storm (est, tets, tesrt, teswt) from players trying to type a word it just asked for: card S10 catches typos one letter off. And the Cat of Soltown outranks most human NPCs for attempted conversation: card S13 is five keywords per animal. None of these numbers can improve until misses are counted somewhere a designer looks, which is card S1, the dead-end ledger.

Oil painting of an armored knight kneeling in a village street at golden hour, helmet under one arm, speaking earnestly to a small cat sitting on a doorstep
The Cat and the Dog rank fifth and eighth among all NPCs for unanswered lines: 59 attempts in thirty days, including woof, meow, pet, good kitty, and once, pspspspspsps. The animals said nothing back. The cheapest card in this catalog is five keywords per animal, and the game already has stables of NPCs who address players as meow, grrr, and whuf.

One keystroke, end to end

Everything a player types walks one pipeline, and it has exactly four seams where this catalog plugs in: the match seam, the selection seam, the output seam, and the miss seam. No card below invents a fifth.

flowchart TD
  IN[Player types in the Local box] --> PRE[Cleanup pass
punctuation stripped, accents folded,
lowercased] PRE --> Q{Is this NPC waiting on
a question it asked?} Q -->|yes, within 7 minutes| QH[Query handler
yes and no variants, saved answers,
name capture] Q -->|no, or the question expired| KW[Keyword walk : MATCH SEAM
substring scan plus wildcard entries
over this NPC's keyword table] KW -->|hit| SEL[Response selection : SELECTION SEAM
three passes: flag-gated, ungated, fallback,
off-duty filter each pass, then a random pick] KW -->|miss| BOT[Fallback : MISS SEAM
chatbot line, or an honest shrug,
either way one identical log line] SEL --> ACT[Actions
set flag, give item, teleport,
directions, about 50 verbs] QH --> ACT ACT --> SAY[Say : OUTPUT SEAM
chat text, overhead bubble, chat log,
voice clip, speech floor, emote] BOT --> SAY style KW stroke-width:3px style SEL stroke-width:3px style SAY stroke-width:3px style BOT stroke-width:3px,stroke-dasharray:5 5

The match seam takes the fuzzy matcher and the verb hygiene. The selection seam takes recency weighting for the 4,710 talks that already carry multiple answers, the new time token, and every memory condition. The output seam takes voice policy, the transcripts tab, and bark discipline. The miss seam, drawn dashed because it is the one that fails players today, takes the hints, the ledger, and the generative last resort. A bot answer and an honest shrug currently write the identical log line, so the game cannot even count its own failures by kind.

Already built, cited not re-proposed: this page stands on tooling that shipped this year and proposes none of it again. Conversation Studio is the authoring seat, and several cards add lint rules to it rather than new editors. The quest graph tool maps flag flow. The voice pipeline generated the 97,951 clips behind roughly 1,700 speaking NPCs in 8 languages with 140 voices, and makes every "more lines" card cheap where 2006-era games found it impossible. The speech floor already serializes ambient speech so NPCs stopped talking over each other, and per-NPC muting shipped for the neighbor who would not stop. New cards extend these; none replace them.
The constraint every card honors: conversation in Shroud resolves entirely on the player's machine. The server never parses a word; it sees only the results that matter to it: flags, loot, journal and virtue writes, and the bark and topic bookkeeping. That is why typing at an NPC costs the server nothing at 2,500 players, and why no card below may put a security-sensitive decision inside the parser. Anything a card wants an NPC to remember must live in the flag store the client already writes, anything time-based must read the server-synced world clock so every observer agrees, and all final tuning numbers belong to the balance program, not this page.
Section 2

Lessons: Ultima IV to the LLM wave

The typed-keyword conversation is not a curiosity that survived by accident. It is a design lineage with a paper trail, and this game's founder wrote the first page of it. What follows is the trail: what each generation added, what each fork gave up, and what the current wave changes.

Oil painting of a town square at dusk, a lamplighter reaching up to light a street lamp while a blacksmith across the square closes his shutters for the night
A lamplighter walked Britain's streets at dusk lighting each lamp in turn. That was Ultima VII, 1992, from this game's own founder. New Britannia has the clock, the waypoints, the sitting and sleeping animations, and 143 closing-time answers already written into its files. Nothing winds them together yet; the third tier of this catalog is the winding.

The trunk is Ultima. In 1985, Ultima IV set the floor that made typing viable at all: every NPC in Britannia answers name, job, and health, the parser matches on the first four letters so spelling mercy is built in, and the real quest structure is words themselves, learned from one character and spent on another. The internal authoring sheet Origin used that year survives, and it reads like a design law: give each NPC two pieces of knowledge the player could deduce it knows, and one secret with a price on it. Ultima V put the townsfolk on a real clock, so where and when you caught someone changed what you got. Ultima VI made the pivotal compromise this game still ships: keep the free typing, but paint the askable words red inside the NPC's own speech, so the parser scaffolds itself without giving up its secrets. Then Ultima VII removed typing for click lists, and its towns reached the schedule apex, a lamplighter walking Britain at dusk, a baker who bakes, drinks, and sleeps. The trade was permanent: no Ultima after VI ever let a player spend a word they were not offered.

The MMO branch tells the survival story. Ultima Online carried keyword speech into 1997 and it survives there today as a command grammar: bank, guards, I wish to lock this down. What withered was conversational lore, and the record says why: nothing scaffolded it, so when menus arrived in 2001 they filled a vacuum. The 2002 player-hired barkeep, with owner-set keyword and response pairs, is still cited by players two decades later, and it is the direct precedent for this page's town-owner cards. EverQuest ran the other experiment: NPC dialogue parsed from typed say text, with askable words hinted in brackets inline, and some deliberately unhinted so discovery stayed alive. Its retreat was graceful by design: by 2007 each bracket became a link that types the word for you, and the typed data model survived under a clickable skin. World of Warcraft is the fork's terminal state: conversation became a gossip pane, and by 2008 the engine hid its own flavor text by default, leaving an addon ecosystem whose whole purpose is to skip or salvage what remains. The lesson the branch agrees on: scaffold the parser or lose it.

The craft branch supplies the manners. Infocom's parser doctrine, refined by forty years of interactive fiction, distinguishes three failures that must never share a message: the word is unknown, the answer is refused, and the answer is not available yet. Conflating them is the cardinal sin, and it is the sin the current fallback commits on every miss, because the AIML chatbot bolted onto the parser answers everything with a plausible nothing. That bot's own ancestry runs straight to ELIZA, 1966, whose author spent the rest of his career warning about exactly this effect: canned plausibility teaches people to trust, then to distrust, everything. Morrowind contributes the condition stack worth adopting under a typed surface, priority-ordered responses gated on disposition, faction, and state, with explicit refusals, and also the failure to refuse: a shared response database that turned a hundred mouths into one encyclopedia. Hades contributes the modern selection algorithm, condition-filter then priority-sort then retire, directly applicable to the 4,710 talks here that carry multiple answers and pick between them at uniform random. Disco Elysium proved failure can be the best content in the game if it redirects instead of stonewalling. And Animal Crossing holds the record for emotion per byte: a timestamp, a counter, and a few learned facts behind template lines produce villagers people write essays about missing.

The schedule-and-street canon prices the third tier. Ultima VII did daily routines with a tiny per-NPC data table; Kingdom Come: Deliverance shipped the same shape in 2018, about eight timed activity blocks per NPC, and its honest cost is documented, the wait-by-the-door tax, which this catalog pays in dialogue rather than locked doors. Gothic had already proven the effect years before Oblivion: townsfolk who work, eat, and sleep read as alive even when the acting is stiff. Oblivion's Radiant AI is the cautionary tale with receipts: the famous pre-release autonomy demos were staged or cut, the team's own words explain why ("the AI is so smart it screws up our quests"), and one of its two hard constraints, the cost of storing recorded voice, is precisely the constraint this game's generated-voice pipeline deleted. Skyrim's temper, schedules without autonomy, is the right ceiling. On the street, Rockstar's ambient systems are line pools with context tags and per-line cooldowns, not runtime intelligence; Guild Wars 2's two-NPC playlets on long cooldowns earn the highest praise per authored line in the genre; and The Witcher 3 supplies the negative proof, players installed a mod to amputate repeating chatter rather than keep hearing it.

Then the wave. Large language models put typed conversation back at the center of the industry, and the early record is already legible. What ships and delights: games where the model is load-bearing for play but never for canon, a guard you talk your way past, a story the machine improvises around your nonsense. What fails: unbounded cost (AI Dungeon's hosting bills spiked five figures monthly before its moderation crisis), jailbreaks (which are architectural, not promptable, so consequences must live outside the model), latency that breaks voice, and blanket coverage, a thousand shallow chatbots that bore players inside a minute while one deep character keeps them for hours. The Stanford generative-agents experiment, a town of 25 NPCs with memory streams, reflection, and daily plans, is the blessing this page leans on: its architecture is schedules plus memory plus authored personality, and nearly all of it can be precomputed. This game already built a fenced, fail-open, default-off generative NPC system in July. The docket for turning it on is card S33.

1985
Ultima IV
Typed keywords; every NPC answers name, job, health. A guaranteed floor makes players willing to type at all.
1988
Ultima V
NPC daily schedules on a real clock. Where and when you catch someone starts to matter; words gain stakes.
1990
Ultima VI
Askable words highlighted inside NPC speech. Scaffold the parser, keep the secrets. This window's direct ancestor.
1992
Ultima VII
Typing removed for click lists; schedules reach their apex, a lamplighter walks Britain at dusk. Click-only trades discovery for convenience, permanently.
1997
Ultima Online
Keyword speech survives the MMO jump as a command grammar; conversational lore withers and menus win by 2001. Scaffold or be replaced.
1999
EverQuest
Keywords hinted in brackets inside chat; by 2007 each bracket is a link that types the word for you. Hint inline, degrade gracefully.
2002
Morrowind
Topic hyperlinks over a priority-ordered, condition-gated response database. Steal the condition stack; refuse the wiki-terminal flattening.
2004
WoW gossip
Conversation becomes a click window; by 2008 the engine hides its own flavor text by default. The click fork's terminal state is a vending machine.
2023+
The LLM wave
Stanford's agent town, the Skyrim mods, the first shipped hits. Load-bearing for play, never for canon; and suddenly everyone on earth types at computers again.

The capability matrix

Ten systems, fourteen capabilities. A filled dot is a first-class mechanic, a half dot is partial or conditional, an empty dot is absent. The two highlighted columns are this game, today and if this catalog ships.

CapabilityU4–U7UOEQMorrowindKCDRDR2WoWLLM waveSotA todaySotA proposed
Typed free-text input● unchanged
Clickable topics in NPC text◔ U6 on◔ saylinks● ships everywhere, S3
Topic journal / discovered list◔ 2007◔ 40-entry ringS23
Failure triage (distinct miss messages)◔ refusalsS11
Fuzzy input match◔ 4-letter prefixS10
NPC daily schedules● U5 on◔ parts unwiredS18
NPC-to-NPC chatter◔ 73 entriesS24
NPC memory of the player◔ stored, unreadS20, S21
Reputation and disposition gates● factionS21, ruling S30
Virtue reactions in dialogue● U4's core◔ honor○ engine idleS22
Voice-over at scale◔ latency● 97,951 clips● unchanged
Localization of dialogue◔ 592 fall backS8
Player-authored NPCs● barkeep 2002◔ Ink NPCsS27
LLM dialogue, live◔ built, off◔ fenced, S33
Animals that answer to woof◔ pet commands◔ GreetS13

Reading notes: the U4 to U7 typed-input dot ends with U7's click lists; the timeline tells that story. SotA's topic-journal half dot is the 40-entry ring; its schedule half dot is a full pantry of shipped ingredients (waypoints, day and night checks, 143 authored closing-time responses, sitting and sleeping animations) that nothing connects; its memory half dot is a flag store that records everything and characterizes nothing. The proposed LLM cell stays a half dot on purpose: fenced flagship characters and offline authoring, never 1,700 live chatbots.

Section 3

The thirty-three proposals

Numbered S1 through S33, in four tiers: the defect ledger first, then the forgiving ear, then the town that listens, then the owner's table. Every card names its cost, its risk, and where it plugs into the shipping data. Thirteen defects found during this page's audit are filed on the tracker as #4618 to #4630 and the cards cite them. Tuning numbers are illustrations for discussion, not commitments; the balance program owns every final value.

Tier 1 · Words That Work · nine cards of true words

The parser logs 2,216 dead ends in 30 days against 8,935,775 skill casts in the same window. Misses are rare, but they concentrate exactly where they hurt: about 35 percent land on brand-new players. This tier is the defect ledger: a truth instrument first, then eight repairs where the code or the data is simply wrong, every one small.

S1 · The Dead-End Ledger

Tier 1Size SServer: nonecites #4628, #4630

30 days live: 2,216 misses, 990 distinct inputs, bot answers and honest shrugs indistinguishable

The client already logs every parser miss. What it cannot do is tell whether the fallback chatbot improvised an answer or the NPC honestly shrugged, because both paths emit the same log line. This card adds a one-word marker to that line, stands up a weekly top-50 miss report, and adds a Conversation Studio lint for the pattern the data already shows: NPCs that players keep asking buy, sell, help, or name at with no such topic authored. Bancroft in Solace Bridge Outskirts took eight typed "sell" attempts last month; the Watcher took name, job, and help ten times. The report is the permanent content pipeline; every other card in this tier came out of one run of it.

Seen in: Infocom's two-signal failure taxonomy; the modern interactive-fiction practice of mining transcripts for unimplemented nouns; Hades' team reading play data to find starved dialogue buckets.

Implementation notes

Marker on the bot branch at Conversation.cs:9187 so the ConvUnknown emit at :9199 carries bot=1|0; BotResponses.GetBotResponse returns a flag alongside the string (#4628). Weekly report reuses the existing log-search sweep recipe. Studio lint cross-references miss telemetry NPC names against corpus keyword lists for the always-listed basics. The data-hygiene chore riding along is #4630. Tests: EditMode on the marker branch; the report script gets a golden-sample test.

client Sserver noneimpact misses become a to-do listtests EditMode + golden sample

S2 · Fair Dice for Barks

Tier 1Size SServer: noneverified defect #4618

one operator: a trigger authored at 30% fires at 100%

The bark trigger rolls its percentage dice, stores the result, then immediately overwrites it with the flag-expression check on the next line. The random gate authored into every one of these triggers has never worked: a trigger set to fire 30 percent of the time fires every time its flags pass. The fix is one character. Expect some scenes to get noticeably quieter, which is the authored behavior finally happening.

Seen in: RDR2 and GTA V per-line cooldown discipline, chatter systems live or die on rate control; the Witcher 3 mod that removes repeating chatter, proof players will amputate an NPC voice rather than hear it fire too often.

Implementation notes

NPCBarkTrigger.cs:105: the flag-expression result assigns over the roll computed at :91-103; change assignment to and-equals. The 15-minute recheck window is unaffected. One audit pass of high-traffic trigger scenes after. Test: EditMode on the trigger decision with a stubbed roll.

client XSserver noneimpact authored bark rates finally realtests EditMode

S3 · Highlights That Ship

Tier 1Size SServer: noneverified defect #4619

The loader that regenerates keyword highlight markup opens with a compile guard that makes it editor-only, so the markup files that control keyword presentation in NPC replies never load in the shipped game. Authors preview one conversation and players can get another. Removing the guard, and paying a small load cost on the on-demand conversation path, makes the build match the editor. Highlighted keywords are the scaffolding the whole typed system stands on; shipping them half-applied undercuts every card in Tier 2.

Seen in: Ultima VI's red highlighted keywords, the original scaffold-not-replace compromise; EverQuest's bracket keywords inline in chat; Morrowind's topic hyperlinks, the same affordance with the typing removed.

Implementation notes

Dialogue.cs:1411-1413, the editor guard on LoadKeywordResponseMarkup; verify the markup files ride the per-scene conversation bundles, and add them to the bundle manifest if they never did. Tests: EditMode parse of a sample markup file; build-side smoke on the test shard.

client Sserver noneperf small load per conversationtests EditMode + build smoke

S4 · Gates That Parse

Tier 1Size SServer: noneverified defects #4620, #4621, #4622

corpus audit: 2 broken compound gates, 1 truncated expression, 1 precedence trap, out of 14,220 gate expressions

The corpus audit found exactly two always-listed topics whose unlock conditions use an or-expression, and the code path evaluates them as a single literal flag name, so both silently never unlock. One of the two is doubly broken: the export pipeline truncated its expression at exactly 50 characters, chopping the last flag mid-name. A third entry mixes and-with-or without parentheses and reads differently than authored under the left-to-right evaluator. Fix the evaluation, repair the three data rows, lift the export column limit, and add a Studio lint so no new instances appear. Three data bugs in 14,220 expressions is a very good corpus; this card keeps it that way.

Seen in: Morrowind's classic dialogue-authoring bug, a filter placed above a higher-priority one shadows it forever, silently; Inform 7's named-rule model where every gate is inspectable.

Implementation notes

Route the always-list flag check through the full expression parser instead of the singular lookup (#4620); repair Abela talk 40870, Esmeralda talk 33669 with its truncation (#4621), and the Phineas response 35999 parenthesization (#4622); lint any always_flag containing an operator and any mixed expression without parens. The gate evaluation may unlock long-dormant content; check the two questlines once. Tests: EditMode on the expression path (the parser is pure); corpus lint in CI.

client Sserver noneimpact gates mean what they saytests EditMode + corpus lint

S5 · Verbs That Fail Loudly

Tier 1Size SServer: noneverified defect #4623

10 unknown-verb strings in shipped data, each a runtime exception waiting to fire

The action parser has no tolerance for a verb it does not know: a data typo becomes a player-visible failure instead of a logged authoring bug. One whitelisted verb has no implementation at all, and nine more unknown-verb strings sit in shipped conversation data, four of them attempts to grant experience directly. This card converts the throw to a logged skip, repairs the ten corpus strings, and adds the verb list to the Studio validator so a bad verb never exports again.

Seen in: Infocom's rule that the parser never crashes, it reports; the interactive-fiction principle that vocabulary errors are authoring telemetry, not player punishment.

Implementation notes

ParseAction at Conversation.cs:7352: unknown verb becomes log-and-skip; repair the 10 strings (four addxp variants in Blood River among them); snapshot-test the verb whitelist against the implementation table so the two can never drift again (#4623). Tests: EditMode on the unknown-verb path; corpus scan in CI.

client Sserver noneimpact typos stop being exceptionstests EditMode + corpus scan

S6 · First Impressions

Tier 1Size SServer: nonecites #4627

When an NPC delivers a long reply the window shows the end of it, and players read the answer backwards; the forum has asked for the fix for years. Separately, an authored and localized conversation help popup exists in the code, disabled entirely because it once fired on every keystroke; the comment reads "DEPRECATED AS SPAMMY". This card scrolls new replies to their start, and revives the help popup behind a once-per-account gate so a brand-new player sees how talking works exactly one time. Both changes live in the window layer; neither touches the parser.

Seen in: EverQuest's NPC Journal Window, added in 2007 specifically because players lost long dialogue in chat scroll; Ultima VI's portrait panel that always framed the reply from its top.

Implementation notes

Scroll: the window view's reply append path sets the scroll offset to the new message head (#4627). Help: the commented ShowHelp call inside DoConversation returns behind a help_conversation_seen account flag; the live tutorial-context popups nearby are the working pattern. Review the dormant help text before enabling; it has been dark for years. Tests: EditMode on the once-gate; a manual UI pass.

client Sserver noneimpact answers read forward, help existstests EditMode + UI pass

S7 · Ask Me Again

Tier 1Size SServer: noneverified defect #4624

30 days live: "yes" 37, "ok" 25, all answers to questions the NPC forgot asking

NPC questions expire after seven minutes, and the NPC forgets it ever asked. Players come back from a fight or a bank run, type "yes", and get a dead end: 62 of the last month's misses are exactly this. The fix is small and kind: when an affirmation or a negation arrives with no active question, and the NPC remembers its last one, it asks the question again. No new UI, no new data, one remembered id per conversation, capped at one re-ask so it cannot loop.

Seen in: Ultima IV's yes-and-no questions that stayed live until answered; ELIZA's core trick of restating its own prompt; the interactive-fiction doctrine that a parser reconstructs lost context rather than punishing it.

Implementation notes

Store the last expired query id beside the query state; in DoConversation, before the miss path at :9179, intercept affirmation and negation tokens when no query is active and re-issue the remembered query through the path that presented it originally (#4624). Affirmation vocabulary comes from the query system's own positive and negative variants. Fold the counts into the S1 report to verify the 62 disappear. Tests: EditMode on the intercept decision.

client Sserver noneimpact 62 monthly dead ends become answerstests EditMode

S8 · The Kill-List Burn-Down

Tier 1Size MServer: noneverified defect #4625

592 language-pair suppressions: fr 280, it 198, de 78, es 34, ru 2, pt 0 and likely never scanned

A per-language kill-list forces named conversations to English rather than risk a broken translation, and nobody has burned it down: French players hear English from roughly 160 Ardoris NPCs, and Italian players hear English from about 135 shared archetypes, meaning every generic banker, innkeeper, guard, and The Oracle itself. This card re-runs the localization QA process that generates the list, fixes what it flags, regenerates, and surfaces the per-language count in CI so growth is visible instead of silent. Many entries likely rot from long-fixed translation bugs; the list may shrink dramatically on the first pass.

Seen in: WoW's engine quietly hiding its own flavor text, the cautionary pattern of a game deciding what players do not get to read; this list at least documents its decisions, which is why it can be burned down.

Implementation notes

Data lives per language beside the localization tables; the loader forces English per listed scene-and-NPC pair. Locate or reconstruct the generating script credited in the file header, run per language including pt, triage, fix translations (never the English lines: English text is both the localization key and the voice-clip key), regenerate (#4625). CI reports counts per language and fails on growth. Tests: the loader already has a test pattern; the CI count check is new.

client noneserver noneimpact whole towns return to their languagestests CI count + localization pass

S9 · One Save Per Flag

Tier 1Size SServer: DB ledger, no data impactverified defect #4626

Conversations write flags constantly, and each write currently round-trips the player's entire knowledge document through a full database save. With the memory cards in Tier 3 multiplying flag writes, this write amplification becomes the first real server cost on the page. Switching the update to a targeted per-flag write is behavior-preserving and removes the multiplier before the content that depends on it lands.

Seen in: no genre precedent claimed; this is plumbing. The Animal Crossing lesson applies in spirit: tiny per-record memory is the whole trick, so the writes should be tiny too.

Implementation notes

The server-side flag update does a full-document save today (#4626); replace with a targeted field update, with one careful review of concurrency semantics (per-flag versus per-document last-writer-wins). Server-only, no contract or operation change; the database migration ledger gets its mandatory row marked no data impact in the same commit. Tests: server-side unit on the update path plus a read-back parity check.

client noneserver Sperf large write reductiontests server unit

Tier 2 · On Speaking Terms · seven cards for the forgiving ear

Forty years of parser craft, from Infocom's failure taxonomy to Disco Elysium's failure-as-content, agrees on one thing: the miss message is the whole experience. This tier makes the parser forgiving without making it soft. Everything here is client-local, small to medium, and testable in EditMode.

S10 · Close Enough

Tier 2Size MServer: none

the Oracle's 30-day typo storm: est, tets, tesrt, teswt, tes, tet

The telemetry shows the typo storm plainly: players trying to type a word the Oracle just asked for, one letter off, dead end every time. Edit-distance-one matching, applied only after exact match fails and logged every time it fires, catches nearly all of these without ever overriding an exact keyword. Non-English keywords in the same log (feuer 13, ayuda 6, hilfe 4) stay out of scope here; they are a localization aliasing question, not a typo one. The alternative design, an opt-in autocomplete on the typing line, was considered and set aside: shipping both would trivialize discovery, and fuzzy matching helps every player while autocomplete helps only those who find the option.

Seen in: Ultima IV's four-letter prefix matching, forgiveness by design in 1985; Infocom's parser error correction, widely regarded as the best of its era; the modern doctrine that the parser meets the player halfway.

Implementation notes

ParseKeyword at Conversation.cs:1817 is a pure static unit: after the exact and wildcard passes fail, run bounded edit-distance-one against this NPC's keyword set, minimum keyword length four, tie-break by frequency, emit a fuzzy-hit log line for the S1 report, and never fuzzy-match while a question is active. EditMode tests enumerate the Oracle storm strings. Measure the corpus-wide collision rate against a keyword snapshot before shipping; the threshold claim must be earned, not assumed.

client Mserver noneperf per-miss onlytests EditMode, pure

S11 · A Miss With a Map

Tier 2Size SServer: nonegated on S28

Classic interactive fiction distinguishes three failures: the word is unknown, the answer is refused, and the answer is not available yet, and it holds that conflating them is the cardinal sin. Today all three collapse into one shrug or a bot improvisation. This card makes the honest miss useful: when a keyword misses, the reply names the nearest topic the NPC actually does know, drawn from its own always-listed set so it never leaks gated content. "I could not say. Folk here mostly ask me about the mines." It ships only if the owner rules for honest misses over the default-on bot; with the bot left on, there is nothing for this card to say.

Seen in: Disco Elysium's failure-redirects, failure hands you a different door, never a wall; the Inform community's pattern of naming the exits that do exist; Infocom's vocabulary-miss versus refusal distinction.

Implementation notes

The unknown-response path appends a hint chosen from ungated always-listed topics, nearest by edit distance to the typed word, else the NPC's basics. The 1,049 authored per-NPC fallback lines stay the voice; the hint is a suffix template per archetype. Depends on ruling S28; the hint tier and the generative last resort inside S26 never run on the same NPC. Tests: EditMode on hint selection.

client Sserver noneimpact misses point somewhere realtests EditMode

S12 · The Unrepeated Answer

Tier 2Size SServer: none

4,710 talks carry more than one answer (14.3% of the corpus); the pick among them is uniform random

Thousands of topics carry several authored answers, up to 33 on one Brittany podium, and the pick among them is a fresh uniform roll every time, so players hear the same line twice in a row often enough to notice. Recency-weighted selection, avoiding the last answer or two shown to this player, makes the authored variety that already exists actually land, with zero new content. This is the smallest possible version of the modern selection stack; the full condition-filtered version arrives as the Tier 3 memory cards feed it.

Seen in: Hades' selection architecture, condition-filter then priority-sort then retire, the canonical modern algorithm; RDR2's per-line cooldowns; GW2's long-cooldown ambient scenes.

Implementation notes

ReturnResponseObject at Conversation.cs:4149-4244 is the single chokepoint: within the eligible pass, weight against a short per-conversation ring of recently shown response ids, session-local, optionally cross-session via the response-viewed marks the keyword ring already stores. Tests: EditMode with a seeded RNG over a three-answer talk.

client Sserver noneimpact authored variety finally heardtests EditMode, seeded

S13 · Woof Means Woof

Tier 2Size SServer: nonecontent only

30 days live: Cat 31 attempts, Dog 28; woof 14, meow 12, pet 12, pspspspspsps 1

The Cat and the Dog rank fifth and eighth among all NPCs for attempted conversation, and every attempt dies. Players already want to talk to the animals, and the game already has the voice for it: two thirds of conversation prefabs customize what the NPC calls an unknown player, and the animals say meow, grrr, and whuf. Authored five-keyword micro-sets for ambient animals, woof gets a wag, pet gets a purr, food gets begging, are a trivial content pass with outsized charm.

Seen in: Ultima Online's typed pet-command grammar, a tiny living command language; RDR2's universal greet that works on anything with a pulse; Animal Crossing's whole thesis that tiny interactions carry the relationship.

Implementation notes

Content only: keyword sets plus emote responses in the ambient-animal conversation files; the emote field is already live on 5,191 responses. Typo neighbors (mrow, wuf) arrive free once S10 ships. Tests: corpus lint that the new sets parse; nothing at runtime.

client noneserver noneimpact the cat answerstests corpus lint

S14 · Heard It Already

Tier 2Size MServer: nonecites #4629

The per-player bark memory was built and mothballed years ago: the field, the write site, the 20-minute expiry loop, and the call site all sit commented out in the code, while the line-of-sight check that fed it still computes on every bark for nothing. Reviving it gives barks a per-player heard-history, so the same NPC stops repeating the same line at the same player, which is precisely the discipline Witcher 3 players installed a mod to get. The revival either puts the line-of-sight result back to work or deletes the dead computation; today it is pure waste either way.

Seen in: the Witcher 3 chatter-removal mod, players amputating repetition at AAA scale; RDR2's per-player recently-heard ring; GTA V's pedestrian line-pool cooldowns.

Implementation notes

Uncomment and modernize the five mothballed pieces (field :727, write :2176-2183, re-init :3432, expiry loop :2538-2553, call site :2701); bound the per-NPC list; the dead line-of-sight work is #4629 and gets a customer or a deletion. The sibling 60-second hello memory shipped and is the working pattern. Crowded-town memory cost is the likely reason it was shelved; the cap plus the 30-unit cull keeps it bounded. Tests: EditMode on the expiry math and the cap.

client Mserver noneperf small per-bark listtests EditMode

S15 · Polite Interruptions

Tier 2Size MServer: none

A bundle of small manners for the conversation and bark layer: a walk-away notice that fires when you actually walk away instead of on your next word, the 60-second bark delay tuned so a fresh conversation is not stepped on, the freeze when two players address one NPC fixed, and emotes queued serially so an NPC does not wave and bow in the same instant. Individually none of these earns a card; together they are the difference between staffed and haunted.

Seen in: GW2's ambient playlets, which pause and resume around player interruptions; RDR2's camp chatter that yields to the player and picks the thread back up.

Implementation notes

Walk-away: a distance check in the conversation update against the existing 30-unit cull, with the goodbye delivered through the normal goodbye topics. Bark delay: the cadence bookkeeping at Conversation.cs:2193-2206 respects an in-conversation flag. The two-player freeze needs a first reproduction, which is tester-verify material. Emotes serialize through the existing speech-floor and say seams. Tests: EditMode on cadence math; the rest is a play pass.

client Mserver noneimpact staffed, not hauntedtests EditMode + play pass

S16 · The Quiet List

Tier 2Size SServer: nonerequested by that_shawn_guy

Per-NPC muting shipped and players immediately asked for the next size up: the reports (#4381 to #4387, requested by that_shawn_guy) are seven variations of "let me quiet a kind of NPC, not just this one". Category muting extends the existing right-click mute with archetype entries, town criers, guard patrol lines, vendor hawking, while leaving quest and conversation speech untouched. The mute is a personal client preference; nobody else's town goes quiet.

Seen in: WoW's gossip-suppression addon ecosystem, demand made visible; the Witcher 3 chatter mod again, the same player instinct.

Implementation notes

Extend the per-NPC mute store with category keys on the same per-character preference surface; bark emission checks category before queueing; the archetype taxonomy starts honest and small, three categories, drawn from the shared archetype conversations that already exist (Banker, Guard, Town Crier). A category row joins the existing mute UI. Tests: EditMode on category resolution.

client Sserver noneimpact quiet by kind, not by hunttests EditMode

Tier 3 · The Town That Listens · eleven cards of new capability

The schedule ingredients all shipped and were never connected: 143 closing-time responses wait on a clock that never drives them, 4,988 of 5,093 spawners ignore time of day, and the whole memory kit sits unused for characterization. This tier connects what exists: a clock in the flag grammar, evening rounds, people who remember you, and the first NPCs a town owner can call their own.

S17 · A Clock in the Grammar

Tier 3Size MServer: nonegated on S31

143 off-duty responses across 86 files, authored and waiting; no time token exists in the gate grammar

No time token exists in the conversation gate grammar today; the window math it needs exists in the codebase, but only chests and doors can reach it. This card adds a time window token to the flag grammar, evaluated on each client against the server-synced world clock, so every observer agrees on the answer. The unlock is immediate: 143 responses across 86 files already carry the off-duty marker, closing-time content written in pockets for years and never driven by a clock. "The forge is cold this late. Come back after dawn." becomes authorable the day this lands, and essential services, banks, healers, innkeepers, simply never gate.

Seen in: Ultima V's real-clock schedules, where when you caught an NPC changed what you got; Morrowind's per-entry condition filters; Kingdom Come's timed activity windows; Hades' condition-tagged line eligibility.

Implementation notes

A token branch in the conversation flag evaluator at Conversation.cs:3475, delegating to the existing time-window math (wraparound and morning-evening handling already written) against the server-synced game clock. Deliberately not the off-duty behavior-tree pattern: that flag is set only on the machine that runs the NPC's brain and never replicates, so other players' clients would never see it flip; the token is the consistent path for dialogue. The off-duty response preference is already implemented in the selection pass. Studio gets a token picker. Tests: EditMode on token parse and window math, wraparound included.

client Mserver noneimpact 143 authored lines start workingtests EditMode, pure

S18 · The Evening Rounds

Tier 3Size XLServer: nonegated on S31

of 5,093 dynamic spawners, 4,988 ignore time of day; 14 are day-only, 91 night-only

The world barely uses its own clock. Ultima VII solved daily routines in 1992 with a tiny per-NPC table, and Kingdom Come shipped the same shape in 2018 with about eight timed activities per person. This card is that table for New Britannia: time-windowed waypoint routes plus sitting, eating, and sleeping at the destinations, tavern tables included, run by the machine that already drives each NPC and replicated the way NPC movement already replicates, so every observer watches the same walk. It is the page's largest card, shipped town by town starting with Soltown, quest-critical NPCs exempt, and the availability tax paid in dialogue by S17 and S19 rather than in locked doors.

Seen in: Ultima VII's schedule table, the baker bakes, drinks, and sleeps; Gothic's routines, years before Oblivion; Kingdom Come's eight-block days and its honest wait-by-the-door tax; Skyrim's temper, schedules without autonomy, the right ceiling.

Implementation notes

Movement: time windows on waypoint routes evaluated by the existing day-period condition, driving the existing route walker; this runs on the owning machine only and replicates through the shipped movement stream, so remote consistency is by construction. The known seam is ownership handoff mid-route: the walker's state is local, so the new owner restarts the route; add resume-nearest-scheduled-point on ownership gain. Activities wire the shipped chair and bed behaviors and their 20 animation states, retiring a sitting-conversation TODO dated 2015. Pilot: one town, ten NPCs, then measure. Tests: EditMode on window math and resume-nearest selection; the rest is a town soak.

client XLserver noneperf pathing budget per towntests EditMode + town soak

S19 · Ask About People

Tier 3Size MServer: nonecites #4630

30 days live: "michael" typed 103 times at ten different NPCs in one town, unanswered every time

The single most-typed dead end in the game is one man's name. Players hunt a quest NPC by asking every neighbor, guard and blacksmith included, and nobody in town knows him. The directions system already answers "where is the bank" with 428 place entries across 33 files; this card extends the same convention to townsfolk names, pointing at the person's usual spot today and, once S18 ships, at where they are this hour: "Michael keeps to the north road camp. At this hour try the fire." Whereabouts by the hour and whereis-for-people are one card because they are one mechanism.

Seen in: Ultima IV's cross-NPC breadcrumbing, referral as the quest structure; Ultima VII's town crier; EverQuest's deliberate learn-the-name-from-another-NPC quests.

Implementation notes

Extend the per-scene Directions include convention with person entries; the composed "where is" template already routes through the whereis action. While in the area, replace the hardcoded keyword id 634 filters with a data flag, the magic number breaks silently if the keyword table renumbers (#4630). Content starts in the starter corridor, where 35 percent of all dead ends live. Lint person entries against scene NPC rosters so names cannot go stale. Tests: EditMode on person-entry resolution; corpus lint for orphan names.

client Mserver noneimpact the Michael problem endstests EditMode + lint

S20 · The Innkeeper Remembers

Tier 3Size MServer: nonegated on S30

The memory is already free. A gate on the keyword-ring flag evaluates true for any player who has ever spoken with that NPC, today, with zero code. And the ring already stores your last topic and which answer you saw, surviving relog well enough that its tail is your last subject. This card threads both through the greeting: a stranger hello, a returning hello, and a callback. "Back again. We were speaking of the mines, as I recall." Three archetypes pilot it, innkeeper, banker, guard, before any wide pass. One honest limit is stated on the card: offline mode never saves the ring, so offline players read as strangers.

Seen in: Animal Crossing's villagers commenting on absence and remembering gifts, the highest emotion per byte in games; Hades' met-before greeting tiers; Shadow of Mordor's specific "you again" callouts, simple conversational memory, no nemesis hierarchy claimed.

Implementation notes

The greeting seam is the hello selection at Conversation.cs:4128-4147: hello variants gated on ring presence, callback text keyed off the ring tail and its answer-viewed mark. Chronology on reload is approximate, the tail of the non-basic bucket is the last topic; optionally harden by writing the ring on hello and appending an explicit last-topic field. S9 lands first if callback content multiplies flag writes. Tests: EditMode on ring parse and hello selection.

client Mserver none, flags already writtenimpact regulars greeted like regularstests EditMode

S21 · The Tally Board

Tier 3Size MServer: flag traffic onlygated on S30requested by Takotora

The flag grammar already evaluates numeric comparisons and already expires flags on daily, weekly, and hourly boundaries; nothing uses either for characterization. Visit counters, "Fifth time this week. I should start charging you rent.", are an increment plus a numeric gate. Daily counter-requests are the same counters pointed outward: the fisherman wants five perch today, hands them through the item-exchange transaction conversations already own, and resets at the daily boundary. This is explicitly not a quest: no journal entry, no compass pin, no reward table beyond the NPC's thanks and a small trade. Takotora's daily-crafting-request ask is the pilot.

Seen in: Animal Crossing's villager favors; Kingdom Come's reputation counters read back in shop talk; Ultima IV's bribe-threshold responses, a number gate on a keyword in 1985.

Implementation notes

Counters ride the existing numeric-comparison and suffix-expiry evaluation; increments ride the existing flag actions; the exchange rides the conversation exchange transaction with a daily completion flag. New flag names are free; no scope change, no schema change. Cap one request per NPC per day so a favor never becomes a chore loop. Tests: EditMode on counter gates; the transaction has an existing test surface.

client Mserver flag traffic onlyimpact towns keep small accounts of youtests EditMode

S22 · The Virtue in Your Greeting

Tier 3Size MServer: flag reads onlygated on S30

The game runs an ethics engine nobody talks back to: virtue accumulates, the Oracle judges, and no street NPC ever notices. The reaction hook for it sits unreferenced in the code, the personality analysis still records every player's recommended path, and a corpus of Oracle judgement lines is authored. This card pilots virtue-gated response variants on three archetypes, guard, priest, beggar: the same keyword, a different answer for the compassionate and the cruel, with refusals said out loud rather than gates failing silently. Planescape proved stat-gated dialogue is content players build characters around; Ultima IV proved conversation is where virtue should bite. Three archetypes, then measure.

Seen in: Ultima IV's in-conversation virtue tests, claiming valor costs you; Planescape: Torment's stat-gated dialogue as the reward loop; Baldur's Gate's reputation-flipped greetings.

Implementation notes

Response variants use existing gates on the virtue flags and the recorded path-recommendation flags, selected in the normal response pass; the unreferenced virtue-reaction AI hook wires the reactions section, 56 entries exist, for a visible flinch or bow. Content borrows the authored judgement corpus voice. One verification pass on client-side virtue data freshness first. If the owner rules for a standing number in S30 instead, these gates re-target it unchanged. Tests: EditMode on gate evaluation; content lint.

client S code, M contentserver noneimpact virtue answered in the streettests EditMode + lint

S23 · The Conversations Tab

Tier 3Size MServer: none

Players screenshot NPC dialogue because the game forgets it the moment the window closes. A Conversations tab records transcripts on your own machine: per NPC, per day, searchable, with the keywords you used marked. No server storage, no sync, and the privacy answer is structural: the file never leaves your computer. EverQuest added exactly this in 2007 and called it the NPC Journal; its players had been keeping paper notebooks for eight years.

Seen in: EverQuest's NPC Journal Window, an easy way to store and organize quest dialogue; Morrowind's accumulated topic list as a persistent record; the Ultima VI community engine's running keyword list beside the portrait.

Implementation notes

Hook the existing chat-log file writer where NPC lines land; persist per character using the established per-character preference surface; the tab is a standard window with the owner-and-view split and no state stored on the window itself. Keyword marks reuse the used-keyword check the chat log already performs. A rotation cap, thirty days, bounds disk. Tests: EditMode on the record format; a UI pass.

client Mserver noneperf disk only, cappedtests EditMode + UI pass

S24 · Talk of the Town

Tier 3Size MServer: nonecontent only

the whole world holds 73 NPC-to-NPC lines and 51 replies, pooled in three towns

The NPC-to-NPC machinery shipped and almost nobody used it: 73 opener entries and 51 replies in the entire game, pooled in Kingsport, Braemar, and Ardoris, where Kardan Marbane and Samael run the exemplar comedy act. Guild Wars 2 demonstrated that two-role scripted playlets on long cooldowns are the highest praise-per-line ambient format in MMOs. This is a content pass on an existing system: ten new playlets in the starter corridor, cooldowns long enough that nobody hears one twice in a session, voice pre-generated through the standard pipeline at about a tenth of a cent per clip.

Seen in: GW2's ambient playlets, celebrated by name in community threads; RDR2's camp conversation scenes; the internal exemplar, Kardan and Samael of Ardoris.

Implementation notes

Data only: the opener and reply sections in the bark files, paired by id and key, with chance and delay fields already in the schema and a between-barks cooldown knob already used 91 times corpus-wide. The speech floor already serializes the exchange. Author against the fixed dice from S2. Tests: corpus lint on pair integrity, an opener with no reply partner.

client noneserver noneimpact streets with inner lifetests corpus lint

S25 · A Dot for the Unmet

Tier 3Size SServer: none

The client can already answer "have I ever talked to this NPC" at zero cost: the keyword-ring flag exists if you have, and checking its presence loads nothing. A quiet dot on the nameplate for never-met NPCs gives explorers a reason to work a street without turning the town into a checklist. The honest limit is stated up front: a full "three topics you have not heard" count would force conversation loads for every NPC on screen, so that version waits for a baked topic-count table and is out of scope here.

Seen in: the genre's quest exclamation mark, dialed down to a whisper; Morrowind's topic accumulation as a visible record; this game's own quest visuals, client-local evaluation driving what floats over a head.

Implementation notes

Ring-flag presence drives a new element on the nameplate status model, updated in the same late-update path that already refreshes plates; respect the existing plate suppressions for hidden and decoration NPCs; cap draw distance to conversation range against visual noise. The offline-mode ring gap from S20 applies here too. Tests: EditMode on the presence predicate.

client Sserver noneperf one flag lookup per platetests EditMode

S26 · Follow-Up Topics

Tier 3Size MServer: existing opgated on S33

The disciplined kit that keeps the parser primary wherever the generative system runs. Three rules in one card. First, generated replies emit clickable authored keywords, so every answer hands the player back to the authored graph instead of terminating the breadcrumb chain the way the old chatbot does. Second, anything the model can cause in the world comes from a vetted allowlist of existing client-side conversation verbs, snapshot-tested, because a jailbreak cannot be patched with a better prompt. Third, on designated NPCs only, a parser miss can fall through to the model primed with that NPC's real keyword list, so even the last resort speaks in authored vocabulary. That last mode never coexists with the S11 hint tier on the same NPC.

Seen in: EverQuest's saylinks, the click literally types the word; Ultima VI's highlights as scaffold; the playtest story of a player talking an AI merchant out of a quest key with one sentence, consequences must live outside the model; the first shipped LLM games' bounded designs.

Implementation notes

Keyword emission post-processes generated output through the existing keyword markup renderer, restricted to the NPC's own keyword set. The allowlist is a vetted subset of the client-side action verbs with a snapshot test pinning it; anything outside logs and does nothing, the S5 pattern. The last-resort route sends the miss to the model with the keyword list in the prompt; timeout or moderation trips fall back to the authored unknown line, and the player never sees an error. Tests: EditMode snapshot on the allowlist; the generative runtime model is already a pure testable unit.

client Mserver none newperf per generated turn onlytests EditMode snapshot

S27 · Your Own Townsfolk

Tier 3Size XLServer: contract + exportwishlist 179050, 179344

The longest-standing player-town ask on the wishlist is people: not vendors, townsfolk. This card ships a roster of authored personas, a keeper, a crier, a fisherman, each with a real keyword set and a voice, that owners place like decorations, plus patrol routes laid as deco paths, capped by lot size. No free-text authoring in the first version: personas are authored content, which keeps voice, localization, and moderation costs where they belong. Ultima Online let players set three keyword-and-response pairs on a hired barkeep in 2002 and players still cite it two decades later; the roster model gives more character per NPC at none of the moderation cost.

Seen in: UO's player-hired barkeep with owner-set keyword responses; UO's name-addressed hireling commands; the Ultima IV authoring rubric, two deducible facts per NPC, applied as roster design law.

Implementation notes

New deco archetypes for the roster NPC and route node are a data-contract change with a deploy-coupled export; placement rides existing deco operations; conversation binding maps a roster persona to a conversation prefab on the existing load path. Routes reuse the S18 waypoint machinery and share its one sync verification, ownership handoff included. Six personas at launch, voice pre-generated. Never ships in the same release as the Talking Companion inside S33. Tests: EditMode on route serialization; deco placement has an existing test surface; a town soak.

client XLserver contract + exportperf per-town capstests EditMode + soak

Tier 4 · The Oracle's Table · six rulings

Six decisions only the owner can make, each with the evidence attached. Some are one-flag reversals of deliberate policy, some set the constitution for everything above. None of these are bugs. All of them gate cards in the tiers above, which is why the table comes last and matters most.

S28 · The Last Living Parser

Tier 4RulingServer: nonecites #4628

Every fork of the Ultima line traded discovery for convenience, and this game is the only live commercial MMO still running the trunk. This ruling makes that a stated identity rather than an accident, and settles the bot question that hangs off it: today an old chatbot answers most misses with a plausible non-answer, which sounds responsive but sets no flags, grants nothing, and offers no keywords, so players cannot tell fake depth from real topics. The options: keep the bot default-on everywhere; make the honest miss plus hint the default and keep the bot as per-NPC seasoning where authored; or retire it. Recommendation: the middle. The S1 marker will show exactly how often the bot currently speaks for the game before this ruling is due.

Seen in: the ELIZA effect working against the game, players learning to distrust all answers equally; UO and EQ both letting typing wither for want of scaffolding; the wheel's economics, now inverted by generated voice.

Implementation notes

One default flip, the bot's use-flag becomes per-NPC opt-in, plus S11. No data migration. The evidence instrument is #4628.

client XS once ruledserver noneimpact the identity, statedtests covered by S11

S29 · The Outlander's Voice

Tier 4Ruling, then SServer: none

4,169 name-bearing lines, every one already voiced with the NPC's own word for a stranger

Every voiced line containing your name already has a recorded variant, spoken with the NPC's own term for a stranger: outlander, friend, avatar, 91 distinct terms across 2,086 customized NPCs. When the game knows your real name, it deliberately plays nothing rather than let audio contradict the on-screen text. So the more an NPC knows you, the quieter it gets. The reversal is one flag: play the stranger-term clip and accept that the voice says "outlander" where the text shows your name. Recommendation: reverse it, with a per-player setting for anyone the mismatch bothers. Zero new clips either way.

Seen in: the 2006-era voice-storage objection that made per-variation recording impossible, deleted by generated voice; Kingdom Come's lesson that availability beats fidelity; this game's own corpus, already recorded.

Implementation notes

The skip is a deliberate one-line policy in the voice manager; the pipeline already bakes every name-bearing line with each NPC's own stranger term, and the term is part of the clip key, so the audio exists per NPC. Reverse behind a per-player audio setting: voice speaks your name as the stranger term, or stays silent. Tests: the voice pipeline's name-render tests already cover the clip side; EditMode on the setting branch.

client XSserver noneimpact the quiet lines speak againtests EditMode + existing voice tests

S30 · Affinity or Flags

Tier 4RulingServer: per path

Three cards in Tier 3, the Innkeeper, the Tally Board, and the Virtue greeting, all extend the existing flag store: names are free, counters and expiries already evaluate, nothing new touches the database. The alternative is a real per-NPC or per-town affinity number, Morrowind-disposition style, cleaner to design against but a new data scope with a migration ledger entry and a tuning treadmill. Recommendation: flags and counters now, revisit a number only if the pilot content strains them. The power budget forbids running standing counters in parallel with an affinity number; pick one.

Seen in: Morrowind's disposition and its flattening cost; Baldur's Gate's reputation greetings; Kingdom Come's propagating shop reputation.

Implementation notes

The flags path costs nothing beyond the three cards it gates; all cited mechanisms are live in the flag evaluator today. The number path is a new knowledge field or collection, a ledger row, a migration, and S9 first. Weekly expiry works either way.

client per pathserver per pathimpact the memory model, chosentests per path

S31 · The Client-Side Clock

Tier 4RulingServer: none

The server holds no player positions and conversations resolve on the player's machine, so NPC schedules can never be server-authoritative here without rebuilding the game's spine. The good news is they do not need to be: movement runs on one owning machine and replicates to every observer by construction, and dialogue gates evaluate against the server-synced clock on each client, so everyone sees the same town without the server simulating anyone. This ruling states that ceiling out loud so no future card relitigates it: schedules are believability, never mechanics, and nothing reward-bearing ever keys off an NPC's whereabouts.

Seen in: Ultima VII's deterministic single-player model, the architecture schedules were born in; Oblivion's constraint story, designers need control; GW2's per-map ambient state.

Implementation notes

A documentation ruling. The technical basis was verified for this page: owner-side behavior trees, replicated movement, a server-synced clock, and the off-duty flag's owner-locality, which is exactly why dialogue uses the S17 token and never the behavior-tree flip.

client noneserver noneimpact the ceiling, statedtests none

S32 · The Oracle's Three Doors

Tier 4Ruling, then SServer: none

Every line of the Oracle's old three-destination departure still exists in the data, gated behind a flag that nothing ever sets: a deliberate soft-delete from the era when the three starting paths were consolidated into one. The personality analysis still runs and still records which path it recommended for every player; only the departure is disabled. Re-enabling is defining one flag and QA on three onboarding paths. Retiring is deleting the dead branch and stating that the Isle of Storms sends everyone through Love by design. Either answer is fine; carrying the limbo forever is the only wrong one.

Seen in: Ultima IV's three-principle character creation, the ancestry of the Oracle's questions; the archaeology itself, the flag's own name documents the change.

Implementation notes

The dead branch requires the never-set flag; the live branch prohibits it; the recommendation flags still record each player's analyzed path. Restore is one data line plus onboarding QA per path, and restoring triples the new-player QA surface, so not casually. Retire is stripping the gated rows. Independent of every other card.

client none or Sserver noneimpact the limbo endstests onboarding QA if restored

S33 · The Generative Docket

Tier 4Ruling, then L stagedServer: existing op

A generative NPC system is already built into the game and ships switched off: personas, guardrails, budgets, and a fallback to authored lines when anything goes wrong. The industry record says exactly how far to turn the key. What ships and delights makes the model load-bearing for play but never for canon; costs cap or they spiral; moderation is existential infrastructure; and blanket coverage bores players in a minute while one deep character keeps them for hours. The docket: approve the system on one to five flagged characters, text only, fail-open, per-player daily budget, under the S26 guardrails; sequence the player-placeable Talking Companion behind that retention data, and never in the same release as S27; keep live voice for generated lines deferred, since latency and the clip policy both block it and text turns are the honest first version. Measure before widening. Every time.

Seen in: the first shipped LLM successes, where hallucination is harmless because canon never depends on the model; AI Dungeon's cost and moderation crisis as the pre-mortem; the Skyrim companion mods, one deep character beats a thousand shallow ones; Stanford's generative-agents town, whose architecture is schedules plus memory plus authored personality, mostly precomputable.

Implementation notes

A per-NPC flag flip on the built system, budgets and moderation on the existing operation, no new server surface; S26 ships as the enabling kit; the Companion reuses the moderated player-authored dialogue record per its phase-2 design. A kill switch is part of the docket. Tests: the allowlist snapshot, a budget-cap unit, and a soak on one character on the test shard with tester coverage.

client Mserver inference budgetperf latency per generated turntests snapshot + soak

Considered and rejected

Section 4

The composed conversation

The same window, the same innkeeper, after this catalog ships. Nothing about the frame changed: type anything, click what glows. What changed is that the machine now remembers, consults the clock, admits what it does not know, and points somewhere useful when it misses. Every annotation names the card that pays for it.

The window, composed
Conversation
Innkeeper Abbott: Evening, outlander. Third     (1)
night this week, that earns a warmer bowl. Last
time we spoke of the ferry. Did you find Captain
Kinsey at the north dock?

You: fery
Innkeeper Abbott: The ferry? She runs at       (2)
dawn. And you have never asked after the
manifest, now I think of it.                   (3)

You: where is michael
Innkeeper Abbott: Michael keeps the mill past   (4)
the east bridge. At this hour you will find
him at his supper.

Innkeeper Abbott: I bar the door at nine        (5)
bells. Come morning I will be here scrubbing
pots if you need me.

  [manifest] [Kinsey] [mill] [ferry]         (6)
▲ hide topics

Local: [__________________]  [Vendor] [Goodbye]
Zone anatomy, card by card
  • 1The greeting remembers. Visit counters put a number behind "third night this week" (S21); the keyword ring supplies "last time we spoke of the ferry" (S20); and Kinsey is a planted cross-NPC breadcrumb, the Ultima IV rubric as authoring law.
  • 2The typo survives. "fery" lands one letter off and matches anyway, exact matches always first (S10). The Oracle's typo storm ends the same day.
  • 3The unheard topic steps forward. The NPC volunteers a topic this player has never asked, read from the same ring that greys the used ones (S20). On a true miss this line becomes the hint: nearest known topic, in character, never a smackdown (S11).
  • 4Towns know their people. The directions system that already covers 428 places learns residents, and the schedule answers for the hour (S19, S18). One hundred three "michael" dead ends become one card.
  • 5The clock speaks. A time window inside the flag grammar gates this line on every client from the server-synced clock, identical for every observer (S17), and the 143 closing-time responses already authored finally fire on time.
  • 6The strip earns its order. Unheard topics render bright, used ones grey, answers stop repeating (S12), and long replies open at their start (S6).

Outside the window, the same catalog changes the street. The dot on a nameplate is the cheapest tier of "this NPC has something you have not heard": one flag lookup the client already holds, no conversation load at all.

The street, composed
Soltown, near the well
       Marge the Baker               (1)

  "Mind the mud. The rain has
   made a soup of the square."      (2)

      Bentley          Porto
  "Any word from the bridge,
   Porto?"
  "Only that the toll man is
   in a mood again."                 (3)
Callouts
  • 1The never-met dot. Present only when you have never exchanged a word with this NPC, driven by the absence of the per-NPC ring flag, zero extra load (S25).
  • 2Barks that remember being heard. The mothballed 20-minute per-player bark memory returns, and the line-of-sight check the code still runs on every bark finally has a customer again (S14).
  • 3Playlets, not spam. The NPC-to-NPC channel holds 73 lines in the whole world today; Kardan and Samael's act in Ardoris shows what it can carry. A content pass writes two-hander scenes on long cooldowns (S24).
Section 5

Sequencing

PhaseShipsGate
1 · Truth and repairsS1 through S9; the thirteen tracker issues; the six rulings land on the owner's tablenone: defects and counting, zero design risk. S1's marker starts collecting the bot evidence for S28 immediately; S9 lands before any memory content multiplies flag writes
2 · The forgiving earS10, S12, S13, S14, S15, S16; S11 when S28 rulesall client-local and EditMode-testable; S1's weekly report measures each one's effect on the miss rate
3 · Free memoryS20, S21, S22, S23, S25the S30 ruling, recommendation flags; everything here is flag reads and client UI, and S9 has already landed
4 · Winding the clockS17 first, then S18 piloting in Soltown, S19 in the starter corridor, S24 once schedules put NPCs in rooms togetherthe S31 ruling; the waypoint handoff verification before routes widen; S17 unlocks the 143 authored closing-time responses on day one
5 · Frontier and townsfolkS26 as the enabling kit, S33's rollout per its ruling, then S27; S32 whenever the owner choosesthe S33 ruling; the Companion and S27 never share a release; S27 reuses S18's verified route sync
flowchart LR
  S28[S28 fallback ruling] --> S11[S11 miss with a map]
  S1[S1 dead-end ledger] --> S10[S10 fuzzy tuning]
  S1 --> S19[S19 ask about people]
  S31[S31 clock ruling] --> S17[S17 time token]
  S17 --> S18[S18 evening rounds]
  S18 --> S24[S24 playlets]
  S18 -.shared sync verification.- S27[S27 your own townsfolk]
  S30[S30 memory ruling] --> S20[S20 innkeeper] --> S21[S21 tally board]
  S30 --> S22[S22 virtue greeting]
  S9[S9 one save per flag] --> S20
  S33[S33 generative ruling] --> S26[S26 follow-up topics]
  S11 -. never the same NPC .- S26

The power budget, stated once: fuzzy matching and typer autocomplete never ship together; the hint tier and the generative last resort never run on the same NPC; standing counters never run in parallel with an affinity number; the Talking Companion and placeable townsfolk never share a release; and time-of-day waypoints and player patrol routes share one sync verification rather than two.

Section 6

Appendix

Where the numbers come from, and where each datum lives

DatumWhere it lives, client side
32,973 topics, 42,276 answers, 32,961 keywords, 1,220 questionsper-scene conversation files, 2,302 of them across 148 scene folders, loaded on first talk with an NPC
2,339 barks and the 73 NPC-to-NPC lineseach NPC's companion barks file, 2,303 of them
What you have asked an NPC, and which answer you sawa 40-entry per-NPC ring in the knowledge flag store, written by the client, read today by exactly two cosmetic surfaces
Closing-time content143 off-duty answers across 86 files, authored and waiting
The hourthe server-synced world clock, read client-side, identical for every observer
How an NPC addresses a strangera per-NPC term on all 3,031 conversation prefabs; 2,086 are customized, across 91 values from friend to meow
Voice97,951 pre-generated clips keyed by line text, 8 languages, 140 voices; editing a line orphans its clip and 8 translations, new lines are cheap
Languages that quietly fall back to Englisha per-language suppression report: 592 scene-and-NPC pairs, 280 French including most of Ardoris, 198 Italian including the shared archetypes and The Oracle
Dead endsone log line per parser miss: 2,216 in the thirty days ending August 14, with the class breakdown drawn from a 2,000-line sample, 90 percent of the population
Day and night spawnsa per-spawner field in the scenes: 14 day, 91 night, 4,988 any

Constraints honored

The test surface

Pure unitExists todayWhat the cards pin
Keyword matcheryeswildcard ordering, exact-before-fuzzy, the verb floor
Flag expression parseryescompound always-flag evaluation, the repaired data rows, precedence lint cases
Keyword strip orderingyesunused-first sort, unheard marking
Speech flooryesone speaker at a time under the new playlet load
Generative NPC runtimeyesthe fence, fallback on timeout, the consequence allowlist snapshot
Time-window mathnewwraparound windows, morning and evening edges
Ring parse and roundtripnewtail chronology, the callback greeting's source of truth
Weighted response picknewrecency distribution over the 4,710 multi-answer talks
Edit-distance matchnewdistance one behind exact, never ahead of it, always logged

Sources and credits

Genre systems consulted, with the primary written sources this page leaned on. The lineage: Ultima IV's dialogue and the 1985 NPC authoring sheet; Ultima V's schedules; Ultima VI's highlighted keywords; Ultima VII and the 1991 conversation-functions design document preserved on the Internet Archive; Ultima Online's NPC speech and the 2002 player barkeep; EverQuest's bracket keywords, the 2007 NPC Journal, and saylinks; the Infocom parser tradition and the modern interactive-fiction failure doctrine; ELIZA and the AIML chatbot line; Morrowind's dialogue database. The moderns: the Radiant AI post-mortem record, Kingdom Come's schedule files, RDR2's ambient systems, Guild Wars 2's ambient scenes, the Witcher 3 chatter mod, Animal Crossing's villager memory, Hades' selection architecture, and Disco Elysium on failure. The wave: the Stanford generative-agents paper, the Skyrim companion mods, and the AI Dungeon cost and moderation record. This game's own record: the conversation corpus, the thirty-day live telemetry, the voice pipeline, and the code, verified line by line for this page.

Player credits: the scroll-to-start and deeper-dialogue requests came through the wishlist sweep batch filed as #3208 to #3217; the category muting request is that_shawn_guy's (#4381 to #4387); the daily crafting requests are Takotora's; the placeable town NPC and custom pathing asks are wishlist threads 179050 and 179344. The thirteen defects this audit filed are #4618 through #4630.

Feedback

General comments

No account needed. Every proposal above also has its own Discussion box for talking about that one alone; this thread is for the plan as a whole. Comments are plain text, held to basic decency, and may be trimmed.

← All proposalsWork blog