@cratis/pi 7.92.0 → 7.93.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/skills/cratis-screenplay-command-surface/references/text-and-match-rules.md +17 -0
- package/package/corpus/skills/cratis-screenplay-model-authoring/references/language-reference.md +1 -1
- package/package/corpus/skills/cratis-screenplay-model-authoring/references/mcp-tools.md +14 -2
- package/package/corpus/skills/cratis-screenplay-model-review/SKILL.md +2 -2
- package/package/corpus/skills/cratis-screenplay-model-review/references/checklist.md +3 -3
- package/package/corpus/skills/cratis-screenplay-model-review/references/model-inventory-report.md +2 -1
- package/package/corpus/skills/cratis-screenplay-model-review/references/verified-sources.md +1 -1
- package/package/corpus/skills/cratis-screenplay-read-surface/SKILL.md +3 -3
- package/package/corpus/skills/cratis-screenplay-read-surface/references/equality-filters.md +1 -1
- package/package/corpus/skills/cratis-screenplay-read-surface/references/named-keys.md +1 -1
- package/package/corpus/skills/cratis-screenplay-render-and-gap-fill/references/renderability-gate.md +1 -1
- package/package/corpus/skills/cratis-screenplay-scenario-coverage/SKILL.md +8 -2
- package/package/corpus/skills/cratis-screenplay-scenario-coverage/references/scenario-examples.md +2 -2
- package/package/corpus/skills/cratis-screenplay-scenario-coverage/references/spec-forms-by-mode.md +4 -3
- package/package/corpus/skills/cratis-screenplay-scenario-coverage/references/view-and-story-specs.md +1 -1
- package/package/corpus/skills/cratis-screenplay-slice-design/SKILL.md +1 -1
- package/package/corpus/skills/cratis-screenplay-slice-design/references/read-model-design.md +3 -2
- package/package/corpus/skills/cratis-screenplay-specifications/SKILL.md +6 -2
- package/package/corpus/skills/cratis-screenplay-specifications/references/examples-and-routes.md +19 -0
- package/package/corpus/skills/cratis-screenplay-streams-and-consistency/references/stream-id-rules.md +4 -0
- package/package/corpus/skills/cratis-screenplay-toolchain/SKILL.md +1 -1
- package/package/corpus/skills/cratis-screenplay-toolchain/references/diagnostics.md +9 -0
- package/package/corpus/skills/cratis-screenplay-toolchain/references/executable-subset.md +10 -8
- package/package/corpus/skills/cratis-screenplay-toolchain/references/renderable-subset.md +2 -2
- package/package/corpus/skills/cratis-screenplay-toolchain/references/traps.md +1 -1
- package/package/corpus/skills/cratis-stage-rendering-and-sandbox/references/admission.md +1 -1
- package/package.json +1 -1
package/package/corpus/skills/cratis-screenplay-command-surface/references/text-and-match-rules.md
CHANGED
|
@@ -63,6 +63,23 @@ settings. Syntax remains `matches "^INV-[0-9]{6}$"` or `matches email`.
|
|
|
63
63
|
|
|
64
64
|
`\s` includes U+00A0, U+FEFF and Unicode line/paragraph separators; it excludes
|
|
65
65
|
U+0085. Dot excludes LF, CR, U+2028 and U+2029. `\w` excludes U+0130.
|
|
66
|
+
### Write unambiguous patterns (PLAY0803)
|
|
67
|
+
|
|
68
|
+
Requires Screenplay 4.218.2 or later (`screenplay --version`); older compilers do not warn.
|
|
69
|
+
|
|
70
|
+
Generated clients run the pattern in a browser's backtracking engine, so an exponentially
|
|
71
|
+
ambiguous pattern can hang a tab on a crafted value even though Screenplay's own automaton
|
|
72
|
+
stays linear. The warning `PLAY0803` (`AmbiguousMatchPattern`) names the ambiguous
|
|
73
|
+
subexpression and a simpler rewrite where one exists; C#, TypeScript, Monaco and VS Code
|
|
74
|
+
report it identically. Very large patterns are not analyzed, so keep them small anyway.
|
|
75
|
+
|
|
76
|
+
| Ambiguous | Write instead |
|
|
77
|
+
| --- | --- |
|
|
78
|
+
| `(a+)+$`, `(a*)*` | `a+`, `a*` (never quantify a group whose body already repeats) |
|
|
79
|
+
| `(a\|a)*` | `a*` (alternatives must not match the same text) |
|
|
80
|
+
|
|
81
|
+
Prefer a character class such as `[ab]*` over alternatives that overlap. Fix the pattern rather than suppressing the warning; validate with `--warnings-as-errors`.
|
|
82
|
+
|
|
66
83
|
`matches email` is conservative, not RFC 5322: one `@`, nonempty local part without
|
|
67
84
|
whitespace/`@`, and at least two nonempty domain parts without whitespace/`@`.
|
|
68
85
|
A no-break space therefore fails email validation. Other bare names report PLAY0366.
|
package/package/corpus/skills/cratis-screenplay-model-authoring/references/language-reference.md
CHANGED
|
@@ -278,7 +278,7 @@ See read-surface `references/named-keys.md` for the collection-key exclusion alg
|
|
|
278
278
|
| Protected command reads (ESM v25) | Root `command reads protected`; eligible read paths in requirements and production mappings, absence Validation, concurrent matching facts Conflict; Stage admits v25 and, in a new enough bundle, renders protected reads as Arc read protection, refusing unpreservable shapes and every older bundle with STAGE-ESM-044; semantic Host/executor execute admitted reads with non-Error protected requirements refused STAGE-ESM-045 |
|
|
279
279
|
| Chronological command dates (ESM v26) | Same-primitive Date/DateTime `==`, `!=`, `>`, `>=`, `<`, `<=` in require/produces-when (property or literal RHS) and command/property rules (literal RHS only). DateTime uses UTC ticks, participating offset-less inputs reject Validation before rules; then matching stays ordinal. Requires Screenplay 4.199.0 (`screenplay --version`); older binders refuse PLAY0268. The Stage Host and executor run v26 (older Stage refuses STAGE-ESM-016); the renderer and legacy engines refuse STAGE-ESM-046 (toolchain `language-admission.md`). Read command-surface `references/date-comparisons.md`. |
|
|
280
280
|
| Current routing and actor admission | Sources/streams and command/specification routes bind and reference-execute as v8; reaction `runs as system role` supplies the invocation actor as v10. Whole-workspace binding determines executable availability; CLI/Stage realization remains separate |
|
|
281
|
-
| Blocks binding (`PLAY0268`) | enum/identity compliance and events combining personal or explicitly subject-scoped secret values with explicit subject marks; a compiler that stops before v13 refuses all `pii`/`secret` concepts ("compliance attributes require portable data-subject semantics"), while v13 binds them and Stage renders protection; bare `rule <Name>`, read paths without protected opt-in or in unsupported positions such as `produces when`, date comparisons with mixed primitives, optional condition operands, `$context`, protected read paths or `today`, date rules on concepts or reaction `where`, `$context.tenant`/claims/roles/causation in `produces`, `$env` conditions, `file` constraints, unquoted `import` of an external contract, a read model with neither explicit `key` nor unambiguous query-based identity as described above (several key marks bind as v27; older binders refuse PLAY0268; toolchain `language-admission.md`), queries with context `from` sources (typed query context is unadmitted), single-result filters (collections only), `scoped to` (opaque scope)
|
|
281
|
+
| Blocks binding (`PLAY0268`) | enum/identity compliance and events combining personal or explicitly subject-scoped secret values with explicit subject marks; a compiler that stops before v13 refuses all `pii`/`secret` concepts ("compliance attributes require portable data-subject semantics"), while v13 binds them and Stage renders protection; bare `rule <Name>`, read paths without protected opt-in or in unsupported positions such as `produces when`, date comparisons with mixed primitives, optional condition operands, `$context`, protected read paths or `today`, date rules on concepts or reaction `where`, `$context.tenant`/claims/roles/causation in `produces`, `$env` conditions, `file` constraints, unquoted `import` of an external contract, a read model with neither explicit `key` nor unambiguous query-based identity as described above (several key marks bind as v27; older binders refuse PLAY0268; toolchain `language-admission.md`), queries with context `from` sources (typed query context is unadmitted), single-result filters (collections only), `scoped to` (opaque scope) or a `by` block on a list query or non-optional single result (a `performer` query is not refused: it is an opaque read, PLAY0270, left out of the executable model; [version gate](../../cratis-screenplay-toolchain/references/executable-subset.md#code-attachments-what-binds-what-never-does)); optional keyed and collection queries, including caller-supplied equality filters and observable delivery, bind, `$causedBy` and templates in projections |
|
|
282
282
|
| Blocks binding (`PLAY0800`, permanent attachment requirement) | Attached file/inline command `handler`: gap-fill the slice with a constrained implementation attachment, not by waiting for ESM admission. PLAY0035 beside productions; pending described intent instead binds v23. Read required typed `arguments.subject` for the command, never parse the message. Compiler prerequisite and older PLAY0268 attribution: [diagnostic arguments](../../cratis-screenplay-toolchain/references/diagnostic-arguments.md) |
|
|
283
283
|
| Blocks binding (`PLAY0271`, legacy meaning) | Command reads without protected opt-in and `concurrency`; combined protected reads/concurrency is PLAY0783 |
|
|
284
284
|
| Deferred (`PLAY0269`, information) | Screens, layouts, templates, forms, contributions, UI profiles, themes, behaviors and `on`/`uses` |
|
|
@@ -451,7 +451,14 @@ correctness repair; PLAY0667–0670 require an author decision, with no automati
|
|
|
451
451
|
|
|
452
452
|
Sources/streams and command/specification routes bind as ESM v8 and have
|
|
453
453
|
catalog identities; `executionAvailable` still requires whole-workspace binding.
|
|
454
|
-
Source/stream `propose-rename` repairs bound route references.
|
|
454
|
+
Source/stream `propose-rename` repairs bound route references. `propose-rename` also
|
|
455
|
+
renames a composite stream-id part: it rewrites the part declaration and every
|
|
456
|
+
`part = ...` mapping in command routes, specification routes, examples and redelivery
|
|
457
|
+
locators, keeps part order and stored stream ids, and is refused
|
|
458
|
+
when the new name collides with another part of the same stream. Use it instead of a
|
|
459
|
+
hand-written `propose-ast` batch.
|
|
460
|
+
Requires Screenplay 4.220.0 (`screenplay --version`) for part renames; older servers
|
|
461
|
+
cannot rename a part through `propose-rename`. Operations and
|
|
455
462
|
exact numeric mode remain unadmitted. Check installed schemas, especially when
|
|
456
463
|
the CLI bundle predates the standalone tool.
|
|
457
464
|
|
|
@@ -626,7 +633,12 @@ Upgrade before treating those rows as a coverage gate.
|
|
|
626
633
|
`find-modeling-smells` asks information-level questions, never changes compilation
|
|
627
634
|
or `--warnaserror`: SMELL001 generic event endings, SMELL002 generic command verbs,
|
|
628
635
|
SMELL003 duplicate nonempty event shapes from different commands, SMELL004 event
|
|
629
|
-
fan-out, SMELL005 read-model property fan-in
|
|
636
|
+
fan-out, SMELL005 read-model property fan-in (counts only the events that actually
|
|
637
|
+
feed the property, not every known event through a projection `all` block), SMELL006
|
|
638
|
+
an event property that no mapping, AutoMap, reaction, condition or specification
|
|
639
|
+
reads (worded as a question: dead data or a missing reader?).
|
|
640
|
+
Requires Screenplay 4.221.0 (`screenplay --version`) for SMELL006 and the corrected
|
|
641
|
+
SMELL005 count; older servers over-report SMELL005 and never report SMELL006. Optional scope/document and
|
|
630
642
|
`eventFanOutThreshold`/`propertyFanInThreshold` (default 5, integers 1–200) bound
|
|
631
643
|
selection; equal to threshold is not flagged. Similar shape does not establish
|
|
632
644
|
similar meaning: report a defect only with a domain consequence. No per-declaration
|
|
@@ -53,8 +53,8 @@ model's behalf.
|
|
|
53
53
|
|
|
54
54
|
3. **Element sweep** (phase 1, mechanical, before any judgement). One line per gated element, event,
|
|
55
55
|
name, command, event property and slice; `references/checklist.md` S1-S7 gives each line's
|
|
56
|
-
format. Scoped `find-modeling-smells` supplies advisory generic-name, duplicate-shape
|
|
57
|
-
|
|
56
|
+
format. Scoped `find-modeling-smells` supplies advisory generic-name, duplicate-shape,
|
|
57
|
+
wide-flow and unread-event-property questions, never compiler defects or a substitute for the sweep. Each `NONE` and each form name is its own finding naming that element. A repeated
|
|
58
58
|
payload or generic verb is a signal to investigate: report it only when the name or payload
|
|
59
59
|
hides the business reason or a consequence is shown (distinct facts that share a shape and
|
|
60
60
|
earlier generations are not findings). A description, comment or spec name never excuses a flagged line.
|
|
@@ -52,8 +52,8 @@ not why: a signal, so confirm the hidden reason before reporting. The fix names
|
|
|
52
52
|
change (`BerthReassigned`, `BerthLengthLimitRaised`), one event per reason, each with its own
|
|
53
53
|
rules and consumers. A shared payload shape alone is not a defect: full generations repeat the
|
|
54
54
|
prior shape on purpose and different facts may look alike. Screenplay 4.127.0 MCP
|
|
55
|
-
`find-modeling-smells` reports advisory questions (SMELL001–SMELL005) for generic
|
|
56
|
-
names, duplicate shapes and
|
|
55
|
+
`find-modeling-smells` reports advisory questions (SMELL001–SMELL005; SMELL006 needs a newer server, see [MCP tools](../../cratis-screenplay-model-authoring/references/mcp-tools.md)) for generic
|
|
56
|
+
names, duplicate shapes, wide flows and event properties nothing reads. It supplements the sweep, never changes
|
|
57
57
|
a compiler verdict or proves a domain defect.
|
|
58
58
|
|
|
59
59
|
## Phase 2. Entity walk (5 checks, T1-T5; feeds F1-F3 and scenario coverage)
|
|
@@ -180,7 +180,7 @@ Nebulit (`provenance.md`).
|
|
|
180
180
|
| Id | Check | Evidence | Tier |
|
|
181
181
|
|---|---|---|---|
|
|
182
182
|
| H1 | Query shape follows the business view (list where people scan; lookup where they open one) | queries, screens | D |
|
|
183
|
-
| H2 | Executable scope: a keyed `=> RM optional` query with `by` named like a read-model property, or a collection (`=> RM[]`, observable too) with caller-supplied `by` and/or equality filters. `from`, single-result filters, opaque `scoped to
|
|
183
|
+
| H2 | Executable scope: a keyed `=> RM optional` query with `by` named like a read-model property, or a collection (`=> RM[]`, observable too) with caller-supplied `by` and/or equality filters. `from`, single-result filters, opaque `scoped to` and a list-query `by` block remain PLAY0268; a `performer` query is an opaque read (PLAY0270) left out of the executable model ([version gate](../../cratis-screenplay-toolchain/references/executable-subset.md#code-attachments-what-binds-what-never-does)). A read model with several key parts binds as v27 (Requires Screenplay 4.204.0). The projection routes by the same identity (a `from` key or an event property, or `$eventSourceId`; `$eventSourceId` is not mandated). Filtered models: supported v14 equality filters render within the CLI bundle's ESM ceiling. Renderable scope only: Stage-specific identity/filter limits; keyed optional snapshot lookups and snapshot/observable collections render (Requires Stage 4.90.0 for snapshot lists; older renderers report `STAGE-ESM-010`). Check query concept-validation parity separately; primitive-argument targets answer absence instead of Validation | queries, projections | C (executable); C (render admission, renderable only) |
|
|
184
184
|
| H3 | One builder per read model; projection `key` only on `from` | projections | C |
|
|
185
185
|
| H4 | Screens show one actor's point of view; a form submits one command | screens, forms | D |
|
|
186
186
|
|
package/package/corpus/skills/cratis-screenplay-model-review/references/model-inventory-report.md
CHANGED
|
@@ -32,7 +32,8 @@ the Screenplay MCP views.
|
|
|
32
32
|
for obligations with no matching specification. These read authored examples, not executed
|
|
33
33
|
coverage (`../../cratis-screenplay-model-authoring/references/mcp-tools.md`).
|
|
34
34
|
5. Gaps and orphans: `find-references` and `dependencies` for declarations referenced by nothing;
|
|
35
|
-
`find-modeling-smells` for the candidate shapes
|
|
35
|
+
`find-modeling-smells` for the candidate shapes; SMELL006 names event properties no
|
|
36
|
+
mapping, reaction, condition or specification reads, a question to answer, not a defect.
|
|
36
37
|
|
|
37
38
|
## Report
|
|
38
39
|
Asked conversationally, give the summary and the most important gap and offer the full lists on request.
|
|
@@ -9,7 +9,7 @@ reference execution.
|
|
|
9
9
|
|---|---|
|
|
10
10
|
| The MCP tool catalog (`describe-application`, `search-declarations`, `dependency-graph`, `find-assertion-gaps`, `read-workspace`, `declaration-details`) | `Screenplay`: `Source/DotNET/Screenplay.Mcp/McpToolCatalog.cs`, `Documentation/screenplay/mcp/reference.md` |
|
|
11
11
|
| Diagnostics PLAY0029, PLAY0191, PLAY0268, PLAY0271, PLAY0350, PLAY0381, PLAY0469; one data subject per event | `Screenplay`: `Source/DotNET/Screenplay/Diagnostics/DiagnosticCodes.cs`, the decision record on data subjects |
|
|
12
|
-
| `find-specification-obligations` (SPEC001 to SPEC008, authored presence) and `find-modeling-smells` (SMELL001 to
|
|
12
|
+
| `find-specification-obligations` (SPEC001 to SPEC008, authored presence) and `find-modeling-smells` (SMELL001 to SMELL006, advisory questions); neither proves executed behavior or complete lineage | `Screenplay`: `Documentation/screenplay/mcp/reference.md` |
|
|
13
13
|
| `semantic-diff` source objects and revision-pinned pages | `Screenplay`: `Source/DotNET/Screenplay.Mcp/` (`McpRevisionDiff`, `McpWorkspaces.Comparison`), `Documentation/screenplay/mcp/reference.md` |
|
|
14
14
|
| Model notes: anchors, kinds, the committed sidecar, the open-question gate | `Screenplay`: `Documentation/screenplay/model-notes.md`; notes tools in model-authoring `references/model-notes.md` |
|
|
15
15
|
| Property links and their roles for lineage and journey tracing | `Screenplay`: `Documentation/screenplay/mcp/reference.md`; model-authoring `references/property-links.md` |
|
|
@@ -85,7 +85,7 @@ is not the same thing. Rules and diagnostics:
|
|
|
85
85
|
**Name the compiler and renderer.** Optional keyed queries and collection queries
|
|
86
86
|
bind, including `observable`. Caller-supplied equality
|
|
87
87
|
filters on collections bind as ESM v14; `from`, single-result filters, `scoped to`,
|
|
88
|
-
|
|
88
|
+
and a `by` block on a list query (or on a non-optional single result) remain PLAY0268, each with its reason. A `performer` query is not refused: it is an opaque read (PLAY0270 information) left out of the executable model ([version gate](../cratis-screenplay-toolchain/references/executable-subset.md#code-attachments-what-binds-what-never-does)). Read
|
|
89
89
|
[equality filters](references/equality-filters.md) for the admitted shape, a complete
|
|
90
90
|
compiled specification model and the Stage/CLI ceilings. Keep a list the domain needs.
|
|
91
91
|
|
|
@@ -166,7 +166,7 @@ precondition. It takes a `file` reference or an inline block in a tagged fence
|
|
|
166
166
|
(` ```csharp `, ` ```sql `), and is the query's counterpart to a command's
|
|
167
167
|
`handler`. The parser accepts any registered inline language and does not reject
|
|
168
168
|
a nonsensical one, so the choice is yours to get right. Performer code is opaque:
|
|
169
|
-
Screenplay never runs it.
|
|
169
|
+
Screenplay never runs it. It is reported as information `PLAY0270` and left out of the executable model; a specification that reads it is left out while every other specification still runs. Older compilers refuse it with PLAY0268: see the [version gate](../cratis-screenplay-toolchain/references/executable-subset.md#code-attachments-what-binds-what-never-does).
|
|
170
170
|
|
|
171
171
|
A read model a performer composes needs no projection, and no event builds it.
|
|
172
172
|
Specify it from state with `given readmodel`, then `when query <Query>` with the
|
|
@@ -183,7 +183,7 @@ Caller-supplied equality filters on collections select ESM v14 (Requires Screenp
|
|
|
183
183
|
primitive/concept/enum properties, same nominal type ignoring optionality, no
|
|
184
184
|
`from`, distinct names not repeating `by`. `by` and supplied filters AND together;
|
|
185
185
|
optional filters may be omitted, but supplied null is refused. PLAY0268 still
|
|
186
|
-
rejects context sources, single-result filters, opaque scope
|
|
186
|
+
rejects context sources, single-result filters, opaque scope and
|
|
187
187
|
a `by` block on a list query (or on a non-optional single result).
|
|
188
188
|
Authorization runs before lookup, ANDed with module/feature gates; policies see
|
|
189
189
|
only `by`, never filters. Pin denial with `given caller` and `then denied`.
|
|
@@ -39,7 +39,7 @@ Each binding refusal reports PLAY0268 with its query/filter and reason:
|
|
|
39
39
|
| `filter ... from ...` or context-derived `by` | Typed query context sources are not admitted; a caller argument must not stand in for trusted context |
|
|
40
40
|
| Filter on a single-result query | Equality filters are admitted only for collections |
|
|
41
41
|
| `scoped to` | The named scope has no portable executable scope contract |
|
|
42
|
-
| `performer` | Query implementation code is opaque
|
|
42
|
+
| `performer` | Query implementation code is opaque. Requires Screenplay 4.220.1 (`screenplay --version`) for it to be an opaque read (PLAY0270 information) left out of the executable model; older compilers refuse it with PLAY0268 and leave the model unbound |
|
|
43
43
|
| `by` block on a collection query | A composite lookup is admitted only for an optional single-instance query; narrow a list by composite-keyed read-model parts with equality filters instead |
|
|
44
44
|
| Filter on a collection/composite property, missing property or mismatched nominal type | The v14 filter contract requires a same-named scalar primitive, concept or enum property with the same type |
|
|
45
45
|
|
|
@@ -25,7 +25,7 @@ selection is:
|
|
|
25
25
|
(case-sensitive). It first excludes collection-query `by` properties: if exactly
|
|
26
26
|
one candidate remains, that is the identifier; otherwise it uses all `*Id`
|
|
27
27
|
candidates and requires exactly one. An admitted list query here is a collection
|
|
28
|
-
query without context-derived `by`, filters
|
|
28
|
+
query without context-derived `by`, filters or scope.
|
|
29
29
|
|
|
30
30
|
A projection-only/queryless read model needs an explicit `key`: a lone `*Id`
|
|
31
31
|
property alone does not infer identity. Never use the command's `identifier`
|
package/package/corpus/skills/cratis-screenplay-render-and-gap-fill/references/renderability-gate.md
CHANGED
|
@@ -35,7 +35,7 @@ ESM). Only the probe answers renderability. `PLAY0270` entries are information,
|
|
|
35
35
|
| Class | Meaning | Typical examples (each verified in `admission.md`) | Action |
|
|
36
36
|
| --- | --- | --- | --- |
|
|
37
37
|
| **Model fix (in mode)** | the model is in, or the user chose, renderable mode and breaks its own subset in a way that has a renderable equivalent with the same meaning | a `produces` whose `for` is not the command identifier; two projections for one read model (`-007`); a policy Stage cannot express portably (`-015`; role-only and opaque pure policies render) | edit request to the modeler session with address, change and rationale |
|
|
38
|
-
| **Capability gap** | the intended meaning needs a construct Stage does not render yet | DateTime equality filters and required parameters after optional filters (`-010`); context/single-result filters, opaque `scoped to
|
|
38
|
+
| **Capability gap** | the intended meaning needs a construct Stage does not render yet | DateTime equality filters and required parameters after optional filters (`-010`); context/single-result filters, opaque `scoped to` and a list-query `by` block remain PLAY0268; a query `performer` (opaque read, PLAY0270) is left out of the model so render emits nothing for it: write the code the model needs by hand as a gap-fill item; a read model with several key parts or a projection keyed by parts (v27) refuses `STAGE-ESM-048` and a single-instance query by parts `STAGE-ESM-047` (Chronicle#4265); Translate, clocks, captures, non-event triggers and opaque reaction bodies (`-024`); claim-reading/opaque `runs as` gates (`-034`), legacy `from` (`-035`), mixed effects in one handler (`-037`, retries can duplicate events; keep it whole), unsupported reaction mappings (`-039`); unsupported generated types/result combinations (`-028`/`-038`); `then no readmodel` (`-027`); evolved events (`STAGE-ESM-026`); unsupported expression/enum production conditions (`-006`; supported conditional productions render); legacy reads (`PLAY0271`), protected reads the renderer cannot preserve, or any protected read in an older CLI bundle (STAGE-ESM-044 despite v25 admission; semantic Host/executor support is separate); code validation (`-005`); protected identities/enums (`-040`) or unadmitted explicit subject lineage (`PLAY0268`); described handlers (v23, STAGE-IMPL-002 even Stub mode), atomic mode (STAGE-ESM-043; v22 admission Requires Stage 4.139.0, older Stage reports -016) | keep the model; fallback record entry; options a to c in `SKILL.md`; link the Stage issue |
|
|
39
39
|
| **Implementation attachment** | a permanent limitation, not future ESM admission | file/inline command handlers (PLAY0800; typed `subject` names the command) | keep the model contract and gap-fill the slice in code with a constrained implementation attachment; do not wait for a new ESM version |
|
|
40
40
|
| **Tool skew** | the bundled compiler disagrees with documented semantics | the false `PLAY0285` on reaction cascades from an older bundle; codes the standalone compiler does not raise | record in the session state and the fallback record; never "fix" a correct model |
|
|
41
41
|
| **Environment** | not the model | restore failures, missing SDK, a destination that is not writable | fix the environment or report blocked |
|
|
@@ -131,7 +131,11 @@ proved and keep other guarantees as target requirements; recovery cases are in
|
|
|
131
131
|
- One behaviour per spec; names read as sentences: `Reserving...`, `Rejecting...`, `Refusing...`
|
|
132
132
|
(denial), `<View>LifecycleN<State>` for families.
|
|
133
133
|
- `for` on every given, appended and expected event (plain `produces <Name>` too; inline `produces event` omits it), and on the `when` command where the
|
|
134
|
-
destination matters. A competing-claim given needs a *different* `for`.
|
|
134
|
+
destination matters. A competing-claim given needs a *different* `for`. A given without `for`
|
|
135
|
+
belongs to the event source the specification acts on; state `for` when the command appends to
|
|
136
|
+
several event sources or an assertion depends on the given's source, and never assert
|
|
137
|
+
`$eventSourceId` of a sourceless given. Read
|
|
138
|
+
[examples and routes](../cratis-screenplay-specifications/references/examples-and-routes.md#givens-without-an-event-source).
|
|
135
139
|
Foreign event fixtures feeding a capture may omit `for`; supplied `for` is
|
|
136
140
|
opaque source text, not the capture's content key.
|
|
137
141
|
- Format rules belong on a `concept`: give each concept rule representative acceptance,
|
|
@@ -147,7 +151,9 @@ proved and keep other guarantees as target requirements; recovery cases are in
|
|
|
147
151
|
- Descriptions are not rendered: a rule only in prose is unenforced; make it a rule layer, a
|
|
148
152
|
spec or a recorded target requirement.
|
|
149
153
|
- Prove projections with events (`given`/`when append`), not `given readmodel`; seed read models
|
|
150
|
-
only for performer-backed views or commands that decide on view state.
|
|
154
|
+
only for performer-backed views or commands that decide on view state. A query `performer` is an opaque read
|
|
155
|
+
(information `PLAY0270`, not `PLAY0268`): it is left out of the executable model, a spec that reads it is
|
|
156
|
+
left out too and the other specs still run, so mark it `gap` for the executable modes ([version gate](../cratis-screenplay-toolchain/references/executable-subset.md#code-attachments-what-binds-what-never-does)).
|
|
151
157
|
- No contradiction between a family and single-transition specs of the same view.
|
|
152
158
|
|
|
153
159
|
### Quality checklist (adapted from the TrogonStack scenario checklist; `references/provenance.md`)
|
package/package/corpus/skills/cratis-screenplay-scenario-coverage/references/scenario-examples.md
CHANGED
|
@@ -219,6 +219,6 @@ empty-list intent is a separate claim from a keyed row being absent (`view-and-s
|
|
|
219
219
|
queries are executable too (`ListOpenInvoices` in the backing example); caller-supplied equality filters on collections bind as ESM v14.
|
|
220
220
|
Pass `by` and filters in query arguments; PLAY0468 reports unknown, repeated or
|
|
221
221
|
missing required arguments. Optional filters may be omitted, supplied null is refused.
|
|
222
|
-
Context-sourced/single-result filters, opaque `scoped to
|
|
223
|
-
`by` block remain PLAY0268. Compiled coverage and renderer ceilings:
|
|
222
|
+
Context-sourced/single-result filters, opaque `scoped to`, and a list-query
|
|
223
|
+
`by` block remain PLAY0268; a `performer` query is an opaque read left out of the model (PLAY0270; [version gate](../../cratis-screenplay-toolchain/references/executable-subset.md#code-attachments-what-binds-what-never-does)). Compiled coverage and renderer ceilings:
|
|
224
224
|
read-surface [equality filters](../../cratis-screenplay-read-surface/references/equality-filters.md).
|
package/package/corpus/skills/cratis-screenplay-scenario-coverage/references/spec-forms-by-mode.md
CHANGED
|
@@ -24,7 +24,7 @@ Typed example/override forms: `cratis-screenplay-specifications`
|
|
|
24
24
|
| `then readmodel` / `then query` (keyed `ById`, `arguments`, `result`) | yes | yes | yes |
|
|
25
25
|
| `then query` on an unfiltered list or a list narrowed by one `by` key (observable too) | yes | yes: no `arguments` for an unkeyed list, one `result` per row stating the read-model identifier, no `result` = empty list | snapshot and observable lists render |
|
|
26
26
|
| Collection query with caller-supplied equality `filter`, including observable | yes | yes, ESM v14: same-named scalar property/type, AND with `by`; optional omission allowed, supplied null refused; PLAY0468 checks arguments; row order does not matter | yes on supported snapshot/observable collections; DateTime/filter parameter order refuse -010; independent Stage executor still refuses filtered assertions (-010) |
|
|
27
|
-
| Context `from`, single-result filters, `scoped to
|
|
27
|
+
| Context `from`, single-result filters, `scoped to` or a list-query `by` block | yes | PLAY0268: query context, collection-only filtering, opaque scope or a multipart list lookup are unadmitted | no |
|
|
28
28
|
| `then no readmodel <RM> for "<key>"` | yes | yes | no |
|
|
29
29
|
| `when query` -> `then result` / `then no result` | yes | yes | same as `then query`: only the query-only cases below |
|
|
30
30
|
| `given clock` / `when clock`, `when trigger`, record-source `given`/`when capture` | yes | yes (standalone and any cratis whose compiler admits v6; an older bundle does not, see toolchain `references/executable-subset.md`) | no |
|
|
@@ -45,7 +45,8 @@ Typed example/override forms: `cratis-screenplay-specifications`
|
|
|
45
45
|
| Bodied rules, code policies | spec them | spec reported **unsupported**, never passed | no |
|
|
46
46
|
| Pending described command handlers (v23) | specify intent | binds; denial/validation execute, body-reaching specs Unsupported ImplementationBody; all-Unsupported is not green | STAGE-IMPL-002 even Stub mode |
|
|
47
47
|
| Attached command handlers | spec them in design | blocked: PLAY0800, no spec runs (V3 blocked); permanent constrained-attachment requirement, gap-fill in code | no |
|
|
48
|
-
| `file` constraints
|
|
48
|
+
| `file` constraints | spec them in design | blocked: PLAY0268 at binding, no spec runs (V3 blocked) | no |
|
|
49
|
+
| Query `performer`s | spec them in design | opaque read: PLAY0270 information, left out of the executable model; a spec that reads it is left out, every other spec still runs ([version gate](../../cratis-screenplay-toolchain/references/executable-subset.md#code-attachments-what-binds-what-never-does); older compilers report PLAY0268) | no |
|
|
49
50
|
| Atomic reaction mode (v22) | declare for new models | failed batch adds no facts or view changes; earlier batches/commands remain; `then error` alone is insufficient | v22 STAGE-ESM-016; mode in admitted v23–v27 STAGE-ESM-043 |
|
|
50
51
|
| Protected command reads (v25) | declare opt-in for eligible reads | absence Validation; matching intervening facts Conflict; race vectors are not a new spec construct | Cratis C# rendering in a new enough bundle (STAGE-ESM-044 before, or for unpreservable shapes); semantic Host/executor execute admitted reads, non-Error protected requirements STAGE-ESM-045; v25 pair admitted |
|
|
51
52
|
|
|
@@ -58,7 +59,7 @@ Requires Stage 4.90.0 for snapshot/live lists, 4.101.0 for no-event specificatio
|
|
|
58
59
|
|
|
59
60
|
## Design mode
|
|
60
61
|
Write the full intended behaviour, including scenarios the executable subset cannot run
|
|
61
|
-
(filtered, scoped and performer-backed views; clock, trigger and capture scenarios when only a
|
|
62
|
+
(filtered, scoped and performer-backed views, the last left out of the executable model rather than refused; clock, trigger and capture scenarios when only a
|
|
62
63
|
older cratis bundle is available). Mark each such spec in the coverage matrix as
|
|
63
64
|
`gap: <reason>` for the narrower modes so the verification and render phases know what will not execute.
|
|
64
65
|
|
package/package/corpus/skills/cratis-screenplay-scenario-coverage/references/view-and-story-specs.md
CHANGED
|
@@ -61,7 +61,7 @@ own full givens. The excerpt is copied from `invoicing-dues-example.md`; the las
|
|
|
61
61
|
both that the stored row is gone and that the keyed query returns nothing. The whole-list query
|
|
62
62
|
(no key) is executable too (Requires Screenplay 4.105.0 or later): `invoicing-dues-example.md` adds
|
|
63
63
|
`ListOpenInvoices => OpenInvoice[]` with one spec that expects one `result` row and one that
|
|
64
|
-
expects the empty list after `PaymentReceived`. Only `filter`, `scoped to` and `performer` queries stay design-mode.
|
|
64
|
+
expects the empty list after `PaymentReceived`. Only `filter`, `scoped to` and `performer` queries stay design-mode (a performer query is left out of the executable model, not refused).
|
|
65
65
|
The source document also asserts the other terminal outcomes (`InvoiceVoided`, `InvoiceSettled`) the same way; they are not copied here.
|
|
66
66
|
```screenplay excerpt parent=references/invoicing-dues-example.md#1
|
|
67
67
|
specification OpenInvoicesLifecycle1Empty
|
|
@@ -120,7 +120,7 @@ Ask the batch below only for what the request leaves open: (1) origin of each ac
|
|
|
120
120
|
|
|
121
121
|
- At most one `identifier` per command; never on an event property or read-model property (use `key`). At most one builder per read model (`PLAY0191`). Read `references/read-model-design.md` ("Identifier and key contract") for the exact rules.
|
|
122
122
|
|
|
123
|
-
- A query's `by` goes on its own body line; `from`, single-result filters, scope
|
|
123
|
+
- A query's `by` goes on its own body line; `from`, single-result filters, scope and a list-query `by` block remain `PLAY0268` (a `performer` query is an opaque read left out of the executable model, [version gate](../cratis-screenplay-toolchain/references/executable-subset.md#code-attachments-what-binds-what-never-does)); equality filters on collections bind as ESM v14. Read `references/read-model-design.md` ("Query binding") for the binding rules.
|
|
124
124
|
|
|
125
125
|
- A `unique` constraint names a property the event declares directly; the constraint name is
|
|
126
126
|
its identity (renaming starts an empty index).
|
package/package/corpus/skills/cratis-screenplay-slice-design/references/read-model-design.md
CHANGED
|
@@ -330,8 +330,9 @@ module Berths
|
|
|
330
330
|
- A query's `by` goes on its own body line. Optional keyed and collection queries
|
|
331
331
|
bind, including observable delivery. Caller-supplied equality filters on collections
|
|
332
332
|
bind as ESM v14; `by` ANDs with supplied filters. `from`, single-result
|
|
333
|
-
filters, scope
|
|
334
|
-
respective context/cardinality/opaque/multipart gaps. A
|
|
333
|
+
filters, scope and a `by` block on a list query remain PLAY0268 for their
|
|
334
|
+
respective context/cardinality/opaque/multipart gaps. A `performer` query is an opaque read left
|
|
335
|
+
out of the executable model, not PLAY0268 ([version gate](../../cratis-screenplay-toolchain/references/executable-subset.md#code-attachments-what-binds-what-never-does)). A composite-keyed optional
|
|
335
336
|
single-instance query takes a `by` block naming every part (ESM v27). Read read-surface
|
|
336
337
|
[equality filters](../../cratis-screenplay-read-surface/references/equality-filters.md).
|
|
337
338
|
|
|
@@ -238,7 +238,10 @@ For command specifications:
|
|
|
238
238
|
- [ ] `given caller` is present whenever the command is authorized, with a
|
|
239
239
|
`then denied` case for a caller who must be refused.
|
|
240
240
|
- [ ] `then` contains **either** events **or** an error, never both.
|
|
241
|
-
- [ ] A collision between two event sources uses `for` on the `given` event.
|
|
241
|
+
- [ ] A collision between two event sources uses `for` on the `given` event. A `given` without
|
|
242
|
+
`for` belongs to the event source the specification acts on; state `for` when the command
|
|
243
|
+
appends to several event sources or an assertion depends on it (see
|
|
244
|
+
[examples and routes](references/examples-and-routes.md#givens-without-an-event-source)).
|
|
242
245
|
- [ ] Error cases test business rules; each concept rule has one rejection
|
|
243
246
|
specification through one command, not one per use.
|
|
244
247
|
- [ ] A localized rejection is pinned by its quoted `$strings` key.
|
|
@@ -248,7 +251,8 @@ For command specifications:
|
|
|
248
251
|
For view specifications:
|
|
249
252
|
|
|
250
253
|
- [ ] A view a `performer` composes is specified with `given readmodel`,
|
|
251
|
-
`when query` and `then result` or `then no result
|
|
254
|
+
`when query` and `then result` or `then no result`; the reference runner leaves such a
|
|
255
|
+
spec out (`PLAY0270` information), so it is design intent, not executed proof.
|
|
252
256
|
- [ ] `given readmodel` is a complete instance with its identifier.
|
|
253
257
|
- [ ] `then readmodel` states the identifier and the properties that matter; add
|
|
254
258
|
`exactly` only when extra properties must fail the assertion.
|
package/package/corpus/skills/cratis-screenplay-specifications/references/examples-and-routes.md
CHANGED
|
@@ -11,6 +11,7 @@
|
|
|
11
11
|
- Event routes
|
|
12
12
|
- Redelivery locators
|
|
13
13
|
- Operation and recovery intent
|
|
14
|
+
- Givens without an event source
|
|
14
15
|
|
|
15
16
|
## Typed examples
|
|
16
17
|
|
|
@@ -223,3 +224,21 @@ future external-work behavior. Use `then no events` to assert explicitly that th
|
|
|
223
224
|
action and cascade produced no new facts; after append it excludes the input fact.
|
|
224
225
|
It may accompany view/query/response assertions, not events, event-order assertions,
|
|
225
226
|
errors or denial (PLAY0545). An omitted event list is not this explicit assertion.
|
|
227
|
+
|
|
228
|
+
## Givens without an event source
|
|
229
|
+
|
|
230
|
+
A `given` event with no `for` belongs to the event source the specification acts on: the
|
|
231
|
+
event source each fact the command appends goes to, or the `for` of `when append`.
|
|
232
|
+
|
|
233
|
+
- A unique-event constraint counts a sourceless given as already on that event source. A
|
|
234
|
+
unique-value constraint treats its value as the action's own claim.
|
|
235
|
+
- When a projection needs the given's event-source identity, the reference evaluator reports
|
|
236
|
+
`Unsupported` (Projection) and does not invent one. This holds whatever the action,
|
|
237
|
+
because givens are projected before it runs.
|
|
238
|
+
- Runners that append to real event streams, such as Stage, append sourceless givens to the
|
|
239
|
+
action's event source.
|
|
240
|
+
- State `for` when the command appends to more than one event source, or when an assertion
|
|
241
|
+
depends on the given's event source. Never assert `$eventSourceId` of a sourceless given.
|
|
242
|
+
|
|
243
|
+
Requires Screenplay 4.229.0 (`screenplay --version`) for the documented, vector-pinned
|
|
244
|
+
placement; older versions leave a sourceless given's placement unspecified.
|
|
@@ -13,4 +13,8 @@ Rules for stream-id literals, composite ids and the reserved `All` stream name.
|
|
|
13
13
|
PLAY0273 as a backstop. Streams `all`, `ALL` and `Default`
|
|
14
14
|
remain valid. Rename via `propose-rename`; a pin retaining `All` cannot fix it.
|
|
15
15
|
Existing `All` history reads as source-only appends, not the renamed stream.
|
|
16
|
+
Rename a composite part with `propose-rename` too: it rewrites the part and every
|
|
17
|
+
`part = ...` mapping together and refuses a name that collides with another part;
|
|
18
|
+
never hand-write a `propose-ast` batch for it (needs a server that supports part
|
|
19
|
+
renames, see model-authoring `references/mcp-tools.md`).
|
|
16
20
|
Source evidence and migration limits are in that reference.
|
|
@@ -103,7 +103,7 @@ not the source identity.
|
|
|
103
103
|
- **Executable** (binds, V3): `references/executable-subset.md`. Optional keyed lookups, unfiltered
|
|
104
104
|
lists and lists narrowed by one `by` key (observable too) bind; caller-supplied equality
|
|
105
105
|
filters on collections bind as ESM v14. Context `from`, single-result
|
|
106
|
-
filters, opaque `scoped to
|
|
106
|
+
filters, opaque `scoped to` and a `by` block on a list query remain PLAY0268; a `performer` query is an opaque read left out of the executable model (PLAY0270; [version gate](references/executable-subset.md#code-attachments-what-binds-what-never-does)). Read
|
|
107
107
|
read-surface [equality filters](../cratis-screenplay-read-surface/references/equality-filters.md).
|
|
108
108
|
Pending handlers beside unconditional productions bind as described commands (v23),
|
|
109
109
|
but reached bodies are Unsupported; attached file/inline handlers refuse PLAY0800
|
|
@@ -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
|
+
- Ambiguous match patterns (PLAY0803)
|
|
11
12
|
- Projection event scope (PLAY0801)
|
|
12
13
|
- Reducer instance identity (PLAY0690)
|
|
13
14
|
- Caller identity, compliance and routes
|
|
@@ -149,6 +150,14 @@ Overrides/filters select released ESM v10; malformed routes also use PLAY0504.
|
|
|
149
150
|
Read read-surface `references/named-keys.md` and
|
|
150
151
|
[production routes and filters](production-routes-and-filters.md).
|
|
151
152
|
|
|
153
|
+
## Ambiguous match patterns (PLAY0803)
|
|
154
|
+
|
|
155
|
+
Requires Screenplay 4.218.2 (`screenplay --version`); older compilers do not report it.
|
|
156
|
+
|
|
157
|
+
| Code | Severity | Meaning / fix |
|
|
158
|
+
| --- | --- | --- |
|
|
159
|
+
| PLAY0803 | W | `AmbiguousMatchPattern`: a `matches` pattern in the portable dialect, such as `(a+)+$`, `(a\|a)*` or `(a*)*`, can backtrack exponentially in a browser engine. Reported by both compilers and editors with the ambiguous subexpression; very large patterns are not analyzed. Rewrite it unambiguously (`a+`, `[ab]*`); see command-surface `text-and-match-rules.md`. |
|
|
160
|
+
|
|
152
161
|
## Projection event scope (PLAY0801)
|
|
153
162
|
|
|
154
163
|
Requires Screenplay 4.212.3 (`screenplay --version`) for this ordinary compilation
|
|
@@ -91,7 +91,7 @@ Requires Screenplay 4.141.0 or later (`screenplay --version`) to bind concept co
|
|
|
91
91
|
equivalent inferred ESM bytes. Flat composite read-model keys bind as v27
|
|
92
92
|
(see below). Collections and observable delivery bind.
|
|
93
93
|
Caller-supplied equality filters on collections also bind as ESM v14; context
|
|
94
|
-
sources, single-result filters, scope
|
|
94
|
+
sources, single-result filters, scope and a list-query `by` block remain blocked; a `performer` query is an opaque read left out of the executable model.
|
|
95
95
|
- One projection per read model: `from`, `every`, `all` (one block per level), `join`,
|
|
96
96
|
`children`, `nested`, `remove with`, `remove via join` (binds; blocks the execution plan at the projection level, see below), `clear with`, counters, `add`,
|
|
97
97
|
`subtract`, `set`, `clear`, variants, and the identifier mapped from the projection's key (`xId = $eventSourceId` only for an event-source key).
|
|
@@ -316,11 +316,13 @@ v22–v28 and [described handlers](../../cratis-screenplay-command-surface/refer
|
|
|
316
316
|
for the result contract. Attached handlers remain unbound.
|
|
317
317
|
|
|
318
318
|
Inline fences (`csharp`, `typescript`, `react`, `html`, `sql`) and `file <path>` attach
|
|
319
|
-
code to an owner.
|
|
320
|
-
the attached command `handler` (PLAY0800)
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
|
|
319
|
+
code to an owner. Two kinds block binding (V3 blocked, no specification runs):
|
|
320
|
+
the attached command `handler` (PLAY0800) and the `file` constraint (PLAY0268, see below).
|
|
321
|
+
A query `performer` does not block: it is an opaque read, reported as information
|
|
322
|
+
`PLAY0270` and left out of the executable model; a specification that reads it is left
|
|
323
|
+
out, and every other specification still runs with `screenplay test`.
|
|
324
|
+
Requires Screenplay 4.220.1 (`screenplay --version`); older versions refuse a performer
|
|
325
|
+
query with PLAY0268 and leave the whole model unbound. Everything else binds as an **opaque requirement** that needs a target to
|
|
324
326
|
execute: reducer transitions, rule predicates, command and concept code validation, policy
|
|
325
327
|
predicates and reaction effects. Reaction effects bind only when the trigger has no
|
|
326
328
|
`reads`; a trigger with `reads` plus a `file` or inline effect fails binding. Reaction
|
|
@@ -350,7 +352,7 @@ bodies still leave their owner non-executable.
|
|
|
350
352
|
code validation is refused (STAGE-ESM-005). Opaque pure policies render.
|
|
351
353
|
- The reference runner returns Unsupported for the opaque bodies that do bind (rule and
|
|
352
354
|
policy predicates, code validation, reducer transitions); a specification that needs one
|
|
353
|
-
never passes. Attached handlers
|
|
355
|
+
never passes. Attached handlers and file constraints (and reaction effects on a trigger with
|
|
354
356
|
`reads`) are different: they leave the whole model unbound, so no specification runs at
|
|
355
357
|
all.
|
|
356
358
|
|
|
@@ -362,7 +364,7 @@ bodies still leave their owner non-executable.
|
|
|
362
364
|
| Unquoted `import Other.Contract` | PLAY0268 | external contract import is not bound |
|
|
363
365
|
| `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 |
|
|
364
366
|
| `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 |
|
|
365
|
-
| Context `from`, single-result filters, `scoped to
|
|
367
|
+
| Context `from`, single-result filters, `scoped to` | PLAY0268 | Typed query context, filtering of single results and opaque scope remain unadmitted; a `performer` query is not refused (PLAY0270 information, left out of the executable model); 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 |
|
|
366
368
|
| `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 |
|
|
367
369
|
| 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 |
|
|
368
370
|
| Rule on a nested path (`lines.qty all > 0`) | PLAY0268 | put the rule on the nested value's concept |
|
|
@@ -53,7 +53,7 @@ This table is a reading of the renderer's admission, not a render result: run th
|
|
|
53
53
|
| Area | Renders | Refused (code) |
|
|
54
54
|
| --- | --- | --- |
|
|
55
55
|
| 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 |
|
|
56
|
-
| Queries | optional keyed snapshot lookups; snapshot or observable collections, keyed or unkeyed, with v14 equality filters | context/single-result filters, opaque `scoped to
|
|
56
|
+
| Queries | optional keyed snapshot lookups; snapshot or observable collections, keyed or unkeyed, with v14 equality filters | context/single-result filters, opaque `scoped to` and a list-query `by` block: PLAY0268; a `performer` query is an opaque read (PLAY0270) left out of the model ([version gate](executable-subset.md#code-attachments-what-binds-what-never-does)); 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 |
|
|
57
57
|
| 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) |
|
|
58
58
|
| Event sources, streams, routes (ESM v8) | rendered, including routed read-model/query companion replay | reserved stored names, unformattable routed fixtures (`STAGE-ESM-030`) |
|
|
59
59
|
| Numbers, case tables | whole numbers as `long` from ESM v8; case tables | out-of-`int` literals below v8 (`STAGE-ESM-031`) |
|
|
@@ -99,7 +99,7 @@ ids into routing to fit a renderer (PLAY0515).
|
|
|
99
99
|
observable collections, including supported equality filters;
|
|
100
100
|
Requires Stage 4.90.0 for snapshot lists and live `IReadModels.Observe` streams;
|
|
101
101
|
older renderers refuse snapshot lists with STAGE-ESM-010.
|
|
102
|
-
context/single-result filters, opaque `scoped to`
|
|
102
|
+
context/single-result filters, and opaque `scoped to` block binding; a `performer` query is left out of the executable model ([version gate](executable-subset.md#code-attachments-what-binds-what-never-does)). Keep a list the domain needs and report
|
|
103
103
|
the capability gap; marking it `observable` or keying it is a modeling decision for the user.
|
|
104
104
|
- Attached file/inline handlers refuse PLAY0800 and require constrained implementation
|
|
105
105
|
attachments: gap-fill in code, not by waiting for ESM admission.
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
Compiler syntax: `cheat-sheet.md`. Negative capability claims depend on the tool you ran; name it in every verdict.
|
|
4
4
|
|
|
5
5
|
1. Clean V1 is not executable: binding errors appear through MCP (V2), `render` or `cratis screenplay validate --executable` (bundled compiler, writes nothing). Neither `screenplay <folder>` nor plain `cratis screenplay validate` binds.
|
|
6
|
-
2. The Screenplay samples validate clean but are not all executable; copying their idioms (context-filtered queries, enum/identity compliance, `today`, `reads`, `$causedBy`, templates
|
|
6
|
+
2. The Screenplay samples validate clean but are not all executable; copying their idioms (context-filtered queries, enum/identity compliance, `today`, `reads`, `$causedBy`, templates) can block V3. Caller-supplied collection equality filters bind; read read-surface `references/equality-filters.md`.
|
|
7
7
|
3. Know the target mode (design/executable/renderable) before writing; state it.
|
|
8
8
|
4. Plain `produces` without `for` means allocation in the ESM but "the identifier" in rendered code. Always write `for <identifier>` on a plain `produces <Name>`; inline `produces event <Name>` omits `for` and defaults to the identifier (PLAY0478).
|
|
9
9
|
5. PLAY0029 is a warning: a misspelled keyword (or `type` inside a slice) drops the construct silently. Use `--warnings-as-errors`.
|
|
@@ -157,7 +157,7 @@ Requires Stage 4.90.0 for snapshot/live lists, 4.96.0 for non-text secrets and 4
|
|
|
157
157
|
| `STAGE-ESM-005` | Code validation or rule predicate bodies; or a command beyond the first capability (optional event property, event revision other than the first, validation or requirement that cannot be rendered, neither `produces` nor a response) | Use declarative validation; non-initial event generations are not rendered |
|
|
158
158
|
| `STAGE-ESM-006` | `produces` that cannot render without changing its destination or mappings (expression/enum conditions, literal or computed mappings, `for` not a command identifier, mappings not one-to-one with event properties, duplicate tags) | Map properties one to one; supported conditional productions render as guarded events, not separate commands |
|
|
159
159
|
| `STAGE-ESM-007`, `-008`, `-009` | Projection count per read model (exactly one projection or reducer each); unresolvable properties or no single read-model transition (**flat** projections only); affected instance not one, not keyed by an event property, or not the event-source identity (flat projections only) | One projection per read model; see "Projections" below |
|
|
160
|
-
| `STAGE-ESM-010` | A query is neither an optional snapshot lookup by the read-model identifier nor a supported snapshot/observable collection query; each query is checked on its own. Both collection modes render. Concept-typed keys and filters retain Arc validation, including composite members and collection elements; nullable concept keys or optional concept filters with `not empty` cannot preserve null semantics | Keyed `XById => X optional` queries or snapshot/observable lists. Equality filters render on both collections; DateTime filters, required filters after optional ones and unsupported null-validation shapes refuse 010. Filter-name collisions refuse 012. Context/single-result filters, opaque scope
|
|
160
|
+
| `STAGE-ESM-010` | A query is neither an optional snapshot lookup by the read-model identifier nor a supported snapshot/observable collection query; each query is checked on its own. Both collection modes render. Concept-typed keys and filters retain Arc validation, including composite members and collection elements; nullable concept keys or optional concept filters with `not empty` cannot preserve null semantics | Keyed `XById => X optional` queries or snapshot/observable lists. Equality filters render on both collections; DateTime filters, required filters after optional ones and unsupported null-validation shapes refuse 010. Filter-name collisions refuse 012. Context/single-result filters, opaque scope and a list-query `by` block remain PLAY0268; a performer query is left out of the model (PLAY0270, Requires Screenplay 4.220.1), so render emits nothing for it and it is a gap-fill item; a read model with several key parts (v27) refuses `STAGE-ESM-048` |
|
|
161
161
|
| `STAGE-ESM-011` | A specification cannot render (see the rules below) | Reshape it only if the assertion keeps its meaning; otherwise keep the specification, record the gap, and gap-fill with the specification as the oracle. Never weaken or delete it to get a render |
|
|
162
162
|
| `STAGE-ESM-012` | Generated C# names collide (properties, types, namespaces, constraints) | Rename |
|
|
163
163
|
| `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 |
|