@cratis/pi 7.69.0 → 7.70.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.
Files changed (51) hide show
  1. package/package/corpus/product-sync.json +7 -7
  2. package/package/corpus/skills/cratis-arc-command/references/generated-values.md +3 -1
  3. package/package/corpus/skills/cratis-arc-command/references/shop-generation.md +2 -2
  4. package/package/corpus/skills/cratis-screenplay-automations-and-translations/SKILL.md +1 -1
  5. package/package/corpus/skills/cratis-screenplay-automations-and-translations/references/audit-format.md +1 -1
  6. package/package/corpus/skills/cratis-screenplay-automations-and-translations/references/realization-and-gap-fill.md +1 -1
  7. package/package/corpus/skills/cratis-screenplay-captures-and-reactions/SKILL.md +1 -1
  8. package/package/corpus/skills/cratis-screenplay-captures-and-reactions/references/atomic-batches-and-source-mappings.md +1 -1
  9. package/package/corpus/skills/cratis-screenplay-command-surface/SKILL.md +3 -3
  10. package/package/corpus/skills/cratis-screenplay-command-surface/references/generated-values-and-responses.md +4 -4
  11. package/package/corpus/skills/cratis-screenplay-command-surface/references/protected-reads.md +34 -7
  12. package/package/corpus/skills/cratis-screenplay-command-surface/references/shop-generation.md +2 -2
  13. package/package/corpus/skills/cratis-screenplay-event-modeling/SKILL.md +3 -3
  14. package/package/corpus/skills/cratis-screenplay-event-modeling/references/parsed-not-runnable.md +1 -1
  15. package/package/corpus/skills/cratis-screenplay-legacy-extraction/references/generated-recovery.md +1 -1
  16. package/package/corpus/skills/cratis-screenplay-model-authoring/references/choosing-generation.md +1 -1
  17. package/package/corpus/skills/cratis-screenplay-model-authoring/references/language-reference.md +2 -2
  18. package/package/corpus/skills/cratis-screenplay-model-review/references/anti-patterns.md +1 -1
  19. package/package/corpus/skills/cratis-screenplay-model-review/references/checklist.md +1 -1
  20. package/package/corpus/skills/cratis-screenplay-modeling-lifecycle/references/principles.md +1 -1
  21. package/package/corpus/skills/cratis-screenplay-modeling-lifecycle/references/vocabulary-map.md +1 -1
  22. package/package/corpus/skills/cratis-screenplay-read-surface/references/named-keys.md +10 -5
  23. package/package/corpus/skills/cratis-screenplay-render-and-gap-fill/SKILL.md +2 -2
  24. package/package/corpus/skills/cratis-screenplay-render-and-gap-fill/references/gap-fill-handoff.md +4 -3
  25. package/package/corpus/skills/cratis-screenplay-render-and-gap-fill/references/renderability-gate.md +2 -1
  26. package/package/corpus/skills/cratis-screenplay-scenario-coverage/references/berth-reservations.md +1 -1
  27. package/package/corpus/skills/cratis-screenplay-scenario-coverage/references/invoicing-dues-design.md +2 -2
  28. package/package/corpus/skills/cratis-screenplay-scenario-coverage/references/scenario-catalogue.md +2 -2
  29. package/package/corpus/skills/cratis-screenplay-scenario-coverage/references/spec-forms-by-mode.md +2 -2
  30. package/package/corpus/skills/cratis-screenplay-slice-design/references/rule-layers.md +1 -1
  31. package/package/corpus/skills/cratis-screenplay-slice-design/references/worked-example.md +1 -1
  32. package/package/corpus/skills/cratis-screenplay-specifications/references/generated-fixtures.md +3 -3
  33. package/package/corpus/skills/cratis-screenplay-streams-and-consistency/SKILL.md +2 -2
  34. package/package/corpus/skills/cratis-screenplay-streams-and-consistency/references/consistency-and-concurrency.md +2 -2
  35. package/package/corpus/skills/cratis-screenplay-streams-and-consistency/references/read-model-keys.md +3 -3
  36. package/package/corpus/skills/cratis-screenplay-streams-and-consistency/references/streams-example.md +1 -1
  37. package/package/corpus/skills/cratis-screenplay-toolchain/SKILL.md +2 -2
  38. package/package/corpus/skills/cratis-screenplay-toolchain/references/cheat-sheet.md +1 -1
  39. package/package/corpus/skills/cratis-screenplay-toolchain/references/diagnostic-arguments.md +8 -0
  40. package/package/corpus/skills/cratis-screenplay-toolchain/references/diagnostics.md +13 -10
  41. package/package/corpus/skills/cratis-screenplay-toolchain/references/executable-subset.md +4 -5
  42. package/package/corpus/skills/cratis-screenplay-toolchain/references/language-admission.md +9 -8
  43. package/package/corpus/skills/cratis-screenplay-toolchain/references/renderable-subset.md +12 -8
  44. package/package/corpus/skills/cratis-screenplay-toolchain/references/traps.md +1 -1
  45. package/package/corpus/skills/cratis-stage-rendering-and-sandbox/SKILL.md +16 -12
  46. package/package/corpus/skills/cratis-stage-rendering-and-sandbox/references/admission.md +19 -15
  47. package/package/corpus/skills/cratis-stage-rendering-and-sandbox/references/behavior-walk.md +4 -3
  48. package/package/corpus/skills/cratis-stage-rendering-and-sandbox/references/choosing-generation.md +1 -1
  49. package/package/corpus/skills/cratis-stage-rendering-and-sandbox/references/sandbox-and-specrunner.md +9 -9
  50. package/package/corpus/skills/cratis-stage-rendering-and-sandbox/verification.json +2 -2
  51. package/package.json +1 -1
@@ -27,9 +27,9 @@
27
27
  "repository": "Cratis/Stage",
28
28
  "packages": [],
29
29
  "synced": {
30
- "version": "4.103.0",
31
- "date": "2026-10-14",
32
- "by": "Cratis/AI#681"
30
+ "version": "4.138.0",
31
+ "date": "2026-10-17",
32
+ "by": "Cratis/AI#752"
33
33
  },
34
34
  "covers": {
35
35
  "skills": [
@@ -125,9 +125,9 @@
125
125
  }
126
126
  ],
127
127
  "synced": {
128
- "version": "3.74.0",
128
+ "version": "3.75.0",
129
129
  "date": "2026-10-17",
130
- "by": "Cratis/AI#746"
130
+ "by": "Cratis/AI#752"
131
131
  },
132
132
  "covers": {
133
133
  "skills": [
@@ -171,9 +171,9 @@
171
171
  }
172
172
  ],
173
173
  "synced": {
174
- "version": "4.205.0",
174
+ "version": "4.207.0",
175
175
  "date": "2026-10-17",
176
- "by": "Cratis/AI#746"
176
+ "by": "Cratis/AI#752"
177
177
  },
178
178
  "covers": {
179
179
  "skills": [
@@ -141,7 +141,9 @@ Arc resolves these through the concept's generation interface, not strategy-spec
141
141
  `[GeneratedValue]` options. Requires Arc.Screenplay 22.107.0 for pattern/random,
142
142
  checksum and self-contained String-rule recovery; older adapters keep them in code.
143
143
  Requires Stage 4.118.0 for checksum validation and 4.119.0 for pattern/random
144
- rendering; older renderers refuse them. `generate rule` remains STAGE-ESM-028.
144
+ rendering; older renderers refuse them. Requires Stage 4.136.0 to render `generate rule` as an
145
+ `IGeneratableInContext<T>.New(GenerationContext)` factory (body errors STAGE-ESM-019, shadowing -022, missing
146
+ attachment -020); the Host and legacy syntax engine still refuse a command generating its value with STAGE-ESM-028.
145
147
  Screenplay separately admits concept `generate` strategies and freshness; see `cratis-screenplay-command-surface/references/generated-values-and-responses.md`
146
148
  for that language contract and Stage's explicit scopes. Native Arc freshness is a
147
149
  separate policy; a factory alone is not a storage guard.
@@ -106,8 +106,8 @@ and captured-time semantics, never one exact random suffix.
106
106
  as `.play`. Read [generated-value recovery](../../cratis-screenplay-legacy-extraction/references/generated-recovery.md)
107
107
  for Arc.Screenplay prerequisites and refusal boundaries, and
108
108
  [Stage admission](../../cratis-stage-rendering-and-sandbox/references/admission.md)
109
- for checksum and pattern/random rendering prerequisites. `generate rule`
110
- remains STAGE-ESM-028.
109
+ for checksum, pattern/random and `generate rule` rendering prerequisites (Stage 4.136.0 renders
110
+ `generate rule`; the Host and legacy engine still refuse it with STAGE-ESM-028).
111
111
 
112
112
  ## Sources
113
113
 
@@ -171,7 +171,7 @@ or actor that nobody confirmed. Read `references/worked-integration.md` when you
171
171
  separate binder check.
172
172
  - A trigger with `reads` that `produces` directly fails binding: decide in a command.
173
173
  Command reads can protect with `command reads protected` and admitted shapes (v25);
174
- trigger reads cannot. The Cratis C# renderer refuses protected reads (STAGE-ESM-044);
174
+ trigger reads cannot. Stage 4.138.0 renders protected reads as Arc read protection (`cratis render` gets it from the first CLI that bundles it; CLI 3.75.0 refuses them with STAGE-ESM-044);
175
175
  semantic execution is separate from generated-app protection.
176
176
  - An authorized command exercised in a spec without `given caller` is PLAY0389 at binding.
177
177
  - A list query (`=> Item[]`) binds (a snapshot list is not rendered, `STAGE-ESM-010`);
@@ -12,7 +12,7 @@ technique: partial work stays visible and nothing is skipped because it looked r
12
12
  Result is `complete` only when every column is filled or says why it does not apply (for example
13
13
  "direct effect: immediate, internal, cannot fail"). `open` names the unresolved decision and who
14
14
  answers. `blocked` names the actual capability gap with intended behavior. For example,
15
- the CLI/Stage pair (toolchain `references/renderable-subset.md`) admits through ESM v26 to construct checks; role/authenticated reaction identity
15
+ the CLI/Stage pair (toolchain `references/renderable-subset.md`) admits through ESM v27 to construct checks; role/authenticated reaction identity
16
16
  renders, while claim-reading/opaque system gates still refuse STAGE-ESM-034. Previous CLI 3.46.1 refused v10 at the version gate
17
17
  with CLI-RENDER-004; do not report that historical refusal as the current gap.
18
18
 
@@ -23,7 +23,7 @@ rejected model renderable, and never claim a whole-application V5 from a subset.
23
23
  with `cratis-screenplay-render-and-gap-fill`.
24
24
 
25
25
  Application-root `reaction batches atomic` also blocks Stage delivery: v22
26
- refuses STAGE-ESM-016; mode in admitted v23–v26 refuses STAGE-ESM-043. Preserve the
26
+ refuses STAGE-ESM-016; mode in admitted v23–v27 refuses STAGE-ESM-043. Preserve the
27
27
  per-occurrence/selected-branch batch boundary and independent invoked commands.
28
28
  Atomic appends do not prove redelivery deduplication or external exactly-once effects.
29
29
 
@@ -104,7 +104,7 @@ binding, because its decision dependency cannot be protected. A reaction that on
104
104
  command's own reads. Eligible command reads protect under application-root
105
105
  `command reads protected` (ESM v25); legacy reads retain PLAY0271. Read command-surface
106
106
  [protected reads](../cratis-screenplay-command-surface/references/protected-reads.md)
107
- for admission and absence/conflict behavior. Stage admits v25; the Cratis C# renderer refuses protected reads with STAGE-ESM-044.
107
+ for admission and absence/conflict behavior. Stage admits v25 and, from 4.138.0, renders protected reads as Arc read protection (CLI 3.75.0 refuses them with STAGE-ESM-044).
108
108
  Semantic Host/executor support is separate; non-Error protected requirements refuse -045,
109
109
  including reaction-invoked commands.
110
110
  `where` over read paths out of scope, and `where` needs
@@ -36,7 +36,7 @@ batch and unchanged read models with evaluator world/read-model assertions; earl
36
36
  accepted work can remain. `then no events` means accepted zero outcomes and cannot
37
37
  accompany `then error`. Do not invent a mixed success/error specification form.
38
38
 
39
- Stage refuses ESM v22 with STAGE-ESM-016. Even an admitted v23–v26 model carrying
39
+ Stage refuses ESM v22 with STAGE-ESM-016. Even an admitted v23–v27 model carrying
40
40
  atomic mode is refused with STAGE-ESM-043 by renderer, Host and specification executor.
41
41
  Keep the declaration and report authorized gap-fill; do not promise a render date or
42
42
  strip atomicity to lower the version.
@@ -151,12 +151,12 @@ view name when that view is read once.
151
151
  Opt eligible state reads into application-root `command reads protected` (v25).
152
152
  Absence rejects; matching intervening facts conflict. Read [protected reads](references/protected-reads.md)
153
153
  for strict admission, paths and PLAY0780–0786. Legacy reads stay unprotected;
154
- reads/concurrency cannot combine (PLAY0783). The Cratis C# renderer refuses protected reads (STAGE-ESM-044), not v25 itself;
155
- semantic Host/executor support is separate.
154
+ reads/concurrency cannot combine (PLAY0783). Semantic Host/executor support is separate.
155
+ Requires Stage 4.138.0 to render protected reads as Arc read protection (shapes it cannot preserve stay STAGE-ESM-044); `cratis render` gets it from the first CLI that bundles it, and CLI 3.75.0 refuses every protected read with STAGE-ESM-044.
156
156
  Uniqueness still uses a constraint; reference success is not target realization.
157
157
 
158
158
  Do not use `reads` to fetch data the caller could supply. A composite-key view's `by` block in a
159
- command read is `PLAY0271`, or `PLAY0781` ByParts under `command reads protected`
159
+ command read is `PLAY0271`, or `PLAY0781` reason `by-parts` under `command reads protected`
160
160
  (read-surface `references/named-keys.md`).
161
161
 
162
162
  ## `validate`
@@ -121,8 +121,7 @@ Do not insert a bridge to Screenplay's record or promise another provider accept
121
121
  Arc can recover such self-contained compound bodies under the adapter gate in
122
122
  [generated recovery](../../cratis-screenplay-legacy-extraction/references/generated-recovery.md).
123
123
  Recovery does not run the body; reference execution consumes a String pin, opaque
124
- entropy cannot supply an identifier, and Stage rendering still refuses `generate rule`
125
- with STAGE-ESM-028. A target binding contract is not released renderer support.
124
+ entropy cannot supply an identifier. Requires Stage 4.136.0 to render `generate rule`: the attached C# body becomes the concept's `IGeneratableInContext<T>.New(GenerationContext)` factory; a body that does not compile or warns refuses STAGE-ESM-019, type or namespace shadowing STAGE-ESM-022 and a missing attachment STAGE-ESM-020. The Host and the legacy syntax engine still refuse a command that generates a `generate rule` value with STAGE-ESM-028. Rendering emits the attached body as written; it does not turn a portable body into another provider's contract.
126
125
 
127
126
  ## Inspect and edit generation through MCP
128
127
 
@@ -268,7 +267,8 @@ Requires Stage 4.94.0 or later for receipt-time generation; older factories use
268
267
 
269
268
  | Refusal | Still unsupported |
270
269
  | --- | --- |
271
- | STAGE-ESM-028 | `generate rule`, unknown strategies, non-concepts, optional/collection generation; every explicit strategy on the legacy syntax engine |
270
+ | STAGE-ESM-028 | unknown strategies, non-concepts, optional/collection generation; a command generating a `generate rule` value in the Host; every explicit strategy and `generate rule` on the legacy syntax engine |
271
+ | STAGE-ESM-019 / -022 / -020 | `generate rule` body that does not compile or warns / type or namespace shadowing / missing attachment (Requires Stage 4.136.0) |
272
272
  | STAGE-ESM-011 | A fixture that does not match its strategy shape or concept rules |
273
273
  | STAGE-ESM-038 | Routing combined with generation/responses; generated-property rules/requirements; occurrence parameter/response/factory name collisions; unsupported response sources/composites/collections; generated identifier plus destination-less plain production |
274
274
  | STAGE-ESM-038 | Unpinned generation with any Unproven/Refuted concept rule, production-condition reads, unordered event/read-model/query expectations or collision-sensitive generated constraints |
@@ -293,7 +293,7 @@ renderers refuse them with -038. Every severity is enforced as a generation defe
293
293
  Requires Stage 4.118.0 for semantic checksum validation and 4.119.0 for
294
294
  pattern/random factories, Host sampling and executor fixture checks; older
295
295
  renderers refuse those constructs with -042/-028. Dated patterns use receipt-time
296
- context; Int ranges render as `long`. `generate rule` still refuses -028.
296
+ context; Int ranges render as `long`. `generate rule` renders from Stage 4.136.0 (see above).
297
297
  Requires Arc.Screenplay 22.107.0 for pattern/random/checksum and self-contained
298
298
  String-rule recovery; older adapters leave these factories in code. Recovery is
299
299
  not Stage rendering: keep refused rule contracts for gap-fill, never delete rules
@@ -66,10 +66,24 @@ Every read must satisfy both boundaries:
66
66
  PLAY0781 refuses reducers, joins (including removal joins), children/nested scopes,
67
67
  `every`/`all`, payload/composite keys, missing removals, empty handled-event sets,
68
68
  named sources/streams, singleton views and unsupported/generated/optional/collection
69
- keys. Its closed reasons are Reducer, Join, Children, OpenSubscription, PayloadKey,
70
- ByParts, NoRemoval, EmptyHandledSet, NamedSourceOrStream, Singleton, KeyType,
71
- GeneratedKey, OptionalKey and CollectionKey. `optional`, `advisory` and `via query`
72
- remain refused; `via query` uses parser code PLAY0175. There is no unguarded fallback.
69
+ keys. `optional`, `advisory` and `via query` remain refused; `via query` uses parser
70
+ code PLAY0175. There is no unguarded fallback.
71
+
72
+ Requires Screenplay 4.207.0 (`screenplay --version`) for typed diagnostic arguments;
73
+ earlier compilers omit these arguments. Read the arguments, never the message:
74
+
75
+ | Code | Arguments |
76
+ | --- | --- |
77
+ | PLAY0781 | `command`, `read` (the alias, else the read model name), `readModel`, `reason` |
78
+ | PLAY0782 | `command`, `read` |
79
+ | PLAY0783 | `command` |
80
+ | PLAY0784, PLAY0785 | `command`, `read`, `path` |
81
+
82
+ `reason` is one of `reducer`, `join`, `children`, `open-subscription`, `payload-key`,
83
+ `by-parts`, `no-removal`, `empty-handled-set`, `named-source-or-stream`, `singleton`,
84
+ `key-type`, `generated-key`, `optional-key` or `collection-key`. These lowercase,
85
+ hyphenated values are published and stable; they are not C# enum names, and a tool must
86
+ tolerate a value it does not know. Every refused read gets its own PLAY0781.
73
87
 
74
88
  Single-level `read.property` paths bind in `require` operands and produced-event
75
89
  mapping sources only. Deeper paths and read paths in `produces when`, response
@@ -105,9 +119,22 @@ explicit `apply`. The repair inserts into the domain document or sole document,
105
119
  refuses ambiguous roots and requires individual review, never fix-all. It changes
106
120
  absence/conflict behavior, not merely formatting.
107
121
 
108
- Stage admits ESM v25, but the Cratis C# renderer refuses protected reads with
109
- STAGE-ESM-044: no artifacts are emitted. Preserve protection and deliver authorized
110
- hand-written enforcement through render-and-gap-fill; never remove the preamble.
122
+ Stage admits ESM v25.
123
+
124
+ Requires Stage 4.138.0 for the Cratis renderer to render protected reads; `cratis render` gets it from the first CLI that bundles it, and CLI 3.75.0 (Stage 4.137.0) and older refuse every protected read with STAGE-ESM-044.
125
+
126
+ Each command with `reads` becomes an Arc command with `[ReadProtection(On)]`, a
127
+ nullable read-model `Handle` parameter per read looked up with `[LookUpBy]`, the
128
+ `<View> '<key>' does not exist.` rejection, and every requirement evaluated in `Handle`
129
+ after the reads. Generated specifications run protected commands in decision mode.
130
+ Reads it cannot preserve faithfully (reads combined with constrained events, read paths
131
+ in `produces when`, read-path mappings to optional, collection, composite or differently
132
+ typed event properties, generated-value freshness scopes) refuse STAGE-ESM-044 naming the
133
+ reason, and no artifacts are emitted. Where rendering refuses, preserve protection and deliver authorized
134
+ hand-written enforcement through render-and-gap-fill; never remove the preamble. Read
135
+ Stage's [protected reads rendering](https://github.com/Cratis/Stage/blob/main/Documentation/reference/protected-reads-rendering.md)
136
+ for the rendered shape and where it differs from the reference (a race is an Arc
137
+ validation failure, not `DecisionStateChanged`; only the first failing requirement is reported).
111
138
 
112
139
  Requires Stage 4.129.0 for semantic Host/specification-executor protected reads;
113
140
  older engines refuse STAGE-ESM-044. They require presence before requirements or
@@ -116,8 +116,8 @@ example realizes that credential behavior. Never drop ApiKey's secret marker to
116
116
  make its generation bind/render. A pattern is not gapless/sequential numbering;
117
117
  check digits catch typos, not forgery. ESM v21 binds and reference-executes with
118
118
  pins. Requires Stage 4.118.0 for checksum validation and 4.119.0 for pattern/random
119
- rendering; older renderers refuse those constructs. `generate rule` still refuses
120
- STAGE-ESM-028. Sequence allocation and secret generation stay explicit gaps.
119
+ rendering; older renderers refuse those constructs. `generate rule` renders from Stage 4.136.0 (the Host
120
+ and legacy syntax engine still refuse it with STAGE-ESM-028). Sequence allocation and secret generation stay explicit gaps.
121
121
 
122
122
  ## Sources
123
123
 
@@ -115,7 +115,8 @@ result are in [references/parsed-not-runnable.md](references/parsed-not-runnable
115
115
  and `cratis-screenplay-toolchain` (`references/executable-subset.md`). Read `references/parsed-not-runnable.md` when determining the required ESM version or interpreting binding dispositions. Read `cratis-screenplay-toolchain`'s `references/executable-subset.md` when checking binder admission or reference-execution limits. Model the wider
116
116
  language freely when the `.play` file **is** the deliverable - documentation,
117
117
  review, a shared description of a system. Never read a clean `screenplay` run as
118
- evidence a construct works downstream.
118
+ evidence a construct works downstream. The language is frozen at ESM v1–v28 ([the freeze decision](https://github.com/Cratis/Screenplay/blob/main/decisions/0092-the-language-is-frozen-at-esm-v28.md)): model with it, and report a typed
119
+ Stage, `cratis render` or Studio refusal as a platform gap rather than waiting for new constructs.
119
120
 
120
121
  ## Locate the model
121
122
 
@@ -174,8 +175,7 @@ compile or will not be safe. Both are deliberate.
174
175
  rejects and matching decide/commit changes conflict. Read
175
176
  [protected reads](../cratis-screenplay-command-surface/references/protected-reads.md)
176
177
  for the strict shape and paths. Legacy reads remain PLAY0271; `concurrency` is
177
- not protection and cannot combine with protected reads. The Cratis C# renderer refuses protected reads
178
- (STAGE-ESM-044), not v25 itself: semantic Host/executor support is not generated-app protection.
178
+ not protection and cannot combine with protected reads. Stage 4.138.0 renders protected reads as Arc read protection (`cratis render` gets it from the first CLI that bundles it; CLI 3.75.0 refuses them with STAGE-ESM-044); semantic Host/executor support is not generated-app protection.
179
179
  Write state-dependent rules as `reads` plus `require` with an indented message;
180
180
  mark refused shapes as unenforced and name the intended target mechanism. Model uniqueness as a `unique` constraint. Never copy state into a
181
181
  command input, add an attestation flag, or hide the rule in `handler` prose. Do not
@@ -34,7 +34,7 @@ Tool versions and consumer boundaries: toolchain `SKILL.md`.
34
34
  | Compliance concepts | Bare `pii`/`personal` and `secret`, qualifiers and scope bind as v13; enum/identity compliance and events combining personal or explicitly subject-scoped secret values with an explicit `subject` mark refuse PLAY0268 at binding only. A CLI bundle that admits v13 binds markers; Stage renders v13 protection, not protected identities/enums or subject lineage. Never remove protection |
35
35
  | Identity details / processing purposes / event subject | Report-only metadata; executable detail reads refuse PLAY0268, not source declaration errors |
36
36
  | Composite stream ids | v8 routing; complete named parts/canonical comparisons, PLAY0515 refuses protected keys/sources; not a legacy text split |
37
- | Command reads/concurrency | Eligible reads opt into v25 with `command reads protected`; legacy reads/concurrency retain PLAY0271; the Cratis C# renderer refuses protected reads (STAGE-ESM-044), not the v25 pair; semantic Host/executor support is separate |
37
+ | Command reads/concurrency | Eligible reads opt into v25 with `command reads protected`; legacy reads/concurrency retain PLAY0271; the Cratis renderer renders protected reads as Arc read protection in a new enough bundle (older bundles, and shapes it cannot preserve, refuse STAGE-ESM-044); semantic Host/executor support is separate |
38
38
  | Invokes-only trigger reads | Report-only, not protected state; direct production with reads refuses |
39
39
  | Generated values/responses | v7 binding/reference execution; v15 strategies/strict fixtures/freshness. Stage renders supported UUID/String strategies, responses and fixtures; unsupported types/combinations remain -028/-038 |
40
40
  | Sources/streams and command/specification routes | v8 binding/reference execution; the CLI (toolchain `references/renderable-subset.md`) reaches Stage checks through its bundled ceiling (v16 without v17 support) |
@@ -74,7 +74,7 @@ protection and unrecovered code. A pattern is not a gapless/sequential allocator
74
74
  or secret; check digits detect typos, not forgery. Low-entropy payload codes need
75
75
  uniqueness separate from source freshness. Arc recovery does not imply rendering:
76
76
  Requires Stage 4.118.0 for checksum validation and 4.119.0 for pattern/random;
77
- older renderers refuse them. `generate rule` still refuses STAGE-ESM-028.
77
+ older renderers refuse them. `generate rule` renders from Stage 4.136.0; the Host and legacy syntax engine still refuse it with STAGE-ESM-028.
78
78
  Report missing pins, withheld productions/scenarios and version caps
79
79
  as losses, not successful recovery. Sources: Arc
80
80
  `Documentation/backend/csharp/generating-a-screenplay.md`;
@@ -38,5 +38,5 @@ MCP `rules[]` and `derivedPattern` for rule proofs and reviewed PLAY0688 repair;
38
38
  never delete a business invariant to silence PLAY0689. Read
39
39
  [Stage admission](../../cratis-stage-rendering-and-sandbox/references/admission.md)
40
40
  for checksum validation and pattern/random rendering prerequisites.
41
- `generate rule` remains STAGE-ESM-028, so model admission does not promise rendering.
41
+ `generate rule` renders only from Stage 4.136.0 (STAGE-ESM-028 before it, and still in the Host), so model admission does not promise rendering.
42
42
  Sources: `Documentation/screenplay/generated-values/choosing.md` and `Documentation/screenplay/generated-values.md` in `Cratis/Screenplay`.
@@ -267,11 +267,11 @@ See read-surface `references/named-keys.md` for the collection-key exclusion alg
267
267
  | Query Validation rejection (ESM v18) | Exactly one queried call plus one `then error`, no other action/result/denial. Concept key/supplied filters validate after authorization in every version. Requires Screenplay 4.161.0 or later (`screenplay --version`); older runners may answer absence. |
268
268
  | Invocation refusal branches (ESM v19) | Ordered first-match `on refused` productions or acknowledgement, `$refusal` values; bare refusal excludes authorization. Requires Screenplay 4.160.0 or later (`screenplay --version`); older compilers report PLAY0268. |
269
269
  | Generated-concept rules (ESM v20) | Proven rules bind silently, Refuted PLAY0688 errors include a witness, Unproven PLAY0689 warnings include a reason; deterministic regex containment only, not passing samples. Fixtures obey shape and rules. Requires Screenplay 4.164.0 or later (`screenplay --version`); older compilers report PLAY0268. |
270
- | Finite generation and attachments (ESM v21) | String pattern with optional Luhn/Mod11/Mod97 checksum, inclusive Int random range, attached String generation rule with language-neutral Now/Tenant context and String result, String checksum validation. Requires Screenplay 4.172.0 (`screenplay --version`); older compilers report PLAY0268. PLAY0691 is support-budget exhaustion, PLAY0692 empty support on a scanned date. Pin date fixtures with given clock. Requires Stage 4.118.0 for checksum validation and 4.119.0 for pattern/random rendering; older renderers refuse them. `generate rule` remains STAGE-ESM-028; see command-surface `references/generated-values-and-responses.md`. |
270
+ | Finite generation and attachments (ESM v21) | String pattern with optional Luhn/Mod11/Mod97 checksum, inclusive Int random range, attached String generation rule with language-neutral Now/Tenant context and String result, String checksum validation. Requires Screenplay 4.172.0 (`screenplay --version`); older compilers report PLAY0268. PLAY0691 is support-budget exhaustion, PLAY0692 empty support on a scanned date. Pin date fixtures with given clock. Requires Stage 4.118.0 for checksum validation and 4.119.0 for pattern/random rendering; older renderers refuse them. current renderers render `generate rule` (the Host and legacy syntax engine keep STAGE-ESM-028); see command-surface `references/generated-values-and-responses.md`. |
271
271
  | Atomic reaction batches (ESM v22) | Root `reaction batches atomic`; direct productions per occurrence and selected refusal branches are separate batches, commands independent; Stage refuses v22 and atomic mode |
272
272
  | Described handlers (ESM v23) | Pending implementation beside unconditional produces; payload-only contract, reached body Unsupported ImplementationBody; Stage STAGE-IMPL-002 even Stub mode |
273
273
  | Ordinal text rules (ESM v24) | contains/not contains/starts with/ends with on scalar non-enum text properties; quoted literals, not conditions; Stage semantic engines execute/render |
274
- | Protected command reads (ESM v25) | Root `command reads protected`; eligible read paths in requirements and production mappings, absence Validation, concurrent matching facts Conflict; Stage admits v25; Cratis C# rendering refuses STAGE-ESM-044, semantic Host/executor execute admitted reads with non-Error protected requirements refused STAGE-ESM-045 |
274
+ | Protected command reads (ESM v25) | Root `command reads protected`; eligible read paths in requirements and production mappings, absence Validation, concurrent matching facts Conflict; Stage admits v25 and, in a new enough bundle, renders protected reads as Arc read protection, refusing unpreservable shapes and every older bundle with STAGE-ESM-044; semantic Host/executor execute admitted reads with non-Error protected requirements refused STAGE-ESM-045 |
275
275
  | Chronological command dates (ESM v26) | Same-primitive Date/DateTime `==`, `!=`, `>`, `>=`, `<`, `<=` in require/produces-when (property or literal RHS) and command/property rules (literal RHS only). DateTime uses UTC ticks, participating offset-less inputs reject Validation before rules; then matching stays ordinal. Requires Screenplay 4.199.0 (`screenplay --version`); older binders refuse PLAY0268. The Stage Host and executor run v26 (older Stage refuses STAGE-ESM-016); the renderer and legacy engines refuse STAGE-ESM-046 (toolchain `language-admission.md`). Read command-surface `references/date-comparisons.md`. |
276
276
  | Current routing and actor admission | Sources/streams and command/specification routes bind and reference-execute as v8; reaction `runs as system role` supplies the invocation actor as v10. Whole-workspace binding determines executable availability; CLI/Stage realization remains separate |
277
277
  | Blocks binding (`PLAY0268`) | enum/identity compliance and events combining personal or explicitly subject-scoped secret values with explicit subject marks; a compiler that stops before v13 refuses all `pii`/`secret` concepts ("compliance attributes require portable data-subject semantics"), while v13 binds them and Stage renders protection; attached command `handler` (PLAY0035 beside productions; pending described intent instead binds v23), bare `rule <Name>`, read paths without protected opt-in or in unsupported positions such as `produces when`, date comparisons with mixed primitives, optional condition operands, `$context`, protected read paths or `today`, date rules on concepts or reaction `where`, `$context.tenant`/claims/roles/causation in `produces`, `$env` conditions, `file` constraints, unquoted `import` of an external contract, a read model with neither explicit `key` nor unambiguous query-based identity as described above (several key marks bind as v27; older binders refuse PLAY0268; toolchain `language-admission.md`), queries with context `from` sources (typed query context is unadmitted), single-result filters (collections only), `scoped to` (opaque scope), `performer` (opaque implementation) or a `by` block on a list query or non-optional single result; optional keyed and collection queries, including caller-supplied equality filters and observable delivery, bind, `$causedBy` and templates in projections |
@@ -64,7 +64,7 @@ the problem, the checks it violates, the fix, all pinned to one declaration.
64
64
  | Undeclared removal/append event | `remove with` or capture `append` names an undeclared event | V1 warns (PLAY0166, a failure under warnings as errors); binding fails PLAY0273 | C (executable) / D | declare or fix the name; run V3 |
65
65
  | Gated command invoked by a reaction without a declared actor | reaction `invokes` a command under a caller policy and has no `runs as system role "<Role>"` that satisfies the gate | the invocation carries no caller: rejected at run time | D (major) | declare `runs as system role "<Role>"` with the least-privilege role the gate admits (ESM v10, Screenplay 4.125.0; Stage 4.89.1 renders role/authenticated trusted actors, but claim-reading/opaque gates still refuse STAGE-ESM-034 and need gap-fill) or record another trusted-path decision - never just delete the gate. A matching `runs as system role` is the admitted trusted path, not a defect |
66
66
  | `reads` + `produces` reaction | reaction both reads a view and produces | fails binding | C (executable) | invoke a command, or produce without reads |
67
- | Unadmitted read claimed protected | rule "checked" by legacy command or trigger reads | no protected contract or target realization | D (major) | opt eligible command reads into `command reads protected` (v25); inspect shape, absence and conflict cases. The Cratis C# renderer refuses protected reads (STAGE-ESM-044); distinguish reference/semantic-engine evidence from generated-app protection; checklist E3 |
67
+ | Unadmitted read claimed protected | rule "checked" by legacy command or trigger reads | no protected contract or target realization | D (major) | opt eligible command reads into `command reads protected` (v25); inspect shape, absence and conflict cases. the Cratis renderer renders protected reads as Arc read protection once the CLI bundles a Stage that supports it (older bundles refuse them with STAGE-ESM-044; releases in command-surface `references/protected-reads.md`); distinguish reference/semantic-engine evidence from generated-app protection; checklist E3 |
68
68
  | Caller-supplied state rule | `require currentStatus == "open"` where the caller sends `currentStatus` | the caller decides its own permission | D (major) | read authoritative stored state through admitted protected reads and `require`; mark legacy/refused shapes and target realization as gaps; checklist E3. Uuid ownership compares the caller with the stored owner (`require caller == Document.owner`, v28) |
69
69
  | `severity warning` as soft rule | rule meant to warn but still rejects | blocks valid requests | C semantics | remove or make it a real rule |
70
70
  | Relay events | `*Synced`, `*Forwarded` events that only move data | noise, not facts | D | translate once into a business fact |
@@ -123,7 +123,7 @@ the format in `worked-example.md`.
123
123
  |---|---|---|---|
124
124
  | E1 | Value formats on `concept`s; input rules on the command; uniqueness as `constraint`; access as `authorize` | declarations | D |
125
125
  | E2 | Every refusal has a message a person understands; constraint messages copied verbatim in specs | `message`, specs | D |
126
- | E3 | A state-dependent rule uses `reads` + `require` over authoritative state: eligible reads opt into `command reads protected` (v25), with required absence and decide/commit conflict cases. Legacy/refused reads are marked unenforced with a named target. The Cratis C# renderer refuses protected reads (STAGE-ESM-044); reference/semantic-engine evidence is not generated-app protection. An ownership rule compares the caller with the stored owner (`require caller == Document.owner`, Uuid equality, same concept on both sides, Requires Screenplay 4.205.0, ESM v28; ordering and Uuid validation rules stay PLAY0268). Not: caller-supplied copies of state, attestation booleans (`confirmsX == true`), rules in `handler` / `implementation hint` prose, or `reads` treated as protection | slice `description`, `require`, `handler` | D (faking or hiding = major) |
126
+ | E3 | A state-dependent rule uses `reads` + `require` over authoritative state: eligible reads opt into `command reads protected` (v25), with required absence and decide/commit conflict cases. Legacy/refused reads are marked unenforced with a named target. the Cratis renderer renders protected reads as Arc read protection once the CLI bundles a Stage that supports it (older bundles refuse them with STAGE-ESM-044; releases in command-surface `references/protected-reads.md`); reference/semantic-engine evidence is not generated-app protection. An ownership rule compares the caller with the stored owner (`require caller == Document.owner`, Uuid equality, same concept on both sides, Requires Screenplay 4.205.0, ESM v28; ordering and Uuid validation rules stay PLAY0268). Not: caller-supplied copies of state, attestation booleans (`confirmsX == true`), rules in `handler` / `implementation hint` prose, or `reads` treated as protection | slice `description`, `require`, `handler` | D (faking or hiding = major) |
127
127
  | E4 | `severity warning` is not used as "soft" validation (it still rejects) | validate lines | C semantics |
128
128
  | E5 | Preconditions are explicit; nothing relies on "obviously you can't" | descriptions, specs | Q |
129
129
  | E6 | Each invariant has an atomic enforcement point (name the storage provider where constraint admission matters); the race loser's outcome is specified | constraints, specs | D |
@@ -11,7 +11,7 @@ instruction for the work, not background reading. Skills that restate one cite i
11
11
  6. **Keep semantic identity independent of names, paths, layout and generated symbols.** Commit the identity catalog with the model.
12
12
  7. **Keep unsupported intent visible.** Return a precise gap and its owning issue; never weaken the model so rendering passes.
13
13
  8. **Write specifications with intent, including rejection and denial.** Never report an unexecuted or unsupported scenario as passed.
14
- 9. **Treat state reads as a correctness boundary.** Eligible command reads opt into `command reads protected` (v25); legacy/trigger reads remain unprotected. The Cratis C# renderer refuses protected reads (STAGE-ESM-044), not the v25 pair: reference absence/conflict guarantees, semantic-engine execution and generated-app protection are different claims.
14
+ 9. **Treat state reads as a correctness boundary.** Eligible command reads opt into `command reads protected` (v25); legacy/trigger reads remain unprotected. the Cratis renderer renders protected reads as Arc read protection once the CLI bundles a Stage that supports it (older bundles refuse them with STAGE-ESM-044; releases in command-surface `references/protected-reads.md`), and the v25 pair is a separate admission: reference absence/conflict guarantees, semantic-engine execution and generated-app protection are different claims.
15
15
  10. **Separate event-source identity from event payload and choose destinations explicitly.**
16
16
  11. **Persisted event shape changes are evolution, never cleanup.** Keep historical generations.
17
17
  12. **Model external work as business intent.** Provider interfaces and transport mechanics stay out of the language.
@@ -21,7 +21,7 @@ speaks in them; never model board mechanics (lanes, node ids, positions).
21
21
  | Storyline (ordered beats) | a **family** of specifications sharing example data, each one transition (no storyline syntax) | 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 | `command reads protected` + eligible `reads`/`require` (v25 reference protection); legacy/refused reads remain stated intent. The Cratis C# renderer refuses protected reads (STAGE-ESM-044); semantic-engine execution is separate from generated-app protection. Target Arc `[ProtectedDecision]` + `DecisionRead<T>` or Chronicle DCB needs separate verification | decision over a guarded read | command validation |
24
+ | Precondition on stream state | `command reads protected` + eligible `reads`/`require` (v25 reference protection); legacy/refused reads remain stated intent. the Cratis renderer renders protected reads as Arc read protection once the CLI bundles a Stage that supports it (older bundles refuse them with STAGE-ESM-044; releases in command-surface `references/protected-reads.md`); semantic-engine execution is separate from generated-app protection. Target Arc `[ProtectedDecision]` + `DecisionRead<T>` or Chronicle DCB needs separate verification | 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 |
@@ -76,7 +76,7 @@ noncollection sources of compatible nominal types, not literals. Neither execute
76
76
  over a composite view in the usual way:
77
77
 
78
78
  - A command `reads … by` without the application-root `command reads protected`
79
- preamble is PLAY0271. With the preamble it is PLAY0781 (reason ByParts), PLAY0782
79
+ preamble is PLAY0271. With the preamble it is PLAY0781 (reason `by-parts`), PLAY0782
80
80
  first when the command has no `identifier`, and PLAY0273 when the key is not an
81
81
  input property.
82
82
  - A trigger `reads … by` binds when the reaction only invokes commands (information
@@ -214,12 +214,17 @@ Projections on a composite-keyed read model admit only root `from` and `remove w
214
214
  Joins, `children`, `remove via join`, `every`, `all`, `nested`, `clear with`,
215
215
  `variant` and reducers are PLAY0268. This is not ESM v10 admission.
216
216
 
217
- Stage does not admit v27: it refuses the whole model with `STAGE-ESM-016`, so
218
- `cratis render` cannot deliver it. Verify and reference-test the model with the
217
+ Requires Stage 4.137.0 for v27 admission (older Stage refuses the whole model with
218
+ `STAGE-ESM-016`). The semantic Host runs composite-keyed read models and the CLI's `cratis run`
219
+ default engine runs them (Requires Cratis CLI 3.75.0); the legacy `eventmodel` engine and the specification
220
+ executor refuse them. Rendering refuses a read model with several key parts or a projection keyed by
221
+ parts (`STAGE-ESM-048`) and a single-instance query by parts (`STAGE-ESM-047`, pending Chronicle#4265),
222
+ and publishes nothing, so `cratis render` cannot deliver it. Verify and reference-test the model with the
219
223
  standalone compiler, then hand the delivery to gap-fill
220
- (`cratis-screenplay-render-and-gap-fill`) with the model as the contract.
224
+ (`cratis-screenplay-render-and-gap-fill`) with the model as the contract. Composite-keyed read models get
225
+ no conventional `Get<ReadModel>ById` query.
221
226
  Eligible command reads separately opt into v25 with `command reads protected`;
222
- a composite lookup there is still refused (PLAY0781 ByParts). See command-surface
227
+ a composite lookup there is still refused (PLAY0781 reason `by-parts`). See command-surface
223
228
  [protected reads](../../cratis-screenplay-command-surface/references/protected-reads.md).
224
229
 
225
230
  ## Repairs and evidence
@@ -67,7 +67,7 @@ refused reactions, captures and Translate slices remain gap-fill.
67
67
  Models with event sources, streams or command routes bind and reference-execute as ESM v8 on the standalone
68
68
  tool, so report V3 and V4 from that tool. The CLI/Stage pair
69
69
  (`cratis-screenplay-toolchain/references/renderable-subset.md`) reaches v8 route checks
70
- and construct admission through v26 (Requires Cratis CLI 3.74.0; older bundles stop earlier). Public/foreign events and production overrides
70
+ and construct admission through v27 (Requires Cratis CLI 3.75.0; older bundles stop earlier, v28 is `CLI-RENDER-004`). Public/foreign events and production overrides
71
71
  still refuse; semantic reaction/reducer filters and role/authenticated `runs as` render.
72
72
  Claim-reading/opaque system gates, legacy actor/filter paths and mixed effects still refuse. Keep refused scope as case A/C,
73
73
  never infer target support from binding. Read Stage's `references/admission.md` and
@@ -163,7 +163,7 @@ Adapters and non-renderable scope follow the contract rules of `cratis-applicati
163
163
  - `description` and `documentation` reach rendered code only as XML documentation comments (Stage#178),
164
164
  never as behavior. A rule stated only in prose is unenforced: fallback record entry or target requirement,
165
165
  never "delivered".
166
- - The `cratis run` sandbox's default engine enforces only simple literal validation rules and no
166
+ - The `cratis run` sandbox's legacy EventModel engine (the default engine before CLI 3.73.0) enforces only simple literal validation rules and no
167
167
  authorization; it is no evidence for denial behaviour or for any other rule.
168
168
  - Never remove `pii`, `secret`, authorization or rules to get a render through; report the gap.
169
169
  - Stop and ask only on a genuine contradiction between model, specs, descriptions and declared
@@ -108,11 +108,12 @@ reaction or drop an effect to dodge rendering.
108
108
  Preserve declared `reaction batches atomic` boundaries: each trigger occurrence's
109
109
  direct productions and each selected refusal branch are separate batches, with
110
110
  invoked commands independent. Stage refuses v22 (STAGE-ESM-016) and atomic mode
111
- in admitted v23–v26 (STAGE-ESM-043); the declaration is not external-effect deduplication.
111
+ in admitted v23–v27 (STAGE-ESM-043); the declaration is not external-effect deduplication.
112
112
  For described handlers, hand off only payload computation under the v23 result
113
113
  contract; Stage STAGE-IMPL-002 means no stubs, even Stub mode. Protected v25 reads
114
- refuse Cratis C# rendering with STAGE-ESM-044 despite version admission and need
115
- generated-app admission/enrollment tests; ordinary injection never supplies protection.
114
+ render from Stage 4.138.0 (STAGE-ESM-044 from older bundles, or for shapes it cannot
115
+ preserve) and need generated-app admission/enrollment tests wherever you hand-write them;
116
+ ordinary injection never supplies protection.
116
117
  Semantic Host/executor support is a separate result, not generated-app enforcement.
117
118
 
118
119
  ## Re-delivery
@@ -31,7 +31,7 @@ ESM). Only the probe answers renderability. `PLAY0270` entries are information,
31
31
  | Class | Meaning | Typical examples (each verified in `admission.md`) | Action |
32
32
  | --- | --- | --- | --- |
33
33
  | **Model fix (in mode)** | the model is in, or the user chose, renderable mode and breaks its own subset in a way that has a renderable equivalent with the same meaning | a `produces` whose `for` is not the command identifier; two projections for one read model (`-007`); a policy Stage cannot express portably (`-015`; role-only and opaque pure policies render) | edit request to the modeler session with address, change and rationale |
34
- | **Capability gap** | the intended meaning needs a construct Stage does not render yet | DateTime equality filters and required parameters after optional filters (`-010`); context/single-result filters, opaque `scoped to`/`performer` and a list-query `by` block remain PLAY0268; a read model with several key parts (v27) refuses `STAGE-ESM-016`; Translate, clocks, captures, non-event triggers and opaque reaction bodies (`-024`); claim-reading/opaque `runs as` gates (`-034`), legacy `from` (`-035`), mixed effects in one handler (`-037`, retries can duplicate events; keep it whole), unsupported reaction mappings (`-039`); unsupported generated types/result combinations (`-028`/`-038`); `then no readmodel` (`-027`); evolved events (`STAGE-ESM-026`); unsupported expression/enum production conditions (`-006`; supported conditional productions render); legacy reads (`PLAY0271`), protected-read rendering (STAGE-ESM-044 despite v25 admission; semantic Host/executor support is separate); code validation (`-005`); protected identities/enums (`-040`) or unadmitted explicit subject lineage (`PLAY0268`); attached command handlers (PLAY0268), described handlers (v23, STAGE-IMPL-002 even Stub mode), atomic mode (STAGE-ESM-016 for v22, STAGE-ESM-043 in admitted v23–v26) | keep the model; fallback record entry; options a to c in `SKILL.md`; link the Stage issue |
34
+ | **Capability gap** | the intended meaning needs a construct Stage does not render yet | DateTime equality filters and required parameters after optional filters (`-010`); context/single-result filters, opaque `scoped to`/`performer` and a list-query `by` block remain PLAY0268; a read model with several key parts or a projection keyed by parts (v27) refuses `STAGE-ESM-048` and a single-instance query by parts `STAGE-ESM-047` (Chronicle#4265); Translate, clocks, captures, non-event triggers and opaque reaction bodies (`-024`); claim-reading/opaque `runs as` gates (`-034`), legacy `from` (`-035`), mixed effects in one handler (`-037`, retries can duplicate events; keep it whole), unsupported reaction mappings (`-039`); unsupported generated types/result combinations (`-028`/`-038`); `then no readmodel` (`-027`); evolved events (`STAGE-ESM-026`); unsupported expression/enum production conditions (`-006`; supported conditional productions render); legacy reads (`PLAY0271`), protected reads the renderer cannot preserve, or any protected read in an older CLI bundle (STAGE-ESM-044 despite v25 admission; semantic Host/executor support is separate); code validation (`-005`); protected identities/enums (`-040`) or unadmitted explicit subject lineage (`PLAY0268`); attached command handlers (PLAY0268), described handlers (v23, STAGE-IMPL-002 even Stub mode), atomic mode (STAGE-ESM-016 for v22, STAGE-ESM-043 in admitted v23–v27) | keep the model; fallback record entry; options a to c in `SKILL.md`; link the Stage issue |
35
35
  | **Tool skew** | the bundled compiler disagrees with documented semantics | the false `PLAY0285` on reaction cascades from an older bundle; codes the standalone compiler does not raise | record in the session state and the fallback record; never "fix" a correct model |
36
36
  | **Environment** | not the model | restore failures, missing SDK, a destination that is not writable | fix the environment or report blocked |
37
37
 
@@ -39,6 +39,7 @@ Requires Stage 4.129.0 for semantic Host/executor protected reads; older engines
39
39
  refuse STAGE-ESM-044. Non-Error protected requirements refuse STAGE-ESM-045, including
40
40
  reaction invocations. A semantic-engine pass does not resolve the rendering gap;
41
41
  read [sandbox boundaries](../../cratis-stage-rendering-and-sandbox/references/sandbox-and-specrunner.md#protected-command-reads).
42
+ Requires Stage 4.138.0 for the Cratis renderer to render protected reads.
42
43
 
43
44
  ## Triage rules
44
45
  - A capability gap never becomes a model fix by deleting meaning. Turning a list screen into a
@@ -4,7 +4,7 @@ This is a legacy control without `command reads protected`; the unprotected-read
4
4
  markers below describe that control, not all command reads. Eligible views can opt
5
5
  into v25; the date-rule blocker still remains. Read
6
6
  [protected reads](../../cratis-screenplay-command-surface/references/protected-reads.md)
7
- for admission and the Cratis C# renderer's protected-read refusal (STAGE-ESM-044).
7
+ for admission and protected-read rendering (Stage 4.138.0; STAGE-ESM-044 otherwise).
8
8
 
9
9
  Complete, compiled design-mode model (marina guest berths) showing a coverage matrix turned into specifications: happy path, one rejection per rule, authorization denial, duplicate and retry, competing claim, state violation, alternative branches, compensation and a view lifecycle family. The matrix for it is in `coverage-matrix.md`; the catalogue (`scenario-catalogue.md`) names its specifications.
10
10
 
@@ -3,8 +3,8 @@
3
3
  **Legacy control without `command reads protected`, not binding-ready by design.**
4
4
  Read [protected reads](../../cratis-screenplay-command-surface/references/protected-reads.md)
5
5
  for the opt-in alternative. Do not insert the preamble blindly: every read must meet
6
- finite event-source-keyed admission with removals. A v25 reference pass still does not
7
- render protected reads: Stage admits v25 but the Cratis C# renderer refuses them with STAGE-ESM-044. The comments and unenforced markers below describe
6
+ finite event-source-keyed admission with removals. A v25 reference pass is not
7
+ rendering: Stage admits v25 and renders protected reads from 4.138.0, and older bundles refuse them with STAGE-ESM-044. The comments and unenforced markers below describe
8
8
  this legacy control, not a general limit on command reads.
9
9
 
10
10
  **Design mode.** This document states the stored-state rules of the
@@ -102,8 +102,8 @@ name them as unfinished.
102
102
  matching value. Both are needed. Ownership checks on text, Uuid, Date and DateTime subjects render;
103
103
  other subjects are STAGE-ESM-015: note it.
104
104
  - Traps: `then error` for a denial; a denial spec whose inputs also break a rule (it still
105
- denies, but reads ambiguously); trusting a `cratis run` sandbox answer (the default engine enforces no authorization;
106
- the opt-in semantic engine enforces both but reads forgeable caller headers, so it is no security boundary); counting another command's denial.
105
+ denies, but reads ambiguously); trusting a `cratis run` sandbox answer (the legacy EventModel engine enforces no authorization;
106
+ the semantic engine, `cratis run`'s default from CLI 3.73.0, enforces both but reads forgeable caller headers, so it is no security boundary); counting another command's denial.
107
107
 
108
108
  ## 4. State violation
109
109
  - Ask: "After which earlier facts must this request be refused?"
@@ -39,8 +39,8 @@ Typed example/override forms: `cratis-screenplay-specifications`
39
39
  | Bodied rules, code policies | spec them | spec reported **unsupported**, never passed | no |
40
40
  | Pending described command handlers (v23) | specify intent | binds; denial/validation execute, body-reaching specs Unsupported ImplementationBody; all-Unsupported is not green | STAGE-IMPL-002 even Stub mode |
41
41
  | Attached command handlers, `file` constraints, query `performer`s | spec them in design | blocked: PLAY0268 at binding, no spec runs (V3 blocked) | no |
42
- | Atomic reaction mode (v22) | declare for new models | failed batch adds no facts or view changes; earlier batches/commands remain; `then error` alone is insufficient | v22 STAGE-ESM-016; mode in admitted v23–v26 STAGE-ESM-043 |
43
- | Protected command reads (v25) | declare opt-in for eligible reads | absence Validation; matching intervening facts Conflict; race vectors are not a new spec construct | Cratis C# rendering STAGE-ESM-044; semantic Host/executor execute admitted reads, non-Error protected requirements STAGE-ESM-045; v25 pair admitted |
42
+ | Atomic reaction mode (v22) | declare for new models | failed batch adds no facts or view changes; earlier batches/commands remain; `then error` alone is insufficient | v22 STAGE-ESM-016; mode in admitted v23–v27 STAGE-ESM-043 |
43
+ | Protected command reads (v25) | declare opt-in for eligible reads | absence Validation; matching intervening facts Conflict; race vectors are not a new spec construct | Cratis C# rendering in a new enough bundle (STAGE-ESM-044 before, or for unpreservable shapes); semantic Host/executor execute admitted reads, non-Error protected requirements STAGE-ESM-045; v25 pair admitted |
44
44
 
45
45
  Requires Screenplay 4.105.0 or later (`screenplay --version`) for list-query specifications, and 4.143.0 or later for collection equality filters (ESM v14).
46
46
 
@@ -20,7 +20,7 @@ protected decisions. Gap-fill must use an admitted projection/key shape and acti
20
20
  unit-of-work enrollment; do not edit managed dependencies. Keep the `.play` rule
21
21
  target enforcement separate from reference semantics until target tests verify it.
22
22
  Read [protected command reads](../../cratis-screenplay-command-surface/references/protected-reads.md)
23
- for admission and the Cratis C# renderer's protected-read refusal (STAGE-ESM-044); never remove protection to obtain rendering. Forbidden: caller-supplied copies of state in `require`, boolean attestation
23
+ for admission and protected-read rendering (Stage 4.138.0; STAGE-ESM-044 otherwise); never remove protection to obtain rendering. Forbidden: caller-supplied copies of state in `require`, boolean attestation
24
24
  inputs (`confirmsX == true`), rules in `handler` / implementation-hint prose.
25
25
 
26
26
  ## Authorization is executable
@@ -5,7 +5,7 @@ One complete legacy design-mode control for `cratis-screenplay-slice-design`, wi
5
5
  specification runs here. List queries and clock fixtures bind on an admitting compiler;
6
6
  they are not the remaining blocker. Personas and screens are informational.
7
7
  Eligible command reads can opt into v25; inspect every projection/key/removal before
8
- migration and retain the Cratis C# renderer's separate refusal (STAGE-ESM-044; the v25 pair itself is admitted). Read
8
+ migration and keep the separate rendering result (Stage 4.138.0 renders protected reads, STAGE-ESM-044 otherwise; the v25 pair itself is admitted). Read
9
9
  [protected reads](../../cratis-screenplay-command-surface/references/protected-reads.md).
10
10
  The unenforced descriptions below refer to this legacy control, not all command reads.
11
11
  The specifications still seed every read-model source (`LockerInstalled`, `LockerRequested`,
@@ -30,8 +30,8 @@ secret safety. Client-minted IDs stay inputs; gapless invoice numbering needs an
30
30
  allocator, not a random fixture or pattern. Check digits catch typos, not forgery;
31
31
  short payload codes need uniqueness enforcement separate from source freshness.
32
32
  Pattern/random/rule and checksum validation bind as v21. Stage renders
33
- pattern/random/checksum under the version gates below; `generate rule` remains
34
- STAGE-ESM-028. Generated secrets remain refused. Source: Screenplay
33
+ pattern/random/checksum under the version gates below; `generate rule` renders in a new
34
+ enough bundle (the Host and legacy syntax engine refuse it with STAGE-ESM-028). Generated secrets remain refused. Source: Screenplay
35
35
  `Documentation/screenplay/generated-values/choosing.md`.
36
36
 
37
37
  ## Fixtures and outcomes
@@ -106,4 +106,4 @@ Requires Stage 4.95.0 for command clock specs and 4.109.0 for v20 rule-bearing p
106
106
  Requires Stage 4.115.0 for v21 admission/all-Proven unpinned rendering, 4.117.0
107
107
  for warning/info generated-concept rules, 4.118.0 for checksum validation and
108
108
  4.119.0 for pattern/random. Older renderers require rule-bearing pins or refuse
109
- the respective rules/strategies with -038/-042/-028. `generate rule` remains -028.
109
+ the respective rules/strategies with -038/-042/-028. `generate rule` renders in a new enough bundle.
@@ -114,7 +114,7 @@ Unattended work takes the conservative option and marks it `ASSUMED` in model
114
114
  conflict. Legacy reads remain PLAY0271/PLAY0268; `concurrency` remains unbound and
115
115
  combining it with protected reads is PLAY0783. Read
116
116
  [protected reads](../cratis-screenplay-command-surface/references/protected-reads.md)
117
- for admission and the Cratis C# renderer's STAGE-ESM-044 protected-read refusal (the v25 pair itself is admitted). `description` text never reaches rendered code: a rule that lives only in prose is
117
+ for admission and protected-read rendering (Stage 4.138.0; STAGE-ESM-044 otherwise; the v25 pair itself is admitted). `description` text never reaches rendered code: a rule that lives only in prose is
118
118
  unenforced there.
119
119
  - `pii` and `secret` bind as ESM v13;
120
120
  enum/identity compliance and protected events with explicit subject marks still
@@ -147,7 +147,7 @@ Requires Chronicle 19.59.6 or later (19.59.3 for the InMemory provider) for the
147
147
  - New models declare `reaction batches atomic`: direct productions per trigger
148
148
  occurrence and each selected refusal branch are separate batches; invoked commands
149
149
  stay independent. Legacy absence retains per-fact appends. Stage refuses v22
150
- with STAGE-ESM-016 and atomic mode in admitted v23–v26 with STAGE-ESM-043. Read
150
+ with STAGE-ESM-016 and atomic mode in admitted v23–v27 with STAGE-ESM-043. Read
151
151
  [atomic boundaries](../cratis-screenplay-captures-and-reactions/references/atomic-batches-and-source-mappings.md)
152
152
  when defining failure rollback; batching is not redelivery deduplication.
153
153
  - Match duplicate protection to scope. A property constraint lets a source re-claim its own