Creates entity model documents with Mermaid.js ER diagrams and attribute tables defining entities, relationships, data types, and validation rules. Use when the user asks to "create an entity model", "design a data model", "draw an ERD", "define database schema", "model entities", or mentions entity-relationship diagram, ER diagram, database design, or data modeling. Also trigger whenever the task is to produce, write, or design an entity model or data model document (e.g. docs/entity_model.md) from a requirements catalog — including phrasings like "data model design", "the team needs an entity model before development", or a request to document entities with attributes, data types, precision, and validation or cross-attribute constraints.
92%
Does it follow best practices?
Run evals on this skill
Adds up to 20 points to the overall score
Passed
No findings from the security scan
The canonical home for this skill is ai-unified-process/aiup-core
Create or update the entity model at docs/entity_model.md based on docs/requirements.md.
The document contains an ER diagram and attribute tables.
# Entity Model
## Entity Relationship Diagram
```mermaid
erDiagram
ROOM_TYPE ||--o{ ROOM : "categorizes"
GUEST ||--o{ RESERVATION : "makes"One sentence describing the entity.
| Attribute | Description | Data Type | Length/Precision | Validation Rules |
|---|---|---|---|---|
| id | ... | Long | 19 | Primary Key, Sequence |
| ... | ... | ... | ... | ... |
Every entity MUST have:
### ROOM_TYPE — never ### Room Type or ## Entity: Room Type)Defines categories of rooms with shared characteristics.
| Attribute | Description | Data Type | Length/Precision | Validation Rules |
|---|---|---|---|---|
| id | Unique identifier | Long | 19 | Primary Key, Sequence |
| name | Name of the room type | String | 50 | Not Null, Unique |
| description | Detailed description | String | 500 | Optional |
| capacity | Maximum number of guests | Integer | 10 | Not Null, Min: 1, Max: 10 |
| price | Price per night in CHF | Decimal | 10,2 | Not Null, Min: 0 |
ENTITY_A ||--o{ ENTITY_B : "relationship"The Data Type column must use exactly these values — never SQL or ORM types such as VARCHAR, TEXT, CHAR, bigint, numeric, serial, smallint, UUID, Timestamp, or Enum:
| Data Type | Length/Precision | Usage |
|---|---|---|
| Long | 19 | IDs, foreign keys |
| String | varies (50-500) | Text fields |
| Integer | 10 | Whole numbers |
| Decimal | 10,2 | Currency, percentages |
| Boolean | 1 | True/false flags |
| Date | - | Date only |
| DateTime | - | Date and time |
The Length/Precision column holds the bare value (e.g. 10,2) — never a type
expression like DECIMAL(10,2).
The seven types are the complete list. Binary content (a document, an image) has no type of its own: it is a
String with - as Length/Precision and a Description that begins with Binary content: (Binary content: the signed contract as PDF); its Validation Rules are Not Null or Optional as for any field. The migration
skill of every stack maps exactly that combination to a binary column, and the persistence code follows the column.
Compose every Validation Rules cell from this vocabulary, using the exact wording — never a prose description, and never an empty cell, dash, or "N/A":
Keys — a key column takes exactly one of these values:
| Attribute Type | Validation Rules Value |
|---|---|
| Primary key | Primary Key, Sequence |
| Natural or composite key | Primary Key |
| Composite key and foreign key | Primary Key, Foreign Key (TABLE.id) |
Every other attribute — one nullability rule first, then any of the following rules that apply, in this order:
| Position | Rule | Meaning |
|---|---|---|
| 1 | Not Null or Optional | Required or optional; always present, always first |
| 2 | Unique | No two rows share the value (an optional value: no two non-empty ones) |
| 3 | Foreign Key (TABLE.id) | References another entity, or an external entity named under the title |
| 4 | Min: X, Max: Y | Range of a number, or of a date as ISO dates; always both bounds |
| 4 | Values: A, B, C | A fixed set of values; instead of a range, never together with one |
| 5 | Format: <format> | The value follows a format: Email, Phone (international, E.164), URL |
| Attribute Type | Validation Rules Value |
|---|---|
| Required field | Not Null |
| Optional field | Optional |
| Unique field | Not Null, Unique |
| Foreign key | Not Null, Foreign Key (TABLE.id) |
| One-to-one link | Not Null, Unique, Foreign Key (TABLE.id) |
| With range | Not Null, Min: X, Max: Y |
| With values | Not Null, Values: A, B, C |
| Not Null, Format: Email | |
| Unique email | Not Null, Unique, Format: Email |
| Optional phone number | Optional, Format: Phone |
Examples: an email attribute is Not Null, Format: Email — never "must be a valid
email address"; an email address no two members share is Not Null, Unique, Format: Email. A status attribute with a fixed set of states is
Not Null, Values: Pending, Active, Completed, Cancelled — never "must be one of
Pending, Active, Completed, Cancelled".
The vocabulary is closed: a cell holds only the rules above, in the order of the Position column, each
at most once, and nothing else — no prose, no rule of your own (Format: Swiss postal code is invalid; a format
the list lacks is a #### Constraints bullet). Never write Min: without its matching Max: (Not Null, Min: 0
alone is invalid — use Not Null, Min: 0, Max: <upper bound> or just Not Null), and never combine Values: with
a range.
The same tables are available in references/REFERENCE.md. The path is relative to the folder containing this SKILL.md, not to the project root.
If validation spans multiple columns, add a #### Constraints heading below the entity's
attribute table and list each constraint as a bullet, one rule per bullet:
#### Constraints
- Check-out date must be after check-in date.
- The number of guests must not exceed the room type's capacity.Never write the constraints as a bold **Constraints:** line or as an extra table row, and
omit the heading when the entity has no multi-column constraint.
Uniqueness of a single attribute belongs in its cell (Not Null, Unique, Foreign Key (APP_USER.id) for a
one-to-one link); uniqueness of a combination of attributes is a bullet
(- A member borrows a book at most once per day (member_id, book_id, borrowed_on are unique together).).
A foreign key may point at a table the model does not own — an identity table the starter project ships, a table
of another system. Such an entity gets no ### section and no line in the Mermaid diagram. Write its cell as
usual (Not Null, Foreign Key (APP_USER.id)) and name it once, in one sentence under the document title:
APP_USER (id, username, password_hash, role) ships with the project and is an external boundary.
A large project may hold its entity model split by module, as /reverse-engineer writes it: docs/entity_model.md
holds only a ## Modules table (Module | Description | Entities | Depends on, each module linked to its file), and
each module has its own document docs/entity_model/<slug>.md in the structure above — # Entity Model: <Module>,
a sentence on the module, its own Mermaid diagram, an optional From other modules: ENTITY (Module), ... line, and
the ### sections of the entities it owns. The slug is the module name in lowercase kebab-case, the same as the
module's folder under docs/use_cases/. Keep that structure when you update the model:
Entities cell of the ## Modules
table. When no module fits or two fit equally, ask the user; a new module gets a row and a file.### section exactly once, in one module file. A module's diagram holds every relationship
line of its own entities, including those to entities of other modules; list each such entity in the
From other modules: line, and the module it lives in in the Depends on cell.docs/entity_model.md itself, and do
not introduce modules in a model that has none. Splitting is /reverse-engineer's step; for a forward-engineered
model that has outgrown one diagram, tell the user.docs/open-questions.md on entities (Entity: BOOK, Entity: BOOK.isbn), follow the section
"In the Clarify Step of a Specification Skill" of /open-questions — locate it with a glob for
**/*open-questions/SKILL.md; the folder may carry a host prefix such as tessl__open-questions.#### Constraints heading with a bullet list if needed### with the name in UPPERCASE#### Constraints bullet list below the tableFrom other modules: line, and the ## Modules table links every module fileAI-Unified-Process/marketplace
f3ed052
Canonical home
since Aug 8, 2026
If you maintain this skill, you can claim it as your own. Once claimed, you can manage eval scenarios, bundle related skills, attach documentation or rules, and ensure cross-agent compatibility.