@eventmodelers/cli 0.0.1
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/README.md +175 -0
- package/cli.js +676 -0
- package/package.json +35 -0
- package/shared/build-kit/code-export.mjs +560 -0
- package/shared/build-kit/lib/ollama-agent.js +147 -0
- package/shared/build-kit/package.json +11 -0
- package/shared/build-kit/ralph-ollama.js +39 -0
- package/shared/build-kit/realtime-agent.js +18 -0
- package/stacks/axon/templates/.claude/skills/build-automation/SKILL.md +407 -0
- package/stacks/axon/templates/.claude/skills/build-automation/references/feature-flag-patterns.md +114 -0
- package/stacks/axon/templates/.claude/skills/build-automation-workflow/SKILL.md +496 -0
- package/stacks/axon/templates/.claude/skills/build-automation-workflow/references/axon-workflow-api.md +279 -0
- package/stacks/axon/templates/.claude/skills/build-automation-workflow/references/feature-flag-patterns.md +114 -0
- package/stacks/axon/templates/.claude/skills/build-state-change/SKILL.md +396 -0
- package/stacks/axon/templates/.claude/skills/build-state-change/references/axon-test-fixture-patterns.md +162 -0
- package/stacks/axon/templates/.claude/skills/build-state-change/references/feature-flag-patterns.md +56 -0
- package/stacks/axon/templates/.claude/skills/build-state-change/references/rest-api-patterns.md +115 -0
- package/stacks/axon/templates/.claude/skills/build-state-view/SKILL.md +282 -0
- package/stacks/axon/templates/.claude/skills/connect/SKILL.md +178 -0
- package/stacks/axon/templates/.claude/skills/learn-eventmodelers-api/SKILL.md +611 -0
- package/stacks/axon/templates/.claude/skills/load-slice/SKILL.md +141 -0
- package/stacks/axon/templates/.claude/skills/update-slice-status/SKILL.md +105 -0
- package/stacks/axon/templates/build-kit/lib/AGENT.md +47 -0
- package/stacks/axon/templates/build-kit/lib/agent.sh +20 -0
- package/stacks/axon/templates/build-kit/lib/backend-prompt.md +158 -0
- package/stacks/axon/templates/build-kit/lib/prompt.md +126 -0
- package/stacks/axon/templates/build-kit/lib/ralph.js +369 -0
- package/stacks/axon/templates/build-kit/ralph-claude.js +44 -0
- package/stacks/axon/templates/build-kit/ralph.sh +98 -0
- package/stacks/axon/templates/root/.env.example +5 -0
- package/stacks/axon/templates/root/CLAUDE.md +60 -0
- package/stacks/axon/templates/root/README.md +44 -0
- package/stacks/axon/templates/root/docker-compose.yml +64 -0
- package/stacks/axon/templates/root/mvnw +259 -0
- package/stacks/axon/templates/root/mvnw.cmd +149 -0
- package/stacks/axon/templates/root/pom.xml +125 -0
- package/stacks/axon/templates/root/src/main/java/io/axoniq/quickstart/QuickstartApplication.java +128 -0
- package/stacks/axon/templates/root/src/main/java/io/axoniq/quickstart/config/WebConfig.java +155 -0
- package/stacks/axon/templates/root/src/main/resources/application.properties +2 -0
- package/stacks/axon/templates/root/src/main/resources/static/bg-body.png +0 -0
- package/stacks/axon/templates/root/src/main/resources/static/bg-header.png +0 -0
- package/stacks/axon/templates/root/src/main/resources/static/index.html +596 -0
- package/stacks/cratis-csharp/templates/.claude/skills/_shared/cratis-conventions.md +251 -0
- package/stacks/cratis-csharp/templates/.claude/skills/build-automation/SKILL.md +99 -0
- package/stacks/cratis-csharp/templates/.claude/skills/build-automation/references/patterns.md +115 -0
- package/stacks/cratis-csharp/templates/.claude/skills/build-state-change/SKILL.md +163 -0
- package/stacks/cratis-csharp/templates/.claude/skills/build-state-change/references/patterns.md +234 -0
- package/stacks/cratis-csharp/templates/.claude/skills/build-state-view/SKILL.md +120 -0
- package/stacks/cratis-csharp/templates/.claude/skills/build-state-view/references/patterns.md +166 -0
- package/stacks/cratis-csharp/templates/.claude/skills/connect/SKILL.md +169 -0
- package/stacks/cratis-csharp/templates/.claude/skills/learn-eventmodelers-api/SKILL.md +609 -0
- package/stacks/cratis-csharp/templates/.claude/skills/load-slice/SKILL.md +141 -0
- package/stacks/cratis-csharp/templates/.claude/skills/update-slice-status/SKILL.md +105 -0
- package/stacks/cratis-csharp/templates/build-kit/lib/AGENT.md +58 -0
- package/stacks/cratis-csharp/templates/build-kit/lib/agent.sh +20 -0
- package/stacks/cratis-csharp/templates/build-kit/lib/backend-prompt.md +129 -0
- package/stacks/cratis-csharp/templates/build-kit/lib/prompt.md +124 -0
- package/stacks/cratis-csharp/templates/build-kit/lib/ralph.js +302 -0
- package/stacks/cratis-csharp/templates/build-kit/ralph-claude.js +37 -0
- package/stacks/cratis-csharp/templates/build-kit/ralph.sh +98 -0
- package/stacks/cratis-csharp/templates/root/.frontend/index.css +29 -0
- package/stacks/cratis-csharp/templates/root/.frontend/index.html +17 -0
- package/stacks/cratis-csharp/templates/root/.frontend/main.tsx +18 -0
- package/stacks/cratis-csharp/templates/root/.frontend/tsconfig.json +42 -0
- package/stacks/cratis-csharp/templates/root/.frontend/tsconfig.node.json +11 -0
- package/stacks/cratis-csharp/templates/root/.frontend/vite.config.ts +56 -0
- package/stacks/cratis-csharp/templates/root/App.tsx +23 -0
- package/stacks/cratis-csharp/templates/root/CLAUDE.md +62 -0
- package/stacks/cratis-csharp/templates/root/CratisApp.csproj +25 -0
- package/stacks/cratis-csharp/templates/root/CratisApp.sln +18 -0
- package/stacks/cratis-csharp/templates/root/GlobalUsings.cs +3 -0
- package/stacks/cratis-csharp/templates/root/Home.tsx +102 -0
- package/stacks/cratis-csharp/templates/root/Program.cs +26 -0
- package/stacks/cratis-csharp/templates/root/README.md +192 -0
- package/stacks/cratis-csharp/templates/root/SomeModule/SomeFeature/Listing/AllListings.ts +47 -0
- package/stacks/cratis-csharp/templates/root/SomeModule/SomeFeature/Listing/Listing.cs +11 -0
- package/stacks/cratis-csharp/templates/root/SomeModule/SomeFeature/Listing/Listing.ts +12 -0
- package/stacks/cratis-csharp/templates/root/SomeModule/SomeFeature/Listing/ListingDataTable.tsx +17 -0
- package/stacks/cratis-csharp/templates/root/SomeModule/SomeFeature/Listing/index.ts +1 -0
- package/stacks/cratis-csharp/templates/root/SomeModule/SomeFeature/Registration/Register.ts +51 -0
- package/stacks/cratis-csharp/templates/root/SomeModule/SomeFeature/Registration/RegisterDialog.tsx +18 -0
- package/stacks/cratis-csharp/templates/root/SomeModule/SomeFeature/Registration/Registration.cs +27 -0
- package/stacks/cratis-csharp/templates/root/SomeModule/SomeFeature/Registration/index.ts +1 -0
- package/stacks/cratis-csharp/templates/root/SomeModule/SomeFeature/SomeFeature.tsx +22 -0
- package/stacks/cratis-csharp/templates/root/SomeModule/SomeFeature/SomeName.cs +3 -0
- package/stacks/cratis-csharp/templates/root/SomeModule/SomeFeature/index.ts +1 -0
- package/stacks/cratis-csharp/templates/root/appsettings.Development.json +9 -0
- package/stacks/cratis-csharp/templates/root/appsettings.json +26 -0
- package/stacks/cratis-csharp/templates/root/docker-compose.yml +23 -0
- package/stacks/cratis-csharp/templates/root/package.json +33 -0
- package/stacks/cratis-csharp/templates/root/tsconfig.json +3 -0
- package/stacks/modeling-kit/templates/.claude/settings.local.json +13 -0
- package/stacks/modeling-kit/templates/.claude/skills/analyze-existing-model/SKILL.md +215 -0
- package/stacks/modeling-kit/templates/.claude/skills/attributes/SKILL.md +176 -0
- package/stacks/modeling-kit/templates/.claude/skills/connect/SKILL.md +182 -0
- package/stacks/modeling-kit/templates/.claude/skills/discover-storyboard/SKILL.md +383 -0
- package/stacks/modeling-kit/templates/.claude/skills/eventmodeling-applying-conways-law/SKILL.md +465 -0
- package/stacks/modeling-kit/templates/.claude/skills/eventmodeling-brainstorming-events/SKILL.md +587 -0
- package/stacks/modeling-kit/templates/.claude/skills/eventmodeling-brainstorming-events/references/facilitating-event-modeling-workshops.md +626 -0
- package/stacks/modeling-kit/templates/.claude/skills/eventmodeling-checking-completeness/SKILL.md +542 -0
- package/stacks/modeling-kit/templates/.claude/skills/eventmodeling-designing-event-models/SKILL.md +497 -0
- package/stacks/modeling-kit/templates/.claude/skills/eventmodeling-elaborating-scenarios/SKILL.md +783 -0
- package/stacks/modeling-kit/templates/.claude/skills/eventmodeling-identifying-inputs/SKILL.md +604 -0
- package/stacks/modeling-kit/templates/.claude/skills/eventmodeling-identifying-outputs/SKILL.md +699 -0
- package/stacks/modeling-kit/templates/.claude/skills/eventmodeling-integrating-legacy-systems/SKILL.md +674 -0
- package/stacks/modeling-kit/templates/.claude/skills/eventmodeling-optimizing-stream-design/SKILL.md +231 -0
- package/stacks/modeling-kit/templates/.claude/skills/eventmodeling-optimizing-stream-design/references/domain-patterns.md +150 -0
- package/stacks/modeling-kit/templates/.claude/skills/eventmodeling-optimizing-stream-design/references/patterns.md +329 -0
- package/stacks/modeling-kit/templates/.claude/skills/eventmodeling-optimizing-stream-design/references/snapshotting.md +204 -0
- package/stacks/modeling-kit/templates/.claude/skills/eventmodeling-orchestrating-event-modeling/SKILL.md +352 -0
- package/stacks/modeling-kit/templates/.claude/skills/eventmodeling-orchestrating-event-modeling/references/project-planning-with-event-modeling.md +341 -0
- package/stacks/modeling-kit/templates/.claude/skills/eventmodeling-plotting-events/SKILL.md +153 -0
- package/stacks/modeling-kit/templates/.claude/skills/eventmodeling-slicing-event-models/SKILL.md +136 -0
- package/stacks/modeling-kit/templates/.claude/skills/eventmodeling-slicing-event-models/references/examples.md +78 -0
- package/stacks/modeling-kit/templates/.claude/skills/eventmodeling-slicing-event-models/references/patterns.md +85 -0
- package/stacks/modeling-kit/templates/.claude/skills/eventmodeling-storyboarding-events/SKILL.md +655 -0
- package/stacks/modeling-kit/templates/.claude/skills/eventmodeling-translating-external-events/SKILL.md +479 -0
- package/stacks/modeling-kit/templates/.claude/skills/eventmodeling-validating-event-models/SKILL.md +234 -0
- package/stacks/modeling-kit/templates/.claude/skills/eventmodeling-validating-event-models-checklist/SKILL.md +353 -0
- package/stacks/modeling-kit/templates/.claude/skills/examples/SKILL.md +200 -0
- package/stacks/modeling-kit/templates/.claude/skills/handle-comment/SKILL.md +94 -0
- package/stacks/modeling-kit/templates/.claude/skills/learn-eventmodelers-api/SKILL.md +441 -0
- package/stacks/modeling-kit/templates/.claude/skills/place-element/SKILL.md +290 -0
- package/stacks/modeling-kit/templates/.claude/skills/storyboard/SKILL.md +212 -0
- package/stacks/modeling-kit/templates/.claude/skills/storyboard-screen/SKILL.md +123 -0
- package/stacks/modeling-kit/templates/.claude/skills/timeline/SKILL.md +353 -0
- package/stacks/modeling-kit/templates/.claude/skills/update-slice-status/SKILL.md +110 -0
- package/stacks/modeling-kit/templates/.claude/skills/wdyt/SKILL.md +134 -0
- package/stacks/modeling-kit/templates/kit/lib/agent.sh +20 -0
- package/stacks/modeling-kit/templates/kit/lib/ollama-agent.js +147 -0
- package/stacks/modeling-kit/templates/kit/lib/ralph.js +286 -0
- package/stacks/modeling-kit/templates/kit/package.json +12 -0
- package/stacks/modeling-kit/templates/kit/ralph-claude.js +50 -0
- package/stacks/modeling-kit/templates/kit/ralph-ollama.js +38 -0
- package/stacks/modeling-kit/templates/kit/ralph.sh +61 -0
- package/stacks/modeling-kit/templates/kit/realtime-agent.js +18 -0
- package/stacks/modeling-kit/templates/root/CLAUDE.md +56 -0
- package/stacks/node/templates/.claude/skills/build-automation/SKILL.md +266 -0
- package/stacks/node/templates/.claude/skills/build-state-change/SKILL.md +344 -0
- package/stacks/node/templates/.claude/skills/build-state-view/SKILL.md +412 -0
- package/stacks/node/templates/.claude/skills/connect/SKILL.md +178 -0
- package/stacks/node/templates/.claude/skills/learn-eventmodelers-api/SKILL.md +628 -0
- package/stacks/node/templates/.claude/skills/load-slice/SKILL.md +143 -0
- package/stacks/node/templates/.claude/skills/update-slice-status/SKILL.md +110 -0
- package/stacks/node/templates/build-kit/README.md +86 -0
- package/stacks/node/templates/build-kit/lib/AGENT.md +47 -0
- package/stacks/node/templates/build-kit/lib/agent.sh +20 -0
- package/stacks/node/templates/build-kit/lib/backend-prompt.md +152 -0
- package/stacks/node/templates/build-kit/lib/prompt.md +122 -0
- package/stacks/node/templates/build-kit/lib/ralph.js +369 -0
- package/stacks/node/templates/build-kit/ralph-claude.js +44 -0
- package/stacks/node/templates/build-kit/ralph.sh +98 -0
- package/stacks/node/templates/root/.env.example +15 -0
- package/stacks/node/templates/root/CLAUDE.md +60 -0
- package/stacks/node/templates/root/docker-compose.yml +15 -0
- package/stacks/node/templates/root/flyway.conf +17 -0
- package/stacks/node/templates/root/migrations/V1__schema.sql.example +12 -0
- package/stacks/node/templates/root/package.json +50 -0
- package/stacks/node/templates/root/server.ts +130 -0
- package/stacks/node/templates/root/setup-env.sh +53 -0
- package/stacks/node/templates/root/src/common/assertions.ts +6 -0
- package/stacks/node/templates/root/src/common/db.ts +32 -0
- package/stacks/node/templates/root/src/common/loadPostgresEventstore.ts +23 -0
- package/stacks/node/templates/root/src/common/parseEndpoint.ts +51 -0
- package/stacks/node/templates/root/src/common/processorDlq.ts +28 -0
- package/stacks/node/templates/root/src/common/realtimeBroadcast.ts +12 -0
- package/stacks/node/templates/root/src/common/replay.ts +16 -0
- package/stacks/node/templates/root/src/common/routes.ts +19 -0
- package/stacks/node/templates/root/src/common/testHelpers.ts +44 -0
- package/stacks/node/templates/root/src/swagger.ts +34 -0
- package/stacks/node/templates/root/src/util/assertions.ts +6 -0
- package/stacks/node/templates/root/src/util/hash.ts +9 -0
- package/stacks/node/templates/root/src/util/sanitize.ts +23 -0
- package/stacks/node/templates/root/tsconfig.json +32 -0
- package/stacks/node/templates/root/vercel.json +8 -0
- package/stacks/supabase/templates/.claude/skills/build-automation/SKILL.md +266 -0
- package/stacks/supabase/templates/.claude/skills/build-state-change/SKILL.md +344 -0
- package/stacks/supabase/templates/.claude/skills/build-state-view/SKILL.md +390 -0
- package/stacks/supabase/templates/.claude/skills/build-webhook/SKILL.md +303 -0
- package/stacks/supabase/templates/.claude/skills/connect/SKILL.md +178 -0
- package/stacks/supabase/templates/.claude/skills/learn-eventmodelers-api/SKILL.md +628 -0
- package/stacks/supabase/templates/.claude/skills/load-slice/SKILL.md +143 -0
- package/stacks/supabase/templates/.claude/skills/update-slice-status/SKILL.md +110 -0
- package/stacks/supabase/templates/build-kit/README.md +86 -0
- package/stacks/supabase/templates/build-kit/lib/AGENT.md +47 -0
- package/stacks/supabase/templates/build-kit/lib/agent.sh +20 -0
- package/stacks/supabase/templates/build-kit/lib/backend-prompt.md +152 -0
- package/stacks/supabase/templates/build-kit/lib/prompt.md +123 -0
- package/stacks/supabase/templates/build-kit/lib/ralph.js +369 -0
- package/stacks/supabase/templates/build-kit/ralph-claude.js +44 -0
- package/stacks/supabase/templates/build-kit/ralph.sh +98 -0
- package/stacks/supabase/templates/root/.env.example +22 -0
- package/stacks/supabase/templates/root/CLAUDE.md +61 -0
- package/stacks/supabase/templates/root/flyway.conf +17 -0
- package/stacks/supabase/templates/root/package.json +52 -0
- package/stacks/supabase/templates/root/server.ts +177 -0
- package/stacks/supabase/templates/root/setup-env.sh +53 -0
- package/stacks/supabase/templates/root/src/common/assertions.ts +6 -0
- package/stacks/supabase/templates/root/src/common/db.ts +32 -0
- package/stacks/supabase/templates/root/src/common/loadPostgresEventstore.ts +23 -0
- package/stacks/supabase/templates/root/src/common/parseEndpoint.ts +51 -0
- package/stacks/supabase/templates/root/src/common/processorDlq.ts +28 -0
- package/stacks/supabase/templates/root/src/common/realtimeBroadcast.ts +19 -0
- package/stacks/supabase/templates/root/src/common/replay.ts +16 -0
- package/stacks/supabase/templates/root/src/common/routes.ts +23 -0
- package/stacks/supabase/templates/root/src/common/testHelpers.ts +54 -0
- package/stacks/supabase/templates/root/src/supabase/README.md +141 -0
- package/stacks/supabase/templates/root/src/supabase/api.ts +56 -0
- package/stacks/supabase/templates/root/src/supabase/requireOrgaAdmin.ts +32 -0
- package/stacks/supabase/templates/root/src/supabase/requireSysUser.ts +40 -0
- package/stacks/supabase/templates/root/src/supabase/requireUser.ts +72 -0
- package/stacks/supabase/templates/root/src/swagger.ts +34 -0
- package/stacks/supabase/templates/root/src/util/assertions.ts +6 -0
- package/stacks/supabase/templates/root/src/util/hash.ts +9 -0
- package/stacks/supabase/templates/root/src/util/sanitize.ts +23 -0
- package/stacks/supabase/templates/root/supabase/config.toml +295 -0
- package/stacks/supabase/templates/root/supabase/migrations/V1__schema.sql.example +12 -0
- package/stacks/supabase/templates/root/supabase/seed.sql +1 -0
- package/stacks/supabase/templates/root/tsconfig.json +32 -0
- package/stacks/supabase/templates/root/vercel.json +8 -0
package/stacks/modeling-kit/templates/.claude/skills/eventmodeling-brainstorming-events/SKILL.md
ADDED
|
@@ -0,0 +1,587 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: eventmodeling-brainstorming-events
|
|
3
|
+
description: "Step 1 of Event Modeling - Brainstorm all domain events from requirements. Extract every state-changing event the system could have. Use when starting event modeling from requirements or a new domain. Do not use for: arranging events in sequence (use eventmodeling-plotting-events), designing commands or read models (use eventmodeling-designing-event-models), or when a complete event list already exists."
|
|
4
|
+
allowed-tools:
|
|
5
|
+
- AskUserQuestion
|
|
6
|
+
- Write
|
|
7
|
+
- Bash
|
|
8
|
+
---
|
|
9
|
+
|
|
10
|
+
# Brainstorming Events
|
|
11
|
+
|
|
12
|
+
> **Before doing anything else**, invoke the `connect` skill to resolve `TOKEN`, `BOARD_ID`, `ORG_ID`, and `BASE_URL`. Then invoke the `learn-eventmodelers-api` skill to load the full API reference. Do not proceed until both skills have been loaded.
|
|
13
|
+
|
|
14
|
+
## Interview Phase (Optional)
|
|
15
|
+
|
|
16
|
+
**When to Interview**: Skip if the user has provided detailed, well-documented requirements (written user stories, feature specs, business rules). Interview when requirements are vague, incomplete, or when domain expertise is uncertain.
|
|
17
|
+
|
|
18
|
+
**Interview Strategy**: Ensure requirements are complete and team understands domain well enough to brainstorm comprehensively. Identify hidden complexity areas upfront.
|
|
19
|
+
|
|
20
|
+
### Critical Questions
|
|
21
|
+
|
|
22
|
+
When requirements need clarification:
|
|
23
|
+
|
|
24
|
+
1. **Requirements Completeness** (Impact: Determines if brainstorm is likely to be exhaustive)
|
|
25
|
+
- Question: "How complete are your requirements? Do you have: (A) Written user stories/specs, (B) Documented business rules, (C) Rough list, (D) Just verbal descriptions?"
|
|
26
|
+
- Why it matters: Incomplete requirements cause missed events; complete requirements enable comprehensive brainstorm
|
|
27
|
+
- Follow-up triggers: If (C) or (D) → probe for missing scenarios; if rules aren't documented → ask team to state them explicitly
|
|
28
|
+
|
|
29
|
+
2. **Domain Expertise & Familiarity** (Impact: Shapes who should participate and what guidance is needed)
|
|
30
|
+
- Question: "Who understands this domain best? (A) Product/Domain expert leading brainstorm, (B) Engineering team figuring it out, (C) Mix of roles"
|
|
31
|
+
- Why it matters: Domain expert participation dramatically improves event completeness; solo engineering leads to gaps
|
|
32
|
+
- Follow-up triggers: If (B) → recommend inviting domain expert; if (C) → ask how decisions will be made
|
|
33
|
+
|
|
34
|
+
3. **Known Complexity Areas** (Impact: Determines where to focus brainstorming effort and depth)
|
|
35
|
+
- Question: "Are there specific areas known to be complex or error-prone? (e.g., payment processing, state transitions, business rules)"
|
|
36
|
+
- Why it matters: Complex areas often have hidden events; identifying them upfront ensures they're covered
|
|
37
|
+
- Follow-up triggers: For each complex area → ask "What are the edge cases? What can go wrong?"
|
|
38
|
+
|
|
39
|
+
4. **Explicit Business Rules & Constraints** (Impact: Ensures no implicit assumptions; may reveal missing events)
|
|
40
|
+
- Question: "What are critical business rules that govern this domain? (e.g., 'orders can only be cancelled within 24 hours', 'payments must be authorized before confirmation')"
|
|
41
|
+
- Why it matters: Business rules often generate specific events; documenting them prevents overlooking state changes
|
|
42
|
+
- Follow-up triggers: For each rule → ask "When this rule is violated, what event signals that?"
|
|
43
|
+
|
|
44
|
+
### Interview Flow
|
|
45
|
+
|
|
46
|
+
**Conditional Entry**:
|
|
47
|
+
```text
|
|
48
|
+
If user has provided:
|
|
49
|
+
- Written requirements or user stories (not just verbal)
|
|
50
|
+
- AND documented business rules or constraints
|
|
51
|
+
- AND named domain experts who will participate
|
|
52
|
+
|
|
53
|
+
Then: Skip interview, proceed directly to brainstorming
|
|
54
|
+
|
|
55
|
+
Else: Conduct interview
|
|
56
|
+
```
|
|
57
|
+
|
|
58
|
+
**Phase 1: Requirements Assessment** (Questions 1-2)
|
|
59
|
+
- Gauge requirements completeness
|
|
60
|
+
- Confirm domain expertise available
|
|
61
|
+
- Adjust brainstorm scope accordingly
|
|
62
|
+
|
|
63
|
+
**Phase 2: Complexity Mapping** (Questions 3-4)
|
|
64
|
+
- Identify areas needing deep exploration
|
|
65
|
+
- Document rules that may generate events
|
|
66
|
+
- Plan brainstorm focus areas
|
|
67
|
+
|
|
68
|
+
### Capturing Interview Findings
|
|
69
|
+
|
|
70
|
+
Append findings to the project's event modeling file:
|
|
71
|
+
|
|
72
|
+
**File**: `.trogonai/interviews/[project-name]/EVENTMODELING.md`
|
|
73
|
+
|
|
74
|
+
Use Write tool to add/update this section:
|
|
75
|
+
|
|
76
|
+
```markdown
|
|
77
|
+
## 2. Brainstormed Events (eventmodeling-brainstorming-events)
|
|
78
|
+
|
|
79
|
+
### Requirements Assessment
|
|
80
|
+
[From Q1: Written requirements? Documented rules?]
|
|
81
|
+
|
|
82
|
+
### Domain Expertise
|
|
83
|
+
[From Q2: Who understands domain? Available for participation?]
|
|
84
|
+
|
|
85
|
+
### Role Catalog
|
|
86
|
+
#### Human Roles
|
|
87
|
+
- [Role 1]: [Description] → Actions: [list]
|
|
88
|
+
- [Role 2]: [Description] → Actions: [list]
|
|
89
|
+
#### System Actors
|
|
90
|
+
- [Actor 1]: [Description] → Triggers: [list]
|
|
91
|
+
|
|
92
|
+
### Event Streams (Stream Roots)
|
|
93
|
+
- Stream: [Name] (Identity: [id field])
|
|
94
|
+
- Events: [Event1, Event2, Event3]
|
|
95
|
+
- State changes: [State transitions]
|
|
96
|
+
|
|
97
|
+
### Business Rules & Constraints
|
|
98
|
+
[From Q3 & Q4]
|
|
99
|
+
- Rule 1: [Statement] → [Events it generates]
|
|
100
|
+
- Rule 2: [Statement] → [Events it generates]
|
|
101
|
+
- Constraint 1: [Limitation]
|
|
102
|
+
|
|
103
|
+
### Brainstorming Focus Areas
|
|
104
|
+
- [Focus area 1]
|
|
105
|
+
- [Focus area 2]
|
|
106
|
+
```
|
|
107
|
+
|
|
108
|
+
Update Interview Trail:
|
|
109
|
+
```markdown
|
|
110
|
+
| 2 | eventmodeling-brainstorming-events | [today] | Event streams, business rules, constraints |
|
|
111
|
+
```
|
|
112
|
+
|
|
113
|
+
This section feeds into subsequent steps (plotting, storyboarding, etc.)
|
|
114
|
+
|
|
115
|
+
---
|
|
116
|
+
|
|
117
|
+
## Board Context
|
|
118
|
+
|
|
119
|
+
Before brainstorming, check for EVENT nodes already on the board to avoid duplicating events from a previous session:
|
|
120
|
+
|
|
121
|
+
```bash
|
|
122
|
+
curl -s -H "x-token: $TOKEN" -H "x-board-id: $BOARD_ID" \
|
|
123
|
+
"$BASE_URL/api/org/$ORG_ID/boards/$BOARD_ID/nodes?type=EVENT"
|
|
124
|
+
```
|
|
125
|
+
|
|
126
|
+
If events already exist, treat them as the starting list and focus on discovering what might be missing. Also check for existing chapters (timelines) so you can reuse them:
|
|
127
|
+
|
|
128
|
+
```bash
|
|
129
|
+
curl -s -H "x-token: $TOKEN" -H "x-board-id: $BOARD_ID" \
|
|
130
|
+
"$BASE_URL/api/org/$ORG_ID/boards/$BOARD_ID/nodes?type=CHAPTER"
|
|
131
|
+
```
|
|
132
|
+
|
|
133
|
+
## Timeline Discovery (Mandatory Before Placing Any Event)
|
|
134
|
+
|
|
135
|
+
Brainstorming is where timelines are discovered. **Every event must be placed into its dedicated timeline — never into a generic or unnamed chapter.** Later steps (storyboarding, commands, scenarios) operate on one timeline at a time; the chapter structure set here drives that entire downstream focus.
|
|
136
|
+
|
|
137
|
+
### 1. Group events by workflow / bounded context
|
|
138
|
+
|
|
139
|
+
After completing the analysis, partition the full event list into groups where each group:
|
|
140
|
+
- Represents a single, coherent business process (e.g., Catalogue Management, Reservation, Overdue & Payments)
|
|
141
|
+
- Can be understood as a standalone narrative on its own
|
|
142
|
+
- Would be naturally owned by one team or one domain expert
|
|
143
|
+
|
|
144
|
+
If all events belong to a single flow, one timeline is correct — do not split artificially.
|
|
145
|
+
|
|
146
|
+
### 2. Create one chapter per group
|
|
147
|
+
|
|
148
|
+
For each group, create a chapter on the board **before placing any events**. Reuse an existing chapter if one already matches the workflow name.
|
|
149
|
+
|
|
150
|
+
**Create a chapter:**
|
|
151
|
+
```bash
|
|
152
|
+
curl -s -X POST "$BASE_URL/api/org/$ORG_ID/boards/$BOARD_ID/chapters" \
|
|
153
|
+
-H "x-token: $TOKEN" -H "x-board-id: $BOARD_ID" \
|
|
154
|
+
-H "Content-Type: application/json" -d '{}'
|
|
155
|
+
# → { timelineId: "<chapterId>", ... }
|
|
156
|
+
```
|
|
157
|
+
|
|
158
|
+
**Immediately set its title** (use the workflow / bounded-context name):
|
|
159
|
+
```bash
|
|
160
|
+
curl -s -X POST "$BASE_URL/api/org/$ORG_ID/boards/$BOARD_ID/nodes/events" \
|
|
161
|
+
-H "x-token: $TOKEN" -H "x-board-id: $BOARD_ID" \
|
|
162
|
+
-H "x-user-id: brainstorming-events" -H "Content-Type: application/json" \
|
|
163
|
+
-d '[{
|
|
164
|
+
"id": "<uuid>",
|
|
165
|
+
"eventType": "node:changed",
|
|
166
|
+
"nodeId": "<chapterId>",
|
|
167
|
+
"boardId": "<boardId>",
|
|
168
|
+
"timestamp": 1234567890,
|
|
169
|
+
"meta": {"type": "CHAPTER", "title": "Reservation & Lending"}
|
|
170
|
+
}]'
|
|
171
|
+
```
|
|
172
|
+
|
|
173
|
+
**Stack timelines vertically so they do not overlap.**
|
|
174
|
+
After creating each chapter, position it below the previous one. Use `y = index * 1200` (0-based creation order), `x = 0`. If existing chapters are already on the board, query their positions first and place the new chapter below the lowest one (`y = maxExistingY + 1200`):
|
|
175
|
+
|
|
176
|
+
```bash
|
|
177
|
+
curl -s -X PUT "$BASE_URL/api/org/$ORG_ID/boards/$BOARD_ID/timelines/$TL/position" \
|
|
178
|
+
-H "x-token: $TOKEN" -H "x-board-id: $BOARD_ID" \
|
|
179
|
+
-H "Content-Type: application/json" \
|
|
180
|
+
-d '{"x": 0, "y": 1200}' # first chapter: y=0, second: y=1200, third: y=2400, …
|
|
181
|
+
```
|
|
182
|
+
|
|
183
|
+
Record the mapping: `workflow name → chapterId`. Every subsequent event placement will reference this ID.
|
|
184
|
+
|
|
185
|
+
### 3. Place each event into its chapter
|
|
186
|
+
|
|
187
|
+
When creating an EVENT node, always set `chapterId` to the matching chapter from step 2. No event may be placed without a `chapterId`.
|
|
188
|
+
|
|
189
|
+
## Event Fields (Mandatory)
|
|
190
|
+
|
|
191
|
+
When creating EVENT nodes on the board via `node:created`, you **must** include the event's key fields in `meta.fields`. An event without fields is an opaque label — it cannot be used to validate completeness, write scenarios, or generate code.
|
|
192
|
+
|
|
193
|
+
Fields use this structure inside `meta`:
|
|
194
|
+
|
|
195
|
+
```json
|
|
196
|
+
{
|
|
197
|
+
"type": "EVENT",
|
|
198
|
+
"title": "OrderPlaced",
|
|
199
|
+
"fields": [
|
|
200
|
+
{"name": "orderId", "type": "String", "example": "order-abc123"},
|
|
201
|
+
{"name": "customerId", "type": "String", "example": "cust-456"},
|
|
202
|
+
{"name": "total", "type": "Number", "example": "149.99"},
|
|
203
|
+
{"name": "status", "type": "String", "example": "Draft"},
|
|
204
|
+
{"name": "placedAt", "type": "Date", "example": "2026-05-29T10:00:00Z"}
|
|
205
|
+
]
|
|
206
|
+
}
|
|
207
|
+
```
|
|
208
|
+
|
|
209
|
+
**Rules for fields:**
|
|
210
|
+
- Start with **essential fields only** — the identity key(s) plus the one or two facts that make this event meaningful. Do not try to enumerate every field a consumer might eventually want; that enrichment happens later via `/attributes`.
|
|
211
|
+
- Use domain names, not technical names (`memberId` not `userId`, `dueDate` not `due_at`)
|
|
212
|
+
- Do **not** include computed or derived values — those belong in read models
|
|
213
|
+
- If an event has no meaningful payload beyond its identity (e.g., a simple state transition), it is fine to have no fields or just the identity key
|
|
214
|
+
- Do not pad events with fields just to reach a count — only add what the business needs
|
|
215
|
+
- Every field must set `"cardinality"` — use `"Single"` unless the field is genuinely a list of values, in which case use `"List"`. Default to `"Single"` when unsure.
|
|
216
|
+
|
|
217
|
+
## Cell Placement
|
|
218
|
+
|
|
219
|
+
Brainstorming events has two modes. Choose based on whether the chapter (timeline) already exists.
|
|
220
|
+
|
|
221
|
+
### Mode A — Brainstorming inside a timeline (chapter exists)
|
|
222
|
+
|
|
223
|
+
When a chapter is available, place each event directly into it. **Include `cellId` in `node:created`** — without it the node has no cell reference and will appear stranded at position 0,0 on the canvas.
|
|
224
|
+
|
|
225
|
+
For each event:
|
|
226
|
+
|
|
227
|
+
**Step A — Create a column** (append at end of the chapter):
|
|
228
|
+
```bash
|
|
229
|
+
curl -s -X POST "$BASE_URL/api/org/$ORG_ID/boards/$BOARD_ID/timelines/$CHAPTER_ID/columns" \
|
|
230
|
+
-H "x-token: $TOKEN" -H "x-board-id: $BOARD_ID" -H "x-user-id: brainstorming-events" \
|
|
231
|
+
-H "Content-Type: application/json" -d '{}'
|
|
232
|
+
# → { "columnId": "<colUuid>", "index": <n>, "totalColumns": <n> }
|
|
233
|
+
```
|
|
234
|
+
|
|
235
|
+
**Step B — Fetch the chapter to find the swimlane row ID** (only needed once per chapter):
|
|
236
|
+
```bash
|
|
237
|
+
curl -s -H "x-token: $TOKEN" -H "x-board-id: $BOARD_ID" \
|
|
238
|
+
"$BASE_URL/api/org/$ORG_ID/boards/$BOARD_ID/nodes/$CHAPTER_ID"
|
|
239
|
+
# → node.meta.timelineData.rows — find the row where type === "swimlane"
|
|
240
|
+
```
|
|
241
|
+
|
|
242
|
+
**Step C — Compute:** `cellId = swimlaneRow.id + "-" + columnId`
|
|
243
|
+
|
|
244
|
+
**Step D — Create the event with `cellId`:**
|
|
245
|
+
```json
|
|
246
|
+
[{
|
|
247
|
+
"id": "<event-uuid>",
|
|
248
|
+
"eventType": "node:created",
|
|
249
|
+
"nodeId": "<node-uuid>",
|
|
250
|
+
"boardId": "<boardId>",
|
|
251
|
+
"timestamp": 1234567890,
|
|
252
|
+
"chapterId": "<chapterId>",
|
|
253
|
+
"cellId": "<swimlaneRowId>-<columnId>",
|
|
254
|
+
"meta": {
|
|
255
|
+
"type": "EVENT",
|
|
256
|
+
"title": "BookReserved",
|
|
257
|
+
"fields": [
|
|
258
|
+
{"name": "reservationId", "type": "String", "example": "res-789"},
|
|
259
|
+
{"name": "copyId", "type": "String", "example": "copy-42"},
|
|
260
|
+
{"name": "memberId", "type": "String", "example": "mbr-101"},
|
|
261
|
+
{"name": "expiresAt", "type": "Date", "example": "2026-06-01T00:00:00Z"},
|
|
262
|
+
{"name": "reservedAt", "type": "Date", "example": "2026-05-29T10:00:00Z"}
|
|
263
|
+
]
|
|
264
|
+
}
|
|
265
|
+
}]
|
|
266
|
+
```
|
|
267
|
+
|
|
268
|
+
> **Never call `drop` after using `cellId` in `node:created`.** The drop endpoint adds a second cell reference without removing the first. `node:created + cellId` is the only placement step needed.
|
|
269
|
+
|
|
270
|
+
### Mode B — Free-form brainstorming (no chapter yet)
|
|
271
|
+
|
|
272
|
+
When chapters have not been created yet, events may be created without `chapterId` or `cellId`. They appear as free-floating sticky notes on the canvas. This is valid during open discovery.
|
|
273
|
+
|
|
274
|
+
**After free-form brainstorming completes**, all events MUST be assigned to a named chapter before Step 2 (Plotting) can begin:
|
|
275
|
+
- Group events into workflows / bounded contexts (see "Timeline Discovery" above)
|
|
276
|
+
- Create one chapter per group
|
|
277
|
+
- Move each event into its chapter using `node:changed` to set `chapterId` and `cellId`
|
|
278
|
+
|
|
279
|
+
An event left without a chapter and cell reference will never appear in any timeline column and cannot be sequenced, storyboarded, or used in scenarios.
|
|
280
|
+
|
|
281
|
+
## Swimlane Rules (Mandatory)
|
|
282
|
+
|
|
283
|
+
Do not create unnecessary swimlanes. Before adding a lane, check whether an existing lane already covers the element's type. If yes, place the element in that lane.
|
|
284
|
+
|
|
285
|
+
**Only create a new swimlane when:**
|
|
286
|
+
- A new actor is introduced that has no existing lane, **or**
|
|
287
|
+
- An explicit business rule requires a distinct lane
|
|
288
|
+
|
|
289
|
+
**Never** add a swimlane just to group things visually or because a second role appears — use the existing lane if the type matches.
|
|
290
|
+
|
|
291
|
+
---
|
|
292
|
+
|
|
293
|
+
## Workshop Facilitation Guide
|
|
294
|
+
|
|
295
|
+
**Setting**: This is a collaborative brainstorming workshop. The facilitator guides participants to envision the system and extract events rapidly.
|
|
296
|
+
|
|
297
|
+
### The Brainstorming Flow
|
|
298
|
+
|
|
299
|
+
**Phase 1: Understand Goals** (5-10 min)
|
|
300
|
+
- Someone explains project goals
|
|
301
|
+
- What problem are we solving?
|
|
302
|
+
- Who are the users?
|
|
303
|
+
- What are key outcomes?
|
|
304
|
+
|
|
305
|
+
**Phase 2: Free Brainstorm** (15-20 min)
|
|
306
|
+
Facilitator asks:
|
|
307
|
+
> "What events could happen in this system? When something changes, what event occurs? Put down ANY event you think of."
|
|
308
|
+
|
|
309
|
+
Participants call out events (sticky notes or digital cards):
|
|
310
|
+
```text
|
|
311
|
+
"Customer places order"
|
|
312
|
+
"Order confirmed"
|
|
313
|
+
"Payment received"
|
|
314
|
+
"Inventory updated"
|
|
315
|
+
"Order shipped"
|
|
316
|
+
"Delivery confirmed"
|
|
317
|
+
"Return requested"
|
|
318
|
+
"Refund issued"
|
|
319
|
+
```
|
|
320
|
+
|
|
321
|
+
**Phase 3: Gentle Filtering** (10-15 min)
|
|
322
|
+
Facilitator introduces state-changing concept gently:
|
|
323
|
+
|
|
324
|
+
```text
|
|
325
|
+
Facilitator: "Now let's think about these events. An event is something that
|
|
326
|
+
CHANGED THE STATE of the system. It's something important that happened that
|
|
327
|
+
others need to know about.
|
|
328
|
+
|
|
329
|
+
Let me ask: Does 'Customer viewed the catalog' change anything?
|
|
330
|
+
Participants: "Well... no, they just looked."
|
|
331
|
+
Facilitator: "Right, so it's not an event. But if they SELECTED an item
|
|
332
|
+
from catalog, that changes what's in their cart, so that's
|
|
333
|
+
a state change. Call that 'ItemAddedToCart'."
|
|
334
|
+
|
|
335
|
+
Does 'Payment received' change something?
|
|
336
|
+
Participants: "Yes! Order goes from confirmed to paid."
|
|
337
|
+
Facilitator: "Exactly! That's an event—state changed."
|
|
338
|
+
```
|
|
339
|
+
|
|
340
|
+
**Key points to clarify**:
|
|
341
|
+
- "Customer logged in" → Maybe not state-changing (unless we track logins)
|
|
342
|
+
- "Customer created account" → State-changing event
|
|
343
|
+
- "System checked inventory" → Internal action, not state-changing
|
|
344
|
+
- "Inventory reserved" → State-changing event
|
|
345
|
+
- "Email sent" → Notification, not state-changing (unless we track email history)
|
|
346
|
+
- "Notification requested" → Could be state-changing if we track preferences
|
|
347
|
+
|
|
348
|
+
### Tips for Facilitators
|
|
349
|
+
|
|
350
|
+
**Make it conversational**:
|
|
351
|
+
- Don't say: "You identified a non-state-changing event"
|
|
352
|
+
- Say: "Interesting! Does that actually change anything in the system?"
|
|
353
|
+
|
|
354
|
+
**Use examples from their world**:
|
|
355
|
+
- If e-commerce: "Like if someone just browsed but didn't buy?"
|
|
356
|
+
- If banking: "Like if they just checked balance but didn't withdraw?"
|
|
357
|
+
|
|
358
|
+
**Don't be rigid**:
|
|
359
|
+
- If unsure whether something is state-changing, include it and refine later
|
|
360
|
+
- Some events seem minor now but matter in implementation
|
|
361
|
+
- Better to capture everything than miss important events
|
|
362
|
+
|
|
363
|
+
**Capture the "why"**:
|
|
364
|
+
- Don't just list events, capture context
|
|
365
|
+
- Why would this event matter?
|
|
366
|
+
- Who cares about it? (Other systems, views, business rules)
|
|
367
|
+
|
|
368
|
+
## Workflow
|
|
369
|
+
|
|
370
|
+
When given domain requirements, perform the following analysis:
|
|
371
|
+
|
|
372
|
+
### 1. Identify User Roles & Actors (MANDATORY)
|
|
373
|
+
|
|
374
|
+
Before brainstorming events, define **who** interacts with the system. Every event model needs an explicit role catalog — without it, downstream steps (storyboarding, commands, scenarios) lack clarity on who does what.
|
|
375
|
+
|
|
376
|
+
Identify all human roles and system actors:
|
|
377
|
+
- **Human roles**: Customer, Seller, Admin, Support Agent, Reviewer, etc.
|
|
378
|
+
- **System actors**: Payment Gateway, Inventory System, Notification Service, Scheduler, etc.
|
|
379
|
+
|
|
380
|
+
For each role/actor, document:
|
|
381
|
+
- **Name**: Use domain language (e.g., "Seller" not "User Type B")
|
|
382
|
+
- **Description**: What this role does in the domain (1-2 sentences)
|
|
383
|
+
- **Key actions**: What state changes can this role initiate?
|
|
384
|
+
- **Permissions boundary**: What can this role NOT do?
|
|
385
|
+
|
|
386
|
+
Present as a Role Catalog:
|
|
387
|
+
|
|
388
|
+
```text
|
|
389
|
+
## Role Catalog
|
|
390
|
+
|
|
391
|
+
### Human Roles
|
|
392
|
+
|
|
393
|
+
1. **Customer** - Description: End user who browses, purchases, and tracks orders
|
|
394
|
+
- Key actions: Create order, confirm order, cancel order, submit review
|
|
395
|
+
- Cannot: Manage inventory, process refunds, respond to reviews as seller
|
|
396
|
+
|
|
397
|
+
2. **Seller** - Description: Merchant who lists products and fulfills orders
|
|
398
|
+
- Key actions: List product, confirm stock, respond to reviews, update pricing
|
|
399
|
+
- Cannot: Place orders, approve own reviews, process payments
|
|
400
|
+
|
|
401
|
+
3. **Support Agent** - Description: Internal staff handling escalations and manual overrides
|
|
402
|
+
- Key actions: Override order status, issue refunds, flag reviews
|
|
403
|
+
- Cannot: Place orders on behalf of customers (unless impersonating)
|
|
404
|
+
|
|
405
|
+
### System Actors
|
|
406
|
+
|
|
407
|
+
1. **Payment Gateway** (external)
|
|
408
|
+
- Triggers: Payment authorization, payment failure, refund confirmation
|
|
409
|
+
- Communication: Webhooks
|
|
410
|
+
|
|
411
|
+
2. **Inventory System** (internal)
|
|
412
|
+
- Triggers: Reserve inventory, release reservation
|
|
413
|
+
- Communication: Event-driven
|
|
414
|
+
```
|
|
415
|
+
|
|
416
|
+
This catalog feeds directly into:
|
|
417
|
+
- **Step 3 (Storyboarding)**: One swimlane per human role
|
|
418
|
+
- **Step 4 (Inputs)**: Every command attributed to a specific role/actor
|
|
419
|
+
- **Step 7 (Scenarios)**: Scenarios reference roles by name
|
|
420
|
+
- **Step 8 (Completeness)**: Verify every role has at least one command path
|
|
421
|
+
|
|
422
|
+
### 2. Identify Event Streams (Stream Roots)
|
|
423
|
+
Identify the main entities that will have event streams. These are NOT DDD aggregates—they're simply the logical roots of events:
|
|
424
|
+
- User/Account
|
|
425
|
+
- Order
|
|
426
|
+
- Payment
|
|
427
|
+
- Shipment
|
|
428
|
+
- etc.
|
|
429
|
+
|
|
430
|
+
For each stream root, note:
|
|
431
|
+
- Name (use domain language, not technical terms)
|
|
432
|
+
- Identity key (what uniquely identifies instances: orderId, paymentId, customerId, etc.)
|
|
433
|
+
- What commands will affect it (we'll define state needs per command, not upfront)
|
|
434
|
+
|
|
435
|
+
### 3. Identify Business Processes
|
|
436
|
+
Map out critical workflows:
|
|
437
|
+
- What steps does a user go through?
|
|
438
|
+
- What are the decision points?
|
|
439
|
+
- Where do systems integrate?
|
|
440
|
+
|
|
441
|
+
### 4. Extract State Changes
|
|
442
|
+
For each process, identify what state changes occur:
|
|
443
|
+
- Customer places order → Order created
|
|
444
|
+
- Payment processed → Order confirmed
|
|
445
|
+
- Item shipped → Order status changed
|
|
446
|
+
|
|
447
|
+
These become your domain events.
|
|
448
|
+
|
|
449
|
+
### 5. Document Business Rules & Constraints
|
|
450
|
+
- What rules govern state transitions?
|
|
451
|
+
- What validations must pass?
|
|
452
|
+
- What are the invariants?
|
|
453
|
+
|
|
454
|
+
Examples:
|
|
455
|
+
- "Order can only be shipped if payment is confirmed"
|
|
456
|
+
- "Inventory must be reserved before order confirmation"
|
|
457
|
+
- "Customer can only cancel within 24 hours"
|
|
458
|
+
|
|
459
|
+
### 6. Create Analysis Document
|
|
460
|
+
|
|
461
|
+
Present findings in this structure (include facilitation notes for future workshops):
|
|
462
|
+
|
|
463
|
+
```markdown
|
|
464
|
+
## Workshop Notes
|
|
465
|
+
|
|
466
|
+
**Participants**: [List roles: PO, Dev, QA, Domain Expert]
|
|
467
|
+
**Duration**: [Time spent]
|
|
468
|
+
**Key facilitation moments**: [What helped clarify understanding?]
|
|
469
|
+
|
|
470
|
+
---
|
|
471
|
+
|
|
472
|
+
# Domain Analysis: [Domain Name]
|
|
473
|
+
|
|
474
|
+
## Role Catalog
|
|
475
|
+
|
|
476
|
+
### Human Roles
|
|
477
|
+
1. **[Role Name]**: [Description]
|
|
478
|
+
- Key actions: [What this role can do]
|
|
479
|
+
- Cannot: [Permission boundaries]
|
|
480
|
+
|
|
481
|
+
### System Actors
|
|
482
|
+
1. **[Actor Name]** ([internal/external]): [Description]
|
|
483
|
+
- Triggers: [What events/commands it initiates]
|
|
484
|
+
- Communication: [Webhooks / Event-driven / API]
|
|
485
|
+
|
|
486
|
+
## Event Streams (Stream Roots)
|
|
487
|
+
List each stream root and its identity:
|
|
488
|
+
- **Stream**: Review (Identity: reviewId)
|
|
489
|
+
- **Stream**: SellerResponse (Identity: responseId)
|
|
490
|
+
- **Stream**: Seller (Identity: sellerId)
|
|
491
|
+
|
|
492
|
+
Note: These are just the logical groupings of events. The STATE needed for each command will be determined later—not all stream attributes are needed for all commands.
|
|
493
|
+
|
|
494
|
+
## Business Processes
|
|
495
|
+
1. **Process Name**: Description
|
|
496
|
+
- Actor: Who initiates?
|
|
497
|
+
- Steps: 1. → 2. → 3.
|
|
498
|
+
- Outcomes: What changes?
|
|
499
|
+
|
|
500
|
+
## Identified State Changes (Potential Events)
|
|
501
|
+
- [Stream] [Verb]: When? Why? (Use past tense: "ReviewPublished", "SellerResponseAdded")
|
|
502
|
+
|
|
503
|
+
## Business Rules & Constraints
|
|
504
|
+
- Rule 1: Condition and consequence
|
|
505
|
+
- Rule 2: Constraint description
|
|
506
|
+
|
|
507
|
+
## Questions for Domain Expert
|
|
508
|
+
- Any gaps in understanding?
|
|
509
|
+
- Unclear processes?
|
|
510
|
+
```
|
|
511
|
+
|
|
512
|
+
## Output Format
|
|
513
|
+
Present analysis in a clear markdown structure that can be directly used by the eventmodeling-designing-event-models skill.
|
|
514
|
+
|
|
515
|
+
## Core Architectural Rule
|
|
516
|
+
|
|
517
|
+
**NEVER use DDD Aggregate pattern for state design** Every command handler must have its own minimal state projection derived from events. This is non-negotiable.
|
|
518
|
+
|
|
519
|
+
```text
|
|
520
|
+
ANTI-PATTERN (Do NOT do this):
|
|
521
|
+
OrderAggregate { orderId, customerId, items[], total, status, paymentId, address, shippedAt, cancelledAt, ... }
|
|
522
|
+
Used by: ConfirmOrder, ShipOrder, CancelOrder, ApproveReturn
|
|
523
|
+
Problem: Loads unused data, couples unrelated commands, violates minimal state principle
|
|
524
|
+
|
|
525
|
+
CORRECT PATTERN:
|
|
526
|
+
ConfirmOrderState { status, orderId }
|
|
527
|
+
ShipOrderState { status, orderId, paymentId }
|
|
528
|
+
CancelOrderState { status, orderId, createdAt }
|
|
529
|
+
Each command loads ONLY what it needs.
|
|
530
|
+
```
|
|
531
|
+
|
|
532
|
+
## Key Principles
|
|
533
|
+
- Use **domain language**, not technical terms
|
|
534
|
+
- Focus on **what** happens, not **how** it's implemented
|
|
535
|
+
- Identify **state changes** as events, not actions (gently!)
|
|
536
|
+
- Document **constraints** and **rules**
|
|
537
|
+
- Be **specific** with examples from the requirements
|
|
538
|
+
- **Collaborative Process**: This is a group brainstorm, not a solo analysis
|
|
539
|
+
- **Rapid Iteration**: Capture quickly, refine later
|
|
540
|
+
- **Gentle Filtering**: Introduce "state-changing events" concept conversationally, not as rigid rule
|
|
541
|
+
- **Event Sourcing Mindset**: Think in terms of immutable events and stream roots, NOT DDD aggregates. The stream root is just a logical grouping of events; state is minimal and command-specific.
|
|
542
|
+
- **Defer State Design**: Don't list all entity attributes upfront. In the model designer step, we'll define minimal state projections needed for each specific command.
|
|
543
|
+
- **Command State Isolation**: Each command handler has its own state shape. Different commands = different state interfaces.
|
|
544
|
+
|
|
545
|
+
## Best Practices for Requirements Analysis
|
|
546
|
+
|
|
547
|
+
### 1. Be Specific with Requirements
|
|
548
|
+
Provide concrete examples and clear scope:
|
|
549
|
+
- "Handle orders"
|
|
550
|
+
- "Orders have items, pricing, delivery address, and can be cancelled within 24 hours"
|
|
551
|
+
|
|
552
|
+
### 2. Use Domain Language
|
|
553
|
+
Use terms your business understands, not technical jargon:
|
|
554
|
+
- "obj1 references obj2"
|
|
555
|
+
- "Customer places Order with Products"
|
|
556
|
+
|
|
557
|
+
### 3. Document Constraints Explicitly
|
|
558
|
+
Make implicit rules explicit:
|
|
559
|
+
- "Process payments"
|
|
560
|
+
- "Authorize payment before marking order confirmed; refund if shipment fails"
|
|
561
|
+
|
|
562
|
+
### 4. Verify Role Catalog Completeness
|
|
563
|
+
Cross-check that the Role Catalog (from Step 1) covers all actors referenced in events and processes:
|
|
564
|
+
- "Orders can be created" (by whom?)
|
|
565
|
+
- "Customers can create orders; sellers can confirm stock; system can cancel if payment fails"
|
|
566
|
+
|
|
567
|
+
### 5. Cover Edge Cases
|
|
568
|
+
Include error and boundary conditions:
|
|
569
|
+
- "What happens if payment is declined?"
|
|
570
|
+
- "Can an order be modified after shipping starts?"
|
|
571
|
+
- "What triggers order cancellation?"
|
|
572
|
+
|
|
573
|
+
## Quality Checklist
|
|
574
|
+
|
|
575
|
+
- [ ] Every event is past tense and names a completed state change (e.g., `OrderPlaced`, not `PlaceOrder`)
|
|
576
|
+
- [ ] **Every event node includes `meta.fields` for all fields that are meaningful from a business perspective** — fields that consumers of this event will use
|
|
577
|
+
- [ ] Fields are only included when they add business value (an event with no payload fields is acceptable if the event title alone carries the meaning)
|
|
578
|
+
- [ ] Role Catalog lists every actor (human roles and system processors) with distinct responsibilities
|
|
579
|
+
- [ ] Each event can be traced back to a specific actor in the Role Catalog
|
|
580
|
+
- [ ] No CRUD events (`UserUpdated`, `RecordDeleted`) — events describe business moments, not database operations
|
|
581
|
+
- [ ] All known error and boundary conditions have corresponding events
|
|
582
|
+
- [ ] No empty columns left in the timeline
|
|
583
|
+
- [ ] Events group into at least one recognizable business process flow
|
|
584
|
+
- [ ] No overlapping event semantics — two events don't mean the same thing
|
|
585
|
+
- [ ] Every event is placed into a **named chapter** — no event left in an untitled or default timeline
|
|
586
|
+
- [ ] **Multiple chapters are stacked vertically** (y offset of 1200 per chapter) — no two chapters overlap on the canvas
|
|
587
|
+
- [ ] No unnecessary swimlanes created — existing lanes reused when the type matches; new lanes added only for new actors or explicit business rules
|