@eventmodelers/cli 1.0.36 → 1.0.37
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 +12 -10
- 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 +9 -319
- 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 +23 -199
- 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 +13 -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-designing-automation-chains/SKILL.md +132 -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 +9 -236
- package/stacks/modeling-kit/templates/.claude/skills/eventmodeling-designing-event-models/references/examples.md +257 -0
- package/stacks/modeling-kit/templates/.claude/skills/eventmodeling-elaborating-scenarios/SKILL.md +28 -302
- 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 +30 -343
- 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 +51 -400
- 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-optimizing-stream-design/SKILL.md +45 -152
- package/stacks/modeling-kit/templates/.claude/skills/eventmodeling-optimizing-stream-design/references/domain-patterns.md +49 -90
- package/stacks/modeling-kit/templates/.claude/skills/eventmodeling-optimizing-stream-design/references/patterns.md +64 -137
- package/stacks/modeling-kit/templates/.claude/skills/eventmodeling-orchestrating-event-modeling/SKILL.md +74 -65
- 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 +1 -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 +19 -36
- 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 +26 -332
- 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 +9 -294
- 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 +12 -11
- 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 +6 -36
- 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 +23 -183
- package/stacks/modeling-kit/templates/.claude/skills/place-element/references/api-fallback.md +193 -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
|
@@ -125,11 +125,7 @@ Before brainstorming, check for EVENT nodes already on the board to avoid duplic
|
|
|
125
125
|
mcp__eventmodelers__get_nodes { "boardId": "<BOARD_ID>", "type": "EVENT" }
|
|
126
126
|
```
|
|
127
127
|
|
|
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
|
-
```
|
|
128
|
+
**Fallback (no MCP):** see `references/api-fallback.md` — "Board Context — Check existing EVENT nodes".
|
|
133
129
|
|
|
134
130
|
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
131
|
|
|
@@ -138,11 +134,7 @@ If events already exist, treat them as the starting list and focus on discoverin
|
|
|
138
134
|
mcp__eventmodelers__get_nodes { "boardId": "<BOARD_ID>", "type": "CHAPTER" }
|
|
139
135
|
```
|
|
140
136
|
|
|
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
|
-
```
|
|
137
|
+
**Fallback (no MCP):** see `references/api-fallback.md` — "Board Context — Check existing CHAPTER nodes".
|
|
146
138
|
|
|
147
139
|
## Timeline Discovery (Mandatory Before Placing Any Event)
|
|
148
140
|
|
|
@@ -163,17 +155,11 @@ For each group, create a chapter on the board **before placing any events**. Reu
|
|
|
163
155
|
|
|
164
156
|
**Prefer MCP — create a chapter:**
|
|
165
157
|
```
|
|
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>", ... }
|
|
158
|
+
mcp__eventmodelers__create_chapter { "boardId": "<BOARD_ID>", "x": 0, "y": 1200, "columns": <numberOfEventsInGroup> }
|
|
176
159
|
```
|
|
160
|
+
(`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.)
|
|
161
|
+
|
|
162
|
+
**Fallback (no MCP):** see `references/api-fallback.md` — "Timeline Discovery — Step 2: Create one chapter per group — create the chapter".
|
|
177
163
|
|
|
178
164
|
**Immediately set its title** (use the workflow / bounded-context name):
|
|
179
165
|
|
|
@@ -192,20 +178,7 @@ mcp__eventmodelers__submit_node_events {
|
|
|
192
178
|
}
|
|
193
179
|
```
|
|
194
180
|
|
|
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
|
-
```
|
|
181
|
+
**Fallback (no MCP):** see `references/api-fallback.md` — "Timeline Discovery — Step 2: Create one chapter per group — set its title".
|
|
209
182
|
|
|
210
183
|
**Stack timelines vertically so they do not overlap, and in general place new chapters close to existing ones they relate to.**
|
|
211
184
|
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 +188,7 @@ After creating each chapter, position it below the previous one. Use `y = index
|
|
|
215
188
|
mcp__eventmodelers__move_timeline_position { "boardId": "<BOARD_ID>", "timelineId": "<TL>", "x": 0, "y": 1200 }
|
|
216
189
|
```
|
|
217
190
|
|
|
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
|
-
```
|
|
191
|
+
**Fallback (no MCP):** see `references/api-fallback.md` — "Timeline Discovery — Step 2: Reposition an existing chapter".
|
|
225
192
|
|
|
226
193
|
Record the mapping: `workflow name → chapterId`. Every subsequent event placement will reference this ID.
|
|
227
194
|
|
|
@@ -265,38 +232,27 @@ Brainstorming events has two modes. Choose based on whether the chapter (timelin
|
|
|
265
232
|
|
|
266
233
|
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
234
|
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
**Step A — Create a column** (append at end of the chapter):
|
|
235
|
+
**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
236
|
|
|
272
237
|
**Prefer MCP:**
|
|
273
238
|
```
|
|
274
|
-
mcp__eventmodelers__add_column { "boardId": "<BOARD_ID>", "timelineId": "<CHAPTER_ID>" }
|
|
239
|
+
mcp__eventmodelers__add_column { "boardId": "<BOARD_ID>", "timelineId": "<CHAPTER_ID>", "count": <numberOfEvents> }
|
|
240
|
+
# → { "columnId": "<firstColUuid>", "index": <n>, "totalColumns": <n>, "columnIds": ["<col1>", "<col2>", ...] }
|
|
275
241
|
```
|
|
242
|
+
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
243
|
|
|
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
|
-
```
|
|
244
|
+
**Fallback (no MCP):** see `references/api-fallback.md` — "Mode A — Step A: Ensure enough columns exist".
|
|
284
245
|
|
|
285
246
|
**Step B — Fetch the chapter to find the swimlane row ID** (only needed once per chapter):
|
|
286
247
|
|
|
287
|
-
**Prefer MCP
|
|
248
|
+
**Prefer MCP** — `projection: "cells"` returns just `{rows, columns, cells}`, not the whole chapter node:
|
|
288
249
|
```
|
|
289
|
-
mcp__eventmodelers__get_node { "boardId": "<BOARD_ID>", "nodeId": "<CHAPTER_ID>" }
|
|
250
|
+
mcp__eventmodelers__get_node { "boardId": "<BOARD_ID>", "nodeId": "<CHAPTER_ID>", "projection": "cells" }
|
|
290
251
|
```
|
|
291
252
|
|
|
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
|
-
```
|
|
253
|
+
**Fallback (no MCP):** see `references/api-fallback.md` — "Mode A — Step B: Fetch the chapter to find the swimlane row ID".
|
|
298
254
|
|
|
299
|
-
**Step C — Compute:** `cellId = swimlaneRow.id + "-" + columnId`
|
|
255
|
+
**Step C — Compute, for the i-th event:** `cellId = swimlaneRow.id + "-" + columnIds[i]` (or the single `columnId` if only one column was created)
|
|
300
256
|
|
|
301
257
|
**Step D — Create the event with `cellId`.**
|
|
302
258
|
|
|
@@ -327,29 +283,7 @@ mcp__eventmodelers__submit_node_events {
|
|
|
327
283
|
}
|
|
328
284
|
```
|
|
329
285
|
|
|
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
|
-
```
|
|
286
|
+
**Fallback (no MCP):** see `references/api-fallback.md` — "Mode A — Step D: Create the event with cellId".
|
|
353
287
|
|
|
354
288
|
> **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
289
|
|
|
@@ -370,7 +304,7 @@ An event left without a chapter and cell reference will never appear in any time
|
|
|
370
304
|
|
|
371
305
|
**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
306
|
|
|
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-
|
|
307
|
+
**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 (Step 4b covers the full two-automation chain).
|
|
374
308
|
|
|
375
309
|
**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
310
|
|
|
@@ -382,78 +316,9 @@ An event left without a chapter and cell reference will never appear in any time
|
|
|
382
316
|
|
|
383
317
|
## Workshop Facilitation Guide
|
|
384
318
|
|
|
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:
|
|
319
|
+
**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.
|
|
413
320
|
|
|
414
|
-
|
|
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
|
|
452
|
-
|
|
453
|
-
**Capture the "why"**:
|
|
454
|
-
- Don't just list events, capture context
|
|
455
|
-
- Why would this event matter?
|
|
456
|
-
- Who cares about it? (Other systems, views, business rules)
|
|
321
|
+
**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
322
|
|
|
458
323
|
## Workflow
|
|
459
324
|
|
|
@@ -473,35 +338,7 @@ For each role/actor, document:
|
|
|
473
338
|
- **Key actions**: What state changes can this role initiate?
|
|
474
339
|
- **Permissions boundary**: What can this role NOT do?
|
|
475
340
|
|
|
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
|
-
```
|
|
341
|
+
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
342
|
|
|
506
343
|
This catalog feeds directly into:
|
|
507
344
|
- **Step 3 (Storyboarding)**: One actor lane per human role (not a swimlane — see Swimlane Rules above)
|
|
@@ -604,20 +441,7 @@ Present analysis in a clear markdown structure that can be directly used by the
|
|
|
604
441
|
|
|
605
442
|
## Core Architectural Rule
|
|
606
443
|
|
|
607
|
-
|
|
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
|
-
```
|
|
444
|
+
**NEVER use a DDD Aggregate pattern for state design** — every command handler must have its own minimal state projection derived from events. This is non-negotiable. See `eventmodeling-designing-event-models`'s "Core Architectural Rule" for the full anti-pattern/correct-pattern worked example (`OrderAggregate` vs. per-command state) — the rule applies from this very first step, not just once design begins.
|
|
621
445
|
|
|
622
446
|
## Key Principles
|
|
623
447
|
- Use **domain language**, not technical terms
|
|
@@ -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
|
+
```
|