@cratis/pi 7.33.0 → 7.34.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 (160) hide show
  1. package/package/corpus/agents/screenplay-modeler.md +1 -1
  2. package/package/corpus/agents/screenplay-renderer.md +1 -1
  3. package/package/corpus/agents/screenplay-reviewer.md +1 -1
  4. package/package/corpus/agents/slice-implementer.md +1 -1
  5. package/package/corpus/rules/profiles.md +1 -0
  6. package/package/corpus/skills/cratis-application-slice-conformance/LICENSE +2 -2
  7. package/package/corpus/skills/cratis-application-slice-conformance/SKILL.md +5 -0
  8. package/package/corpus/skills/cratis-application-slice-conformance/references/checklists.md +12 -0
  9. package/package/corpus/skills/cratis-application-slice-conformance/references/provenance.md +3 -4
  10. package/package/corpus/skills/cratis-application-slice-specifications/LICENSE +2 -2
  11. package/package/corpus/skills/cratis-application-slice-specifications/references/provenance.md +2 -3
  12. package/package/corpus/skills/cratis-arc-react-page/LICENSE +2 -2
  13. package/package/corpus/skills/cratis-arc-react-page/references/provenance.md +2 -3
  14. package/package/corpus/skills/cratis-chronicle-event-modeling/SKILL.md +12 -6
  15. package/package/corpus/skills/cratis-chronicle-reactor/LICENSE +2 -2
  16. package/package/corpus/skills/cratis-chronicle-reactor/SKILL.md +5 -2
  17. package/package/corpus/skills/cratis-chronicle-reactor/references/provenance.md +3 -3
  18. package/package/corpus/skills/cratis-chronicle-reactor/references/slice-delivery-checklist.md +93 -0
  19. package/package/corpus/skills/cratis-chronicle-read-model-specifications/LICENSE +2 -2
  20. package/package/corpus/skills/cratis-chronicle-read-model-specifications/SKILL.md +1 -1
  21. package/package/corpus/skills/cratis-chronicle-read-model-specifications/references/provenance.md +3 -3
  22. package/package/corpus/skills/cratis-chronicle-read-model-specifications/references/view-lifecycle-checks.md +79 -0
  23. package/package/corpus/skills/cratis-event-model-diagram/LICENSE +7 -0
  24. package/package/corpus/skills/cratis-event-model-diagram/SKILL.md +26 -2
  25. package/package/corpus/skills/cratis-event-model-diagram/references/provenance.md +19 -0
  26. package/package/corpus/skills/cratis-screenplay-automations-and-translations/LICENSE +2 -2
  27. package/package/corpus/skills/cratis-screenplay-automations-and-translations/SKILL.md +14 -9
  28. package/package/corpus/skills/cratis-screenplay-automations-and-translations/references/automation-patterns.md +5 -5
  29. package/package/corpus/skills/cratis-screenplay-automations-and-translations/references/effects-and-idempotency.md +1 -1
  30. package/package/corpus/skills/cratis-screenplay-automations-and-translations/references/provenance.md +2 -3
  31. package/package/corpus/skills/cratis-screenplay-automations-and-translations/references/public-events-and-direction.md +1 -2
  32. package/package/corpus/skills/cratis-screenplay-automations-and-translations/references/realization-and-gap-fill.md +9 -5
  33. package/package/corpus/skills/cratis-screenplay-automations-and-translations/references/todo-list-example.md +6 -6
  34. package/package/corpus/skills/cratis-screenplay-automations-and-translations/references/translate-example.md +1 -1
  35. package/package/corpus/skills/cratis-screenplay-captures-and-reactions/SKILL.md +14 -13
  36. package/package/corpus/skills/cratis-screenplay-command-surface/SKILL.md +12 -13
  37. package/package/corpus/skills/cratis-screenplay-command-surface/references/compliance.md +3 -1
  38. package/package/corpus/skills/cratis-screenplay-command-surface/references/generated-values-and-responses.md +2 -2
  39. package/package/corpus/skills/cratis-screenplay-command-surface/references/validate-rules.md +4 -2
  40. package/package/corpus/skills/cratis-screenplay-delivery-planning/LICENSE +9 -0
  41. package/package/corpus/skills/cratis-screenplay-delivery-planning/SKILL.md +118 -0
  42. package/package/corpus/skills/cratis-screenplay-delivery-planning/references/parallel-delivery.md +45 -0
  43. package/package/corpus/skills/cratis-screenplay-delivery-planning/references/provenance.md +29 -0
  44. package/package/corpus/skills/cratis-screenplay-delivery-planning/references/slice-counting.md +43 -0
  45. package/package/corpus/skills/cratis-screenplay-delivery-planning/references/velocity-and-capacity.md +48 -0
  46. package/package/corpus/skills/cratis-screenplay-delivery-planning/verification.json +16 -0
  47. package/package/corpus/skills/cratis-screenplay-discovery/LICENSE +2 -2
  48. package/package/corpus/skills/cratis-screenplay-discovery/SKILL.md +6 -5
  49. package/package/corpus/skills/cratis-screenplay-discovery/references/divergent-sweep.md +1 -0
  50. package/package/corpus/skills/cratis-screenplay-discovery/references/domain-analysis-template.md +92 -0
  51. package/package/corpus/skills/cratis-screenplay-discovery/references/personas-and-causes.md +2 -2
  52. package/package/corpus/skills/cratis-screenplay-discovery/references/provenance.md +4 -3
  53. package/package/corpus/skills/cratis-screenplay-discovery/verification.json +1 -1
  54. package/package/corpus/skills/cratis-screenplay-event-modeling/LICENSE +2 -2
  55. package/package/corpus/skills/cratis-screenplay-event-modeling/SKILL.md +28 -28
  56. package/package/corpus/skills/cratis-screenplay-event-modeling/references/nine-steps.md +7 -5
  57. package/package/corpus/skills/cratis-screenplay-event-modeling/references/parsed-not-runnable.md +12 -9
  58. package/package/corpus/skills/cratis-screenplay-event-modeling/references/provenance.md +2 -3
  59. package/package/corpus/skills/cratis-screenplay-legacy-extraction/LICENSE +2 -2
  60. package/package/corpus/skills/cratis-screenplay-legacy-extraction/SKILL.md +26 -13
  61. package/package/corpus/skills/cratis-screenplay-legacy-extraction/references/candidate-inventory.md +6 -1
  62. package/package/corpus/skills/cratis-screenplay-legacy-extraction/references/generate-notes.md +7 -0
  63. package/package/corpus/skills/cratis-screenplay-legacy-extraction/references/prologue-safety.md +22 -17
  64. package/package/corpus/skills/cratis-screenplay-legacy-extraction/references/provenance.md +2 -3
  65. package/package/corpus/skills/cratis-screenplay-legacy-extraction/references/rule-modeling.md +2 -2
  66. package/package/corpus/skills/cratis-screenplay-legacy-extraction/references/side-car-migration.md +1 -0
  67. package/package/corpus/skills/cratis-screenplay-legacy-extraction/verification.json +1 -1
  68. package/package/corpus/skills/cratis-screenplay-model-authoring/references/language-reference.md +2 -2
  69. package/package/corpus/skills/cratis-screenplay-model-authoring/references/mcp-loop.md +3 -3
  70. package/package/corpus/skills/cratis-screenplay-model-authoring/references/mcp-tools.md +3 -1
  71. package/package/corpus/skills/cratis-screenplay-model-review/LICENSE +2 -2
  72. package/package/corpus/skills/cratis-screenplay-model-review/SKILL.md +8 -8
  73. package/package/corpus/skills/cratis-screenplay-model-review/references/anti-patterns.md +2 -2
  74. package/package/corpus/skills/cratis-screenplay-model-review/references/checklist.md +4 -4
  75. package/package/corpus/skills/cratis-screenplay-model-review/references/model-inventory-report.md +75 -0
  76. package/package/corpus/skills/cratis-screenplay-model-review/references/provenance.md +3 -4
  77. package/package/corpus/skills/cratis-screenplay-model-review/references/public-keys-and-routes.md +1 -1
  78. package/package/corpus/skills/cratis-screenplay-model-review/references/worked-example.md +4 -3
  79. package/package/corpus/skills/cratis-screenplay-modeling-lifecycle/LICENSE +2 -2
  80. package/package/corpus/skills/cratis-screenplay-modeling-lifecycle/SKILL.md +7 -5
  81. package/package/corpus/skills/cratis-screenplay-modeling-lifecycle/references/core-rules-digest.md +131 -0
  82. package/package/corpus/skills/cratis-screenplay-modeling-lifecycle/references/phases.md +1 -1
  83. package/package/corpus/skills/cratis-screenplay-modeling-lifecycle/references/provenance.md +25 -4
  84. package/package/corpus/skills/cratis-screenplay-modeling-lifecycle/references/reasoning-notes.md +2 -2
  85. package/package/corpus/skills/cratis-screenplay-modeling-lifecycle/references/verdicts-and-modes.md +1 -1
  86. package/package/corpus/skills/cratis-screenplay-modeling-lifecycle/references/vocabulary-map.md +5 -4
  87. package/package/corpus/skills/cratis-screenplay-projections/SKILL.md +9 -5
  88. package/package/corpus/skills/cratis-screenplay-projections/references/pdl-grammar.md +4 -2
  89. package/package/corpus/skills/cratis-screenplay-read-surface/LICENSE +7 -0
  90. package/package/corpus/skills/cratis-screenplay-read-surface/SKILL.md +16 -8
  91. package/package/corpus/skills/cratis-screenplay-read-surface/references/provenance.md +21 -0
  92. package/package/corpus/skills/cratis-screenplay-read-surface/references/screen-patterns.md +130 -0
  93. package/package/corpus/skills/cratis-screenplay-read-surface/verification.json +1 -1
  94. package/package/corpus/skills/cratis-screenplay-render-and-gap-fill/LICENSE +2 -2
  95. package/package/corpus/skills/cratis-screenplay-render-and-gap-fill/SKILL.md +58 -46
  96. package/package/corpus/skills/cratis-screenplay-render-and-gap-fill/references/delivery-protocol.md +17 -2
  97. package/package/corpus/skills/cratis-screenplay-render-and-gap-fill/references/drift-and-ledger.md +19 -2
  98. package/package/corpus/skills/cratis-screenplay-render-and-gap-fill/references/gap-fill-handoff.md +22 -4
  99. package/package/corpus/skills/cratis-screenplay-render-and-gap-fill/references/provenance.md +2 -3
  100. package/package/corpus/skills/cratis-screenplay-render-and-gap-fill/references/renderability-gate.md +21 -16
  101. package/package/corpus/skills/cratis-screenplay-render-and-gap-fill/references/worked-example.md +34 -29
  102. package/package/corpus/skills/cratis-screenplay-scenario-coverage/LICENSE +2 -2
  103. package/package/corpus/skills/cratis-screenplay-scenario-coverage/SKILL.md +5 -4
  104. package/package/corpus/skills/cratis-screenplay-scenario-coverage/references/berth-reservations.md +1 -1
  105. package/package/corpus/skills/cratis-screenplay-scenario-coverage/references/invoicing-dues-design.md +5 -4
  106. package/package/corpus/skills/cratis-screenplay-scenario-coverage/references/invoicing-dues-example.md +32 -3
  107. package/package/corpus/skills/cratis-screenplay-scenario-coverage/references/provenance.md +3 -4
  108. package/package/corpus/skills/cratis-screenplay-scenario-coverage/references/scenario-catalogue.md +7 -6
  109. package/package/corpus/skills/cratis-screenplay-scenario-coverage/references/scenario-examples.md +3 -3
  110. package/package/corpus/skills/cratis-screenplay-scenario-coverage/references/scenario-workshop.md +15 -7
  111. package/package/corpus/skills/cratis-screenplay-scenario-coverage/references/spec-forms-by-mode.md +8 -7
  112. package/package/corpus/skills/cratis-screenplay-scenario-coverage/references/view-and-story-specs.md +6 -4
  113. package/package/corpus/skills/cratis-screenplay-slice-design/LICENSE +2 -2
  114. package/package/corpus/skills/cratis-screenplay-slice-design/SKILL.md +4 -3
  115. package/package/corpus/skills/cratis-screenplay-slice-design/references/command-inventory.md +2 -2
  116. package/package/corpus/skills/cratis-screenplay-slice-design/references/derived-condition-events.md +68 -0
  117. package/package/corpus/skills/cratis-screenplay-slice-design/references/field-lineage.md +1 -1
  118. package/package/corpus/skills/cratis-screenplay-slice-design/references/provenance.md +5 -5
  119. package/package/corpus/skills/cratis-screenplay-slice-design/references/read-model-design.md +17 -0
  120. package/package/corpus/skills/cratis-screenplay-slice-design/references/rule-layers.md +6 -6
  121. package/package/corpus/skills/cratis-screenplay-slice-design/references/worked-example.md +3 -3
  122. package/package/corpus/skills/cratis-screenplay-specifications/SKILL.md +6 -4
  123. package/package/corpus/skills/cratis-screenplay-specifications/references/examples-and-routes.md +2 -1
  124. package/package/corpus/skills/cratis-screenplay-specifications/references/generated-fixtures.md +3 -2
  125. package/package/corpus/skills/cratis-screenplay-specifications/references/persona-callers-and-cases.md +3 -0
  126. package/package/corpus/skills/cratis-screenplay-specifications/references/reactions-and-cascades.md +3 -2
  127. package/package/corpus/skills/cratis-screenplay-streams-and-consistency/LICENSE +2 -2
  128. package/package/corpus/skills/cratis-screenplay-streams-and-consistency/SKILL.md +9 -9
  129. package/package/corpus/skills/cratis-screenplay-streams-and-consistency/references/boundaries.md +31 -3
  130. package/package/corpus/skills/cratis-screenplay-streams-and-consistency/references/chronicle-boundaries.md +6 -6
  131. package/package/corpus/skills/cratis-screenplay-streams-and-consistency/references/consistency-and-concurrency.md +12 -11
  132. package/package/corpus/skills/cratis-screenplay-streams-and-consistency/references/evolution.md +1 -1
  133. package/package/corpus/skills/cratis-screenplay-streams-and-consistency/references/provenance.md +4 -4
  134. package/package/corpus/skills/cratis-screenplay-streams-and-consistency/references/streams-example.md +1 -1
  135. package/package/corpus/skills/cratis-screenplay-toolchain/LICENSE +2 -2
  136. package/package/corpus/skills/cratis-screenplay-toolchain/SKILL.md +14 -12
  137. package/package/corpus/skills/cratis-screenplay-toolchain/references/cheat-sheet-example.md +3 -3
  138. package/package/corpus/skills/cratis-screenplay-toolchain/references/cheat-sheet.md +1 -1
  139. package/package/corpus/skills/cratis-screenplay-toolchain/references/doc-contradictions.md +3 -1
  140. package/package/corpus/skills/cratis-screenplay-toolchain/references/executable-subset.md +24 -16
  141. package/package/corpus/skills/cratis-screenplay-toolchain/references/provenance.md +2 -3
  142. package/package/corpus/skills/cratis-screenplay-toolchain/references/renderable-subset.md +41 -12
  143. package/package/corpus/skills/cratis-screenplay-toolchain/references/traps.md +5 -5
  144. package/package/corpus/skills/cratis-screenplay-toolchain/references/verdicts.md +14 -9
  145. package/package/corpus/skills/cratis-screenplay-toolchain/references/versions.md +9 -3
  146. package/package/corpus/skills/cratis-screenplay-toolchain/verification.json +4 -1
  147. package/package/corpus/skills/cratis-screenplay-ui-composition/LICENSE +2 -2
  148. package/package/corpus/skills/cratis-screenplay-ui-composition/SKILL.md +10 -10
  149. package/package/corpus/skills/cratis-screenplay-ui-composition/references/flow-review.md +1 -1
  150. package/package/corpus/skills/cratis-screenplay-ui-composition/references/provenance.md +2 -3
  151. package/package/corpus/skills/cratis-screenplay-ui-composition/references/screen-composition-contract.md +39 -14
  152. package/package/corpus/skills/cratis-screenplay-ui-composition/references/worked-flow.md +17 -9
  153. package/package/corpus/skills/cratis-stage-rendering-and-sandbox/SKILL.md +83 -74
  154. package/package/corpus/skills/cratis-stage-rendering-and-sandbox/references/admission.md +62 -12
  155. package/package/corpus/skills/cratis-stage-rendering-and-sandbox/references/render-example.md +3 -1
  156. package/package/corpus/skills/cratis-stage-rendering-and-sandbox/references/rendered-application.md +30 -15
  157. package/package/corpus/skills/cratis-stage-rendering-and-sandbox/references/sandbox-and-specrunner.md +21 -1
  158. package/package/corpus/skills/cratis-stage-rendering-and-sandbox/verification.json +8 -3
  159. package/package/profile-catalog.json +1 -0
  160. package/package.json +1 -1
@@ -0,0 +1,131 @@
1
+ # Core rules digest
2
+
3
+ ## Contents
4
+
5
+ - Two postures, never mixed in one pass
6
+ - Elements and names
7
+ - Causality
8
+ - Roles
9
+ - Field lineage
10
+ - Open question versus decided failure
11
+ - Offline-first lens
12
+ - Anti-patterns to reject early
13
+ - Structural shapes (candidates)
14
+ - Quick self-check
15
+
16
+ A one-page card of the element, naming and causality rules that every modeling phase
17
+ relies on. It restates what the construct and phase skills own, in one place, so a session
18
+ does not reopen five skills to check a name. When this card and a construct skill differ, the
19
+ construct skill and the compiler win. Adapted from Martin Dilger and Nebulit GmbH's
20
+ eventmodeling-core-rules (see `provenance.md`), translated to `.play` constructs.
21
+
22
+ ## Two postures, never mixed in one pass
23
+ - **Modeling.** Discovery, slice design, authoring. Build the process as completely as you can.
24
+ Flag a naming slip or an incomplete precondition and move on; do not stall the step on it.
25
+ - **Critic.** Review (`cratis-screenplay-model-review`). Apply every rule strictly and report every
26
+ violation; do not soften a finding because the model mostly works, and do not quietly add
27
+ missing structure on the model's behalf. Findings go in the report, not into the model.
28
+
29
+ A modeling pass is not the place for a full audit, and a critic pass never edits.
30
+
31
+ ## Elements and names
32
+ | Construct | Means | Name it | Reject |
33
+ |---|---|---|---|
34
+ | `event` | A business fact that already happened; immutable; a correction is a new event | Past tense, business language: `BerthReserved`, `PaymentAuthorized` | UI or machinery: `SidebarOpened`, `ApiCalled`, `ResponseReceived` |
35
+ | `command` | Business intent from a caller; can be refused; on success produces one or more events | Imperative: `ReserveBerth`, `CancelSubscription` | Queries and UI actions: `LoadOrders`, `FetchData`, `OpenDialog` |
36
+ | `readmodel` (+ `query`) | A projection of events shaped for one question; optional for any given command | A noun phrase for the data: `BerthAvailability`, `InvoiceList` | Implementation words: `...Projector`, `...Repository` |
37
+ | `screen` | What a user sees and can act on | What a user would call it: `Dashboard`, `ReservationsPage` | `...Component`, `...View` internals |
38
+ | `reaction` / `trigger` | An automated actor reacting to an event, a clock or an application signal | What it does: `BillingScheduler`, `BerthReleaser` | Handler or service names |
39
+ | `persona` | A named role with Does / Reads / Cannot | A role in domain language | A generic "User" |
40
+
41
+ An event holds captured or decided facts. A running total, an average or a status that is only
42
+ recomputed from other events is a `readmodel`, not an event. A calculation that was actually
43
+ decided at a point in time (a quoted price, an approved amount) is a fact and belongs in the
44
+ event; say which it is.
45
+
46
+ ## Causality
47
+ - Every locally produced event has a modeled producer that is reachable and motivated: whatever
48
+ the language lets produce it, for example a command or reaction `produces`, a capture, or an
49
+ event-target projection or reducer publishing an outbound public event. A foreign event
50
+ declared with `from` is produced by its owning system, not locally. The examples are not a
51
+ closed list; the construct skills and checklist F13 in `cratis-screenplay-model-review` decide.
52
+ - Every command has a reachable, authorized origin, for example a screen or form action, or a
53
+ reaction to an event, a clock or an application trigger (not a closed list; F13 decides). A
54
+ command may have several origins and a screen several actions; judge each origin on its own.
55
+ - A process starts at a screen or form action (a blank creation form counts), at a reaction to a
56
+ modeled event, a clock or application trigger, or at a capture appending outside facts; never at
57
+ an unmotivated command.
58
+ - Two state changes in a row need something that triggers the second (a screen, or a reaction).
59
+ - Connections read forward: what a later step needs from an earlier one is an event or a read
60
+ model that already exists. When a later event must change what an earlier view shows, the
61
+ projection of that view consumes the later event; do not draw a backward dependency.
62
+ - Slices connect through events and views. Common transitions: StateView to StateChange,
63
+ StateChange to StateView, StateChange to Automation, Automation to StateChange, Automation to
64
+ StateView, Translate to StateView, Translate to Automation. Judge a connection by checklist
65
+ F13 in `cratis-screenplay-model-review`, not by this list.
66
+
67
+ ## Roles
68
+ Every persona has a name in domain language, what it does, what it reads, and what it cannot do,
69
+ and each "Cannot" is backed by an `authorize` gate and a `then denied` specification, or recorded
70
+ as a gap. No command is attributed to a generic "User". A persona that never acts and never reads
71
+ anything is decorative, not modeled. See `cratis-screenplay-discovery` `references/personas-and-causes.md`.
72
+
73
+ ## Field lineage
74
+ Every command input, event property and read-model field has an origin (user input, caller
75
+ context, a prior event property, a decided derivation, or an external payload) and, where it
76
+ matters, a destination. A field with no origin is a gap to resolve, not a detail to fill in later.
77
+ See `cratis-screenplay-slice-design` `references/field-lineage.md`.
78
+
79
+ ## Open question versus decided failure
80
+ - **Open question.** Genuinely undecided. It goes in session state (`STATE.md`) or the review
81
+ report and stays open until someone answers it. Resolving means answering.
82
+ - **Decided failure.** A rejection or error whose behavior is already decided ("payment fails,
83
+ refuse, no event"). Model it as a `specification` with `then error` or `then denied`. It is
84
+ permanent specified behavior, not a note waiting on an answer.
85
+
86
+ A decided failure left as an open note looks unresolved when it is not. When counting
87
+ completeness, only a genuinely unanswered question is a gap; a decided failure needs its
88
+ specification.
89
+
90
+ ## Offline-first lens
91
+ Model the business process as it would run without software first: who acts, what triggers each
92
+ action, what information they need before acting. Question any step that exists only because of
93
+ the system (a loading state, a cache refresh, a session check); it is not a business step and
94
+ does not belong on the timeline. The anti-patterns below are what skipping this looks like.
95
+
96
+ ## Anti-patterns to reject early
97
+ - **Data-loading commands.** `LoadOrders` is a query; model a `readmodel` and a `query`.
98
+ - **UI-interaction events.** `ButtonClicked` is UI state; model it only if the business cares.
99
+ - **Technical events.** `ApiCalled` describes machinery; find the business outcome underneath.
100
+ - **Recomputed events.** A value that changes whenever its source data changes is a read-model field.
101
+
102
+ ## Structural shapes (candidates)
103
+ Check these only when the model's wiring is visible; a count over the threshold is a prompt to
104
+ think, not a finding.
105
+ - **Screen with several commands** (the bed). Check each action is a distinct decision the user
106
+ already made on that screen. Screenplay allows several actions on a screen; the signal is a
107
+ single submit that quietly settles several things.
108
+ - **Command with more than two events** (left chair). One business outcome that fans out, or a
109
+ command doing two jobs? Ask whether the events always happen together.
110
+ - **Read model fed by more than three events** (right chair). One coherent picture, or a view
111
+ answering several questions? Ask whether the fields describe one thing.
112
+ - **Slice with many more specifications than its neighbors** (shelf). Genuinely complex, or
113
+ quietly covering a neighbor's ground? Read what the extra specifications cover.
114
+
115
+ Use plain descriptions in anything a business stakeholder reads; the shape names are shorthand
116
+ for modelers. The full signal, consequence and fix per shape is in
117
+ `cratis-screenplay-model-review` `references/anti-patterns.md`.
118
+
119
+ ## Quick self-check
120
+ - [ ] Every event is past tense and a business fact.
121
+ - [ ] Every command is imperative intent, not a data load.
122
+ - [ ] Every read model is named for its data.
123
+ - [ ] No event carries a value that is only recomputed from other events.
124
+ - [ ] Every command has a reachable, authorized origin.
125
+ - [ ] Every process starts at a screen or form action, a reaction, a clock or application trigger, or a capture.
126
+ - [ ] No two state changes are chained without a trigger between them.
127
+ - [ ] Every persona has a Cannot line backed by a gate and a denial specification, or a recorded gap.
128
+ - [ ] Every decided failure is a specification; every open question is in session state.
129
+
130
+ This is the fast pass; the full audit is `cratis-screenplay-model-review`
131
+ `references/checklist.md`, and the closing quality checklist is in `references/phases.md`.
@@ -127,7 +127,7 @@ phase, a decision important enough that a later reader could misread the model (
127
127
  - **Input**: the accepted identity.
128
128
  - **Carry-forward**: the admission result; render output and named gaps in `Customizations/`;
129
129
  non-renderable scope handed to a code agent with the model as contract, plus a fallback record
130
- naming the blocking codes. Automations and translations are not rendered at the pinned Stage version, so the whole behavior is gap-fill. Three cases stay distinct: admission failure (nothing rendered); an
130
+ naming the blocking codes. Automations and translations are not rendered at the pinned Stage version (4.73.1), so the whole behavior is gap-fill (a reaction that produces and invokes keeps its one modeled form; `STAGE-ESM-037` is Stage's refusal, not a reason to split it). Three cases stay distinct: admission failure (nothing rendered); an
131
131
  existing generated base plus separately authorized gap-fill; fully hand-written delivery.
132
132
  - **Gate**: V5 sub-results, or a fallback entry per non-renderable scope. A customization never
133
133
  makes a rejected model renderable; no whole-application V5 from a subset.
@@ -11,7 +11,7 @@ sections, in this order:
11
11
  not empty, the skill `LICENSE` carries the "Third-party notices" section with the **complete**
12
12
  MIT text (copyright line, permission notice and disclaimer). Closely adapted material is
13
13
  attributed to the source it came from, not to a neighboring one.
14
- 2. **Adapted closely (Martin Dilger and Nebulit GmbH, with agreement).** One row per item taken from Martin Dilger and Nebulit GmbH's
14
+ 2. **Adapted closely (Martin Dilger and Nebulit GmbH).** One row per item taken from Martin Dilger and Nebulit GmbH's
15
15
  agentic-engineer: source file, where it is used, how. Mark "idea; our wording kept" where only
16
16
  the idea was taken. The skill `LICENSE` carries the Nebulit notice.
17
17
  3. **Method lineage.** Public method sources (books, talks, standards), cited as sources of ideas.
@@ -34,11 +34,10 @@ full notice is in this skill's `LICENSE` ("Third-party notices").
34
34
  | same file, "Mid-Workflow Entry" | `SKILL.md`, `phases.md` "Resume mid-workflow" | Entry points table and identity recomputation added |
35
35
  | same file, "Final Output" and "Quality Checklist" | `phases.md` "Final output" and "Quality checklist (closing)" | Items rewritten around Screenplay verdicts, specifications and review |
36
36
 
37
- ## 2. Adapted closely (Martin Dilger and Nebulit GmbH, with agreement)
37
+ ## 2. Adapted closely (Martin Dilger and Nebulit GmbH)
38
38
 
39
39
  Source: https://github.com/Nebulit-GmbH/agentic-engineer at commit `07b0f30648d663cb588d7e2c7aa031af9dfc21f2`,
40
- by Martin Dilger and Nebulit GmbH (https://nebulit.de). The repository carries no licence file; this material
41
- is adapted with the agreement of Martin Dilger and Nebulit GmbH.
40
+ by Martin Dilger and Nebulit GmbH (https://nebulit.de), used with the explicit consent of Martin Dilger and Nebulit GmbH.
42
41
 
43
42
  | Source file | Used in | How |
44
43
  |---|---|---|
@@ -55,6 +54,28 @@ is adapted with the agreement of Martin Dilger and Nebulit GmbH.
55
54
  | `.claude/skills/update-prompt-status/SKILL.md` and kit "exactly two status updates per prompt" | `references/per-turn-protocol.md` step 7 | Idea; one start marker and one closing outcome per turn, our wording |
56
55
  | `.claude/skills/eventmodeling-core-rules/SKILL.md`: modeling and critic postures never mixed; a known refusal is a documented rule | `SKILL.md` "Modes", "Do not cut corners to save tokens or effort" | Idea; our wording kept |
57
56
  | `.claude/skills/connect/SKILL.md`: discover capabilities once per session | `SKILL.md` "Run protocol", `references/identity-and-edits.md` | Idea; our wording kept |
57
+ | `.claude/skills/eventmodeling-core-rules/SKILL.md`: modes (modeling versus critic), element definitions and naming, causality, role catalog, field lineage, open question versus decided failure, offline-first, anti-patterns, structural shapes, quick self-check | `references/core-rules-digest.md` | Adapted closely as a one-page card translated to `.play` constructs. Not adopted: lanes, the single-issuer command rule, linked copies, the translation chain with a never-closing todo list, "read model never drives command validation" (Screenplay `reads` + `require`), the update-feeding-read-model procedure; "bed" is a candidate signal here, not an always-flag |
58
+
59
+ ## Not adopted from agentic-engineer (rejected, with reasons)
60
+
61
+ Recorded once here for the whole method family, checked against the same commit
62
+ (`07b0f30648d663cb588d7e2c7aa031af9dfc21f2`). A rejection stays rejected unless a released Screenplay or
63
+ Chronicle capability removes its reason.
64
+
65
+ | Source file or topic | Reason |
66
+ |---|---|
67
+ | `connect`, `learn-eventmodelers-api`, `load-slice`, `update-prompt-status`, and the 24 `references/api-fallback.md` files | Transport and credentials for the eventmodelers board. The Screenplay MCP server (`cratis screenplay mcp`) is the only transport; its tool catalog is `cratis-screenplay-model-authoring` `references/mcp-tools.md` and the root is `mcpServers.screenplay.root` in `.cratis/ai.json` |
68
+ | `place-element`, `html-screen`, `storyboard-screen`, `discover-storyboard` HTML reconstruction | Board lanes, columns, cells and HTML or wireframe rendering. Screenplay screens are declarative and Stage renders them; a recreated page is never evidence |
69
+ | `.agent-modeling-kit/README.md`, `lib/config.js`, `package.json`, `package-lock.json`, root `CLAUDE.md` and `README.md` | Board runtime, config walk, package stubs and an Emmett/Postgres/Express/Flyway template; Chronicle and Arc are the runtime here |
70
+ | `.agent-modeling-kit/CLAUDE.md` and `AGENTS.md`: `<promise>`, progress file, board prompt queue, post-question-and-continue autonomy | Board-specific loop control. Our per-turn protocol and stop-or-assume keep the useful parts, and Cratis stops for consequential unknowns |
71
+ | `eventmodeling-designing-event-models/references/examples.md` | The order example embeds a calculated `total` event field and a generic domain; Cratis examples are compiled |
72
+ | Single issuer per command; a screen wired to more than one command always fails; "the bed" as an always-flag | Screenplay commands may have several origins and a screen several actions; the shape stays a candidate signal |
73
+ | "A read model never drives command validation" | Screenplay commands declare `reads` and `require`; a decision uses stored state only through declared `reads` |
74
+ | Compulsory todo list per automation; never-closing translation queue; every trigger is an event | Direct reactions, clock and application triggers and `capture` are supported; a translation holding pending work gets a terminal disposition |
75
+ | "Default gracefully" and log-and-drop for missing external data | Defaults are never fabricated and failures are recorded facts |
76
+ | Linked copies, backward-arrow handling, `session:` field mappings, `validate_model` batch calls | Board mechanics; caller identity is `context` and the model has no columns |
77
+ | "No natural end" red flag, event-granularity tip, archival splits, `no computed fields` as an absolute | Long-lived identities are normal here, generic update events are defects, and decided calculations are facts |
78
+ | Emmett decide/evolve structure, `processor.ts`, processor ids and locks, DLQ store, SQL operations, Flyway, Testcontainers, `routes.ts` | A different runtime; Chronicle and Arc own delivery, projection and transport |
58
79
 
59
80
  ## 3. Method lineage
60
81
 
@@ -14,8 +14,8 @@ PLAY0477 retained for events. Specifications accept `description`, not documenta
14
14
  put their longer reasoning on the owning slice. Projections/screens do not accept it.
15
15
  Canonical printing retains documentation on its owner. It is report-only (PLAY0270),
16
16
  absent from executable bytes and `modelRevision`; edits change source identity
17
- (`verdicts-and-modes.md`). Neither description nor documentation is rendered as code
18
- (Stage#178): model the rule first, never treat prose as enforcement.
17
+ (`verdicts-and-modes.md`). Neither description nor documentation reaches rendered code except as XML doc
18
+ comments (Stage#178 closed): model the rule first, never treat prose as enforcement.
19
19
 
20
20
  Cover, briefly and only where real:
21
21
  1. Scope: the business process and the identities its streams are keyed by.
@@ -18,7 +18,7 @@ defines what each result means and how to report it. Do not copy version facts h
18
18
 
19
19
  | Result | Evidence | Does NOT prove |
20
20
  |---|---|---|
21
- | V1 authorable | folder-mode validate with warnings as errors. The standalone compiler includes imports in folder and file mode; the pinned `cratis` CLI (v3.28.2) file validation still ignores imports (cli#244, probed), so folder mode is the cross-tool check | semantics, binding, specs |
21
+ | V1 authorable | folder-mode validate with warnings as errors. The standalone compiler includes imports in folder and file mode; `cratis` CLI 3.28.2 file validation ignored imports (cli#244, probed); since 3.28.4 (PR #258) it compiles the file with its imports, but folder mode stays the recommended cross-tool check | semantics, binding, specs |
22
22
  | V2 executable diagnostics | the executable model reports no diagnostics for the scope | that any spec runs or passes |
23
23
  | V3 binding-ready | the model binds to the executable semantic model | that any spec runs or passes |
24
24
  | V4 reference specs run | the reference execution route only: engine, and per `.play` specification passed / failed / unsupported / cancelled | rendering, generated code, build or target tests |
@@ -18,10 +18,10 @@ speaks in them; never model board mechanics (lanes, node ids, positions).
18
18
  | Chapter / workflow | `feature` | feature folder | vertical slices |
19
19
  | Slice | `slice` (one behaviour, not one artifact of each kind) | vertical slice folder | vertical slices |
20
20
  | Scenario (Given/When/Then) | `specification` | generated spec class `when_<spec_name>` (Debug) or hand-written C# specs | `cratis-screenplay-specifications`; C# spec skills |
21
- | Storyline (ordered beats) | a **family** of specifications sharing example data, each one transition (no storyline syntax at the verified Screenplay v4.66.0) | several spec classes | specifications |
21
+ | Storyline (ordered beats) | a **family** of specifications sharing example data, each one transition (no storyline syntax at Screenplay 4.139.0) | several spec classes | specifications |
22
22
  | Field validation | concept `validate` (every use) / command `validate`, `require` | `ConceptValidator<T>` / `CommandValidator<T>` | command validation |
23
23
  | Role permission ("Cannot") | `policy` + `authorize` + `then denied` spec; ownership via `claim ... matches subject` | `[Authorize(Policy)]`, generated policies | authorization |
24
- | Precondition on stream state | `reads` + `require` as stated intent, not enforced at the verified Screenplay v4.66.0 (target: Arc `[ProtectedDecision]` + `DecisionRead<T>`, or Chronicle DCB; APIs available to gap-fill in Stage 4.51.3's Arc 22.50.5/Chronicle 19.32.0, not emitted protection) | decision over a guarded read | command validation |
24
+ | Precondition on stream state | `reads` + `require` as stated intent, not enforced at Screenplay 4.139.0 (target: Arc `[ProtectedDecision]` + `DecisionRead<T>`, or Chronicle DCB; APIs available to gap-fill in the Arc and Chronicle the Stage 4.73.1 scaffold pins, not emitted protection) | decision over a guarded read | command validation |
25
25
  | Generated id (`derived:uuid4()`) | `generated` (authorable, not executable) | id supplied before `Handle()` | commands |
26
26
  | External system / outbound call | `Translate` slice (inbound); `system`/`operation` (authorable, not executable) or Automation (outbound) | `ICommandOperation` / reactor | operations, reactors |
27
27
  | HTML mockup | `screen` Level 1 + board (`visualize-model`) | default Scene composition | ui composition |
@@ -42,8 +42,9 @@ Screenplay meaning, and when you meet the older usage, translate it and say so.
42
42
  - Screenplay **`reaction`**: the construct that models it (`when` trigger, optional `where`,
43
43
  `invokes` a command or `produces` events).
44
44
  - Chronicle **reactor**: C# observer, usually for side effects; it does not by itself define
45
- business decisions. A Screenplay reaction is authorable and bindable, but Stage `v4.24.2` renders no Automation or
46
- Translate slice: the reactor and command are gap-fill code.
45
+ business decisions. A Screenplay reaction is authorable and bindable, but Stage 4.73.1 renders no Automation or
46
+ Translate slice: the reactor and command are gap-fill code. A reaction that both produces events and invokes commands is
47
+ refused by Stage (`STAGE-ESM-037`); Arc 22.72.0 and later run one reactor returning events and commands (the Arc the Stage scaffold pins needs a proven override), so keep the reaction whole.
47
48
 
48
49
  ## Scenario vs specification
49
50
  "Scenario" is the Event Modeling example and the scenario *types* `cratis-screenplay-scenario-coverage` uses for
@@ -35,7 +35,8 @@ source is the single flow model.
35
35
  The update follows `commands.md`, `events.md` and `mcp/authoring-tools.md` at
36
36
  that main commit (after v4.52.0); no PDL example changes in this update.
37
37
 
38
- Checked against the Screenplay repository at tag `v4.31.0` (commit `355dffb`):
38
+ Originally checked against the Screenplay repository at tag `v4.31.0` (commit `355dffb`; the
39
+ projection grammar was re-read at v4.139.0 for headers and dynamic keys):
39
40
  `Documentation/screenplay/projections/` (including `semantic-model.md`, `keys.md`
40
41
  and `variants.md`), `readmodels.md`, `diagnostics.md` and decisions 0001 and 0002.
41
42
  Every example below compiles with that version's compiler. Reverify before
@@ -88,8 +89,11 @@ Read [observer filters](../cratis-screenplay-toolchain/references/production-rou
88
89
 
89
90
  ## Projection-level directives
90
91
 
91
- `no automap`, `sequence <name>`, `file <path>`. `sequence` is a realization
92
- concern and does not bind to the executable model.
92
+ `description "..."` (or a fenced text block) on the projection header (report-only `PLAY0270`; variants
93
+ and nested blocks take none), `no automap`, `sequence <name>`, `file <path>`. `sequence` is a realization
94
+ concern and does not bind to the executable model. A mapping target may end in a dynamic dictionary
95
+ key, `count eventCountByType.$eventContext.eventType.id` (one entry per distinct value); only
96
+ `$eventContext` resolves there, any other `$` text is a literal key with warning `PLAY0299`.
93
97
 
94
98
  ⚠️ **Do not write `key` on the projection.** It parses, but neither Chronicle nor
95
99
  the executable model routes any event by it, and it is not a default for the
@@ -328,8 +332,8 @@ What the executable model does with it (ESM v3):
328
332
  - The body is an opaque attachment identified by a content hash, never compiled
329
333
  or run by Screenplay. The reference runner cannot compute reducer state, so a
330
334
  specification that reads a reducer-built read model reports unsupported and
331
- never passes. A target must supply the transition. Stage 4.24.0 admits only pure reducer bodies
332
- (Roslyn allowlist); an impure body is gap-fill code, and the model stays the contract.
335
+ never passes. A target must supply the transition. Stage (4.73.1) admits only pure reducer bodies
336
+ (Roslyn allowlist, `STAGE-ESM-019`/`-022`); an impure body is gap-fill code, and the model stays the contract.
333
337
 
334
338
  **Prefer a projection where one will do.** A reducer is code, and code is the part
335
339
  of a document a reader cannot check at a glance.
@@ -10,7 +10,9 @@
10
10
 
11
11
  Checked against `Documentation/screenplay/projections/{grammar,semantic-model,keys,variants}.md`
12
12
  and `Source/DotNET/Screenplay/Parsing/ProjectionParser.cs` at Screenplay tag
13
- `v4.31.0` (commit `355dffb`).
13
+ `v4.31.0` (commit `355dffb`); the header `description` and the dynamic dictionary-key target
14
+ (`Target = ["@"] Path [DynamicKey]`, `DynamicKey = "." "$eventContext" "." EventContextPath`) were added in
15
+ later releases and re-read at v4.139.0.
14
16
 
15
17
  The grammar says what **parses**. It does not say what an event does at runtime:
16
18
  Chronicle's lowering decides that (Screenplay decision 0001), and the
@@ -143,7 +145,7 @@ LiteralKeyword = "literal", " ", Literal ; (* parsed at the Expr level *)
143
145
  | `PLAY0190` | A reducer rule body opens with an unknown word |
144
146
  | `PLAY0191` | A read model is built by more than one projection or reducer |
145
147
  | `PLAY0192` | A read model is declared more than once |
146
- | `PLAY0295`–`PLAY0299` | An `$eventContext` path the event-context catalog does not have |
148
+ | `PLAY0295`–`PLAY0299` | An `$eventContext` path the event-context catalog does not have; `PLAY0299` also warns when a dynamic dictionary key uses a `$` source other than `$eventContext` |
147
149
  | `PLAY0380` | Chronicle drops part of a construct: `all` below the top level, or `automap` on a joined event |
148
150
  | `PLAY0381` | A projection-level `key` routes no event |
149
151
  | `PLAY0382`–`PLAY0385` | Variant errors: no `enters on`, shared mapping missing on a variant, duplicate variant name, entering event claimed twice |
@@ -1,2 +1,9 @@
1
1
  Copyright (c) Cratis. All rights reserved.
2
2
  Licensed under the MIT license. See LICENSE file in the project root for full license information.
3
+
4
+ Third-party notices
5
+
6
+ This skill adapts material from agentic-engineer by Martin Dilger and Nebulit GmbH
7
+ (https://github.com/Nebulit-GmbH/agentic-engineer, commit 07b0f30648d663cb588d7e2c7aa031af9dfc21f2;
8
+ https://nebulit.de), used with the explicit consent of Martin Dilger and Nebulit GmbH. The adapted
9
+ material remains credited to Martin Dilger and Nebulit GmbH. See references/provenance.md.
@@ -150,7 +150,8 @@ pushing; without the marker a query is one-shot, which is the default and what
150
150
  most reads are. The marker qualifies only *how* the result arrives, so it composes
151
151
  with `[]`, `optional`, `by`, `filter`, `authorize` and a `performer`, and a screen binds
152
152
  to a live query exactly as it binds to a one-shot one. The delivery itself is the
153
- target runtime's: the executable model does not bind observable queries.
153
+ target runtime's: the executable model binds `observable` queries (delivery `live`) that
154
+ have no `filter`, `scoped to` or `performer`.
154
155
 
155
156
  Paging, sorting and change-set delivery for queries are accepted as Screenplay
156
157
  decision 0010 but **not in the language yet**. Do not invent syntax for them.
@@ -173,13 +174,14 @@ on the header line is a declaration error, not a shorthand.
173
174
 
174
175
  ### What runs
175
176
 
176
- In the Screenplay 4.66.0 executable model, only the keyed snapshot shape binds:
177
- `=> <ReadModel> optional` with one caller-supplied `by` argument and no `observable`,
178
- `filter`, `scoped to` or `performer`. Anything else, including `=> <ReadModel>`
179
- and `=> <ReadModel>[]`, reports `PLAY0268`. Its `authorize` gate runs before
177
+ In the Screenplay 4.139.0 executable model (admitted since 4.105.0) these bind: a keyed
178
+ `=> <ReadModel> optional` with one caller-supplied `by` argument, an unfiltered list
179
+ `=> <ReadModel>[]`, a list narrowed by one caller-supplied `by` key, and the `observable`
180
+ form of each. `filter`, `scoped to`, `performer`, `by ... from` and composite `by` report
181
+ `PLAY0268`, as does a single non-optional `=> <ReadModel>`. Its `authorize` gate runs before
180
182
  the lookup, ANDed with module and feature gates; a denied caller gets
181
183
  `Unauthorized`. Pin that with a `given caller` fixture and `then denied` (see
182
- `cratis-screenplay-specifications`). Model the richer query shapes when the
184
+ `cratis-screenplay-specifications`). Model `filter`, `scoped to` and `performer` shapes when the
183
185
  application needs them; just do not claim the reference runner exercised them.
184
186
 
185
187
  ## `screen` — three levels
@@ -192,8 +194,10 @@ commands and screens it names are declared elsewhere.
192
194
  ```screenplay excerpt
193
195
  screen InvoiceList
194
196
  data InvoiceListReadModel[] via query ListInvoices
195
- action RegisterInvoice
196
- navigate to RegisterInvoiceScreen
197
+ section registerInvoiceInput
198
+ title "Register invoice"
199
+ on click
200
+ navigate to RegisterInvoiceScreen
197
201
  action CancelInvoice
198
202
  ```
199
203
 
@@ -307,8 +311,12 @@ binding failures are errors.
307
311
  Read `references/versions.md` in `cratis-screenplay-toolchain` when choosing a tool, checking versions, or assessing executable and renderable subsets. Where a construct sits in the
308
312
  method: `cratis-screenplay-modeling-lifecycle` and `cratis-screenplay-slice-design`.
309
313
 
314
+ Read [screen patterns](references/screen-patterns.md) when deciding whether a screen is an input, status or error-state screen and which `data` and `action` lines it needs.
315
+
310
316
  ## Route near misses
311
317
 
318
+ Attribution and licences: `references/provenance.md`.
319
+
312
320
  - How events fill the read model: `cratis-screenplay-projections`.
313
321
  - Layouts, templates, forms, component bindings, toolbars, outlets, contributions, packages and themes: `cratis-screenplay-ui-composition`.
314
322
  - Asserting query results: `cratis-screenplay-specifications`.
@@ -0,0 +1,21 @@
1
+ # Provenance
2
+
3
+ ## Adapted closely (Martin Dilger and Nebulit GmbH)
4
+
5
+ Source: https://github.com/Nebulit-GmbH/agentic-engineer at commit `07b0f30648d663cb588d7e2c7aa031af9dfc21f2`,
6
+ by Martin Dilger and Nebulit GmbH (https://nebulit.de), used with the explicit consent of Martin Dilger
7
+ and Nebulit GmbH. The notice is in this skill's `LICENSE`.
8
+
9
+ | Source file | Used in | How |
10
+ |---|---|---|
11
+ | `.claude/skills/eventmodeling-storyboarding-events/SKILL.md`, "Common Patterns": input screen, status screen, error state | `references/screen-patterns.md` | Adapted closely and mapped to `screen`, `data`, `action` and `specification` (`then error`); one screen per column, lanes, actor perspective rows and mandatory rendering not adopted; the example is compiled with Screenplay 4.139.0 |
12
+
13
+ Not adopted: HTML screen reconstruction and wireframe sketching (`html-screen`, `storyboard-screen`), which are board
14
+ mechanics; Screenplay screens are declarative and Stage renders them.
15
+
16
+ ## Other lineage
17
+
18
+ - Screenplay language documentation and the released tool, pinned in `cratis-screenplay-toolchain`
19
+ `references/versions.md`: the `readmodel`, `query` and `screen` constructs.
20
+ - Event Modeling (Adam Dymitruk) and Martin Dilger, *Understanding Eventsourcing*: the screen as the point where
21
+ a person reads a view and decides.
@@ -0,0 +1,130 @@
1
+ <!-- Copyright (c) Cratis. All rights reserved. -->
2
+ <!-- Licensed under the MIT license. See LICENSE file in the project root for full license information. -->
3
+
4
+ # Screen patterns
5
+
6
+ ## Contents
7
+
8
+ - Input screen
9
+ - Status screen
10
+ - Error state
11
+ - A complete example
12
+ - What a screen pattern is not
13
+
14
+ Three screen shapes recur in almost every model. Decide which one a screen is before declaring
15
+ its `data` and `action` lines; the shape tells you which read model and which command it needs.
16
+ Adapted from Martin Dilger and Nebulit GmbH's storyboarding patterns (see `provenance.md`),
17
+ translated to `screen`, `data`, `action` and `specification`.
18
+
19
+ ## Input screen
20
+
21
+ The person fills in a form, submits, and a fact is recorded.
22
+
23
+ - The form fields are the command's inputs; a field the person should not supply (their own
24
+ identity, the tenant) comes from context, not the form (`cratis-screenplay-command-surface`
25
+ `references/context.md`).
26
+ - The submit is `action <Command>` on the screen. The screen needs no read model when it is a
27
+ blank creation form; when it shows current state before the person acts (the berth's
28
+ availability, the amount still owed), it also needs `data <ReadModel> via query <Query>`.
29
+ - After success the person lands somewhere meaningful: `navigate to <Screen>` on the action, or the
30
+ list that now contains the new item. Where the person goes next is part of the story, so name it.
31
+
32
+ ## Status screen
33
+
34
+ The person looks at where something stands and decides what to do next.
35
+
36
+ - `data <ReadModel> via query <Query> [by <param>]` supplies the current state, built from the
37
+ events so far. Every field shown has a source in that read model.
38
+ - The available actions depend on state. A static `action` line is always offered; an action that
39
+ must differ by state is a guarded action (`references/guarded-actions.md`), never prose.
40
+ - A status screen with no incoming view is a gap; only a blank creation form is exempt.
41
+
42
+ ## Error state
43
+
44
+ The person acts and the command is refused: no event is recorded, a message is shown, and the
45
+ person can retry or choose another action.
46
+
47
+ - The refusal is not drawn on the screen. It is behavior, pinned by a `specification` with
48
+ `then error` (a rule) or `then denied` (a gate), and by the command's `validate` and `require`
49
+ messages, which are the text the person sees.
50
+ - Name the way out. After a refusal the person can correct the input and submit again, or take a
51
+ different action on the same screen. If neither is possible, the slice has a dead end; record
52
+ it as an open question.
53
+ - Do not add a screen per error. One screen with its refusal specifications covers the states.
54
+
55
+ ## A complete example
56
+
57
+ A berth booking form that shows availability (input screen over a view), a booking list that
58
+ shows state (status screen), and the refusal pinned by a specification (error state).
59
+
60
+ ```screenplay
61
+ domain Harbourlight.Berths
62
+
63
+ concept BookingId : Uuid
64
+ concept BerthName : String
65
+ validate
66
+ not empty message "A berth needs a name"
67
+
68
+ policy IsAuthenticated
69
+ require authenticated
70
+
71
+ module Berths
72
+ description "Berth bookings for one marina"
73
+ authorize IsAuthenticated
74
+ feature Bookings
75
+ slice StateChange BookBerth
76
+ description "A skipper books a berth"
77
+ command BookBerth
78
+ bookingId BookingId identifier
79
+ berth BerthName
80
+ produces BerthBooked
81
+ for bookingId
82
+ berth = berth
83
+ event BerthBooked
84
+ berth BerthName
85
+ screen BookBerthScreen
86
+ title "Book a berth"
87
+ action BookBerth
88
+ navigate to OpenBookingsScreen
89
+ specification BookingABerth
90
+ given caller
91
+ authenticated
92
+ when BookBerth
93
+ bookingId = "3b0c7a14-5d2e-4f61-8a9b-0c1d2e3f4a01"
94
+ berth = "Pier 2, berth 14"
95
+ then BerthBooked
96
+ for "3b0c7a14-5d2e-4f61-8a9b-0c1d2e3f4a01"
97
+ berth = "Pier 2, berth 14"
98
+ specification BookingWithoutABerthNameIsRefused
99
+ given caller
100
+ authenticated
101
+ when BookBerth
102
+ bookingId = "3b0c7a14-5d2e-4f61-8a9b-0c1d2e3f4a02"
103
+ berth = ""
104
+ then error "A berth needs a name"
105
+
106
+ slice StateView OpenBookings
107
+ description "The harbour office lists the bookings that hold a berth"
108
+ readmodel OpenBooking
109
+ bookingId BookingId
110
+ berth BerthName
111
+ query ListOpenBookings => OpenBooking[]
112
+ projection OpenBookings => OpenBooking
113
+ from BerthBooked
114
+ bookingId = $eventSourceId
115
+ berth = berth
116
+ screen OpenBookingsScreen
117
+ title "Open bookings"
118
+ data OpenBooking[] via query ListOpenBookings
119
+ action BookBerth
120
+ ```
121
+
122
+ ## What a screen pattern is not
123
+
124
+ - Not a column or a lane: a screen is a declaration in a slice, not a position on a timeline.
125
+ One screen per step is not a rule; a screen hosts every action the person can reasonably take
126
+ there, and an action may be reachable from several screens.
127
+ - Not a mockup: a drawn page is never evidence for the model, and a Level 1 screen is a data and
128
+ action contract that a renderer or a person fills in (`cratis-screenplay-ui-composition`).
129
+ - Not mandatory to render: a screen that stays design-only is still a contract for lineage and
130
+ review.
@@ -16,7 +16,7 @@
16
16
  { "kind": "skill-contains", "value": "The tenant is the default and stays unstated" },
17
17
  { "kind": "skill-contains", "value": "belongs on a `from` parameter, never on a `filter`" },
18
18
  { "kind": "skill-contains", "value": "warnings, not errors" },
19
- { "kind": "skill-contains", "value": "the executable model does not bind observable queries" },
19
+ { "kind": "skill-contains", "value": "the executable model binds `observable` queries" },
20
20
  { "kind": "skill-contains", "value": "A compiling query is not evidence that access control works" },
21
21
  { "kind": "skill-contains", "value": "decision 0010 but **not in the language yet**" }
22
22
  ]
@@ -5,5 +5,5 @@ Third-party notices
5
5
 
6
6
  This skill adapts material from agentic-engineer by Martin Dilger and Nebulit GmbH
7
7
  (https://github.com/Nebulit-GmbH/agentic-engineer, commit 07b0f30648d663cb588d7e2c7aa031af9dfc21f2;
8
- https://nebulit.de), used with the agreement of Martin Dilger and Nebulit GmbH. That repository
9
- carries no licence file; the adapted material remains credited to Martin Dilger and Nebulit GmbH.
8
+ https://nebulit.de), used with the explicit consent of Martin Dilger and Nebulit GmbH. The adapted
9
+ material remains credited to Martin Dilger and Nebulit GmbH.