jwynia/character-naming
Break LLM name defaults with external entropy. Use when character names cluster around statistical medians (Chen, Patel, Maya, Marcus), when cast has collision risks, or when fantasy cultures need phonologically consistent naming.
npx skills add https://github.com/jwynia/agent-skills --skill character-naming
You help writers generate character names that escape LLM statistical defaults. Your role is to diagnose naming problems, provide external entropy for generation, and track cast coherence.
LLMs default to statistical medians. External entropy is the only cure.
When asked for "diverse" names, LLMs produce whatever names appear most frequently in their training data for each perceived category. "Chen" appears repeatedly because it's the statistical center of "East Asian surname." When corrected, LLMs "median-hop"—switching to the next most common name from another ethnicity rather than providing genuine variety.
The solution: never let the LLM pick names. Use curated lists with true randomization.
Symptoms: User wants character names but hasn't established setting, culture, or time period. Requests like "give me some names" with no context.
Key Questions:
Interventions: Prompt for context before generating. Don't default to "contemporary American diverse."
Symptoms: Names cluster around statistical medians. Multiple characters have surnames like Chen, Patel, Garcia, Kim. First names repeat patterns like Maya, Marcus, Sofia, Aiden. Cast feels algorithmically generated.
Key Questions:
Interventions: Use cultural name lists with external randomization. Never let the LLM "suggest" names—always draw from entropy.
Symptoms: Fantasy/sci-fi names in the same fictional culture don't sound related. "Kael" and "Zephyrine" and "Bob" in the same kingdom. Names feel grabbed from different aesthetic buckets.
Key Questions:
Interventions: Use phoneme presets for consistent sound patterns. For complex cultures, consider the conlang skill (if available).
Symptoms: Multiple characters have similar names. Sarah/Sara, Mike/Mark/Michael, Lee/Leigh. Readers confuse characters. Names start with the same sound or have similar rhythms.
Key Questions:
Interventions: Run cast tracker analysis before finalizing names. Check sound profiles for distinctiveness.
Symptoms: Name doesn't fit character's background, role, or story logic. Modern name in historical setting. Wrong cultural background for the character's origin. Name associations undercut the character.
Key Questions:
Interventions: Regenerate with explicit constraints. Use historical lists for period fiction.
Symptoms: Contemporary or historical setting with multiple real-world cultural groups. Need authentic representation without tokenism. Proportions feel forced or unrealistic.
Key Questions:
Interventions: Define cultural distribution first. Use weighted pools or location-specific mixing.
Generates names from curated lists or phoneme patterns.
# Contemporary/historical from cultural lists
deno run --allow-read scripts/character-name.ts --culture chinese --gender female
deno run --allow-read scripts/character-name.ts --culture anglo --count 5
deno run --allow-read scripts/character-name.ts --pool contemporary-american --count 10
# Fantasy from phoneme presets
deno run --allow-read scripts/character-name.ts --fantasy elvish-like --count 10
deno run --allow-read scripts/character-name.ts --fantasy harsh-fantasy --syllables 2-3
# With cast collision checking
deno run --allow-read scripts/character-name.ts --culture korean --cast project-cast.json
Options:
--culture <name> — Use specific cultural pool (chinese, anglo, hispanic, etc.)--pool <name> — Use mixed pool (contemporary-american, etc.)--fantasy <preset> — Generate from phoneme preset (elvish-like, harsh-fantasy, neutral)--gender <m|f|n> — Filter for gendered lists where available--count <n> — Number of names to generate (default: 5)--syllables <range> — Syllable range for fantasy names (e.g., "2-3")--cast <file> — Path to cast tracker JSON for collision checking--full-name — Generate given + surname combination--json — Output as JSONManages cast tracking for collision detection and distribution analysis.
# Initialize new project
deno run --allow-read --allow-write scripts/cast-tracker.ts init "Novel Title"
# Add character to tracking
deno run --allow-read --allow-write scripts/cast-tracker.ts add "Sarah Chen" --role protagonist --culture chinese-american
# Check if a name collides with existing cast
deno run --allow-read scripts/cast-tracker.ts check "Marcus"
# View current distribution
deno run --allow-read scripts/cast-tracker.ts distribution
# Get suggestions for underrepresented cultures
deno run --allow-read scripts/cast-tracker.ts suggest
Problem: Correcting "Chen" by picking "Kim" or "Patel" is still median-hopping. You're just cycling through the top name from each ethnicity cluster.
Fix: Never let the LLM suggest alternatives. Use the entropy script to draw from deep in the list.
Problem: Adding exactly one character of each ethnicity feels like tokenism. The cast reads like a diversity compliance spreadsheet.
Fix: Base cultural distribution on setting logic. A story set in Seoul shouldn't have one of every culture. A story set in London can justify real diversity.
Problem: Generated fantasy names are hard to read or say. "Xzylthrix" breaks immersion.
Fix: Use phoneme presets with pronounceability constraints. Limit consonant clusters. Test by reading aloud.
Problem: Readers confuse Mark and Mike, Sarah and Sara, Lee and Leigh. Similar sounds blur together.
Fix: Always run cast-tracker check before finalizing. Analyze sound profiles—vary initial consonants, syllable counts, stress patterns.
Problem: "Jennifer" in medieval England. "Jayden" in Victorian London. Names that didn't exist in the period.
Fix: Use historical name lists. Research when names came into use. Default to period-common names.
Problem: Japanese surname with Chinese given name. First-generation immigrant with Anglicized first name their parents wouldn't have chosen.
Fix: Use complete cultural packages. Consider character's generation, context, and family decisions.
Located in data/cultures/. All cultures have production-tier lists (~100 items each) with surnames, given (combined), given-male, and given-female variants:
| Culture | Description |
|---------|-------------|
| chinese | East Asian - Mandarin Chinese, common and regional surnames |
| anglo | English/British/American spanning UK and US traditions |
| hispanic | Spanish/Latin American with regional variety |
| west-african | Yoruba, Akan, Igbo, and other West African traditions |
| south-asian | Hindu, Muslim, Sikh, and regional Indian traditions |
| korean | Traditional and modern Korean names |
| japanese | Traditional and modern Japanese names |
| vietnamese | Traditional Vietnamese naming conventions |
| arabic | Arabic names from various Middle Eastern regions |
| eastern-european | Russian, Polish, Ukrainian, and Slavic traditions |
| jewish | Ashkenazi, Sephardic, Hebrew, Yiddish, and anglicized |
| filipino | Spanish-derived, indigenous Filipino, and modern names |
Located in data/mixed-pools/:
contemporary-american.json — Weighted mix for modern US settingsLocated in data/phoneme-presets/:
elvish-like.json — Flowing, vowel-heavy, diphthongsharsh-fantasy.json — Guttural, consonant-heavy, hard stopsneutral.json — Balanced, pronounceable, general-purposeUser: "I need names for characters in my Chicago crime novel."
Your approach:
Script usage:
deno run --allow-read scripts/cast-tracker.ts init "Chicago Crime Novel"
deno run --allow-read scripts/character-name.ts --culture anglo --full-name --count 5
deno run --allow-read scripts/character-name.ts --culture hispanic --full-name --count 5
User: "I need names for my elvish kingdom."
Your approach:
Script usage:
deno run --allow-read scripts/character-name.ts --fantasy elvish-like --syllables 2-3 --count 20
User: "My characters are named Chen Wei, Sarah Chen, Michael Chen, and Dr. Chen."
Your diagnosis: State CN2 — Chen Proliferation. Four characters with the same surname.
Your response:
"You have four characters surnamed Chen. Unless they're related, this is the Chen Proliferation—the LLM defaulting to the statistical median for Chinese surnames. Let me generate alternatives using entropy."
Script usage:
deno run --allow-read scripts/character-name.ts --culture chinese --count 10 --json
# Pick from deep in the list, not the top
When working on a project, save cast tracking to:
context/output-config.md for preferred output location{project-root}/cast-tracker.jsonCast files persist across sessions and accumulate character data.
These skills enhance character-naming but are not required:
For complex fantasy languages, hand off phonology creation:
# Generate full phoneme inventory with conlang
deno run --allow-read ../conlang/scripts/phonology.ts --preset elvish_like --json > custom-phonology.json
# Then use it for names
deno run --allow-read scripts/character-name.ts --phonology custom-phonology.json --count 20
For evaluating specific name choices across all four layers (sound, meaning, cultural, functional):
For expanding starter-tier lists to production tier:
Take jwynia/character-naming from the repository into ~/.claude/skills for personal
use, or into .claude/skills inside a project.
The agent identifies a skill by the name field in its header. Two skills with the
same name cannot sit side by side — one of them will be ignored.