@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.
- package/package.json +1 -1
- package/shared/skills/learn-eventmodelers-api/SKILL.md +10 -3
- package/stacks/modeling-kit/templates/.claude/skills/analyze-existing-model/SKILL.md +16 -0
- package/stacks/modeling-kit/templates/.claude/skills/eventmodeling-applying-conways-law/SKILL.md +3 -61
- package/stacks/modeling-kit/templates/.claude/skills/eventmodeling-brainstorming-events/SKILL.md +24 -93
- package/stacks/modeling-kit/templates/.claude/skills/eventmodeling-checking-completeness/SKILL.md +2 -0
- package/stacks/modeling-kit/templates/.claude/skills/eventmodeling-core-rules/SKILL.md +192 -0
- package/stacks/modeling-kit/templates/.claude/skills/eventmodeling-designing-automation-chains/SKILL.md +23 -7
- package/stacks/modeling-kit/templates/.claude/skills/eventmodeling-designing-event-models/SKILL.md +50 -223
- package/stacks/modeling-kit/templates/.claude/skills/eventmodeling-designing-event-models/references/examples.md +30 -120
- package/stacks/modeling-kit/templates/.claude/skills/eventmodeling-elaborating-scenarios/SKILL.md +3 -78
- package/stacks/modeling-kit/templates/.claude/skills/eventmodeling-identifying-inputs/SKILL.md +3 -50
- package/stacks/modeling-kit/templates/.claude/skills/eventmodeling-identifying-outputs/SKILL.md +3 -54
- package/stacks/modeling-kit/templates/.claude/skills/eventmodeling-interview-protocol/SKILL.md +31 -0
- package/stacks/modeling-kit/templates/.claude/skills/eventmodeling-optimizing-stream-design/SKILL.md +27 -67
- package/stacks/modeling-kit/templates/.claude/skills/eventmodeling-optimizing-stream-design/references/domain-patterns.md +15 -15
- package/stacks/modeling-kit/templates/.claude/skills/eventmodeling-optimizing-stream-design/references/patterns.md +44 -52
- package/stacks/modeling-kit/templates/.claude/skills/eventmodeling-orchestrating-event-modeling/SKILL.md +14 -15
- package/stacks/modeling-kit/templates/.claude/skills/eventmodeling-plotting-events/SKILL.md +4 -0
- package/stacks/modeling-kit/templates/.claude/skills/eventmodeling-slicing-event-models/SKILL.md +3 -15
- package/stacks/modeling-kit/templates/.claude/skills/eventmodeling-storyboarding-events/SKILL.md +3 -50
- package/stacks/modeling-kit/templates/.claude/skills/eventmodeling-translating-external-events/SKILL.md +4 -56
- package/stacks/modeling-kit/templates/.claude/skills/eventmodeling-validating-event-models/SKILL.md +58 -97
- package/stacks/modeling-kit/templates/.claude/skills/eventmodeling-validating-event-models-checklist/SKILL.md +84 -118
- package/stacks/modeling-kit/templates/.claude/skills/place-element/SKILL.md +15 -1
- package/stacks/modeling-kit/templates/.claude/skills/place-element/references/api-fallback.md +11 -1
- 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
|
|
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
|
|
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
|
|
21
|
-
- Alongside Step 9 (Validate), as
|
|
22
|
-
- When reviewing an existing event model
|
|
23
|
-
- When suspicious of
|
|
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
|
|
28
|
-
|
|
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
|
|
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
|
|
57
|
-
- Check 1.1: Each event belongs to exactly one
|
|
58
|
-
- Check 1.2: Each command
|
|
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**:
|
|
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**:
|
|
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
|
|
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**:
|
|
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:
|
|
79
|
-
- Check 4.2: Event preconditions are explicit (what
|
|
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**:
|
|
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**:
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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**:
|
|
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 (
|
|
99
|
-
- Question 1: Could
|
|
100
|
-
- Question 2: Could
|
|
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:
|
|
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
|
|
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
|
|
149
|
+
**Why**: Calculations change as source data changes. Events are immutable.
|
|
149
150
|
|
|
150
|
-
### 2.
|
|
151
|
+
### 2. Command With Multiple Issuers
|
|
151
152
|
|
|
152
|
-
|
|
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
|
|
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.
|
|
157
|
+
### 3. An Event Shared Across Entities
|
|
157
158
|
```
|
|
158
159
|
ANTI-PATTERN:
|
|
159
|
-
|
|
160
|
-
StreamB → EventB → affects
|
|
161
|
-
StreamA (circular!)
|
|
160
|
+
EntityA → EventA → also placed on EntityB's timeline
|
|
162
161
|
|
|
163
162
|
CORRECT:
|
|
164
|
-
|
|
165
|
-
|
|
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**:
|
|
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.
|
|
169
|
+
### 4. A Screen Fanning Into Multiple Commands ("the bed")
|
|
173
170
|
```
|
|
174
171
|
ANTI-PATTERN:
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
- Result: Duplicates event sourcing, loses audit trail
|
|
172
|
+
Screen → Command A
|
|
173
|
+
→ Command B
|
|
174
|
+
→ Command C
|
|
179
175
|
|
|
180
176
|
CORRECT:
|
|
181
|
-
|
|
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**:
|
|
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
|
|
201
|
-
1. "Do all events
|
|
202
|
-
2. "Could these events occur in any order, or
|
|
203
|
-
3. "Is every event
|
|
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
|
|
206
|
-
1. "
|
|
207
|
-
2. "
|
|
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
|
|
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
|
|
205
|
+
- All 13 checks pass (or have documented workarounds)
|
|
226
206
|
- No critical anti-patterns identified
|
|
227
|
-
-
|
|
228
|
-
- Event
|
|
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
|
-
-
|
|
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
|
-
-
|
|
218
|
+
- Structural assumptions are fundamentally flawed
|
|
240
219
|
- Anti-patterns are systemic and pervasive
|
|
241
|
-
- Would require rewriting core event
|
|
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
|
|
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 (
|
|
255
|
+
→ RUN eventmodeling-validating-event-models-checklist again (final structural pass)
|
|
289
256
|
↓
|
|
290
|
-
PASS → Step 10: Slice, Step 11: Document Reasoning
|
|
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
|
|
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
|
|
325
|
-
2. **Reference your documentation**: Link to or quote from your step 1-7 documents
|
|
326
|
-
3. **Provide context**: Explain what your domain is
|
|
327
|
-
4. **Ask follow-ups**: If a check flags an issue, ask "How do I fix this specifically?"
|
|
328
|
-
5. **Iterate**: Run again after making fixes to confirm all checks pass
|
|
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
|
|
333
|
-
- [ ] Every FAIL result includes the specific event,
|
|
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
|
-
- [ ]
|
|
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
|
|
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
|
|
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
|
-
**
|
|
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
|
|
package/stacks/modeling-kit/templates/.claude/skills/place-element/references/api-fallback.md
CHANGED
|
@@ -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
|
-
|
|
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
|
|
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
|
-
|
|
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
|
|
102
|
-
- **The left chair
|
|
103
|
-
- **The right chair
|
|
104
|
-
- **The shelf
|
|
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
|
|