@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.
Files changed (69) hide show
  1. package/package.json +1 -1
  2. package/shared/skills/learn-eventmodelers-api/SKILL.md +12 -10
  3. package/stacks/modeling-kit/templates/.claude/skills/add-next-slice/SKILL.md +2 -23
  4. package/stacks/modeling-kit/templates/.claude/skills/add-next-slice/references/api-fallback.md +11 -0
  5. package/stacks/modeling-kit/templates/.claude/skills/analyze-existing-model/SKILL.md +6 -57
  6. package/stacks/modeling-kit/templates/.claude/skills/analyze-existing-model/references/api-fallback.md +68 -0
  7. package/stacks/modeling-kit/templates/.claude/skills/attributes/SKILL.md +4 -61
  8. package/stacks/modeling-kit/templates/.claude/skills/attributes/references/api-fallback.md +39 -0
  9. package/stacks/modeling-kit/templates/.claude/skills/discover-storyboard/SKILL.md +9 -53
  10. package/stacks/modeling-kit/templates/.claude/skills/discover-storyboard/references/api-fallback.md +63 -0
  11. package/stacks/modeling-kit/templates/.claude/skills/eventmodeling-applying-conways-law/SKILL.md +9 -319
  12. package/stacks/modeling-kit/templates/.claude/skills/eventmodeling-applying-conways-law/references/examples.md +329 -0
  13. package/stacks/modeling-kit/templates/.claude/skills/eventmodeling-brainstorming-events/SKILL.md +23 -199
  14. package/stacks/modeling-kit/templates/.claude/skills/eventmodeling-brainstorming-events/references/api-fallback.md +97 -0
  15. package/stacks/modeling-kit/templates/.claude/skills/eventmodeling-brainstorming-events/references/examples.md +35 -0
  16. package/stacks/modeling-kit/templates/.claude/skills/eventmodeling-checking-completeness/SKILL.md +13 -410
  17. package/stacks/modeling-kit/templates/.claude/skills/eventmodeling-checking-completeness/references/api-fallback.md +22 -0
  18. package/stacks/modeling-kit/templates/.claude/skills/eventmodeling-checking-completeness/references/examples.md +397 -0
  19. package/stacks/modeling-kit/templates/.claude/skills/eventmodeling-designing-automation-chains/SKILL.md +132 -0
  20. package/stacks/modeling-kit/templates/.claude/skills/eventmodeling-designing-automation-chains/references/api-fallback.md +21 -0
  21. package/stacks/modeling-kit/templates/.claude/skills/eventmodeling-designing-event-models/SKILL.md +9 -236
  22. package/stacks/modeling-kit/templates/.claude/skills/eventmodeling-designing-event-models/references/examples.md +257 -0
  23. package/stacks/modeling-kit/templates/.claude/skills/eventmodeling-elaborating-scenarios/SKILL.md +28 -302
  24. package/stacks/modeling-kit/templates/.claude/skills/eventmodeling-elaborating-scenarios/references/api-fallback.md +31 -0
  25. package/stacks/modeling-kit/templates/.claude/skills/eventmodeling-elaborating-scenarios/references/examples.md +216 -0
  26. package/stacks/modeling-kit/templates/.claude/skills/eventmodeling-identifying-inputs/SKILL.md +30 -343
  27. package/stacks/modeling-kit/templates/.claude/skills/eventmodeling-identifying-inputs/references/api-fallback.md +79 -0
  28. package/stacks/modeling-kit/templates/.claude/skills/eventmodeling-identifying-inputs/references/examples.md +282 -0
  29. package/stacks/modeling-kit/templates/.claude/skills/eventmodeling-identifying-outputs/SKILL.md +51 -400
  30. package/stacks/modeling-kit/templates/.claude/skills/eventmodeling-identifying-outputs/references/api-fallback.md +67 -0
  31. package/stacks/modeling-kit/templates/.claude/skills/eventmodeling-identifying-outputs/references/examples.md +273 -0
  32. package/stacks/modeling-kit/templates/.claude/skills/eventmodeling-optimizing-stream-design/SKILL.md +45 -152
  33. package/stacks/modeling-kit/templates/.claude/skills/eventmodeling-optimizing-stream-design/references/domain-patterns.md +49 -90
  34. package/stacks/modeling-kit/templates/.claude/skills/eventmodeling-optimizing-stream-design/references/patterns.md +64 -137
  35. package/stacks/modeling-kit/templates/.claude/skills/eventmodeling-orchestrating-event-modeling/SKILL.md +74 -65
  36. package/stacks/modeling-kit/templates/.claude/skills/eventmodeling-orchestrating-event-modeling/references/api-fallback.md +51 -0
  37. package/stacks/modeling-kit/templates/.claude/skills/eventmodeling-plotting-events/SKILL.md +1 -5
  38. package/stacks/modeling-kit/templates/.claude/skills/eventmodeling-plotting-events/references/api-fallback.md +10 -0
  39. package/stacks/modeling-kit/templates/.claude/skills/eventmodeling-slicing-event-models/SKILL.md +19 -36
  40. package/stacks/modeling-kit/templates/.claude/skills/eventmodeling-slicing-event-models/references/api-fallback.md +41 -0
  41. package/stacks/modeling-kit/templates/.claude/skills/eventmodeling-slicing-event-models/references/examples.md +12 -9
  42. package/stacks/modeling-kit/templates/.claude/skills/eventmodeling-slicing-event-models/references/patterns.md +1 -10
  43. package/stacks/modeling-kit/templates/.claude/skills/eventmodeling-storyboarding-events/SKILL.md +26 -332
  44. package/stacks/modeling-kit/templates/.claude/skills/eventmodeling-storyboarding-events/references/api-fallback.md +77 -0
  45. package/stacks/modeling-kit/templates/.claude/skills/eventmodeling-storyboarding-events/references/examples.md +271 -0
  46. package/stacks/modeling-kit/templates/.claude/skills/eventmodeling-translating-external-events/SKILL.md +9 -294
  47. package/stacks/modeling-kit/templates/.claude/skills/eventmodeling-translating-external-events/references/examples.md +306 -0
  48. package/stacks/modeling-kit/templates/.claude/skills/eventmodeling-validating-event-models/SKILL.md +12 -11
  49. package/stacks/modeling-kit/templates/.claude/skills/eventmodeling-validating-event-models/references/api-fallback.md +14 -0
  50. package/stacks/modeling-kit/templates/.claude/skills/eventmodeling-validating-event-models-checklist/SKILL.md +6 -36
  51. package/stacks/modeling-kit/templates/.claude/skills/eventmodeling-validating-event-models-checklist/references/api-fallback.md +14 -0
  52. package/stacks/modeling-kit/templates/.claude/skills/examples/SKILL.md +3 -110
  53. package/stacks/modeling-kit/templates/.claude/skills/examples/references/api-fallback.md +118 -0
  54. package/stacks/modeling-kit/templates/.claude/skills/handle-comment/SKILL.md +5 -25
  55. package/stacks/modeling-kit/templates/.claude/skills/handle-comment/references/api-fallback.md +35 -0
  56. package/stacks/modeling-kit/templates/.claude/skills/html-screen/SKILL.md +9 -44
  57. package/stacks/modeling-kit/templates/.claude/skills/html-screen/references/api-fallback.md +51 -0
  58. package/stacks/modeling-kit/templates/.claude/skills/place-element/SKILL.md +23 -183
  59. package/stacks/modeling-kit/templates/.claude/skills/place-element/references/api-fallback.md +193 -0
  60. package/stacks/modeling-kit/templates/.claude/skills/storyboard/SKILL.md +14 -81
  61. package/stacks/modeling-kit/templates/.claude/skills/storyboard/references/api-fallback.md +74 -0
  62. package/stacks/modeling-kit/templates/.claude/skills/storyboard-screen/SKILL.md +4 -45
  63. package/stacks/modeling-kit/templates/.claude/skills/storyboard-screen/references/api-fallback.md +44 -0
  64. package/stacks/modeling-kit/templates/.claude/skills/timeline/SKILL.md +19 -88
  65. package/stacks/modeling-kit/templates/.claude/skills/timeline/references/api-fallback.md +91 -0
  66. package/stacks/modeling-kit/templates/.claude/skills/update-prompt-status/SKILL.md +1 -9
  67. package/stacks/modeling-kit/templates/.claude/skills/update-prompt-status/references/api-fallback.md +14 -0
  68. package/stacks/modeling-kit/templates/.claude/skills/eventmodeling-integrating-legacy-systems/SKILL.md +0 -674
  69. package/stacks/modeling-kit/templates/.claude/skills/eventmodeling-optimizing-stream-design/references/snapshotting.md +0 -204
@@ -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
- For each event:
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) — same body via `POST .../nodes/events`:**
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-identifying-outputs` Step 5b). 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 5b covers the full two-automation chain).
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. The facilitator guides participants to envision the system and extract events rapidly.
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
- ```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
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
- **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
- ```
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
+ ```