Even after the anti-rut arc work, every campaign was still drifting
toward the same handful of fantasy names — Aldric Voss, Mira, Vera
Blackwater, Tilde Barren — because Claude has hot-path defaults for
naming that don't really respond to context. This adds a phonotactic
name generator and wires the seeder, planner, and DM to use it for
every named entity instead of typing names directly.
The new module (src/storied/names/) is self-contained and designed
to be lifted out into a standalone package later — there's an
AGENTS.md plus an AST-scan test that fails the build if anything in
storied.names imports from elsewhere in storied. README.md inside
the module covers attribution and design history; the architecture
owes a substantial debt to William Annis's Lexifer, the conlang
community's (C)V(C) template tradition, and standard phonological
machinery (sonority sequencing, Zipfian/Gusein-Zade frequency).
Cultures are forged per-campaign, not pre-built. The forge picks a
random hand-encoded inventory inspired by a real language family
(Welsh, Old Norse, Quechuan, etc. — about 25 of them), trims and
re-weights it, picks syllable templates and morphology pools, then
runs the assembled engine to generate the culture's *own* self-name
as its first emission. That self-name becomes the file id and the
canonical reference. Each campaign gets its own 4-8 cultures during
seeding and they never collide across campaigns.
Cultures are first-class world entities — they live alongside npcs
and locations, get indexed into the search.db with content_type=
cultures, and are discoverable via the existing recall tool. The
phonotactic profile lives next to the entity as a sibling YAML file
the engine reads when generating names.
Two MCP tools wired through tools/names.py: forge_culture and
generate_names, both visible to dm/seeder/planner. The arc_architect
intentionally doesn't get them — its surface stays at commit_arc +
recall. The seeder prompt now requires generate_names for every
named entity ("never type a fantasy name yourself"), and the DM and
planner prompts cover the same rule for new entities created during
play or enrichment.
PHOIBLE is the obvious next data source if we want richer or more
authentic inventories — flagged as the v0.2 plan in the README, not
part of v0.1. The current 25 hand-encoded inventories are tuned by
ear for fantasy output and they work; we can swap in real PHOIBLE
data once we've watched the generator in actual play.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>