@eventmodelers/cli 1.0.36 → 1.0.38
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/package.json +1 -1
- package/shared/skills/learn-eventmodelers-api/SKILL.md +22 -13
- package/stacks/modeling-kit/templates/.claude/skills/add-next-slice/SKILL.md +2 -23
- package/stacks/modeling-kit/templates/.claude/skills/add-next-slice/references/api-fallback.md +11 -0
- package/stacks/modeling-kit/templates/.claude/skills/analyze-existing-model/SKILL.md +6 -57
- package/stacks/modeling-kit/templates/.claude/skills/analyze-existing-model/references/api-fallback.md +68 -0
- package/stacks/modeling-kit/templates/.claude/skills/attributes/SKILL.md +4 -61
- package/stacks/modeling-kit/templates/.claude/skills/attributes/references/api-fallback.md +39 -0
- package/stacks/modeling-kit/templates/.claude/skills/discover-storyboard/SKILL.md +9 -53
- package/stacks/modeling-kit/templates/.claude/skills/discover-storyboard/references/api-fallback.md +63 -0
- package/stacks/modeling-kit/templates/.claude/skills/eventmodeling-applying-conways-law/SKILL.md +12 -380
- package/stacks/modeling-kit/templates/.claude/skills/eventmodeling-applying-conways-law/references/examples.md +329 -0
- package/stacks/modeling-kit/templates/.claude/skills/eventmodeling-brainstorming-events/SKILL.md +45 -290
- package/stacks/modeling-kit/templates/.claude/skills/eventmodeling-brainstorming-events/references/api-fallback.md +97 -0
- package/stacks/modeling-kit/templates/.claude/skills/eventmodeling-brainstorming-events/references/examples.md +35 -0
- package/stacks/modeling-kit/templates/.claude/skills/eventmodeling-checking-completeness/SKILL.md +15 -410
- package/stacks/modeling-kit/templates/.claude/skills/eventmodeling-checking-completeness/references/api-fallback.md +22 -0
- package/stacks/modeling-kit/templates/.claude/skills/eventmodeling-checking-completeness/references/examples.md +397 -0
- package/stacks/modeling-kit/templates/.claude/skills/eventmodeling-core-rules/SKILL.md +182 -0
- package/stacks/modeling-kit/templates/.claude/skills/eventmodeling-designing-automation-chains/SKILL.md +148 -0
- package/stacks/modeling-kit/templates/.claude/skills/eventmodeling-designing-automation-chains/references/api-fallback.md +21 -0
- package/stacks/modeling-kit/templates/.claude/skills/eventmodeling-designing-event-models/SKILL.md +48 -448
- package/stacks/modeling-kit/templates/.claude/skills/eventmodeling-designing-event-models/references/examples.md +167 -0
- package/stacks/modeling-kit/templates/.claude/skills/eventmodeling-elaborating-scenarios/SKILL.md +31 -380
- package/stacks/modeling-kit/templates/.claude/skills/eventmodeling-elaborating-scenarios/references/api-fallback.md +31 -0
- package/stacks/modeling-kit/templates/.claude/skills/eventmodeling-elaborating-scenarios/references/examples.md +216 -0
- package/stacks/modeling-kit/templates/.claude/skills/eventmodeling-identifying-inputs/SKILL.md +33 -393
- package/stacks/modeling-kit/templates/.claude/skills/eventmodeling-identifying-inputs/references/api-fallback.md +79 -0
- package/stacks/modeling-kit/templates/.claude/skills/eventmodeling-identifying-inputs/references/examples.md +282 -0
- package/stacks/modeling-kit/templates/.claude/skills/eventmodeling-identifying-outputs/SKILL.md +54 -454
- package/stacks/modeling-kit/templates/.claude/skills/eventmodeling-identifying-outputs/references/api-fallback.md +67 -0
- package/stacks/modeling-kit/templates/.claude/skills/eventmodeling-identifying-outputs/references/examples.md +273 -0
- package/stacks/modeling-kit/templates/.claude/skills/eventmodeling-interview-protocol/SKILL.md +31 -0
- package/stacks/modeling-kit/templates/.claude/skills/eventmodeling-optimizing-stream-design/SKILL.md +37 -184
- package/stacks/modeling-kit/templates/.claude/skills/eventmodeling-optimizing-stream-design/references/domain-patterns.md +58 -99
- package/stacks/modeling-kit/templates/.claude/skills/eventmodeling-optimizing-stream-design/references/patterns.md +82 -163
- package/stacks/modeling-kit/templates/.claude/skills/eventmodeling-orchestrating-event-modeling/SKILL.md +86 -78
- package/stacks/modeling-kit/templates/.claude/skills/eventmodeling-orchestrating-event-modeling/references/api-fallback.md +51 -0
- package/stacks/modeling-kit/templates/.claude/skills/eventmodeling-plotting-events/SKILL.md +5 -5
- package/stacks/modeling-kit/templates/.claude/skills/eventmodeling-plotting-events/references/api-fallback.md +10 -0
- package/stacks/modeling-kit/templates/.claude/skills/eventmodeling-slicing-event-models/SKILL.md +22 -51
- package/stacks/modeling-kit/templates/.claude/skills/eventmodeling-slicing-event-models/references/api-fallback.md +41 -0
- package/stacks/modeling-kit/templates/.claude/skills/eventmodeling-slicing-event-models/references/examples.md +12 -9
- package/stacks/modeling-kit/templates/.claude/skills/eventmodeling-slicing-event-models/references/patterns.md +1 -10
- package/stacks/modeling-kit/templates/.claude/skills/eventmodeling-storyboarding-events/SKILL.md +29 -382
- package/stacks/modeling-kit/templates/.claude/skills/eventmodeling-storyboarding-events/references/api-fallback.md +77 -0
- package/stacks/modeling-kit/templates/.claude/skills/eventmodeling-storyboarding-events/references/examples.md +271 -0
- package/stacks/modeling-kit/templates/.claude/skills/eventmodeling-translating-external-events/SKILL.md +12 -349
- package/stacks/modeling-kit/templates/.claude/skills/eventmodeling-translating-external-events/references/examples.md +306 -0
- package/stacks/modeling-kit/templates/.claude/skills/eventmodeling-validating-event-models/SKILL.md +69 -107
- package/stacks/modeling-kit/templates/.claude/skills/eventmodeling-validating-event-models/references/api-fallback.md +14 -0
- package/stacks/modeling-kit/templates/.claude/skills/eventmodeling-validating-event-models-checklist/SKILL.md +75 -160
- package/stacks/modeling-kit/templates/.claude/skills/eventmodeling-validating-event-models-checklist/references/api-fallback.md +14 -0
- package/stacks/modeling-kit/templates/.claude/skills/examples/SKILL.md +3 -110
- package/stacks/modeling-kit/templates/.claude/skills/examples/references/api-fallback.md +118 -0
- package/stacks/modeling-kit/templates/.claude/skills/handle-comment/SKILL.md +5 -25
- package/stacks/modeling-kit/templates/.claude/skills/handle-comment/references/api-fallback.md +35 -0
- package/stacks/modeling-kit/templates/.claude/skills/html-screen/SKILL.md +9 -44
- package/stacks/modeling-kit/templates/.claude/skills/html-screen/references/api-fallback.md +51 -0
- package/stacks/modeling-kit/templates/.claude/skills/place-element/SKILL.md +34 -180
- package/stacks/modeling-kit/templates/.claude/skills/place-element/references/api-fallback.md +203 -0
- package/stacks/modeling-kit/templates/.claude/skills/storyboard/SKILL.md +14 -81
- package/stacks/modeling-kit/templates/.claude/skills/storyboard/references/api-fallback.md +74 -0
- package/stacks/modeling-kit/templates/.claude/skills/storyboard-screen/SKILL.md +4 -45
- package/stacks/modeling-kit/templates/.claude/skills/storyboard-screen/references/api-fallback.md +44 -0
- package/stacks/modeling-kit/templates/.claude/skills/timeline/SKILL.md +19 -88
- package/stacks/modeling-kit/templates/.claude/skills/timeline/references/api-fallback.md +91 -0
- package/stacks/modeling-kit/templates/.claude/skills/update-prompt-status/SKILL.md +1 -9
- package/stacks/modeling-kit/templates/.claude/skills/update-prompt-status/references/api-fallback.md +14 -0
- package/stacks/modeling-kit/templates/.claude/skills/eventmodeling-integrating-legacy-systems/SKILL.md +0 -674
- package/stacks/modeling-kit/templates/.claude/skills/eventmodeling-optimizing-stream-design/references/snapshotting.md +0 -204
package/stacks/modeling-kit/templates/.claude/skills/eventmodeling-brainstorming-events/SKILL.md
CHANGED
|
@@ -11,18 +11,16 @@ allowed-tools:
|
|
|
11
11
|
|
|
12
12
|
> **Before doing anything else**, invoke the `connect` skill — if not already connected — to resolve `TOKEN`, `BOARD_ID`, `ORG_ID`, and `BASE_URL`. Do not proceed until it has completed. Consult `learn-eventmodelers-api` only if you need to look up a specific endpoint or field this file doesn't cover — don't load it eagerly.
|
|
13
13
|
|
|
14
|
+
This step applies the shared element rules in **`eventmodeling-core-rules`** — read it once per session if you haven't already; it defines what a COMMAND/EVENT/READMODEL/SCREEN/AUTOMATION is, how each is named, and the anti-patterns to reject, so this step doesn't restate them.
|
|
15
|
+
|
|
14
16
|
Prefer `mcp__eventmodelers__*` tools when available (registered by the `connect` skill) — the curl blocks below are the fallback for sessions without MCP connected.
|
|
15
17
|
|
|
16
18
|
## Interview Phase (Optional)
|
|
17
19
|
|
|
18
|
-
**When to Interview**: Skip if the user has provided detailed, well-documented requirements (written user stories, feature specs, business rules). Interview when requirements are vague, incomplete, or
|
|
19
|
-
|
|
20
|
-
**Interview Strategy**: Ensure requirements are complete and team understands domain well enough to brainstorm comprehensively. Identify hidden complexity areas upfront.
|
|
20
|
+
**When to Interview**: Skip if the user has provided detailed, well-documented requirements (written user stories, feature specs, business rules) and named who understands the domain. Interview when requirements are vague, incomplete, or domain expertise is uncertain.
|
|
21
21
|
|
|
22
22
|
### Critical Questions
|
|
23
23
|
|
|
24
|
-
When requirements need clarification:
|
|
25
|
-
|
|
26
24
|
1. **Requirements Completeness** (Impact: Determines if brainstorm is likely to be exhaustive)
|
|
27
25
|
- Question: "How complete are your requirements? Do you have: (A) Written user stories/specs, (B) Documented business rules, (C) Rough list, (D) Just verbal descriptions?"
|
|
28
26
|
- Why it matters: Incomplete requirements cause missed events; complete requirements enable comprehensive brainstorm
|
|
@@ -43,76 +41,7 @@ When requirements need clarification:
|
|
|
43
41
|
- Why it matters: Business rules often generate specific events; documenting them prevents overlooking state changes
|
|
44
42
|
- Follow-up triggers: For each rule → ask "When this rule is violated, what event signals that?"
|
|
45
43
|
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
**Conditional Entry**:
|
|
49
|
-
```text
|
|
50
|
-
If user has provided:
|
|
51
|
-
- Written requirements or user stories (not just verbal)
|
|
52
|
-
- AND documented business rules or constraints
|
|
53
|
-
- AND named domain experts who will participate
|
|
54
|
-
|
|
55
|
-
Then: Skip interview, proceed directly to brainstorming
|
|
56
|
-
|
|
57
|
-
Else: Conduct interview
|
|
58
|
-
```
|
|
59
|
-
|
|
60
|
-
**Phase 1: Requirements Assessment** (Questions 1-2)
|
|
61
|
-
- Gauge requirements completeness
|
|
62
|
-
- Confirm domain expertise available
|
|
63
|
-
- Adjust brainstorm scope accordingly
|
|
64
|
-
|
|
65
|
-
**Phase 2: Complexity Mapping** (Questions 3-4)
|
|
66
|
-
- Identify areas needing deep exploration
|
|
67
|
-
- Document rules that may generate events
|
|
68
|
-
- Plan brainstorm focus areas
|
|
69
|
-
|
|
70
|
-
### Capturing Interview Findings
|
|
71
|
-
|
|
72
|
-
Append findings to the project's event modeling file:
|
|
73
|
-
|
|
74
|
-
**File**: `.trogonai/interviews/[project-name]/EVENTMODELING.md`
|
|
75
|
-
|
|
76
|
-
Use Write tool to add/update this section:
|
|
77
|
-
|
|
78
|
-
```markdown
|
|
79
|
-
## 2. Brainstormed Events (eventmodeling-brainstorming-events)
|
|
80
|
-
|
|
81
|
-
### Requirements Assessment
|
|
82
|
-
[From Q1: Written requirements? Documented rules?]
|
|
83
|
-
|
|
84
|
-
### Domain Expertise
|
|
85
|
-
[From Q2: Who understands domain? Available for participation?]
|
|
86
|
-
|
|
87
|
-
### Role Catalog
|
|
88
|
-
#### Human Roles
|
|
89
|
-
- [Role 1]: [Description] → Actions: [list]
|
|
90
|
-
- [Role 2]: [Description] → Actions: [list]
|
|
91
|
-
#### System Actors
|
|
92
|
-
- [Actor 1]: [Description] → Triggers: [list]
|
|
93
|
-
|
|
94
|
-
### Event Streams (Stream Roots)
|
|
95
|
-
- Stream: [Name] (Identity: [id field])
|
|
96
|
-
- Events: [Event1, Event2, Event3]
|
|
97
|
-
- State changes: [State transitions]
|
|
98
|
-
|
|
99
|
-
### Business Rules & Constraints
|
|
100
|
-
[From Q3 & Q4]
|
|
101
|
-
- Rule 1: [Statement] → [Events it generates]
|
|
102
|
-
- Rule 2: [Statement] → [Events it generates]
|
|
103
|
-
- Constraint 1: [Limitation]
|
|
104
|
-
|
|
105
|
-
### Brainstorming Focus Areas
|
|
106
|
-
- [Focus area 1]
|
|
107
|
-
- [Focus area 2]
|
|
108
|
-
```
|
|
109
|
-
|
|
110
|
-
Update Interview Trail:
|
|
111
|
-
```markdown
|
|
112
|
-
| 2 | eventmodeling-brainstorming-events | [today] | Event streams, business rules, constraints |
|
|
113
|
-
```
|
|
114
|
-
|
|
115
|
-
This section feeds into subsequent steps (plotting, storyboarding, etc.)
|
|
44
|
+
Follow **`eventmodeling-interview-protocol`** to run this interview and record its findings — label this step "**2. Brainstormed Events** (`eventmodeling-brainstorming-events`)". Findings should cover: requirements completeness, domain expertise available, the Role Catalog, entities/event timelines identified, business rules & constraints, and brainstorming focus areas — this feeds directly into plotting and storyboarding.
|
|
116
45
|
|
|
117
46
|
---
|
|
118
47
|
|
|
@@ -125,11 +54,7 @@ Before brainstorming, check for EVENT nodes already on the board to avoid duplic
|
|
|
125
54
|
mcp__eventmodelers__get_nodes { "boardId": "<BOARD_ID>", "type": "EVENT" }
|
|
126
55
|
```
|
|
127
56
|
|
|
128
|
-
**Fallback (no MCP):**
|
|
129
|
-
```bash
|
|
130
|
-
curl -s -H "x-token: $TOKEN" -H "x-board-id: $BOARD_ID" \
|
|
131
|
-
"$BASE_URL/api/org/$ORG_ID/boards/$BOARD_ID/nodes?type=EVENT"
|
|
132
|
-
```
|
|
57
|
+
**Fallback (no MCP):** see `references/api-fallback.md` — "Board Context — Check existing EVENT nodes".
|
|
133
58
|
|
|
134
59
|
If events already exist, treat them as the starting list and focus on discovering what might be missing. Also check for existing chapters (timelines) so you can reuse them:
|
|
135
60
|
|
|
@@ -138,11 +63,7 @@ If events already exist, treat them as the starting list and focus on discoverin
|
|
|
138
63
|
mcp__eventmodelers__get_nodes { "boardId": "<BOARD_ID>", "type": "CHAPTER" }
|
|
139
64
|
```
|
|
140
65
|
|
|
141
|
-
**Fallback (no MCP):**
|
|
142
|
-
```bash
|
|
143
|
-
curl -s -H "x-token: $TOKEN" -H "x-board-id: $BOARD_ID" \
|
|
144
|
-
"$BASE_URL/api/org/$ORG_ID/boards/$BOARD_ID/nodes?type=CHAPTER"
|
|
145
|
-
```
|
|
66
|
+
**Fallback (no MCP):** see `references/api-fallback.md` — "Board Context — Check existing CHAPTER nodes".
|
|
146
67
|
|
|
147
68
|
## Timeline Discovery (Mandatory Before Placing Any Event)
|
|
148
69
|
|
|
@@ -157,23 +78,24 @@ After completing the analysis, partition the full event list into groups where e
|
|
|
157
78
|
|
|
158
79
|
If all events belong to a single flow, one timeline is correct — do not split artificially.
|
|
159
80
|
|
|
81
|
+
**Divergent journey vs. a decision point — do not confuse the two.** A group of events sometimes contains a branch, and the branch's nature decides whether it gets its own chapter or stays inside this one:
|
|
82
|
+
|
|
83
|
+
- **Divergent journey → its own chapter.** The actor makes a different choice *before* the process even starts, and everything downstream differs as a result (e.g. "Checkout with saved card" vs. "Checkout as guest" — different screens, different commands, arguably a different Role Catalog entry). Group these as separate workflows in Step 1, not as one group with a fork in it.
|
|
84
|
+
- **Decision point → stays in this one chapter.** A single trigger — one command's outcome, or one automation's rule — resolves to one of several mutually exclusive results, and the rest of the process is otherwise the same story (e.g. `PaymentAuthorized` succeeds or fails, `OrderConfirmed` vs. `OrderCancelled` after the same confirm action). Keep this as one group; `eventmodeling-plotting-events`'s "Identify Alternative Paths" step is exactly where this branch gets shown, as sibling paths within the same timeline — it never means a second chapter.
|
|
85
|
+
|
|
86
|
+
If unsure which one you're looking at, ask: "does this branch start a genuinely different story, or does it just decide how *this* story ends?" A different story is a new chapter; a different ending is a branch inside this one.
|
|
87
|
+
|
|
160
88
|
### 2. Create one chapter per group
|
|
161
89
|
|
|
162
90
|
For each group, create a chapter on the board **before placing any events**. Reuse an existing chapter if one already matches the workflow name.
|
|
163
91
|
|
|
164
92
|
**Prefer MCP — create a chapter:**
|
|
165
93
|
```
|
|
166
|
-
mcp__eventmodelers__create_chapter { "boardId": "<BOARD_ID>", "x": 0, "y": 1200 }
|
|
167
|
-
```
|
|
168
|
-
(`x`/`y` are optional — see the vertical-stacking note below. Response includes the new `timelineId`.)
|
|
169
|
-
|
|
170
|
-
**Fallback (no MCP) — create a chapter:**
|
|
171
|
-
```bash
|
|
172
|
-
curl -s -X POST "$BASE_URL/api/org/$ORG_ID/boards/$BOARD_ID/chapters" \
|
|
173
|
-
-H "x-token: $TOKEN" -H "x-board-id: $BOARD_ID" \
|
|
174
|
-
-H "Content-Type: application/json" -d '{}'
|
|
175
|
-
# → { timelineId: "<chapterId>", ... }
|
|
94
|
+
mcp__eventmodelers__create_chapter { "boardId": "<BOARD_ID>", "x": 0, "y": 1200, "columns": <numberOfEventsInGroup> }
|
|
176
95
|
```
|
|
96
|
+
(`x`/`y` are optional — see the vertical-stacking note below. `columns` is optional too — the group's event count is already known at this point, so pass it here to create the chapter with exactly the columns this group needs, instead of the default 3 plus a follow-up `add_column` batch. Response includes the new `timelineId` and `columnIds` — one id per column, left to right, ready to use directly in Step A below.)
|
|
97
|
+
|
|
98
|
+
**Fallback (no MCP):** see `references/api-fallback.md` — "Timeline Discovery — Step 2: Create one chapter per group — create the chapter".
|
|
177
99
|
|
|
178
100
|
**Immediately set its title** (use the workflow / bounded-context name):
|
|
179
101
|
|
|
@@ -192,20 +114,7 @@ mcp__eventmodelers__submit_node_events {
|
|
|
192
114
|
}
|
|
193
115
|
```
|
|
194
116
|
|
|
195
|
-
**Fallback (no MCP):**
|
|
196
|
-
```bash
|
|
197
|
-
curl -s -X POST "$BASE_URL/api/org/$ORG_ID/boards/$BOARD_ID/nodes/events" \
|
|
198
|
-
-H "x-token: $TOKEN" -H "x-board-id: $BOARD_ID" \
|
|
199
|
-
-H "x-user-id: brainstorming-events" -H "Content-Type: application/json" \
|
|
200
|
-
-d '[{
|
|
201
|
-
"id": "<uuid>",
|
|
202
|
-
"eventType": "node:changed",
|
|
203
|
-
"nodeId": "<chapterId>",
|
|
204
|
-
"boardId": "<boardId>",
|
|
205
|
-
"timestamp": 1234567890,
|
|
206
|
-
"meta": {"type": "CHAPTER", "title": "Reservation & Lending"}
|
|
207
|
-
}]'
|
|
208
|
-
```
|
|
117
|
+
**Fallback (no MCP):** see `references/api-fallback.md` — "Timeline Discovery — Step 2: Create one chapter per group — set its title".
|
|
209
118
|
|
|
210
119
|
**Stack timelines vertically so they do not overlap, and in general place new chapters close to existing ones they relate to.**
|
|
211
120
|
After creating each chapter, position it below the previous one. Use `y = index * 1200` (0-based creation order), `x = 0`. If existing chapters are already on the board, query their positions first. Prefer placing the new chapter directly below the existing chapter it is most closely related to (e.g. the same bounded context or an adjacent workflow), rather than mechanically appending below the lowest one — this keeps related chapters visually near each other on the canvas. Only fall back to `y = maxExistingY + 1200` when no related chapter exists yet. Pass this directly as `x`/`y` on `create_chapter` above, or reposition an existing chapter with:
|
|
@@ -215,13 +124,7 @@ After creating each chapter, position it below the previous one. Use `y = index
|
|
|
215
124
|
mcp__eventmodelers__move_timeline_position { "boardId": "<BOARD_ID>", "timelineId": "<TL>", "x": 0, "y": 1200 }
|
|
216
125
|
```
|
|
217
126
|
|
|
218
|
-
**Fallback (no MCP):**
|
|
219
|
-
```bash
|
|
220
|
-
curl -s -X PUT "$BASE_URL/api/org/$ORG_ID/boards/$BOARD_ID/timelines/$TL/position" \
|
|
221
|
-
-H "x-token: $TOKEN" -H "x-board-id: $BOARD_ID" \
|
|
222
|
-
-H "Content-Type: application/json" \
|
|
223
|
-
-d '{"x": 0, "y": 1200}' # first chapter: y=0, second: y=1200, third: y=2400, …
|
|
224
|
-
```
|
|
127
|
+
**Fallback (no MCP):** see `references/api-fallback.md` — "Timeline Discovery — Step 2: Reposition an existing chapter".
|
|
225
128
|
|
|
226
129
|
Record the mapping: `workflow name → chapterId`. Every subsequent event placement will reference this ID.
|
|
227
130
|
|
|
@@ -265,38 +168,27 @@ Brainstorming events has two modes. Choose based on whether the chapter (timelin
|
|
|
265
168
|
|
|
266
169
|
When a chapter is available, place each event directly into it. **Include `cellId` in `node:created`** — without it the node has no cell reference and will appear stranded at position 0,0 on the canvas.
|
|
267
170
|
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
**Step A — Create a column** (append at end of the chapter):
|
|
171
|
+
**Step A — Ensure enough columns exist, in a single call** (append at end of the chapter). Skip this step entirely if the chapter was just created above with `columns` already set to this group's event count. Otherwise (an existing/reused chapter, or one created without `columns`) — the number of events to place is already known from the brainstormed list, so pass it as `count` instead of calling `add_column` once per event:
|
|
271
172
|
|
|
272
173
|
**Prefer MCP:**
|
|
273
174
|
```
|
|
274
|
-
mcp__eventmodelers__add_column { "boardId": "<BOARD_ID>", "timelineId": "<CHAPTER_ID>" }
|
|
175
|
+
mcp__eventmodelers__add_column { "boardId": "<BOARD_ID>", "timelineId": "<CHAPTER_ID>", "count": <numberOfEvents> }
|
|
176
|
+
# → { "columnId": "<firstColUuid>", "index": <n>, "totalColumns": <n>, "columnIds": ["<col1>", "<col2>", ...] }
|
|
275
177
|
```
|
|
178
|
+
Use `columnIds[i]` for the i-th event in Step C below. (Omit `count`, or pass `1`, for a single event — `columnIds` is only present when `count > 1`.)
|
|
276
179
|
|
|
277
|
-
**Fallback (no MCP):**
|
|
278
|
-
```bash
|
|
279
|
-
curl -s -X POST "$BASE_URL/api/org/$ORG_ID/boards/$BOARD_ID/timelines/$CHAPTER_ID/columns" \
|
|
280
|
-
-H "x-token: $TOKEN" -H "x-board-id: $BOARD_ID" -H "x-user-id: brainstorming-events" \
|
|
281
|
-
-H "Content-Type: application/json" -d '{}'
|
|
282
|
-
# → { "columnId": "<colUuid>", "index": <n>, "totalColumns": <n> }
|
|
283
|
-
```
|
|
180
|
+
**Fallback (no MCP):** see `references/api-fallback.md` — "Mode A — Step A: Ensure enough columns exist".
|
|
284
181
|
|
|
285
182
|
**Step B — Fetch the chapter to find the swimlane row ID** (only needed once per chapter):
|
|
286
183
|
|
|
287
|
-
**Prefer MCP
|
|
184
|
+
**Prefer MCP** — `projection: "cells"` returns just `{rows, columns, cells}`, not the whole chapter node:
|
|
288
185
|
```
|
|
289
|
-
mcp__eventmodelers__get_node { "boardId": "<BOARD_ID>", "nodeId": "<CHAPTER_ID>" }
|
|
186
|
+
mcp__eventmodelers__get_node { "boardId": "<BOARD_ID>", "nodeId": "<CHAPTER_ID>", "projection": "cells" }
|
|
290
187
|
```
|
|
291
188
|
|
|
292
|
-
**Fallback (no MCP):**
|
|
293
|
-
```bash
|
|
294
|
-
curl -s -H "x-token: $TOKEN" -H "x-board-id: $BOARD_ID" \
|
|
295
|
-
"$BASE_URL/api/org/$ORG_ID/boards/$BOARD_ID/nodes/$CHAPTER_ID"
|
|
296
|
-
# → node.meta.timelineData.rows — find the row where type === "swimlane"
|
|
297
|
-
```
|
|
189
|
+
**Fallback (no MCP):** see `references/api-fallback.md` — "Mode A — Step B: Fetch the chapter to find the swimlane row ID".
|
|
298
190
|
|
|
299
|
-
**Step C — Compute:** `cellId = swimlaneRow.id + "-" + columnId`
|
|
191
|
+
**Step C — Compute, for the i-th event:** `cellId = swimlaneRow.id + "-" + columnIds[i]` (or the single `columnId` if only one column was created)
|
|
300
192
|
|
|
301
193
|
**Step D — Create the event with `cellId`.**
|
|
302
194
|
|
|
@@ -327,29 +219,7 @@ mcp__eventmodelers__submit_node_events {
|
|
|
327
219
|
}
|
|
328
220
|
```
|
|
329
221
|
|
|
330
|
-
**Fallback (no MCP) —
|
|
331
|
-
```json
|
|
332
|
-
[{
|
|
333
|
-
"id": "<event-uuid>",
|
|
334
|
-
"eventType": "node:created",
|
|
335
|
-
"nodeId": "<node-uuid>",
|
|
336
|
-
"boardId": "<boardId>",
|
|
337
|
-
"timestamp": 1234567890,
|
|
338
|
-
"chapterId": "<chapterId>",
|
|
339
|
-
"cellId": "<swimlaneRowId>-<columnId>",
|
|
340
|
-
"meta": {
|
|
341
|
-
"type": "EVENT",
|
|
342
|
-
"title": "BookReserved",
|
|
343
|
-
"fields": [
|
|
344
|
-
{"name": "reservationId", "type": "String", "example": "res-789"},
|
|
345
|
-
{"name": "copyId", "type": "String", "example": "copy-42"},
|
|
346
|
-
{"name": "memberId", "type": "String", "example": "mbr-101"},
|
|
347
|
-
{"name": "expiresAt", "type": "DateTime", "example": "2026-06-01T00:00:00Z"},
|
|
348
|
-
{"name": "reservedAt", "type": "DateTime", "example": "2026-05-29T10:00:00Z"}
|
|
349
|
-
]
|
|
350
|
-
}
|
|
351
|
-
}]
|
|
352
|
-
```
|
|
222
|
+
**Fallback (no MCP):** see `references/api-fallback.md` — "Mode A — Step D: Create the event with cellId".
|
|
353
223
|
|
|
354
224
|
> **Never call `drop` after using `cellId` in `node:created`.** The drop endpoint adds a second cell reference without removing the first. `node:created + cellId` is the only placement step needed.
|
|
355
225
|
|
|
@@ -370,7 +240,7 @@ An event left without a chapter and cell reference will never appear in any time
|
|
|
370
240
|
|
|
371
241
|
**Use swimlanes sparingly — a swimlane exists for exactly one purpose: marking where integration with another system happens. Nothing else justifies one.** Not a different actor, not a different role, not visual grouping, not "an explicit business rule" in the abstract. Every chapter starts with, and in the common case keeps, a single default swimlane holding all of this bounded context's own domain events. Before adding a lane, check whether an existing lane already covers the element's type. If yes, place the element in that lane.
|
|
372
242
|
|
|
373
|
-
**The only valid reason to create a second `swimlane`-type lane: another system's own events cross into this chapter as integration triggers for a translation automation** (see `eventmodeling-
|
|
243
|
+
**The only valid reason to create a second `swimlane`-type lane: another system's own events cross into this chapter as integration triggers for a translation automation** (see `eventmodeling-designing-automation-chains`, Step 4b). Label it for that system and place its trigger events there — never fold them into this chapter's own event swimlane (they are not this bounded context's domain facts) and never treat them as an informal "signal" with no EVENT node at all. An external EVENT may only ever open the *translation* automation's todo list — never the todo list of the automation that does the actual domain work; that automation is triggered solely by the internal event the translation automation produces, and only exists at all when reacting to that internal event genuinely requires a new decision (Step 4b covers the full translation chain, and when a worker automation belongs after it).
|
|
374
244
|
|
|
375
245
|
**Never** add a swimlane for any other reason — not a new actor, not a new role, not visual grouping. Human roles get their own **actor** lane during Step 3 (Storyboarding) — a different row type entirely — never a new swimlane here.
|
|
376
246
|
|
|
@@ -382,78 +252,9 @@ An event left without a chapter and cell reference will never appear in any time
|
|
|
382
252
|
|
|
383
253
|
## Workshop Facilitation Guide
|
|
384
254
|
|
|
385
|
-
**Setting**: This is a collaborative brainstorming workshop
|
|
386
|
-
|
|
387
|
-
### The Brainstorming Flow
|
|
388
|
-
|
|
389
|
-
**Phase 1: Understand Goals** (5-10 min)
|
|
390
|
-
- Someone explains project goals
|
|
391
|
-
- What problem are we solving?
|
|
392
|
-
- Who are the users?
|
|
393
|
-
- What are key outcomes?
|
|
394
|
-
|
|
395
|
-
**Phase 2: Free Brainstorm** (15-20 min)
|
|
396
|
-
Facilitator asks:
|
|
397
|
-
> "What events could happen in this system? When something changes, what event occurs? Put down ANY event you think of."
|
|
398
|
-
|
|
399
|
-
Participants call out events (sticky notes or digital cards):
|
|
400
|
-
```text
|
|
401
|
-
"Customer places order"
|
|
402
|
-
"Order confirmed"
|
|
403
|
-
"Payment received"
|
|
404
|
-
"Inventory updated"
|
|
405
|
-
"Order shipped"
|
|
406
|
-
"Delivery confirmed"
|
|
407
|
-
"Return requested"
|
|
408
|
-
"Refund issued"
|
|
409
|
-
```
|
|
410
|
-
|
|
411
|
-
**Phase 3: Gentle Filtering** (10-15 min)
|
|
412
|
-
Facilitator introduces state-changing concept gently:
|
|
413
|
-
|
|
414
|
-
```text
|
|
415
|
-
Facilitator: "Now let's think about these events. An event is something that
|
|
416
|
-
CHANGED THE STATE of the system. It's something important that happened that
|
|
417
|
-
others need to know about.
|
|
418
|
-
|
|
419
|
-
Let me ask: Does 'Customer viewed the catalog' change anything?
|
|
420
|
-
Participants: "Well... no, they just looked."
|
|
421
|
-
Facilitator: "Right, so it's not an event. But if they SELECTED an item
|
|
422
|
-
from catalog, that changes what's in their cart, so that's
|
|
423
|
-
a state change. Call that 'ItemAddedToCart'."
|
|
424
|
-
|
|
425
|
-
Does 'Payment received' change something?
|
|
426
|
-
Participants: "Yes! Order goes from confirmed to paid."
|
|
427
|
-
Facilitator: "Exactly! That's an event—state changed."
|
|
428
|
-
```
|
|
429
|
-
|
|
430
|
-
**Key points to clarify**:
|
|
431
|
-
- "Customer logged in" → Maybe not state-changing (unless we track logins)
|
|
432
|
-
- "Customer created account" → State-changing event
|
|
433
|
-
- "System checked inventory" → Internal action, not state-changing
|
|
434
|
-
- "Inventory reserved" → State-changing event
|
|
435
|
-
- "Email sent" → Notification, not state-changing (unless we track email history)
|
|
436
|
-
- "Notification requested" → Could be state-changing if we track preferences
|
|
437
|
-
|
|
438
|
-
### Tips for Facilitators
|
|
439
|
-
|
|
440
|
-
**Make it conversational**:
|
|
441
|
-
- Don't say: "You identified a non-state-changing event"
|
|
442
|
-
- Say: "Interesting! Does that actually change anything in the system?"
|
|
443
|
-
|
|
444
|
-
**Use examples from their world**:
|
|
445
|
-
- If e-commerce: "Like if someone just browsed but didn't buy?"
|
|
446
|
-
- If banking: "Like if they just checked balance but didn't withdraw?"
|
|
447
|
-
|
|
448
|
-
**Don't be rigid**:
|
|
449
|
-
- If unsure whether something is state-changing, include it and refine later
|
|
450
|
-
- Some events seem minor now but matter in implementation
|
|
451
|
-
- Better to capture everything than miss important events
|
|
255
|
+
**Setting**: This is a collaborative brainstorming workshop — the facilitator guides participants to envision the system and extract events rapidly. See `references/facilitating-event-modeling-workshops.md`'s "Step 1: Brainstorming Events" section for the full facilitation flow (goals framing, free brainstorm, gentle filtering, example dialogue) and general facilitation techniques (handling personalities, pacing, disagreement) that apply throughout.
|
|
452
256
|
|
|
453
|
-
**
|
|
454
|
-
- Don't just list events, capture context
|
|
455
|
-
- Why would this event matter?
|
|
456
|
-
- Who cares about it? (Other systems, views, business rules)
|
|
257
|
+
**The core move, in brief**: ask participants for any event they can think of, capture everything without filtering first, then gently introduce the state-changing test ("did this actually change something?") to separate real events from actions/notifications/internal checks — see the reference for the full example dialogue and phrasing tips.
|
|
457
258
|
|
|
458
259
|
## Workflow
|
|
459
260
|
|
|
@@ -473,35 +274,7 @@ For each role/actor, document:
|
|
|
473
274
|
- **Key actions**: What state changes can this role initiate?
|
|
474
275
|
- **Permissions boundary**: What can this role NOT do?
|
|
475
276
|
|
|
476
|
-
Present as a Role Catalog:
|
|
477
|
-
|
|
478
|
-
```text
|
|
479
|
-
## Role Catalog
|
|
480
|
-
|
|
481
|
-
### Human Roles
|
|
482
|
-
|
|
483
|
-
1. **Customer** - Description: End user who browses, purchases, and tracks orders
|
|
484
|
-
- Key actions: Create order, confirm order, cancel order, submit review
|
|
485
|
-
- Cannot: Manage inventory, process refunds, respond to reviews as seller
|
|
486
|
-
|
|
487
|
-
2. **Seller** - Description: Merchant who lists products and fulfills orders
|
|
488
|
-
- Key actions: List product, confirm stock, respond to reviews, update pricing
|
|
489
|
-
- Cannot: Place orders, approve own reviews, process payments
|
|
490
|
-
|
|
491
|
-
3. **Support Agent** - Description: Internal staff handling escalations and manual overrides
|
|
492
|
-
- Key actions: Override order status, issue refunds, flag reviews
|
|
493
|
-
- Cannot: Place orders on behalf of customers (unless impersonating)
|
|
494
|
-
|
|
495
|
-
### System Actors
|
|
496
|
-
|
|
497
|
-
1. **Payment Gateway** (external)
|
|
498
|
-
- Triggers: Payment authorization, payment failure, refund confirmation
|
|
499
|
-
- Communication: Webhooks
|
|
500
|
-
|
|
501
|
-
2. **Inventory System** (internal)
|
|
502
|
-
- Triggers: Reserve inventory, release reservation
|
|
503
|
-
- Communication: Event-driven
|
|
504
|
-
```
|
|
277
|
+
Present as a Role Catalog: for each human role, its name (in domain language), a one-line description, its key actions, and what it explicitly cannot do; for each system actor, its name, whether it's internal or external, what triggers it, and how it communicates (webhooks, event-driven, API). A full worked example (E-commerce domain) is in `references/examples.md`.
|
|
505
278
|
|
|
506
279
|
This catalog feeds directly into:
|
|
507
280
|
- **Step 3 (Storyboarding)**: One actor lane per human role (not a swimlane — see Swimlane Rules above)
|
|
@@ -509,18 +282,18 @@ This catalog feeds directly into:
|
|
|
509
282
|
- **Step 7 (Scenarios)**: Scenarios reference roles by name
|
|
510
283
|
- **Step 8 (Completeness)**: Verify every role has at least one command path
|
|
511
284
|
|
|
512
|
-
### 2. Identify
|
|
513
|
-
Identify the main entities
|
|
285
|
+
### 2. Identify Entities (Event Timelines)
|
|
286
|
+
Identify the main entities whose story will be told as a timeline of events:
|
|
514
287
|
- User/Account
|
|
515
288
|
- Order
|
|
516
289
|
- Payment
|
|
517
290
|
- Shipment
|
|
518
291
|
- etc.
|
|
519
292
|
|
|
520
|
-
For each
|
|
293
|
+
For each entity, note:
|
|
521
294
|
- Name (use domain language, not technical terms)
|
|
522
295
|
- Identity key (what uniquely identifies instances: orderId, paymentId, customerId, etc.)
|
|
523
|
-
- What commands will affect it
|
|
296
|
+
- What commands will affect it
|
|
524
297
|
|
|
525
298
|
### 3. Identify Business Processes
|
|
526
299
|
Map out critical workflows:
|
|
@@ -573,13 +346,13 @@ Present findings in this structure (include facilitation notes for future worksh
|
|
|
573
346
|
- Triggers: [What events/commands it initiates]
|
|
574
347
|
- Communication: [Webhooks / Event-driven / API]
|
|
575
348
|
|
|
576
|
-
##
|
|
577
|
-
List each
|
|
578
|
-
- **
|
|
579
|
-
- **
|
|
580
|
-
- **
|
|
349
|
+
## Entities (Event Timelines)
|
|
350
|
+
List each entity and its identity:
|
|
351
|
+
- **Entity**: Review (Identity: reviewId)
|
|
352
|
+
- **Entity**: SellerResponse (Identity: responseId)
|
|
353
|
+
- **Entity**: Seller (Identity: sellerId)
|
|
581
354
|
|
|
582
|
-
Note: These are just the logical groupings of events
|
|
355
|
+
Note: These are just the logical groupings of events — the story each entity's timeline tells.
|
|
583
356
|
|
|
584
357
|
## Business Processes
|
|
585
358
|
1. **Process Name**: Description
|
|
@@ -602,23 +375,6 @@ Note: These are just the logical groupings of events. The STATE needed for each
|
|
|
602
375
|
## Output Format
|
|
603
376
|
Present analysis in a clear markdown structure that can be directly used by the eventmodeling-designing-event-models skill.
|
|
604
377
|
|
|
605
|
-
## Core Architectural Rule
|
|
606
|
-
|
|
607
|
-
**NEVER use DDD Aggregate pattern for state design** Every command handler must have its own minimal state projection derived from events. This is non-negotiable.
|
|
608
|
-
|
|
609
|
-
```text
|
|
610
|
-
ANTI-PATTERN (Do NOT do this):
|
|
611
|
-
OrderAggregate { orderId, customerId, items[], total, status, paymentId, address, shippedAt, cancelledAt, ... }
|
|
612
|
-
Used by: ConfirmOrder, ShipOrder, CancelOrder, ApproveReturn
|
|
613
|
-
Problem: Loads unused data, couples unrelated commands, violates minimal state principle
|
|
614
|
-
|
|
615
|
-
CORRECT PATTERN:
|
|
616
|
-
ConfirmOrderState { status, orderId }
|
|
617
|
-
ShipOrderState { status, orderId, paymentId }
|
|
618
|
-
CancelOrderState { status, orderId, createdAt }
|
|
619
|
-
Each command loads ONLY what it needs.
|
|
620
|
-
```
|
|
621
|
-
|
|
622
378
|
## Key Principles
|
|
623
379
|
- Use **domain language**, not technical terms
|
|
624
380
|
- Focus on **what** happens, not **how** it's implemented
|
|
@@ -628,9 +384,8 @@ Each command loads ONLY what it needs.
|
|
|
628
384
|
- **Collaborative Process**: This is a group brainstorm, not a solo analysis
|
|
629
385
|
- **Rapid Iteration**: Capture quickly, refine later
|
|
630
386
|
- **Gentle Filtering**: Introduce "state-changing events" concept conversationally, not as rigid rule
|
|
631
|
-
- **Event Sourcing Mindset**: Think in terms of immutable events
|
|
632
|
-
- **Defer
|
|
633
|
-
- **Command State Isolation**: Each command handler has its own state shape. Different commands = different state interfaces.
|
|
387
|
+
- **Event Sourcing Mindset**: Think in terms of immutable events grouped by entity, not upfront attribute lists
|
|
388
|
+
- **Defer Detail**: Don't list all entity attributes upfront — commands, preconditions, and read models get worked out in the design step
|
|
634
389
|
|
|
635
390
|
## Best Practices for Requirements Analysis
|
|
636
391
|
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
# Brainstorming Events — curl Fallback Calls
|
|
2
|
+
|
|
3
|
+
Only needed when MCP is not connected. Every call below has an MCP equivalent in the main SKILL.md — always prefer that.
|
|
4
|
+
|
|
5
|
+
## Board Context — Check existing EVENT nodes
|
|
6
|
+
|
|
7
|
+
```bash
|
|
8
|
+
curl -s -H "x-token: $TOKEN" -H "x-board-id: $BOARD_ID" \
|
|
9
|
+
"$BASE_URL/api/org/$ORG_ID/boards/$BOARD_ID/nodes?type=EVENT"
|
|
10
|
+
```
|
|
11
|
+
|
|
12
|
+
## Board Context — Check existing CHAPTER nodes
|
|
13
|
+
|
|
14
|
+
```bash
|
|
15
|
+
curl -s -H "x-token: $TOKEN" -H "x-board-id: $BOARD_ID" \
|
|
16
|
+
"$BASE_URL/api/org/$ORG_ID/boards/$BOARD_ID/nodes?type=CHAPTER"
|
|
17
|
+
```
|
|
18
|
+
|
|
19
|
+
## Timeline Discovery — Step 2: Create one chapter per group — create the chapter
|
|
20
|
+
|
|
21
|
+
```bash
|
|
22
|
+
curl -s -X POST "$BASE_URL/api/org/$ORG_ID/boards/$BOARD_ID/chapters" \
|
|
23
|
+
-H "x-token: $TOKEN" -H "x-board-id: $BOARD_ID" \
|
|
24
|
+
-H "Content-Type: application/json" -d '{}'
|
|
25
|
+
# → { timelineId: "<chapterId>", ... }
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
## Timeline Discovery — Step 2: Create one chapter per group — set its title
|
|
29
|
+
|
|
30
|
+
```bash
|
|
31
|
+
curl -s -X POST "$BASE_URL/api/org/$ORG_ID/boards/$BOARD_ID/nodes/events" \
|
|
32
|
+
-H "x-token: $TOKEN" -H "x-board-id: $BOARD_ID" \
|
|
33
|
+
-H "x-user-id: brainstorming-events" -H "Content-Type: application/json" \
|
|
34
|
+
-d '[{
|
|
35
|
+
"id": "<uuid>",
|
|
36
|
+
"eventType": "node:changed",
|
|
37
|
+
"nodeId": "<chapterId>",
|
|
38
|
+
"boardId": "<boardId>",
|
|
39
|
+
"timestamp": 1234567890,
|
|
40
|
+
"meta": {"type": "CHAPTER", "title": "Reservation & Lending"}
|
|
41
|
+
}]'
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
## Timeline Discovery — Step 2: Reposition an existing chapter
|
|
45
|
+
|
|
46
|
+
```bash
|
|
47
|
+
curl -s -X PUT "$BASE_URL/api/org/$ORG_ID/boards/$BOARD_ID/timelines/$TL/position" \
|
|
48
|
+
-H "x-token: $TOKEN" -H "x-board-id: $BOARD_ID" \
|
|
49
|
+
-H "Content-Type: application/json" \
|
|
50
|
+
-d '{"x": 0, "y": 1200}' # first chapter: y=0, second: y=1200, third: y=2400, …
|
|
51
|
+
```
|
|
52
|
+
|
|
53
|
+
## Mode A — Step A: Ensure enough columns exist
|
|
54
|
+
|
|
55
|
+
No batch form exists over REST; one call per event:
|
|
56
|
+
|
|
57
|
+
```bash
|
|
58
|
+
curl -s -X POST "$BASE_URL/api/org/$ORG_ID/boards/$BOARD_ID/timelines/$CHAPTER_ID/columns" \
|
|
59
|
+
-H "x-token: $TOKEN" -H "x-board-id: $BOARD_ID" -H "x-user-id: brainstorming-events" \
|
|
60
|
+
-H "Content-Type: application/json" -d '{}'
|
|
61
|
+
# → { "columnId": "<colUuid>", "index": <n>, "totalColumns": <n> }
|
|
62
|
+
```
|
|
63
|
+
|
|
64
|
+
## Mode A — Step B: Fetch the chapter to find the swimlane row ID
|
|
65
|
+
|
|
66
|
+
```bash
|
|
67
|
+
curl -s -H "x-token: $TOKEN" -H "x-board-id: $BOARD_ID" \
|
|
68
|
+
"$BASE_URL/api/org/$ORG_ID/boards/$BOARD_ID/nodes/$CHAPTER_ID"
|
|
69
|
+
# → node.meta.timelineData.rows — find the row where type === "swimlane"
|
|
70
|
+
```
|
|
71
|
+
|
|
72
|
+
## Mode A — Step D: Create the event with cellId
|
|
73
|
+
|
|
74
|
+
Same body via `POST .../nodes/events`:
|
|
75
|
+
|
|
76
|
+
```json
|
|
77
|
+
[{
|
|
78
|
+
"id": "<event-uuid>",
|
|
79
|
+
"eventType": "node:created",
|
|
80
|
+
"nodeId": "<node-uuid>",
|
|
81
|
+
"boardId": "<boardId>",
|
|
82
|
+
"timestamp": 1234567890,
|
|
83
|
+
"chapterId": "<chapterId>",
|
|
84
|
+
"cellId": "<swimlaneRowId>-<columnId>",
|
|
85
|
+
"meta": {
|
|
86
|
+
"type": "EVENT",
|
|
87
|
+
"title": "BookReserved",
|
|
88
|
+
"fields": [
|
|
89
|
+
{"name": "reservationId", "type": "String", "example": "res-789"},
|
|
90
|
+
{"name": "copyId", "type": "String", "example": "copy-42"},
|
|
91
|
+
{"name": "memberId", "type": "String", "example": "mbr-101"},
|
|
92
|
+
{"name": "expiresAt", "type": "DateTime", "example": "2026-06-01T00:00:00Z"},
|
|
93
|
+
{"name": "reservedAt", "type": "DateTime", "example": "2026-05-29T10:00:00Z"}
|
|
94
|
+
]
|
|
95
|
+
}
|
|
96
|
+
}]
|
|
97
|
+
```
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
# Brainstorming Events — Worked Examples
|
|
2
|
+
|
|
3
|
+
These are conceptual worked examples of the reasoning this skill applies — useful for understanding the shape of a complete answer, but the actual mechanics are the numbered Workflow steps and board-placement rules in the main SKILL.md.
|
|
4
|
+
|
|
5
|
+
## Role Catalog (E-commerce domain)
|
|
6
|
+
|
|
7
|
+
A full worked Role Catalog, illustrating the level of detail expected for each human role and system actor (name, description, key actions, permission boundary; triggers and communication mechanism for system actors):
|
|
8
|
+
|
|
9
|
+
```text
|
|
10
|
+
## Role Catalog
|
|
11
|
+
|
|
12
|
+
### Human Roles
|
|
13
|
+
|
|
14
|
+
1. **Customer** - Description: End user who browses, purchases, and tracks orders
|
|
15
|
+
- Key actions: Create order, confirm order, cancel order, submit review
|
|
16
|
+
- Cannot: Manage inventory, process refunds, respond to reviews as seller
|
|
17
|
+
|
|
18
|
+
2. **Seller** - Description: Merchant who lists products and fulfills orders
|
|
19
|
+
- Key actions: List product, confirm stock, respond to reviews, update pricing
|
|
20
|
+
- Cannot: Place orders, approve own reviews, process payments
|
|
21
|
+
|
|
22
|
+
3. **Support Agent** - Description: Internal staff handling escalations and manual overrides
|
|
23
|
+
- Key actions: Override order status, issue refunds, flag reviews
|
|
24
|
+
- Cannot: Place orders on behalf of customers (unless impersonating)
|
|
25
|
+
|
|
26
|
+
### System Actors
|
|
27
|
+
|
|
28
|
+
1. **Payment Gateway** (external)
|
|
29
|
+
- Triggers: Payment authorization, payment failure, refund confirmation
|
|
30
|
+
- Communication: Webhooks
|
|
31
|
+
|
|
32
|
+
2. **Inventory System** (internal)
|
|
33
|
+
- Triggers: Reserve inventory, release reservation
|
|
34
|
+
- Communication: Event-driven
|
|
35
|
+
```
|