@eventmodelers/cli 0.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +175 -0
- package/cli.js +676 -0
- package/package.json +35 -0
- package/shared/build-kit/code-export.mjs +560 -0
- package/shared/build-kit/lib/ollama-agent.js +147 -0
- package/shared/build-kit/package.json +11 -0
- package/shared/build-kit/ralph-ollama.js +39 -0
- package/shared/build-kit/realtime-agent.js +18 -0
- package/stacks/axon/templates/.claude/skills/build-automation/SKILL.md +407 -0
- package/stacks/axon/templates/.claude/skills/build-automation/references/feature-flag-patterns.md +114 -0
- package/stacks/axon/templates/.claude/skills/build-automation-workflow/SKILL.md +496 -0
- package/stacks/axon/templates/.claude/skills/build-automation-workflow/references/axon-workflow-api.md +279 -0
- package/stacks/axon/templates/.claude/skills/build-automation-workflow/references/feature-flag-patterns.md +114 -0
- package/stacks/axon/templates/.claude/skills/build-state-change/SKILL.md +396 -0
- package/stacks/axon/templates/.claude/skills/build-state-change/references/axon-test-fixture-patterns.md +162 -0
- package/stacks/axon/templates/.claude/skills/build-state-change/references/feature-flag-patterns.md +56 -0
- package/stacks/axon/templates/.claude/skills/build-state-change/references/rest-api-patterns.md +115 -0
- package/stacks/axon/templates/.claude/skills/build-state-view/SKILL.md +282 -0
- package/stacks/axon/templates/.claude/skills/connect/SKILL.md +178 -0
- package/stacks/axon/templates/.claude/skills/learn-eventmodelers-api/SKILL.md +611 -0
- package/stacks/axon/templates/.claude/skills/load-slice/SKILL.md +141 -0
- package/stacks/axon/templates/.claude/skills/update-slice-status/SKILL.md +105 -0
- package/stacks/axon/templates/build-kit/lib/AGENT.md +47 -0
- package/stacks/axon/templates/build-kit/lib/agent.sh +20 -0
- package/stacks/axon/templates/build-kit/lib/backend-prompt.md +158 -0
- package/stacks/axon/templates/build-kit/lib/prompt.md +126 -0
- package/stacks/axon/templates/build-kit/lib/ralph.js +369 -0
- package/stacks/axon/templates/build-kit/ralph-claude.js +44 -0
- package/stacks/axon/templates/build-kit/ralph.sh +98 -0
- package/stacks/axon/templates/root/.env.example +5 -0
- package/stacks/axon/templates/root/CLAUDE.md +60 -0
- package/stacks/axon/templates/root/README.md +44 -0
- package/stacks/axon/templates/root/docker-compose.yml +64 -0
- package/stacks/axon/templates/root/mvnw +259 -0
- package/stacks/axon/templates/root/mvnw.cmd +149 -0
- package/stacks/axon/templates/root/pom.xml +125 -0
- package/stacks/axon/templates/root/src/main/java/io/axoniq/quickstart/QuickstartApplication.java +128 -0
- package/stacks/axon/templates/root/src/main/java/io/axoniq/quickstart/config/WebConfig.java +155 -0
- package/stacks/axon/templates/root/src/main/resources/application.properties +2 -0
- package/stacks/axon/templates/root/src/main/resources/static/bg-body.png +0 -0
- package/stacks/axon/templates/root/src/main/resources/static/bg-header.png +0 -0
- package/stacks/axon/templates/root/src/main/resources/static/index.html +596 -0
- package/stacks/cratis-csharp/templates/.claude/skills/_shared/cratis-conventions.md +251 -0
- package/stacks/cratis-csharp/templates/.claude/skills/build-automation/SKILL.md +99 -0
- package/stacks/cratis-csharp/templates/.claude/skills/build-automation/references/patterns.md +115 -0
- package/stacks/cratis-csharp/templates/.claude/skills/build-state-change/SKILL.md +163 -0
- package/stacks/cratis-csharp/templates/.claude/skills/build-state-change/references/patterns.md +234 -0
- package/stacks/cratis-csharp/templates/.claude/skills/build-state-view/SKILL.md +120 -0
- package/stacks/cratis-csharp/templates/.claude/skills/build-state-view/references/patterns.md +166 -0
- package/stacks/cratis-csharp/templates/.claude/skills/connect/SKILL.md +169 -0
- package/stacks/cratis-csharp/templates/.claude/skills/learn-eventmodelers-api/SKILL.md +609 -0
- package/stacks/cratis-csharp/templates/.claude/skills/load-slice/SKILL.md +141 -0
- package/stacks/cratis-csharp/templates/.claude/skills/update-slice-status/SKILL.md +105 -0
- package/stacks/cratis-csharp/templates/build-kit/lib/AGENT.md +58 -0
- package/stacks/cratis-csharp/templates/build-kit/lib/agent.sh +20 -0
- package/stacks/cratis-csharp/templates/build-kit/lib/backend-prompt.md +129 -0
- package/stacks/cratis-csharp/templates/build-kit/lib/prompt.md +124 -0
- package/stacks/cratis-csharp/templates/build-kit/lib/ralph.js +302 -0
- package/stacks/cratis-csharp/templates/build-kit/ralph-claude.js +37 -0
- package/stacks/cratis-csharp/templates/build-kit/ralph.sh +98 -0
- package/stacks/cratis-csharp/templates/root/.frontend/index.css +29 -0
- package/stacks/cratis-csharp/templates/root/.frontend/index.html +17 -0
- package/stacks/cratis-csharp/templates/root/.frontend/main.tsx +18 -0
- package/stacks/cratis-csharp/templates/root/.frontend/tsconfig.json +42 -0
- package/stacks/cratis-csharp/templates/root/.frontend/tsconfig.node.json +11 -0
- package/stacks/cratis-csharp/templates/root/.frontend/vite.config.ts +56 -0
- package/stacks/cratis-csharp/templates/root/App.tsx +23 -0
- package/stacks/cratis-csharp/templates/root/CLAUDE.md +62 -0
- package/stacks/cratis-csharp/templates/root/CratisApp.csproj +25 -0
- package/stacks/cratis-csharp/templates/root/CratisApp.sln +18 -0
- package/stacks/cratis-csharp/templates/root/GlobalUsings.cs +3 -0
- package/stacks/cratis-csharp/templates/root/Home.tsx +102 -0
- package/stacks/cratis-csharp/templates/root/Program.cs +26 -0
- package/stacks/cratis-csharp/templates/root/README.md +192 -0
- package/stacks/cratis-csharp/templates/root/SomeModule/SomeFeature/Listing/AllListings.ts +47 -0
- package/stacks/cratis-csharp/templates/root/SomeModule/SomeFeature/Listing/Listing.cs +11 -0
- package/stacks/cratis-csharp/templates/root/SomeModule/SomeFeature/Listing/Listing.ts +12 -0
- package/stacks/cratis-csharp/templates/root/SomeModule/SomeFeature/Listing/ListingDataTable.tsx +17 -0
- package/stacks/cratis-csharp/templates/root/SomeModule/SomeFeature/Listing/index.ts +1 -0
- package/stacks/cratis-csharp/templates/root/SomeModule/SomeFeature/Registration/Register.ts +51 -0
- package/stacks/cratis-csharp/templates/root/SomeModule/SomeFeature/Registration/RegisterDialog.tsx +18 -0
- package/stacks/cratis-csharp/templates/root/SomeModule/SomeFeature/Registration/Registration.cs +27 -0
- package/stacks/cratis-csharp/templates/root/SomeModule/SomeFeature/Registration/index.ts +1 -0
- package/stacks/cratis-csharp/templates/root/SomeModule/SomeFeature/SomeFeature.tsx +22 -0
- package/stacks/cratis-csharp/templates/root/SomeModule/SomeFeature/SomeName.cs +3 -0
- package/stacks/cratis-csharp/templates/root/SomeModule/SomeFeature/index.ts +1 -0
- package/stacks/cratis-csharp/templates/root/appsettings.Development.json +9 -0
- package/stacks/cratis-csharp/templates/root/appsettings.json +26 -0
- package/stacks/cratis-csharp/templates/root/docker-compose.yml +23 -0
- package/stacks/cratis-csharp/templates/root/package.json +33 -0
- package/stacks/cratis-csharp/templates/root/tsconfig.json +3 -0
- package/stacks/modeling-kit/templates/.claude/settings.local.json +13 -0
- package/stacks/modeling-kit/templates/.claude/skills/analyze-existing-model/SKILL.md +215 -0
- package/stacks/modeling-kit/templates/.claude/skills/attributes/SKILL.md +176 -0
- package/stacks/modeling-kit/templates/.claude/skills/connect/SKILL.md +182 -0
- package/stacks/modeling-kit/templates/.claude/skills/discover-storyboard/SKILL.md +383 -0
- package/stacks/modeling-kit/templates/.claude/skills/eventmodeling-applying-conways-law/SKILL.md +465 -0
- package/stacks/modeling-kit/templates/.claude/skills/eventmodeling-brainstorming-events/SKILL.md +587 -0
- package/stacks/modeling-kit/templates/.claude/skills/eventmodeling-brainstorming-events/references/facilitating-event-modeling-workshops.md +626 -0
- package/stacks/modeling-kit/templates/.claude/skills/eventmodeling-checking-completeness/SKILL.md +542 -0
- package/stacks/modeling-kit/templates/.claude/skills/eventmodeling-designing-event-models/SKILL.md +497 -0
- package/stacks/modeling-kit/templates/.claude/skills/eventmodeling-elaborating-scenarios/SKILL.md +783 -0
- package/stacks/modeling-kit/templates/.claude/skills/eventmodeling-identifying-inputs/SKILL.md +604 -0
- package/stacks/modeling-kit/templates/.claude/skills/eventmodeling-identifying-outputs/SKILL.md +699 -0
- package/stacks/modeling-kit/templates/.claude/skills/eventmodeling-integrating-legacy-systems/SKILL.md +674 -0
- package/stacks/modeling-kit/templates/.claude/skills/eventmodeling-optimizing-stream-design/SKILL.md +231 -0
- package/stacks/modeling-kit/templates/.claude/skills/eventmodeling-optimizing-stream-design/references/domain-patterns.md +150 -0
- package/stacks/modeling-kit/templates/.claude/skills/eventmodeling-optimizing-stream-design/references/patterns.md +329 -0
- package/stacks/modeling-kit/templates/.claude/skills/eventmodeling-optimizing-stream-design/references/snapshotting.md +204 -0
- package/stacks/modeling-kit/templates/.claude/skills/eventmodeling-orchestrating-event-modeling/SKILL.md +352 -0
- package/stacks/modeling-kit/templates/.claude/skills/eventmodeling-orchestrating-event-modeling/references/project-planning-with-event-modeling.md +341 -0
- package/stacks/modeling-kit/templates/.claude/skills/eventmodeling-plotting-events/SKILL.md +153 -0
- package/stacks/modeling-kit/templates/.claude/skills/eventmodeling-slicing-event-models/SKILL.md +136 -0
- package/stacks/modeling-kit/templates/.claude/skills/eventmodeling-slicing-event-models/references/examples.md +78 -0
- package/stacks/modeling-kit/templates/.claude/skills/eventmodeling-slicing-event-models/references/patterns.md +85 -0
- package/stacks/modeling-kit/templates/.claude/skills/eventmodeling-storyboarding-events/SKILL.md +655 -0
- package/stacks/modeling-kit/templates/.claude/skills/eventmodeling-translating-external-events/SKILL.md +479 -0
- package/stacks/modeling-kit/templates/.claude/skills/eventmodeling-validating-event-models/SKILL.md +234 -0
- package/stacks/modeling-kit/templates/.claude/skills/eventmodeling-validating-event-models-checklist/SKILL.md +353 -0
- package/stacks/modeling-kit/templates/.claude/skills/examples/SKILL.md +200 -0
- package/stacks/modeling-kit/templates/.claude/skills/handle-comment/SKILL.md +94 -0
- package/stacks/modeling-kit/templates/.claude/skills/learn-eventmodelers-api/SKILL.md +441 -0
- package/stacks/modeling-kit/templates/.claude/skills/place-element/SKILL.md +290 -0
- package/stacks/modeling-kit/templates/.claude/skills/storyboard/SKILL.md +212 -0
- package/stacks/modeling-kit/templates/.claude/skills/storyboard-screen/SKILL.md +123 -0
- package/stacks/modeling-kit/templates/.claude/skills/timeline/SKILL.md +353 -0
- package/stacks/modeling-kit/templates/.claude/skills/update-slice-status/SKILL.md +110 -0
- package/stacks/modeling-kit/templates/.claude/skills/wdyt/SKILL.md +134 -0
- package/stacks/modeling-kit/templates/kit/lib/agent.sh +20 -0
- package/stacks/modeling-kit/templates/kit/lib/ollama-agent.js +147 -0
- package/stacks/modeling-kit/templates/kit/lib/ralph.js +286 -0
- package/stacks/modeling-kit/templates/kit/package.json +12 -0
- package/stacks/modeling-kit/templates/kit/ralph-claude.js +50 -0
- package/stacks/modeling-kit/templates/kit/ralph-ollama.js +38 -0
- package/stacks/modeling-kit/templates/kit/ralph.sh +61 -0
- package/stacks/modeling-kit/templates/kit/realtime-agent.js +18 -0
- package/stacks/modeling-kit/templates/root/CLAUDE.md +56 -0
- package/stacks/node/templates/.claude/skills/build-automation/SKILL.md +266 -0
- package/stacks/node/templates/.claude/skills/build-state-change/SKILL.md +344 -0
- package/stacks/node/templates/.claude/skills/build-state-view/SKILL.md +412 -0
- package/stacks/node/templates/.claude/skills/connect/SKILL.md +178 -0
- package/stacks/node/templates/.claude/skills/learn-eventmodelers-api/SKILL.md +628 -0
- package/stacks/node/templates/.claude/skills/load-slice/SKILL.md +143 -0
- package/stacks/node/templates/.claude/skills/update-slice-status/SKILL.md +110 -0
- package/stacks/node/templates/build-kit/README.md +86 -0
- package/stacks/node/templates/build-kit/lib/AGENT.md +47 -0
- package/stacks/node/templates/build-kit/lib/agent.sh +20 -0
- package/stacks/node/templates/build-kit/lib/backend-prompt.md +152 -0
- package/stacks/node/templates/build-kit/lib/prompt.md +122 -0
- package/stacks/node/templates/build-kit/lib/ralph.js +369 -0
- package/stacks/node/templates/build-kit/ralph-claude.js +44 -0
- package/stacks/node/templates/build-kit/ralph.sh +98 -0
- package/stacks/node/templates/root/.env.example +15 -0
- package/stacks/node/templates/root/CLAUDE.md +60 -0
- package/stacks/node/templates/root/docker-compose.yml +15 -0
- package/stacks/node/templates/root/flyway.conf +17 -0
- package/stacks/node/templates/root/migrations/V1__schema.sql.example +12 -0
- package/stacks/node/templates/root/package.json +50 -0
- package/stacks/node/templates/root/server.ts +130 -0
- package/stacks/node/templates/root/setup-env.sh +53 -0
- package/stacks/node/templates/root/src/common/assertions.ts +6 -0
- package/stacks/node/templates/root/src/common/db.ts +32 -0
- package/stacks/node/templates/root/src/common/loadPostgresEventstore.ts +23 -0
- package/stacks/node/templates/root/src/common/parseEndpoint.ts +51 -0
- package/stacks/node/templates/root/src/common/processorDlq.ts +28 -0
- package/stacks/node/templates/root/src/common/realtimeBroadcast.ts +12 -0
- package/stacks/node/templates/root/src/common/replay.ts +16 -0
- package/stacks/node/templates/root/src/common/routes.ts +19 -0
- package/stacks/node/templates/root/src/common/testHelpers.ts +44 -0
- package/stacks/node/templates/root/src/swagger.ts +34 -0
- package/stacks/node/templates/root/src/util/assertions.ts +6 -0
- package/stacks/node/templates/root/src/util/hash.ts +9 -0
- package/stacks/node/templates/root/src/util/sanitize.ts +23 -0
- package/stacks/node/templates/root/tsconfig.json +32 -0
- package/stacks/node/templates/root/vercel.json +8 -0
- package/stacks/supabase/templates/.claude/skills/build-automation/SKILL.md +266 -0
- package/stacks/supabase/templates/.claude/skills/build-state-change/SKILL.md +344 -0
- package/stacks/supabase/templates/.claude/skills/build-state-view/SKILL.md +390 -0
- package/stacks/supabase/templates/.claude/skills/build-webhook/SKILL.md +303 -0
- package/stacks/supabase/templates/.claude/skills/connect/SKILL.md +178 -0
- package/stacks/supabase/templates/.claude/skills/learn-eventmodelers-api/SKILL.md +628 -0
- package/stacks/supabase/templates/.claude/skills/load-slice/SKILL.md +143 -0
- package/stacks/supabase/templates/.claude/skills/update-slice-status/SKILL.md +110 -0
- package/stacks/supabase/templates/build-kit/README.md +86 -0
- package/stacks/supabase/templates/build-kit/lib/AGENT.md +47 -0
- package/stacks/supabase/templates/build-kit/lib/agent.sh +20 -0
- package/stacks/supabase/templates/build-kit/lib/backend-prompt.md +152 -0
- package/stacks/supabase/templates/build-kit/lib/prompt.md +123 -0
- package/stacks/supabase/templates/build-kit/lib/ralph.js +369 -0
- package/stacks/supabase/templates/build-kit/ralph-claude.js +44 -0
- package/stacks/supabase/templates/build-kit/ralph.sh +98 -0
- package/stacks/supabase/templates/root/.env.example +22 -0
- package/stacks/supabase/templates/root/CLAUDE.md +61 -0
- package/stacks/supabase/templates/root/flyway.conf +17 -0
- package/stacks/supabase/templates/root/package.json +52 -0
- package/stacks/supabase/templates/root/server.ts +177 -0
- package/stacks/supabase/templates/root/setup-env.sh +53 -0
- package/stacks/supabase/templates/root/src/common/assertions.ts +6 -0
- package/stacks/supabase/templates/root/src/common/db.ts +32 -0
- package/stacks/supabase/templates/root/src/common/loadPostgresEventstore.ts +23 -0
- package/stacks/supabase/templates/root/src/common/parseEndpoint.ts +51 -0
- package/stacks/supabase/templates/root/src/common/processorDlq.ts +28 -0
- package/stacks/supabase/templates/root/src/common/realtimeBroadcast.ts +19 -0
- package/stacks/supabase/templates/root/src/common/replay.ts +16 -0
- package/stacks/supabase/templates/root/src/common/routes.ts +23 -0
- package/stacks/supabase/templates/root/src/common/testHelpers.ts +54 -0
- package/stacks/supabase/templates/root/src/supabase/README.md +141 -0
- package/stacks/supabase/templates/root/src/supabase/api.ts +56 -0
- package/stacks/supabase/templates/root/src/supabase/requireOrgaAdmin.ts +32 -0
- package/stacks/supabase/templates/root/src/supabase/requireSysUser.ts +40 -0
- package/stacks/supabase/templates/root/src/supabase/requireUser.ts +72 -0
- package/stacks/supabase/templates/root/src/swagger.ts +34 -0
- package/stacks/supabase/templates/root/src/util/assertions.ts +6 -0
- package/stacks/supabase/templates/root/src/util/hash.ts +9 -0
- package/stacks/supabase/templates/root/src/util/sanitize.ts +23 -0
- package/stacks/supabase/templates/root/supabase/config.toml +295 -0
- package/stacks/supabase/templates/root/supabase/migrations/V1__schema.sql.example +12 -0
- package/stacks/supabase/templates/root/supabase/seed.sql +1 -0
- package/stacks/supabase/templates/root/tsconfig.json +32 -0
- package/stacks/supabase/templates/root/vercel.json +8 -0
package/stacks/modeling-kit/templates/.claude/skills/eventmodeling-storyboarding-events/SKILL.md
ADDED
|
@@ -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
|
+
```
|