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:
Create new skills, modify and improve existing skills, and measure skill performance. Use when users want to create a skill from scratch, edit, or optimize an existing skill, run evals to test a skill, benchmark skill performance with variance analysis, or optimize a skill's description for better triggering accuracy.
Access NCBI GEO for gene expression/genomics data. Search/download microarray and RNA-seq datasets (GSE, GSM, GPL), retrieve SOFT/Matrix files, for transcriptomics and expression analysis.
Bayesian modeling with PyMC. Build hierarchical models, MCMC (NUTS), variational inference, LOO/WAIC comparison, posterior checks, for probabilistic programming and inference.
Multi-objective optimization framework. NSGA-II, NSGA-III, MOEA/D, Pareto fronts, constraint handling, benchmarks (ZDT, DTLZ), for engineering design and optimization problems.
Statistical modeling toolkit. OLS, GLM, logistic, ARIMA, time series, hypothesis tests, diagnostics, AIC/BIC, for rigorous statistical inference and econometric analysis.
Add unsigned integer (uint) type support to PyTorch operators by updating AT_DISPATCH macros. Use when adding support for uint16, uint32, uint64 types to operators, kernels, or when user mentions enabling unsigned types, barebones unsigned types, or uint support.
Convert PyTorch AT_DISPATCH macros to AT_DISPATCH_V2 format in ATen C++ code. Use when porting AT_DISPATCH_ALL_TYPES_AND*, AT_DISPATCH_FLOATING_TYPES*, or other dispatch macros to the new v2 API. For ATen kernel files, CUDA kernels, and native operator implementations.
Write docstrings for PyTorch functions and methods following PyTorch conventions. Use when writing or updating docstrings in PyTorch code.
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.