@cratis/pi 7.69.1 → 7.70.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (52) hide show
  1. package/package/corpus/hooks/scripts/cratis-check-pr.mjs +17 -10
  2. package/package/corpus/product-sync.json +7 -7
  3. package/package/corpus/skills/cratis-arc-command/references/generated-values.md +3 -1
  4. package/package/corpus/skills/cratis-arc-command/references/shop-generation.md +2 -2
  5. package/package/corpus/skills/cratis-screenplay-automations-and-translations/SKILL.md +1 -1
  6. package/package/corpus/skills/cratis-screenplay-automations-and-translations/references/audit-format.md +1 -1
  7. package/package/corpus/skills/cratis-screenplay-automations-and-translations/references/realization-and-gap-fill.md +1 -1
  8. package/package/corpus/skills/cratis-screenplay-captures-and-reactions/SKILL.md +1 -1
  9. package/package/corpus/skills/cratis-screenplay-captures-and-reactions/references/atomic-batches-and-source-mappings.md +1 -1
  10. package/package/corpus/skills/cratis-screenplay-command-surface/SKILL.md +3 -3
  11. package/package/corpus/skills/cratis-screenplay-command-surface/references/generated-values-and-responses.md +4 -4
  12. package/package/corpus/skills/cratis-screenplay-command-surface/references/protected-reads.md +34 -7
  13. package/package/corpus/skills/cratis-screenplay-command-surface/references/shop-generation.md +2 -2
  14. package/package/corpus/skills/cratis-screenplay-event-modeling/SKILL.md +3 -3
  15. package/package/corpus/skills/cratis-screenplay-event-modeling/references/parsed-not-runnable.md +1 -1
  16. package/package/corpus/skills/cratis-screenplay-legacy-extraction/references/generated-recovery.md +1 -1
  17. package/package/corpus/skills/cratis-screenplay-model-authoring/references/choosing-generation.md +1 -1
  18. package/package/corpus/skills/cratis-screenplay-model-authoring/references/language-reference.md +2 -2
  19. package/package/corpus/skills/cratis-screenplay-model-review/references/anti-patterns.md +1 -1
  20. package/package/corpus/skills/cratis-screenplay-model-review/references/checklist.md +1 -1
  21. package/package/corpus/skills/cratis-screenplay-modeling-lifecycle/references/principles.md +1 -1
  22. package/package/corpus/skills/cratis-screenplay-modeling-lifecycle/references/vocabulary-map.md +1 -1
  23. package/package/corpus/skills/cratis-screenplay-read-surface/references/named-keys.md +10 -5
  24. package/package/corpus/skills/cratis-screenplay-render-and-gap-fill/SKILL.md +2 -2
  25. package/package/corpus/skills/cratis-screenplay-render-and-gap-fill/references/gap-fill-handoff.md +4 -3
  26. package/package/corpus/skills/cratis-screenplay-render-and-gap-fill/references/renderability-gate.md +2 -1
  27. package/package/corpus/skills/cratis-screenplay-scenario-coverage/references/berth-reservations.md +1 -1
  28. package/package/corpus/skills/cratis-screenplay-scenario-coverage/references/invoicing-dues-design.md +2 -2
  29. package/package/corpus/skills/cratis-screenplay-scenario-coverage/references/scenario-catalogue.md +2 -2
  30. package/package/corpus/skills/cratis-screenplay-scenario-coverage/references/spec-forms-by-mode.md +2 -2
  31. package/package/corpus/skills/cratis-screenplay-slice-design/references/rule-layers.md +1 -1
  32. package/package/corpus/skills/cratis-screenplay-slice-design/references/worked-example.md +1 -1
  33. package/package/corpus/skills/cratis-screenplay-specifications/references/generated-fixtures.md +3 -3
  34. package/package/corpus/skills/cratis-screenplay-streams-and-consistency/SKILL.md +2 -2
  35. package/package/corpus/skills/cratis-screenplay-streams-and-consistency/references/consistency-and-concurrency.md +2 -2
  36. package/package/corpus/skills/cratis-screenplay-streams-and-consistency/references/read-model-keys.md +3 -3
  37. package/package/corpus/skills/cratis-screenplay-streams-and-consistency/references/streams-example.md +1 -1
  38. package/package/corpus/skills/cratis-screenplay-toolchain/SKILL.md +2 -2
  39. package/package/corpus/skills/cratis-screenplay-toolchain/references/cheat-sheet.md +1 -1
  40. package/package/corpus/skills/cratis-screenplay-toolchain/references/diagnostic-arguments.md +8 -0
  41. package/package/corpus/skills/cratis-screenplay-toolchain/references/diagnostics.md +13 -10
  42. package/package/corpus/skills/cratis-screenplay-toolchain/references/executable-subset.md +4 -5
  43. package/package/corpus/skills/cratis-screenplay-toolchain/references/language-admission.md +9 -8
  44. package/package/corpus/skills/cratis-screenplay-toolchain/references/renderable-subset.md +12 -8
  45. package/package/corpus/skills/cratis-screenplay-toolchain/references/traps.md +1 -1
  46. package/package/corpus/skills/cratis-stage-rendering-and-sandbox/SKILL.md +16 -12
  47. package/package/corpus/skills/cratis-stage-rendering-and-sandbox/references/admission.md +19 -15
  48. package/package/corpus/skills/cratis-stage-rendering-and-sandbox/references/behavior-walk.md +4 -3
  49. package/package/corpus/skills/cratis-stage-rendering-and-sandbox/references/choosing-generation.md +1 -1
  50. package/package/corpus/skills/cratis-stage-rendering-and-sandbox/references/sandbox-and-specrunner.md +9 -9
  51. package/package/corpus/skills/cratis-stage-rendering-and-sandbox/verification.json +2 -2
  52. package/package.json +1 -1
@@ -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
@@ -58,7 +58,7 @@ observed legacy check from verified atomic protection.
58
58
  | a value across all sources | `unique <prop> on <Event>` | value owned by one source; same source may re-claim |
59
59
  | a fact at most once per source; mutually exclusive facts | `unique event` (+ `released by`) | covers simple lifecycle transitions |
60
60
  | state-dependent rule (balance, capacity, "only if approved") | eligible `reads` + `require` under `command reads protected` (v25) | required absence rejects; matching intervening facts conflict. Payload-key fan-in, joins, reducers and other refused shapes remain target gaps |
61
- | a view (read model) | unguarded materialized reads are not protection | legacy command and trigger reads remain unprotected; the Cratis C# renderer refuses protected reads (STAGE-ESM-044); semantic Host/executor evidence is not generated-app protection |
61
+ | a view (read model) | unguarded materialized reads are not protection | legacy command and trigger reads remain unprotected; protected-read rendering needs Stage 4.138.0 (STAGE-ESM-044 otherwise); semantic Host/executor evidence is not generated-app protection |
62
62
 
63
63
  ## 3. Record each state-dependent rule that the model cannot enforce
64
64
  Never accept the caller's copy of the state: `currentStatus Status` on the command with
@@ -69,7 +69,7 @@ the rule unenforced in rendered scope.
69
69
 
70
70
  First inspect [protected reads](../../cratis-screenplay-command-surface/references/protected-reads.md):
71
71
  opt eligible command reads into v25, retain absence/conflict specifications and verify
72
- target consistency separately. Stage admits v25 but the Cratis C# renderer refuses protected reads (STAGE-ESM-044).
72
+ target consistency separately. Stage admits v25 and renders protected reads from 4.138.0 (STAGE-ESM-044 otherwise).
73
73
  Semantic Host/executor support has separate severity and outside-append limits. A payload-keyed
74
74
  fan-in such as the course-capacity example remains refused; the preamble is not a
75
75
  blanket admission of arbitrary projections.
@@ -36,11 +36,11 @@ composite type only to carry flat parts: both hide the identity the model should
36
36
  refuse the duplicate (`references/consistency-and-concurrency.md`).
37
37
  - **Lookups.** An optional single-instance query names every part in a `by` block; a list
38
38
  uses equality filters. A command or reaction that must read the view by parts is refused
39
- (PLAY0271, PLAY0781 ByParts, or PLAY0268 for a producing reaction), so decide on a stream
39
+ (PLAY0271, PLAY0781 reason `by-parts`, or PLAY0268 for a producing reaction), so decide on a stream
40
40
  the command owns instead, or restructure the read. Do not drop the read to bind.
41
41
  - **Limits.** Joins, `children`, `nested`, `every`, `all`, `variant` and reducers on the
42
- composite-keyed view are PLAY0268. Stage refuses v27 with STAGE-ESM-016, so deliver it
43
- through gap-fill with the model as the contract.
42
+ composite-keyed view are PLAY0268. Stage 4.137.0 admits v27 but the renderer refuses it (STAGE-ESM-048 for several key parts or a projection keyed by parts,
43
+ STAGE-ESM-047 for a single-instance query by parts), so deliver it through gap-fill with the model as the contract.
44
44
 
45
45
  Read read-surface `references/named-keys.md` for one complete executable example and the
46
46
  projections skill `references/pdl-grammar.md` for the key block syntax.
@@ -4,7 +4,7 @@ Legacy control: no `command reads protected` preamble is declared. The course-ca
4
4
  payload-key fan-in remains refused even with opt-in; eligible active-enrolment reads
5
5
  can protect under v25, but reads plus concurrency cannot combine (PLAY0783). 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). The legacy diagnostics below describe this
7
+ for admission and protected-read rendering (Stage 4.138.0; STAGE-ESM-044 otherwise). The legacy diagnostics below describe this
8
8
  control, not a blanket refusal of command reads.
9
9
 
10
10
  A complete design-mode model for course enrolment. It shows one business identity per stream,
@@ -74,7 +74,7 @@ superseded statement needs context; exceptions do not change the contract.
74
74
 
75
75
  Read `references/verdicts.md` for exact commands, exit codes, the MCP roots caveat and the model notes gate.
76
76
 
77
- Requires Cratis CLI 3.57.0 or later (`cratis --version`) to render models that use equality filters or concept generation strategies (ESM v14 and v15); an older CLI answers `CLI-RENDER-004`. Requires Cratis CLI 3.74.0 for ESM v21–v26; above the CLI's ceiling, a bundled compiler that binds the construct answers `CLI-RENDER-004`, and one that predates it reports the binder's PLAY0268 (Uuid equality before Screenplay 4.205.0). Either way keep the rule and gap-fill.
77
+ Requires Cratis CLI 3.57.0 or later (`cratis --version`) to render models that use equality filters or concept generation strategies (ESM v14 and v15); an older CLI answers `CLI-RENDER-004`. Requires Cratis CLI 3.74.0 for ESM v21–v26 and 3.75.0 for v27 (v28 and later: `CLI-RENDER-004`); above the CLI's ceiling, a bundled compiler that binds the construct answers `CLI-RENDER-004`, and one that predates it reports the binder's PLAY0268 (Uuid equality before Screenplay 4.205.0). Either way keep the rule and gap-fill.
78
78
 
79
79
  MCP calls below use the `screenplay` server declared in `.cratis/ai/mcp-servers.json`, for example `screenplay` → `read-workspace`.
80
80
 
@@ -145,7 +145,7 @@ changes with the root folder name.
145
145
  (Requires Screenplay 4.205.0; `screenplay --version`; older binders refuse PLAY0268).
146
146
  Read [language admission](references/language-admission.md) and command-surface
147
147
  `references/uuid-equality.md`.
148
- - **v22–v26:** read [language admission](references/language-admission.md) for atomic
148
+ - **v22–v27:** read [language admission](references/language-admission.md) for atomic
149
149
  batches, described handlers, text rules, protected reads, chronological command
150
150
  Date/DateTime comparisons (Requires Screenplay 4.199.0; `screenplay --version`;
151
151
  older binders refuse PLAY0268) and Stage refusals.
@@ -211,7 +211,7 @@ generated source destinations need freshness. Read
211
211
  [Stage admission](../../cratis-stage-rendering-and-sandbox/references/admission.md)
212
212
  for v21 admission, all-Proven unpinned specs and the separate prerequisites for
213
213
  warning/info rules, checksum validation and pattern/random rendering.
214
- `generate rule` remains STAGE-ESM-028. Reference binding is not rendering.
214
+ `generate rule` renders from Stage 4.136.0 (STAGE-ESM-028 in the Host). Reference binding is not rendering.
215
215
 
216
216
  ## Specification forms
217
217
  Full list with semantics: `Documentation/screenplay/specifications.md`. Compiled in the
@@ -49,6 +49,10 @@ a separate `case` names an expansion. Argument order is immaterial.
49
49
  | PLAY0524 | `specification` (declaration), `step` (keyword), `stepIndex` (index), `property`, `type`, `example?`, `case?`, `parameter?` |
50
50
  | PLAY0525, PLAY0526 | `example` |
51
51
  | PLAY0583 | `case?`, `parameter?`, `type?`, `text?` |
52
+ | PLAY0781 | `command` (declaration), `read`, `readModel` (declaration), `reason` (keyword) |
53
+ | PLAY0782 | `command` (declaration), `read` |
54
+ | PLAY0783 | `command` (declaration) |
55
+ | PLAY0784, PLAY0785 | `command` (declaration), `read`, `path` |
52
56
  | PLAY0790, PLAY0794, PLAY0799 | `profile`, `template`, `blueprint?` |
53
57
  | PLAY0791 | `profile`, `template` (the layout name) |
54
58
  | PLAY0792 | `profile`, `template`, `blueprint` |
@@ -57,6 +61,10 @@ a separate `case` names an expansion. Argument order is immaterial.
57
61
  | PLAY0796 | `profile`, `template`, `blueprint?`, `option` |
58
62
  | PLAY0797 | `profile`, `value` |
59
63
 
64
+ PLAY0781–PLAY0785 need Screenplay 4.207.0; earlier compilers omit these arguments. `read` is the alias when the
65
+ command gives one, else the read model name. The PLAY0781 `reason` keywords are listed in command-surface
66
+ [protected reads](../../cratis-screenplay-command-surface/references/protected-reads.md); each refused read gets its own PLAY0781.
67
+
60
68
  For PLAY0524, `step` is given, given readmodel, when, when append or then.
61
69
  `stepIndex` counts every authored given/when/then clause once across all forms,
62
70
  not nested lines, synthesized callers or defaults. Example/case expansion retains
@@ -352,25 +352,28 @@ refusal reasons. Read [language admission](language-admission.md) before changin
352
352
  | PLAY0698 | Pending intent plus another handler; retain one |
353
353
  | PLAY0699 | Pattern outside portable dialect or over 1,000 UTF-16 units / 3,000 expanded nodes; rewrite the refused construct |
354
354
  | PLAY0780 | Invalid placement/repetition of `command reads protected`; declare once at root |
355
- | PLAY0781 | Protected read shape/key refused; inspect the closed reason, never downgrade to an unguarded read |
355
+ | PLAY0781 | Protected read shape/key refused; read the typed `reason` argument (see `diagnostic-arguments.md` for the compiler prerequisite), never downgrade to an unguarded read |
356
356
  | PLAY0782 | Omitted `by` without command identifier; declare the lookup input |
357
357
  | PLAY0783 | Command combines reads and concurrency; choose the intended boundary |
358
358
  | PLAY0784 | Unknown read/property path; reference a declared read or alias |
359
359
  | PLAY0785 | Ambiguous view path; use distinct aliases on repeated reads |
360
360
  | PLAY0786 (I) | Eligible legacy model; preview typed preamble repair, individually review absence/conflict semantics |
361
361
  | PLAY0787 (W) | Exact deprecated Studio text-rule pattern; repair to literal rule or equality, preserving message/severity |
362
- | STAGE-ESM-043 | Atomic mode not realized, even in admitted v23–v26; retain declaration and gap-fill |
363
- | STAGE-ESM-044 | Cratis C# renderer refuses protected reads despite v25 admission; semantic Host/executor support is separate; keep protection and gap-fill generated-app scope |
362
+ | STAGE-ESM-043 | Atomic mode not realized, even in admitted v23–v27; retain declaration and gap-fill |
363
+ | STAGE-ESM-047 | Single-instance query by composite key parts (v27) in the renderer, until Chronicle can look up composite keys (Chronicle#4265); keep the query, gap-fill |
364
+ | STAGE-ESM-048 | Read model with several key parts, or projection keyed by parts (v27), in the renderer or legacy syntax engine; keep the model, gap-fill |
365
+ | STAGE-ESM-044 | Renderer refuses a protected read despite v25 admission: any protected read in a bundle that predates protected-read rendering, afterwards only shapes it cannot preserve (constrained events, read paths in `produces when`, optional/collection/composite/mistyped mapping targets, freshness scopes), naming the reason; the legacy Host/structural runner refuse the preamble. Semantic Host/executor support is separate; keep protection and gap-fill generated-app scope |
364
366
  | STAGE-ESM-045 | Non-Error protected requirement; semantic Host/executor refuse before execution, including reaction-invoked commands; keep severity and report Unsupported |
365
367
  | STAGE-IMPL-002 | Described handler body not realized by Stage, even Stub mode; no stubs emitted |
366
368
 
367
369
  Invalid match syntax remains PLAY0367. Property/concept text rules bind v24;
368
370
  `contains`/`starts with` in conditions only still fail PLAY0268. Stage rejects
369
- v22/v27/v28 and mixed pairs with STAGE-ESM-016; v23–v26 admission does not implement
370
- bodies, batches or rendered protected reads (STAGE-ESM-044), and the renderer refuses
371
- v26 date comparisons with STAGE-ESM-046. Requires Stage 4.129.0
372
- for semantic Host/executor protected reads; older engines refuse -044. Read
371
+ v22/v28 and mixed pairs with STAGE-ESM-016; v23–v27 admission does not implement
372
+ bodies or batches, the renderer refuses protected reads it cannot preserve (STAGE-ESM-044; every
373
+ protected read in an older bundle), v26 date comparisons (STAGE-ESM-046) and composite read-model
374
+ keys (STAGE-ESM-048/-047). Read
373
375
  [language admission](language-admission.md) for the stricter Host outside-append guard.
376
+ Requires Stage 4.129.0 for semantic Host/executor protected reads; older engines refuse -044.
374
377
 
375
378
  ## Binding (V2 and V3) - see `executable-subset.md` for the full table
376
379
  | Code | Meaning | Fix |
@@ -435,7 +438,7 @@ for v21 admission/all-Proven unpinned specs, 4.117.0 for warning/info rules,
435
438
  4.118.0 for checksum validation and 4.119.0 for pattern/random. Older renderers
436
439
  refuse those constructs or require pins even for Proven rules. Bad pins fail
437
440
  STAGE-ESM-011; unpinned Unproven/Refuted rules fail -038; opaque rules fail -005
438
- before pin evaluation. `generate rule` remains -028; checksum remains -042 only
441
+ before pin evaluation. `generate rule` renders in a new enough bundle (bodies refuse -019/-022/-020; the Host and legacy syntax engine keep -028); checksum remains -042 only
439
442
  on legacy syntax paths. Tool-author checks: [generation checks](generation-checks.md).
440
443
 
441
444
  Fix order: E at V1 -> W at V1 -> silent-gap check -> V2 codes (if the mode needs V3).
@@ -458,9 +461,9 @@ Publication STAGE-ESM-032, foreign facts/event captures 033, claim-reading/opaqu
458
461
  | STAGE-ESM-007 / 009 / 010 / 017 | projection shape (one projection or reducer per read model, affected-instance key, unsupported query shapes, keys, unsupported `all` mappings, event-context values) |
459
462
  | STAGE-ESM-011 | specification shape not rendered (`when append` outside the single-hop reaction subset, command specifications that cascade into reactions, composite values, an unauthenticated caller carrying roles or claims, generated fixtures that do not match their strategy shape or concept rules). Command scenarios and single-hop reaction appends render |
460
463
  | STAGE-ESM-014 | constraint shape (multi-claim in one command, optional or composite targets) |
461
- | STAGE-ESM-019/022 | reducer or opaque pure policy body outside the pure allowlist |
464
+ | STAGE-ESM-019/022 | reducer or opaque pure policy body outside the pure allowlist; a `generate rule` body that does not compile or warns (019) or shadows a type or namespace (022) |
462
465
  | STAGE-ESM-024 | interval, schedule, application, startup and shutdown triggers, opaque reaction bodies, captures, Translate, clock/trigger/capture specifications |
463
- | STAGE-ESM-020 | a body the model requires is missing or changed (content hash check); blocks publication |
466
+ | STAGE-ESM-020 | a body the model requires, including a `generate rule` attachment, is missing or changed (content hash check); blocks publication |
464
467
  | STAGE-ESM-039 | unsupported refusal branch conditions/routes/mappings, same-event multi-trigger refusal groups, localized `$refusal.message` or ambiguous multi-constraint `$refusal.constraint` |
465
468
  | STAGE-EVENT-002 / CLI-RENDER-016 | existing destination event type ids changed or unreadable; pin stored identity, never bypass with `--force` |
466
469
  | STAGE-BASELINE-001–004 | whole-application warnings: changed/missing admitted event revision, unreadable baseline, unavailable or stale assessment; keep `baseline check` as the independent CI gate |
@@ -45,7 +45,7 @@ Complete examples that bind live in `executable-example.md`, `pdl-example.md` (p
45
45
  For atomic batches (v22), described handlers (v23), ordinal text rules (v24) and
46
46
  protected reads (v25), chronological command dates (v26), composite keys (v27) and Uuid equality (v28), read
47
47
  [language admission](language-admission.md). A later
48
- version alone does not enable either application opt-in.
48
+ version alone does not enable either application opt-in. 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)): no new versions, constructs, keywords or grammar, except a construct for a real model that is blocked with no model-side alternative, accepted in its own record. Model with what v1–v28 offers; when Stage, `cratis render` or Studio does not support a construct yet, treat the typed refusal as a platform gap to report, since consumers are catching up to v28, not a reason to wait for new language.
49
49
 
50
50
  ## Caller and compliance boundary
51
51
 
@@ -223,7 +223,7 @@ author `validate checksum` for arithmetic. Requires Stage 4.109.0 for v20,
223
223
  4.118.0 for checksum validation and 4.119.0 for pattern/random rendering; older
224
224
  renderers refuse those constructs or require rule-bearing pins even when Proven.
225
225
  Unproven/Refuted rules still need pins (-038), bad pins fail -011, and
226
- `generate rule` remains -028. Do not remove rules or classification to render.
226
+ `generate rule` renders from Stage 4.136.0 (the Host and legacy syntax engine keep -028). Do not remove rules or classification to render.
227
227
 
228
228
  ## Released public boundaries and observer routes
229
229
 
@@ -284,9 +284,8 @@ Models with one `key` mark keep their earlier version and bytes. Refused with PL
284
284
  joins, `children`, `remove via join`, `every`, `all`, `nested`, `clear with`, `variant`
285
285
  and reducers on the composite-keyed read model, a list query with a `by` block, a
286
286
  non-optional single-instance return, and command reads (PLAY0271, or PLAY0781
287
- ByParts under `command reads protected`) or trigger reads that produce directly.
288
- Stage refuses v27 with STAGE-ESM-016, independently of standalone binding and
289
- reference execution. Read read-surface
287
+ reason `by-parts` under `command reads protected`) or trigger reads that produce directly.
288
+ Requires Stage 4.137.0 for v27 admission (older Stage refuses it with STAGE-ESM-016): the semantic Host runs composite-keyed read models end to end, and the specification executor refuses specifications over them as unsupported. The Cratis renderer refuses a read model with several key parts or a projection keyed by parts with STAGE-ESM-048 and a single-instance query by parts with STAGE-ESM-047 (Chronicle#4265); composite-keyed read models get no conventional `Get<ReadModel>ById` query. This is independent of standalone binding and reference execution. Read read-surface
290
289
  [named keys](../../cratis-screenplay-read-surface/references/named-keys.md) for the
291
290
  complete example.
292
291
 
@@ -9,12 +9,12 @@ exact language/semantic pairs; binding, reference execution and rendering are se
9
9
 
10
10
  | ESM | Selecting construct | Binding/reference behavior | Stage boundary |
11
11
  | --- | --- | --- | --- |
12
- | v22 | Application-root `reaction batches atomic` | Direct productions per trigger occurrence and each selected refusal branch are separate atomic batches; commands remain independent | v22 refused STAGE-ESM-016; mode in admitted v23–v26 refused STAGE-ESM-043 |
12
+ | v22 | Application-root `reaction batches atomic` | Direct productions per trigger occurrence and each selected refusal branch are separate atomic batches; commands remain independent | v22 refused STAGE-ESM-016; mode in admitted v23–v27 refused STAGE-ESM-043 |
13
13
  | v23 | Pending `handler implementation` beside unconditional `produces` | Payload-only body; PLAY0695 information; reaching body gives Unsupported ImplementationBody | v23 admitted, body refused STAGE-IMPL-002 in renderer/Host/executor, even Stub mode |
14
14
  | v24 | `contains`, `not contains`, `starts with`, `ends with` property/concept rules | Ordinal UTF-16, absent optional passes; not text-condition operators | v24 admitted; semantic Host/executor and generated ordinal comparisons preserve rules |
15
- | v25 | Application-root `command reads protected` | Admitted reads in requirements/mappings, absence Validation, matching decide/commit changes Conflict | v25 admitted; Cratis C# renderer refuses STAGE-ESM-044; semantic Host/executor execute reads, non-Error protected requirements refuse STAGE-ESM-045 |
15
+ | v25 | Application-root `command reads protected` | Admitted reads in requirements/mappings, absence Validation, matching decide/commit changes Conflict | v25 admitted; Cratis renderer renders protected reads in a new enough bundle (STAGE-ESM-044 before it, and for shapes it cannot preserve); semantic Host/executor execute reads, non-Error protected requirements refuse STAGE-ESM-045 |
16
16
  | v26 | Chronological command Date/DateTime comparisons | Same-primitive `==`, `!=`, `>`, `>=`, `<`, `<=`; DateTime UTC ticks and pre-rule offset validation | v26 admitted; Host/executor run it, renderer and legacy engines refuse STAGE-ESM-046 |
17
- | v27 | A read model with two or more `key` marks | Untyped projection `key` blocks, equality-filter lists, single-instance `by` blocks, per-part fixtures | v27 refused STAGE-ESM-016 |
17
+ | v27 | A read model with two or more `key` marks | Untyped projection `key` blocks, equality-filter lists, single-instance `by` blocks, per-part fixtures | v27 admitted; Host runs it, renderer refuses STAGE-ESM-048/-047, executor refuses specs over it |
18
18
  | v28 | `==`/`!=` between Uuid values in command `require` and `produces when` | Uuid properties, Uuid concepts and identities, canonical literals; protected read paths in `require` only | v28 refused STAGE-ESM-016 |
19
19
 
20
20
  Requires Screenplay 4.181.0 or later (`screenplay --version`) for atomic batches; older compilers cannot admit the preamble.
@@ -33,7 +33,7 @@ Requires Screenplay 4.205.0 (ESM v28; `screenplay --version`) for Uuid equality
33
33
 
34
34
  Requires Stage 4.124.0 for v24 text-rule admission (`cratis --version` identifies the CLI bundle); older renderers refuse v24 with STAGE-ESM-016. V23 admission alone does not implement described bodies.
35
35
 
36
- Requires Stage 4.127.0 for v25 version admission; older renderers refuse v25 with STAGE-ESM-016. The Cratis C# renderer still refuses protected reads with STAGE-ESM-044; no artifacts are emitted.
36
+ Requires Stage 4.127.0 for v25 version admission; older renderers refuse v25 with STAGE-ESM-016. Requires Stage 4.138.0 for the Cratis renderer to render protected reads as Arc read protection; earlier renderers, and reads it cannot preserve, refuse STAGE-ESM-044 and emit no artifacts. `cratis render` gets this from the first CLI that bundles Stage 4.138.0; CLI 3.75.0 bundles Stage 4.137.0.
37
37
 
38
38
  Requires Stage 4.129.0 for semantic Host/executor protected reads; older engines refuse STAGE-ESM-044. Absence rejects before requirements/generation; read properties feed requirements and productions. Non-Error protected requirements refuse STAGE-ESM-045, including reaction invocations. Legacy Host/structural runner retain -044. The Host faults on any outside append, stricter than reference dependency-scoped conflicts; see [sandbox boundaries](../../cratis-stage-rendering-and-sandbox/references/sandbox-and-specrunner.md#protected-command-reads).
39
39
 
@@ -74,9 +74,10 @@ the same condition without Uuid operands keeps its earlier version. To see the s
74
74
  the model with the `screenplay` MCP server and call `read-workspace` with `view` `executable-model`:
75
75
  `languageVersion` reads `28.0`.
76
76
 
77
- Stage's semantic engines admit exact v1–v21 and v23–v26 pairs. V22/v27/v28 and mixed
78
- pairs refuse STAGE-ESM-016. Requires Stage 4.135.0 for v26 admission; older Stage
79
- refuses v26 with STAGE-ESM-016. Admission of v23–v26 is not admission of described bodies,
80
- atomic mode or rendered protected reads. A CLI may bundle an older compiler/Stage pair: run no-write render
77
+ Stage's semantic engines admit exact v1–v21 and v23–v27 pairs. V22/v28 and mixed
78
+ pairs refuse STAGE-ESM-016. Admission of v23–v27 is not admission of described bodies,
79
+ atomic mode or composite-key rendering, and protected reads render only in a bundle that supports them. A CLI may bundle an older compiler/Stage pair: run no-write render
81
80
  admission rather than transferring a standalone verdict. Pattern diagnostics arise
82
81
  in Screenplay before rendering; diagnostic arguments add no ESM version or new tool.
82
+
83
+ Requires Stage 4.135.0 for v26 admission and 4.137.0 for v27; older Stage refuses them with STAGE-ESM-016.
@@ -21,7 +21,9 @@ and concept compliance (v13) render.
21
21
 
22
22
  ## Current admission
23
23
 
24
- Stage admits exact ESM v1–v21 and v23–v26 pairs; v22/v27/v28 and mixed pairs
24
+ 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)): no new versions, constructs, keywords or grammar, except a construct for a real model that is blocked with no model-side alternative, accepted in its own record. Model with what v1–v28 offers; when Stage, `cratis render` or Studio does not support a construct yet, treat the typed refusal as a platform gap to report, since consumers are catching up to v28, not a reason to wait for new language.
25
+
26
+ Stage admits exact ESM v1–v21 and v23–v27 pairs; v22/v28 and mixed pairs
25
27
  refuse STAGE-ESM-016. Chronological command Date/DateTime comparisons select v26:
26
28
  the Host and executor run them, but the renderer refuses STAGE-ESM-046, so they are not renderable. Keep the
27
29
  rule and use authorized gap-fill. Version admission is separate from construct support.
@@ -33,11 +35,13 @@ The CLI's bundled Stage can be older: read installed versions and the pins in
33
35
  does not render refuses with its own code before any artifact is planned.
34
36
 
35
37
  Requires Stage 4.96.0 for stored event names (v16), 4.101.0 for no-event assertions (v17), 4.102.0 for refusal branches (v19), and 4.103.0 for rendered redelivery; older renderers refuse the respective shapes.
36
- Requires Cratis CLI 3.60.0 (`cratis --version`) for v16 rendering and 3.74.0 for v21–v26; a bundle below the model's version refuses it with CLI-RENDER-004, or with PLAY0268 when its bundled compiler predates the construct.
38
+ Requires Cratis CLI 3.60.0 (`cratis --version`) for v16 rendering, 3.74.0 for v21–v26 and 3.75.0 for v27 admission (v28 and later: CLI-RENDER-004); a bundle below the model's version refuses it with CLI-RENDER-004, or with PLAY0268 when its bundled compiler predates the construct.
37
39
 
38
40
  With an admitting renderer, all-Proven generated-concept rules allow unpinned
39
41
  rendered specs; warning/info rules and semantic checksum validation are enforced,
40
- and pattern/random strategies render. `generate rule` remains STAGE-ESM-028.
42
+ and pattern/random strategies render. `generate rule` renders in a new enough bundle (see the Requires line below): the body
43
+ refuses -019 when it does not compile or warns, -022 on shadowing and -020 when the attachment is missing; the Host and legacy syntax engine keep -028.
44
+ Requires Stage 4.136.0 for `generate rule`, carried by Cratis CLI 3.75.0.
41
45
  The independent executor still needs deterministic pins. Dated patterns use
42
46
  receipt-time UTC; random ranges use `long` with inclusive endpoints.
43
47
 
@@ -46,11 +50,11 @@ This table is a reading of the renderer's admission, not a render result: run th
46
50
  | Area | Renders | Refused (code) |
47
51
  | --- | --- | --- |
48
52
  | Slice kinds | `StateChange`, `StateView`, supported event-triggered `Automation` with Chronicle reactors | Translate, captures, non-event triggers, opaque bodies, clock/trigger/capture specs (`-024`); claim-reading/opaque `runs as` gates (`-034`), mixed effects from one handler (`-037`, redelivery can duplicate events), unsupported conditions/destinations/mappings (`-039`). Keep refused reactions whole |
49
- | Queries | optional keyed snapshot lookups; snapshot or observable collections, keyed or unkeyed, with v14 equality filters | context/single-result filters, opaque `scoped to`/`performer` and a list-query `by` block: PLAY0268; v27 composite keys: STAGE-ESM-016. DateTime filters and required parameters after optional filters refuse `-010`; filter-name collisions refuse `-012`; concept arguments retain Arc validation, including nested members/elements; nullable keys or optional concept filters with `not empty` refuse `-010` rather than changing null behavior |
53
+ | Queries | optional keyed snapshot lookups; snapshot or observable collections, keyed or unkeyed, with v14 equality filters | context/single-result filters, opaque `scoped to`/`performer` and a list-query `by` block: PLAY0268; v27 composite-key lookups by parts: STAGE-ESM-047, read models and projections keyed by parts: STAGE-ESM-048. DateTime filters and required parameters after optional filters refuse `-010`; filter-name collisions refuse `-012`; concept arguments retain Arc validation, including nested members/elements; nullable keys or optional concept filters with `not empty` refuse `-010` rather than changing null behavior |
50
54
  | Authorization | role-only, authenticated, opaque pure policies, claim conditions with Uuid, Date, DateTime or text targets (numeric and Boolean claim matches render as always false), `not`/and/or; roles read through the identity's `RoleClaimType` | role-claim URIs, nested opaque policies, unresolved or non-portable policies, no single identifier, opaque-policy subjects that are not text, Uuid, Date or DateTime (`STAGE-ESM-015`, a restriction separate from declarative claim targets) |
51
55
  | Event sources, streams, routes (ESM v8) | rendered, including routed read-model/query companion replay | reserved stored names, unformattable routed fixtures (`STAGE-ESM-030`) |
52
56
  | Numbers, case tables | whole numbers as `long` from ESM v8; case tables | out-of-`int` literals below v8 (`STAGE-ESM-031`) |
53
- | Generated values and responses (v7/v15/v20/v21) | required scalar UUID/String strategies and Int random, pattern/checksum, concept validators at all severities, all-Proven unpinned relational specs, Guarded v15 freshness, scalar/named responses and fixtures | `generate rule`, unknown strategies and unsupported generated types (`-028`); unsupported response combinations, generated-property validation, name collisions, unpinned Unproven/Refuted rules or unordered/projected/collision-sensitive expectations (`-038`); invalid pins (`-011`); opaque concept rules (`-005`); unknown rule kinds and legacy checksum (`-042`) |
57
+ | Generated values and responses (v7/v15/v20/v21) | required scalar UUID/String strategies and Int random, pattern/checksum, concept validators at all severities, all-Proven unpinned relational specs, Guarded v15 freshness, scalar/named responses and fixtures | unknown strategies and unsupported generated types (`-028`); `generate rule` bodies that do not compile (`-019`), shadow a type (`-022`) or lack an attachment (`-020`); unsupported response combinations, generated-property validation, name collisions, unpinned Unproven/Refuted rules or unordered/projected/collision-sensitive expectations (`-038`); invalid pins (`-011`); opaque concept rules (`-005`); unknown rule kinds and legacy checksum (`-042`) |
54
58
  | Enum numbers / compliance | explicit enum numbers (v12); concept `[PII]` or scoped `[Encrypted]` + `[NotAudited]` (v13), property-level `[NotAudited]` for protected command inputs | protected identities/enums (`-040`); explicit subject lineage remains unadmitted |
55
59
  | Specifications | command scenarios and supported single-hop reaction appends; Stage's `admission.md` | appends outside the single-hop subset and commands cascading into reactions (`-011`); `then no readmodel` (`-027`); an unauthenticated caller carrying roles or claims (`-011`); command `given clock` renders only whole milliseconds at or after 1970 |
56
60
  | v9 and v10 | reaction/reducer `from` filters; role/authenticated `runs as` | public events and event-target projections (`-032`); foreign origins and event-source captures (`-033`); directed Translate (`-024`); claim-reading/opaque `runs as` gates (`-034`); legacy `from` (`-035`); per-production route overrides (`-036`) |
@@ -60,14 +64,14 @@ This table is a reading of the renderer's admission, not a render result: run th
60
64
  | Evolved events | initial revisions only (migrations are not rendered) | `STAGE-ESM-026` |
61
65
  | Descriptions, documentation | XML `<summary>`/`<remarks>` doc comments only | characters invalid in XML: `CLI-RENDER-005`; never behavior |
62
66
 
63
- The Cratis C# renderer refuses protected command reads with STAGE-ESM-044, described handlers
67
+ The Cratis renderer renders protected command reads in a bundle that supports them (STAGE-ESM-044 for shapes it cannot preserve and in every earlier bundle), refuses described handlers
64
68
  with STAGE-IMPL-002 (even Stub mode), and atomic mode in admitted pairs with
65
69
  STAGE-ESM-043. Literal
66
70
  text rules execute/render ordinal UTF-16 comparisons. Read [language admission](language-admission.md).
67
71
  A CLI's older bundled compiler may fail first: legacy reads/concurrency PLAY0271,
68
- attached handlers PLAY0268. Protected reads bind v25, not a Stage render. Requires Stage 4.129.0 for semantic
69
- Host/executor protected reads; older engines refuse -044. Non-Error protected requirements
72
+ attached handlers PLAY0268. Protected reads bind v25. Non-Error protected requirements
70
73
  refuse STAGE-ESM-045, including reaction invocations; this is not a rendering result.
74
+ Requires Stage 4.129.0 for semantic Host/executor protected reads (older engines refuse -044) and Stage 4.138.0 for the Cratis renderer to render them.
71
75
  Response-name authoring scopes are not rendered and Scene runtime does not supply them.
72
76
 
73
77
  Compliance mapping in the generated C#: personal data to `[PII]`, operational secrets to
@@ -42,7 +42,7 @@ Compiler syntax: `cheat-sheet.md`. Negative capability claims depend on the tool
42
42
  35. `description`/`documentation` are authoring metadata: board, MCP and Prologue show them; `cratis render` emits them only as XML doc comments (invalid XML characters are CLI-RENDER-005), never as behavior. A rule only in prose is unenforced in rendered code; make it a rule layer, a spec or a recorded target requirement.
43
43
  36. One unadmitted construct (operations, `numbers exact`) blocks whole-model binding. Routing is admitted (v8), as are flat composite view keys (v27). Overrides replace the whole route, filters never match unrouted facts. Do not remove routing or authorization to render a model.
44
44
  37. Personas remain outside ESM bytes, but specifications accept `given caller as <Persona>`: one authenticated deterministic policy witness, not every matching caller. Inspect the chosen `or` branch; use explicit callers when synthesis is refused.
45
- 38. A stored-state rule uses `reads <View>` and `require` with an indented message. Opt into `command reads protected` for eligible v25 views; absence rejects and matching decide/commit changes conflict. Legacy reads remain unprotected. The Cratis C# renderer refuses protected reads (STAGE-ESM-044), not the v25 pair; semantic Host/executor support is separate: hand-written Arc `[ProtectedDecision]` + `DecisionRead<T>` or Chronicle consistency enforcement needs separate target verification; use a constraint for uniqueness. Forbidden: caller-supplied copies of state in `require`, boolean attestation inputs (`confirmsX == true`), rules hidden in `handler`/implementation-hint prose. An unguarded materialized read is unsafe for a protected decision.
45
+ 38. A stored-state rule uses `reads <View>` and `require` with an indented message. Opt into `command reads protected` for eligible v25 views; absence rejects and matching decide/commit changes conflict. Legacy reads remain unprotected. Stage 4.138.0 renders protected reads as Arc read protection (earlier bundles, and shapes it cannot preserve, refuse STAGE-ESM-044); semantic Host/executor support is separate: otherwise hand-written Arc `[ProtectedDecision]` + `DecisionRead<T>` or Chronicle consistency enforcement needs separate target verification; use a constraint for uniqueness. Forbidden: caller-supplied copies of state in `require`, boolean attestation inputs (`confirmsX == true`), rules hidden in `handler`/implementation-hint prose. An unguarded materialized read is unsafe for a protected decision.
46
46
  Requires Arc 22.39.0 or later for `[ProtectedDecision]`.
47
47
 
48
48
  Identity and compliance traps (`identity.md`, `concepts.md`, `events.md`, `purposes.md`, `diagnostics.md` in the Screenplay documentation):
@@ -17,7 +17,7 @@ whether it is admitted; reading the admission rules is not a render result.
17
17
 
18
18
  Requires cratis CLI ≥ 3.57 (`cratis --version`) to render ESM v14 and v15 models; an older CLI refuses newer ESM versions with `CLI-RENDER-004` (or `STAGE-ESM-016` from Stage directly).
19
19
 
20
- Requires Cratis CLI 3.74.0 to render ESM v21–v26 models; CLI 3.66.0–3.73.0 refuse v21 and later with `CLI-RENDER-004`. Above the ceiling, a construct the bundled compiler cannot bind reports PLAY0268 before `CLI-RENDER-004` is reached.
20
+ Requires Cratis CLI 3.74.0 to render ESM v21–v26 models and 3.75.0 for v27; CLI 3.66.0–3.73.0 refuse v21 and later with `CLI-RENDER-004`, and every CLI refuses v28 and later with it. Above the ceiling, a construct the bundled compiler cannot bind reports PLAY0268 before `CLI-RENDER-004` is reached.
21
21
 
22
22
  ## Batches, described handlers, text rules and protected reads
23
23
 
@@ -76,10 +76,10 @@ printed), `1` is a missing input. Add `-o json` for the counts and the publicati
76
76
  Facts that surprise:
77
77
 
78
78
  - **Binding uses the CLI's bundled compiler**, not the standalone one. Version admission
79
- does not imply construct support: exact ESM v1–v21 and v23–v26 pairs are admitted,
80
- while v22/v27/v28 and mixed pairs refuse `STAGE-ESM-016`. Date/DateTime command comparisons (v26)
79
+ does not imply construct support: exact ESM v1–v21 and v23–v27 pairs are admitted,
80
+ while v22/v28 and mixed pairs refuse `STAGE-ESM-016`. Date/DateTime command comparisons (v26)
81
81
  execute in the semantic Host and executor but refuse `STAGE-ESM-046` in the renderer. Pattern/random generation and checksum validation
82
- render with an admitting renderer; `generate rule` still refuses `STAGE-ESM-028`.
82
+ render with an admitting renderer; `generate rule` renders in a new enough bundle (the Host and legacy syntax engine still refuse it with `STAGE-ESM-028`).
83
83
  Read [references/admission.md](references/admission.md) for the introducing-release
84
84
  prerequisites, all-Proven unpinned specifications and construct/pin checks (-011/-038).
85
85
  An older CLI bundle can refuse `CLI-RENDER-004` (direct Stage: `STAGE-ESM-016`);
@@ -131,13 +131,13 @@ One blocker publishes nothing. Codes, limits and fixes: [references/admission.md
131
131
  appends beyond single-hop/cascade specs (`-011`), absence (`-027`), evolution (`STAGE-ESM-026`), public/foreign events
132
132
  (`-032`/`-033`), claim-reading/opaque `runs as` gates (`-034`), legacy filters (`-035`), production
133
133
  overrides (`-036`), code validation (`-005`), DateTime filters (`-010`),
134
- unsupported conditional productions, composite projection keys and unsupported `all` shapes.
135
- The Cratis C# renderer refuses protected reads with `STAGE-ESM-044`, described handlers `STAGE-IMPL-002`
134
+ unsupported conditional productions, composite read-model keys (`STAGE-ESM-048`, and `-047` for a single-instance query by parts) and unsupported `all` shapes.
135
+ Protected reads render as Arc read protection in a new enough bundle; shapes it cannot preserve, and every protected read in an older bundle, refuse `STAGE-ESM-044` (see admission.md). The renderer refuses described handlers `STAGE-IMPL-002`
136
136
  (even Stub mode), and atomic mode in admitted pairs `STAGE-ESM-043`.
137
137
  - **Binding refusals (`PLAY0268`/`PLAY0271`):** legacy reads, `concurrency`, attached
138
138
  handlers, context/single-result filters, opaque scope/performer, a list-query `by` block,
139
139
  enum/identity compliance and subject lineage. Eligible protected reads bind v25;
140
- pending handlers with unconditional productions bind v23, but neither renders. A read model with several key parts (v27) refuses `STAGE-ESM-016`.
140
+ pending handlers with unconditional productions bind v23, but neither renders. A read model with several key parts (v27) is admitted but refuses rendering (`STAGE-ESM-048`).
141
141
  Never drop protection.
142
142
 
143
143
  A refusal is not a licence to weaken the model: drop no specification, event generation or
@@ -190,12 +190,16 @@ Silent fallback to a default screen is a failure, not a partial render.
190
190
 
191
191
  `cratis run [PATH]` (Docker required) starts `cratis/stage` on the folder or file: Stage
192
192
  API on `9090`, Chronicle Workbench on `https://localhost:35000`. It is a **partial,
193
- disposable runtime**, not a generated application. The default engine appends modeled
193
+ disposable runtime**, not a generated application. `cratis run` runs the `semantic` engine
194
+ (Requires Cratis CLI 3.73.0); Stage's semantic engine is the only engine going forward. The legacy
195
+ EventModel engine (older CLIs, or the image without `Stage__Runtime__Engine=semantic`) is legacy; do not rely on it.
196
+ It appends modeled
194
197
  `produces` facts and echoes the payload. It refuses missing required properties and
195
198
  simple literal `validate` rules on top-level properties, but enforces no other rule, no
196
- constraint and no command or query authorization; `Stage__Runtime__Engine=semantic` opts
197
- in to an engine that does, and refuses what it cannot execute (HTTP 501). The default engine
198
- also refuses routed models (`STAGE-ESM-030`) and protected reads (`STAGE-ESM-044`).
199
+ constraint and no command or query authorization; the semantic engine enforces them and
200
+ refuses what it cannot execute (HTTP 501). The legacy engine
201
+ also refuses routed models (`STAGE-ESM-030`), composite read-model keys (v27) and protected reads (`STAGE-ESM-044`); the semantic engine runs composite keys.
202
+ Requires Cratis CLI 3.75.0 for `cratis run` to run v27 composite keys.
199
203
  Requires Stage 4.129.0 for semantic Host/runner protected reads; older engines refuse
200
204
  `STAGE-ESM-044`. Required absence rejects before requirements/generation, read properties
201
205
  feed requirements and productions, and non-Error protected requirements refuse
@@ -243,7 +247,7 @@ to disk with no managed staging and no safe stale-file removal; a failure can le
243
247
  - No file under `.cratis-render/` is staged; managed files carry no local edits.
244
248
  - Stage's plan is deterministic (same bytes and hashes); that is not a review, and Stage never reviews, stages or approves anything.
245
249
  - Sandbox expectations account for the rules, constraints, authorization and query
246
- authorization the default engine does not enforce.
250
+ authorization the legacy EventModel engine does not enforce.
247
251
  - Runtime screen smoke coverage uses the same model root or workspace export as
248
252
  `cratis render`, names package/image versions, and fails on dropped authored UI
249
253
  or silent default composition.
@@ -11,14 +11,15 @@
11
11
  - Specification rules (`STAGE-ESM-011`)
12
12
  - Refusals seen while drafting a model
13
13
 
14
- Stage admits exact ESM v1–v21 and v23–v26 language/semantic pairs, then checks
15
- constructs. V22, v27, v28 and mixed or unknown pairs report `STAGE-ESM-016`. `cratis render` admits
16
- ESM v1–v26: Stage plans each model and refuses the constructs it cannot render with typed `STAGE-ESM-*`
17
- codes (a v22 model reports `STAGE-ESM-016`; v26 date comparisons report `STAGE-ESM-046`). The CLI refuses
18
- a bound model above v26 with `CLI-RENDER-004` before planning; a construct its bundled compiler cannot bind
14
+ Stage admits exact ESM v1–v21 and v23–v27 language/semantic pairs, then checks
15
+ constructs. V22, v28 and mixed or unknown pairs report `STAGE-ESM-016`. `cratis render` admits
16
+ ESM v1–v27: Stage plans each model and refuses the constructs it cannot render with typed `STAGE-ESM-*`
17
+ codes (a v22 model reports `STAGE-ESM-016`; v26 date comparisons report `STAGE-ESM-046`; v27 composite
18
+ read-model keys report `STAGE-ESM-048`/`-047`). The CLI refuses
19
+ a bound model above v27 with `CLI-RENDER-004` before planning; a construct its bundled compiler cannot bind
19
20
  reports PLAY0268 instead.
20
21
 
21
- Requires Cratis CLI 3.74.0 (`cratis --version`) for v21–v26 rendering; CLI 3.66.0–3.73.0 stop at v20 and refuse v21 and
22
+ Requires Cratis CLI 3.74.0 (`cratis --version`) for v21–v26 rendering and 3.75.0 for v27; CLI 3.66.0–3.73.0 stop at v20 and refuse v21 and
22
23
  later with `CLI-RENDER-004`. A construct newer than the CLI's bundled compiler reports that binder's PLAY0268 first.
23
24
  Requires Cratis CLI 3.63.0 for v17 and v19 and 3.65.0 for v18; older CLIs refuse those versions with `CLI-RENDER-004`.
24
25
 
@@ -32,15 +33,15 @@ Requires Stage 4.117.0 for warning/info-severity generated-concept rules; older
32
33
  renderers refuse them with STAGE-ESM-038. All severities are enforced at runtime.
33
34
  Requires Stage 4.118.0 for semantic checksum validation; older renderers refuse it with STAGE-ESM-042.
34
35
  Requires Stage 4.119.0 for pattern/random rendering, Host generation and independent executor fixture checks; older renderers refuse those strategies with STAGE-ESM-028.
35
- `generate rule` still refuses -028. Any Unproven/Refuted rule needs a pin (-038);
36
+ 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. Any Unproven/Refuted rule needs a pin (-038);
36
37
  opaque/unsupported rules refuse -005 before pin evaluation. Independent execution
37
38
  always needs pins.
38
39
  Requires Stage 4.124.0 for v24 text-rule admission (`cratis --version` identifies the CLI bundle); older renderers refuse v24 with STAGE-ESM-016.
39
- Requires Stage 4.127.0 for v25 version admission; older renderers refuse v25 with STAGE-ESM-016. The Cratis C# renderer still refuses protected reads with STAGE-ESM-044.
40
+ Requires Stage 4.127.0 for v25 version admission; older renderers refuse v25 with STAGE-ESM-016. Requires Stage 4.138.0 for the Cratis renderer to render protected reads as Arc read protection (`[ReadProtection(On)]`, a nullable read-model `Handle` parameter per read with `[LookUpBy]`, the `<View> '<key>' does not exist.` rejection, requirements evaluated in `Handle` after the reads; generated specifications run in decision mode); `cratis render` gets it from the first CLI that bundles Stage 4.138.0, and earlier bundles (CLI 3.75.0 bundles 4.137.0) refuse every protected read with STAGE-ESM-044. Reads it cannot preserve faithfully stay STAGE-ESM-044 and name the reason: constrained events, read paths in `produces when`, mappings to optional, collection, composite or mistyped event properties, generated-value freshness scopes. See [protected reads](../../cratis-screenplay-command-surface/references/protected-reads.md).
40
41
  Requires Stage 4.129.0 for semantic Host/executor protected reads; older engines refuse STAGE-ESM-044. Required absence rejects before requirements or generation; read-backed requirements and produced-event mappings execute. Non-Error protected requirements refuse STAGE-ESM-045, including reaction invocations. See [sandbox boundaries](sandbox-and-specrunner.md#protected-command-reads) for ordering and the Host's stricter outside-append fault boundary.
41
42
  Described handlers refuse STAGE-IMPL-002, even Stub mode; atomic mode in an
42
43
  admitted pair refuses STAGE-ESM-043. Version admission never implements a body,
43
- batch or rendered protected decision. Chronological Date/DateTime command comparisons
44
+ batch or composite-key rendering. Chronological Date/DateTime command comparisons
44
45
  select v26. The semantic Host and specification executor run them; the renderer,
45
46
  legacy engines and default sandbox engine refuse them with STAGE-ESM-046, naming the
46
47
  property, and emit no artifacts. Standalone reference success is not rendering. Keep
@@ -49,6 +50,8 @@ millisecond precision.
49
50
 
50
51
  Requires Stage 4.135.0 for v26 admission; older Stage refuses v26 with STAGE-ESM-016.
51
52
 
53
+ Requires Stage 4.137.0 for v27 admission; older Stage refuses v27 with STAGE-ESM-016. The semantic Host runs read models with several key parts end to end (projections keyed by parts, removals, list queries on any part, queries by parts), and composite-keyed read models get no conventional `Get<ReadModel>ById` query. The specification executor refuses specifications over them as unsupported. The renderer and legacy syntax engine refuse a read model with several key parts or a projection keyed by parts with `STAGE-ESM-048`, and the renderer a single-instance query by parts with `STAGE-ESM-047` until Chronicle can look up composite keys (Chronicle#4265); nothing is published.
54
+
52
55
  Binding with the CLI's bundled compiler is a separate
53
56
  prerequisite. The exhaustive construct table is `references/renderable-subset.md` in
54
57
  `cratis-screenplay-toolchain`; run the real render before claiming anything is admitted.
@@ -152,17 +155,17 @@ Requires Stage 4.90.0 for snapshot/live lists, 4.96.0 for non-text secrets and 4
152
155
  | `STAGE-ESM-013` | An event-context value other than `$context.occurred` mapped in `produces` | Map a command property when that preserves the meaning; otherwise gap-fill |
153
156
  | `STAGE-ESM-014` | A constraint Chronicle cannot reproduce (kind, scope, message; multi-claim in one command; optional or composite targets) | A different constraint is a requirement change for the model owner; otherwise gap-fill |
154
157
  | `STAGE-ESM-015` | Authorization Stage cannot render exactly: a role-claim URI, an opaque policy nested inside a condition, an unresolved or non-portable policy, no single identifier, an opaque-policy subject that is not text, Uuid, Date or DateTime (a restriction on opaque-policy subjects, separate from declarative claim targets), an unsupported claim artifact. Role-only, authenticated, opaque pure policies, claim conditions with Uuid, Date, DateTime or text targets (numeric and Boolean claim matches render as always false) and `not`/and/or render; roles are read through the identity's `RoleClaimType` | Reshape the policy to a portable condition; otherwise gap-fill |
155
- | `STAGE-ESM-016` | Model language/semantic pair is not admitted by the installed Stage; exact v1–v21 and v23–v26 pairs are admitted, v22/v27/v28 and mixed pairs refused; older Stage also refuses the versions listed in the minimums above. A CLI bundle reports `CLI-RENDER-004` above its ceiling (v26 for CLI 3.74.0) first. v14 filters and v15 generation join v11 numbers, v12 enum numbers and v13 compliance as supported constructs, not blanket construct support | Not fixable by editing: the model needs a newer renderer. Keep the model, record the gap, gap-fill |
158
+ | `STAGE-ESM-016` | Model language/semantic pair is not admitted by the installed Stage; exact v1–v21 and v23–v27 pairs are admitted, v22/v28 and mixed pairs refused; older Stage also refuses the versions listed in the minimums above. A CLI bundle reports `CLI-RENDER-004` above its ceiling (v27 for CLI 3.75.0) first. v14 filters and v15 generation join v11 numbers, v12 enum numbers and v13 compliance as supported constructs, not blanket construct support | Not fixable by editing: the model needs a newer renderer. Keep the model, record the gap, gap-fill |
156
159
  | `STAGE-ESM-017` | Read model or projection cannot render (property names that collide with Chronicle paths or expression syntax, mappings that overwrite the key or child identity, composite keys, unsupported `all` mappings, the refused scope shapes below) | Reshape the projection without changing what it records, or record the gap |
157
160
  | `STAGE-ESM-018` | `$strings.` key missing in the default locale or containing formatting characters | Fix the strings |
158
- | `STAGE-ESM-019` | Reducer structure or body not admitted (outside a `StateView`, impure, does not compile) | An equivalent pure body, or gap-fill |
159
- | `STAGE-ESM-020` | Implementation body missing, changed (hash differs) or refused by the loader | Provide the body inside the model root |
160
- | `STAGE-ESM-021`, `-022` | Reducer typed-context or analysis failure; a construct outside the pure allowlist, or a generated name shadowing a reducer type | An equivalent pure body, or gap-fill |
161
+ | `STAGE-ESM-019` | Reducer structure or body not admitted (outside a `StateView`, impure, does not compile), or a `generate rule` body that does not compile or produces a compiler warning | An equivalent pure body, or gap-fill |
162
+ | `STAGE-ESM-020` | Implementation body (including a `generate rule` attachment) missing, changed (hash differs) or refused by the loader | Provide the body inside the model root |
163
+ | `STAGE-ESM-021`, `-022` | Reducer typed-context or analysis failure; a construct outside the pure allowlist, or a generated name shadowing a reducer type; also type or namespace shadowing in a `generate rule` body (`-022`) | An equivalent pure body, or gap-fill |
161
164
  | `STAGE-ESM-025` | Typed context references an earlier event revision or an earlier property identity; checked before `-026` | Reference the current revision; an earlier reference is not renderable, so gap-fill |
162
165
  | `STAGE-ESM-026` | A selected event, or an event a selected slice depends on (producing command, observing projection or reducer, specification, constraint target), is above its initial revision: `Event 'X' has evolved to revision N; Stage does not render event migrations yet.` The whole selection is refused, nothing is emitted | Not fixable by editing without dropping the evolution. Gap-fill the evolved events and hand-write the migrations (`cratis-chronicle-event-type-migration`). A scoped slice of initial events that depends on no evolved event still renders |
163
166
  | `STAGE-ESM-024` | Interval, schedule, application, startup and shutdown triggers, opaque reaction bodies, captures, Translate (including directed Translate), and clock/trigger/capture specifications. Event-triggered Automation slices render as Chronicle reactors, subject to `-013` and `-034` to `-040` below | Keep refused scope as gap-fill; do not confuse semantic Host settlement with live reactor delivery |
164
167
  | `STAGE-ESM-027` | A specification asserting a read model is absent (`then no readmodel`) is not rendered (the semantic specification engine executes keyed absence) | Keep the specification; verify absence another way and record the gap |
165
- | `STAGE-ESM-028`, `-029` | Generated values or responses Stage cannot render. Supported scalar UUID/String-concept strategies and Int random, v15 freshness, generation fixtures, scalar/named responses and `then returns` render; `generate rule`, unknown strategies and unsupported generated types report `-028` | Probe the supported form; preserve refused combinations as gap-fill |
168
+ | `STAGE-ESM-028`, `-029` | Generated values or responses Stage cannot render. Supported scalar UUID/String-concept strategies and Int random, v15 freshness, generation fixtures, scalar/named responses and `then returns` render; unknown strategies, unsupported generated types, and (in the Host and legacy syntax engine) a command generating a `generate rule` value report `-028` | Probe the supported form; preserve refused combinations as gap-fill |
166
169
  | `STAGE-ESM-038` | Generated/response results combined with routes, generated-property rules, legacy allocation, non-scalar/non-command response sources or generated-name collisions | Keep the model; gap-fill that command |
167
170
  | `STAGE-ESM-039`, `-040` | Reaction conditions, destinations or mappings outside the faithful target subset; protected identity uses (including reaction destinations) and protected enum concepts | See the event-reaction boundary above; never declassify protected values |
168
171
  | `STAGE-ESM-030` | Named event-source or stream definition with a reserved stored name; unformattable routed fixtures or command replay routes. The default sandbox engine also reports it for every routed model | Rename the reserved name; render the model with `cratis render`, not `cratis run` |
@@ -174,7 +177,8 @@ Requires Stage 4.90.0 for snapshot/live lists, 4.96.0 for non-text secrets and 4
174
177
  | `STAGE-ESM-041` | Older renderers refuse non-text secrets; supported renderers keep their original types | Keep classification; upgrade the renderer, never declassify |
175
178
  | `STAGE-ESM-042` | Unknown validation rule kinds; checksum on the legacy syntax path (semantic checksum renders) | Keep the rule; use an admitting semantic renderer or gap-fill |
176
179
  | `STAGE-ESM-043` | `reaction batches atomic` in an admitted version pair | Keep the batch boundary; gap-fill without splitting it |
177
- | `STAGE-ESM-044` | Protected-read preamble, command reads or read-backed conditions/mappings in the Cratis C# renderer; legacy Host/structural runner also refuse the preamble | Keep protection; semantic Host/executor support is separate from generated-app enforcement |
180
+ | `STAGE-ESM-044` | A protected read the Cratis renderer cannot preserve faithfully, naming the reason (every protected read before Stage 4.138.0); the legacy Host/structural runner refuse the preamble | Keep protection; gap-fill the refused command; semantic Host/executor support is separate from generated-app enforcement |
181
+ | `STAGE-ESM-047`, `-048` | ESM v27 composite read-model keys: `-048` read model with several key parts or projection keyed by parts (also the legacy syntax engine); `-047` single-instance query by parts | Keep the model; gap-fill the composite-keyed scope |
178
182
  | `STAGE-ESM-046` | Date/DateTime comparison in `require`, `produces when` or a validation rule (including through concepts) in the renderer, legacy engines or default sandbox engine; names the property | Keep the date rule; the semantic Host/executor run it; deliver rendering through gap-fill that compares exact calendar dates and UTC ticks |
179
183
  | `STAGE-ESM-045` | Non-Error requirement on a protected command, including reaction-invoked commands; semantic admission refuses before reads, requirements or facts | Keep the severity contract; record the execution gap, never silently promote or drop the requirement |
180
184
  | `STAGE-IMPL-002` | Described command handler, naming command and RequirementId; also refused in Stub mode | Supply authorized implementation outside rendering; no generated stub is emitted |
@@ -12,9 +12,10 @@ V5 evidence.
12
12
  as the application it describes).
13
13
  - Docker, and the `cratis/stage` image at the tag `cratis run` would use (by default the
14
14
  Stage version the CLI renders with).
15
- - The **semantic engine**. `cratis run` has no `--engine` option and passes no environment
16
- to the container, so it starts the default EventModel engine, which enforces only
17
- simple literal validation rules, no authorization, and refuses routed models. Start the same image directly:
15
+ - The **semantic engine**. `cratis run` runs it by default; an older CLI needs
16
+ `cratis run --engine semantic`, and one without `--engine` only starts the legacy EventModel engine, which enforces only
17
+ simple literal validation rules, no authorization, and refuses routed models; with such a CLI, start the same image directly.
18
+ Requires Cratis CLI 3.73.0 for the semantic default (`--engine` needs 3.64.0; check with `cratis --version`):
18
19
 
19
20
  ```bash
20
21
  docker run --rm -p 127.0.0.1:9090:9090 -p 127.0.0.1:35000:35000 \
@@ -38,7 +38,7 @@ Do not generate client-owned inputs, idempotency keys, gapless invoice numbers o
38
38
  secrets. Generation is not authorization, projection readiness or external-effect
39
39
  success. Patterns are not gapless/sequential allocators or secrets; check digits
40
40
  catch typos, not forgery. Short codes need uniqueness separate from whole-source
41
- freshness. `generate rule` remains unsupported by Stage (STAGE-ESM-028), and
41
+ freshness. `generate rule` renders only from Stage 4.136.0 (STAGE-ESM-028 before it, and in the Host), and
42
42
  sequence is refused by Screenplay. Admitted command clock specs render. Stage
43
43
  emits explicit whole-source scopes when the model serializes a strategy; models
44
44
  with only implicit UUID stay Unguarded even at v20. This is not a general freshness