@cratis/pi 7.68.1 → 7.69.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/package/corpus/product-sync.json +8 -8
- package/package/corpus/skills/cratis-screenplay-automations-and-translations/references/audit-format.md +1 -1
- package/package/corpus/skills/cratis-screenplay-command-surface/SKILL.md +5 -0
- package/package/corpus/skills/cratis-screenplay-command-surface/references/text-and-match-rules.md +1 -1
- package/package/corpus/skills/cratis-screenplay-command-surface/references/uuid-equality.md +134 -0
- package/package/corpus/skills/cratis-screenplay-command-surface/verification.json +2 -0
- package/package/corpus/skills/cratis-screenplay-model-review/references/anti-patterns.md +1 -1
- package/package/corpus/skills/cratis-screenplay-model-review/references/checklist.md +2 -2
- package/package/corpus/skills/cratis-screenplay-render-and-gap-fill/SKILL.md +1 -1
- package/package/corpus/skills/cratis-screenplay-toolchain/SKILL.md +5 -1
- package/package/corpus/skills/cratis-screenplay-toolchain/references/diagnostics.md +3 -3
- package/package/corpus/skills/cratis-screenplay-toolchain/references/executable-subset.md +22 -5
- package/package/corpus/skills/cratis-screenplay-toolchain/references/language-admission.md +10 -1
- package/package/corpus/skills/cratis-screenplay-toolchain/references/renderable-subset.md +2 -2
- package/package/corpus/skills/cratis-screenplay-toolchain/references/screenplay-contract.json +2288 -614
- package/package/corpus/skills/cratis-screenplay-toolchain/references/screenplay-contract.version +1 -1
- package/package/corpus/skills/cratis-screenplay-toolchain/verification.json +1 -0
- package/package/corpus/skills/cratis-stage-rendering-and-sandbox/SKILL.md +3 -1
- package/package/corpus/skills/cratis-stage-rendering-and-sandbox/references/admission.md +11 -4
- package/package.json +1 -1
|
@@ -125,9 +125,9 @@
|
|
|
125
125
|
}
|
|
126
126
|
],
|
|
127
127
|
"synced": {
|
|
128
|
-
"version": "3.
|
|
129
|
-
"date": "2026-10-
|
|
130
|
-
"by": "Cratis/AI#
|
|
128
|
+
"version": "3.74.0",
|
|
129
|
+
"date": "2026-10-17",
|
|
130
|
+
"by": "Cratis/AI#746"
|
|
131
131
|
},
|
|
132
132
|
"covers": {
|
|
133
133
|
"skills": [
|
|
@@ -158,7 +158,7 @@
|
|
|
158
158
|
],
|
|
159
159
|
"rules": []
|
|
160
160
|
},
|
|
161
|
-
"notes": "Render bundle source-checked at v3.
|
|
161
|
+
"notes": "Render bundle source-checked at v3.74.0 (release notes v3.63.0-v3.74.0 and Documentation/reference/screenplay.md): Screenplay 4.201.0 and Stage 4.135.0; CLI rendering admits ESM v1-v26 (v17/v19 from 3.63.0, v18 from 3.65.0, v20 from 3.66.0, v21-v26 from 3.74.0); Stage refuses unsupported constructs with typed STAGE-ESM codes (v22 STAGE-ESM-016, v26 date comparisons STAGE-ESM-046) and CLI-RENDER-004 blocks v27 and later. No render probe: the installed CLI is 3.65.0. Prior at v3.62.0: Screenplay 4.159.0 and Stage 4.99.0, ESM v1-v16. PATH render uses persisted root identities read-only, rejects root/name conflicts, checks destination event ids at every scope, and reports baseline warnings. CLI baseline admit/check and open-question validation are available. Other CLI operations retain prior evidence; no new render/browser probe."
|
|
162
162
|
},
|
|
163
163
|
{
|
|
164
164
|
"id": "screenplay",
|
|
@@ -171,9 +171,9 @@
|
|
|
171
171
|
}
|
|
172
172
|
],
|
|
173
173
|
"synced": {
|
|
174
|
-
"version": "4.
|
|
175
|
-
"date": "2026-10-
|
|
176
|
-
"by": "Cratis/AI#
|
|
174
|
+
"version": "4.205.0",
|
|
175
|
+
"date": "2026-10-17",
|
|
176
|
+
"by": "Cratis/AI#746"
|
|
177
177
|
},
|
|
178
178
|
"covers": {
|
|
179
179
|
"skills": [
|
|
@@ -201,7 +201,7 @@
|
|
|
201
201
|
],
|
|
202
202
|
"rules": []
|
|
203
203
|
},
|
|
204
|
-
"notes": "Standalone 4.204.0 and byte-identical compiler contract pinned. Cratis/AI#702 and #691: PLAY0690 reducer identity (Screenplay 4.170.0, native compiler only) and the screenplay.json validation gate (Screenplay 4.165.0; cratis screenplay validate reads it from CLI 3.65.0) are taught and probed against the 4.204.0 compiler. Cratis/AI#743: flat composite read-model keys (ESM v27): untyped projection key blocks on root from and remove with, equality-filter lists, single-instance by blocks and per-part fixtures, with PLAY0661/PLAY0662/PLAY0268 refusals checked against the 4.204.0 compiler; Stage origin/main still refuses v27 with STAGE-ESM-016 (stage-rendering.md); Stage v4.135.0 v26 admission (Host and executor run date comparisons; renderer STAGE-ESM-046) was source-checked for this sync; no render or runtime probe. Prior: Standalone 4.201.0 and byte-identical compiler contract pinned. Cratis/AI#733: the ui profile root template, shell options, appearance and new screens default (PLAY0788-PLAY0799, quick fix for the legacy layout line, ui-profiles MCP tool, 44 tools). Cratis/AI#735: chronological Date/DateTime ordering in command conditions and command/property literal validation (ESM v26), UTC tick precision and pre-rule offset validation; then matching remains ordinal. Source-checked Screenplay v4.199.0 commands, diagnostics, interoperability and specifications documentation plus decision 0087. Stage v4.127.1 still refuses v26 with STAGE-ESM-016 (stage-rendering.md and SemanticVersionFeatures.Supports); no render/runtime probe. Cratis/AI#576: prior mechanical compiler catch-up. Language batch #717/#722/#723/#724/#720/#728/#734 teaches atomic reaction batches (v22), described payload handlers (v23), portable linear matching, ordinal text rules (v24), protected command reads (v25), diagnostic arguments and event-source invokes mappings. Facts read at Screenplay v4.198.0 and introducing tags; Stage v4.127.0 admits exact v1-v21 and v23-v25 pairs but refuses v22/v26 and mixed pairs (STAGE-ESM-016), protected reads (044), atomic mode (043) and described handlers (STAGE-IMPL-002), even Stub mode. Stage text rules execute/render; no new renderer/runtime probe or Stage pin uplift. Cratis/AI#706: application navigation regions (module inherit, extend or override), toolbar slice buttons, blueprint template references and sample data packs in cratis-screenplay-ui-composition (references/application-shell.md), with the canonical shell vector and the rejection codes PLAY0710-PLAY0722 and PLAY0740-PLAY0765. Examples moved to the executable-state rules since 4.164: translator reactions in an Automation slice beside the Translate slice (PLAY0694) and the first record of a capture key appended with `when added`. Earlier: Standalone 4.164.0 and byte-identical compiler contract pinned. Cratis/AI#663: one origin per capture (PLAY0687). #668: executable no-event/redelivery v17. #684: concept query-argument validation in every version and query-error assertions v18. #681: executable refusal branches and refusal values v19. #666: proposal summary/severity counts and exact structural source proposals. Generated-concept rules select v20 with PLAY0688/0689 proofs and derived-matches repair; generated secrets and preview strategies remain refused. Release-baseline from-esm admission reads storedName. Standalone binding is not renderer admission: Stage 4.103.0 admits v1-v17 and v19; CLI 3.62.0 bundles Screenplay 4.159.0 / Stage 4.99.0 and renders through v16. Prior evidence remains unless superseded; no new renderer, Docker or browser probe."
|
|
204
|
+
"notes": "Standalone 4.205.0 and byte-identical compiler contract pinned. Cratis/AI#746: Uuid ==/!= in command require and produces when (ESM v28): same-concept rule, bare Uuid against a concept, canonical literals, protected read paths in require only; PLAY0268 (different concepts, ordering, Uuid validation and concept rules, read paths in produces when) and PLAY0273 (non-canonical literal) checked against the 4.205.0 compiler, v28 selection read from the MCP executable-model view; Stage admits exact v1-v21 and v23-v26 pairs so v28 is refused STAGE-ESM-016, not probed against a Stage image; CLI 3.74.0 renders through v26. Prior: Standalone 4.204.0 and byte-identical compiler contract pinned. Cratis/AI#702 and #691: PLAY0690 reducer identity (Screenplay 4.170.0, native compiler only) and the screenplay.json validation gate (Screenplay 4.165.0; cratis screenplay validate reads it from CLI 3.65.0) are taught and probed against the 4.204.0 compiler. Cratis/AI#743: flat composite read-model keys (ESM v27): untyped projection key blocks on root from and remove with, equality-filter lists, single-instance by blocks and per-part fixtures, with PLAY0661/PLAY0662/PLAY0268 refusals checked against the 4.204.0 compiler; Stage origin/main still refuses v27 with STAGE-ESM-016 (stage-rendering.md); Stage v4.135.0 v26 admission (Host and executor run date comparisons; renderer STAGE-ESM-046) was source-checked for this sync; no render or runtime probe. Prior: Standalone 4.201.0 and byte-identical compiler contract pinned. Cratis/AI#733: the ui profile root template, shell options, appearance and new screens default (PLAY0788-PLAY0799, quick fix for the legacy layout line, ui-profiles MCP tool, 44 tools). Cratis/AI#735: chronological Date/DateTime ordering in command conditions and command/property literal validation (ESM v26), UTC tick precision and pre-rule offset validation; then matching remains ordinal. Source-checked Screenplay v4.199.0 commands, diagnostics, interoperability and specifications documentation plus decision 0087. Stage v4.127.1 still refuses v26 with STAGE-ESM-016 (stage-rendering.md and SemanticVersionFeatures.Supports); no render/runtime probe. Cratis/AI#576: prior mechanical compiler catch-up. Language batch #717/#722/#723/#724/#720/#728/#734 teaches atomic reaction batches (v22), described payload handlers (v23), portable linear matching, ordinal text rules (v24), protected command reads (v25), diagnostic arguments and event-source invokes mappings. Facts read at Screenplay v4.198.0 and introducing tags; Stage v4.127.0 admits exact v1-v21 and v23-v25 pairs but refuses v22/v26 and mixed pairs (STAGE-ESM-016), protected reads (044), atomic mode (043) and described handlers (STAGE-IMPL-002), even Stub mode. Stage text rules execute/render; no new renderer/runtime probe or Stage pin uplift. Cratis/AI#706: application navigation regions (module inherit, extend or override), toolbar slice buttons, blueprint template references and sample data packs in cratis-screenplay-ui-composition (references/application-shell.md), with the canonical shell vector and the rejection codes PLAY0710-PLAY0722 and PLAY0740-PLAY0765. Examples moved to the executable-state rules since 4.164: translator reactions in an Automation slice beside the Translate slice (PLAY0694) and the first record of a capture key appended with `when added`. Earlier: Standalone 4.164.0 and byte-identical compiler contract pinned. Cratis/AI#663: one origin per capture (PLAY0687). #668: executable no-event/redelivery v17. #684: concept query-argument validation in every version and query-error assertions v18. #681: executable refusal branches and refusal values v19. #666: proposal summary/severity counts and exact structural source proposals. Generated-concept rules select v20 with PLAY0688/0689 proofs and derived-matches repair; generated secrets and preview strategies remain refused. Release-baseline from-esm admission reads storedName. Standalone binding is not renderer admission: Stage 4.103.0 admits v1-v17 and v19; CLI 3.62.0 bundles Screenplay 4.159.0 / Stage 4.99.0 and renders through v16. Prior evidence remains unless superseded; no new renderer, Docker or browser probe."
|
|
205
205
|
},
|
|
206
206
|
{
|
|
207
207
|
"id": "scene",
|
|
@@ -12,7 +12,7 @@ technique: partial work stays visible and nothing is skipped because it looked r
|
|
|
12
12
|
Result is `complete` only when every column is filled or says why it does not apply (for example
|
|
13
13
|
"direct effect: immediate, internal, cannot fail"). `open` names the unresolved decision and who
|
|
14
14
|
answers. `blocked` names the actual capability gap with intended behavior. For example,
|
|
15
|
-
the CLI/Stage pair (toolchain `references/renderable-subset.md`) admits through ESM
|
|
15
|
+
the CLI/Stage pair (toolchain `references/renderable-subset.md`) admits through ESM v26 to construct checks; role/authenticated reaction identity
|
|
16
16
|
renders, while claim-reading/opaque system gates still refuse STAGE-ESM-034. Previous CLI 3.46.1 refused v10 at the version gate
|
|
17
17
|
with CLI-RENDER-004; do not report that historical refusal as the current gap.
|
|
18
18
|
|
|
@@ -185,6 +185,11 @@ when ordering a retention window with `require to >= from`, comparing instants
|
|
|
185
185
|
across offsets, or rejecting offset-less inputs before rules. It covers admitted
|
|
186
186
|
positions, PLAY0268/0273, ordinal `then` matching and Stage's STAGE-ESM-046 renderer refusal.
|
|
187
187
|
|
|
188
|
+
Requires Screenplay 4.205.0 (ESM v28; `screenplay --version`) for `==`/`!=` between Uuid
|
|
189
|
+
values (properties, concepts, identities, canonical literals, and read paths in `require`);
|
|
190
|
+
older binders report PLAY0268. Read [Uuid equality](references/uuid-equality.md) for the same-concept
|
|
191
|
+
rule, PLAY0268/0273 and the refused shapes (ordering, Uuid validation rules, Uuid concept rules).
|
|
192
|
+
|
|
188
193
|
**Rules whose logic is code.** A bare `rule <Name>` has no portable meaning (`PLAY0268`) and a bodied rule binds only as
|
|
189
194
|
opaque code. Read [references/validate-rules.md](references/validate-rules.md) when a rule's logic must live in a `file`
|
|
190
195
|
or fenced code body.
|
package/package/corpus/skills/cratis-screenplay-command-surface/references/text-and-match-rules.md
CHANGED
|
@@ -32,7 +32,7 @@ value passes; add `not empty` to require presence. An empty operand makes `conta
|
|
|
32
32
|
Equality and inequality remain `== "x"` and `!= "x"`.
|
|
33
33
|
|
|
34
34
|
This is not condition grammar: `contains`/`starts with` in `require`, `produces when`
|
|
35
|
-
or reaction `where` remain PLAY0268. Those conditions admit scalar equality and
|
|
35
|
+
or reaction `where` remain PLAY0268. Those conditions admit scalar equality (including Uuid from v28) and
|
|
36
36
|
numeric ordering, not the property text rules.
|
|
37
37
|
|
|
38
38
|
Requires Stage 4.124.0 for v24 text-rule admission (`cratis --version` identifies the CLI bundle); older renderers refuse v24 with STAGE-ESM-016.
|
|
@@ -0,0 +1,134 @@
|
|
|
1
|
+
<!-- Copyright (c) Cratis. All rights reserved. -->
|
|
2
|
+
<!-- Licensed under the MIT license. See LICENSE file in the project root for full license information. -->
|
|
3
|
+
|
|
4
|
+
# Uuid equality in command conditions
|
|
5
|
+
|
|
6
|
+
## Contents
|
|
7
|
+
|
|
8
|
+
- Complete model
|
|
9
|
+
- Operands and literals
|
|
10
|
+
- Refusals and target boundary
|
|
11
|
+
|
|
12
|
+
Requires Screenplay 4.205.0 (ESM v28; `screenplay --version`); older binders refuse Uuid comparisons with PLAY0268. Upgrade the compiler without weakening the rule.
|
|
13
|
+
|
|
14
|
+
A command `require` or `produces when` condition compares Uuid values with `==` and `!=`.
|
|
15
|
+
Use it for ownership and self-approval rules: the caller is the owner, the reviewer is not
|
|
16
|
+
the author. The model below needs `command reads protected` only for the protected read
|
|
17
|
+
path in `require`; a comparison between command properties needs no preamble.
|
|
18
|
+
|
|
19
|
+
## Complete model
|
|
20
|
+
|
|
21
|
+
```screenplay
|
|
22
|
+
domain Documents
|
|
23
|
+
command reads protected
|
|
24
|
+
concept DocumentId : Uuid
|
|
25
|
+
concept PersonId : Uuid
|
|
26
|
+
module Library
|
|
27
|
+
feature Ownership
|
|
28
|
+
slice StateView CurrentDocument
|
|
29
|
+
event DocumentCreated
|
|
30
|
+
owner PersonId
|
|
31
|
+
event DocumentRemoved
|
|
32
|
+
readmodel Document
|
|
33
|
+
id DocumentId key
|
|
34
|
+
owner PersonId
|
|
35
|
+
projection CurrentProjection => Document
|
|
36
|
+
from DocumentCreated
|
|
37
|
+
owner = owner
|
|
38
|
+
remove with DocumentRemoved
|
|
39
|
+
slice StateChange CreateDocument
|
|
40
|
+
command CreateDocument
|
|
41
|
+
id DocumentId identifier
|
|
42
|
+
owner PersonId
|
|
43
|
+
produces DocumentCreated
|
|
44
|
+
for id
|
|
45
|
+
owner = owner
|
|
46
|
+
slice StateChange RenameDocument
|
|
47
|
+
command RenameDocument
|
|
48
|
+
id DocumentId identifier
|
|
49
|
+
caller PersonId
|
|
50
|
+
title String
|
|
51
|
+
reads Document by id
|
|
52
|
+
validate
|
|
53
|
+
require caller == Document.owner
|
|
54
|
+
message "Only the owner can rename a document"
|
|
55
|
+
produces DocumentRenamed
|
|
56
|
+
for id
|
|
57
|
+
title = title
|
|
58
|
+
event DocumentRenamed
|
|
59
|
+
title String
|
|
60
|
+
specification OwnerRenames
|
|
61
|
+
given DocumentCreated
|
|
62
|
+
for "3fa85f64-5717-4562-b3fc-2c963f66afa6"
|
|
63
|
+
owner = "0b6c1f0e-7d3a-4a52-9a3e-6f1d2c3b4a59"
|
|
64
|
+
when RenameDocument
|
|
65
|
+
id = "3fa85f64-5717-4562-b3fc-2c963f66afa6"
|
|
66
|
+
caller = "0b6c1f0e-7d3a-4a52-9a3e-6f1d2c3b4a59"
|
|
67
|
+
title = "Plan"
|
|
68
|
+
then DocumentRenamed
|
|
69
|
+
for "3fa85f64-5717-4562-b3fc-2c963f66afa6"
|
|
70
|
+
title = "Plan"
|
|
71
|
+
specification StrangerCannotRename
|
|
72
|
+
given DocumentCreated
|
|
73
|
+
for "3fa85f64-5717-4562-b3fc-2c963f66afa6"
|
|
74
|
+
owner = "0b6c1f0e-7d3a-4a52-9a3e-6f1d2c3b4a59"
|
|
75
|
+
when RenameDocument
|
|
76
|
+
id = "3fa85f64-5717-4562-b3fc-2c963f66afa6"
|
|
77
|
+
caller = "9d2b0c1e-1a2b-4c3d-8e4f-5a6b7c8d9e0f"
|
|
78
|
+
title = "Plan"
|
|
79
|
+
then error "Only the owner can rename a document"
|
|
80
|
+
slice StateChange ReviewDocument
|
|
81
|
+
command ReviewDocument
|
|
82
|
+
id DocumentId identifier
|
|
83
|
+
author PersonId
|
|
84
|
+
reviewer PersonId
|
|
85
|
+
produces DocumentReviewed
|
|
86
|
+
for id
|
|
87
|
+
produces when reviewer != author
|
|
88
|
+
ReviewIndependent
|
|
89
|
+
for id
|
|
90
|
+
event DocumentReviewed
|
|
91
|
+
event ReviewIndependent
|
|
92
|
+
specification IndependentReview
|
|
93
|
+
when ReviewDocument
|
|
94
|
+
id = "3fa85f64-5717-4562-b3fc-2c963f66afa6"
|
|
95
|
+
author = "0b6c1f0e-7d3a-4a52-9a3e-6f1d2c3b4a59"
|
|
96
|
+
reviewer = "9d2b0c1e-1a2b-4c3d-8e4f-5a6b7c8d9e0f"
|
|
97
|
+
then DocumentReviewed
|
|
98
|
+
for "3fa85f64-5717-4562-b3fc-2c963f66afa6"
|
|
99
|
+
then ReviewIndependent
|
|
100
|
+
for "3fa85f64-5717-4562-b3fc-2c963f66afa6"
|
|
101
|
+
specification SelfReview
|
|
102
|
+
when ReviewDocument
|
|
103
|
+
id = "3fa85f64-5717-4562-b3fc-2c963f66afa6"
|
|
104
|
+
author = "0b6c1f0e-7d3a-4a52-9a3e-6f1d2c3b4a59"
|
|
105
|
+
reviewer = "0b6c1f0e-7d3a-4a52-9a3e-6f1d2c3b4a59"
|
|
106
|
+
then DocumentReviewed
|
|
107
|
+
for "3fa85f64-5717-4562-b3fc-2c963f66afa6"
|
|
108
|
+
```
|
|
109
|
+
|
|
110
|
+
## Operands and literals
|
|
111
|
+
|
|
112
|
+
- An operand is a required scalar command property of type `Uuid`, a Uuid concept or
|
|
113
|
+
identity, a protected read path (`Document.owner`, in `require` only) or a literal.
|
|
114
|
+
- When both sides are concepts or identities they must be the same concept. A bare `Uuid`
|
|
115
|
+
compares with any Uuid concept. Comparing two different concepts (`id == Document.owner`
|
|
116
|
+
above) is PLAY0268: it keeps an authorization rule from comparing unrelated identities.
|
|
117
|
+
Convert the model rather than loosening the rule: give both sides the same concept.
|
|
118
|
+
- A literal is a lowercase hyphenated Uuid such as `0b6c1f0e-7d3a-4a52-9a3e-6f1d2c3b4a59`.
|
|
119
|
+
Uppercase or unhyphenated text is PLAY0273.
|
|
120
|
+
- A comparison selects ESM v28. The same model without a Uuid comparison keeps its earlier version.
|
|
121
|
+
|
|
122
|
+
## Refusals and target boundary
|
|
123
|
+
|
|
124
|
+
PLAY0268 still refuses ordering (`<`, `>`), optional operands, Uuid validation rules on
|
|
125
|
+
a command property (`caller == "…"` under `validate`), Uuid rules on a concept, read paths
|
|
126
|
+
in `produces when`, collection operands, and text property, `$context` or reaction `where` operands; a
|
|
127
|
+
text literal such as `"x"` reports PLAY0273. Compare the Uuid
|
|
128
|
+
in a `require` instead of a property rule.
|
|
129
|
+
|
|
130
|
+
A renderer or CLI that does not admit v28 refuses it (Stage with STAGE-ESM-016, a CLI
|
|
131
|
+
with CLI-RENDER-004, or PLAY0268 when its bundled compiler predates Uuid equality); the
|
|
132
|
+
standalone compiler and `screenplay test` are unaffected. Keep the condition and hand-write its enforcement through render-and-gap-fill.
|
|
133
|
+
Specify the accepting and refusing caller, as the model does. `screenplay <root> --warnaserror`
|
|
134
|
+
must exit zero and `screenplay test <root>` must pass.
|
|
@@ -3,6 +3,8 @@
|
|
|
3
3
|
"input": "Declare a Screenplay command with validation, authorization, a uniqueness constraint and a state-dependent rule.",
|
|
4
4
|
"fixtures": [],
|
|
5
5
|
"assertions": [
|
|
6
|
+
{ "kind": "skill-contains", "value": "same concept", "file": "references/uuid-equality.md" },
|
|
7
|
+
{ "kind": "skill-contains", "value": "lowercase hyphenated Uuid", "file": "references/uuid-equality.md" },
|
|
6
8
|
{ "kind": "play-compiles" },
|
|
7
9
|
{ "kind": "skill-contains", "value": "require to >= from", "file": "references/date-comparisons.md" },
|
|
8
10
|
{ "kind": "skill-contains", "value": "RejectingAMissingOffset", "file": "references/date-comparisons.md" },
|
|
@@ -65,7 +65,7 @@ the problem, the checks it violates, the fix, all pinned to one declaration.
|
|
|
65
65
|
| Gated command invoked by a reaction without a declared actor | reaction `invokes` a command under a caller policy and has no `runs as system role "<Role>"` that satisfies the gate | the invocation carries no caller: rejected at run time | D (major) | declare `runs as system role "<Role>"` with the least-privilege role the gate admits (ESM v10, Screenplay 4.125.0; Stage 4.89.1 renders role/authenticated trusted actors, but claim-reading/opaque gates still refuse STAGE-ESM-034 and need gap-fill) or record another trusted-path decision - never just delete the gate. A matching `runs as system role` is the admitted trusted path, not a defect |
|
|
66
66
|
| `reads` + `produces` reaction | reaction both reads a view and produces | fails binding | C (executable) | invoke a command, or produce without reads |
|
|
67
67
|
| Unadmitted read claimed protected | rule "checked" by legacy command or trigger reads | no protected contract or target realization | D (major) | opt eligible command reads into `command reads protected` (v25); inspect shape, absence and conflict cases. The Cratis C# renderer refuses protected reads (STAGE-ESM-044); distinguish reference/semantic-engine evidence from generated-app protection; checklist E3 |
|
|
68
|
-
| Caller-supplied state rule | `require currentStatus == "open"` where the caller sends `currentStatus` | the caller decides its own permission | D (major) | read authoritative stored state through admitted protected reads and `require`; mark legacy/refused shapes and target realization as gaps; checklist E3 |
|
|
68
|
+
| Caller-supplied state rule | `require currentStatus == "open"` where the caller sends `currentStatus` | the caller decides its own permission | D (major) | read authoritative stored state through admitted protected reads and `require`; mark legacy/refused shapes and target realization as gaps; checklist E3. Uuid ownership compares the caller with the stored owner (`require caller == Document.owner`, v28) |
|
|
69
69
|
| `severity warning` as soft rule | rule meant to warn but still rejects | blocks valid requests | C semantics | remove or make it a real rule |
|
|
70
70
|
| Relay events | `*Synced`, `*Forwarded` events that only move data | noise, not facts | D | translate once into a business fact |
|
|
71
71
|
| External event driving a worker directly | captured external record invokes commands with no local fact | no audit of what was learned | D | append a local fact in `Translate`; automate from it |
|
|
@@ -123,7 +123,7 @@ the format in `worked-example.md`.
|
|
|
123
123
|
|---|---|---|---|
|
|
124
124
|
| E1 | Value formats on `concept`s; input rules on the command; uniqueness as `constraint`; access as `authorize` | declarations | D |
|
|
125
125
|
| E2 | Every refusal has a message a person understands; constraint messages copied verbatim in specs | `message`, specs | D |
|
|
126
|
-
| E3 | A state-dependent rule uses `reads` + `require` over authoritative state: eligible reads opt into `command reads protected` (v25), with required absence and decide/commit conflict cases. Legacy/refused reads are marked unenforced with a named target. The Cratis C# renderer refuses protected reads (STAGE-ESM-044); reference/semantic-engine evidence is not generated-app protection. Not: caller-supplied copies of state, attestation booleans (`confirmsX == true`), rules in `handler` / `implementation hint` prose, or `reads` treated as protection | slice `description`, `require`, `handler` | D (faking or hiding = major) |
|
|
126
|
+
| E3 | A state-dependent rule uses `reads` + `require` over authoritative state: eligible reads opt into `command reads protected` (v25), with required absence and decide/commit conflict cases. Legacy/refused reads are marked unenforced with a named target. The Cratis C# renderer refuses protected reads (STAGE-ESM-044); reference/semantic-engine evidence is not generated-app protection. An ownership rule compares the caller with the stored owner (`require caller == Document.owner`, Uuid equality, same concept on both sides, Requires Screenplay 4.205.0, ESM v28; ordering and Uuid validation rules stay PLAY0268). Not: caller-supplied copies of state, attestation booleans (`confirmsX == true`), rules in `handler` / `implementation hint` prose, or `reads` treated as protection | slice `description`, `require`, `handler` | D (faking or hiding = major) |
|
|
127
127
|
| E4 | `severity warning` is not used as "soft" validation (it still rejects) | validate lines | C semantics |
|
|
128
128
|
| E5 | Preconditions are explicit; nothing relies on "obviously you can't" | descriptions, specs | Q |
|
|
129
129
|
| E6 | Each invariant has an atomic enforcement point (name the storage provider where constraint admission matters); the race loser's outcome is specified | constraints, specs | D |
|
|
@@ -172,7 +172,7 @@ Nebulit (`provenance.md`).
|
|
|
172
172
|
| G3 | Persona policy lists cover every gate on the path (module, feature, construct) | policies | C semantics (board placement) |
|
|
173
173
|
| G4 | A command invoked by a reaction is not gated by a caller policy, unless a trusted-path decision is recorded | reactions, `authorize` | D (silent = major) |
|
|
174
174
|
| G5 | Row scoping (whose data) is part of the view, not a filter the caller supplies | queries | D |
|
|
175
|
-
| G6 | Every persona Cannot line resolves to an executable gate (`authorize` policy, or ownership `claim "x" matches subject\|<command property>`) and a `then denied` spec whose caller is synthesized with `given caller as <Persona>` or explicitly carries the effective-gate roles/claims; otherwise recorded as a gap. Persona text is intent only | personas, policies, specs | D |
|
|
175
|
+
| G6 | Every persona Cannot line resolves to an executable gate (`authorize` policy, or ownership `claim "x" matches subject\|<command property>`, or a Uuid `require <command property> == <protected read path>`) and a `then denied` spec whose caller is synthesized with `given caller as <Persona>` or explicitly carries the effective-gate roles/claims; otherwise recorded as a gap. Persona text is intent only | personas, policies, specs | D |
|
|
176
176
|
| G7 | Every command and query under an inherited module/feature `authorize` has its own `then denied` spec; authorization shared by a feature is declared at feature/module level so new paths inherit it | policies, specs | D |
|
|
177
177
|
| G8 | Ownership/claim targets are a supported scalar (text, Uuid, Date or DateTime render; a numeric or Boolean target is always denied; other shapes and a command without exactly one identifier are STAGE-ESM-015): noted | policies | C (renderable mode) |
|
|
178
178
|
|
|
@@ -67,7 +67,7 @@ refused reactions, captures and Translate slices remain gap-fill.
|
|
|
67
67
|
Models with event sources, streams or command routes bind and reference-execute as ESM v8 on the standalone
|
|
68
68
|
tool, so report V3 and V4 from that tool. The CLI/Stage pair
|
|
69
69
|
(`cratis-screenplay-toolchain/references/renderable-subset.md`) reaches v8 route checks
|
|
70
|
-
and construct admission through
|
|
70
|
+
and construct admission through v26 (Requires Cratis CLI 3.74.0; older bundles stop earlier). Public/foreign events and production overrides
|
|
71
71
|
still refuse; semantic reaction/reducer filters and role/authenticated `runs as` render.
|
|
72
72
|
Claim-reading/opaque system gates, legacy actor/filter paths and mixed effects still refuse. Keep refused scope as case A/C,
|
|
73
73
|
never infer target support from binding. Read Stage's `references/admission.md` and
|
|
@@ -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`.
|
|
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.
|
|
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
|
|
|
@@ -141,6 +141,10 @@ changes with the root folder name.
|
|
|
141
141
|
`references/diagnostics.md` for proof/support failures. Binding is not rendering.
|
|
142
142
|
Tool/renderer authors: read [references/generation-checks.md](references/generation-checks.md)
|
|
143
143
|
when discovering strategy options, checking one concept or value, or consuming rule proofs.
|
|
144
|
+
- **v28:** `==`/`!=` between Uuid values in `require` and `produces when` select v28
|
|
145
|
+
(Requires Screenplay 4.205.0; `screenplay --version`; older binders refuse PLAY0268).
|
|
146
|
+
Read [language admission](references/language-admission.md) and command-surface
|
|
147
|
+
`references/uuid-equality.md`.
|
|
144
148
|
- **v22–v26:** read [language admission](references/language-admission.md) for atomic
|
|
145
149
|
batches, described handlers, text rules, protected reads, chronological command
|
|
146
150
|
Date/DateTime comparisons (Requires Screenplay 4.199.0; `screenplay --version`;
|
|
@@ -366,7 +366,7 @@ refusal reasons. Read [language admission](language-admission.md) before changin
|
|
|
366
366
|
|
|
367
367
|
Invalid match syntax remains PLAY0367. Property/concept text rules bind v24;
|
|
368
368
|
`contains`/`starts with` in conditions only still fail PLAY0268. Stage rejects
|
|
369
|
-
v22/v27 and mixed pairs with STAGE-ESM-016; v23–v26 admission does not implement
|
|
369
|
+
v22/v27/v28 and mixed pairs with STAGE-ESM-016; v23–v26 admission does not implement
|
|
370
370
|
bodies, batches or rendered protected reads (STAGE-ESM-044), and the renderer refuses
|
|
371
371
|
v26 date comparisons with STAGE-ESM-046. Requires Stage 4.129.0
|
|
372
372
|
for semantic Host/executor protected reads; older engines refuse -044. Read
|
|
@@ -375,10 +375,10 @@ for semantic Host/executor protected reads; older engines refuse -044. Read
|
|
|
375
375
|
## Binding (V2 and V3) - see `executable-subset.md` for the full table
|
|
376
376
|
| Code | Meaning | Fix |
|
|
377
377
|
|---|---|---|
|
|
378
|
-
| PLAY0268 | construct the ESM cannot represent; read the message for the construct (`executable-subset.md` lists attached handlers, unsupported query shapes, protected enum/identity concepts, read paths without opt-in or in
|
|
378
|
+
| PLAY0268 | construct the ESM cannot represent; read the message for the construct (`executable-subset.md` lists attached handlers, unsupported query shapes, protected enum/identity concepts, read paths without opt-in or in `produces when`, Uuid ordering, different Uuid concepts and Uuid rules, and older bundled-compiler limits) | stay in design mode, or change the construct if the domain allows; never strip `pii`/authorization |
|
|
379
379
|
| PLAY0269 / 0270 | UI deferred / authoring metadata (I) | none |
|
|
380
380
|
| PLAY0271 | legacy `reads` or a `concurrency` block keeps its legacy meaning and cannot bind (error) | opt eligible command reads into v25 with reviewed preamble repair; `concurrency` remains unbound; uniqueness uses a constraint, target realization stays separate |
|
|
381
|
-
| PLAY0273 | incoherent: ambiguous `for`, property not on event revision, operand type mismatch, derived `$eventContext` path, unparsable date literal or offset-less DateTime literal in an admitted v26 comparison | fix the reference or literal; DateTime needs offset/Z |
|
|
381
|
+
| PLAY0273 | incoherent: ambiguous `for`, property not on event revision, operand type mismatch, derived `$eventContext` path, unparsable date literal or offset-less DateTime literal in an admitted v26 comparison, or a Uuid comparison literal that is not lowercase hyphenated (v28) | fix the reference or literal; DateTime needs offset/Z; Uuid literals are lowercase hyphenated |
|
|
382
382
|
| PLAY0350 | `null` in command/event value | Chronicle semantics (nullable event properties are CHR0012; an optional fact is a separate event), not only a binder limitation: specs cannot state an absent command/event value. Omit the value or record a capability gap; whether the optional detail is really a separate fact is a review question, not this code's fix |
|
|
383
383
|
| PLAY0351 | given/then readmodel lacks the key property | add the keyed query's `by` property |
|
|
384
384
|
| PLAY0352 | when-less spec asserting an action outcome, except a sole query Validation error (v18) | add an action or assert readmodel/query |
|
|
@@ -12,6 +12,7 @@
|
|
|
12
12
|
- Released public boundaries and observer routes
|
|
13
13
|
- Chronological command date comparisons (ESM v26)
|
|
14
14
|
- Flat composite read-model keys (ESM v27)
|
|
15
|
+
- Uuid equality in command conditions (ESM v28)
|
|
15
16
|
- Code attachments (what binds, what never does)
|
|
16
17
|
- Refused (code, reason): fix, or record as a mode gap
|
|
17
18
|
- Not refused, but do not rely on it
|
|
@@ -42,7 +43,7 @@ Complete examples that bind live in `executable-example.md`, `pdl-example.md` (p
|
|
|
42
43
|
`automation-translate-example.md` (ESM v6) and `generated-responses-example.md` (ESM v7).
|
|
43
44
|
|
|
44
45
|
For atomic batches (v22), described handlers (v23), ordinal text rules (v24) and
|
|
45
|
-
protected reads (v25), chronological command dates (v26)
|
|
46
|
+
protected reads (v25), chronological command dates (v26), composite keys (v27) and Uuid equality (v28), read
|
|
46
47
|
[language admission](language-admission.md). A later
|
|
47
48
|
version alone does not enable either application opt-in.
|
|
48
49
|
|
|
@@ -68,7 +69,7 @@ Requires Screenplay 4.141.0 or later (`screenplay --version`) to bind concept co
|
|
|
68
69
|
- `StateChange` and `StateView` slices.
|
|
69
70
|
- A command with one `identifier`; inline `produces event <Name>` (omit `for`) for a command-owned event, or
|
|
70
71
|
plain `produces <Event>` with explicit `for <identifier>` for a shared event.
|
|
71
|
-
- `produces when` with `==`/`!=` on scalar text, enum, number or
|
|
72
|
+
- `produces when` with `==`/`!=` on scalar text, enum, number, boolean or Uuid (v28), and ordering on
|
|
72
73
|
numbers.
|
|
73
74
|
- Mappings from command properties, string and number literals, `$context.occurred`,
|
|
74
75
|
`$context.identity.id`, `.name` and `.userName` (aliases `causedBy.subject`, `.name`,
|
|
@@ -289,12 +290,27 @@ reference execution. Read read-surface
|
|
|
289
290
|
[named keys](../../cratis-screenplay-read-surface/references/named-keys.md) for the
|
|
290
291
|
complete example.
|
|
291
292
|
|
|
293
|
+
## Uuid equality in command conditions (ESM v28)
|
|
294
|
+
|
|
295
|
+
Requires Screenplay 4.205.0 (ESM v28; `screenplay --version`); older binders refuse
|
|
296
|
+
Uuid comparisons with PLAY0268. `==` and `!=` bind in `require` and `produces when`
|
|
297
|
+
between required scalar Uuid command properties, Uuid concepts and identities,
|
|
298
|
+
and canonical Uuid literals; protected read paths bind in `require` only. When both
|
|
299
|
+
sides are concepts or identities they must be the same concept; a bare Uuid compares with
|
|
300
|
+
any Uuid concept. Refused with PLAY0268: ordering, optional operands, different concepts,
|
|
301
|
+
Uuid validation rules, Uuid concept rules, read paths in `produces when`, and text,
|
|
302
|
+
`$context` or reaction `where` operands. A literal that is not a lowercase hyphenated
|
|
303
|
+
Uuid reports PLAY0273. Stage refuses v28 with STAGE-ESM-016, independently of standalone
|
|
304
|
+
binding and reference execution. Read command-surface
|
|
305
|
+
[Uuid equality](../../cratis-screenplay-command-surface/references/uuid-equality.md) for the
|
|
306
|
+
complete example.
|
|
307
|
+
|
|
292
308
|
## Code attachments (what binds, what never does)
|
|
293
309
|
|
|
294
310
|
Pending `handler implementation` beside unconditional `produces` binds as a described
|
|
295
311
|
command (v23). Its payload-only body returns Unsupported ImplementationBody when reached;
|
|
296
312
|
denial/validation specs still run. Read [language admission](language-admission.md) for
|
|
297
|
-
v22–
|
|
313
|
+
v22–v28 and [described handlers](../../cratis-screenplay-command-surface/references/described-handlers.md)
|
|
298
314
|
for the result contract. Attached handlers remain unbound.
|
|
299
315
|
|
|
300
316
|
Inline fences (`csharp`, `typescript`, `react`, `html`, `sql`) and `file <path>` attach
|
|
@@ -340,10 +356,11 @@ bodies still leave their owner non-executable.
|
|
|
340
356
|
| `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 |
|
|
341
357
|
| `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 |
|
|
342
358
|
| 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 |
|
|
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 |
|
|
359
|
+
| `contains` or `starts with` in conditions only | PLAY0268 | conditions admit scalar equality (Uuid from v28) and numeric ordering, plus same-primitive command date comparisons from v26; property/concept text rules bind as v24 |
|
|
344
360
|
| 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 |
|
|
345
361
|
| Rule on a nested path (`lines.qty all > 0`) | PLAY0268 | put the rule on the nested value's concept |
|
|
346
|
-
| Read paths without protected opt-in, or in `produces when` | PLAY0268 | v25 admits single-level paths only in `require` and produced-event mappings |
|
|
362
|
+
| Read paths without protected opt-in, or in `produces when` | PLAY0268 | v25 admits single-level paths only in `require` and produced-event mappings; a Uuid read path compared with `==`/`!=` follows the same positions |
|
|
363
|
+
| Uuid comparison with `<`, `>`, different concepts, optional operands, a validation rule or a concept rule | PLAY0268 | v28 admits `==`/`!=` in command conditions only, between the same concept or a bare Uuid and a concept |
|
|
347
364
|
| Legacy `reads <View> ...` on a command | PLAY0271 (error) | `command reads protected` opts eligible views into v25; see command-surface protected reads |
|
|
348
365
|
| `concurrency` block on a command | PLAY0271 (error) | "concurrency metadata keeps its legacy meaning and cannot bind to ESM v1" |
|
|
349
366
|
| File/inline `handler` (see above) | PLAY0268 | pending described handlers instead bind v23; body execution and rendering remain gaps |
|
|
@@ -15,6 +15,7 @@ exact language/semantic pairs; binding, reference execution and rendering are se
|
|
|
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
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
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 |
|
|
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 |
|
|
18
19
|
|
|
19
20
|
Requires Screenplay 4.181.0 or later (`screenplay --version`) for atomic batches; older compilers cannot admit the preamble.
|
|
20
21
|
|
|
@@ -28,6 +29,8 @@ Requires Screenplay 4.199.0 (ESM v26; `screenplay --version`) for date compariso
|
|
|
28
29
|
|
|
29
30
|
Requires Screenplay 4.204.0 (ESM v27; `screenplay --version`) for composite read-model keys; older binders report PLAY0268.
|
|
30
31
|
|
|
32
|
+
Requires Screenplay 4.205.0 (ESM v28; `screenplay --version`) for Uuid equality in command conditions; older binders report PLAY0268.
|
|
33
|
+
|
|
31
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.
|
|
32
35
|
|
|
33
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.
|
|
@@ -65,7 +68,13 @@ more key parts selects v27; one `key` mark keeps its earlier version and bytes.
|
|
|
65
68
|
selected version, open the model with the `screenplay` MCP server and call `read-workspace`
|
|
66
69
|
with `view` `executable-model`: `languageVersion` reads `27.0`.
|
|
67
70
|
|
|
68
|
-
|
|
71
|
+
For v28, read command-surface [Uuid equality](../../cratis-screenplay-command-surface/references/uuid-equality.md)
|
|
72
|
+
for the operand, literal and refusal rules. Only a command condition that compares Uuids selects v28;
|
|
73
|
+
the same condition without Uuid operands keeps its earlier version. To see the selected version, open
|
|
74
|
+
the model with the `screenplay` MCP server and call `read-workspace` with `view` `executable-model`:
|
|
75
|
+
`languageVersion` reads `28.0`.
|
|
76
|
+
|
|
77
|
+
Stage's semantic engines admit exact v1–v21 and v23–v26 pairs. V22/v27/v28 and mixed
|
|
69
78
|
pairs refuse STAGE-ESM-016. Requires Stage 4.135.0 for v26 admission; older Stage
|
|
70
79
|
refuses v26 with STAGE-ESM-016. Admission of v23–v26 is not admission of described bodies,
|
|
71
80
|
atomic mode or rendered protected reads. A CLI may bundle an older compiler/Stage pair: run no-write render
|
|
@@ -21,7 +21,7 @@ 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 and mixed pairs
|
|
24
|
+
Stage admits exact ESM v1–v21 and v23–v26 pairs; v22/v27/v28 and mixed pairs
|
|
25
25
|
refuse STAGE-ESM-016. Chronological command Date/DateTime comparisons select v26:
|
|
26
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.
|
|
@@ -33,7 +33,7 @@ The CLI's bundled Stage can be older: read installed versions and the pins in
|
|
|
33
33
|
does not render refuses with its own code before any artifact is planned.
|
|
34
34
|
|
|
35
35
|
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; a bundle
|
|
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.
|
|
37
37
|
|
|
38
38
|
With an admitting renderer, all-Proven generated-concept rules allow unpinned
|
|
39
39
|
rendered specs; warning/info rules and semantic checksum validation are enforced,
|