From solopreneur
Generates product or company names via structured brief, multi-model candidate generation, two-layer evaluation. Supports greenfield and rebrand modes. Outputs docs/naming/ Markdown files with taxonomy and test kit.
npx claudepluginhub hanamizuki/solopreneur --plugin neo4j-devThis skill uses the workspace's default tool permissions.
A structured workflow for naming one product, one company, or one brand
Generates evocative, category-defining brand, company, and product names using Igor methodology. Use when naming companies, products, features, or apps.
Brainstorms 5 unique product names with rationales on brand alignment, audience appeal, memorability, and domain/trademark availability. Use for new products, rebrands, or name ideation.
Guides indie founders through startup brand strategy: name generation and evaluation, positioning, voice definition, and visual identity using Hexa's bottom-up framework.
Share bugs, ideas, or general feedback.
A structured workflow for naming one product, one company, or one brand where product and company share the same name. Uses multi-model ensemble (Claude + optional Codex / Gemini) to generate diverse candidates, filters through a two-layer rubric (Gate + Score), tests with real humans, and produces a finalist.
references/out-of-scope.md.5 Markdown files in {repo}/docs/naming/ plus a state file and test kit:
docs/naming/
├── naming-state.yaml # Session state (internal)
├── 01-brief.md # Benefit ladder, personality, constraints
├── 02-namescape.md # Competitive naming map + no-go zones
├── 03-candidates.md # All candidates grouped by taxonomy + source model
├── 04-evaluation.md # Gate survivors + score rubric
├── test-kit.md # Phase 5 tension test materials (printable)
├── 05-decision.md # Final choice, rationale, limitations, announcement
└── .raw/ # Raw model outputs + briefs (per-session, timestamped)
Document schemas — see references/templates.md for the full markdown
template of each output file. Every phase output must match the template
so outputs are consistent across sessions and can be audited or diffed.
Full definitions and examples: references/taxonomy.md. Phases 2 and 3
both depend on this list:
Phase 2 uses it to classify competitors. Phase 3 uses it as the generation
palette. Always load references/taxonomy.md before either phase runs.
The state file can only be created after the user tells us whether this is a greenfield or a rebrand. Order of operations on first run:
mode from the Starting Context answer: A or B → greenfield,
C → rebrand.docs/naming/naming-state.yaml with:
mode: derived from step 3entity_scope: from step 2 answeroverall_status: matching the mode (brief for greenfield,
rebrand_audit for rebrand)
Do not hard-code any of these before the user answers.docs/gtm/gtm-state.yaml (see GTM Integration).What's your situation?
- A) I have an idea but no code yet.
- B) I have code (or a working product) but no name — or just a placeholder.
- C) I have code and a name, but I want to consider a rebrand.
mode: greenfield, skip codebase scan, go to Phase 1.mode: greenfield, light codebase scan (README, package.json,
top-level dirs) to pre-fill product description, then Phase 1.mode: rebrand, run Phase 0 first.What are you naming?
- product — one specific product. Company already has a name.
- company — the company / parent brand. Products stay separate.
- both_same_name — company and flagship product share a single name (e.g., Notion, Linear, Figma). Treated as one naming exercise.
Record the answer in entity_scope. This shapes Phase 1 brief framing
(company-level mission/vision vs product-level feature focus) and Phase 6
Final Selection deliverables.
| Mode | Trigger |
|---|---|
| Greenfield | First run, user answered A or B |
| Rebrand | First run, user answered C |
| Resume | State file exists with overall_status not complete / ended_no_change |
After the Starting Context answer, create docs/naming/naming-state.yaml:
project: {repo name}
repo_path: {absolute path}
created: {YYYY-MM-DD}
last_updated: {YYYY-MM-DD}
mode: {greenfield|rebrand} # derived from Starting Context
entity_scope: product # product | company | both_same_name
starting_context: B # A | B | C
has_gtm_docs: false
# Top-level enum — must be exactly one of:
# rebrand_audit | brief | namescape | generate | evaluate | tension_test |
# decision | complete | ended_no_change
#
# Initial value depends on mode:
# - greenfield → overall_status: brief
# - rebrand → overall_status: rebrand_audit (Phase 0 must run first)
overall_status: brief # or rebrand_audit when mode: rebrand
# Available model ensemble for Phase 3 generation (filled after detection)
models_available:
claude: true
codex: false
gemini: false
models_selected: [claude] # user's choice from available models
candidates_per_model: 100 # user-tunable
phases:
rebrand_audit: # only in rebrand mode
status: pending
triggers_confirmed: []
decision: null # keep | change
brief:
status: pending
namescape:
status: pending
generate:
status: pending
candidate_count: 0
by_model: {} # claude: 100, codex: 100, ...
evaluate:
status: pending
gate_survivors: 0
scored: 0
tension_test:
status: pending # pending | kit_ready | awaiting_user_results | complete | skipped_low_sample
tester_count: 0
decision:
status: pending
findings:
benefit_ladder: {} # feature / functional / emotional / ultimate
ultimate_concept: "" # 1-2 word creative springboard
personality: {}
constraints: {}
competitors: []
no_go_patterns: []
winner: ""
disputes: [] # any user disagreement; see Dispute Handling
# Fallback flags — any "unverified" entry bubbles up to 05-decision.md Limitations
unverified:
trademark: []
domain: []
handles: []
cross_cultural: []
Naming note: the top-level field is overall_status; per-phase status
fields (e.g. phases.tension_test.status) share the simpler name status
because they live under their phase namespace. Read/write consistently.
overall_status MUST be advanced at each phase boundary. If a run pauses
between phases, overall_status is what Resume mode reads to pick up at
the right place. Leaving it stale corrupts Resume.
| Leaving phase | New overall_status |
|---|---|
| Rebrand audit → keep | ended_no_change (terminal) |
| Rebrand audit → change | brief |
| Phase 1 Brief | namescape |
| Phase 2 Namescape | generate |
| Phase 3 Generate | evaluate |
| Phase 4 Evaluate | tension_test |
| Phase 5 Tension Test | decision |
| Phase 6 Decision | complete |
Each phase section below repeats its specific transition for in-context reference. This table is the authoritative contract.
At the start of every session:
naming-state.yaml.After each meaningful exchange:
findings and phase status.last_updated.references/templates.md.When the user re-runs phase N, everything downstream is stale. Before executing, the skill MUST:
phases.{N+1..}.status: pending and zero their counters..vN.md for that phase file and archive to .v(N+1).md
(e.g. if 03-candidates.v1.md and 03-candidates.v2.md exist,
archive current to 03-candidates.v3.md). Never silently overwrite.git rev-parse --is-inside-work-tree succeeds), check git status
for the file. If it has uncommitted changes, warn the user and ask
whether to commit or discard before proceeding. In non-git
projects, skip the git check and instead ask the user directly:
"The current 0N-*.md will be archived as .v(N+1).md. Any unsaved
edits? Confirm proceed."findings keys owned by downstream phases.Dirty state at decision time is a failure mode — not a feature.
After the state file is created, check for {repo}/docs/gtm/gtm-state.yaml.
Do not trust file existence alone — check the state file for
status: complete.
If gtm-state.yaml exists AND status: complete:
01-brand-strategy.md → Mission, Values, Personality, Positioning02-market-landscape.md → ICP archetypes, competitors, JTBD03-messaging-framework.md → Voice, tone, content pillarshas_gtm_docs: true.If gtm-state.yaml is missing, incomplete, or unreadable:
Before any naming work, decide if renaming is actually the right move. Default answer is no — brand equity is expensive to rebuild.
Present these 4 triggers. Ask the user which apply:
Decision rule:
overall_status: ended_no_change. Write summary to 01-brief.md.
Skill ends cleanly.disputes and proceed.overall_status: brief.Record the triggers and decision in phases.rebrand_audit. On
overall_status: ended_no_change, naming-state.yaml is preserved so the
user can re-enter later by manually setting overall_status: brief.
One question at a time. Skip overlapping questions if GTM docs are loaded.
Climb feature → functional → emotional → ultimate. This produces the creative springboard — 1-2 words the entire generation phase pivots on.
Push once if the user stops at feature level:
"That's what it does. How does it make them feel after they use it — not in marketing words, in their own words?"
Example (project management tool):
"Clarity" gives 100× more creative fuel than "project management."
.com? Or .io / .ai / .co acceptable?Distill to 1–2 words. Write into findings.ultimate_concept.
Output: 01-brief.md (see templates). Advance state:
overall_status: namescape.
has_gtm_docs: true): reuse competitor list from
02-market-landscape.md.references/taxonomy.md). This step runs regardless of GTM state —
GTM does not produce taxonomy classifications.If the user disagrees with a taxonomy classification, record in
disputes and accept the user's classification. Agent taxonomy is
advisory.
Output: 02-namescape.md. Advance state:
overall_status: generate.
Divergent creativity benefits from model diversity. Different models have different priors for "good name."
Run these availability probes, then (separately) auth probes:
# Codex CLI — availability
command -v codex && codex --version
# Gemini CLI — availability
command -v gemini && gemini --version
Availability check answers "is the binary installed and runnable?" If that passes, try a cheap authenticated smoke test (e.g. a trivial prompt with a 1-token max output, or the vendor's recommended auth-check command). If the smoke test fails, report the specific reason and instruct the user:
codex login."Populate models_available.{claude,codex,gemini} based on the combined
availability + auth result. Claude is always true.
I detected the following models: [list]. Pick generation ensemble:
- Claude only (~100 candidates) — fastest, lower diversity
- Claude + 1 other (~200 candidates) — recommended baseline
- All three (~300 candidates) — maximum diversity
You can also pick a custom model set.
Record in models_selected. Default candidates_per_model: 100
(user-tunable).
All selected models receive the same full brief. Diversity comes from
model priors, not from forced taxonomy assignments. Each model generates
candidates_per_model candidates across whichever taxonomy types it
considers fit for the brief.
The brief (markdown). All placeholder paths are relative to
naming-state.yaml — use the full dotted path when substituting.
Ultimate concept: {findings.ultimate_concept}
Personality axes: {findings.personality}
Target markets: {findings.constraints.markets}
Syllable preference: {findings.constraints.syllable_preference}
No-go patterns (skip these): {findings.no_go_patterns}
Taxonomy palette: see references/taxonomy.md (11 types)
Target count: {candidates_per_model}
Never string-interpolate the brief into a shell command. The brief
contains free-form user text and would be a command-injection vector.
Always write the brief to a file first with the Write tool, then pass it
to the external CLI via stdin heredoc or (if supported) a --file flag.
TS=$(date +%Y%m%dT%H%M%S)..raw/ directory exists before any writes:
mkdir -p docs/naming/.raw. On first run the project may only have
naming-state.yaml; without this step the brief write and CLI stdout
redirect both fail with "No such file or directory".docs/naming/.raw/brief-${TS}.md using the Write
tool — not via shell echo/cat <<EOF. Use ${TS} throughout —
the Write path MUST match the read paths in Step 4.--skip-git-repo-check. Detect:
git rev-parse --is-inside-work-tree 2>/dev/null — falsy means add
the flag.# Detect git workspace once
git rev-parse --is-inside-work-tree >/dev/null 2>&1 && CODEX_GIT_FLAG="" \
|| CODEX_GIT_FLAG="--skip-git-repo-check"
# Codex — read brief from file via stdin
codex exec $CODEX_GIT_FLAG - < docs/naming/.raw/brief-${TS}.md \
> docs/naming/.raw/codex-${TS}.txt
CODEX_EXIT=$?
# Gemini — read brief from file via stdin
gemini -m "gemini-3-pro-preview" < docs/naming/.raw/brief-${TS}.md \
> docs/naming/.raw/gemini-${TS}.txt
GEMINI_EXIT=$?
Claude (the skill executor) generates in-session against the same brief.
External CLIs fail for many reasons (rate limit, auth expiry, network, model outage). Never silently proceed on failure. After each invocation, in this order:
wc -l. The brief instructs models to output one candidate per
line (see Step 3 brief template), but tolerate the common
alternatives: strip bullets/numbering, split on commas inside a
wrapped paragraph, merge multi-line bullets. Require at least
candidates_per_model * 0.5 parsed candidates (e.g., 100
requested → 50 minimum, 30 requested → 15 minimum). Fewer than
that → truncation or error response.models_selected by removing the failed
model; (b) notify the user explicitly with the reason; (c) ask
whether to retry, drop the model, or abort Phase 3. Do not merge the
failed model's output into 03-candidates.md.Claude reads all successful outputs and dedupes. Dedupe rules:
Apply in order — first rule that matches wins:
04-evaluation.md for human review.Write 03-candidates.md grouped by taxonomy type. Each entry records its
source model so later analysis can see which model tends to win.
During generation, do not self-judge. LLM-failure-mode penalties (generic suffixes, stitched portmanteaus, etc.) are applied in Phase 4 Gate — not here. This preserves the approximate-thinking zone.
Use these angles when generating:
Output: 03-candidates.md. Advance state:
overall_status: evaluate.
Cut any candidate that fails. No scoring — pass or cut.
| Gate | Rule |
|---|---|
| Pronounceability | Say the name aloud 3 times. If it still stumbles, cut. |
| Spelling-on-hearing | Can you spell it after hearing once? If not, cut. |
| Competitor echo | Sounds similar to a direct competitor? Cut. |
| Literal description | Just names the function? Cut (unless brief required descriptive). |
| Cross-cultural red flag (quick pass) | Quick LLM-based check across Spanish, French, Chinese, German, Japanese. LLM knowledge is unreliable here — mark unverified liberally rather than cutting. Known case: Mitsubishi Pajero = Spanish slur. ⚠ Urban-legend warning: Chevy Nova → "no va" is documented false (Snopes). Do not cut on superficial syllable overlap. The authoritative cross-cultural check runs at Phase 5 entry via WebSearch. |
| Core domain unavailable | If brief requires .com and no reasonable modifier works, cut. Otherwise flag unverified and keep. |
| Trademark knockout | USPTO Public Search for exact matches and confusing similarity in target class. If you lack tooling to query, mark unverified and keep. |
LLM-failure-mode auto-penalties (cut at Gate):
| Failure mode | Signal |
|---|---|
| Too generic | Uses overused stems: Hub, Flow, Sync, Verse, Lab, Stack, Box, ly-suffix |
| Too stitched | Obvious portmanteau seams (InnoLyze, TechVerse, AIify) |
| Sound-deaf | Phonetic profile contradicts brand intent |
| Over-invented | Random consonant soup with no semantic hook |
| Trend-chasing | Copies a pattern peaking now (every 2026 AI startup ending in .ai) |
| Culture-blind | Cross-cultural gate was skipped without unverified flag |
Expected survivors: 30–50 out of 100–300.
Score each gate survivor 1–10 on each dimension × weight:
| Dimension | Weight | Definition |
|---|---|---|
| Strategy fit | 25 | Connects to positioning + ultimate benefit |
| Memorability / fluency | 20 | Easy to say, spell, recall (Alter & Oppenheimer 2006; Lewis & Frank 2016) |
| Sound symbolism fit | 15 | Phonetic profile matches desired perception (Klink 2000) |
| Extensibility | 15 | Survives future pivots + line extensions |
| Ownability | 10 | Trademark + domain + handle realistically achievable |
| Cross-cultural portability | 10 | No obvious landmines in target markets |
| Aesthetic / vibe | 5 | "Do I want to say this every day?" |
Weight rationale: Strategy fit and memorability dominate because those are the hardest dimensions to retrofit after launch — you can re-skin aesthetics and chase ownability with modifiers, but a name that doesn't connect to positioning or that people can't remember is a permanent tax. Aesthetic sits lowest because personal taste is the least predictive signal for market success. If your category has different priors (e.g. consumer fashion where aesthetic is load-bearing), adjust the weights and record the deviation.
100–300 candidates
→ Gate filter → 30–50 survivors
→ Score (weighted 100 pt) → rank all survivors
→ Take top 15 → user picks 10 for tension test
Output only: top 15 scored, user picks 10 to advance. The winner is NOT selected in this phase — that happens in Phase 6 after the tension test.
Output: 04-evaluation.md — full rubric for top 15, shortlist of 10 for
tension testing. Advance state: overall_status: tension_test.
Skill cannot execute this — it requires real humans reacting cold. Skill produces a test kit, pauses, and interprets returns.
Before emitting the test kit, for each of the top 10–15 survivors from the Score rubric, run WebSearch for:
{name} meaning in {language} for each target market language.{name} slang {language} for each target market language.This is the authoritative cross-cultural check. Phase 4's Gate pass was
LLM-knowledge-only and deliberately conservative; this step catches things
like regional slang, cultural associations, and trademark collisions the
LLM did not know. Only names that come back clean (or clean-with-context)
proceed to the tension test. Flagged names move to unverified.cross_cultural
or are cut here depending on severity.
Do NOT run this search on all 30–50 gate survivors — it's expensive and unnecessary before the Score filter narrows the field.
test-kit.md)Set phases.tension_test.status: awaiting_user_results. This phase can
pause for days or weeks.
| Pattern | Interpretation | Action |
|---|---|---|
| Half love, half hate | Tension zone — energy is real | SHORTLIST |
| Uniform "yeah it's fine" | Invisible zone | CUT |
| Uniform negative | Dead on arrival | CUT |
| Imagined as wrong category | Category mismatch | CUT |
| Imagined as correct category + positive feeling | Strong candidate | SHORTLIST |
| Nobody remembers next day | Fails memorability | CUT |
When patterns conflict, use this precedence:
Phase 5 is done when either:
tester_count ≥ 3 AND the user confirms no more responses are
coming.Never auto-advance based on tester count alone. Waiting is the default; the user decides when to close the window.
If only 3 testers responded and user closes: set
phases.tension_test.status: complete with tester_count: 3 and note in
Limitations. Weight tension test signals less heavily in final decision.
If fewer than 3: set phases.tension_test.status: skipped_low_sample.
Final decision proceeds on Score rubric alone, with explicit "not
validated with users" warning in 05-decision.md.
Narrow to top 3 finalists. Advance state:
overall_status: decision.
For each of the top 3:
.com, then .co / .io / .ai, then
modifiers (get{name}.com, {name}hq.com, {name}app.com).
⚠ .io faces long-term uncertainty. The UK announced in October
2024 the transfer of Chagos Islands sovereignty to Mauritius, which
could eventually trigger ISO 3166-1 removal of the BIOT code and
ICANN's ccTLD retirement policy. As of ICANN's November 2024 blog, IO
still persists in ISO 3166-1 — no immediate action required, but watch
the space before committing .io as primary.Any field that can't be verified → mark unverified and bubble to
Limitations.
The winner is NOT the highest average. A balanced 7-across-the-board name is the invisible zone — safe, forgettable, friction.
The winner meets ALL three criteria:
Exception — skipped_low_sample runs: when Phase 5 was skipped
because fewer than 3 testers responded, criterion 3 cannot be evaluated.
Waive it and decide on criteria 1 + 2 alone, but explicitly add
"Not validated with users — tension zone unverified" to the
05-decision.md Limitations block so the user treats the pick as
provisional.
If no candidate meets all three (or both, in the low-sample case), present the closest matches and escalate to the user — do not silently pick the highest total. Remarkable beats balanced (Placek / Andy Grove on Pentium).
Present the 3 finalists. User picks. Skill produces 05-decision.md:
unverified field with
explicit instruction: "Before filing trademark / launching, do X."references/rebrand-announcement.md for the three-stage rollout
playbook and equity-preservation guidance by company stage.Update state: overall_status: complete.
This skill is an accelerant, not a replacement for professional services. Be explicit with the user about what it does NOT do:
Every unverified field in state must appear in 05-decision.md
Limitations with a clear "you need to X before doing Y" instruction.
Users can disagree with agent judgment at any phase. The skill must:
disputes[] with phase, topic, agent position,
user position.05-decision.md under a "Decisions you
overrode" section, so future rebrand audits have the history.Common dispute points:
references/templates.md — per-phase markdown schemas.references/taxonomy.md — 11 naming taxonomy types (used by Phase 2 + 3).references/methodology.md — practitioners, books, and research behind
the rubric.references/out-of-scope.md — multi-product brand architecture pointers.references/rebrand-announcement.md — three-stage rollout + equity
preservation by company stage (rebrand mode only).