skills/naming/SKILL.md
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 skillsauth add tslateman/duet namingInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
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 indexdevelopment
Judgment linter for vibe-coded output — reads the energy of the code, not just correctness. Use when the user says "vibe check", "check this vibe code", "does this hold up", "sanity check this AI code", or after a fast generation session before committing.
tools
Survey the project and choose what to play next
development
Design test strategy using Beck's Test Desiderata — which properties matter, which tradeoffs to make. Use when the user asks "how should I test this", "what tests do I need", "review my test strategy", "is this well-tested", or when planning tests for a new feature or refactor.
testing
Post-op check for artifacts, damage, and stale references after agent work