db-naming
Audit naming conventions — inconsistent table/column casing and pluralization, ambiguous or reserved-word identifiers, untyped/opaque columns, inconsistent FK and boolean naming, and identifiers that fight the engine's case-folding rules. Module M7. Feeds the Design & Integrity score (Naming categor
Install
mkdir -p .claude/skills/db-naming && curl -L -o skill.zip "https://agentskills.codes/api/skills/download/16436" && unzip -o skill.zip -d .claude/skills/db-naming && rm skill.zipInstalls to .claude/skills/db-naming
Activation
This is the description your AI agent reads to decide when to run this skill — the better it matches your request, the more reliably it fires.
Audit naming conventions — inconsistent table/column casing and pluralization, ambiguous or reserved-word identifiers, untyped/opaque columns, inconsistent FK and boolean naming, and identifiers that fight the engine's case-folding rules. Module M7. Feeds the Design & Integrity score (Naming category, low weight).About this skill
db-naming (M7)
Naming is the schema's documentation: consistent, predictable identifiers make joins obvious and reduce the quoting/casing bugs that creep in across ORMs and engines. It is low-weight (Naming category, design axis) — real but never the headline. This module is design-axis and never caps.
What it checks
- Casing / pluralization consistency: a mix of
snake_caseandcamelCase, or singular and plural table names (user,orders,OrderItem) in one schema — pick one and hold it. - Reserved words & case-folding traps: identifiers that are SQL reserved words (
user,order,group,select) or that rely on case ("User"quoted) — Postgres folds unquoted to lowercase, MySQL is filesystem/case-config dependent; mixed quoting causes "relation does not exist" bugs. - FK naming: FK columns not following a predictable
<referenced>_idpattern, so joins aren't self-evident. - Boolean naming: booleans not prefixed
is_/has_/can_, or negative names (not_active) that invert logic. - Opaque / ambiguous names:
data,info,value,flag,temp,col1, abbreviations without a glossary, or timestamps not suffixed_at.
Axis & severity
- Axis: design; magnitude almost always low, banded honestly.
- Reserved-word unquoted identifier that breaks across engines: severity 2–3,
warn. - Schema-wide casing/pluralization inconsistency: severity 2,
warn,fixable: proposed(rename is high-blast-radius — neverauto). - Opaque column name / missing
_atsuffix: severity 1,warn. - M7 never caps any score; it is the smallest-weight design category.
Tier-0 static check
Parse DDL/snapshot via scripts/parse-schema.mjs: tally identifier casing styles and table pluralization; match identifiers against a reserved-word list per engine; check FK columns against the <table>_id pattern; flag boolean columns without is_/has_/can_ and opaque names. This is fully static and directional.
Tier-1 verification query
Confirm live identifier inventory and quoting:
-- $DATABASE_URL, read-only
SELECT table_name, column_name FROM information_schema.columns
WHERE table_schema NOT IN ('pg_catalog','information_schema')
ORDER BY table_name; -- inspect casing/plurality/reserved words across the real catalog
Findings
Emit per schema/finding.schema.json. Examples:
M7.schema.mixed_casing— schema mixessnake_caseandcamelCaseidentifiers (severity 2,warn, axisdesign,fixable: proposed).M7.user.reserved_word_table— table nameduserrequires quoting and breaks unquoted refs (severity 2,warn, axisdesign).M7.accounts.active_boolean_unprefixed— booleanactivenot namedis_active(severity 1,warn). Each finding:evidence.observedquotes the identifier(s) verbatim;verification.reproduceis the runnable query above (method: ddl_parse/schema_introspect);expected_impactis banded (typicallylow) + confidencedirectionalwith rationale.
Honesty
- Naming findings are advisory polish — never let them dominate the report or imply a functional defect.
- Renames are destructive and break app code/migrations; recommendations are
proposed/advisory, neverauto. - Reserved-word and case-folding behaviour is engine-specific; scope each finding to the detected engine rather than asserting a universal rule.