@cratis/pi 7.32.0 → 7.34.0
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 +16 -11
- package/package/corpus/skills/cratis-screenplay-automations-and-translations/references/audit-format.md +1 -1
- package/package/corpus/skills/cratis-screenplay-automations-and-translations/references/automation-patterns.md +7 -7
- 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 +5 -6
- package/package/corpus/skills/cratis-screenplay-automations-and-translations/references/public-events-and-direction.md +2 -3
- 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 +16 -15
- package/package/corpus/skills/cratis-screenplay-captures-and-reactions/references/invocation-identity.md +2 -2
- package/package/corpus/skills/cratis-screenplay-command-surface/SKILL.md +20 -19
- package/package/corpus/skills/cratis-screenplay-command-surface/references/compliance.md +3 -1
- package/package/corpus/skills/cratis-screenplay-command-surface/references/context.md +1 -1
- package/package/corpus/skills/cratis-screenplay-command-surface/references/enum-numbers.md +93 -0
- package/package/corpus/skills/cratis-screenplay-command-surface/references/generated-values-and-responses.md +5 -6
- 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 +30 -29
- 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 +13 -10
- 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/SKILL.md +25 -25
- package/package/corpus/skills/cratis-screenplay-model-authoring/references/language-reference.md +8 -2
- package/package/corpus/skills/cratis-screenplay-model-authoring/references/mcp-loop.md +8 -3
- package/package/corpus/skills/cratis-screenplay-model-authoring/references/mcp-tools.md +38 -8
- package/package/corpus/skills/cratis-screenplay-model-authoring/references/property-links.md +126 -0
- package/package/corpus/skills/cratis-screenplay-model-authoring/references/screen-authoring-workflow.md +3 -4
- package/package/corpus/skills/cratis-screenplay-model-authoring/verification.json +1 -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 +60 -47
- 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 +24 -6
- 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 +11 -10
- 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 +7 -5
- package/package/corpus/skills/cratis-screenplay-specifications/references/examples-and-routes.md +4 -3
- 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 +14 -11
- 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 +18 -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/stream-patterns.md +1 -1
- 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 +29 -18
- 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 +7 -4
- package/package/corpus/skills/cratis-screenplay-toolchain/references/diagnostics.md +21 -2
- package/package/corpus/skills/cratis-screenplay-toolchain/references/doc-contradictions.md +5 -3
- package/package/corpus/skills/cratis-screenplay-toolchain/references/executable-subset.md +32 -18
- package/package/corpus/skills/cratis-screenplay-toolchain/references/production-routes-and-filters.md +1 -1
- package/package/corpus/skills/cratis-screenplay-toolchain/references/provenance.md +3 -4
- package/package/corpus/skills/cratis-screenplay-toolchain/references/renderable-subset.md +46 -16
- package/package/corpus/skills/cratis-screenplay-toolchain/references/screenplay-contract-exceptions.json +1 -1
- package/package/corpus/skills/cratis-screenplay-toolchain/references/screenplay-contract.json +1092 -17
- package/package/corpus/skills/cratis-screenplay-toolchain/references/screenplay-contract.version +1 -1
- package/package/corpus/skills/cratis-screenplay-toolchain/references/sources-and-streams.md +1 -1
- package/package/corpus/skills/cratis-screenplay-toolchain/references/traps.md +8 -8
- package/package/corpus/skills/cratis-screenplay-toolchain/references/verdicts.md +18 -13
- package/package/corpus/skills/cratis-screenplay-toolchain/references/versions.md +41 -20
- package/package/corpus/skills/cratis-screenplay-toolchain/verification.json +7 -2
- 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 +41 -16
- 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 +85 -77
- package/package/corpus/skills/cratis-stage-rendering-and-sandbox/references/admission.md +65 -16
- package/package/corpus/skills/cratis-stage-rendering-and-sandbox/references/case-tables-and-whole-numbers.md +2 -2
- 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 +9 -4
- package/package/profile-catalog.json +1 -0
- package/package.json +1 -1
package/package/corpus/skills/cratis-screenplay-scenario-coverage/references/scenario-workshop.md
CHANGED
|
@@ -9,7 +9,7 @@
|
|
|
9
9
|
- Multi-role check (before leaving the room)
|
|
10
10
|
- Common mistakes
|
|
11
11
|
- Tips for rapid capture
|
|
12
|
-
-
|
|
12
|
+
- Optional pacing
|
|
13
13
|
|
|
14
14
|
Use this when scenarios are written together with business people, developers and testers
|
|
15
15
|
instead of by one author. The facilitation structure is adapted from the Workshop Facilitation
|
|
@@ -38,7 +38,7 @@ specification with that name exists in the model.
|
|
|
38
38
|
- Outcome lists from discovery and slice design (Cannot lines, "only if" rules, refusals,
|
|
39
39
|
competition candidates, endings) as seeds.
|
|
40
40
|
- One card per command or view, with the twelve matrix columns as prompts. A timer per card is
|
|
41
|
-
optional; a card is finished when every column holds a value (see
|
|
41
|
+
optional; a card is finished when every column holds a value (see Optional pacing), not when
|
|
42
42
|
the time is up.
|
|
43
43
|
|
|
44
44
|
## During: one command at a time
|
|
@@ -106,8 +106,16 @@ four approvals. Record who actually answered each question.
|
|
|
106
106
|
- End with the open questions listed, owner and date, and the matrix saved as the workshop
|
|
107
107
|
record.
|
|
108
108
|
|
|
109
|
-
##
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
109
|
+
## Optional pacing
|
|
110
|
+
A workshop that has to finish in a fixed time can use the source guide's pacing as a starting
|
|
111
|
+
point, subordinate to the matrix:
|
|
112
|
+
- About 15 to 20 minutes per command for the first pass, with a timer per card. A command with
|
|
113
|
+
few rules is quicker; one with several rules, a gate and constraints takes longer.
|
|
114
|
+
- Three to five scenarios per command is a typical range for a simple command, not a quota.
|
|
115
|
+
- Keep the rhythm of the "During" steps: capture, read back, move on. Parallel pairs take
|
|
116
|
+
different commands, then read back together.
|
|
117
|
+
|
|
118
|
+
The matrix, not the clock, decides when a card is finished. A command with three rules, a gate,
|
|
119
|
+
two constraints and a conditional production needs the scenarios its declarations create, and a
|
|
120
|
+
quota would drop cases. Time-box the discussion, never the matrix; unfinished cells stay `open`
|
|
121
|
+
and their owner and date go in the open-question list.
|
package/package/corpus/skills/cratis-screenplay-scenario-coverage/references/spec-forms-by-mode.md
CHANGED
|
@@ -4,8 +4,8 @@ The subsets themselves (what binds, what renders) are owned by `cratis-screenpla
|
|
|
4
4
|
(its executable and renderable subset references); version facts by its `references/versions.md`. This file
|
|
5
5
|
says what that means for writing specs. A form outside the chosen mode is never deleted from a
|
|
6
6
|
design model: keep it and record the gap. The detailed Stage 4.24.x rows below
|
|
7
|
-
retain historical admission evidence; current pins are
|
|
8
|
-
|
|
7
|
+
retain historical admission evidence; current pins are in
|
|
8
|
+
`cratis-screenplay-toolchain/references/versions.md`. Run actual target admission instead of assuming old restrictions carry over.
|
|
9
9
|
Typed example/override forms: `cratis-screenplay-specifications`
|
|
10
10
|
`references/examples-and-routes.md`.
|
|
11
11
|
|
|
@@ -16,14 +16,15 @@ Typed example/override forms: `cratis-screenplay-specifications`
|
|
|
16
16
|
| `given readmodel` | yes | yes (complete instance with key) | only as the query-only lookup below |
|
|
17
17
|
| `when append <Event>` | yes | yes | no |
|
|
18
18
|
| `then readmodel` / `then query` (keyed `ById`, `arguments`, `result`) | yes | yes | yes |
|
|
19
|
-
| `then query` on list
|
|
19
|
+
| `then query` on an unfiltered list or a list narrowed by one `by` key (observable too) | yes | yes since 4.105.0: no `arguments` for an unkeyed list, one `result` per row stating the read-model identifier, no `result` = empty list | observable lists render, a non-observable list is `STAGE-ESM-010` (Stage 4.73.1) |
|
|
20
|
+
| `then query` on `filter`, `scoped to`, `performer` or `by ... from` queries | yes | no: PLAY0268 at binding | no |
|
|
20
21
|
| `then no readmodel <RM> for "<key>"` | yes | yes | no |
|
|
21
22
|
| `when query` -> `then result` / `then no result` | yes | yes | same as `then query`: only the query-only cases below |
|
|
22
|
-
| `given clock` / `when clock`, `when trigger`, `given`/`when capture` | yes |
|
|
23
|
+
| `given clock` / `when clock`, `when trigger`, `given`/`when capture` | yes | yes (standalone and any current cratis; history: a cratis before 3.28.2 bundle no, see versions.md) | no |
|
|
23
24
|
| Command spec listing reaction cascade events | yes (v6 semantics) | false PLAY0285 on a cratis before 3.28.2 bundle only; see SKILL.md "Version skew" | no (no reactions) |
|
|
24
|
-
| `generated <name> = <value>` under `when`, `then returns` (ESM v7) | yes | yes on standalone Screenplay 4.68.0 or later
|
|
25
|
+
| `generated <name> = <value>` under `when`, `then returns` (ESM v7) | yes | yes on standalone Screenplay 4.68.0 or later and the current cratis bundle (history: PLAY0268 on the 4.66.0 bundled in cratis 3.28.x) | no: Stage 4.73.1 admits v7 but refuses generated values (STAGE-ESM-028) and responses / `then returns` (STAGE-ESM-029); the spec pins the contract of a hand-written command |
|
|
25
26
|
| `then events in any order` | yes | yes | yes |
|
|
26
|
-
| Event `stream` / `no stream`, typed `for` and stream ids | yes | ESM v8 at 4.125.0 | CLI
|
|
27
|
+
| Event `stream` / `no stream`, typed `for` and stream ids | yes | ESM v8 at 4.125.0 | The pinned CLI reaches Stage route checks (toolchain `references/versions.md`); routed read-model/query replay can still refuse STAGE-ESM-030 |
|
|
27
28
|
| Typed examples and overrides | yes | expanded and type-checked before binding; required fields remain required | depends on expanded contract, not fixture reuse |
|
|
28
29
|
| `given operation ... fails`, `then operation`, `then compensated` | yes | unadmitted PLAY0268 | gap-fill |
|
|
29
30
|
| Refusal branches, `when redelivered`, `then no events` | yes | unadmitted PLAY0268 | gap-fill |
|
|
@@ -34,8 +35,8 @@ Typed example/override forms: `cratis-screenplay-specifications`
|
|
|
34
35
|
|
|
35
36
|
## Design mode
|
|
36
37
|
Write the full intended behaviour, including scenarios the executable subset cannot run
|
|
37
|
-
(
|
|
38
|
-
bundle is available). Mark each such spec in the coverage matrix as
|
|
38
|
+
(filtered, scoped and performer-backed views; clock, trigger and capture scenarios when only a
|
|
39
|
+
cratis before 3.28.2 bundle is available). Mark each such spec in the coverage matrix as
|
|
39
40
|
`gap: <reason>` for the narrower modes so the verification and render phases know what will not execute.
|
|
40
41
|
|
|
41
42
|
## Executable mode
|
|
@@ -53,7 +54,7 @@ bundle is available). Mark each such spec in the coverage matrix as
|
|
|
53
54
|
- Specs use given events, a command `when`, and then events / readmodel / query / error /
|
|
54
55
|
denied. No `when append` or `then no readmodel`. `given readmodel` appears only in the
|
|
55
56
|
query-only lookup below.
|
|
56
|
-
- Query-only specs (no command `when`) are admitted by Stage v4.24.0 in exactly two cases, and
|
|
57
|
+
- Query-only specs (no command `when`) are admitted by Stage v4.24.0 in exactly two cases (a v4.24.0 reading, not re-probed at 4.73.1), and
|
|
57
58
|
`when query` and `then query` are the same case: Screenplay normalises `when query` to the
|
|
58
59
|
`then query` model, so the spelling never decides admission.
|
|
59
60
|
- Denial: `given caller` (no role claims), no given events or read models, one query under a
|
|
@@ -68,7 +69,7 @@ bundle is available). Mark each such spec in the coverage matrix as
|
|
|
68
69
|
executable, not renderable).
|
|
69
70
|
- Prove projections with `given` events + `when <Command>` + `then query` (or `then readmodel`).
|
|
70
71
|
Removal has no admitted form: record it as a gap for renderable scope.
|
|
71
|
-
- A `then error` must name a constraint or rule that is actually rendered. Stage v4.24.0 admits
|
|
72
|
+
- A `then error` must name a constraint or rule that is actually rendered. Stage v4.24.0 (historical reading) admits
|
|
72
73
|
a value constraint only when each target is a single, required, text-typed property (not
|
|
73
74
|
composite, optional, collection or nontext), and rejects a command that produces more than one
|
|
74
75
|
event affected by the same value constraint (claims or releases) in one batch. The number of
|
package/package/corpus/skills/cratis-screenplay-scenario-coverage/references/view-and-story-specs.md
CHANGED
|
@@ -59,8 +59,9 @@ candidate for a family. Walk one row through three states (`OpenInvoices`: empty
|
|
|
59
59
|
`InvoiceIssued`, empty again after `PaymentReceived`) as three independent specs, each with its
|
|
60
60
|
own full givens. The excerpt is copied from `invoicing-dues-example.md`; the last spec asserts
|
|
61
61
|
both that the stored row is gone and that the keyed query returns nothing. The whole-list query
|
|
62
|
-
(no key) is
|
|
63
|
-
|
|
62
|
+
(no key) is executable too (Screenplay 4.105.0 or later): `invoicing-dues-example.md` adds
|
|
63
|
+
`ListOpenInvoices => OpenInvoice[]` with one spec that expects one `result` row and one that
|
|
64
|
+
expects the empty list after `PaymentReceived`. Only `filter`, `scoped to` and `performer` queries stay design-mode.
|
|
64
65
|
The source document also asserts the other terminal outcomes (`InvoiceVoided`, `InvoiceSettled`) the same way; they are not copied here.
|
|
65
66
|
```screenplay excerpt parent=references/invoicing-dues-example.md#1
|
|
66
67
|
specification OpenInvoicesLifecycle1Empty
|
|
@@ -119,8 +120,9 @@ Keep three claims apart:
|
|
|
119
120
|
- a query returns no rows: `then query` without `result`, or `when query` + `then no result`;
|
|
120
121
|
- a list-valued property is empty: assert that property as `[]`.
|
|
121
122
|
List-query results use repeated `result` blocks; count and order are exact. A keyed lookup does
|
|
122
|
-
not prove an entire list is empty
|
|
123
|
-
|
|
123
|
+
not prove an entire list is empty: assert the unkeyed list query itself (an unkeyed query takes no
|
|
124
|
+
`arguments`; each `result` row states the read-model identifier, else PLAY0351). A snapshot list does not render
|
|
125
|
+
(`STAGE-ESM-010`, Stage 4.73.1); an `observable` list does. Record that rendering limit.
|
|
124
126
|
|
|
125
127
|
## Ordering, lag and rebuild
|
|
126
128
|
- **Out of order across sources**: if a joined or cross-context fact can arrive first, add a
|
|
@@ -31,5 +31,5 @@ SOFTWARE.
|
|
|
31
31
|
|
|
32
32
|
This skill also adapts material from agentic-engineer by Martin Dilger and Nebulit GmbH
|
|
33
33
|
(https://github.com/Nebulit-GmbH/agentic-engineer, commit 07b0f30648d663cb588d7e2c7aa031af9dfc21f2;
|
|
34
|
-
https://nebulit.de), used with the
|
|
35
|
-
|
|
34
|
+
https://nebulit.de), used with the explicit consent of Martin Dilger and Nebulit GmbH. The adapted
|
|
35
|
+
material remains credited to Martin Dilger and Nebulit GmbH.
|
|
@@ -81,9 +81,9 @@ report and slice `documentation`, and continue.
|
|
|
81
81
|
over stored state is written as `reads <View>` + `require ... message "..."` and marked
|
|
82
82
|
**NOT enforced in the model today** in the slice `description`, with its target named (Arc
|
|
83
83
|
`[ProtectedDecision]` + `DecisionRead<T>` on Arc 22.39.0+ (available to gap-fill
|
|
84
|
-
code with Stage 4.
|
|
85
|
-
into the command as input or hide a rule in `handler` / hint prose; descriptions
|
|
86
|
-
|
|
84
|
+
code with Stage 4.73.1's Arc 22.68.0/Chronicle 19.45.0); Chronicle DCB; or a constraint). Never copy state
|
|
85
|
+
into the command as input or hide a rule in `handler` / hint prose; descriptions reach code
|
|
86
|
+
only as XML comments (Stage#178). Fill the **refusal inventory**: success, each distinct refusal with
|
|
87
87
|
layer and message, and the denied persona.
|
|
88
88
|
4. **Name and shape the event.** Past tense, the specific change that became true
|
|
89
89
|
(`LockerRelocated`, `VolumeCorrected`); never `XUpdated`/`Changed`/`Edited`/`Saved`/
|
|
@@ -265,6 +265,7 @@ Examples compile with `screenplay` 4.68.0 `--warnaserror` and `cratis screenplay
|
|
|
265
265
|
- `references/command-inventory.md` - command card, interview questions, refusal inventory.
|
|
266
266
|
- `references/review-questions.md` - design review questions.
|
|
267
267
|
- `references/rule-layers.md` - rule placement, executable authorization, PII.
|
|
268
|
+
- `references/derived-condition-events.md` - read when a computed condition might deserve its own event: the test, who produces it, which causes to fold.
|
|
268
269
|
- `references/field-lineage.md` - origins per element, matrix, reason lines, chain edits.
|
|
269
270
|
- `references/read-model-design.md` - components, fan-in, list vs keyed, singletons, scope.
|
|
270
271
|
- `references/slicing.md` - slice naming, dependencies, state table, generic edits, coverage,
|
package/package/corpus/skills/cratis-screenplay-slice-design/references/command-inventory.md
CHANGED
|
@@ -76,7 +76,7 @@ Rules for filling it:
|
|
|
76
76
|
as a gap. Persona description text is intent only.
|
|
77
77
|
- A refusal that depends on stored state is a row marked **NOT enforced in the model today**
|
|
78
78
|
with its target (Arc `[ProtectedDecision]` + `DecisionRead<T>` where Arc 22.39.0 or later is
|
|
79
|
-
available, including Stage 4.
|
|
79
|
+
available, including Stage 4.73.1's rendered package set for gap-fill, not emitted
|
|
80
80
|
protection; Chronicle DCB, or a
|
|
81
81
|
constraint). It still gets a spec row, because the intended behaviour is the contract.
|
|
82
82
|
- A decided refusal never goes to open questions: it goes here, then to scenarios.
|
|
@@ -102,7 +102,7 @@ Rules for filling it:
|
|
|
102
102
|
| AssignLocker | caller is not an attendant | `authorize IsAttendant` | denied: Customer | RefusingACustomerAssigningALocker |
|
|
103
103
|
| AssignLocker | locker already has a request | constraint `OneRequestPerLocker` | "The locker is already assigned" | AppendingASecondAssignmentOfALocker (`when append`: the command's own `require` would reject first) |
|
|
104
104
|
| AssignLocker | request already has a locker | constraint `OneLockerPerRequest` | "The request already has a locker" | gap |
|
|
105
|
-
| AssignLocker | locker is not free | `reads` + `require`, NOT enforced today | "The locker is not free"; target: `[ProtectedDecision]` (Arc 22.39.0+; available to Stage 4.
|
|
105
|
+
| AssignLocker | locker is not free | `reads` + `require`, NOT enforced today | "The locker is not free"; target: `[ProtectedDecision]` (Arc 22.39.0+; available to Stage 4.73.1 gap-fill, not emitted protection) or DCB on the locker stream | RejectingASecondAssignmentOfALocker (pins the message; blocked until the target exists) |
|
|
106
106
|
| AssignLocker | request is not waiting | `reads` + `require`, NOT enforced today | "The request is not waiting for a locker" | gap (same) |
|
|
107
107
|
| LockerById, ListLockers | caller is anonymous | module `authorize IsAuthenticated` | denied: no caller | RefusingAnAnonymousLockerLookup, RefusingAnAnonymousLockerList |
|
|
108
108
|
| RequestById | caller is anonymous | module `authorize IsAuthenticated` | denied: no caller | RefusingAnAnonymousRequestLookup |
|
package/package/corpus/skills/cratis-screenplay-slice-design/references/derived-condition-events.md
ADDED
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
# Derived-condition events
|
|
2
|
+
|
|
3
|
+
Read this when a view computes a condition that something else in the process might act on
|
|
4
|
+
("is this berth free right now", "has this application reached its next stage"), or when a read
|
|
5
|
+
model draws on many events and you ask whether one named fact is hiding behind them. It is a
|
|
6
|
+
business-modeling question, separate from the fan-in signal in `read-model-design.md`. Adapted
|
|
7
|
+
from Martin Dilger and Nebulit GmbH's orchestrating skill (see `provenance.md`), translated to
|
|
8
|
+
`reaction` and `produces`.
|
|
9
|
+
|
|
10
|
+
## The question
|
|
11
|
+
|
|
12
|
+
**Is this fact worth a new event?**
|
|
13
|
+
|
|
14
|
+
A derived condition earns its own event when both hold:
|
|
15
|
+
1. A domain expert would recognize and name it in its own right ("the berth was released"), not
|
|
16
|
+
just as a field someone computes.
|
|
17
|
+
2. A later step needs it: another automation would react to it, another module would subscribe,
|
|
18
|
+
or a downstream process must start from it.
|
|
19
|
+
|
|
20
|
+
If both hold, record it as its own event and let the projection and the downstream steps consume
|
|
21
|
+
that event, instead of recomputing the condition from several raw events everywhere.
|
|
22
|
+
|
|
23
|
+
If the condition is only displayed and nothing would ever act on it, it stays a read-model field
|
|
24
|
+
derived from the raw events, however wide the resulting fan-in looks. No new event is needed.
|
|
25
|
+
|
|
26
|
+
## It is not a fan-in fix
|
|
27
|
+
A read model that ends up fed by many events is at most a prompt to ask the question; it is never
|
|
28
|
+
the reason to answer it either way. The question is worth asking whatever the event count. Wide
|
|
29
|
+
fan-in on one field is handled by the checks in `read-model-design.md` ("Fan-in per field").
|
|
30
|
+
|
|
31
|
+
## Who produces the event
|
|
32
|
+
The derived fact is established by something that notices the condition, so it is produced by an
|
|
33
|
+
Automation slice: a `reaction` that listens for the raw events that can cause the outcome and
|
|
34
|
+
`produces` the new event (or `invokes` a command that does). Decide the shape by the usual
|
|
35
|
+
automation test (`cratis-screenplay-automations-and-translations`):
|
|
36
|
+
- An immediate, internal, always-possible reaction needs no pending-work view when its reason is
|
|
37
|
+
recorded.
|
|
38
|
+
- Work that can wait, retry, fail or need people gets a pending-work view and a terminal fact, as
|
|
39
|
+
for any automation.
|
|
40
|
+
- A reaction that both `reads` and `produces` directly fails binding (`PLAY0268`, decision 0006).
|
|
41
|
+
When deriving the condition needs stored state, the reaction `invokes` a command that holds the
|
|
42
|
+
`reads` and the decision, and that command produces the event. A reaction that `produces`
|
|
43
|
+
directly may decide only from the triggering event's own fields.
|
|
44
|
+
|
|
45
|
+
## Fold only redundant causes
|
|
46
|
+
The causes of a derived condition usually fall into two groups:
|
|
47
|
+
- **Redundant for the outcome.** Several events that mean the same thing to the business
|
|
48
|
+
(`BerthReservationReleased`, `BoatDeparted`, `BerthReturnedFromRepair` all mean "the berth is
|
|
49
|
+
free again"). These are safe to consolidate: one `BerthMarkedFree` collapses N reasons into one
|
|
50
|
+
reusable signal without losing information.
|
|
51
|
+
- **Distinct meanings the business still tells apart.** `BerthReserved`, `BoatArrived`,
|
|
52
|
+
`BerthSentForRepair`, `BerthWithdrawn` each say why the berth is not free. Do not collapse them
|
|
53
|
+
into a generic `BerthMarkedUnavailable`: that erases the why, and a downstream consumer may need
|
|
54
|
+
it. Leave them as separate events; the fan-in that remains is not a defect, it means the events
|
|
55
|
+
are individually meaningful.
|
|
56
|
+
|
|
57
|
+
Collapsing the second group is the modeling mistake, not the wide fan-in. Never rename or merge
|
|
58
|
+
persisted events to tidy a view (`cratis-screenplay-streams-and-consistency` `references/evolution.md`).
|
|
59
|
+
|
|
60
|
+
## Do not record clock-relative state
|
|
61
|
+
"Overdue", "expired" and "due in 3 days" change with the clock, not with a fact. Store the
|
|
62
|
+
deadline and compare at the query or screen edge. Record an event only when passing the deadline
|
|
63
|
+
is itself a business fact (a fee charged, a reminder sent), produced by a clock-triggered
|
|
64
|
+
reaction. See `read-model-design.md`, "No clock-relative state".
|
|
65
|
+
|
|
66
|
+
## Record the decision
|
|
67
|
+
Where the reason matters later, put it in the owning slice's `documentation`: which derived
|
|
68
|
+
condition, why it is (or is not) a fact worth an event, and which causes were folded and why.
|
|
@@ -21,7 +21,7 @@ event field goes nowhere, ask why it is recorded (audit and history are valid an
|
|
|
21
21
|
| the user types or picks it | screen `action`, form or dialog input | default for business decisions |
|
|
22
22
|
| shown before the user acts | form `populate via query` from a read model | the read model must exist and be traced |
|
|
23
23
|
| the instance being acted on | the `identifier` property, carried from the screen row or route | |
|
|
24
|
-
| allocated by the runtime | `Type generated` on a required `Uuid`-backed concept (ESM v7: binds and runs on standalone Screenplay 4.68.0, `PLAY0268` on the 4.66.0 bundled in cratis 3.28.x
|
|
24
|
+
| allocated by the runtime | `Type generated` on a required `Uuid`-backed concept (ESM v7: binds and runs on standalone Screenplay 4.68.0 and later, including the 4.137.0 bundled in CLI 3.53.1 (`PLAY0268` on the 4.66.0 bundled in cratis 3.28.x); Stage 4.73.1 refuses it with STAGE-ESM-028; no concept rules) | never a request input or form field; no policy, rule or requirement may read it (`PLAY0273`); return it with `returns`; where a tool cannot bind it, executable scope needs explicit allocation |
|
|
25
25
|
| an outside party | capture field `$.x` or a reaction trigger value | `cratis-screenplay-automations-and-translations` |
|
|
26
26
|
| the caller | not an input: `$context.identity.*` in `produces`; who may act in `authorize`; "acting on own X" is a claim policy matched to the identifier or a command property | never trust a caller-supplied "who am I" |
|
|
27
27
|
|
|
@@ -1,8 +1,7 @@
|
|
|
1
1
|
# Provenance
|
|
2
2
|
|
|
3
3
|
Sources are pinned. TrogonStack/agentskills is MIT, Copyright (c) 2025 Straw Hat, LLC (full
|
|
4
|
-
notice in this skill's `LICENSE`). agentic-engineer by Martin Dilger and Nebulit GmbH
|
|
5
|
-
the agreement of Martin Dilger and Nebulit GmbH (see *Adapted closely* below).
|
|
4
|
+
notice in this skill's `LICENSE`). agentic-engineer by Martin Dilger and Nebulit GmbH is used with their explicit consent (see *Adapted closely* below).
|
|
6
5
|
Event Modeling practice (Adam Dymitruk, Martin Dilger) is cited as practice; no text taken.
|
|
7
6
|
|
|
8
7
|
| Item | Source | Licence | Treatment | Where in this skill |
|
|
@@ -15,11 +14,10 @@ Event Modeling practice (Adam Dymitruk, Martin Dilger) is cited as practice; no
|
|
|
15
14
|
| Slice dependency record (events consumed, producing slice) | TrogonStack/agentskills@7b249d3:.../eventmodeling-slicing-event-models/SKILL.md | MIT | ADAPT as a table | references/slicing.md |
|
|
16
15
|
| Generic-edit ban, rule coverage, state-transition table, rule layers, refusal inventory, worked example | Cratis/AI corpus (original) | MIT | original | references/*.md |
|
|
17
16
|
|
|
18
|
-
## Adapted closely (Martin Dilger and Nebulit GmbH
|
|
17
|
+
## Adapted closely (Martin Dilger and Nebulit GmbH)
|
|
19
18
|
|
|
20
19
|
Source: https://github.com/Nebulit-GmbH/agentic-engineer at commit `07b0f30648d663cb588d7e2c7aa031af9dfc21f2`,
|
|
21
|
-
by Martin Dilger and Nebulit GmbH (https://nebulit.de)
|
|
22
|
-
is adapted with the agreement of Martin Dilger and Nebulit GmbH.
|
|
20
|
+
by Martin Dilger and Nebulit GmbH (https://nebulit.de), used with the explicit consent of Martin Dilger and Nebulit GmbH.
|
|
23
21
|
|
|
24
22
|
| Source file | Used in | How |
|
|
25
23
|
|---|---|---|
|
|
@@ -39,3 +37,5 @@ is adapted with the agreement of Martin Dilger and Nebulit GmbH.
|
|
|
39
37
|
| `eventmodeling-designing-event-models/SKILL.md`: events as past-tense business facts, causality, state transitions | `SKILL.md` step 4; `references/slicing.md` state-transition table | idea; our own wording kept (our table is stricter) |
|
|
40
38
|
| `storyboard-screen/SKILL.md`, `html-screen/SKILL.md`, `place-element/SKILL.md` | none | not adopted: board and HTML rendering mechanics; screen field mapping `derived:` already in `references/field-lineage.md` |
|
|
41
39
|
| `.build-kit/.slices/restaurant/*/slice.json` | none in this skill | patterns only; passed to scenario coverage (spec example values that vary one rule) |
|
|
40
|
+
| `.claude/skills/eventmodeling-identifying-outputs/SKILL.md`, "Common Patterns": status, list, timeline and processor-decision view patterns | `references/read-model-design.md` "Common view patterns" | Adapted closely as a table over `readmodel`, projection and `query`; the pseudo-code blocks became prose |
|
|
41
|
+
| `.claude/skills/eventmodeling-orchestrating-event-modeling/SKILL.md`, "Recognizing a dedicated business event behind a derived condition": the "is this fact worth a new event" test, producing it by automation, fold only redundant causes, display-only conditions stay projections | `references/derived-condition-events.md` | Adapted closely; the todo-list translation pattern became a `reaction` that `produces` (a pending-work view only when the work can wait, retry or fail); the >3-events heuristic stays in `read-model-design.md`; board placement, 0,0-node scans and `validate_model` batch calls not adopted |
|
package/package/corpus/skills/cratis-screenplay-slice-design/references/read-model-design.md
CHANGED
|
@@ -5,6 +5,7 @@
|
|
|
5
5
|
- Start from the consumer
|
|
6
6
|
- The typical slice pattern
|
|
7
7
|
- Events or views
|
|
8
|
+
- Common view patterns
|
|
8
9
|
- Components
|
|
9
10
|
- Fan-in per field
|
|
10
11
|
- Builder and freshness
|
|
@@ -71,6 +72,22 @@ and a recovery contract, or a pending-work view; only an immediate, internal, al
|
|
|
71
72
|
effect may leave no trace
|
|
72
73
|
(`cratis-screenplay-automations-and-translations`).
|
|
73
74
|
|
|
75
|
+
## Common view patterns
|
|
76
|
+
|
|
77
|
+
Four shapes recur. Name the one a view is before choosing its fields, so the consumer and the
|
|
78
|
+
events line up.
|
|
79
|
+
|
|
80
|
+
| Pattern | Events feeding it | The view holds | Used for |
|
|
81
|
+
|---|---|---|---|
|
|
82
|
+
| Status view | The lifecycle events of one instance (booked, confirmed, arrived, cancelled) | The accumulated current state of that instance | A screen that shows where one thing stands and which actions are available |
|
|
83
|
+
| List view | Create, change and end events of many instances | One summary row per instance, with the fields people filter, sort or search by | Worklists, search, filtering; end events either `remove with` the row or set a status literal (see "Omissions are decisions") |
|
|
84
|
+
| Timeline or history view | Any events that carry a time | A chronological list, one entry per event, kept apart from the status view | History and audit trail; keep a growing history in its own view, never inside the status view |
|
|
85
|
+
| Processor decision view | The state-changing events a reaction cares about | Current state only, nothing a person would read | A `reaction` or `trigger` that reads it to decide the next action; a reaction that also `produces` directly cannot `reads` it (`PLAY0268`), so it `invokes` a command that holds the `reads` (a pending-work view is this pattern for work that can wait, retry or fail) |
|
|
86
|
+
|
|
87
|
+
The patterns describe what the view is for, not new syntax: each is a `readmodel`, a projection
|
|
88
|
+
and, where a person or caller reads it, a `query`. A view that fits two patterns at once is
|
|
89
|
+
usually two views.
|
|
90
|
+
|
|
74
91
|
## Components
|
|
75
92
|
|
|
76
93
|
- A component is an area of a screen a person would describe as one thing ("the locker list",
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
# Rule layers
|
|
2
2
|
|
|
3
|
-
Put each rule in the lowest layer where it is true for every caller. Descriptions
|
|
4
|
-
|
|
3
|
+
Put each rule in the lowest layer where it is true for every caller. Descriptions reach rendered
|
|
4
|
+
code only as XML doc comments (Stage#178): a rule that exists only in prose is unenforced in rendered scope.
|
|
5
5
|
|
|
6
6
|
| Rule is about | Layer | Notes |
|
|
7
7
|
|---|---|---|
|
|
@@ -9,13 +9,13 @@ rendered code (Stage#178): a rule that exists only in prose is unenforced in ren
|
|
|
9
9
|
| a predicate that is not a comparison (checksum, registry format) | `rule <Name>` on the property or concept | design mode; blocks V3 (PLAY0268) |
|
|
10
10
|
| this command's own inputs | command `validate` / `require` | a rule that applies only sometimes is an implication: `require a == false or b > c` |
|
|
11
11
|
| who may ask | `authorize` with a policy (role, claim, authenticated) | enclosing gates combine with AND and run first. Gates every command and query in a feature shares go on the feature or module so a new path inherits them |
|
|
12
|
-
| whose instance | policy `claim "x" matches subject` (the command identifier) or `matches <command property>` | executable; renders
|
|
12
|
+
| whose instance | policy `claim "x" matches subject` (the command identifier) or `matches <command property>` | executable; renders for text, Uuid, Date and DateTime subjects; an authorized command needs exactly one identifier (STAGE-ESM-015 otherwise) |
|
|
13
13
|
| uniqueness, once-only facts | `constraint` (`unique ... on`, `unique event`) | append-time; the constraint name is its identity |
|
|
14
|
-
| stored state (record exists, balance, current status) | `reads <View>` + `require <expr> message "..."` | stated intent, **NOT enforced in the model today** (PLAY0268/0271 at binding are expected in design mode; Screenplay#129
|
|
14
|
+
| stored state (record exists, balance, current status) | `reads <View>` + `require <expr> message "..."` | stated intent, **NOT enforced in the model today** (PLAY0268/0271 at binding are expected in design mode; Screenplay#129). Name the target: Arc `[ProtectedDecision]` + `DecisionRead<T>` (Arc 22.39.0 or later), Chronicle DCB (`concurrency` scope), or a constraint |
|
|
15
15
|
|
|
16
16
|
An unguarded materialized read is unsafe for a protected decision; a guarded read is the
|
|
17
17
|
supported route. Availability: `[ProtectedDecision]` and `DecisionRead<T>` exist in
|
|
18
|
-
Stage 4.
|
|
18
|
+
Stage 4.73.1's Arc 22.68.0/Chronicle 19.45.0 package set, but Stage does not emit
|
|
19
19
|
protected decisions. Gap-fill must use an admitted projection/key shape and active
|
|
20
20
|
unit-of-work enrollment; do not edit managed dependencies. Keep the `.play` rule
|
|
21
21
|
NOT enforced until its target enforcement is separately verified. Forbidden: caller-supplied copies of state in `require`, boolean attestation
|
|
@@ -33,7 +33,7 @@ second caller with another claim value.
|
|
|
33
33
|
|
|
34
34
|
Command property values are, by default, recorded in the causation chain of the events they
|
|
35
35
|
produce, so treat them as permanent. Newer Chronicle versions can omit causation properties
|
|
36
|
-
(`CausationPropertyRetention.Omit`, Chronicle v19.32.0); Stage 4.
|
|
36
|
+
(`CausationPropertyRetention.Omit`, Chronicle v19.32.0); Stage 4.73.1 rendered apps pin 19.45.0 (the latest Chronicle is 19.50.0).
|
|
37
37
|
Verify the actual auditing and retention configuration before relying on omission, and never
|
|
38
38
|
audit secrets. Classify personal values as bare `pii` and operational secrets as
|
|
39
39
|
`secret` on their concepts, never the identifier concept. Use a surrogate identity
|
|
@@ -19,8 +19,8 @@ and record lineage reasoning in fenced Markdown `documentation` (`field-lineage.
|
|
|
19
19
|
The historical source below stays unchanged; it is not the current placement recipe.
|
|
20
20
|
|
|
21
21
|
The excerpt's Stage availability note is historical (Stage 4.24.x, Arc 22.25.0).
|
|
22
|
-
Stage 4.
|
|
23
|
-
to gap-fill; this neither admits these `.play` rules nor proves target protection.
|
|
22
|
+
Stage 4.73.1 pins Arc 22.68.0/Chronicle 19.45.0, so protected-read APIs are available
|
|
23
|
+
to gap-fill (the compiled description below saying they are "not available in Stage-rendered apps" is superseded); this neither admits these `.play` rules nor proves target protection.
|
|
24
24
|
The original compiled excerpt is retained unchanged.
|
|
25
25
|
|
|
26
26
|
```screenplay expect PLAY0516 test=unbound
|
|
@@ -168,7 +168,7 @@ module Lockers
|
|
|
168
168
|
then denied
|
|
169
169
|
|
|
170
170
|
slice StateChange AssignLocker
|
|
171
|
-
description "The attendant gives one waiting request one free locker. Constraints enforce one holder per locker and one locker per request at append time. The state rules (the locker is installed and free, the request exists and is still waiting) are written as reads plus require: stated intent, NOT enforced in the model today (PLAY0268/0271 at binding are expected in design mode; Screenplay#129
|
|
171
|
+
description "The attendant gives one waiting request one free locker. Constraints enforce one holder per locker and one locker per request at append time. The state rules (the locker is installed and free, the request exists and is still waiting) are written as reads plus require: stated intent, NOT enforced in the model today (PLAY0268/0271 at binding are expected in design mode; Screenplay#129). Target enforcement: Arc [ProtectedDecision] with DecisionRead<T> (Arc 22.39.0 or later; not available in Stage-rendered apps, where this stays a capability gap), or a Chronicle DCB concurrency scope on the locker stream; the constraints stay as the backstop."
|
|
172
172
|
command AssignLocker
|
|
173
173
|
lockerId LockerId identifier
|
|
174
174
|
requestId RequestId
|
|
@@ -124,7 +124,8 @@ for synthesis refusals, selection, provenance and a complete passing model.
|
|
|
124
124
|
| `then events in any order` | compare the new events without regard to order |
|
|
125
125
|
| `then readmodel <ReadModelType> [exactly]` | read-model state afterwards — must state the identifier |
|
|
126
126
|
| `then no readmodel <ReadModelType> for <key>` | exactly that keyed instance is absent (v4.66.0); the key is concrete and typed |
|
|
127
|
-
| `then query <Query> [exactly]` | query results for explicit `arguments
|
|
127
|
+
| `then query <Query> [exactly]` | query results for explicit `arguments` (none for an unkeyed list); one `result` per row, each stating the identifier; none means empty |
|
|
128
|
+
| `file <path>` | optional, once: the repository-relative file realizing the specification |
|
|
128
129
|
| `then error "<message>"` | a validation or constraint rejection, for that reason; a localized rule is pinned by its quoted key, `then error "$strings.<key>"` |
|
|
129
130
|
| `then error` | a validation or constraint rejection, reason unnamed |
|
|
130
131
|
| `then denied` | an authorization denial (`Unauthorized`) |
|
|
@@ -158,7 +159,7 @@ Rules the binder enforces:
|
|
|
158
159
|
- **`null` only in optional read-model values.** A `null` in a command or event
|
|
159
160
|
value is `PLAY0350`: an optional fact is a separate event.
|
|
160
161
|
|
|
161
|
-
`PLAY0358` is a syntax error. `PLAY0350`, `PLAY0352`, `PLAY0388
|
|
162
|
+
`PLAY0358` is a syntax error (`PLAY0388` also at parse time for extra text after `then denied`). `PLAY0350`, `PLAY0352`, `PLAY0388` (mixed with another outcome), `PLAY0389` and
|
|
162
163
|
the one-rejection rule (`PLAY0273`) are reported only when the model binds, so
|
|
163
164
|
`screenplay --warnaserror` does not show them. Check executable diagnostics
|
|
164
165
|
(the MCP authoring tools) as well.
|
|
@@ -221,8 +222,9 @@ stream ids are not guessed. Read [examples and routes](references/examples-and-r
|
|
|
221
222
|
|
|
222
223
|
`given operation ... fails`, `then operation` and `then compensated` describe
|
|
223
224
|
future external-work behavior. Reaction refusal branches, `when redelivered`
|
|
224
|
-
and `then no events` are also authoring-only: compile them, but report their
|
|
225
|
-
PLAY0268 binding refusal instead of an executed result. Preserve the contract
|
|
225
|
+
and `then no events` (PLAY0268, #433) are also authoring-only: compile them, but report their
|
|
226
|
+
PLAY0268 binding refusal instead of an executed result. Preserve the contract; a read-model or
|
|
227
|
+
query assertion states a zero-fact outcome.
|
|
226
228
|
|
|
227
229
|
## Rejections and denials say different things
|
|
228
230
|
|
|
@@ -280,7 +282,7 @@ For view specifications:
|
|
|
280
282
|
## Verify
|
|
281
283
|
|
|
282
284
|
- [ ] Validate the complete root with warnings as errors, naming tool/version.
|
|
283
|
-
|
|
285
|
+
Standalone pin: `cratis-screenplay-toolchain/references/versions.md`. Run specification examples through
|
|
284
286
|
`screenplay test`; expected unadmitted syntax reports unbound, not passed.
|
|
285
287
|
- [ ] Executable diagnostics are clean too: `PLAY0350`, `PLAY0352`, `PLAY0388`,
|
|
286
288
|
`PLAY0389` and `PLAY0273` are only reported at binding.
|
package/package/corpus/skills/cratis-screenplay-specifications/references/examples-and-routes.md
CHANGED
|
@@ -88,14 +88,15 @@ cannot be changed back to a wildcard. Literal compatibility/route contradiction
|
|
|
88
88
|
checks use resolved source/stream types, not guessed text (PLAY0547–PLAY0551).
|
|
89
89
|
At Screenplay 4.127.0, route literals must be nonempty, well-formed NFC text
|
|
90
90
|
(refused, not normalized); Double integer ids are within ±(2^53−1), while Exact
|
|
91
|
-
has no such bound but remains unadmitted
|
|
91
|
+
has no such bound but the `numbers exact` source mode remains unadmitted (PLAY0268; exact lowering of
|
|
92
|
+
qualifying Double literals is the separate, admitted v11). Invalid specification routes report
|
|
92
93
|
PLAY0549. Contradictions compare canonical scalar ids and every composite part,
|
|
93
94
|
so UUID casing is immaterial. Composite mappings supply each named part once,
|
|
94
95
|
using literals only; encoding escapes `%`/`|` and preserves declaration order.
|
|
95
96
|
Source: v4.127.0 `event-sources.md`, `specifications.md`, `diagnostics.md`.
|
|
96
97
|
|
|
97
|
-
Previous CLI 3.46.1 refused above v7; CLI
|
|
98
|
-
checks through v10. Routed read-model/query replay can still refuse
|
|
98
|
+
Previous CLI 3.46.1 refused above v7; the pinned CLI/Stage pair
|
|
99
|
+
(`cratis-screenplay-toolchain/references/versions.md`) reaches route checks through v10. Routed read-model/query replay can still refuse
|
|
99
100
|
STAGE-ESM-030. Source/reference success never establishes target parity.
|
|
100
101
|
|
|
101
102
|
Command and read-model examples refuse routes (PLAY0526). Effective role and
|
package/package/corpus/skills/cratis-screenplay-specifications/references/generated-fixtures.md
CHANGED
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
## Generated fixtures and return expectations (ESM v7)
|
|
2
2
|
|
|
3
|
-
Standalone `screenplay` 4.68.0 or later binds and runs these
|
|
4
|
-
|
|
3
|
+
Standalone `screenplay` 4.68.0 or later binds and runs these, and so does the current cratis bundle (the
|
|
4
|
+
cratis 3.28.3 bundle, 4.66.0, did not); Stage 4.73.1 admits ESM v7 but refuses generated values
|
|
5
|
+
(`STAGE-ESM-028`) and responses (`STAGE-ESM-029`; Stage#175), so they pin the
|
|
5
6
|
contract of a hand-written command. The model and rules are in `cratis-screenplay-command-surface`; the
|
|
6
7
|
complete example is `cratis-screenplay-toolchain` `references/generated-responses-example.md`. Read that file when writing generated-value fixtures or scalar and record return expectations and needing a complete reference-executable model.
|
|
7
8
|
|
|
@@ -37,6 +37,9 @@ denial still uses `then denied`; a visitor persona is not an anonymous caller.
|
|
|
37
37
|
|
|
38
38
|
## Case tables
|
|
39
39
|
|
|
40
|
+
Two diagnostics to know: `PLAY0588` (warning) for a declared parameter no step references, and `PLAY0585`
|
|
41
|
+
(error) when an optional parameter feeds a required target.
|
|
42
|
+
|
|
40
43
|
Use tables for validation matrices whose steps stay the same. Rows are **cases**,
|
|
41
44
|
not examples: `example` means a named typed fixture. This complete model's five
|
|
42
45
|
expanded specifications pass in the 4.127.0 reference runner:
|
package/package/corpus/skills/cratis-screenplay-specifications/references/reactions-and-cascades.md
CHANGED
|
@@ -53,8 +53,9 @@ module Collections
|
|
|
53
53
|
- A reached reaction with a code body (`file` or inline) returns unsupported, as
|
|
54
54
|
does a reaction that never settles. The reference stops at 1,000 new facts per
|
|
55
55
|
scenario and 10,000 due occurrences per clock advance.
|
|
56
|
-
- A model that uses these forms selects ESM v6 (`schemaVersion: 6`). Stage 4.
|
|
57
|
-
admits ESM v1-
|
|
56
|
+
- A model that uses these forms selects ESM v6 (`schemaVersion: 6`). Stage 4.73.1
|
|
57
|
+
admits ESM v1-v10 by version but renders no `Automation` or `Translate` slice and no reaction
|
|
58
|
+
(`STAGE-ESM-024`; `-034` runsAs, `-035` filters, `-037` mixed effects), so the whole
|
|
58
59
|
automation is gap-fill against this contract: `cratis-screenplay-render-and-gap-fill`.
|
|
59
60
|
|
|
60
61
|
### Version skew: cascades and the false `PLAY0285` (cratis before 3.28.2)
|
|
@@ -34,5 +34,5 @@ SOFTWARE.
|
|
|
34
34
|
|
|
35
35
|
This skill also adapts material from agentic-engineer by Martin Dilger and Nebulit GmbH
|
|
36
36
|
(https://github.com/Nebulit-GmbH/agentic-engineer, commit 07b0f30648d663cb588d7e2c7aa031af9dfc21f2;
|
|
37
|
-
https://nebulit.de), used with the
|
|
38
|
-
|
|
37
|
+
https://nebulit.de), used with the explicit consent of Martin Dilger and Nebulit GmbH. The adapted
|
|
38
|
+
material remains credited to Martin Dilger and Nebulit GmbH.
|
|
@@ -12,7 +12,7 @@ which it only records, and what a retry, a race or a replay does. Grammar lives
|
|
|
12
12
|
skills; this skill owns the decisions. The `.play` model is the source of truth: a rule that
|
|
13
13
|
lives only in code, or only in a description, is a finding, not a solution.
|
|
14
14
|
|
|
15
|
-
**First append into a scope (Chronicle v19.
|
|
15
|
+
**First append into a scope (Chronicle v19.50.0, version-qualified).** The default optimistic
|
|
16
16
|
strategy compares the scope's tail sequence number. When nothing matches the scope yet (the
|
|
17
17
|
first event on a new event source, or the first event of a new source type, stream type or
|
|
18
18
|
stream id), there is no tail and the append is **not checked**: two writers opening the same
|
|
@@ -28,17 +28,17 @@ Require target evidence that the check ran: a concurrent first-append scenario a
|
|
|
28
28
|
Chronicle, asserting one append wins, one is rejected, and `IAppendResult.ConcurrencyCheckPerformed`
|
|
29
29
|
is `true` (a skipped check and a passing one look identical otherwise; a current client against
|
|
30
30
|
an older kernel always reads `false`). This was source- and documentation-inspected, not
|
|
31
|
-
concurrency-tested here. The
|
|
32
|
-
and Arc 22.
|
|
31
|
+
concurrency-tested here. The Stage 4.73.1 scaffold pins Chronicle client/kernel 19.45.0
|
|
32
|
+
and Arc 22.68.0 (the CLI bundle's Chronicle is 19.32.0); the APIs exist for gap-fill, not as automatically rendered enforcement.
|
|
33
33
|
|
|
34
34
|
## Verified product sources
|
|
35
35
|
|
|
36
36
|
| Product | Pin | Used for |
|
|
37
37
|
| --- | --- | --- |
|
|
38
38
|
| Screenplay | v4.68.0 (`79801bf`) | ESM v7 generated values (`generated identifier`, decision 0026) and decision 0025's numbering; the diagnostics below were read at v4.66.0 (`c89198b`): `identifier`, `for`, constraints, generations, `id` pins, diagnostics PLAY0019/0135/0268/0271/0273/0391-0393/0446-0449/0469/0471 |
|
|
39
|
-
| Chronicle | v19.32.0
|
|
40
|
-
| Arc | v22.
|
|
41
|
-
| Stage
|
|
39
|
+
| Chronicle | v19.50.0 (read; first read at v19.32.0 `f17a2ff`) | CHR0012, CHR0034; open defects #3744, #4123, #4131 (still open) |
|
|
40
|
+
| Arc | v22.72.0 | `[ProtectedDecision]` and `DecisionRead<T>` (since v22.39.0) |
|
|
41
|
+
| Stage | v4.73.1 | rendered apps pin Arc 22.68.0 and Chronicle client/kernel 19.45.0; protected-read APIs available to gap-fill. Historical 4.24.2 admission probe: ESM v4, evolved events refused with `STAGE-ESM-026` |
|
|
42
42
|
|
|
43
43
|
Full pin table: `references/versions.md` in `cratis-screenplay-toolchain`. Re-check the three
|
|
44
44
|
Chronicle issues before relying on a constraint in a later release.
|
|
@@ -88,9 +88,9 @@ option, mark it `ASSUMED` in the slice or module `documentation` and in the sess
|
|
|
88
88
|
namespace, process-stream routing and concurrency scope apart
|
|
89
89
|
(`references/chronicle-boundaries.md`). Declared `eventsource`/`stream`/`streamId` and
|
|
90
90
|
command/specification routes bind and reference-execute as ESM v8 on 4.125.0.
|
|
91
|
-
CLI
|
|
91
|
+
The pinned CLI (toolchain `references/versions.md`) reaches Stage construct checks through v10; keep the routing
|
|
92
92
|
contract when target admission requires gap-fill. Forms/boundaries:
|
|
93
|
-
toolchain `references/sources-and-streams.md`. A `generated identifier` (ESM v7, standalone 4.68.0;
|
|
93
|
+
toolchain `references/sources-and-streams.md`. A `generated identifier` (ESM v7, standalone 4.68.0 and later; Stage 4.73.1 refuses it, STAGE-ESM-028) is
|
|
94
94
|
generated fresh on every acceptance: it is not a retry identity, and generated values give no
|
|
95
95
|
idempotency, retry or deduplication guarantee. When a retry must find the same stream, the caller
|
|
96
96
|
supplies the identifier before the first attempt.
|
|
@@ -128,7 +128,10 @@ option, mark it `ASSUMED` in the slice or module `documentation` and in the sess
|
|
|
128
128
|
`references/compliance.md` for allowed types and the policy/encryption distinction.
|
|
129
129
|
5. **Plan evolution** with `references/evolution.md`: classify each event change (additive,
|
|
130
130
|
meaning change, rename, removal, split or merge) and write its compatibility scenarios before
|
|
131
|
-
editing.
|
|
131
|
+
editing. Pin persisted/public enum member numbers before reordering or removing
|
|
132
|
+
members; never renumber or reuse a published number. Positional pins preserve
|
|
133
|
+
executable bytes; non-positional pins need ESM v12 consumer admission.
|
|
134
|
+
Renames and other identity-affecting edits are made by the identity owner (the
|
|
132
135
|
identity procedure in `cratis-screenplay-modeling-lifecycle`).
|
|
133
136
|
6. **Test ownership and interfaces** with `references/boundaries.md`: ownership interview,
|
|
134
137
|
interface and processor inventory, one real interaction walked across each boundary, coupling
|
|
@@ -163,10 +166,10 @@ option, mark it `ASSUMED` in the slice or module `documentation` and in the sess
|
|
|
163
166
|
complete named mappings and canonical comparison, not guessed legacy splits.
|
|
164
167
|
Stored key-schema changes require a new stream identity or migration; see
|
|
165
168
|
toolchain `references/sources-and-streams.md`.
|
|
166
|
-
- Chronicle (open at v19.
|
|
169
|
+
- Chronicle (open at v19.50.0): the SQL and InMemory providers do not settle unique claims
|
|
167
170
|
(#3744); index updates run after commit and may fail silently (#4123); composite values can
|
|
168
171
|
collide on the separator (#4131). A declared constraint is a declaration, not a runtime test.
|
|
169
|
-
- `[ProtectedDecision]` is available in Arc v22.39.0 or later, including Stage 4.
|
|
172
|
+
- `[ProtectedDecision]` is available in Arc v22.39.0 or later, including Stage 4.73.1's
|
|
170
173
|
rendered package set. It is not emitted protection: gap-fill must enroll an admitted
|
|
171
174
|
decision read, or redesign the stream/identity when the shape is refused
|
|
172
175
|
(`references/consistency-and-concurrency.md`, section 3).
|