@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,655 @@
1
+ ---
2
+ name: eventmodeling-storyboarding-events
3
+ description: "Step 3 of Event Modeling - Create UI storyboards/mockups showing what users see at each step. Capture all data fields needed from user perspective. Use after sequencing events. Do not use for: identifying commands or processor actions (use eventmodeling-identifying-inputs) or designing read models (use eventmodeling-identifying-outputs)."
4
+ allowed-tools:
5
+ - AskUserQuestion
6
+ - Write
7
+ - Bash
8
+ ---
9
+
10
+ # Storyboarding 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 already specified: existing UI patterns or mockups to reference, critical data fields, and UI/UX preferences. Interview when these details haven't been discussed or when the user wants guidance on storyboarding depth.
17
+
18
+ **Interview Strategy**: Clarify UI needs, data priorities, and existing patterns to guide storyboard design. This ensures mockups capture all necessary fields without over-designing.
19
+
20
+ ### Critical Questions
21
+
22
+ When UI design guidance is needed:
23
+
24
+ 1. **Current UI State** (Impact: Determines if you're designing from scratch or enhancing existing)
25
+ - Question: "Do you have: (A) Existing UI/wireframes to reference, (B) Rough sketches, (C) Starting from scratch?"
26
+ - Why it matters: Existing UI provides constraints and patterns; starting fresh allows more design freedom
27
+ - Follow-up triggers: If (A) → ask to share; if (C) → ask about platform/technology
28
+
29
+ 2. **Most Critical Data Fields** (Impact: Determines storyboard focus and detail level)
30
+ - Question: "Which data fields are most important for users to see? (e.g., order status, payment confirmation, tracking info)"
31
+ - Why it matters: Knowing priorities helps avoid over-designing; users need to see what matters most first
32
+ - Follow-up triggers: For each critical field → ask "What decisions do users make based on this data?"
33
+
34
+ 3. **UI/UX Preferences & Constraints** (Impact: Shapes storyboard style and interaction patterns)
35
+ - Question: "Any UI preferences? (A) Web, (B) Mobile, (C) Both. And design style: (A) Minimal wireframes, (B) Detailed mockups, (C) Interact prototypes?"
36
+ - Why it matters: Platform and fidelity affect storyboard detail; mobile has different constraints than web
37
+ - Follow-up triggers: If (C) → ask about prototype tool; if minimal → discuss what level of detail is enough
38
+
39
+ ### Interview Flow
40
+
41
+ **Conditional Entry**:
42
+ ```
43
+ If user has provided:
44
+ - Existing UI patterns or references
45
+ - AND identified critical data fields
46
+ - AND specified storyboard detail level
47
+
48
+ Then: Skip interview, proceed directly to storyboarding
49
+
50
+ Else: Conduct interview
51
+ ```
52
+
53
+ **Phase 1: Context Assessment** (Questions 1-2)
54
+ - Understand existing UI context
55
+ - Identify data priorities
56
+ - Establish storyboard scope
57
+
58
+ **Phase 2: Design Guidance** (Question 3)
59
+ - Determine platform and fidelity
60
+ - Adjust storyboard detail accordingly
61
+
62
+ ### Capturing Interview Findings
63
+
64
+ Document findings to guide storyboard creation:
65
+
66
+ ```markdown
67
+ ## Interview Findings: [Domain Name] UI
68
+
69
+ **Existing UI Context**: [Starting from scratch / Enhancing / Matching pattern]
70
+ **Most Critical Data**: [List fields in priority order]
71
+ **Platform**: [Web / Mobile / Both]
72
+ **Storyboard Detail**: [Minimal wireframes / Detailed mockups]
73
+
74
+ **Key UI Interactions**:
75
+ - [Action 1]: [What data triggers it]
76
+ - [Action 2]: [What data triggers it]
77
+
78
+ **Storyboard Focus**:
79
+ - Prioritize showing [most critical fields]
80
+ - Ensure [specific interactions] are clear
81
+ - Reference [existing patterns] for consistency
82
+ ```
83
+
84
+ Optional: Write to `.trogonai/interviews/[timestamp]-storyboarding-events.interview.internal.trogonai.md`.
85
+
86
+ ---
87
+
88
+ ## Workflow
89
+
90
+ Given the event timeline, create UI storyboards:
91
+
92
+ ### 1. Identify UI Screens/Views
93
+ Create a mockup for each state of the system:
94
+
95
+ ```
96
+ Screen 1: Order Creation Form
97
+
98
+ Place Your Order
99
+
100
+
101
+ Customer ID: [____________]
102
+
103
+ Items:
104
+ Product 1 Qty: [_] Price: $_
105
+ Product 2 Qty: [_] Price: $_
106
+ Product 3 Qty: [_] Price: $_
107
+
108
+ Total: $___
109
+
110
+ Shipping Address:
111
+ [_____________________]
112
+ [_____________________]
113
+
114
+ [ Create Order ]
115
+
116
+
117
+ Trigger: CreateOrder command
118
+ Result Events: OrderCreated
119
+ Data captured from UI:
120
+ - customerId
121
+ - items (products + quantities)
122
+ - total
123
+ - shippingAddress
124
+ ```
125
+
126
+ ### 2. Show State Transitions Between Screens
127
+ Document what changes when events occur:
128
+
129
+ ```
130
+ Screen 2: Order Confirmation
131
+ (After OrderCreated event)
132
+
133
+
134
+ Order Confirmation
135
+
136
+
137
+ Order ID: #12345
138
+ Status: Draft
139
+
140
+ Items: 3 products
141
+ Total: $150.00
142
+
143
+ Shipping: 123 Main St
144
+
145
+ Payment Options:
146
+ Credit Card
147
+ Bank Transfer
148
+
149
+ [ Confirm Order ]
150
+
151
+
152
+ Trigger: ConfirmOrder command
153
+ Result Events: OrderConfirmed
154
+ Data from UI:
155
+ - orderId (from OrderCreated)
156
+ - paymentMethod
157
+ ```
158
+
159
+ ### 3. Document All Data Fields
160
+ For each screen, list what data is displayed:
161
+
162
+ ```
163
+ Screen: Order Status View
164
+
165
+ Your Order Status
166
+
167
+ Order ID: #12345 (from OrderCreated)
168
+ Status: Confirmed (from OrderConfirmed)
169
+ Confirmed at: 2024-12-31 10:00 (from OrderConfirmed)
170
+
171
+ Payment: Authorized (from PaymentAuthorized)
172
+ Auth Code: AUTH-789 (from PaymentAuthorized)
173
+
174
+ Inventory: Reserved (from InventoryReserved)
175
+ Expected Ship: 2025-01-02 (from InventoryReserved)
176
+
177
+ Shipped: Pending (awaiting OrderShipped)
178
+ Tracking: -- (waiting for shipment)
179
+
180
+
181
+ Fields and their origins:
182
+ orderId → OrderCreated event
183
+ status → OrderConfirmed event
184
+ confirmedAt → OrderConfirmed event
185
+ paymentStatus → PaymentAuthorized event
186
+ authCode → PaymentAuthorized event
187
+ inventoryStatus → InventoryReserved event
188
+ expectedShip → InventoryReserved event
189
+ tracking → OrderShipped event (when available)
190
+ ```
191
+
192
+ ### 4. Show Data Flow Through Screens
193
+ Map how data enters/exits UI:
194
+
195
+ ```
196
+ Order Entry UI
197
+ (user inputs)
198
+ customerId
199
+ items[]
200
+ total
201
+ shippingAddress
202
+
203
+ Command: CreateOrder
204
+
205
+ Event: OrderCreated
206
+
207
+ Order Status UI (displays)
208
+ orderId (from event)
209
+ items (from event)
210
+ total (from event)
211
+ shippingAddress (from event)
212
+ ```
213
+
214
+ ### 5. Organize Screens by Swimlane (Actor/System)
215
+
216
+ **MANDATORY**: Use the **Role Catalog** from Step 1 (eventmodeling-brainstorming-events) as the source of swimlanes. Every human role in the catalog MUST have its own swimlane. Every system actor that has a UI or todo-list view gets a swimlane too.
217
+
218
+ Group screens by who interacts with them:
219
+
220
+ ```
221
+ Swimlane: Customer (Human Role)
222
+ Screen 1: Order Entry Form
223
+ Screen 2: Order Confirmation
224
+ Screen 3: Order Status View
225
+ Screen 4: Tracking View
226
+
227
+ Swimlane: Seller (Human Role)
228
+ Screen 1: Order Fulfillment Dashboard
229
+ Screen 2: Review Response Form
230
+ Screen 3: Product Management
231
+
232
+ Swimlane: Support Agent (Human Role)
233
+ Screen 1: Escalation Queue
234
+ Screen 2: Manual Override Panel
235
+
236
+ Swimlane: Payment Processor (System Actor)
237
+ Screen 1: Payment Verification (automated)
238
+ Screen 2: Authorization Confirmation
239
+
240
+ Swimlane: Inventory System (System Actor)
241
+ Screen 1: Reservation Todo List (internal)
242
+ Screen 2: Availability Check
243
+
244
+ Swimlane: Fulfillment System (System Actor)
245
+ Screen 1: Shipment Creation Todo
246
+ Screen 2: Shipping Confirmation
247
+ ```
248
+
249
+ **Validation**: If a role from the catalog has zero screens, either:
250
+ - The role is missing screens (add them), or
251
+ - The role doesn't belong in the catalog (remove it in Step 1)
252
+
253
+ This shows which actors interact with which screens and helps visualize system boundaries.
254
+
255
+ ### 6. Show Processor "Todo List" Pattern
256
+ For automated processors, show the todo list metaphor:
257
+
258
+ ```
259
+ Processor: InventoryReserver
260
+
261
+ Internal "Todo List" (based on received events):
262
+
263
+ Inventory Reservation Todos
264
+
265
+
266
+ Order-123: Reserve 2x Prod-1 (triggered by PaymentAuthorized)
267
+ Order-124: Reserve 3x Prod-2 (triggered by PaymentAuthorized)
268
+ Order-125: Reserve 1x Prod-3 (triggered by PaymentAuthorized)
269
+
270
+ Processor checks todo items:
271
+ For each: Check availability
272
+ If available: Mark done
273
+ Reserve inventory
274
+ Produce event
275
+
276
+
277
+
278
+ This todo list is driven by:
279
+ Events received → Items added to todo
280
+ Processor logic → Items processed
281
+ Success → InventoryReserved event produced + todo marked done
282
+ Failure → InventoryFailed event produced + todo marked failed
283
+ ```
284
+
285
+ ### 7. Identify Missing Data
286
+ Highlight where data doesn't have a clear source:
287
+
288
+ ```
289
+ Problem: Order Status screen needs "expectedShip" date
290
+ Current state: Not in any event
291
+ Solution: Add expectedShip to InventoryReserved event
292
+
293
+ Problem: Order status needs "last updated" timestamp
294
+ Current state: No tracking of when last change occurred
295
+ Solution: Every event includes timestamp
296
+ ```
297
+
298
+ ## Board Integration
299
+
300
+ Before starting the analysis, read existing SCREEN nodes from the board to avoid designing screens that already exist:
301
+
302
+ ```bash
303
+ curl -s -H "x-token: $TOKEN" -H "x-board-id: $BOARD_ID" \
304
+ "$BASE_URL/api/org/$ORG_ID/boards/$BOARD_ID/nodes?type=SCREEN"
305
+ ```
306
+
307
+ After completing the screen analysis, use the `handle-comment` skill to post a QUESTION comment on any SCREEN node where data fields are unclear or missing sources are identified.
308
+
309
+ ## Mandatory Field Definitions on SCREEN Nodes
310
+
311
+ > **CRITICAL: Every SCREEN node MUST include `meta.fields` with a `mapping` on every field.** A screen without fields cannot show data lineage — it becomes impossible to verify that all displayed data has a source event or command.
312
+
313
+ There are two types of screens, and each type has a different `mapping` source:
314
+
315
+ ### Command screen (input/action screen)
316
+
317
+ An **input screen** captures data that will be sent as a command. Its fields map to the command they feed into.
318
+
319
+ | Field type | `mapping` | `generated` | Example |
320
+ |---|---|---|---|
321
+ | User types a value | `"<CommandTitle>.<fieldName>"` | `false` | `"ReserveBike.bikeId"` |
322
+ | Read from session | `"session:<fieldName>"` | `false` | `"session:customerId"` |
323
+ | Pre-populated from a previous event | `"<EventTitle>.<fieldName>"` | `false` | `"BikeReserved.stationId"` |
324
+ | Calculated for display only (not sent to command) | `"derived:<expression>"` | `true` | `"derived:sum(items.price)"` |
325
+
326
+ ### View screen (output/read model screen)
327
+
328
+ A **view screen** displays data read from a Read Model. Its fields map to the read model that serves the data. View screens are placed adjacent to their read model in Step 5 (Identifying Outputs) — during storyboarding, record the intended read model name as the source even if the read model hasn't been designed yet.
329
+
330
+ | Field type | `mapping` | `generated` | Example |
331
+ |---|---|---|---|
332
+ | Displayed from a read model | `"<ReadModelTitle>.<fieldName>"` | `false` | `"ActiveReservationView.status"` |
333
+ | Displayed from a direct event (no read model yet) | `"<EventTitle>.<fieldName>"` | `false` | `"BikeReserved.startTime"` |
334
+ | Calculated/formatted on the client | `"derived:<expression>"` | `true` | `"derived:formatDuration(durationMinutes)"` |
335
+
336
+ ### Example: command screen fields
337
+
338
+ ```json
339
+ {
340
+ "type": "SCREEN",
341
+ "title": "Reserve a Bike",
342
+ "fields": [
343
+ {"name": "bikeId", "type": "String", "example": "bike-17", "mapping": "ReserveBike.bikeId"},
344
+ {"name": "stationId", "type": "String", "example": "stn-03", "mapping": "ReserveBike.stationId"},
345
+ {"name": "startTime", "type": "Date", "example": "2026-06-01T09:00:00Z", "mapping": "ReserveBike.startTime"},
346
+ {"name": "endTime", "type": "Date", "example": "2026-06-01T17:00:00Z", "mapping": "ReserveBike.endTime"},
347
+ {"name": "bikeCategory","type": "String", "example": "City Bike", "mapping": "AvailableBikeView.category"},
348
+ {"name": "dailyRate", "type": "Number", "example": "0.10", "mapping": "AvailableBikeView.ratePerMinute"}
349
+ ]
350
+ }
351
+ ```
352
+
353
+ ### Example: view screen fields (Read Model as source)
354
+
355
+ ```json
356
+ {
357
+ "type": "SCREEN",
358
+ "title": "Reservation Confirmed",
359
+ "fields": [
360
+ {"name": "reservationId", "type": "String", "example": "res-001", "mapping": "ActiveReservationView.reservationId"},
361
+ {"name": "bikeName", "type": "String", "example": "City Bike — Gazelle", "mapping": "ActiveReservationView.bikeName"},
362
+ {"name": "stationName", "type": "String", "example": "Central Park East", "mapping": "ActiveReservationView.stationName"},
363
+ {"name": "startTime", "type": "Date", "example": "2026-06-01T09:00:00Z", "mapping": "ActiveReservationView.startTime"},
364
+ {"name": "expiresAt", "type": "Date", "example": "2026-06-01T09:30:00Z", "mapping": "ActiveReservationView.expiresAt"},
365
+ {"name": "estimatedCost", "type": "Number", "example": "48.00", "mapping": "derived:durationHours × AvailableBikeView.ratePerMinute × 60"}
366
+ ]
367
+ }
368
+ ```
369
+
370
+ ### Connected-element rule (critical constraint)
371
+
372
+ > **A field `mapping` may only reference an element that is connected to this SCREEN via a board connection arrow.**
373
+ >
374
+ > - A command screen may only map to: the COMMAND it submits, the SCREEN's own input (user-input), or a READ MODEL whose `READMODEL → SCREEN` arrow points to this screen.
375
+ > - A view screen may only map to: the READ MODEL connected to it via a `READMODEL → SCREEN` arrow, or derived expressions.
376
+ > - If a mapping references an element that is not yet connected — for example, `AvailableBikeView.category` when no such read model exists on the board — that is a **gap**. It signals either:
377
+ > 1. A read model is missing and must be created in Step 5 (Identifying Outputs), or
378
+ > 2. The connection arrow is missing and must be added.
379
+ >
380
+ > **When you encounter a mapping that cannot resolve to a connected element, write the mapping as-is but flag it as a gap in the completeness notes.** Do not invent connections that don't exist.
381
+
382
+ Every field must also set `"cardinality"` — use `"Single"` unless the field genuinely displays/collects a list of values (e.g. a repeated line-item row), in which case use `"List"`. Default to `"Single"` when unsure. Only add the fields the screen actually shows or captures — do not add speculative fields; enrich later via `/attributes`.
383
+
384
+ A screen that only has a title and no fields is an empty placeholder — place the fields before moving on.
385
+
386
+ ## Mandatory Sketch Rendering
387
+
388
+ Every SCREEN node requires a wireframe sketch. The correct order for every screen is:
389
+
390
+ **Step A — Compute the cell ID.** Screens go in the **actor lane** of their target column.
391
+
392
+ 1. Determine the target column (same column as the event/command, OR one column to the right of the read model).
393
+ 2. Fetch the chapter to find the actor row ID:
394
+ ```bash
395
+ curl -s -H "x-token: $TOKEN" -H "x-board-id: $BOARD_ID" \
396
+ "$BASE_URL/api/org/$ORG_ID/boards/$BOARD_ID/nodes/$CHAPTER_ID"
397
+ # → timelineData.rows — find the row where type === "actor"
398
+ ```
399
+ 3. `cellId = actorRow.id + "-" + columnId`
400
+
401
+ **Step B — Create the SCREEN node with `cellId`** (`node:created`) — the node is immediately placed in the correct cell:
402
+ ```bash
403
+ curl -s -X POST "$BASE_URL/api/org/$ORG_ID/boards/$BOARD_ID/nodes/events" \
404
+ -H "x-token: $TOKEN" -H "x-board-id: $BOARD_ID" -H "x-user-id: storyboarding-events" \
405
+ -H "Content-Type: application/json" \
406
+ -d '[{
407
+ "id": "<event-uuid>",
408
+ "eventType": "node:created",
409
+ "nodeId": "<node-uuid>",
410
+ "boardId": "<BOARD_ID>",
411
+ "timestamp": 1234567890,
412
+ "chapterId": "<CHAPTER_ID>",
413
+ "cellId": "<actorRowId>-<columnId>",
414
+ "meta": {"type": "SCREEN", "title": "<Screen Title>", "fields": [...]}
415
+ }]'
416
+ ```
417
+
418
+ **Step C — Render the wireframe sketch immediately** (`POST /images/$NODE_ID/sketch`).
419
+
420
+ > **Do NOT call `drop` after using `cellId` in `node:created`.** The drop endpoint adds a second cell reference without removing the first, causing the node to appear in two columns simultaneously. `node:created + cellId` is the single placement step — render the sketch right after.
421
+
422
+ > **CRITICAL: NEVER pass `"elements": []`. An empty elements array produces a blank, invisible screen and is always wrong. You MUST design and include actual wireframe elements before calling the sketch API.**
423
+
424
+ Call the sketch API between node creation and cell placement, with a fully designed elements array:
425
+
426
+ ```bash
427
+ curl -s -X POST "$BASE_URL/api/org/$ORG_ID/boards/$BOARD_ID/images/$NODE_ID/sketch" \
428
+ -H "x-token: $TOKEN" -H "x-board-id: $BOARD_ID" -H "x-user-id: storyboarding-events" \
429
+ -H "Content-Type: application/json" \
430
+ -d '{
431
+ "description": "<concise description of what this screen shows>",
432
+ "elements": [
433
+ {"type":"rectangle","gridX":0,"gridY":0,"gridWidth":50,"gridHeight":40,"fill":"white"},
434
+ {"type":"rectangle","gridX":0,"gridY":0,"gridWidth":50,"gridHeight":3,"fill":"violet"},
435
+ {"type":"headline","gridX":2,"gridY":1,"text":"Screen Title","fontSize":16,"fill":"white","gridWidth":46},
436
+ ...more elements...
437
+ ]
438
+ }'
439
+ ```
440
+
441
+ Design each wireframe using the grid description language from the `storyboard-screen` skill (50×40 grid, 1 unit = 20 px):
442
+
443
+ | Element type | Required fields | Optional fields |
444
+ |---|---|---|
445
+ | `rectangle` | gridX, gridY, gridWidth, gridHeight | fill, stroke |
446
+ | `text` | gridX, gridY, text | fontSize (default 12), fill, gridWidth |
447
+ | `headline` | gridX, gridY, text | fontSize (default 20), fill, gridWidth |
448
+ | `button` | gridX, gridY, gridWidth, gridHeight, text | fill, stroke |
449
+ | `input` | gridX, gridY, gridWidth, gridHeight, text (placeholder) | fill, stroke |
450
+ | `line` | gridX, gridY, gridX2, gridY2 | stroke |
451
+ | `circle` | gridX, gridY, gridRadius | fill, stroke |
452
+
453
+ Named colors: `black` `grey` `light-violet` `violet` `blue` `light-blue` `yellow` `orange` `green` `light-green` `light-red` `red` `white` `transparent`
454
+
455
+ Every sketch MUST include at minimum:
456
+ - A full white background rectangle: `{"type":"rectangle","gridX":0,"gridY":0,"gridWidth":50,"gridHeight":40,"fill":"white"}`
457
+ - A colored header bar with the screen title
458
+ - Real UI elements matching the screen's purpose: form inputs with labelled fields, data tables or lists, status badges, action buttons
459
+ - Field labels that match the actual event/command fields this screen captures or displays
460
+ - At least one primary action (submit button, confirm button, etc.) for command screens
461
+
462
+ A screen node without a wireframe sketch is an empty placeholder. It must not be left unrendered.
463
+
464
+ ## Timeline Placement Rules
465
+
466
+ When placing screens on the board, follow these alignment rules:
467
+
468
+ | Screen type | Where it goes on the board |
469
+ |-------------|---------------------------|
470
+ | **Input/command screen** (triggers a command) | **Actor row, same column as the COMMAND and EVENT** it produces. The screen and command share a column — the screen sits in the actor row, the command in the interaction row, the event in the swimlane row. |
471
+ | **View/output screen** (displays a read model) | **Actor row, one column to the RIGHT of the READ MODEL** it displays. The read model occupies the interaction row of the preceding column; the screen gets its own column immediately after. This column is finalised in Step 5 (Identifying Outputs) — during storyboarding, just document which read model each view screen will query. |
472
+
473
+ > **Do not create standalone screen columns that are disconnected from commands or read models.** Every screen must either share its column with the command it submits, or be placed one column to the right of the read model it displays.
474
+
475
+ ### Placing Automations
476
+
477
+ When a processor or system actor reacts to events automatically (no human interaction), place an **AUTOMATION** node in the actor row instead of a SCREEN. Automations go in the same column as the COMMAND they trigger and the READMODEL that feeds them.
478
+
479
+ A column is an automation column (not a screen column) when:
480
+ - The action is triggered by the system, not a user gesture
481
+ - No human sees or interacts with the UI at this step
482
+ - The pattern is `READMODEL → AUTOMATION → COMMAND` (the processor reads state, decides, issues a command)
483
+
484
+ Examples:
485
+ - Payment gateway webhook arrives → AUTOMATION "Authorize Payment"
486
+ - Inventory check fires after payment authorized → AUTOMATION "Reserve Inventory"
487
+ - Notification service sends an email → AUTOMATION "Send Confirmation Email"
488
+
489
+ Human roles get SCREEN nodes. System actors and processors get AUTOMATION nodes. Place both types during storyboarding — do not defer automations to a later step.
490
+
491
+ ### One Screen Per Column (Hard Rule)
492
+
493
+ **Never place more than one SCREEN node in the same column**, even across different actor lanes. Each column represents a single moment in the timeline. Two screens in the same column means two different interactions at the same moment — that breaks the visual narrative and always signals a design error.
494
+
495
+ ```
496
+ ✅ Correct: Member "Reserve Book" in col 8 | Librarian "Confirm Checkout" in col 11
497
+ ❌ Wrong: Member "My Loans" AND Librarian "Confirm Checkout" both in col 11
498
+ ```
499
+
500
+ If a second role also needs a screen related to the same event, insert a new column immediately after and place the second screen there. Use `POST /timelines/:tl/columns` with `{"index": N}` to insert at the correct position.
501
+
502
+ ---
503
+
504
+ ## Output Format
505
+
506
+ Present as:
507
+
508
+ ```markdown
509
+ # Storyboard: [Domain Name]
510
+
511
+ ## Swimlane Organization (from Role Catalog)
512
+
513
+ ### Human Role Swimlanes
514
+
515
+ #### Customer Swimlane
516
+ - Screen 1: Order Entry Form
517
+ - Screen 2: Order Confirmation
518
+ - Screen 3: Order Status View
519
+
520
+ #### [Other Human Role Swimlanes — one per role in the catalog]
521
+
522
+ ### System Actor Swimlanes
523
+
524
+ #### Payment Processor Swimlane
525
+ - Screen 1: Payment Verification (automated)
526
+ - [Shows what UI/views the processor interacts with]
527
+
528
+ #### [Other System Actor Swimlanes]
529
+
530
+ ---
531
+
532
+ ## Screen 1: [Screen Name]
533
+
534
+ ### Mockup
535
+ ```
536
+ [ASCII art mockup or description]
537
+ ```
538
+
539
+ ### Data Displayed
540
+ - Field 1: Description, source event
541
+ - Field 2: Description, source event
542
+
543
+ ### User Actions (Commands)
544
+ - Action: [Action], produces: [Event]
545
+
546
+ ### Business Rules
547
+ - Rule about what can/cannot be done on this screen
548
+
549
+ ---
550
+
551
+ ## Screen 2: [Screen Name]
552
+
553
+ [Repeat for each screen]
554
+
555
+ ---
556
+
557
+ ## Processor Todo Lists
558
+
559
+ ### Processor: [Processor Name]
560
+
561
+ Internal "Todo List" pattern:
562
+ ```
563
+ Triggered by: [Event type]
564
+ Todo action: [What needs to be done]
565
+ Success produces: [Event]
566
+ Failure produces: [Event]
567
+ ```
568
+
569
+ [Repeat for each processor]
570
+
571
+ ---
572
+
573
+ ## Data Flow Diagram
574
+
575
+ [Show how data enters from UI and returns via events]
576
+
577
+ ---
578
+
579
+ ## Field Traceability Matrix
580
+
581
+ | Field | Screen | Source Event | Status |
582
+ |-------|--------|-------------|--------|
583
+ | orderId | Status View | OrderCreated | |
584
+ | shipmentId | Status View | OrderShipped | |
585
+ | customerId | All | OrderCreated | |
586
+
587
+ ---
588
+
589
+ ## Missing Data Analysis
590
+
591
+ [Any fields without clear source or destination]
592
+ ```
593
+
594
+ ## Quality Checklist
595
+
596
+ - [ ] **Every screen has a rendered wireframe sketch** (sketch API returned HTTP 204 — no exceptions)
597
+ - [ ] **No column contains more than one SCREEN node** across all actor lanes
598
+ - [ ] Every screen's wireframe shows real field labels matching the event/command fields
599
+ - [ ] Every displayed field has a source event
600
+ - [ ] Every user action maps to a command
601
+ - [ ] Commands map to events
602
+ - [ ] Data flows make sense
603
+ - [ ] No missing data sources
604
+ - [ ] State transitions are clear
605
+ - [ ] Alternative states are shown
606
+ - [ ] Error states are shown
607
+ - [ ] **Every human role from the Role Catalog has at least one swimlane**
608
+ - [ ] **Every swimlane is labeled with the role/actor name from the catalog**
609
+ - [ ] **Swimlanes organized by actor/system**
610
+ - [ ] **Human role screens clearly separated from processor screens**
611
+ - [ ] **Processor todo list pattern shown for automated systems**
612
+ - [ ] **System boundaries visible through swimlane organization**
613
+
614
+ ## Key Principles
615
+
616
+ 1. **User-Centric**: Design from what users see and do
617
+ 2. **Data Traceability**: Every field has origin and destination
618
+ 3. **Completeness**: All needed data is visible
619
+ 4. **Clarity**: UI clearly shows system state
620
+ 5. **Consistency**: Same data presented consistently across screens
621
+
622
+ ## Common Patterns
623
+
624
+ ### Input Screen Pattern
625
+ ```
626
+ User fills form (captures command data)
627
+
628
+ Submit button (issues command)
629
+
630
+ Event created with form data
631
+
632
+ Confirmation screen displayed
633
+ ```
634
+
635
+ ### Status Screen Pattern
636
+ ```
637
+ System displays current state (from read model)
638
+
639
+ Based on latest events
640
+
641
+ Shows all relevant information
642
+
643
+ Available actions based on state
644
+ ```
645
+
646
+ ### Error State Pattern
647
+ ```
648
+ User action fails (command rejected)
649
+
650
+ No event created
651
+
652
+ Error message displayed
653
+
654
+ UI allows retry or alternative action
655
+ ```