一键导入
event-modeling
Designs systems using Event Modeling.
用 Codex 或 Claude 帮你安装 复制这段 Prompt,粘贴到 Codex、Claude 或其他助手里,让它检查 Skill 页面并帮你完成安装。
菜单
Designs systems using Event Modeling.
用 Codex 或 Claude 帮你安装 复制这段 Prompt,粘贴到 Codex、Claude 或其他助手里,让它检查 Skill 页面并帮你完成安装。
基于 SOC 职业分类
Nullables — testing technique alternative to using mocking libraries. Use when writing unit tests, when code touches external I/O or state (HTTP, databases, files, clock, random) anywhere in its dependency chain, when making a system testable, or when tests are slow or flaky.
Bash script style guide. Always use when writing bash scripts, shell scripts, or CLI bash tools.
Drive a browser from the terminal with playwright-cli: snapshot the page, then act on elements by ref. Use when automating browser interactions, filling web forms, testing UIs, or driving logged-in web apps from the command line.
Facilitates deep, structured learning of a topic — gathering source material, assessing the learner's gaps, then teaching through guided Socratic sessions. Use when someone wants to genuinely study or be tutored on a subject over time, not get a quick answer.
Creates C4 architecture diagrams for designing, documenting, or understanding software architecture. Use when working through system design, mapping existing codebases, or visualizing structure at any level from system landscape down to code.
Test-driven development (TDD) process used when writing code. Use whenever you are adding any new code, unless the user explicitly asks to skip TDD or the code is exploratory/spike.
| name | event-modeling |
| description | Designs systems using Event Modeling. |
STARTER_CHARACTER = 🗺️
A set of vertical slices that fully describe a system's behavior. Each slice is independently implementable and testable. The model uses business language throughout — no infrastructure or technical terms.
┌─────────────────────────────────────┐
│ Event Model │
│ │
│ ┌───────────┐ ┌───────────┐ │
│ │ Slice 1 │ │ Slice 2 │ ... │
│ │ STATE_ │ │ STATE_ │ │
│ │ CHANGE │ │ VIEW │ │
│ └───────────┘ └───────────┘ │
│ │ ▲ │
│ │ (events) │ │
│ └──────────────┘ │
└─────────────────────────────────────┘
Three types. Every behavior in the system fits one:
STATE_CHANGE — user does something
STATE_VIEW — system shows something
AUTOMATION — system reacts to something
See references/slice-types.md for element rules, dependency patterns, and naming conventions.
Work with the user through these phases. Move at the user's pace — they might want to go deep on one slice before seeing the full picture.
Identify aggregates (core business entities), actors, and high-level use cases. Ask about the business processes, not technical implementation.
Draft all slices without field details. Show the flow between them — which events feed which read models, which screens lead to which commands. This is the "map" of the system.
Format as a markdown document with one section per slice. Include slice type, aggregate, elements, and how slices connect.
Walk through one slice at a time. For each:
Turn specifications into approval fixture files using the bdd-with-approvals skill. That skill teaches how to:
Read that skill when it's time to design fixtures. The event model specs (Given events / When command / Then events) map naturally to the approved fixture pattern.
When working with an existing codebase instead of greenfield:
Produce markdown, not JSON. Design for human readability — someone should look at the model and understand the system.
Write model artifacts to files. Ask the user where they want them (e.g., docs/event-model.md). Update the files as the model evolves through conversation.
One document showing all slices and their relationships:
# [System Name] Event Model
## Aggregates
- Owner — pet owners who use the clinic
- Pet — animals registered to owners
## Slices
### Register Owner [STATE_CHANGE]
Aggregate: Owner
Screen: Owner Registration Form
Command: Register Owner → Event: Owner Registered
Error: → Owner Registration Failed
### View Owner Profile [STATE_VIEW]
Aggregate: Owner
Events: Owner Registered, Pet Registered → Read Model: Owner Profile
Screen: Owner Profile
### Notify Vet of New Patient [AUTOMATION]
Trigger: Pet Registered → Processor: New Patient Notifier
Command: Send Notification → Event: Vet Notified
Per-slice detail includes fields and specifications:
## Register Owner [STATE_CHANGE]
Aggregate: Owner
### Command: Register Owner
firstName: String — "George"
lastName: String — "Franklin"
address: String — "110 W. Liberty St."
city: String — "Madison"
telephone: String — "6085551023"
### Event: Owner Registered
ownerId: UUID — <generated>
firstName: String — "George"
lastName: String — "Franklin"
address: String — "110 W. Liberty St."
city: String — "Madison"
telephone: String — "6085551023"
### Event: Owner Registration Failed
errors: Map — {"lastName": "required"}
### Specifications
#### Successfully register with valid data
Given: (no prior state)
When: Register Owner
firstName: George, lastName: Franklin
address: 110 W. Liberty St., city: Madison
telephone: 6085551023
Then: Owner Registered
ownerId: <generated>, firstName: George, lastName: Franklin
#### Fail when required fields missing
Given: (no prior state)
When: Register Owner
firstName: George, city: Madison
Then: Owner Registration Failed
errors: {address: required, telephone: required}
#### Business rules
- All fields mandatory: firstName, lastName, address, city, telephone
- Telephone must be numeric, max 10 digits
These are defaults. Adapt the format to the domain — what matters is that a person can scan it and quickly validate correctness.
bdd-with-approvals skillapproval-tests skill