@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.
- package/package/corpus/agents/screenplay-modeler.md +1 -1
- package/package/corpus/agents/screenplay-renderer.md +1 -1
- package/package/corpus/agents/screenplay-reviewer.md +1 -1
- package/package/corpus/agents/slice-implementer.md +1 -1
- package/package/corpus/rules/profiles.md +1 -0
- package/package/corpus/skills/cratis-application-slice-conformance/LICENSE +2 -2
- package/package/corpus/skills/cratis-application-slice-conformance/SKILL.md +5 -0
- package/package/corpus/skills/cratis-application-slice-conformance/references/checklists.md +12 -0
- package/package/corpus/skills/cratis-application-slice-conformance/references/provenance.md +3 -4
- package/package/corpus/skills/cratis-application-slice-specifications/LICENSE +2 -2
- package/package/corpus/skills/cratis-application-slice-specifications/references/provenance.md +2 -3
- package/package/corpus/skills/cratis-arc-react-page/LICENSE +2 -2
- package/package/corpus/skills/cratis-arc-react-page/references/provenance.md +2 -3
- package/package/corpus/skills/cratis-chronicle-event-modeling/SKILL.md +12 -6
- package/package/corpus/skills/cratis-chronicle-reactor/LICENSE +2 -2
- package/package/corpus/skills/cratis-chronicle-reactor/SKILL.md +5 -2
- package/package/corpus/skills/cratis-chronicle-reactor/references/provenance.md +3 -3
- package/package/corpus/skills/cratis-chronicle-reactor/references/slice-delivery-checklist.md +93 -0
- package/package/corpus/skills/cratis-chronicle-read-model-specifications/LICENSE +2 -2
- package/package/corpus/skills/cratis-chronicle-read-model-specifications/SKILL.md +1 -1
- package/package/corpus/skills/cratis-chronicle-read-model-specifications/references/provenance.md +3 -3
- package/package/corpus/skills/cratis-chronicle-read-model-specifications/references/view-lifecycle-checks.md +79 -0
- package/package/corpus/skills/cratis-event-model-diagram/LICENSE +7 -0
- package/package/corpus/skills/cratis-event-model-diagram/SKILL.md +26 -2
- package/package/corpus/skills/cratis-event-model-diagram/references/provenance.md +19 -0
- package/package/corpus/skills/cratis-screenplay-automations-and-translations/LICENSE +2 -2
- package/package/corpus/skills/cratis-screenplay-automations-and-translations/SKILL.md +14 -9
- package/package/corpus/skills/cratis-screenplay-automations-and-translations/references/automation-patterns.md +5 -5
- package/package/corpus/skills/cratis-screenplay-automations-and-translations/references/effects-and-idempotency.md +1 -1
- package/package/corpus/skills/cratis-screenplay-automations-and-translations/references/provenance.md +2 -3
- package/package/corpus/skills/cratis-screenplay-automations-and-translations/references/public-events-and-direction.md +1 -2
- package/package/corpus/skills/cratis-screenplay-automations-and-translations/references/realization-and-gap-fill.md +9 -5
- package/package/corpus/skills/cratis-screenplay-automations-and-translations/references/todo-list-example.md +6 -6
- package/package/corpus/skills/cratis-screenplay-automations-and-translations/references/translate-example.md +1 -1
- package/package/corpus/skills/cratis-screenplay-captures-and-reactions/SKILL.md +14 -13
- package/package/corpus/skills/cratis-screenplay-command-surface/SKILL.md +12 -13
- package/package/corpus/skills/cratis-screenplay-command-surface/references/compliance.md +3 -1
- package/package/corpus/skills/cratis-screenplay-command-surface/references/generated-values-and-responses.md +2 -2
- package/package/corpus/skills/cratis-screenplay-command-surface/references/validate-rules.md +4 -2
- package/package/corpus/skills/cratis-screenplay-delivery-planning/LICENSE +9 -0
- package/package/corpus/skills/cratis-screenplay-delivery-planning/SKILL.md +118 -0
- package/package/corpus/skills/cratis-screenplay-delivery-planning/references/parallel-delivery.md +45 -0
- package/package/corpus/skills/cratis-screenplay-delivery-planning/references/provenance.md +29 -0
- package/package/corpus/skills/cratis-screenplay-delivery-planning/references/slice-counting.md +43 -0
- package/package/corpus/skills/cratis-screenplay-delivery-planning/references/velocity-and-capacity.md +48 -0
- package/package/corpus/skills/cratis-screenplay-delivery-planning/verification.json +16 -0
- package/package/corpus/skills/cratis-screenplay-discovery/LICENSE +2 -2
- package/package/corpus/skills/cratis-screenplay-discovery/SKILL.md +6 -5
- package/package/corpus/skills/cratis-screenplay-discovery/references/divergent-sweep.md +1 -0
- package/package/corpus/skills/cratis-screenplay-discovery/references/domain-analysis-template.md +92 -0
- package/package/corpus/skills/cratis-screenplay-discovery/references/personas-and-causes.md +2 -2
- package/package/corpus/skills/cratis-screenplay-discovery/references/provenance.md +4 -3
- package/package/corpus/skills/cratis-screenplay-discovery/verification.json +1 -1
- package/package/corpus/skills/cratis-screenplay-event-modeling/LICENSE +2 -2
- package/package/corpus/skills/cratis-screenplay-event-modeling/SKILL.md +28 -28
- package/package/corpus/skills/cratis-screenplay-event-modeling/references/nine-steps.md +7 -5
- package/package/corpus/skills/cratis-screenplay-event-modeling/references/parsed-not-runnable.md +12 -9
- package/package/corpus/skills/cratis-screenplay-event-modeling/references/provenance.md +2 -3
- package/package/corpus/skills/cratis-screenplay-legacy-extraction/LICENSE +2 -2
- package/package/corpus/skills/cratis-screenplay-legacy-extraction/SKILL.md +26 -13
- package/package/corpus/skills/cratis-screenplay-legacy-extraction/references/candidate-inventory.md +6 -1
- package/package/corpus/skills/cratis-screenplay-legacy-extraction/references/generate-notes.md +7 -0
- package/package/corpus/skills/cratis-screenplay-legacy-extraction/references/prologue-safety.md +22 -17
- package/package/corpus/skills/cratis-screenplay-legacy-extraction/references/provenance.md +2 -3
- package/package/corpus/skills/cratis-screenplay-legacy-extraction/references/rule-modeling.md +2 -2
- package/package/corpus/skills/cratis-screenplay-legacy-extraction/references/side-car-migration.md +1 -0
- package/package/corpus/skills/cratis-screenplay-legacy-extraction/verification.json +1 -1
- package/package/corpus/skills/cratis-screenplay-model-authoring/references/language-reference.md +2 -2
- package/package/corpus/skills/cratis-screenplay-model-authoring/references/mcp-loop.md +3 -3
- package/package/corpus/skills/cratis-screenplay-model-authoring/references/mcp-tools.md +3 -1
- package/package/corpus/skills/cratis-screenplay-model-review/LICENSE +2 -2
- package/package/corpus/skills/cratis-screenplay-model-review/SKILL.md +8 -8
- package/package/corpus/skills/cratis-screenplay-model-review/references/anti-patterns.md +2 -2
- package/package/corpus/skills/cratis-screenplay-model-review/references/checklist.md +4 -4
- package/package/corpus/skills/cratis-screenplay-model-review/references/model-inventory-report.md +75 -0
- package/package/corpus/skills/cratis-screenplay-model-review/references/provenance.md +3 -4
- package/package/corpus/skills/cratis-screenplay-model-review/references/public-keys-and-routes.md +1 -1
- package/package/corpus/skills/cratis-screenplay-model-review/references/worked-example.md +4 -3
- package/package/corpus/skills/cratis-screenplay-modeling-lifecycle/LICENSE +2 -2
- package/package/corpus/skills/cratis-screenplay-modeling-lifecycle/SKILL.md +7 -5
- package/package/corpus/skills/cratis-screenplay-modeling-lifecycle/references/core-rules-digest.md +131 -0
- package/package/corpus/skills/cratis-screenplay-modeling-lifecycle/references/phases.md +1 -1
- package/package/corpus/skills/cratis-screenplay-modeling-lifecycle/references/provenance.md +25 -4
- package/package/corpus/skills/cratis-screenplay-modeling-lifecycle/references/reasoning-notes.md +2 -2
- package/package/corpus/skills/cratis-screenplay-modeling-lifecycle/references/verdicts-and-modes.md +1 -1
- package/package/corpus/skills/cratis-screenplay-modeling-lifecycle/references/vocabulary-map.md +5 -4
- package/package/corpus/skills/cratis-screenplay-projections/SKILL.md +9 -5
- package/package/corpus/skills/cratis-screenplay-projections/references/pdl-grammar.md +4 -2
- package/package/corpus/skills/cratis-screenplay-read-surface/LICENSE +7 -0
- package/package/corpus/skills/cratis-screenplay-read-surface/SKILL.md +16 -8
- package/package/corpus/skills/cratis-screenplay-read-surface/references/provenance.md +21 -0
- package/package/corpus/skills/cratis-screenplay-read-surface/references/screen-patterns.md +130 -0
- package/package/corpus/skills/cratis-screenplay-read-surface/verification.json +1 -1
- package/package/corpus/skills/cratis-screenplay-render-and-gap-fill/LICENSE +2 -2
- package/package/corpus/skills/cratis-screenplay-render-and-gap-fill/SKILL.md +58 -46
- package/package/corpus/skills/cratis-screenplay-render-and-gap-fill/references/delivery-protocol.md +17 -2
- package/package/corpus/skills/cratis-screenplay-render-and-gap-fill/references/drift-and-ledger.md +19 -2
- package/package/corpus/skills/cratis-screenplay-render-and-gap-fill/references/gap-fill-handoff.md +22 -4
- package/package/corpus/skills/cratis-screenplay-render-and-gap-fill/references/provenance.md +2 -3
- package/package/corpus/skills/cratis-screenplay-render-and-gap-fill/references/renderability-gate.md +21 -16
- package/package/corpus/skills/cratis-screenplay-render-and-gap-fill/references/worked-example.md +34 -29
- package/package/corpus/skills/cratis-screenplay-scenario-coverage/LICENSE +2 -2
- package/package/corpus/skills/cratis-screenplay-scenario-coverage/SKILL.md +5 -4
- package/package/corpus/skills/cratis-screenplay-scenario-coverage/references/berth-reservations.md +1 -1
- package/package/corpus/skills/cratis-screenplay-scenario-coverage/references/invoicing-dues-design.md +5 -4
- package/package/corpus/skills/cratis-screenplay-scenario-coverage/references/invoicing-dues-example.md +32 -3
- package/package/corpus/skills/cratis-screenplay-scenario-coverage/references/provenance.md +3 -4
- package/package/corpus/skills/cratis-screenplay-scenario-coverage/references/scenario-catalogue.md +7 -6
- package/package/corpus/skills/cratis-screenplay-scenario-coverage/references/scenario-examples.md +3 -3
- package/package/corpus/skills/cratis-screenplay-scenario-coverage/references/scenario-workshop.md +15 -7
- package/package/corpus/skills/cratis-screenplay-scenario-coverage/references/spec-forms-by-mode.md +8 -7
- package/package/corpus/skills/cratis-screenplay-scenario-coverage/references/view-and-story-specs.md +6 -4
- package/package/corpus/skills/cratis-screenplay-slice-design/LICENSE +2 -2
- package/package/corpus/skills/cratis-screenplay-slice-design/SKILL.md +4 -3
- package/package/corpus/skills/cratis-screenplay-slice-design/references/command-inventory.md +2 -2
- package/package/corpus/skills/cratis-screenplay-slice-design/references/derived-condition-events.md +68 -0
- package/package/corpus/skills/cratis-screenplay-slice-design/references/field-lineage.md +1 -1
- package/package/corpus/skills/cratis-screenplay-slice-design/references/provenance.md +5 -5
- package/package/corpus/skills/cratis-screenplay-slice-design/references/read-model-design.md +17 -0
- package/package/corpus/skills/cratis-screenplay-slice-design/references/rule-layers.md +6 -6
- package/package/corpus/skills/cratis-screenplay-slice-design/references/worked-example.md +3 -3
- package/package/corpus/skills/cratis-screenplay-specifications/SKILL.md +6 -4
- package/package/corpus/skills/cratis-screenplay-specifications/references/examples-and-routes.md +2 -1
- package/package/corpus/skills/cratis-screenplay-specifications/references/generated-fixtures.md +3 -2
- package/package/corpus/skills/cratis-screenplay-specifications/references/persona-callers-and-cases.md +3 -0
- package/package/corpus/skills/cratis-screenplay-specifications/references/reactions-and-cascades.md +3 -2
- package/package/corpus/skills/cratis-screenplay-streams-and-consistency/LICENSE +2 -2
- package/package/corpus/skills/cratis-screenplay-streams-and-consistency/SKILL.md +9 -9
- package/package/corpus/skills/cratis-screenplay-streams-and-consistency/references/boundaries.md +31 -3
- package/package/corpus/skills/cratis-screenplay-streams-and-consistency/references/chronicle-boundaries.md +6 -6
- package/package/corpus/skills/cratis-screenplay-streams-and-consistency/references/consistency-and-concurrency.md +12 -11
- package/package/corpus/skills/cratis-screenplay-streams-and-consistency/references/evolution.md +1 -1
- package/package/corpus/skills/cratis-screenplay-streams-and-consistency/references/provenance.md +4 -4
- package/package/corpus/skills/cratis-screenplay-streams-and-consistency/references/streams-example.md +1 -1
- package/package/corpus/skills/cratis-screenplay-toolchain/LICENSE +2 -2
- package/package/corpus/skills/cratis-screenplay-toolchain/SKILL.md +14 -12
- package/package/corpus/skills/cratis-screenplay-toolchain/references/cheat-sheet-example.md +3 -3
- package/package/corpus/skills/cratis-screenplay-toolchain/references/cheat-sheet.md +1 -1
- package/package/corpus/skills/cratis-screenplay-toolchain/references/doc-contradictions.md +3 -1
- package/package/corpus/skills/cratis-screenplay-toolchain/references/executable-subset.md +24 -16
- package/package/corpus/skills/cratis-screenplay-toolchain/references/provenance.md +2 -3
- package/package/corpus/skills/cratis-screenplay-toolchain/references/renderable-subset.md +41 -12
- package/package/corpus/skills/cratis-screenplay-toolchain/references/traps.md +5 -5
- package/package/corpus/skills/cratis-screenplay-toolchain/references/verdicts.md +14 -9
- package/package/corpus/skills/cratis-screenplay-toolchain/references/versions.md +9 -3
- package/package/corpus/skills/cratis-screenplay-toolchain/verification.json +4 -1
- package/package/corpus/skills/cratis-screenplay-ui-composition/LICENSE +2 -2
- package/package/corpus/skills/cratis-screenplay-ui-composition/SKILL.md +10 -10
- package/package/corpus/skills/cratis-screenplay-ui-composition/references/flow-review.md +1 -1
- package/package/corpus/skills/cratis-screenplay-ui-composition/references/provenance.md +2 -3
- package/package/corpus/skills/cratis-screenplay-ui-composition/references/screen-composition-contract.md +39 -14
- package/package/corpus/skills/cratis-screenplay-ui-composition/references/worked-flow.md +17 -9
- package/package/corpus/skills/cratis-stage-rendering-and-sandbox/SKILL.md +83 -74
- package/package/corpus/skills/cratis-stage-rendering-and-sandbox/references/admission.md +62 -12
- package/package/corpus/skills/cratis-stage-rendering-and-sandbox/references/render-example.md +3 -1
- package/package/corpus/skills/cratis-stage-rendering-and-sandbox/references/rendered-application.md +30 -15
- package/package/corpus/skills/cratis-stage-rendering-and-sandbox/references/sandbox-and-specrunner.md +21 -1
- package/package/corpus/skills/cratis-stage-rendering-and-sandbox/verification.json +8 -3
- package/package/profile-catalog.json +1 -0
- package/package.json +1 -1
package/package/corpus/skills/cratis-screenplay-modeling-lifecycle/references/core-rules-digest.md
ADDED
|
@@ -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
|
|
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
|
|
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)
|
|
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
|
|
package/package/corpus/skills/cratis-screenplay-modeling-lifecycle/references/reasoning-notes.md
CHANGED
|
@@ -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
|
|
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.
|
package/package/corpus/skills/cratis-screenplay-modeling-lifecycle/references/verdicts-and-modes.md
CHANGED
|
@@ -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;
|
|
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 |
|
package/package/corpus/skills/cratis-screenplay-modeling-lifecycle/references/vocabulary-map.md
CHANGED
|
@@ -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
|
|
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
|
|
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
|
|
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
|
-
|
|
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
|
-
`
|
|
92
|
-
|
|
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.
|
|
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
|
|
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.
|
|
177
|
-
`=> <ReadModel> optional` with one caller-supplied `by` argument
|
|
178
|
-
|
|
179
|
-
|
|
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
|
|
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
|
-
|
|
196
|
-
|
|
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
|
|
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
|
|
9
|
-
|
|
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.
|