Skip to content
Agentmart
Submit a tool

concrete-naming

Naming and comment conventions that keep code readable without a change log baked into it — subject-first names for data (itemsCharged not chargedItems)…

Skill by JoseArron

IndexedMIT★ 2
Write a review

Install

Works with Claude Code, Claude apps, Codex, Cursor, Gemini CLI, GitHub Copilot, VS Code, OpenCode, Goose, Windsurf. Read the repository before you give any tool access to your data.

npx agentmarket install skill/josearron-concrete-naming

Asks which of your tools to add it to (Claude Code, Codex, Cursor, VS Code, Windsurf, Gemini CLI, Claude Desktop) and shows the change first. See https://agentmart.dev/cli.

Get the weekly diff

The weekly diff: one email a week with new agent tools, notable updates and grade changes, plus security alerts for tools you follow. Double opt-in, one-click unsubscribe.

We use your email only for this newsletter. Privacy

About

Naming and comment conventions that keep code readable without a change log baked into it — subject-first names for data (itemsCharged not chargedItems), verb-first names for actions (validateChargeOnInvoice not check), full domain terms instead of abbreviations or metaphors (PaymentTransactionLogService not PaymentJournalService), and comments that describe current behavior or business rules only — never git history, rename rationale, process notes, or which tool wrote the code. Use when naming a new type, class, method, or variable, when renaming something for clarity, when reviewing or writing code comments, when a teammate's edit reveals a naming pattern worth generalizing across a file, or when asked to "clean up naming," "make this read better," "why comment it that way," or "these names feel inconsistent."

Use cases: data, writing, productivity

No reviews yet. Installed it? Reviews come from verified installers only. How reviews work

Permissions

What this skill can do and what it asks for, from its SKILL.md. Checked Oct 25, 2026.

Tools
No tools found
Secrets
None asked for
Install scripts
None found

Network hosts it talks to 1

  • codeload.github.com · found in install command

Files it touches

  • ~/.claude/skills/concrete-naming

What's inside

Skill name
concrete-naming
Description
Naming and comment conventions that keep code readable without a change log baked into it — subject-first names for data (itemsCharged not chargedItems), verb-first names for actions (validateChargeOnInvoice not check), full domain terms instead of abbreviations or metaphors (PaymentTransactionLogService not PaymentJournalService), and comments that describe current behavior or business rules only — never git history, rename rationale, process notes, or which tool wrote the code. Use when naming a new type, class, method, or variable, when renaming something for clarity, when reviewing or writing code comments, when a teammate's edit reveals a naming pattern worth generalizing across a file, or when asked to "clean up naming," "make this read better," "why comment it that way," or "these names feel inconsistent."
License
MIT
Instructions
134 lines in SKILL.md · view on GitHub

Files (1)

  • SKILL.md

SKILL.md (first lines)

# Concrete Naming

Every name and every comment should point at something real and current: a
domain noun, a business rule, a fact that is true right now. Not at process
(how the code got written), not at history (what it replaced), not at a
vague abstraction that could mean anything.

That splits into three habits: order data names subject-first, order action
names verb-first, and keep comments in the present tense.

## 1. Data: subject first, qualifier second

Types, classes, and variables name a *thing*. Lead with the concrete noun —
the entity or subject — then attach the qualifier (state, role, relation)
after it. Reading left to right should answer "what is this" before "what
happened to it" or "what kind of role does it play."

| Weak (qualifier first) | Strong (subject first) | Why |
|---|---|---|
| `chargedItems`, `refundedItems` | `itemsCharged`, `itemsRefunded` | Reads like a report column ("Items Charged: 4"), not an adjective-noun phrase |
| `PaymentJournalService` | `PaymentTransactionLogService` | Names the entity it operates on, not a metaphor for what that entity is |
| `LoadedInvoiceRecord` | `InvoiceRecordPopulated` | Entity first; "populated" is a state suffix, not a prefix modifier |
| `ChargeInputValidator` | `PaymentChargeValidator` | Uses the real entity name (`PaymentCharge`) that the rest of the codebase already uses, not a shorthand invented for this one class |

This is not "always reverse the word order" — it's "put the noun the reader
is scanning for at the front." A file full of `PaymentTransactionLog*` names
sorts and scans together; a file mixing `LoadedX`, `XPopulated`, `PendingX`,
`XPending` makes the reader hold every naming scheme in their head at once.

## 2. Actions: verb first, reads like a command

Methods and functions *do* something. Lead with the verb, in the imperative,
and let the rest of the name finish the sentence a caller would say out loud.
A terse or generic verb forces the reader to open the function body to find
out what it actually checks or returns — a fuller name answers that at the
call site.

| Weak | Strong | Why |
|---|---|---|
| `check(invoice, charges)` | `validateChargesOnInvoice(invoice, charges)` | Says what's being validated and against what, not just "some check happens" |
| `totalsFor(invoiceIds)` | `getTotalsPerInvoice(invoiceIds)` | "get" + noun + grouping reads as a full sentence fragment |
| `paymentTotalsFromEntries(entries)` | `getTotalsFromEntries(entries)` | This is a derivation, not a stored thing — verb-first matches its sibling `getTotalsPerInvoice` instead of looking like an unrelated naming scheme |

Data types are nouns because they sit still. Functions are verbs because
they act. Naming a function like a noun (`paymentTotalsFromEntries`) makes it
look like a value you could store, when it's actually a step you run.

## 3. Comments: what's true now, not how it got that way

A comment earns its place by telling the reader something the code can't say
on its own: a business rule, an invariant, a deliberately deferred decision,
or a concrete example that resolves an ambiguity. It loses its place the
moment it starts narrating the code's history instead of its present.

**Cut on sight** — anything that only makes sense to someone who was in the
room when the change was made:

```
// tx is no longer passed as a param since we now rely on AsyncLocalStorage
// per the transaction-scope design review
```
```
// renamed from PaymentJournalService — "journal" wasn't in our domain vocabulary
```
```
// switched from a manual date check to date-fns per the discussion in review
```

None of that is wrong, exactly — it's just misfiled. It belongs in the
commit message or the pull request description, which are append-only and
built for exactly this. A code comment lives inside the file it describes and
gets read by everyone who opens that file forever after; a rename's
rationale read by someone six months later, after three more renames, is not
information, it's noise that outlived its relevance. If the *why* still
matters architecturally, write it once in a design doc and let the comment
point at a stable business rule instead of the doc's history.

**Keep, because these describe a present, load-bearing fact:**

```
// a customer can't be charged twice for the same line item on one invoice
```
```
// for now the ceiling is billed + requested <= authorized;
// revisit once partial authorization ships
```
```
// rejects duplicate line items like [{sku: 'A', qty: 1}, {sku: 'A', qty: 2}]
// — caller should combine them first
```

The test: delete the comment and read the line cold. If what's missing is a
business rule, an edge case, or a "this is intentionally not the final
formula" flag, put the comment back. If what's missing is a story about the
code's past, leave it out — the diff and the commit message already told
that story, permanently, without rotting.

Once you have decided a comment earns its place, `plain-english` covers how to word it: present
tense, active voice, and the timeless rule that makes a history comment a style violation and not
just a maintenance one.

## Why this is worth the extra few seconds

A qualifier-first name and a subject-first name cost the same number of
characters. The difference only shows up when someone is scanning a file or
autocompleting: `StockMovement*` clusters together, `LoadedX` / `XPopulated`
/ `PendingX` doesn't cluster with anything. A history-comment costs nothing
to write and everything to maintain — it's accurate for exactly as long as
nobody touches the code again, then it silently starts lying. A comment about
a business rule stays true as long as the rule does.

## Self-check

Before committing a name or a comment, ask:

- **Type, class, or variable?** Does the first word answer "what is this,"
  not "what happened to it" or "what state is it in"?
- **Method or function?** Does it start with a verb, and would reading it
  aloud describe what the call site is actually asking for?

From JoseArron/skills, MIT.

More from JoseArron/skills

Signals

Stars
2
Forks
0
Open issues
0
Last commit (this folder)
Sep 25, 2026 (1 month ago)

From GitHub (fetched Oct 24, 2026).

Details

License
MIT
First seen
Oct 24, 2026
Last checked
Oct 24, 2026

More from JoseArron

Cite this page

concrete-naming skill. Agent Mart. https://agentmart.dev/skills/josearron-concrete-naming (last updated 2026-10-24)