From duet
Evaluate and improve names in code using naming as a design diagnostic. Use when the user asks to "name this", "rename", "review naming", "what should I call", struggles to name something, or when a code review surfaces vague or misleading names.
npx claudepluginhub tslateman/claude-plugins --plugin duetThis skill uses the workspace's default tool permissions.
Naming difficulty is a design smell. When you struggle to name something, the abstraction is wrong. Use naming as a lens to surface confused boundaries, mixed responsibilities, and domain misunderstanding.
Guides strict Test-Driven Development (TDD): write failing tests first for features, bugfixes, refactors before any production code. Enforces red-green-refactor cycle.
Guides systematic root cause investigation for bugs, test failures, unexpected behavior, performance issues, and build failures before proposing fixes.
Guides A/B test setup with mandatory gates for hypothesis validation, metrics definition, sample size calculation, and execution readiness checks.
Naming difficulty is a design smell. When you struggle to name something, the abstraction is wrong. Use naming as a lens to surface confused boundaries, mixed responsibilities, and domain misunderstanding.
Every name balances four properties. When they conflict, make the tradeoff deliberate.
See references/principles.md for detailed rules and naming smells.
Examine names in recently changed code:
When naming is hard, use the struggle as a diagnostic:
Names that signal design confusion:
| Smell | Example | What it reveals |
|---|---|---|
| Generic verb | handleData, processRequest | Unclear responsibility |
Suffix -Manager, -Helper, -Utils | UserManager, StringHelper | God object or junk drawer |
| And/Or in name | validateAndSave | Two responsibilities |
| Type in name | userList, nameString | Redundant or wrong abstraction level |
| Negated boolean | isNotReady, disableFeature | Double negatives in conditions |
| Abbreviated beyond recognition | usrSvcRsp | Conciseness without understandability |
For public interfaces — APIs, library boundaries, module exports:
check should not modify stateCode names should match how domain experts talk:
For any name under review:
[ ] Specific verb (not handle/process/manage/do)
[ ] No unnecessary words
[ ] Consistent with similar names nearby
[ ] Distinguishable from neighbors
[ ] Matches domain language
[ ] Readable without implementation context
[ ] No embedded type information
[ ] Boolean reads as a question (isReady, hasPermission, canEdit)
When reviewing names:
## Naming Review
### Must Rename
- `processData` → `validateInvoiceLineItems` — "process" hides
the actual responsibility; this only validates
- `handleClick` → `submitPayment` — name the action, not
the event
### Consider Renaming
- `userInfo` → `billingProfile` — more specific to its
actual contents
### Design Concern
- `OrderManager` has 12 methods spanning validation,
persistence, and notification. The naming struggle
reflects three responsibilities that should be separate
types.
| Before | After | Why |
|---|---|---|
processData(input) | validateInvoiceLineItems(invoice) | "Process" hides responsibility; name the action and the domain |
handleClick() | submitPayment() | Name the business action, not the DOM event |
doStuff(items) | deduplicateContacts(contacts) | Eliminate weasel verbs; name what it actually does |
run() | pollForStatusUpdates() | Ambiguous in any class with more than one operation |
| Before | After | Why |
|---|---|---|
data | unpaidInvoices | Generic noun → specific domain concept |
temp | unsavedDraft | Reveals intent; "temp" says nothing about lifecycle |
flag | requiresApproval | Reads as a question; boolean purpose is clear |
result | validationErrors | Names the content, not the role in the function |
list | activeSubscriptions | Type-in-name smell; name the contents instead |
| Before | After | Why |
|---|---|---|
UserManager | UserRepository + UserNotifier | -Manager reveals multiple responsibilities; split them |
StringHelper | SlugFormatter | -Helper is a junk drawer; name the actual capability |
DataService | InventoryClient | Two generic words; name the domain and the role |
utils/misc.ts | pricing/discount-rules.ts | File path is a name too; make it navigable |
| Before | After | Why |
|---|---|---|
isNotReady | isReady (invert usage) | Avoid double negatives in conditionals |
disableFeature | featureEnabled (invert usage) | Positive form reads naturally in if statements |
check | hasPermission | "Check" doesn't say what the answer means |
"Use definite, specific, concrete language." The prose skill teaches this for English. Apply it identically to code:
| Vague | Specific |
|---|---|
getData | fetchUserProfile |
item | cartLineItem |
result | validationErrors |
info | shippingAddress |
temp | unsavedDraft |
/design — Hard-to-name things signal design problems/review — Code review surfaces naming issues; naming review deepens code review/prose — Strunk's rules apply to code names identically to English proseskills/FRAMEWORKS.md — Full framework index