@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.
Files changed (71) hide show
  1. package/package.json +1 -1
  2. package/shared/skills/learn-eventmodelers-api/SKILL.md +22 -13
  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 +12 -380
  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 +45 -290
  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 +15 -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-core-rules/SKILL.md +182 -0
  20. package/stacks/modeling-kit/templates/.claude/skills/eventmodeling-designing-automation-chains/SKILL.md +148 -0
  21. package/stacks/modeling-kit/templates/.claude/skills/eventmodeling-designing-automation-chains/references/api-fallback.md +21 -0
  22. package/stacks/modeling-kit/templates/.claude/skills/eventmodeling-designing-event-models/SKILL.md +48 -448
  23. package/stacks/modeling-kit/templates/.claude/skills/eventmodeling-designing-event-models/references/examples.md +167 -0
  24. package/stacks/modeling-kit/templates/.claude/skills/eventmodeling-elaborating-scenarios/SKILL.md +31 -380
  25. package/stacks/modeling-kit/templates/.claude/skills/eventmodeling-elaborating-scenarios/references/api-fallback.md +31 -0
  26. package/stacks/modeling-kit/templates/.claude/skills/eventmodeling-elaborating-scenarios/references/examples.md +216 -0
  27. package/stacks/modeling-kit/templates/.claude/skills/eventmodeling-identifying-inputs/SKILL.md +33 -393
  28. package/stacks/modeling-kit/templates/.claude/skills/eventmodeling-identifying-inputs/references/api-fallback.md +79 -0
  29. package/stacks/modeling-kit/templates/.claude/skills/eventmodeling-identifying-inputs/references/examples.md +282 -0
  30. package/stacks/modeling-kit/templates/.claude/skills/eventmodeling-identifying-outputs/SKILL.md +54 -454
  31. package/stacks/modeling-kit/templates/.claude/skills/eventmodeling-identifying-outputs/references/api-fallback.md +67 -0
  32. package/stacks/modeling-kit/templates/.claude/skills/eventmodeling-identifying-outputs/references/examples.md +273 -0
  33. package/stacks/modeling-kit/templates/.claude/skills/eventmodeling-interview-protocol/SKILL.md +31 -0
  34. package/stacks/modeling-kit/templates/.claude/skills/eventmodeling-optimizing-stream-design/SKILL.md +37 -184
  35. package/stacks/modeling-kit/templates/.claude/skills/eventmodeling-optimizing-stream-design/references/domain-patterns.md +58 -99
  36. package/stacks/modeling-kit/templates/.claude/skills/eventmodeling-optimizing-stream-design/references/patterns.md +82 -163
  37. package/stacks/modeling-kit/templates/.claude/skills/eventmodeling-orchestrating-event-modeling/SKILL.md +86 -78
  38. package/stacks/modeling-kit/templates/.claude/skills/eventmodeling-orchestrating-event-modeling/references/api-fallback.md +51 -0
  39. package/stacks/modeling-kit/templates/.claude/skills/eventmodeling-plotting-events/SKILL.md +5 -5
  40. package/stacks/modeling-kit/templates/.claude/skills/eventmodeling-plotting-events/references/api-fallback.md +10 -0
  41. package/stacks/modeling-kit/templates/.claude/skills/eventmodeling-slicing-event-models/SKILL.md +22 -51
  42. package/stacks/modeling-kit/templates/.claude/skills/eventmodeling-slicing-event-models/references/api-fallback.md +41 -0
  43. package/stacks/modeling-kit/templates/.claude/skills/eventmodeling-slicing-event-models/references/examples.md +12 -9
  44. package/stacks/modeling-kit/templates/.claude/skills/eventmodeling-slicing-event-models/references/patterns.md +1 -10
  45. package/stacks/modeling-kit/templates/.claude/skills/eventmodeling-storyboarding-events/SKILL.md +29 -382
  46. package/stacks/modeling-kit/templates/.claude/skills/eventmodeling-storyboarding-events/references/api-fallback.md +77 -0
  47. package/stacks/modeling-kit/templates/.claude/skills/eventmodeling-storyboarding-events/references/examples.md +271 -0
  48. package/stacks/modeling-kit/templates/.claude/skills/eventmodeling-translating-external-events/SKILL.md +12 -349
  49. package/stacks/modeling-kit/templates/.claude/skills/eventmodeling-translating-external-events/references/examples.md +306 -0
  50. package/stacks/modeling-kit/templates/.claude/skills/eventmodeling-validating-event-models/SKILL.md +69 -107
  51. package/stacks/modeling-kit/templates/.claude/skills/eventmodeling-validating-event-models/references/api-fallback.md +14 -0
  52. package/stacks/modeling-kit/templates/.claude/skills/eventmodeling-validating-event-models-checklist/SKILL.md +75 -160
  53. package/stacks/modeling-kit/templates/.claude/skills/eventmodeling-validating-event-models-checklist/references/api-fallback.md +14 -0
  54. package/stacks/modeling-kit/templates/.claude/skills/examples/SKILL.md +3 -110
  55. package/stacks/modeling-kit/templates/.claude/skills/examples/references/api-fallback.md +118 -0
  56. package/stacks/modeling-kit/templates/.claude/skills/handle-comment/SKILL.md +5 -25
  57. package/stacks/modeling-kit/templates/.claude/skills/handle-comment/references/api-fallback.md +35 -0
  58. package/stacks/modeling-kit/templates/.claude/skills/html-screen/SKILL.md +9 -44
  59. package/stacks/modeling-kit/templates/.claude/skills/html-screen/references/api-fallback.md +51 -0
  60. package/stacks/modeling-kit/templates/.claude/skills/place-element/SKILL.md +34 -180
  61. package/stacks/modeling-kit/templates/.claude/skills/place-element/references/api-fallback.md +203 -0
  62. package/stacks/modeling-kit/templates/.claude/skills/storyboard/SKILL.md +14 -81
  63. package/stacks/modeling-kit/templates/.claude/skills/storyboard/references/api-fallback.md +74 -0
  64. package/stacks/modeling-kit/templates/.claude/skills/storyboard-screen/SKILL.md +4 -45
  65. package/stacks/modeling-kit/templates/.claude/skills/storyboard-screen/references/api-fallback.md +44 -0
  66. package/stacks/modeling-kit/templates/.claude/skills/timeline/SKILL.md +19 -88
  67. package/stacks/modeling-kit/templates/.claude/skills/timeline/references/api-fallback.md +91 -0
  68. package/stacks/modeling-kit/templates/.claude/skills/update-prompt-status/SKILL.md +1 -9
  69. package/stacks/modeling-kit/templates/.claude/skills/update-prompt-status/references/api-fallback.md +14 -0
  70. package/stacks/modeling-kit/templates/.claude/skills/eventmodeling-integrating-legacy-systems/SKILL.md +0 -674
  71. package/stacks/modeling-kit/templates/.claude/skills/eventmodeling-optimizing-stream-design/references/snapshotting.md +0 -204
@@ -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 when domain expertise is uncertain.
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
- ### Interview Flow
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
- For each event:
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) — 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
- ```
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-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).
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. 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:
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
- **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)
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 Event Streams (Stream Roots)
513
- Identify the main entities that will have event streams. These are NOT DDD aggregates—they're simply the logical roots of events:
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 stream root, note:
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 (we'll define state needs per command, not upfront)
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
- ## Event Streams (Stream Roots)
577
- List each stream root and its identity:
578
- - **Stream**: Review (Identity: reviewId)
579
- - **Stream**: SellerResponse (Identity: responseId)
580
- - **Stream**: Seller (Identity: sellerId)
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. The STATE needed for each command will be determined later—not all stream attributes are needed for all commands.
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 and stream roots, NOT DDD aggregates. The stream root is just a logical grouping of events; state is minimal and command-specific.
632
- - **Defer State Design**: Don't list all entity attributes upfront. In the model designer step, we'll define minimal state projections needed for each specific command.
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
+ ```