--- name: domain-modeling description: Clarify domain vocabulary, ownership and invariants using the consuming project's existing glossary and ADR conventions; draft changes only when authorized. --- # Domain Modeling Actively build and sharpen the project's domain model as you design. This is the *active* discipline: challenging terms, inventing edge-case scenarios, and writing the glossary and decisions down the moment they crystallise. (Merely *reading* `GLOSSARY.md` for vocabulary is not this skill: that's a one-line habit any skill can do. This skill is for when you're changing the model, not just consuming it.) Use the consuming project's existing glossary, bounded-context map and ADR locations/status conventions before these illustrative layouts. Read-only analysis proposes changes without writing files. Unresolved proposals are not accepted decisions; update records only within the authorized task. An accepted ADR records a decision, not completed implementation, deployment or verification. Where the trade-off needs it, record source/evidence gaps, rollback and revisit conditions as optional consequences; behavioral contracts remain in project specs rather than a second ADR specification. ## File structure Most repos have a single context: ``` / ├── GLOSSARY.md ├── docs/ │ └── adr/ │ ├── 0001-event-sourced-orders.md │ └── 0002-postgres-for-write-model.md └── src/ ``` If a `GLOSSARY-MAP.md` exists at the root, the repo has multiple contexts. The map points to where each one lives: ``` / ├── GLOSSARY-MAP.md ├── docs/ │ └── adr/ ← system-wide decisions ├── src/ │ ├── ordering/ │ │ ├── GLOSSARY.md │ │ └── docs/adr/ ← context-specific decisions │ └── billing/ │ ├── GLOSSARY.md │ └── docs/adr/ ``` Create files lazily only when authorized and needed. Reuse existing project locations; in read-only work report proposed terms/ADRs without creating or editing files. ## During the session ### Challenge against the glossary When the user uses a term that conflicts with the existing language in `GLOSSARY.md`, call it out immediately. "Your glossary defines 'cancellation' as X, but you seem to mean Y. Which is it?" ### Sharpen fuzzy language When the user uses vague or overloaded terms, propose a precise canonical term. "You're saying 'account': do you mean the Customer or the User? Those are different things." ### Discuss concrete scenarios When domain relationships are being discussed, stress-test them with specific scenarios. Invent scenarios that probe edge cases and force the user to be precise about the boundaries between concepts. ### Cross-reference with code When the user states how something works, check whether the code agrees. If you find a contradiction, surface it: "Your code cancels entire Orders, but you just said partial cancellation is possible. Which is right?" ### Update GLOSSARY.md inline When a term is resolved and writing is authorized, update the existing project glossary; otherwise report the proposed change. Keep proposed and accepted terminology/decisions distinct. Use the format in [GLOSSARY-FORMAT.md](GLOSSARY-FORMAT.md). `GLOSSARY.md` should be totally devoid of implementation details. Do not treat `GLOSSARY.md` as a spec, a scratch pad, or a repository for implementation decisions. It is a glossary and nothing else. ### Offer ADRs sparingly Only offer to create an ADR when all three are true: 1. **Hard to reverse**: the cost of changing your mind later is meaningful 2. **Surprising without context**: a future reader will wonder "why did they do it this way?" 3. **The result of a real trade-off**: there were genuine alternatives and you picked one for specific reasons If any of the three is missing, skip the ADR. Use the format in [ADR-FORMAT.md](ADR-FORMAT.md).