@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
@@ -50,18 +50,21 @@ No slice depends on another slice directly — only on the events it produces.
50
50
 
51
51
  ## Creating These Slices via the API
52
52
 
53
- ```bash
54
- curl -X POST $BASE_URL/api/org/$ORG_ID/boards/$BOARD_ID/timelines/$TL/slices \
55
- -H "x-token: $TOKEN" -H "Content-Type: application/json" \
56
- -d '{"type":"state-change","nodes":{"swimlane":{"title":"PlaceOrder"}}}'
53
+ These elements already exist on the timeline (from `spec-info`) — use `create_slice_definitions`/`slice-definitions`, which only adds a `SLICE_BORDER` to each column's existing element. Never use `create_slice`/the plain `/slices` endpoint here: that endpoint creates a brand-new column with its own nodes, which would duplicate the element already on the board.
57
54
 
58
- curl -X POST $BASE_URL/api/org/$ORG_ID/boards/$BOARD_ID/timelines/$TL/slices \
59
- -H "x-token: $TOKEN" -H "Content-Type: application/json" \
60
- -d '{"type":"state-view","nodes":{"swimlane":{"title":"OrderDetailView"}}}'
55
+ ```
56
+ mcp__eventmodelers__create_slice_definitions { "boardId": "<BOARD_ID>", "timelineId": "<TL>", "slices": [
57
+ { "columnId": "<placeOrderColumnId>", "title": "PlaceOrder" },
58
+ { "columnId": "<orderDetailViewColumnId>", "title": "OrderDetailView" },
59
+ { "columnId": "<reserveInventoryOnPaymentColumnId>", "title": "ReserveInventoryOnPayment" }
60
+ ] }
61
+ ```
61
62
 
62
- curl -X POST $BASE_URL/api/org/$ORG_ID/boards/$BOARD_ID/timelines/$TL/slices \
63
+ **Fallback (no MCP)** one call per column, the REST fallback has no batch form:
64
+ ```bash
65
+ curl -X POST $BASE_URL/api/org/$ORG_ID/boards/$BOARD_ID/timelines/$TL/slice-definitions \
63
66
  -H "x-token: $TOKEN" -H "Content-Type: application/json" \
64
- -d '{"type":"automation","nodes":{"swimlane":{"title":"ReserveInventoryOnPayment"}}}'
67
+ -d '{"columnId":"<placeOrderColumnId>","title":"PlaceOrder"}'
65
68
  ```
66
69
 
67
70
  ---
@@ -65,16 +65,7 @@ This is the most common dependency: nearly every state-view slice depends on the
65
65
 
66
66
  ### 1. One Element Per Slice
67
67
 
68
- ```
69
- CORRECT:
70
- Slice: PlaceOrder (state-change) — just the PlaceOrder command
71
- Slice: OrderDetailView (state-view) — just the OrderDetailView read model
72
-
73
- WRONG:
74
- Slice: "Order Management" containing the PlaceOrder command AND the OrderDetailView read model
75
- Problem: mixes a state-change and a state-view in one slice — the API models
76
- these as different slice types for a reason.
77
- ```
68
+ See the main SKILL.md's "Core Concept" section — never combine a COMMAND and a READMODEL into one slice, even under an inviting broader "feature" name.
78
69
 
79
70
  ### 2. Name the Slice After Its Element
80
71
 
@@ -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
20
  **When to Interview**: Skip if the user has already specified: existing UI patterns or mockups to reference, critical data fields, and UI/UX preferences. Interview when these details haven't been discussed or when the user wants guidance on storyboarding depth.
19
21
 
20
- **Interview Strategy**: Clarify UI needs, data priorities, and existing patterns to guide storyboard design. This ensures mockups capture all necessary fields without over-designing.
21
-
22
22
  ### Critical Questions
23
23
 
24
- When UI design guidance is needed:
25
-
26
24
  1. **Current UI State** (Impact: Determines if you're designing from scratch or enhancing existing)
27
25
  - Question: "Do you have: (A) Existing UI/wireframes to reference, (B) Rough sketches, (C) Starting from scratch?"
28
26
  - Why it matters: Existing UI provides constraints and patterns; starting fresh allows more design freedom
@@ -38,52 +36,7 @@ When UI design guidance is needed:
38
36
  - Why it matters: Platform and fidelity affect storyboard detail; mobile has different constraints than web
39
37
  - Follow-up triggers: If (C) → ask about prototype tool; if minimal → discuss what level of detail is enough
40
38
 
41
- ### Interview Flow
42
-
43
- **Conditional Entry**:
44
- ```
45
- If user has provided:
46
- - Existing UI patterns or references
47
- - AND identified critical data fields
48
- - AND specified storyboard detail level
49
-
50
- Then: Skip interview, proceed directly to storyboarding
51
-
52
- Else: Conduct interview
53
- ```
54
-
55
- **Phase 1: Context Assessment** (Questions 1-2)
56
- - Understand existing UI context
57
- - Identify data priorities
58
- - Establish storyboard scope
59
-
60
- **Phase 2: Design Guidance** (Question 3)
61
- - Determine platform and fidelity
62
- - Adjust storyboard detail accordingly
63
-
64
- ### Capturing Interview Findings
65
-
66
- Document findings to guide storyboard creation:
67
-
68
- ```markdown
69
- ## Interview Findings: [Domain Name] UI
70
-
71
- **Existing UI Context**: [Starting from scratch / Enhancing / Matching pattern]
72
- **Most Critical Data**: [List fields in priority order]
73
- **Platform**: [Web / Mobile / Both]
74
- **Storyboard Detail**: [Minimal wireframes / Detailed mockups]
75
-
76
- **Key UI Interactions**:
77
- - [Action 1]: [What data triggers it]
78
- - [Action 2]: [What data triggers it]
79
-
80
- **Storyboard Focus**:
81
- - Prioritize showing [most critical fields]
82
- - Ensure [specific interactions] are clear
83
- - Reference [existing patterns] for consistency
84
- ```
85
-
86
- Optional: Write to `.trogonai/interviews/[timestamp]-storyboarding-events.interview.internal.trogonai.md`.
39
+ Follow **`eventmodeling-interview-protocol`** to run this interview and record its findings — label this step "**3. Storyboarding** (`eventmodeling-storyboarding-events`)". Findings should cover: existing UI context, most critical data fields (priority order), platform and detail-level preferences, key UI interactions, and storyboard focus.
87
40
 
88
41
  ---
89
42
 
@@ -92,161 +45,22 @@ Optional: Write to `.trogonai/interviews/[timestamp]-storyboarding-events.interv
92
45
  Given the event timeline, create UI storyboards:
93
46
 
94
47
  ### 1. Identify UI Screens/Views
95
- Create a mockup for each state of the system:
96
-
97
- ```
98
- Screen 1: Order Creation Form
99
-
100
- Place Your Order
101
-
102
-
103
- Customer ID: [____________]
104
-
105
- Items:
106
- Product 1 Qty: [_] Price: $_
107
- Product 2 Qty: [_] Price: $_
108
- Product 3 Qty: [_] Price: $_
109
-
110
- Total: $___
111
-
112
- Shipping Address:
113
- [_____________________]
114
- [_____________________]
115
-
116
- [ Create Order ]
117
-
118
-
119
- Trigger: CreateOrder command
120
- Result Events: OrderCreated
121
- Data captured from UI:
122
- - customerId
123
- - items (products + quantities)
124
- - total
125
- - shippingAddress
126
- ```
48
+ Create a mockup for each state of the system: for each screen, note the trigger action, the command it produces, the resulting event, and the data fields the screen captures. A full worked example (Order Creation Form) is in `references/examples.md`.
127
49
 
128
50
  ### 2. Show State Transitions Between Screens
129
- Document what changes when events occur:
130
-
131
- ```
132
- Screen 2: Order Confirmation
133
- (After OrderCreated event)
134
-
135
-
136
- Order Confirmation
137
-
138
-
139
- Order ID: #12345
140
- Status: Draft
141
-
142
- Items: 3 products
143
- Total: $150.00
144
-
145
- Shipping: 123 Main St
146
-
147
- Payment Options:
148
- Credit Card
149
- Bank Transfer
150
-
151
- [ Confirm Order ]
152
-
153
-
154
- Trigger: ConfirmOrder command
155
- Result Events: OrderConfirmed
156
- Data from UI:
157
- - orderId (from OrderCreated)
158
- - paymentMethod
159
- ```
51
+ Document what changes when events occur: after each event, the next screen shows the fields that were just set by that event, alongside the next command the user can trigger. A full worked example (Order Confirmation, after OrderCreated) is in `references/examples.md`.
160
52
 
161
53
  ### 3. Document All Data Fields
162
- For each screen, list what data is displayed:
163
-
164
- ```
165
- Screen: Order Status View
166
-
167
- Your Order Status
168
-
169
- Order ID: #12345 (from OrderCreated)
170
- Status: Confirmed (from OrderConfirmed)
171
- Confirmed at: 2024-12-31 10:00 (from OrderConfirmed)
172
-
173
- Payment: Authorized (from PaymentAuthorized)
174
- Auth Code: AUTH-789 (from PaymentAuthorized)
175
-
176
- Inventory: Reserved (from InventoryReserved)
177
- Expected Ship: 2025-01-02 (from InventoryReserved)
178
-
179
- Shipped: Pending (awaiting OrderShipped)
180
- Tracking: -- (waiting for shipment)
181
-
182
-
183
- Fields and their origins:
184
- orderId → OrderCreated event
185
- status → OrderConfirmed event
186
- confirmedAt → OrderConfirmed event
187
- paymentStatus → PaymentAuthorized event
188
- authCode → PaymentAuthorized event
189
- inventoryStatus → InventoryReserved event
190
- expectedShip → InventoryReserved event
191
- tracking → OrderShipped event (when available)
192
- ```
54
+ For each screen, list what data is displayed, and the specific event each field's value originated from. A full worked example (Order Status View) is in `references/examples.md`.
193
55
 
194
56
  ### 4. Show Data Flow Through Screens
195
- Map how data enters/exits UI:
196
-
197
- ```
198
- Order Entry UI
199
- (user inputs)
200
- customerId
201
- items[]
202
- total
203
- shippingAddress
204
-
205
- Command: CreateOrder
206
-
207
- Event: OrderCreated
208
-
209
- Order Status UI (displays)
210
- orderId (from event)
211
- items (from event)
212
- total (from event)
213
- shippingAddress (from event)
214
- ```
57
+ Map how data enters/exits UI: user input flows into a command, the command produces an event, and the event's data flows back out into the next screen that displays it. A full worked example is in `references/examples.md`.
215
58
 
216
59
  ### 5. Organize Screens by Swimlane (Actor/System)
217
60
 
218
61
  **MANDATORY**: Use the **Role Catalog** from Step 1 (eventmodeling-brainstorming-events) as the source of swimlanes. Every human role in the catalog MUST have its own swimlane. Every system actor that has a UI or todo-list view gets a swimlane too — but this swimlane is narrative-only (see "Board Integration" below): system actors never get a physical actor lane of their own on the board, only human roles do.
219
62
 
220
- Group screens by who interacts with them:
221
-
222
- ```
223
- Swimlane: Customer (Human Role)
224
- Screen 1: Order Entry Form
225
- Screen 2: Order Confirmation
226
- Screen 3: Order Status View
227
- Screen 4: Tracking View
228
-
229
- Swimlane: Seller (Human Role)
230
- Screen 1: Order Fulfillment Dashboard
231
- Screen 2: Review Response Form
232
- Screen 3: Product Management
233
-
234
- Swimlane: Support Agent (Human Role)
235
- Screen 1: Escalation Queue
236
- Screen 2: Manual Override Panel
237
-
238
- Swimlane: Payment Processor (System Actor)
239
- Screen 1: Payment Verification (automated)
240
- Screen 2: Authorization Confirmation
241
-
242
- Swimlane: Inventory System (System Actor)
243
- Screen 1: Reservation Todo List (internal)
244
- Screen 2: Availability Check
245
-
246
- Swimlane: Fulfillment System (System Actor)
247
- Screen 1: Shipment Creation Todo
248
- Screen 2: Shipping Confirmation
249
- ```
63
+ Group screens by who interacts with them: one swimlane per human role (Customer, Seller, Support Agent, ...) listing that role's screens, plus one narrative swimlane per system actor (Payment Processor, Inventory System, ...) listing the screens/views it interacts with. A full worked example (Order domain swimlane grouping) is in `references/examples.md`.
250
64
 
251
65
  **Validation**: If a role from the catalog has zero screens, either:
252
66
  - The role is missing screens (add them), or
@@ -257,34 +71,7 @@ This shows which actors interact with which screens and helps visualize system b
257
71
  **This grouping is not just narrative for human roles** — "Board Integration" below turns each *human role's* swimlane in this catalog into its own physical actor lane on the board, so a screen's role determines which lane it is actually placed in, not just how it is described in the report. System actor swimlanes stay narrative-only: their automations are placed in the chapter's shared default actor lane, never a lane fabricated to mimic a human role's lane (see "Placing Automations" below).
258
72
 
259
73
  ### 6. Show Processor "Todo List" Pattern
260
- For automated processors, show the todo list metaphor:
261
-
262
- ```
263
- Processor: InventoryReserver
264
-
265
- Internal "Todo List" (based on received events):
266
-
267
- Inventory Reservation Todos
268
-
269
-
270
- Order-123: Reserve 2x Prod-1 (triggered by PaymentAuthorized)
271
- Order-124: Reserve 3x Prod-2 (triggered by PaymentAuthorized)
272
- Order-125: Reserve 1x Prod-3 (triggered by PaymentAuthorized)
273
-
274
- Processor checks todo items:
275
- For each: Check availability
276
- If available: Mark done
277
- Reserve inventory
278
- Produce event
279
-
280
-
281
-
282
- This todo list is driven by:
283
- Events received → Items added to todo
284
- Processor logic → Items processed
285
- Success → InventoryReserved event produced + todo marked done
286
- Failure → InventoryFailed event produced + todo marked failed
287
- ```
74
+ For automated processors, show the todo list metaphor: each received triggering event adds a todo item, the processor checks each item's condition, and success or failure produces a corresponding event while marking the item done or failed. A full worked example (InventoryReserver's todo list) is in `references/examples.md`.
288
75
 
289
76
  **When it comes time to elaborate scenarios for this todo list (`eventmodeling-elaborating-scenarios`), reach for a storyline rather than plain GWT scenarios.** A todo list is exactly the shape a storyline is built for: the *same* read model (the todo list itself) walked through multiple states — empty → item added → item marked done/failed — which is one narrated walkthrough, not a set of isolated before/after pairs. See that skill's "Storylines" section for the data shape and posting mechanics.
290
77
 
@@ -311,13 +98,7 @@ mcp__eventmodelers__get_nodes { "boardId": "$BOARD_ID", "type": "HTML_SCREEN" }
311
98
  mcp__eventmodelers__get_nodes { "boardId": "$BOARD_ID", "type": "SCREEN" }
312
99
  ```
313
100
 
314
- **Fallback (no MCP):**
315
- ```bash
316
- curl -s -H "x-token: $TOKEN" -H "x-board-id: $BOARD_ID" \
317
- "$BASE_URL/api/org/$ORG_ID/boards/$BOARD_ID/nodes?type=HTML_SCREEN"
318
- curl -s -H "x-token: $TOKEN" -H "x-board-id: $BOARD_ID" \
319
- "$BASE_URL/api/org/$ORG_ID/boards/$BOARD_ID/nodes?type=SCREEN"
320
- ```
101
+ **Fallback (no MCP):** see `references/api-fallback.md` — "Board Integration — Check existing screen nodes".
321
102
 
322
103
  After completing the screen analysis, use the `handle-comment` skill to post a QUESTION comment on any screen node where data fields are unclear or missing sources are identified.
323
104
 
@@ -327,17 +108,13 @@ After completing the screen analysis, use the `handle-comment` skill to post a Q
327
108
 
328
109
  1. Fetch the chapter and collect every row where `type === "actor"`, keyed by its `label`:
329
110
 
330
- **Prefer MCP:**
111
+ **Prefer MCP** — `projection: "cells"` returns just `{rows, columns, cells}`, not the whole chapter node:
331
112
  ```
332
- mcp__eventmodelers__get_node { "boardId": "$BOARD_ID", "nodeId": "$CHAPTER_ID" }
333
- # → meta.timelineData.rows — collect every row where type === "actor" into { label → rowId }
113
+ mcp__eventmodelers__get_node { "boardId": "$BOARD_ID", "nodeId": "$CHAPTER_ID", "projection": "cells" }
114
+ # → rows — collect every row where type === "actor" into { label → rowId }
334
115
  ```
335
116
 
336
- **Fallback (no MCP):**
337
- ```bash
338
- curl -s -H "x-token: $TOKEN" -H "x-board-id: $BOARD_ID" \
339
- "$BASE_URL/api/org/$ORG_ID/boards/$BOARD_ID/nodes/$CHAPTER_ID"
340
- ```
117
+ **Fallback (no MCP):** see `references/api-fallback.md` — "Resolve One Actor Lane Per Human Role — Step 1: Fetch the chapter's actor rows".
341
118
 
342
119
  2. For every **human role only** in the Role Catalog (Step 1's swimlane list above), check the map for a `label` that matches the role name (case-insensitive). If found, reuse that `rowId`. **Skip system actors/processors entirely** — do not create or look up a lane for them here; they never get an entry in this map.
343
120
 
@@ -348,13 +125,7 @@ After completing the screen analysis, use the `handle-comment` skill to post a Q
348
125
  mcp__eventmodelers__add_lane { "boardId": "$BOARD_ID", "timelineId": "$CHAPTER_ID", "type": "actor", "label": "<Role Name>" }
349
126
  ```
350
127
 
351
- **Fallback (no MCP):**
352
- ```bash
353
- curl -s -X POST "$BASE_URL/api/org/$ORG_ID/boards/$BOARD_ID/timelines/$CHAPTER_ID/lanes" \
354
- -H "x-token: $TOKEN" -H "x-board-id: $BOARD_ID" -H "x-user-id: storyboarding-events" \
355
- -H "Content-Type: application/json" \
356
- -d '{"type": "actor", "label": "<Role Name>"}'
357
- ```
128
+ **Fallback (no MCP):** see `references/api-fallback.md` — "Resolve One Actor Lane Per Human Role — Step 3: Create a new actor lane".
358
129
 
359
130
  Add the returned `rowId` to the map under that role's name. Do this once per role, not once per screen.
360
131
 
@@ -445,7 +216,7 @@ Every screen node requires rendered content. **HTML_SCREEN (via the `html-screen
445
216
 
446
217
  **Step A — Compute the cell ID.** This applies to SCREEN nodes (human roles only) — AUTOMATION nodes follow "Placing Automations" below instead. Screens go in **that screen's own role's actor lane** in their target column — look up `actorRowId` from the role→lane map built above, keyed by the screen's role (e.g. "Admin", "User"). Never fall back to "the" actor lane as if there were only one.
447
218
 
448
- 1. Determine the target column (same column as the event/command, OR one column to the right of the read model).
219
+ 1. Determine the target column (same column as the event/command for a command/input screen, OR the same column as the read model for a view/output screen — one column to the right only if that shared column isn't available).
449
220
  2. `actorRowId = roleLaneMap[<this screen's role>]` — the map was already resolved once for the whole chapter; do not re-fetch the chapter per screen. If this screen's role is genuinely new (wasn't in the original Role Catalog), resolve/create its lane now the same way (see above) and add it to the map before continuing.
450
221
  3. `cellId = actorRowId + "-" + columnId`
451
222
 
@@ -460,23 +231,16 @@ mcp__eventmodelers__create_screen {
460
231
  "chapterId": "<CHAPTER_ID>",
461
232
  "cellId": "<actorRowId>-<columnId>",
462
233
  "pages": ["<div>...</div>"],
463
- "description": "<concise description of what this screen shows>"
234
+ "description": "<concise description of what this screen shows>",
235
+ "fields": [ /* per "Mandatory Field Definitions" below — set in this same call */ ]
464
236
  }
465
237
  ```
466
238
 
467
- **Fallback (no MCP):**
468
- ```bash
469
- curl -s -X POST "$BASE_URL/api/org/$ORG_ID/boards/$BOARD_ID/html-screen-nodes/<node-uuid>" \
470
- -H "x-token: $TOKEN" -H "x-board-id: $BOARD_ID" -H "x-user-id: storyboarding-events" \
471
- -H "Content-Type: application/json" \
472
- -d '{
473
- "chapterId": "<CHAPTER_ID>",
474
- "cellId": "<actorRowId>-<columnId>",
475
- "pages": ["<div>...</div>"]
476
- }'
477
- ```
239
+ **Fallback (no MCP):** see `references/api-fallback.md` — "Mandatory Screen Rendering — Step B: Create the HTML_SCREEN node".
240
+
241
+ The MCP `create_screen` call above already sets `meta.fields` (per "Mandatory Field Definitions" below) in the same call — no separate `node:changed` follow-up needed when using MCP.
478
242
 
479
- Once the node is created, still set `meta.fields` on it (per "Mandatory Field Definitions" above) via `node:changed` `create_screen`/the HTML endpoint owns page content, not the field-lineage metadata.
243
+ A storyboard screen is placed at a *provisional* position — Steps 4 and 5 wire it to its COMMAND / READMODEL once those exist, and may move it first. Pass `autoConnect: false` on `create_screen` / `create_screens` here so the placement doesn't pre-wire the screen to whatever happens to sit in the adjacent column; the real `SCREEN → COMMAND` and `READMODEL → SCREEN` edges are created deliberately in Steps 4 and 5. When creating several screens whose HTML is already authored, use `create_screens` (batch) with `autoConnect: false`.
480
244
 
481
245
  Design the page(s) as real HTML/CSS, following the `html-screen` skill's guidance: write full-size markup (16px body text, generous padding — the canvas scales it down, don't shrink it yourself), one complete self-contained fragment per page (no `<html>`/`<head>`/`<body>` wrapper — the canvas adds those), no `<script>`/inline handlers (stripped server-side), and Bulma CSS classes (`title`, `button`, `is-primary`, `field`/`control`/`input`, etc. — remember heading size modifiers like `class="title is-1"`) since Bulma 0.9.4 is loaded by default. Every page MUST include real field labels matching the actual event/command fields this screen captures or displays, and at least one primary action (submit/confirm button) for command screens.
482
246
 
@@ -501,22 +265,7 @@ mcp__eventmodelers__submit_node_events {
501
265
  }
502
266
  ```
503
267
 
504
- **Fallback (no MCP):**
505
- ```bash
506
- curl -s -X POST "$BASE_URL/api/org/$ORG_ID/boards/$BOARD_ID/nodes/events" \
507
- -H "x-token: $TOKEN" -H "x-board-id: $BOARD_ID" -H "x-user-id: storyboarding-events" \
508
- -H "Content-Type: application/json" \
509
- -d '[{
510
- "id": "<event-uuid>",
511
- "eventType": "node:created",
512
- "nodeId": "<node-uuid>",
513
- "boardId": "<BOARD_ID>",
514
- "timestamp": 1234567890,
515
- "chapterId": "<CHAPTER_ID>",
516
- "cellId": "<actorRowId>-<columnId>",
517
- "meta": {"type": "SCREEN", "title": "<Screen Title>", "fields": [...]}
518
- }]'
519
- ```
268
+ **Fallback (no MCP):** see `references/api-fallback.md` — "Mandatory Screen Rendering — Step B (sketch path): Create the SCREEN node".
520
269
 
521
270
  **Step C (sketch path only) — Render the wireframe sketch immediately** (`POST /images/$NODE_ID/sketch`).
522
271
 
@@ -541,21 +290,7 @@ mcp__eventmodelers__render_screen {
541
290
  }
542
291
  ```
543
292
 
544
- **Fallback (no MCP):**
545
- ```bash
546
- curl -s -X POST "$BASE_URL/api/org/$ORG_ID/boards/$BOARD_ID/images/$NODE_ID/sketch" \
547
- -H "x-token: $TOKEN" -H "x-board-id: $BOARD_ID" -H "x-user-id: storyboarding-events" \
548
- -H "Content-Type: application/json" \
549
- -d '{
550
- "description": "<concise description of what this screen shows>",
551
- "elements": [
552
- {"type":"rectangle","gridX":0,"gridY":0,"gridWidth":50,"gridHeight":40,"fill":"white"},
553
- {"type":"rectangle","gridX":0,"gridY":0,"gridWidth":50,"gridHeight":3,"fill":"violet"},
554
- {"type":"headline","gridX":2,"gridY":1,"text":"Screen Title","fontSize":16,"fill":"white","gridWidth":46},
555
- ...more elements...
556
- ]
557
- }'
558
- ```
293
+ **Fallback (no MCP):** see `references/api-fallback.md` — "Mandatory Screen Rendering — Step C (sketch path): Render the wireframe sketch".
559
294
 
560
295
  Design each wireframe using the grid description language from the `storyboard-screen` skill (50×40 grid, 1 unit = 20 px):
561
296
 
@@ -587,17 +322,17 @@ When placing screens on the board, follow these alignment rules:
587
322
  | Screen type | Where it goes on the board |
588
323
  |-------------|---------------------------|
589
324
  | **Input/command screen** (triggers a command) | **The role's own actor lane, same column as the COMMAND and EVENT** it produces. The screen and command share a column — the screen sits in that role's actor lane, the command in the interaction row, the event in the swimlane row. |
590
- | **View/output screen** (displays a read model) | **The role's own actor lane, one column to the RIGHT of the READ MODEL** it displays. The read model occupies the interaction row of the preceding column; the screen gets its own column immediately after. This column is finalised in Step 5 (Identifying Outputs) — during storyboarding, just document which read model each view screen will query. |
325
+ | **View/output screen** (displays a read model) | **The role's own actor lane, the SAME column as the READ MODEL** it displays (READMODEL in the interaction row, screen in the actor row a downward connection, not a backward one). Only bumps one column to the right if that column's interaction row is already taken by something else. If the screen displays more than one read model, only the primary one shares its column every additional read model goes further left. This column is finalised in Step 5 (Identifying Outputs) — during storyboarding, just document which read model each view screen will query. |
591
326
 
592
- > **Do not create standalone screen columns that are disconnected from commands or read models.** Every screen must either share its column with the command it submits, or be placed one column to the right of the read model it displays.
327
+ > **Do not create standalone screen columns that are disconnected from commands or read models.** Every screen must either share its column with the command it submits, or share its column with the (primary) read model it displays.
593
328
 
594
329
  ### Multi-component screens are broken apart in Step 5, not here
595
330
 
596
- Storyboarding renders **one plain screen per screen state** — do not pre-split a screen into per-component copies here. Deciding how many components a view screen actually has, and breaking it apart into one highlighted copy per component, is `eventmodeling-identifying-outputs`'s job (its "Step 5a — Enumerate consumers and identify components" and "Step 5c — Break apart multi-component screens into copies"), because a component is defined by its read model and read models aren't designed until Step 5. During storyboarding, just place the single screen one column to the right of where its read model will end up (per the table above); document which read model it will query even before that read model exists.
331
+ Storyboarding renders **one plain screen per screen state** — do not pre-split a screen into per-component copies here. Deciding how many components a view screen actually has, and breaking it apart into one highlighted copy per component, is `eventmodeling-identifying-outputs`'s job (its "Step 5a — Enumerate consumers and identify components" and "Step 5c — Break apart multi-component screens into copies"), because a component is defined by its read model and read models aren't designed until Step 5. During storyboarding, just place the single screen in the same column where its read model will end up (per the table above); document which read model it will query even before that read model exists.
597
332
 
598
333
  ### Placing Automations
599
334
 
600
- When a processor or system actor reacts to events automatically (no human interaction), place an **AUTOMATION** node in the chapter's **default actor lane** instead of a SCREEN — never create, reuse, or look up a per-system-actor lane for it, and never resolve it through the human role→lane map above. Automations go in the same column as the COMMAND they trigger and the READMODEL that feeds them.
335
+ When a processor or system actor reacts to events automatically (no human interaction), place an **AUTOMATION** node in the chapter's **default actor lane** instead of a SCREEN — never create, reuse, or look up a per-system-actor lane for it, and never resolve it through the human role→lane map above. Automations go in the same column as the COMMAND they trigger. Unlike a view screen, an automation's READMODEL is never in that same column — the automation's own column already holds the COMMAND it issues (interaction row), so the read model that feeds it always goes one column to the left.
601
336
 
602
337
  **Do not design automation actor lanes to mimic human ones.** A "Payment Processor" or "Inventory System" swimlane in the narrative report (Step 5 above) is a documentation grouping only — it must never be materialized as its own labeled `actor`-type lane on the board. Only human roles get a physical lane; every automation, regardless of which system actor it narratively belongs to, renders in the same shared default actor lane.
603
338
 
@@ -639,95 +374,7 @@ If a second role also needs a screen related to the same event, insert a new col
639
374
 
640
375
  ## Output Format
641
376
 
642
- Present as:
643
-
644
- ```markdown
645
- # Storyboard: [Domain Name]
646
-
647
- ## Swimlane Organization (from Role Catalog)
648
-
649
- ### Human Role Swimlanes
650
-
651
- #### Customer Swimlane
652
- - Screen 1: Order Entry Form
653
- - Screen 2: Order Confirmation
654
- - Screen 3: Order Status View
655
-
656
- #### [Other Human Role Swimlanes — one per role in the catalog]
657
-
658
- ### System Actor Swimlanes
659
-
660
- _(Narrative grouping only — these are not physical board lanes. Every automation below renders in the chapter's shared default actor lane; see "Placing Automations".)_
661
-
662
- #### Payment Processor Swimlane
663
- - Screen 1: Payment Verification (automated)
664
- - [Shows what UI/views the processor interacts with]
665
-
666
- #### [Other System Actor Swimlanes]
667
-
668
- ---
669
-
670
- ## Screen 1: [Screen Name]
671
-
672
- ### Mockup
673
- ```
674
- [ASCII art mockup or description]
675
- ```
676
-
677
- ### Data Displayed
678
- - Field 1: Description, source event
679
- - Field 2: Description, source event
680
-
681
- ### User Actions (Commands)
682
- - Action: [Action], produces: [Event]
683
-
684
- ### Business Rules
685
- - Rule about what can/cannot be done on this screen
686
-
687
- ---
688
-
689
- ## Screen 2: [Screen Name]
690
-
691
- [Repeat for each screen]
692
-
693
- ---
694
-
695
- ## Processor Todo Lists
696
-
697
- ### Processor: [Processor Name]
698
-
699
- Internal "Todo List" pattern:
700
- ```
701
- Triggered by: [Event type]
702
- Todo action: [What needs to be done]
703
- Success produces: [Event]
704
- Failure produces: [Event]
705
- ```
706
-
707
- [Repeat for each processor]
708
-
709
- ---
710
-
711
- ## Data Flow Diagram
712
-
713
- [Show how data enters from UI and returns via events]
714
-
715
- ---
716
-
717
- ## Field Traceability Matrix
718
-
719
- | Field | Screen | Source Event | Status |
720
- |-------|--------|-------------|--------|
721
- | orderId | Status View | OrderCreated | |
722
- | shipmentId | Status View | OrderShipped | |
723
- | customerId | All | OrderCreated | |
724
-
725
- ---
726
-
727
- ## Missing Data Analysis
728
-
729
- [Any fields without clear source or destination]
730
- ```
377
+ Older versions of this skill wrote the storyboard as a markdown document (swimlane organization, one section per screen, processor todo lists, a field traceability matrix) rather than rendering and placing screen nodes on the board — that legacy template is kept in `references/examples.md` for reference only; it is not the actual output mechanism. The actual output is the rendered HTML_SCREEN/AUTOMATION nodes placed per "Mandatory Screen Rendering" and "Timeline Placement Rules" above.
731
378
 
732
379
  ## Quality Checklist
733
380
 
@@ -0,0 +1,77 @@
1
+ # Storyboarding 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 Integration — Check existing screen 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=HTML_SCREEN"
10
+ curl -s -H "x-token: $TOKEN" -H "x-board-id: $BOARD_ID" \
11
+ "$BASE_URL/api/org/$ORG_ID/boards/$BOARD_ID/nodes?type=SCREEN"
12
+ ```
13
+
14
+ ## Resolve One Actor Lane Per Human Role — Step 1: Fetch the chapter's actor rows
15
+
16
+ ```bash
17
+ curl -s -H "x-token: $TOKEN" -H "x-board-id: $BOARD_ID" \
18
+ "$BASE_URL/api/org/$ORG_ID/boards/$BOARD_ID/nodes/$CHAPTER_ID"
19
+ ```
20
+
21
+ ## Resolve One Actor Lane Per Human Role — Step 3: Create a new actor lane
22
+
23
+ ```bash
24
+ curl -s -X POST "$BASE_URL/api/org/$ORG_ID/boards/$BOARD_ID/timelines/$CHAPTER_ID/lanes" \
25
+ -H "x-token: $TOKEN" -H "x-board-id: $BOARD_ID" -H "x-user-id: storyboarding-events" \
26
+ -H "Content-Type: application/json" \
27
+ -d '{"type": "actor", "label": "<Role Name>"}'
28
+ ```
29
+
30
+ ## Mandatory Screen Rendering — Step B: Create the HTML_SCREEN node
31
+
32
+ ```bash
33
+ curl -s -X POST "$BASE_URL/api/org/$ORG_ID/boards/$BOARD_ID/html-screen-nodes/<node-uuid>" \
34
+ -H "x-token: $TOKEN" -H "x-board-id: $BOARD_ID" -H "x-user-id: storyboarding-events" \
35
+ -H "Content-Type: application/json" \
36
+ -d '{
37
+ "chapterId": "<CHAPTER_ID>",
38
+ "cellId": "<actorRowId>-<columnId>",
39
+ "pages": ["<div>...</div>"]
40
+ }'
41
+ ```
42
+ Then, over REST only (no `fields` param on the HTML-screen endpoint), still set `meta.fields` via a separate `node:changed` call.
43
+
44
+ ## Mandatory Screen Rendering — Step B (sketch path): Create the SCREEN node
45
+
46
+ ```bash
47
+ curl -s -X POST "$BASE_URL/api/org/$ORG_ID/boards/$BOARD_ID/nodes/events" \
48
+ -H "x-token: $TOKEN" -H "x-board-id: $BOARD_ID" -H "x-user-id: storyboarding-events" \
49
+ -H "Content-Type: application/json" \
50
+ -d '[{
51
+ "id": "<event-uuid>",
52
+ "eventType": "node:created",
53
+ "nodeId": "<node-uuid>",
54
+ "boardId": "<BOARD_ID>",
55
+ "timestamp": 1234567890,
56
+ "chapterId": "<CHAPTER_ID>",
57
+ "cellId": "<actorRowId>-<columnId>",
58
+ "meta": {"type": "SCREEN", "title": "<Screen Title>", "fields": [...]}
59
+ }]'
60
+ ```
61
+
62
+ ## Mandatory Screen Rendering — Step C (sketch path): Render the wireframe sketch
63
+
64
+ ```bash
65
+ curl -s -X POST "$BASE_URL/api/org/$ORG_ID/boards/$BOARD_ID/images/$NODE_ID/sketch" \
66
+ -H "x-token: $TOKEN" -H "x-board-id: $BOARD_ID" -H "x-user-id: storyboarding-events" \
67
+ -H "Content-Type: application/json" \
68
+ -d '{
69
+ "description": "<concise description of what this screen shows>",
70
+ "elements": [
71
+ {"type":"rectangle","gridX":0,"gridY":0,"gridWidth":50,"gridHeight":40,"fill":"white"},
72
+ {"type":"rectangle","gridX":0,"gridY":0,"gridWidth":50,"gridHeight":3,"fill":"violet"},
73
+ {"type":"headline","gridX":2,"gridY":1,"text":"Screen Title","fontSize":16,"fill":"white","gridWidth":46},
74
+ ...more elements...
75
+ ]
76
+ }'
77
+ ```