A 600-page RDBMS textbook turned into five triggerable Claude skills. The first real output of the new distilling-skill. Two things under review: (a) the skill family itself, and (b) how the distillation process performed.
Layer 1 — the skill family. Michael Hernandez’s Database Design for Mere Mortals (4th ed, ~600 pages) is the clearest practitioner guide for designing a relational database from scratch. It is RDBMS-agnostic, method-driven, and full of worked examples and tacit judgment calls that are exactly what a skill should transmit. The result is five skills covering: designing from a blank page, normalizing tables and fields without jargon, connecting tables with the right relationship type, encoding business rules as constraints, and auditing an existing schema for design smells.
Layer 2 — the distilling-skill process. This is the distilling-skill’s first real run on a full-length source. That skill is a meta-skill: it takes a book, paper, or method and turns it into a faithful, triggerable skill draft, preserving the tacit moves and filtering out the scaffolding. The evaluation section below reports what the process got right and where it needs guardrails.
Intended scope: The family is general-purpose and RDBMS-agnostic. A Claude agent working in any SQL project should be able to trigger it. It is not a WordSense-specific artifact.
Purpose: Turn a domain into a sound relational schema via a seven-phase process. Owns the first two phases (mission statement + analysis) and dispatches Phases 3–7 to the sibling skills.
Triggers: “design a database for X”, “what tables do I need for this domain”, “model this domain”, refining or replacing an existing schema.
Key tacit move: The source says “interview users and management” at every phase. The skill replaces that with two agent-native moves: inspect the artifacts (existing schema, sample data, API payloads, source code, forms, reports) and route to the user only what the artifacts cannot answer (real business policy and priorities). An agent has better access to sample data than the book’s reader ever did — this makes the method stronger, not weaker.
Purpose: Decide what tables and fields a schema needs, refine fields into atomic single-purpose columns, choose primary keys — covertly normalizing toward 3NF without ever invoking normal-form jargon.
Triggers: “is this field atomic / should I split it”, “what’s the primary key”, turning sample data or an API payload into table structures.
Key tacit move: Three field anomalies, three different fixes — the discrimination novices miss. Multipart (one value packing distinct items, like “Kira Bently”) → deconstruct into new fields, same table. Multivalued (same kind repeated, like “DTP, SS, WP”) → move to its own table. Calculated (derived from other fields) → remove entirely; recompute at read time. Same fat-field symptom, opposite fixes.
Inst Name = “Kira Bently” → Inst First Name + Inst Last Name. Also Instrument ID = “GUIT2201” — packs category and number into one string you’ll parse forever.Categories Taught = “DTP, SS, WP”, or Instrument 1 / Instrument 2 / Instrument 3 — fixed slots are the same smell in a costume.Purpose: Decide how tables relate (1:1, 1:M, M:M), place the foreign key on the correct side, resolve every many-to-many into a linking table, and set deletion rules and participation characteristics.
Triggers: “how do these tables relate”, “do I need a junction table”, “where does the foreign key go”, “what delete behavior should this have”.
Key tacit move: Read every relationship from both directions, then combine. 1:N from one side and 1:N from the other = genuine M:M, always resolved by a linking table. The trap: a relationship that sounds like M:M from one direction is sometimes 1:M when you flip it. The combining formula makes the decision mechanical (1:N + 1:1 = 1:N; 1:N + 1:N = M:N). Cardinality is about records, not real-world concepts.
StudentClasses(student_id, class_id).Purpose: Turn an organization’s stated limitations into concrete database constraints, decide when a finite-domain field needs a validation (lookup) table, and run the final four-level data-integrity review as the design capstone.
Triggers: “what constraints / business rules apply here”, “do I need a lookup table”, “is this schema’s integrity sound”, CHECK / NOT NULL / enum / FK-domain decisions.
Key tacit move: Diagnose CATEGORY before touching anything. Ask one question: is the limit on a VALUE, or on a COUNT of records? If it constrains one field’s allowed value → field-specific → modify the field specification. If it limits how many records can interrelate → relationship-specific → modify the participation degree. The trap: a rule that names two fields in the same sentence can still be field-specific.
Purpose: Audit an existing schema for design smells. Recognize the three bad-design archetypes, name each defect against the Ideal Table/Field rubric, and judge when breaking a design rule may be legitimate — with mandatory documentation.
Triggers: “review this schema”, “is this table design sound”, “why is this query painful”, “can I denormalize here”, “audit my database”.
Key tacit move: Name the archetype before enumerating symptoms. Most bad schemas are one archetype in different clothes: (1) flat-file god-table — everything crammed into one table; (2) spreadsheet design — columns-as-values like Jan/Feb/Mar, or fixed slots like Phone1/Phone2/Phone3; (3) design driven by the software, ORM, or screen rather than the data’s shape. Naming the archetype focuses the fix and prevents symptom-chasing. This skill is the most agent-native in the family: an agent can inspect the live schema and sample rows; a human reviewer can only guess.
phone_1, phone_2, phone_3 — fixed slots that cap how many phones a person can have. Same for jan_sales, feb_sales, mar_sales — adding April means a schema migration, not a new row.users table with display name, locale, timezone, and 15 other single-valued characteristics of one subject. Wide is not wrong. The smell is repetition and values-as-columns, not column count.
Result: near-perfect convergence. The agent reproduced the book’s answer without access to the book. Below is the comparison. All six checks passed on the first run.
mcp__supabase__list_tables, COMMENT ON COLUMN framed as “our convention”, ADR references, and even L1/L2 vocabulary leaked into the skills. A scrub pass was needed at integration.db-mmortals- prefix was agreed before the arms started. The extraction-factory section of the skill should state this explicitly: “orchestrator assigns exact skill names before fan-out; arms cite a frozen set. Fix the sibling-name contract up front.”web/.claude/skills/?distilling-skill SKILL.md itself, not the db-mmortals family. Can be done in parallel with landing the family, or after.db-mmortals- prefix to signal the source: db-mmortals-design, db-mmortals-tables-fields, db-mmortals-relationships, db-mmortals-business-rules, db-mmortals-review. Phase ownership and scope boundaries are encoded in each skill’s description field. If any split feels wrong, this is the review round to say so — names and scope boundaries are much cheaper to change before landing than after.