@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.
Files changed (220) hide show
  1. package/README.md +175 -0
  2. package/cli.js +676 -0
  3. package/package.json +35 -0
  4. package/shared/build-kit/code-export.mjs +560 -0
  5. package/shared/build-kit/lib/ollama-agent.js +147 -0
  6. package/shared/build-kit/package.json +11 -0
  7. package/shared/build-kit/ralph-ollama.js +39 -0
  8. package/shared/build-kit/realtime-agent.js +18 -0
  9. package/stacks/axon/templates/.claude/skills/build-automation/SKILL.md +407 -0
  10. package/stacks/axon/templates/.claude/skills/build-automation/references/feature-flag-patterns.md +114 -0
  11. package/stacks/axon/templates/.claude/skills/build-automation-workflow/SKILL.md +496 -0
  12. package/stacks/axon/templates/.claude/skills/build-automation-workflow/references/axon-workflow-api.md +279 -0
  13. package/stacks/axon/templates/.claude/skills/build-automation-workflow/references/feature-flag-patterns.md +114 -0
  14. package/stacks/axon/templates/.claude/skills/build-state-change/SKILL.md +396 -0
  15. package/stacks/axon/templates/.claude/skills/build-state-change/references/axon-test-fixture-patterns.md +162 -0
  16. package/stacks/axon/templates/.claude/skills/build-state-change/references/feature-flag-patterns.md +56 -0
  17. package/stacks/axon/templates/.claude/skills/build-state-change/references/rest-api-patterns.md +115 -0
  18. package/stacks/axon/templates/.claude/skills/build-state-view/SKILL.md +282 -0
  19. package/stacks/axon/templates/.claude/skills/connect/SKILL.md +178 -0
  20. package/stacks/axon/templates/.claude/skills/learn-eventmodelers-api/SKILL.md +611 -0
  21. package/stacks/axon/templates/.claude/skills/load-slice/SKILL.md +141 -0
  22. package/stacks/axon/templates/.claude/skills/update-slice-status/SKILL.md +105 -0
  23. package/stacks/axon/templates/build-kit/lib/AGENT.md +47 -0
  24. package/stacks/axon/templates/build-kit/lib/agent.sh +20 -0
  25. package/stacks/axon/templates/build-kit/lib/backend-prompt.md +158 -0
  26. package/stacks/axon/templates/build-kit/lib/prompt.md +126 -0
  27. package/stacks/axon/templates/build-kit/lib/ralph.js +369 -0
  28. package/stacks/axon/templates/build-kit/ralph-claude.js +44 -0
  29. package/stacks/axon/templates/build-kit/ralph.sh +98 -0
  30. package/stacks/axon/templates/root/.env.example +5 -0
  31. package/stacks/axon/templates/root/CLAUDE.md +60 -0
  32. package/stacks/axon/templates/root/README.md +44 -0
  33. package/stacks/axon/templates/root/docker-compose.yml +64 -0
  34. package/stacks/axon/templates/root/mvnw +259 -0
  35. package/stacks/axon/templates/root/mvnw.cmd +149 -0
  36. package/stacks/axon/templates/root/pom.xml +125 -0
  37. package/stacks/axon/templates/root/src/main/java/io/axoniq/quickstart/QuickstartApplication.java +128 -0
  38. package/stacks/axon/templates/root/src/main/java/io/axoniq/quickstart/config/WebConfig.java +155 -0
  39. package/stacks/axon/templates/root/src/main/resources/application.properties +2 -0
  40. package/stacks/axon/templates/root/src/main/resources/static/bg-body.png +0 -0
  41. package/stacks/axon/templates/root/src/main/resources/static/bg-header.png +0 -0
  42. package/stacks/axon/templates/root/src/main/resources/static/index.html +596 -0
  43. package/stacks/cratis-csharp/templates/.claude/skills/_shared/cratis-conventions.md +251 -0
  44. package/stacks/cratis-csharp/templates/.claude/skills/build-automation/SKILL.md +99 -0
  45. package/stacks/cratis-csharp/templates/.claude/skills/build-automation/references/patterns.md +115 -0
  46. package/stacks/cratis-csharp/templates/.claude/skills/build-state-change/SKILL.md +163 -0
  47. package/stacks/cratis-csharp/templates/.claude/skills/build-state-change/references/patterns.md +234 -0
  48. package/stacks/cratis-csharp/templates/.claude/skills/build-state-view/SKILL.md +120 -0
  49. package/stacks/cratis-csharp/templates/.claude/skills/build-state-view/references/patterns.md +166 -0
  50. package/stacks/cratis-csharp/templates/.claude/skills/connect/SKILL.md +169 -0
  51. package/stacks/cratis-csharp/templates/.claude/skills/learn-eventmodelers-api/SKILL.md +609 -0
  52. package/stacks/cratis-csharp/templates/.claude/skills/load-slice/SKILL.md +141 -0
  53. package/stacks/cratis-csharp/templates/.claude/skills/update-slice-status/SKILL.md +105 -0
  54. package/stacks/cratis-csharp/templates/build-kit/lib/AGENT.md +58 -0
  55. package/stacks/cratis-csharp/templates/build-kit/lib/agent.sh +20 -0
  56. package/stacks/cratis-csharp/templates/build-kit/lib/backend-prompt.md +129 -0
  57. package/stacks/cratis-csharp/templates/build-kit/lib/prompt.md +124 -0
  58. package/stacks/cratis-csharp/templates/build-kit/lib/ralph.js +302 -0
  59. package/stacks/cratis-csharp/templates/build-kit/ralph-claude.js +37 -0
  60. package/stacks/cratis-csharp/templates/build-kit/ralph.sh +98 -0
  61. package/stacks/cratis-csharp/templates/root/.frontend/index.css +29 -0
  62. package/stacks/cratis-csharp/templates/root/.frontend/index.html +17 -0
  63. package/stacks/cratis-csharp/templates/root/.frontend/main.tsx +18 -0
  64. package/stacks/cratis-csharp/templates/root/.frontend/tsconfig.json +42 -0
  65. package/stacks/cratis-csharp/templates/root/.frontend/tsconfig.node.json +11 -0
  66. package/stacks/cratis-csharp/templates/root/.frontend/vite.config.ts +56 -0
  67. package/stacks/cratis-csharp/templates/root/App.tsx +23 -0
  68. package/stacks/cratis-csharp/templates/root/CLAUDE.md +62 -0
  69. package/stacks/cratis-csharp/templates/root/CratisApp.csproj +25 -0
  70. package/stacks/cratis-csharp/templates/root/CratisApp.sln +18 -0
  71. package/stacks/cratis-csharp/templates/root/GlobalUsings.cs +3 -0
  72. package/stacks/cratis-csharp/templates/root/Home.tsx +102 -0
  73. package/stacks/cratis-csharp/templates/root/Program.cs +26 -0
  74. package/stacks/cratis-csharp/templates/root/README.md +192 -0
  75. package/stacks/cratis-csharp/templates/root/SomeModule/SomeFeature/Listing/AllListings.ts +47 -0
  76. package/stacks/cratis-csharp/templates/root/SomeModule/SomeFeature/Listing/Listing.cs +11 -0
  77. package/stacks/cratis-csharp/templates/root/SomeModule/SomeFeature/Listing/Listing.ts +12 -0
  78. package/stacks/cratis-csharp/templates/root/SomeModule/SomeFeature/Listing/ListingDataTable.tsx +17 -0
  79. package/stacks/cratis-csharp/templates/root/SomeModule/SomeFeature/Listing/index.ts +1 -0
  80. package/stacks/cratis-csharp/templates/root/SomeModule/SomeFeature/Registration/Register.ts +51 -0
  81. package/stacks/cratis-csharp/templates/root/SomeModule/SomeFeature/Registration/RegisterDialog.tsx +18 -0
  82. package/stacks/cratis-csharp/templates/root/SomeModule/SomeFeature/Registration/Registration.cs +27 -0
  83. package/stacks/cratis-csharp/templates/root/SomeModule/SomeFeature/Registration/index.ts +1 -0
  84. package/stacks/cratis-csharp/templates/root/SomeModule/SomeFeature/SomeFeature.tsx +22 -0
  85. package/stacks/cratis-csharp/templates/root/SomeModule/SomeFeature/SomeName.cs +3 -0
  86. package/stacks/cratis-csharp/templates/root/SomeModule/SomeFeature/index.ts +1 -0
  87. package/stacks/cratis-csharp/templates/root/appsettings.Development.json +9 -0
  88. package/stacks/cratis-csharp/templates/root/appsettings.json +26 -0
  89. package/stacks/cratis-csharp/templates/root/docker-compose.yml +23 -0
  90. package/stacks/cratis-csharp/templates/root/package.json +33 -0
  91. package/stacks/cratis-csharp/templates/root/tsconfig.json +3 -0
  92. package/stacks/modeling-kit/templates/.claude/settings.local.json +13 -0
  93. package/stacks/modeling-kit/templates/.claude/skills/analyze-existing-model/SKILL.md +215 -0
  94. package/stacks/modeling-kit/templates/.claude/skills/attributes/SKILL.md +176 -0
  95. package/stacks/modeling-kit/templates/.claude/skills/connect/SKILL.md +182 -0
  96. package/stacks/modeling-kit/templates/.claude/skills/discover-storyboard/SKILL.md +383 -0
  97. package/stacks/modeling-kit/templates/.claude/skills/eventmodeling-applying-conways-law/SKILL.md +465 -0
  98. package/stacks/modeling-kit/templates/.claude/skills/eventmodeling-brainstorming-events/SKILL.md +587 -0
  99. package/stacks/modeling-kit/templates/.claude/skills/eventmodeling-brainstorming-events/references/facilitating-event-modeling-workshops.md +626 -0
  100. package/stacks/modeling-kit/templates/.claude/skills/eventmodeling-checking-completeness/SKILL.md +542 -0
  101. package/stacks/modeling-kit/templates/.claude/skills/eventmodeling-designing-event-models/SKILL.md +497 -0
  102. package/stacks/modeling-kit/templates/.claude/skills/eventmodeling-elaborating-scenarios/SKILL.md +783 -0
  103. package/stacks/modeling-kit/templates/.claude/skills/eventmodeling-identifying-inputs/SKILL.md +604 -0
  104. package/stacks/modeling-kit/templates/.claude/skills/eventmodeling-identifying-outputs/SKILL.md +699 -0
  105. package/stacks/modeling-kit/templates/.claude/skills/eventmodeling-integrating-legacy-systems/SKILL.md +674 -0
  106. package/stacks/modeling-kit/templates/.claude/skills/eventmodeling-optimizing-stream-design/SKILL.md +231 -0
  107. package/stacks/modeling-kit/templates/.claude/skills/eventmodeling-optimizing-stream-design/references/domain-patterns.md +150 -0
  108. package/stacks/modeling-kit/templates/.claude/skills/eventmodeling-optimizing-stream-design/references/patterns.md +329 -0
  109. package/stacks/modeling-kit/templates/.claude/skills/eventmodeling-optimizing-stream-design/references/snapshotting.md +204 -0
  110. package/stacks/modeling-kit/templates/.claude/skills/eventmodeling-orchestrating-event-modeling/SKILL.md +352 -0
  111. package/stacks/modeling-kit/templates/.claude/skills/eventmodeling-orchestrating-event-modeling/references/project-planning-with-event-modeling.md +341 -0
  112. package/stacks/modeling-kit/templates/.claude/skills/eventmodeling-plotting-events/SKILL.md +153 -0
  113. package/stacks/modeling-kit/templates/.claude/skills/eventmodeling-slicing-event-models/SKILL.md +136 -0
  114. package/stacks/modeling-kit/templates/.claude/skills/eventmodeling-slicing-event-models/references/examples.md +78 -0
  115. package/stacks/modeling-kit/templates/.claude/skills/eventmodeling-slicing-event-models/references/patterns.md +85 -0
  116. package/stacks/modeling-kit/templates/.claude/skills/eventmodeling-storyboarding-events/SKILL.md +655 -0
  117. package/stacks/modeling-kit/templates/.claude/skills/eventmodeling-translating-external-events/SKILL.md +479 -0
  118. package/stacks/modeling-kit/templates/.claude/skills/eventmodeling-validating-event-models/SKILL.md +234 -0
  119. package/stacks/modeling-kit/templates/.claude/skills/eventmodeling-validating-event-models-checklist/SKILL.md +353 -0
  120. package/stacks/modeling-kit/templates/.claude/skills/examples/SKILL.md +200 -0
  121. package/stacks/modeling-kit/templates/.claude/skills/handle-comment/SKILL.md +94 -0
  122. package/stacks/modeling-kit/templates/.claude/skills/learn-eventmodelers-api/SKILL.md +441 -0
  123. package/stacks/modeling-kit/templates/.claude/skills/place-element/SKILL.md +290 -0
  124. package/stacks/modeling-kit/templates/.claude/skills/storyboard/SKILL.md +212 -0
  125. package/stacks/modeling-kit/templates/.claude/skills/storyboard-screen/SKILL.md +123 -0
  126. package/stacks/modeling-kit/templates/.claude/skills/timeline/SKILL.md +353 -0
  127. package/stacks/modeling-kit/templates/.claude/skills/update-slice-status/SKILL.md +110 -0
  128. package/stacks/modeling-kit/templates/.claude/skills/wdyt/SKILL.md +134 -0
  129. package/stacks/modeling-kit/templates/kit/lib/agent.sh +20 -0
  130. package/stacks/modeling-kit/templates/kit/lib/ollama-agent.js +147 -0
  131. package/stacks/modeling-kit/templates/kit/lib/ralph.js +286 -0
  132. package/stacks/modeling-kit/templates/kit/package.json +12 -0
  133. package/stacks/modeling-kit/templates/kit/ralph-claude.js +50 -0
  134. package/stacks/modeling-kit/templates/kit/ralph-ollama.js +38 -0
  135. package/stacks/modeling-kit/templates/kit/ralph.sh +61 -0
  136. package/stacks/modeling-kit/templates/kit/realtime-agent.js +18 -0
  137. package/stacks/modeling-kit/templates/root/CLAUDE.md +56 -0
  138. package/stacks/node/templates/.claude/skills/build-automation/SKILL.md +266 -0
  139. package/stacks/node/templates/.claude/skills/build-state-change/SKILL.md +344 -0
  140. package/stacks/node/templates/.claude/skills/build-state-view/SKILL.md +412 -0
  141. package/stacks/node/templates/.claude/skills/connect/SKILL.md +178 -0
  142. package/stacks/node/templates/.claude/skills/learn-eventmodelers-api/SKILL.md +628 -0
  143. package/stacks/node/templates/.claude/skills/load-slice/SKILL.md +143 -0
  144. package/stacks/node/templates/.claude/skills/update-slice-status/SKILL.md +110 -0
  145. package/stacks/node/templates/build-kit/README.md +86 -0
  146. package/stacks/node/templates/build-kit/lib/AGENT.md +47 -0
  147. package/stacks/node/templates/build-kit/lib/agent.sh +20 -0
  148. package/stacks/node/templates/build-kit/lib/backend-prompt.md +152 -0
  149. package/stacks/node/templates/build-kit/lib/prompt.md +122 -0
  150. package/stacks/node/templates/build-kit/lib/ralph.js +369 -0
  151. package/stacks/node/templates/build-kit/ralph-claude.js +44 -0
  152. package/stacks/node/templates/build-kit/ralph.sh +98 -0
  153. package/stacks/node/templates/root/.env.example +15 -0
  154. package/stacks/node/templates/root/CLAUDE.md +60 -0
  155. package/stacks/node/templates/root/docker-compose.yml +15 -0
  156. package/stacks/node/templates/root/flyway.conf +17 -0
  157. package/stacks/node/templates/root/migrations/V1__schema.sql.example +12 -0
  158. package/stacks/node/templates/root/package.json +50 -0
  159. package/stacks/node/templates/root/server.ts +130 -0
  160. package/stacks/node/templates/root/setup-env.sh +53 -0
  161. package/stacks/node/templates/root/src/common/assertions.ts +6 -0
  162. package/stacks/node/templates/root/src/common/db.ts +32 -0
  163. package/stacks/node/templates/root/src/common/loadPostgresEventstore.ts +23 -0
  164. package/stacks/node/templates/root/src/common/parseEndpoint.ts +51 -0
  165. package/stacks/node/templates/root/src/common/processorDlq.ts +28 -0
  166. package/stacks/node/templates/root/src/common/realtimeBroadcast.ts +12 -0
  167. package/stacks/node/templates/root/src/common/replay.ts +16 -0
  168. package/stacks/node/templates/root/src/common/routes.ts +19 -0
  169. package/stacks/node/templates/root/src/common/testHelpers.ts +44 -0
  170. package/stacks/node/templates/root/src/swagger.ts +34 -0
  171. package/stacks/node/templates/root/src/util/assertions.ts +6 -0
  172. package/stacks/node/templates/root/src/util/hash.ts +9 -0
  173. package/stacks/node/templates/root/src/util/sanitize.ts +23 -0
  174. package/stacks/node/templates/root/tsconfig.json +32 -0
  175. package/stacks/node/templates/root/vercel.json +8 -0
  176. package/stacks/supabase/templates/.claude/skills/build-automation/SKILL.md +266 -0
  177. package/stacks/supabase/templates/.claude/skills/build-state-change/SKILL.md +344 -0
  178. package/stacks/supabase/templates/.claude/skills/build-state-view/SKILL.md +390 -0
  179. package/stacks/supabase/templates/.claude/skills/build-webhook/SKILL.md +303 -0
  180. package/stacks/supabase/templates/.claude/skills/connect/SKILL.md +178 -0
  181. package/stacks/supabase/templates/.claude/skills/learn-eventmodelers-api/SKILL.md +628 -0
  182. package/stacks/supabase/templates/.claude/skills/load-slice/SKILL.md +143 -0
  183. package/stacks/supabase/templates/.claude/skills/update-slice-status/SKILL.md +110 -0
  184. package/stacks/supabase/templates/build-kit/README.md +86 -0
  185. package/stacks/supabase/templates/build-kit/lib/AGENT.md +47 -0
  186. package/stacks/supabase/templates/build-kit/lib/agent.sh +20 -0
  187. package/stacks/supabase/templates/build-kit/lib/backend-prompt.md +152 -0
  188. package/stacks/supabase/templates/build-kit/lib/prompt.md +123 -0
  189. package/stacks/supabase/templates/build-kit/lib/ralph.js +369 -0
  190. package/stacks/supabase/templates/build-kit/ralph-claude.js +44 -0
  191. package/stacks/supabase/templates/build-kit/ralph.sh +98 -0
  192. package/stacks/supabase/templates/root/.env.example +22 -0
  193. package/stacks/supabase/templates/root/CLAUDE.md +61 -0
  194. package/stacks/supabase/templates/root/flyway.conf +17 -0
  195. package/stacks/supabase/templates/root/package.json +52 -0
  196. package/stacks/supabase/templates/root/server.ts +177 -0
  197. package/stacks/supabase/templates/root/setup-env.sh +53 -0
  198. package/stacks/supabase/templates/root/src/common/assertions.ts +6 -0
  199. package/stacks/supabase/templates/root/src/common/db.ts +32 -0
  200. package/stacks/supabase/templates/root/src/common/loadPostgresEventstore.ts +23 -0
  201. package/stacks/supabase/templates/root/src/common/parseEndpoint.ts +51 -0
  202. package/stacks/supabase/templates/root/src/common/processorDlq.ts +28 -0
  203. package/stacks/supabase/templates/root/src/common/realtimeBroadcast.ts +19 -0
  204. package/stacks/supabase/templates/root/src/common/replay.ts +16 -0
  205. package/stacks/supabase/templates/root/src/common/routes.ts +23 -0
  206. package/stacks/supabase/templates/root/src/common/testHelpers.ts +54 -0
  207. package/stacks/supabase/templates/root/src/supabase/README.md +141 -0
  208. package/stacks/supabase/templates/root/src/supabase/api.ts +56 -0
  209. package/stacks/supabase/templates/root/src/supabase/requireOrgaAdmin.ts +32 -0
  210. package/stacks/supabase/templates/root/src/supabase/requireSysUser.ts +40 -0
  211. package/stacks/supabase/templates/root/src/supabase/requireUser.ts +72 -0
  212. package/stacks/supabase/templates/root/src/swagger.ts +34 -0
  213. package/stacks/supabase/templates/root/src/util/assertions.ts +6 -0
  214. package/stacks/supabase/templates/root/src/util/hash.ts +9 -0
  215. package/stacks/supabase/templates/root/src/util/sanitize.ts +23 -0
  216. package/stacks/supabase/templates/root/supabase/config.toml +295 -0
  217. package/stacks/supabase/templates/root/supabase/migrations/V1__schema.sql.example +12 -0
  218. package/stacks/supabase/templates/root/supabase/seed.sql +1 -0
  219. package/stacks/supabase/templates/root/tsconfig.json +32 -0
  220. package/stacks/supabase/templates/root/vercel.json +8 -0
@@ -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