@eventmodelers/cli 1.0.37 → 1.0.39

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 (27) hide show
  1. package/package.json +1 -1
  2. package/shared/skills/learn-eventmodelers-api/SKILL.md +10 -3
  3. package/stacks/modeling-kit/templates/.claude/skills/analyze-existing-model/SKILL.md +16 -0
  4. package/stacks/modeling-kit/templates/.claude/skills/eventmodeling-applying-conways-law/SKILL.md +3 -61
  5. package/stacks/modeling-kit/templates/.claude/skills/eventmodeling-brainstorming-events/SKILL.md +24 -93
  6. package/stacks/modeling-kit/templates/.claude/skills/eventmodeling-checking-completeness/SKILL.md +2 -0
  7. package/stacks/modeling-kit/templates/.claude/skills/eventmodeling-core-rules/SKILL.md +192 -0
  8. package/stacks/modeling-kit/templates/.claude/skills/eventmodeling-designing-automation-chains/SKILL.md +23 -7
  9. package/stacks/modeling-kit/templates/.claude/skills/eventmodeling-designing-event-models/SKILL.md +50 -223
  10. package/stacks/modeling-kit/templates/.claude/skills/eventmodeling-designing-event-models/references/examples.md +30 -120
  11. package/stacks/modeling-kit/templates/.claude/skills/eventmodeling-elaborating-scenarios/SKILL.md +3 -78
  12. package/stacks/modeling-kit/templates/.claude/skills/eventmodeling-identifying-inputs/SKILL.md +3 -50
  13. package/stacks/modeling-kit/templates/.claude/skills/eventmodeling-identifying-outputs/SKILL.md +3 -54
  14. package/stacks/modeling-kit/templates/.claude/skills/eventmodeling-interview-protocol/SKILL.md +31 -0
  15. package/stacks/modeling-kit/templates/.claude/skills/eventmodeling-optimizing-stream-design/SKILL.md +27 -67
  16. package/stacks/modeling-kit/templates/.claude/skills/eventmodeling-optimizing-stream-design/references/domain-patterns.md +15 -15
  17. package/stacks/modeling-kit/templates/.claude/skills/eventmodeling-optimizing-stream-design/references/patterns.md +44 -52
  18. package/stacks/modeling-kit/templates/.claude/skills/eventmodeling-orchestrating-event-modeling/SKILL.md +14 -15
  19. package/stacks/modeling-kit/templates/.claude/skills/eventmodeling-plotting-events/SKILL.md +4 -0
  20. package/stacks/modeling-kit/templates/.claude/skills/eventmodeling-slicing-event-models/SKILL.md +3 -15
  21. package/stacks/modeling-kit/templates/.claude/skills/eventmodeling-storyboarding-events/SKILL.md +3 -50
  22. package/stacks/modeling-kit/templates/.claude/skills/eventmodeling-translating-external-events/SKILL.md +4 -56
  23. package/stacks/modeling-kit/templates/.claude/skills/eventmodeling-validating-event-models/SKILL.md +58 -97
  24. package/stacks/modeling-kit/templates/.claude/skills/eventmodeling-validating-event-models-checklist/SKILL.md +84 -118
  25. package/stacks/modeling-kit/templates/.claude/skills/place-element/SKILL.md +15 -1
  26. package/stacks/modeling-kit/templates/.claude/skills/place-element/references/api-fallback.md +11 -1
  27. package/stacks/modeling-kit/templates/.claude/skills/wdyt/SKILL.md +8 -6
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: eventmodeling-validating-event-models-checklist
3
- description: "Validate event-sourced CQRS models against 17 architectural checks across 7 phases. Identifies anti-patterns and confirms compliance with event sourcing principles. Use when reviewing event models for production readiness or after completing event modeling steps. Do not use for: reviewing incomplete or in-progress models (use eventmodeling-validating-event-models), or for elaborating new scenarios (use eventmodeling-elaborating-scenarios)."
3
+ description: "Validate an event model against 13 structural checks across 7 phases. Identifies notation anti-patterns and confirms the model is internally consistent. Use when reviewing an event model for readiness or after completing event modeling steps. Do not use for: reviewing incomplete or in-progress models (use eventmodeling-validating-event-models), or for elaborating new scenarios (use eventmodeling-elaborating-scenarios)."
4
4
  allowed-tools:
5
5
  - Write
6
6
  - Bash
@@ -10,25 +10,26 @@ allowed-tools:
10
10
 
11
11
  > **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.
12
12
 
13
+ 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.
14
+
13
15
  Prefer `mcp__eventmodelers__*` tools when available (registered by the `connect` skill) — the curl blocks below are the fallback for sessions without MCP connected.
14
16
 
15
- **Purpose**: Validate any event-sourced CQRS event model against 17 architectural checks across 7 phases. Identifies anti-patterns and confirms compliance with event sourcing principles.
17
+ **Purpose**: Validate any event model against 13 structural checks across 7 phases. Identifies notation anti-patterns and confirms the model is internally consistent.
16
18
 
17
19
  **Applies To**: Any domain - e-commerce, banking, SaaS, marketplace, healthcare, etc.
18
20
 
19
21
  **When to Use**:
20
- - After completing Step 2 (Event Plot) of the 11-step event modeling workflow, as an early structural check
21
- - Alongside Step 9 (Validate), as the optional production-readiness pass before declaring model complete
22
- - When reviewing an existing event model for production readiness
23
- - When suspicious of architectural issues in event design
22
+ - After completing Step 2 (Event Plot) of the event modeling workflow, as an early structural check
23
+ - Alongside Step 9 (Validate), as an optional second pass before declaring the model complete
24
+ - When reviewing an existing event model
25
+ - When suspicious of structural issues in the model
24
26
 
25
27
  **What It Does**:
26
28
  1. Reads current board state (EVENT, COMMAND, READMODEL nodes) as input
27
- 2. Systematically applies 17 validation checks across 7 phases
28
- 2. Identifies violations of event sourcing principles (domain-agnostic)
29
- 3. Flags anti-patterns (calculations as events, non-entity streams, etc.)
29
+ 2. Systematically applies 13 validation checks across 7 phases
30
+ 3. Identifies notation anti-patterns (calculations modeled as events, events mixed into the wrong entity's timeline, etc.)
30
31
  4. Verifies read model/event distinction
31
- 5. Confirms stream independence and business rule enforcement
32
+ 5. Confirms every event and command traces cleanly
32
33
  6. Returns pass/fail verdict with evidence
33
34
 
34
35
  ---
@@ -53,52 +54,53 @@ Use the board nodes as the model input. After the checklist, use `handle-comment
53
54
 
54
55
  ## Validation Phases (Domain-Agnostic)
55
56
 
56
- ### Phase 1: Event Stream & Command Handler State Validation (4 checks)
57
- - Check 1.1: Each event belongs to exactly one stream
58
- - Check 1.2: Each command handler owns its own [CommandHandler]State class
59
- - Check 1.3: No hard dependencies between command handlers (orchestrated via events only)
60
- - Check 1.4: Each command is issued by exactly one thing — no COMMAND node has more than one inbound SCREEN/AUTOMATION edge
57
+ ### Phase 1: Event & Command Ownership Validation (2 checks)
58
+ - Check 1.1: Each event belongs to exactly one entity/timeline
59
+ - Check 1.2: Each command is issued by exactly one thing — no COMMAND node has more than one inbound SCREEN/AUTOMATION edge
61
60
 
62
- **Anti-pattern to catch**: Sharing state across handlers or treating state as persistent aggregate; a command wired from two issuers — auto-connect itself now guards against this (see `learn-eventmodelers-api` §3), so a double-issuer command found on the board is most likely a manual `set_connection` call or an edge left over from before that guard existed, not a fresh auto-connect artifact
61
+ **Anti-pattern to catch**: a command wired from two issuers — auto-connect itself now guards against this (see `learn-eventmodelers-api` §3), so a double-issuer command found on the board is most likely a manual `set_connection` call or an edge left over from before that guard existed, not a fresh auto-connect artifact
63
62
 
64
63
  ### Phase 2: Event Quality Validation (3 checks)
65
64
  - Check 2.1: Events represent domain facts, not calculations
66
65
  - Check 2.2: Event data is immutable after creation
67
66
  - Check 2.3: Event names use past tense (what actually happened)
68
67
 
69
- **Anti-pattern to catch**: Storing computed/aggregated data as events
68
+ **Anti-pattern to catch**: storing computed/aggregated data as an event
70
69
 
71
70
  ### Phase 3: Read Model vs Event Distinction (2 checks)
72
- - Check 3.1: Each read model is NOT an event stream
73
- - Check 3.2: Read model has natural query pattern
71
+ - Check 3.1: Each read model is NOT an event timeline
72
+ - Check 3.2: Read model has a natural query pattern
74
73
 
75
- **Anti-pattern to catch**: Confusing projections/calculations with domain facts
74
+ **Anti-pattern to catch**: confusing projections/calculations with domain facts
76
75
 
77
76
  ### Phase 4: Business Rules Validation (2 checks)
78
- - Check 4.1: Constraints enforced in command handler decision logic (encapsulated in [CommandHandler]State)
79
- - Check 4.2: Event preconditions are explicit (what state must exist before command is valid)
77
+ - Check 4.1: Every command's preconditions are documented explicitly
78
+ - Check 4.2: Event preconditions are explicit (what must already be true before a command is valid)
80
79
 
81
- **Anti-pattern to catch**: Business rules scattered across handlers or encoded in event stream structure
80
+ **Anti-pattern to catch**: business rules scattered across the model or left implicit ("obviously can't ship an unconfirmed order")
82
81
 
83
82
  ### Phase 5: Data Traceability (1 check)
84
83
  - Check 5.1: Input → Event → Read Model traceability is complete
85
84
 
86
- **Anti-pattern to catch**: Command inputs that disappear or read model fields without source
85
+ **Anti-pattern to catch**: command inputs that disappear, or read model fields without a source
86
+
87
+ ### Phase 6: Event Flow Validation (2 checks)
88
+ - Check 6.1: No impossible event sequences (the slice-transition flow is sound)
89
+ - Check 6.2: No event belongs to more than one entity's timeline — an event that seems to span two entities usually means a naming or boundary mistake, not a shared fact
87
90
 
88
- ### Phase 6: Event Flow Validation (1 check)
89
- - Check 6.1: No impossible event sequences (state machine is sound)
91
+ **Anti-pattern to catch**: events that can occur in invalid combinations; a "shared" event quietly coupling two entities together
90
92
 
91
- **Anti-pattern to catch**: Events that can occur in invalid state combinations
93
+ ### Phase 7: Structural Shape Validation (2 checks)
94
+ - Check 7.1: No SCREEN is wired to more than one COMMAND
95
+ - Check 7.2: Fan-out/fan-in outliers (a command with 2+ resulting events, a read model built from 3+ events, a slice with markedly more scenarios than its neighbors) have been reasoned about against the business context, not flagged on count alone
92
96
 
93
- ### Phase 7: Stream Independence (1 check)
94
- - Check 7.1: Each stream can be versioned/restored independently
97
+ See `eventmodeling-core-rules`'s **Structural Shapes** section for the full definitions ("the bed", "left chair", "right chair", "shelf") and their thresholds — this phase doesn't restate them.
95
98
 
96
- **Anti-pattern to catch**: Hard dependencies between streams
99
+ **Anti-pattern to catch**: Check 7.1 catches "the bed" — a screen fanning into multiple commands hides where the user's actual decision is made; this is a real anti-pattern, always fail it. Check 7.2 catches "the left chair" / "the right chair" / "the shelf" — these are candidates, not automatic fails: only report an outlier if the specific events/fields/scenarios involved still look like they're doing more than one job once you've checked them against the domain.
97
100
 
98
- ### Final Questions (3 checks)
99
- - Question 1: Could an architect unfamiliar with this domain understand the model in 15 minutes?
100
- - Question 2: Could you change your core algorithm/calculation without changing event history?
101
- - Question 3: Could this be implemented in your target technology stack (e.g., TypeScript + PostgreSQL)?
101
+ ### Final Questions (2 checks)
102
+ - Question 1: Could a modeler unfamiliar with this domain understand the model in 15 minutes?
103
+ - Question 2: Could the business rule/calculation behind a read model change without rewriting event history?
102
104
 
103
105
  ---
104
106
 
@@ -108,7 +110,7 @@ The skill returns a validation report with:
108
110
 
109
111
  ### For Each Check
110
112
  ```
111
- Check 1.2: Stream Root is Business Entity, Not Calculation
113
+ Check 1.2: Command Issued by Exactly One Thing
112
114
  Status: PASS
113
115
  Evidence: [Specific examples from your model]
114
116
  ```
@@ -116,7 +118,7 @@ Evidence: [Specific examples from your model]
116
118
  ### Anti-Patterns Identified (if any)
117
119
  ```
118
120
  CRITICAL: [Anti-pattern description]
119
- Problem: [Why it violates event sourcing]
121
+ Problem: [Why it violates event modeling principles]
120
122
  Violates: [Which checks fail]
121
123
  Fix: [Recommended action]
122
124
  ```
@@ -124,7 +126,6 @@ Fix: [Recommended action]
124
126
  ### Final Verdict
125
127
  ```
126
128
  Status: PASS (or PASS WITH WARNINGS or FAIL)
127
- Implementation Ready: YES (or NO - fix issues first)
128
129
  Confidence: [percentage]
129
130
  ```
130
131
 
@@ -145,100 +146,78 @@ CalculationPerformed {
145
146
  - ReadModel: MetricView (recalculated from events)
146
147
  ```
147
148
 
148
- **Why**: Calculations change multiple times as source data changes. Events are immutable.
149
+ **Why**: Calculations change as source data changes. Events are immutable.
149
150
 
150
- ### 2. Shared vs Handler-Owned State
151
+ ### 2. Command With Multiple Issuers
151
152
 
152
- The DDD-aggregate anti-pattern one shared state class used by every handler versus the correct pattern of one minimal, handler-owned state class per command. See `eventmodeling-designing-event-models`'s "Core Architectural Rule" for the full worked example (`OrderAggregate` vs. per-command state).
153
+ A command is never issued by more than one thing a COMMAND with 2+ inbound SCREEN/AUTOMATION edges hides which actor is actually responsible. See `place-element`'s Step 7c for the full check-and-fix mechanics (which edge to keep, how to remove the rest).
153
154
 
154
- **Why**: Each handler is a micro-slice. Separate state classes maintain isolation, enable parallel teams, prevent merge conflicts.
155
+ **Why**: Each command represents one specific trigger's decision to act — collapsing two triggers onto one command node usually means either a naming/slice-boundary mistake or a stray manual/pre-existing edge (auto-connect itself now guards against fresh occurrences — see `learn-eventmodelers-api` §3).
155
156
 
156
- ### 3. Circular Dependencies
157
+ ### 3. An Event Shared Across Entities
157
158
  ```
158
159
  ANTI-PATTERN:
159
- StreamA → EventA → affects
160
- StreamB → EventB → affects
161
- StreamA (circular!)
160
+ EntityA → EventA → also placed on EntityB's timeline
162
161
 
163
162
  CORRECT:
164
- StreamA → EventA Event Bus
165
- StreamB EventB Event Bus
166
- ReadModels ← consume (one-way only)
167
- No feedback loops
163
+ EntityA → EventA (on EntityA's timeline only)
164
+ EntityB reacts to EventA via a read model/automation, it doesn't own it
168
165
  ```
169
166
 
170
- **Why**: Circular dependencies make the system hard to reason about and test.
167
+ **Why**: An event belongs to the story of exactly one entity. If a second entity needs to react to it, that's a read model or automation reading it — not the same event living on two timelines.
171
168
 
172
- ### 4. Persistent State vs Ephemeral State
169
+ ### 4. A Screen Fanning Into Multiple Commands ("the bed")
173
170
  ```
174
171
  ANTI-PATTERN:
175
- Treat [CommandHandler]State as persistent entity
176
- - Save SubmitReviewState to database after command
177
- - Load it again next time
178
- - Result: Duplicates event sourcing, loses audit trail
172
+ Screen Command A
173
+ Command B
174
+ Command C
179
175
 
180
176
  CORRECT:
181
- Reconstruct [CommandHandler]State on-demand
182
- - Load events from stream
183
- - Replay via evolve() to rebuild state
184
- - Process command, emit outcome events
185
- - Discard state (it's ephemeral, not persisted)
177
+ Screen Command A only (one screen, one decision)
186
178
  ```
187
179
 
188
- **Why**: State is derived from events, never stored. Events are source of truth. This enables consistent replay, audit trails, and time-travel debugging.
189
-
190
- ### 5. Command With Multiple Issuers
191
-
192
- A command is never issued by more than one thing — a COMMAND with 2+ inbound SCREEN/AUTOMATION edges hides which actor is actually responsible. See `place-element`'s Step 7c for the full check-and-fix mechanics (which edge to keep, how to remove the rest).
193
-
194
- **Why**: Each command represents one specific trigger's decision to act — collapsing two triggers onto one command node usually means either a naming/slice-boundary mistake or a stray manual/pre-existing edge (auto-connect itself now guards against fresh occurrences — see `learn-eventmodelers-api` §3).
180
+ **Why**: A screen represents the moment a user has already committed to one decision. Wiring it to several commands hides where that choice actually gets made — see `eventmodeling-core-rules`'s **Structural Shapes** section for this and the three related fan-out/fan-in candidates ("left chair", "right chair", "shelf").
195
181
 
196
182
  ---
197
183
 
198
184
  ## Questions to Ask During Validation
199
185
 
200
- **For each event stream**:
201
- 1. "Do all events in this stream share the same identity (streamId)?"
202
- 2. "Could these events occur in any order, or is sequence important?"
203
- 3. "Is every event in this stream an immutable fact that actually happened?"
186
+ **For each entity's timeline**:
187
+ 1. "Do all events on this timeline belong to the same entity?"
188
+ 2. "Could these events occur in any order, or does sequence matter?"
189
+ 3. "Is every event on this timeline an immutable fact that actually happened?"
204
190
 
205
- **For each command handler**:
206
- 1. "Does this handler own its own [CommandHandler]State class?"
207
- 2. "Is the state ephemeral (reconstructed per command, not persisted)?"
208
- 3. "Can I trace the state reconstruction: events → evolve() → decision?"
191
+ **For each command**:
192
+ 1. "Are its preconditions written down, not just assumed?"
193
+ 2. "Does it produce an event, or document why it's rejected?"
209
194
 
210
195
  **For each read model**:
211
196
  1. "Is this calculated from events via a projection?"
212
197
  2. "Does it answer a specific query need?"
213
- 3. "Could its data change due to new events or state changes?"
214
-
215
- **For system architecture**:
216
- 1. "Does each command handler operate independently (communicate via events only)?"
217
- 2. "Could I run two handlers' code in parallel without merge conflicts?"
218
- 3. "Are the only shared artifacts the event definitions?"
198
+ 3. "Could its data change due to new events?"
219
199
 
220
200
  ---
221
201
 
222
202
  ## Success Criteria
223
203
 
224
204
  **Model is validated when**:
225
- - All 17 checks pass (or have documented workarounds)
205
+ - All 13 checks pass (or have documented workarounds)
226
206
  - No critical anti-patterns identified
227
- - All 3 final questions answer YES
228
- - Event sourcing principles clearly upheld
229
- - Ready to proceed to code generation
207
+ - Both final questions answer YES
208
+ - Event modeling principles are clearly upheld
230
209
 
231
210
  **Model needs fixes when**:
232
211
  - Any check fails with clear evidence
233
212
  - Anti-patterns identified with specific violations
234
- - Final questions have NO answers
213
+ - A final question has a NO answer
235
214
  - Fixes are straightforward and targeted
236
215
 
237
216
  **Model should be redesigned when**:
238
217
  - Multiple phases fail
239
- - Architectural assumptions are fundamentally flawed
218
+ - Structural assumptions are fundamentally flawed
240
219
  - Anti-patterns are systemic and pervasive
241
- - Would require rewriting core event structure
220
+ - Would require rewriting the core event timeline
242
221
 
243
222
  ---
244
223
 
@@ -248,25 +227,13 @@ A command is never issued by more than one thing — a COMMAND with 2+ inbound S
248
227
  When you see something like "CalculationDone" or "ReviewRatingUpdated":
249
228
  - Ask: "Is this immutable and caused by a user/system action?"
250
229
  - If NO → It's a read model, not an event
251
- - Fix: Remove from events, create read model projection instead
252
-
253
- ### Pattern: Shared vs Isolated State
254
- When you see "ReviewAggregate" used by multiple handlers:
255
- - Ask: "Could SubmitReviewHandler and ApproveReviewHandler work on separate files?"
256
- - If NO → State classes aren't properly isolated
257
- - Fix: Create SubmitReviewState and ApproveReviewState, each handler owns one
258
-
259
- ### Pattern: Persistent vs Ephemeral State
260
- When state is saved to database after a command:
261
- - Ask: "Is this state only needed during command processing?"
262
- - If YES → It's ephemeral, reconstruct from events instead
263
- - Fix: Load events, replay via evolve(), process command, discard state
230
+ - Fix: Remove from events, create a read model projection instead
264
231
 
265
232
  ### Pattern: Data That Doesn't Trace
266
233
  When a read model field appears without source:
267
234
  - Ask: "Where did this come from?"
268
- - If no event source → Add event or remove field
269
- - If sourced from calculation → Verify it's in projection, not event
235
+ - If no event source → Add the event or remove the field
236
+ - If sourced from a calculation → Verify it's in the read model, not the event
270
237
 
271
238
  ---
272
239
 
@@ -285,19 +252,19 @@ Step 3-8: Storyboard, Inputs, Outputs, Conway's Law, Scenarios, Completeness
285
252
 
286
253
  Step 9: Validate (eventmodeling-validating-event-models)
287
254
 
288
- → RUN eventmodeling-validating-event-models-checklist again (production-readiness pass)
255
+ → RUN eventmodeling-validating-event-models-checklist again (final structural pass)
289
256
 
290
- PASS → Step 10: Slice, Step 11: Document Reasoning → Code generation
257
+ PASS → Step 10: Slice, Step 11: Document Reasoning
291
258
  FAIL → Fix identified issues
292
259
  ```
293
260
 
294
- Running the checklist after Step 2 prevents wasting time on later steps if core events are flawed.
261
+ Running the checklist after Step 2 prevents wasting time on later steps if the core events are flawed.
295
262
 
296
263
  ---
297
264
 
298
265
  ## Checklist Questions by Domain
299
266
 
300
- The skill applies the same 17 checks regardless of domain. Here's how to think about it in different contexts:
267
+ The skill applies the same 13 checks regardless of domain. Here's how to think about it in different contexts:
301
268
 
302
269
  **E-commerce domain**:
303
270
  - Events: OrderCreated, OrderConfirmed, PaymentAuthorized, OrderShipped
@@ -321,26 +288,26 @@ The principle is the same across all domains: **immutable facts as events, calcu
321
288
 
322
289
  ## Tips for Best Results
323
290
 
324
- 1. **Be specific**: List actual event names, command handler names, and state classes from your model
325
- 2. **Reference your documentation**: Link to or quote from your step 1-7 documents and micro-slice plans
326
- 3. **Provide context**: Explain what your domain is and how handlers will be parallelized
327
- 4. **Ask follow-ups**: If a check flags an issue, ask "How do I fix this specifically?" or "Can this handler be isolated?"
328
- 5. **Iterate**: Run again after making fixes to confirm all checks pass and handlers are properly isolated
291
+ 1. **Be specific**: List actual event and command names from your model
292
+ 2. **Reference your documentation**: Link to or quote from your step 1-7 documents
293
+ 3. **Provide context**: Explain what your domain is
294
+ 4. **Ask follow-ups**: If a check flags an issue, ask "How do I fix this specifically?"
295
+ 5. **Iterate**: Run again after making fixes to confirm all checks pass
329
296
 
330
297
  ## Quality Checklist
331
298
 
332
- - [ ] All 17 checks evaluated — no check skipped without documented justification
333
- - [ ] Every FAIL result includes the specific event, handler, or stream that violated the check
299
+ - [ ] All 13 checks evaluated — no check skipped without documented justification
300
+ - [ ] Every FAIL result includes the specific event, command, or entity that violated the check
334
301
  - [ ] Anti-patterns identified by name with the exact model element that triggered the flag
335
302
  - [ ] Final verdict is one of: PASS / PASS WITH WARNINGS / FAIL — no ambiguous outcomes
336
- - [ ] All 3 final architectural questions answered YES before declaring model ready for implementation
303
+ - [ ] Both final questions answered YES before declaring the model ready
337
304
  - [ ] Any FAIL result has a recommended fix, not just a problem statement
338
305
 
339
306
  ---
340
307
 
341
308
  ## Related Skills
342
309
 
343
- - **eventmodeling-orchestrating-event-modeling**: Main skill coordinating the 11-step event modeling process
310
+ - **eventmodeling-orchestrating-event-modeling**: Main skill coordinating the full event modeling process
344
311
  - **eventmodeling-brainstorming-events**: Extract events from requirements (Step 1)
345
312
  - **eventmodeling-plotting-events**: Sequence events chronologically (Step 2)
346
313
  - **eventmodeling-designing-event-models**: Design your complete event model
@@ -350,6 +317,5 @@ The principle is the same across all domains: **immutable facts as events, calcu
350
317
 
351
318
  ## Validation Checklist Reference
352
319
 
353
- The 17-point checklist is defined in the **Validation Phases** section above.
320
+ The 13-point checklist is defined in the **Validation Phases** section above.
354
321
  Each check includes the anti-pattern to catch and questions to ask when evaluating your model.
355
-
@@ -196,9 +196,23 @@ Cell IDs are always `<rowId>-<columnId>` — no cell array search needed.
196
196
 
197
197
  **Same swimlane for events emitted by the same command.** When one command emits more than one event, each event still gets its own column (per the hard rule above), but all of them belong in the *same* swimlane row, placed in adjacent columns immediately after the command. Do not scatter a command's sibling events across different swimlane rows — one command producing multiple events is one system doing multiple things in sequence, not several systems reacting independently.
198
198
 
199
+ **One COMMAND / READMODEL / SCREEN / AUTOMATION per column — server-enforced, not just a heuristic.** Unlike the EVENT rule above (which this skill has to check for itself), the server itself rejects a second `COMMAND`, `READMODEL`, `SCREEN`/`HTML_SCREEN`, or `AUTOMATION` landing in a column that already has one of that type — across *every* row of the relevant lane (`interaction` for COMMAND/READMODEL, `actor` for SCREEN/AUTOMATION), not only the exact target cell. A board can have several separate `interaction` or `actor` rows, so the target cell itself can be empty and the placement will still fail with a `ValidationError` ("Column already has a … node … — only one … is allowed per column"). Treat that rejection exactly like a same-cell conflict in the table below — insert a new column rather than retrying the same one.
200
+
199
201
  **Check if the cell is already occupied.**
200
202
 
201
- **No direct MCP equivalent**: `get_nodes` only filters by `type`, not `cellId` — there is no MCP tool that filters nodes by cell. Instead, use the `cells` array you already fetched in Step 3 via `get_node` (`projection: "cells"`) on the chapter/timeline node: `cells` is a sparse array, so a `nodeId` absent from the entry for `CELL_ID` means the cell is empty. Only fall back to the curl call below if you haven't already loaded `timelineData` (e.g. MCP wasn't used in Step 3 either):
203
+ **Fastest path**: use the `cells` array you already fetched in Step 3 via `get_node` (`projection: "cells"`) on the chapter/timeline node `cells` is a sparse array, so a `nodeId` absent from the entry for `CELL_ID` means the cell is empty. Also scan it for the column-wide conflict from the rule above: any entry with `colId === columnId` and `nodeType === elementType` (for COMMAND/READMODEL/SCREEN/AUTOMATION) means the column is occupied even though `CELL_ID` itself is free. This avoids an extra round-trip, but can be stale if a column was just created in Step 5 — re-fetch first in that case.
204
+
205
+ **No direct MCP equivalent** for querying by cell/column: `get_nodes` only filters by `type`. The REST API does support it directly though — `GET /nodes` takes `cellId` **or** `colId`, both requiring `timelineId`:
206
+
207
+ ```bash
208
+ # Same-cell occupancy — returns [] if empty, or [nodeRecord] if occupied
209
+ curl -s "$BASE_URL/api/org/$ORG_ID/boards/$BOARD_ID/nodes?cellId=$CELL_ID&timelineId=$TIMELINE_ID"
210
+
211
+ # Column-wide occupancy (any row) — optionally add &type=READMODEL to narrow to one element type
212
+ curl -s "$BASE_URL/api/org/$ORG_ID/boards/$BOARD_ID/nodes?colId=$COLUMN_ID&timelineId=$TIMELINE_ID"
213
+ ```
214
+
215
+ Use this REST call (see the curl fallback below) when you don't already have fresh `timelineData` loaded, instead of re-fetching the whole chapter node just to check occupancy.
202
216
 
203
217
  **Fallback (no MCP):** see `references/api-fallback.md` — "Step 6 — Check cell occupancy".
204
218
 
@@ -55,10 +55,20 @@ Response: `{ "columnId": "<uuid>", "index": <n>, "totalColumns": <n> }`
55
55
 
56
56
  ## Step 6 — Check cell occupancy
57
57
 
58
+ `GET /nodes` takes `cellId` **or** `colId`, both requiring `timelineId` — no need to re-fetch and parse the whole chapter node just for this:
59
+
58
60
  ```bash
59
- curl -s "$BASE_URL/api/org/$ORG_ID/boards/$BOARD_ID/nodes?cellId=$CELL_ID"
61
+ # Same-cell occupancy — [] if empty, [nodeRecord] if occupied
62
+ curl -s "$BASE_URL/api/org/$ORG_ID/boards/$BOARD_ID/nodes?cellId=$CELL_ID&timelineId=$TIMELINE_ID"
63
+
64
+ # Same-column occupancy, across every row of the timeline — add &type=<elementType> to narrow
65
+ # (the server enforces one COMMAND/READMODEL/SCREEN/HTML_SCREEN/AUTOMATION per column even when
66
+ # the target cell itself is empty — see SKILL.md)
67
+ curl -s "$BASE_URL/api/org/$ORG_ID/boards/$BOARD_ID/nodes?colId=$COLUMN_ID&timelineId=$TIMELINE_ID"
60
68
  ```
61
69
 
70
+ If you already have fresh `timelineData` loaded from Step 3, reading its `cells` array directly (sparse — an entry only exists once something has been placed there) avoids the extra round-trip; use the calls above otherwise, or when `timelineData` might be stale (e.g. a column was just created).
71
+
62
72
  ## Step 6 — Insert a column at a specific index (conflict resolution)
63
73
 
64
74
  No relative-insertion equivalent over REST (unlike MCP's `afterNodeId`) — compute the index by hand:
@@ -7,6 +7,8 @@ description: Business analyst exploration of an event model board. Reads all sli
7
7
 
8
8
  > **Before doing anything else**, invoke the `connect` skill — if not already connected — to resolve `TOKEN`, `BOARD_ID`, and `BASE_URL`. Do not proceed until the connect skill has completed.
9
9
 
10
+ 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, the anti-patterns to reject, and the four Structural Shapes (Category I below), so this step doesn't restate them.
11
+
10
12
  You are a **sharp business analyst** reviewing an event model. You don't know the domain yet — you're seeing it fresh. Your job is to read the model, understand the intended flows, and ask the hard questions that developers and domain experts tend to overlook because they're too close to the problem.
11
13
 
12
14
  You're not reviewing code. You're reviewing **business logic**: flows, edge cases, error paths, missing constraints, and real-world messiness that the happy path ignores.
@@ -94,14 +96,14 @@ Every question and every summary theme must be written in plain business languag
94
96
  - **Do not assume** notifications (welcome email, verification, webhook) are missing just because they aren't modelled. They may belong to a different slice or context not yet built. Only ask if the model explicitly implies a notification is needed but nothing wires to it.
95
97
 
96
98
  ### Category I: Structural shapes
97
- This category is about the **shape of the model**, not any one flow's business logic — it needs the edge/relationship data and per-slice scenario counts gathered across *all* slices in Step 2, so run it once after all slices are loaded, not per-slice. Check the full element graph for these four known shapes. Each still gets a business-worded question, per the language rulenever say "bed", "left-chair", "right-chair", or "shelf" in a comment; those are your internal names for spotting the shape, not vocabulary for the board.
99
+ This category is about the **shape of the model**, not any one flow's business logic — it needs the edge/relationship data and per-slice scenario counts gathered across *all* slices in Step 2, so run it once after all slices are loaded, not per-slice. Check the full element graph against the four shapes defined in `eventmodeling-core-rules`'s **Structural Shapes** section (the bed, left chair, right chair, shelf) read that section for what each shape is, its threshold, and which one is an always-flag anti-pattern vs. a context-dependent candidate; this section only covers how to word and post the finding once you've decided it holds up.
98
100
 
99
- Only one of these four is an actual anti-pattern — invalid regardless of context. The other three are **candidates**: a count crossing the rough threshold means "worth checking against the business context," not "wrong." Never raise a candidate off the count alone — reason about the specific events/fields/scenarios involved first, and only post if, in this domain, the count still looks like it's doing more than one job. If the context justifies it, drop it silently.
101
+ Never raise a candidate off the count alone — reason about the specific events/fields/scenarios involved first, and only post if, in this domain, the count still looks like it's doing more than one job. If the context justifies it, drop it silently. Each still gets a business-worded question, per the language rule — never say "bed", "left chair", "right chair", or "shelf" in a comment; those are internal names for spotting the shape, not vocabulary for the board.
100
102
 
101
- - **The bed (real anti-pattern always flag)** — one screen wired to more than one command. A screen is where the user has already committed to one decision, so it should trigger exactly one command; wiring several to it means the choice is being made somewhere invisible to the model. Flag this directly and confidently, not as a soft maybe — still in plain business language, but assertive: "This screen lets someone trigger more than one action from the same place — should this be split into separate steps or buttons so it's clear which one they're choosing?"
102
- - **The left chair (candidate)** — one command resulting in more than two events. May mean the command is doing more than one job, or it may be a single business outcome that legitimately fans out. Check whether the outcomes always happen together or could happen independently before asking. Example, only if it holds up: "When this action succeeds, do all of these things always happen together, or could some happen without the others?"
103
- - **The right chair (candidate)** — one read model built from more than three events. May mean the view is answering more than one question at once, or it may be one coherent picture that genuinely needs that many sources. Check whether the fields shown belong to a single thing the user is checking before asking. Example, only if it holds up: "Is this screen answering one question for the user, or several different ones bundled together?"
104
- - **The shelf (candidate)** — one slice with noticeably more scenarios than the others on the same timeline (a rough outlier, not a fixed threshold — compare against the typical count for that timeline). May mean the step is quietly covering ground that belongs to a separate step, or it may just be genuinely more complex. Check what the extra scenarios actually cover before asking. Example, only if it holds up: "This step has a lot more cases than the ones around it — is that because it's really doing more, or because it's covering something that should be its own step?"
103
+ - **The bed** — flag directly and confidently, not as a soft maybe — still in plain business language, but assertive: "This screen lets someone trigger more than one action from the same place — should this be split into separate steps or buttons so it's clear which one they're choosing?"
104
+ - **The left chair** — only if it holds up: "When this action succeeds, do all of these things always happen together, or could some happen without the others?"
105
+ - **The right chair** — only if it holds up: "Is this screen answering one question for the user, or several different ones bundled together?"
106
+ - **The shelf** — only if it holds up: "This step has a lot more cases than the ones around it — is that because it's really doing more, or because it's covering something that should be its own step?"
105
107
 
106
108
  Each of these four is inherently about a relationship or cluster of elements, so whichever you do raise always gets a drawing per Step 4.2 in addition to its comment — a group loop around the elements involved, or an arrow if the concern is specifically about one edge among several.
107
109