Localized names in PvZ conversations
The real Qwen Plantern sample recorded in the game worktree at output/visible-threats/plant-question-proximity.json mixed “Zombies” into a Chinese reply. Its observed lawn and character fields supplied English names regardless of the requested language.
Dave's classic lawn context, both Dave enemy-position paths, all four classic plant conversations, ordinary authored plant identities and revealed Garden plants now use the requested en/zh/es display names. Native IDs, positions, counts, legal actions and stored conversation records are unchanged. Unrevealed Garden sprouts and the source story's special borrowed/modified identities keep their existing disclosure rules. English Almanac flavor remains the recovered character reference; this change does not claim a newly translated Almanac.
packages/server/scripts/import-pvz-observation-names.mjs <portable-game-root> imports 49 plant and 33 zombie labels using native definition keys and existing wasm/locales/shared.json / versus.json. The generated file records source hashes. Existing English labels are preserved. Six native hybrid zombies reuse the generic ZOMBIE string key; their distinct names are composed from the actual translated plant species. The red-eyed Gargantuar retains its distinguishing qualifier. They are never flattened into ordinary zombies. The full catalog is not sent to a model: only currently observed/revealed identities are named.
The live follow-up also exposed a repetitive instruction to answer other-lane questions with “cannot point there without moving.” That sentence is removed; the existing no-movement rule and actual observation context remain. Plantern can report an observed enemy without suggesting it can walk or rotate lanes.
Five regression cases fail on the former English-only paths and pass with this change. They exercise actual assembled prompts for Dave, classic plants, authored plants and Garden, plus Spanish, unchanged English, hybrid identities and hidden sprouts. The full 469 isolated NPC/route checks pass. Local build, typecheck and OSS verification logs use output-observation-names-*.
Two named real providers were sampled once per EN/ZH case using captured current compiled-game observations and the production service with a synthetic account. output/visible-threats/observation-names.json records the initial follow-up; observation-names-clean.json records the candidate after removing that repeated movement explanation. Both final Chinese answers use Chinese names, both English answers identify the near-house Conehead, and all four decisions remain null. No account settings, player saves, notebooks or Yumina billing rows were written. These are real upstream provider calls, not signed-in user-configuration checks.
The final Qwen English answer invents a precise fog boundary at column 3 that the request does not establish. This remains an open writing-quality gap, not a passing claim. No replies were resampled without a recorded source change and no failing sample was deleted. A localized name does not guarantee grounded prose.
Publication is pending. This is a host-only change; the current public game 69da0f96fc, its assets and compatibility admission do not require replacement.
