@cratis/pi 7.66.0 → 7.68.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 +3 -3
  2. package/package/corpus/skills/cratis-screenplay-automations-and-translations/references/realization-and-gap-fill.md +1 -1
  3. package/package/corpus/skills/cratis-screenplay-captures-and-reactions/references/atomic-batches-and-source-mappings.md +1 -1
  4. package/package/corpus/skills/cratis-screenplay-command-surface/SKILL.md +4 -3
  5. package/package/corpus/skills/cratis-screenplay-command-surface/references/date-comparisons.md +13 -2
  6. package/package/corpus/skills/cratis-screenplay-model-authoring/references/language-reference.md +2 -2
  7. package/package/corpus/skills/cratis-screenplay-model-authoring/references/state-and-recovery.md +1 -0
  8. package/package/corpus/skills/cratis-screenplay-model-review/references/checklist.md +1 -1
  9. package/package/corpus/skills/cratis-screenplay-model-review/references/public-keys-and-routes.md +4 -2
  10. package/package/corpus/skills/cratis-screenplay-model-review/references/report-template.md +2 -2
  11. package/package/corpus/skills/cratis-screenplay-modeling-lifecycle/SKILL.md +1 -1
  12. package/package/corpus/skills/cratis-screenplay-modeling-lifecycle/references/phases.md +1 -1
  13. package/package/corpus/skills/cratis-screenplay-modeling-lifecycle/references/stop-or-assume.md +1 -1
  14. package/package/corpus/skills/cratis-screenplay-modeling-lifecycle/references/verdicts-and-modes.md +6 -1
  15. package/package/corpus/skills/cratis-screenplay-projections/SKILL.md +8 -1
  16. package/package/corpus/skills/cratis-screenplay-projections/references/pdl-grammar.md +42 -2
  17. package/package/corpus/skills/cratis-screenplay-projections/references/reducer-identity.md +88 -0
  18. package/package/corpus/skills/cratis-screenplay-projections/verification.json +2 -1
  19. package/package/corpus/skills/cratis-screenplay-read-surface/SKILL.md +14 -7
  20. package/package/corpus/skills/cratis-screenplay-read-surface/references/equality-filters.md +1 -1
  21. package/package/corpus/skills/cratis-screenplay-read-surface/references/named-keys.md +168 -58
  22. package/package/corpus/skills/cratis-screenplay-read-surface/verification.json +2 -2
  23. package/package/corpus/skills/cratis-screenplay-render-and-gap-fill/references/gap-fill-handoff.md +1 -1
  24. package/package/corpus/skills/cratis-screenplay-render-and-gap-fill/references/renderability-gate.md +1 -1
  25. package/package/corpus/skills/cratis-screenplay-scenario-coverage/references/scenario-examples.md +2 -2
  26. package/package/corpus/skills/cratis-screenplay-scenario-coverage/references/spec-forms-by-mode.md +3 -3
  27. package/package/corpus/skills/cratis-screenplay-slice-design/SKILL.md +5 -7
  28. package/package/corpus/skills/cratis-screenplay-slice-design/references/public-boundaries-and-keys.md +5 -3
  29. package/package/corpus/skills/cratis-screenplay-slice-design/references/read-model-design.md +7 -3
  30. package/package/corpus/skills/cratis-screenplay-specifications/SKILL.md +3 -2
  31. package/package/corpus/skills/cratis-screenplay-specifications/references/query-rejections.md +4 -0
  32. package/package/corpus/skills/cratis-screenplay-specifications/references/vocabulary.md +17 -0
  33. package/package/corpus/skills/cratis-screenplay-streams-and-consistency/SKILL.md +3 -1
  34. package/package/corpus/skills/cratis-screenplay-streams-and-consistency/references/read-model-keys.md +46 -0
  35. package/package/corpus/skills/cratis-screenplay-toolchain/SKILL.md +11 -5
  36. package/package/corpus/skills/cratis-screenplay-toolchain/references/cheat-sheet.md +17 -2
  37. package/package/corpus/skills/cratis-screenplay-toolchain/references/diagnostics.md +22 -8
  38. package/package/corpus/skills/cratis-screenplay-toolchain/references/executable-subset.md +31 -9
  39. package/package/corpus/skills/cratis-screenplay-toolchain/references/language-admission.md +15 -5
  40. package/package/corpus/skills/cratis-screenplay-toolchain/references/production-routes-and-filters.md +1 -1
  41. package/package/corpus/skills/cratis-screenplay-toolchain/references/renderable-subset.md +3 -3
  42. package/package/corpus/skills/cratis-screenplay-toolchain/references/screenplay-contract.json +1722 -76
  43. package/package/corpus/skills/cratis-screenplay-toolchain/references/screenplay-contract.version +1 -1
  44. package/package/corpus/skills/cratis-screenplay-toolchain/references/traps.md +3 -2
  45. package/package/corpus/skills/cratis-screenplay-toolchain/references/verdicts.md +64 -3
  46. package/package/corpus/skills/cratis-screenplay-toolchain/verification.json +8 -2
  47. package/package/corpus/skills/cratis-stage-rendering-and-sandbox/SKILL.md +5 -4
  48. package/package/corpus/skills/cratis-stage-rendering-and-sandbox/references/admission.md +12 -7
  49. package/package/corpus/skills/cratis-stage-rendering-and-sandbox/references/sandbox-and-specrunner.md +17 -0
  50. package/package/corpus/skills/cratis-stage-rendering-and-sandbox/verification.json +1 -1
  51. package/package.json +1 -1
@@ -2,6 +2,7 @@
2
2
 
3
3
  ## Contents
4
4
 
5
+ - Validation commands and the gate file
5
6
  - Samples and preview fixtures
6
7
  - Lexical and structural rules
7
8
  - Exact numeric source mode
@@ -28,8 +29,8 @@ keeping the capture in Translate. No automatic split.
28
29
  Requires Screenplay 4.176.0 or later; older compilers leave that shape unchecked.
29
30
  Read
30
31
  [public contracts](../../cratis-screenplay-automations-and-translations/references/public-events-and-direction.md).
31
- View properties use trailing `key`; multipart `by` query/read blocks remain
32
- PLAY0268, not v10. Read [named keys](../../cratis-screenplay-read-surface/references/named-keys.md).
32
+ View properties use trailing `key`; several parts select v27 (not v10), with a `by` block on
33
+ an optional single-instance query and equality filters on lists. Read [named keys](../../cratis-screenplay-read-surface/references/named-keys.md).
33
34
  Production `stream Source.Stream` overrides and reaction/reducer `from Source[.Stream]`
34
35
  select released v10: [routes and filters](production-routes-and-filters.md).
35
36
  Qualifying non-route Double literals select v11;
@@ -57,6 +58,20 @@ by `for_Documentation/when_comparing_the_grammar_against_the_parsers.cs`),
57
58
  Screenplay CI (`when_compiling_every_example.cs`) against repository main: the standalone
58
59
  compiler; the compiler bundled in `cratis` can be older and lack the newest ESM versions.
59
60
 
61
+ ## Validation commands and the gate file
62
+
63
+ ```shell
64
+ screenplay <root> --warnaserror --no-color # V1; also reads <root>/screenplay.json
65
+ screenplay <root> --print-gate # effective gate and each value's source, no compile
66
+ screenplay <root> --format json # one JSON report: diagnostics, gate, exitCode
67
+ screenplay <root> --no-gate-file --check all # bypass the file for one run
68
+ screenplay test <root> # V4
69
+ ```
70
+
71
+ `screenplay.json` (authored, beside `.screenplay/`) holds `validation.checks`, `warningsAsErrors`, `scope`
72
+ and `openQuestions`; unknown keys or check names are refused (exit 2), never ignored. Details and
73
+ precedence: [verdicts](verdicts.md).
74
+
60
75
  ## Samples and preview fixtures
61
76
 
62
77
  Invoicing is a warning-free syntax showcase, not a runnable whole-language proof.
@@ -8,6 +8,7 @@
8
8
  - Explicit enum member numbers
9
9
  - Reserved stored names and event pins
10
10
  - Named keys, production routes and observer filters
11
+ - Reducer instance identity (PLAY0690)
11
12
  - Caller identity, compliance and routes
12
13
  - Specification metadata, callers, cases and locators
13
14
  - Guarded interaction diagnostics
@@ -137,13 +138,25 @@ Target evidence: a renderer must admit ESM v16 and preserve `storedName`, or ref
137
138
  | PLAY0665 | E | Invalid/duplicate/child-bearing/unresolved source/stream filter or filtered reaction with a non-event trigger |
138
139
  | PLAY0666 | W | Filter excludes all statically known effective producer routes; C# only, handlers/foreign origins suppress it |
139
140
 
140
- Queries and trigger reads have no PLAY0661 repair. Composite view keys, query
141
- blocks and their fixtures remain PLAY0268, while one explicit key binds
142
- byte-identically to inference. Fixtures missing any part report PLAY0351.
141
+ Queries and trigger reads have no PLAY0661 repair. Flat composite view keys bind as v27;
142
+ projection or removal key blocks missing a part report PLAY0661 and bad parts PLAY0662.
143
+ One explicit key binds byte-identically to inference. Fixtures missing any part
144
+ report PLAY0351. Joins, children, `every`, `all`, `nested`, `variant`, reducers and
145
+ list-query `by` blocks over a composite-keyed view are PLAY0268.
143
146
  Overrides/filters select released ESM v10; malformed routes also use PLAY0504.
144
147
  Read read-surface `references/named-keys.md` and
145
148
  [production routes and filters](production-routes-and-filters.md).
146
149
 
150
+ ## Reducer instance identity (PLAY0690)
151
+
152
+ | Code | Severity | Meaning / fix |
153
+ | --- | --- | --- |
154
+ | PLAY0690 | W | A reducer instance is keyed by the event-source id, so a reducer-backed scalar query `by` another nominal type, or a reducer whose complete producers use several identity types, warns. Reducers cannot be re-keyed: use a projection with a property key on each `from`, or a join for existing instances |
155
+
156
+ Fails `--warnaserror`. Compares declared nominal types only where producers are known (command `for`, implicit or generated identifiers, reaction `for`); plain `produces` without `for`, reactions without `for`, captures, seeds and code are not compared. Native C# only: a clean editor proves nothing. Example and limits: projections [reducer identity](../../cratis-screenplay-projections/references/reducer-identity.md).
157
+
158
+ Requires Screenplay 4.170.0 or later (`screenplay --version`); an older compiler does not report it, and `cratis screenplay validate` reports it only when its bundled compiler is that new.
159
+
147
160
  ## Caller identity, compliance and routes
148
161
 
149
162
  | Code | Severity | Meaning / fix |
@@ -307,8 +320,8 @@ identity details (0633–0646), compliance/subject checks, reaction identity
307
320
  A shared catalog code is not proof that a check is implemented in both compilers.
308
321
 
309
322
  C# CLI/MCP owns whole-application scoped diagnostics, opt-in completeness
310
- (including PLAY0530–0537, PLAY0602–0606 and PLAY0652), bound reaction gate
311
- checks PLAY0650/0651, semantic binding and PLAY0546 (a negated claim targets optional,
323
+ (including PLAY0530–0537, PLAY0602–0606 and PLAY0652), reducer identity
324
+ PLAY0690, bound reaction gate checks PLAY0650/0651, semantic binding and PLAY0546 (a negated claim targets optional,
312
325
  unavailable-subject or non-text data). The VS Code repair bridge is not a general
313
326
  C# validator. A clean editor is not V1 for the complete application, V3 binding
314
327
  or V4 execution. Run the CLI or MCP for those verdicts.
@@ -346,15 +359,16 @@ refusal reasons. Read [language admission](language-admission.md) before changin
346
359
  | PLAY0785 | Ambiguous view path; use distinct aliases on repeated reads |
347
360
  | PLAY0786 (I) | Eligible legacy model; preview typed preamble repair, individually review absence/conflict semantics |
348
361
  | PLAY0787 (W) | Exact deprecated Studio text-rule pattern; repair to literal rule or equality, preserving message/severity |
349
- | STAGE-ESM-043 | Atomic mode not realized, even in admitted v23–v25; retain declaration and gap-fill |
362
+ | STAGE-ESM-043 | Atomic mode not realized, even in admitted v23–v26; retain declaration and gap-fill |
350
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 |
351
364
  | STAGE-ESM-045 | Non-Error protected requirement; semantic Host/executor refuse before execution, including reaction-invoked commands; keep severity and report Unsupported |
352
365
  | STAGE-IMPL-002 | Described handler body not realized by Stage, even Stub mode; no stubs emitted |
353
366
 
354
367
  Invalid match syntax remains PLAY0367. Property/concept text rules bind v24;
355
368
  `contains`/`starts with` in conditions only still fail PLAY0268. Stage rejects
356
- v22/v26 and mixed pairs with STAGE-ESM-016; v23–v25 admission does not implement
357
- bodies, batches or rendered protected reads (STAGE-ESM-044). Requires Stage 4.129.0
369
+ v22/v27 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
358
372
  for semantic Host/executor protected reads; older engines refuse -044. Read
359
373
  [language admission](language-admission.md) for the stricter Host outside-append guard.
360
374
 
@@ -11,6 +11,7 @@
11
11
  - Generated values and responses (ESM v7)
12
12
  - Released public boundaries and observer routes
13
13
  - Chronological command date comparisons (ESM v26)
14
+ - Flat composite read-model keys (ESM v27)
14
15
  - Code attachments (what binds, what never does)
15
16
  - Refused (code, reason): fix, or record as a mode gap
16
17
  - Not refused, but do not rely on it
@@ -41,7 +42,7 @@ Complete examples that bind live in `executable-example.md`, `pdl-example.md` (p
41
42
  `automation-translate-example.md` (ESM v6) and `generated-responses-example.md` (ESM v7).
42
43
 
43
44
  For atomic batches (v22), described handlers (v23), ordinal text rules (v24) and
44
- protected reads (v25) and chronological command dates (v26), read
45
+ protected reads (v25), chronological command dates (v26) and composite keys (v27), read
45
46
  [language admission](language-admission.md). A later
46
47
  version alone does not enable either application opt-in.
47
48
 
@@ -86,10 +87,10 @@ Requires Screenplay 4.141.0 or later (`screenplay --version`) to bind concept co
86
87
  none supplies identity and an admitted list query exists does conventional
87
88
  `*Id` inference run (collection-key exclusions: read-surface `references/named-keys.md`).
88
89
  Queryless read models need an explicit `key`. Explicit single keys preserve
89
- equivalent inferred ESM bytes. Composite read-model keys, query `by` blocks and
90
- their fixtures remain PLAY0268. Collections and observable delivery bind.
90
+ equivalent inferred ESM bytes. Flat composite read-model keys bind as v27
91
+ (see below). Collections and observable delivery bind.
91
92
  Caller-supplied equality filters on collections also bind as ESM v14; context
92
- sources, single-result filters, scope, performer and composite `by` remain blocked.
93
+ sources, single-result filters, scope, performer and a list-query `by` block remain blocked.
93
94
  - One projection per read model: `from`, `every`, `all` (one block per level), `join`,
94
95
  `children`, `nested`, `remove with`, `remove via join` (binds; blocks the execution plan at the projection level, see below), `clear with`, counters, `add`,
95
96
  `subtract`, `set`, `clear`, variants, and the identifier mapped from the projection's key (`xId = $eventSourceId` only for an event-source key).
@@ -264,15 +265,36 @@ DateTime input needs an offset or `Z`, else Validation rejects before rules, eve
264
265
  for skipped comparisons. `then` matching stays ordinal. Invalid date literals or
265
266
  offset-less DateTime literals in admitted comparisons report PLAY0273. Read
266
267
  [date comparisons](../../cratis-screenplay-command-surface/references/date-comparisons.md)
267
- for the complete window model and retained PLAY0268 refusals. Stage refuses v26
268
- with STAGE-ESM-016, independently of standalone binding/reference execution.
268
+ for the complete window model and retained PLAY0268 refusals. The Stage renderer refuses
269
+ v26 date comparisons with STAGE-ESM-046, independently of standalone binding/reference execution.
270
+
271
+ ## Flat composite read-model keys (ESM v27)
272
+
273
+ Requires Screenplay 4.204.0 (ESM v27; `screenplay --version`); older binders refuse a
274
+ read model with two or more `key` marks with PLAY0268. Binding admits a model with
275
+ several flat scalar key parts when:
276
+
277
+ - root `from` and `remove with` blocks name every part in an untyped `key` block;
278
+ - a list query narrows with equality filters, and an optional single-instance query
279
+ names every part in a `by` block;
280
+ - fixtures state every part (`given readmodel`, `then readmodel`, `then no readmodel`).
281
+
282
+ Models with one `key` mark keep their earlier version and bytes. Refused with PLAY0268:
283
+ joins, `children`, `remove via join`, `every`, `all`, `nested`, `clear with`, `variant`
284
+ and reducers on the composite-keyed read model, a list query with a `by` block, a
285
+ non-optional single-instance return, and command reads (PLAY0271, or PLAY0781
286
+ ByParts under `command reads protected`) or trigger reads that produce directly.
287
+ Stage refuses v27 with STAGE-ESM-016, independently of standalone binding and
288
+ reference execution. Read read-surface
289
+ [named keys](../../cratis-screenplay-read-surface/references/named-keys.md) for the
290
+ complete example.
269
291
 
270
292
  ## Code attachments (what binds, what never does)
271
293
 
272
294
  Pending `handler implementation` beside unconditional `produces` binds as a described
273
295
  command (v23). Its payload-only body returns Unsupported ImplementationBody when reached;
274
296
  denial/validation specs still run. Read [language admission](language-admission.md) for
275
- v22–v26 and [described handlers](../../cratis-screenplay-command-surface/references/described-handlers.md)
297
+ v22–v27 and [described handlers](../../cratis-screenplay-command-surface/references/described-handlers.md)
276
298
  for the result contract. Attached handlers remain unbound.
277
299
 
278
300
  Inline fences (`csharp`, `typescript`, `react`, `html`, `sql`) and `file <path>` attach
@@ -316,7 +338,7 @@ bodies still leave their owner non-executable.
316
338
  | `Automation` or `Translate` slice, `reaction`, `capture`, `trigger`; `given clock`, `when clock`, `when trigger`, `when capture` | PLAY0268 | **older bundled compilers only**; current compilers bind them (ESM v6) |
317
339
  | Unquoted `import Other.Contract` | PLAY0268 | external contract import is not bound |
318
340
  | `pii` or `secret` on a concept | PLAY0268 | Older compilers refuse it outright. Current compilers admit v13 except enum/identity compliance and events mixing personal or explicitly subject-scoped secret values with explicit subject marks; see `compliance.md` in command-surface references |
319
- | `query` with a composite `by` block, or `by ... from` context-derived arguments | PLAY0268 | composite `by` blocks remain unadmitted. An optional scalar snapshot lookup, an unfiltered list (`RM[]`) and a list narrowed by one caller-supplied `by` key bind, in their `observable` form too |
341
+ | `query` with a `by` block over a list, or `by ... from` context-derived arguments | PLAY0268 | a `by` block binds only on an optional single-instance query (v27). An optional scalar snapshot lookup, an unfiltered list (`RM[]`) and a list narrowed by one caller-supplied `by` key bind, in their `observable` form too |
320
342
  | Context `from`, single-result filters, `scoped to`, `performer` queries | PLAY0268 | Typed query context, filtering of single results, opaque scope and query implementation remain unadmitted; each refusal names its reason. Caller-supplied collection equality filters bind as v14. `observable` goes in the return position (`=> observable RM[]`); as a body line it is PLAY0048 |
321
343
  | `contains` or `starts with` in conditions only | PLAY0268 | conditions admit scalar equality and numeric ordering, plus same-primitive command date comparisons from v26; property/concept text rules bind as v24 |
322
344
  | Date comparisons with mixed primitives, `$context` (including occurred), `today`, protected read paths, optional condition operands, concept rules or reaction `where` | PLAY0268 | v26 admits only command conditions and command/property literal validation rules |
@@ -338,7 +360,7 @@ bodies still leave their owner non-executable.
338
360
  | `generated` or `returns` on an older compiler | PLAY0268 | admitted from ESM v7, see above |
339
361
  | Operations or systems, `numbers exact` source mode | PLAY0268 | not admitted by any supported ESM version; one such construct leaves the **whole** application without an executable model. Event sources/streams/routes instead bind as ESM v8 on the current compiler (`sources-and-streams.md`) |
340
362
  | Spec of a gated command or query without `given caller` | PLAY0389 | module and feature gates count |
341
- | `given` or `then readmodel` missing key parts | PLAY0351 | explicit `key` marks replace inference; composite fixtures need every part but remain unadmitted |
363
+ | `given` or `then readmodel` missing key parts | PLAY0351 | explicit `key` marks replace inference; composite fixtures need every part (v27) |
342
364
  | When-less spec asserting events or errors | PLAY0352 | |
343
365
  | `null` in command or event values | PLAY0350 | Chronicle semantics, not only a binder limit: an optional fact is a separate event (nullable event properties are CHR0012) |
344
366
  | `for` with no unambiguous destination type | PLAY0273 | |
@@ -1,7 +1,7 @@
1
1
  <!-- Copyright (c) Cratis. All rights reserved. -->
2
2
  <!-- Licensed under the MIT license. See LICENSE file in the project root for full license information. -->
3
3
 
4
- # Language admission: batches, described bodies, text, reads and dates
4
+ # Language admission: batches, described bodies, text, reads, dates and composite keys
5
5
 
6
6
  Select the highest version required by constructs in the model. A newer version
7
7
  alone never opts into either application mode. Consumers must explicitly admit
@@ -9,11 +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–v25 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–v26 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
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 |
16
- | v26 | Chronological command Date/DateTime comparisons | Same-primitive `==`, `!=`, `>`, `>=`, `<`, `<=`; DateTime UTC ticks and pre-rule offset validation | v26 refused STAGE-ESM-016 |
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
18
 
18
19
  Requires Screenplay 4.181.0 or later (`screenplay --version`) for atomic batches; older compilers cannot admit the preamble.
19
20
 
@@ -25,6 +26,8 @@ Requires Screenplay 4.193.0 or later (`screenplay --version`) for protected read
25
26
 
26
27
  Requires Screenplay 4.199.0 (ESM v26; `screenplay --version`) for date comparisons; older binders report PLAY0268.
27
28
 
29
+ Requires Screenplay 4.204.0 (ESM v27; `screenplay --version`) for composite read-model keys; older binders report PLAY0268.
30
+
28
31
  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.
29
32
 
30
33
  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.
@@ -56,8 +59,15 @@ positions, invalid date literals or offset-less DateTime literals use PLAY0273.
56
59
  Read [date comparisons](../../cratis-screenplay-command-surface/references/date-comparisons.md)
57
60
  for the complete interval example and input/target boundaries.
58
61
 
59
- Stage's semantic engines admit exact v1–v21 and v23–v25 pairs. V22/v26 and mixed
60
- pairs refuse STAGE-ESM-016. Admission of v23–v25 is not admission of described bodies,
62
+ For v27, read read-surface [named keys](../../cratis-screenplay-read-surface/references/named-keys.md)
63
+ for the one complete example and every refusal. Only a model with a read model of two or
64
+ more key parts selects v27; one `key` mark keeps its earlier version and bytes. To see the
65
+ selected version, open the model with the `screenplay` MCP server and call `read-workspace`
66
+ with `view` `executable-model`: `languageVersion` reads `27.0`.
67
+
68
+ Stage's semantic engines admit exact v1–v21 and v23–v26 pairs. V22/v27 and mixed
69
+ pairs refuse STAGE-ESM-016. Requires Stage 4.135.0 for v26 admission; older Stage
70
+ refuses v26 with STAGE-ESM-016. Admission of v23–v26 is not admission of described bodies,
61
71
  atomic mode or rendered protected reads. A CLI may bundle an older compiler/Stage pair: run no-write render
62
72
  admission rather than transferring a standalone verdict. Pattern diagnostics arise
63
73
  in Screenplay before rendering; diagnostic arguments add no ESM version or new tool.
@@ -103,7 +103,7 @@ and wrong source/stream, and unrouted input. Read [specification route forms](so
103
103
 
104
104
  ESM v10 carries reaction system identity, production route overrides and observer filters as one
105
105
  frozen contract. A consumer admitting v10 must include all three, not just identity.
106
- Composite **read-model** keys are separate and remain unadmitted (PLAY0268).
106
+ Composite **read-model** keys are separate and select v27 (`language-admission.md`).
107
107
 
108
108
  The CLI/Stage pair admits through its newest version to construct checks: production overrides
109
109
  still refuse STAGE-ESM-036; reaction/reducer filters render on the semantic path,
@@ -21,9 +21,9 @@ and concept compliance (v13) render.
21
21
 
22
22
  ## Current admission
23
23
 
24
- Stage admits exact ESM v1–v21 and v23–v25 pairs; v22/v26 and mixed pairs
24
+ Stage admits exact ESM v1–v21 and v23–v26 pairs; v22/v27 and mixed pairs
25
25
  refuse STAGE-ESM-016. Chronological command Date/DateTime comparisons select v26:
26
- standalone binding/reference execution does not make them renderable. Keep the
26
+ the Host and executor run them, but the renderer refuses STAGE-ESM-046, so they are not renderable. Keep the
27
27
  rule and use authorized gap-fill. Version admission is separate from construct support.
28
28
  Requires Stage 4.106.0 for v18 admission; older Stage refuses it with `STAGE-ESM-016`.
29
29
  For generated-concept v20/v21 admission and construct prerequisites, read
@@ -46,7 +46,7 @@ This table is a reading of the renderer's admission, not a render result: run th
46
46
  | Area | Renders | Refused (code) |
47
47
  | --- | --- | --- |
48
48
  | 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 composite `by`: PLAY0268. 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 |
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 |
50
50
  | 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
51
  | Event sources, streams, routes (ESM v8) | rendered, including routed read-model/query companion replay | reserved stored names, unformattable routed fixtures (`STAGE-ESM-030`) |
52
52
  | Numbers, case tables | whole numbers as `long` from ESM v8; case tables | out-of-`int` literals below v8 (`STAGE-ESM-031`) |