@cratis/pi 7.21.0 → 7.22.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (69) hide show
  1. package/package/corpus/skills/cratis-screenplay-automations-and-translations/SKILL.md +19 -12
  2. package/package/corpus/skills/cratis-screenplay-automations-and-translations/references/audit-format.md +4 -3
  3. package/package/corpus/skills/cratis-screenplay-automations-and-translations/references/automation-patterns.md +13 -15
  4. package/package/corpus/skills/cratis-screenplay-automations-and-translations/references/cases-to-specify.md +4 -4
  5. package/package/corpus/skills/cratis-screenplay-automations-and-translations/references/effects-and-idempotency.md +21 -0
  6. package/package/corpus/skills/cratis-screenplay-automations-and-translations/references/provenance.md +4 -2
  7. package/package/corpus/skills/cratis-screenplay-automations-and-translations/references/todo-list-example.md +7 -4
  8. package/package/corpus/skills/cratis-screenplay-automations-and-translations/verification.json +4 -4
  9. package/package/corpus/skills/cratis-screenplay-captures-and-reactions/SKILL.md +38 -36
  10. package/package/corpus/skills/cratis-screenplay-captures-and-reactions/references/complete-examples.md +1 -1
  11. package/package/corpus/skills/cratis-screenplay-captures-and-reactions/references/invocation-identity.md +84 -0
  12. package/package/corpus/skills/cratis-screenplay-captures-and-reactions/references/refusals-and-redelivery.md +102 -0
  13. package/package/corpus/skills/cratis-screenplay-captures-and-reactions/references/specifying-triggers-and-clock.md +4 -2
  14. package/package/corpus/skills/cratis-screenplay-captures-and-reactions/verification.json +1 -1
  15. package/package/corpus/skills/cratis-screenplay-command-surface/SKILL.md +28 -16
  16. package/package/corpus/skills/cratis-screenplay-command-surface/references/context.md +9 -0
  17. package/package/corpus/skills/cratis-screenplay-command-surface/references/generated-values-and-responses.md +15 -13
  18. package/package/corpus/skills/cratis-screenplay-command-surface/references/operations.md +80 -0
  19. package/package/corpus/skills/cratis-screenplay-command-surface/references/policy-persona-seed.md +23 -1
  20. package/package/corpus/skills/cratis-screenplay-command-surface/verification.json +2 -2
  21. package/package/corpus/skills/cratis-screenplay-discovery/SKILL.md +9 -6
  22. package/package/corpus/skills/cratis-screenplay-discovery/references/storming-loop.md +6 -5
  23. package/package/corpus/skills/cratis-screenplay-event-modeling/SKILL.md +7 -5
  24. package/package/corpus/skills/cratis-screenplay-event-modeling/references/nine-steps.md +6 -5
  25. package/package/corpus/skills/cratis-screenplay-event-modeling/references/parsed-not-runnable.md +39 -49
  26. package/package/corpus/skills/cratis-screenplay-legacy-extraction/SKILL.md +5 -3
  27. package/package/corpus/skills/cratis-screenplay-legacy-extraction/references/generate-notes.md +48 -8
  28. package/package/corpus/skills/cratis-screenplay-model-authoring/SKILL.md +44 -42
  29. package/package/corpus/skills/cratis-screenplay-model-authoring/references/language-reference.md +46 -9
  30. package/package/corpus/skills/cratis-screenplay-model-authoring/references/mcp-loop.md +35 -11
  31. package/package/corpus/skills/cratis-screenplay-model-authoring/references/mcp-tools.md +118 -13
  32. package/package/corpus/skills/cratis-screenplay-model-authoring/verification.json +3 -3
  33. package/package/corpus/skills/cratis-screenplay-model-review/SKILL.md +11 -6
  34. package/package/corpus/skills/cratis-screenplay-model-review/references/anti-patterns.md +1 -1
  35. package/package/corpus/skills/cratis-screenplay-model-review/references/checklist.md +11 -2
  36. package/package/corpus/skills/cratis-screenplay-read-surface/SKILL.md +10 -0
  37. package/package/corpus/skills/cratis-screenplay-read-surface/references/guarded-actions.md +79 -0
  38. package/package/corpus/skills/cratis-screenplay-render-and-gap-fill/SKILL.md +9 -7
  39. package/package/corpus/skills/cratis-screenplay-render-and-gap-fill/references/gap-fill-handoff.md +6 -3
  40. package/package/corpus/skills/cratis-screenplay-render-and-gap-fill/verification.json +2 -2
  41. package/package/corpus/skills/cratis-screenplay-scenario-coverage/SKILL.md +3 -2
  42. package/package/corpus/skills/cratis-screenplay-scenario-coverage/references/spec-forms-by-mode.md +13 -2
  43. package/package/corpus/skills/cratis-screenplay-slice-design/SKILL.md +3 -2
  44. package/package/corpus/skills/cratis-screenplay-slice-design/references/command-inventory.md +3 -2
  45. package/package/corpus/skills/cratis-screenplay-slice-design/references/slicing.md +40 -0
  46. package/package/corpus/skills/cratis-screenplay-specifications/SKILL.md +24 -16
  47. package/package/corpus/skills/cratis-screenplay-specifications/references/examples-and-routes.md +103 -0
  48. package/package/corpus/skills/cratis-screenplay-specifications/references/reactions-and-cascades.md +5 -6
  49. package/package/corpus/skills/cratis-screenplay-streams-and-consistency/SKILL.md +4 -4
  50. package/package/corpus/skills/cratis-screenplay-streams-and-consistency/references/stream-patterns.md +4 -2
  51. package/package/corpus/skills/cratis-screenplay-streams-and-consistency/verification.json +2 -2
  52. package/package/corpus/skills/cratis-screenplay-toolchain/SKILL.md +34 -32
  53. package/package/corpus/skills/cratis-screenplay-toolchain/references/cheat-sheet-example.md +1 -1
  54. package/package/corpus/skills/cratis-screenplay-toolchain/references/cheat-sheet.md +47 -2
  55. package/package/corpus/skills/cratis-screenplay-toolchain/references/diagnostics.md +57 -9
  56. package/package/corpus/skills/cratis-screenplay-toolchain/references/doc-contradictions.md +6 -1
  57. package/package/corpus/skills/cratis-screenplay-toolchain/references/executable-subset.md +19 -10
  58. package/package/corpus/skills/cratis-screenplay-toolchain/references/provenance.md +4 -2
  59. package/package/corpus/skills/cratis-screenplay-toolchain/references/renderable-subset.md +8 -1
  60. package/package/corpus/skills/cratis-screenplay-toolchain/references/sources-and-streams.md +90 -27
  61. package/package/corpus/skills/cratis-screenplay-toolchain/references/traps.md +10 -6
  62. package/package/corpus/skills/cratis-screenplay-toolchain/references/verdicts.md +29 -12
  63. package/package/corpus/skills/cratis-screenplay-toolchain/references/versions.md +91 -136
  64. package/package/corpus/skills/cratis-screenplay-toolchain/verification.json +7 -5
  65. package/package/corpus/skills/cratis-screenplay-ui-composition/references/screen-composition-contract.md +20 -0
  66. package/package/corpus/skills/cratis-stage-rendering-and-sandbox/SKILL.md +9 -5
  67. package/package/corpus/skills/cratis-stage-rendering-and-sandbox/references/admission.md +8 -1
  68. package/package/corpus/skills/cratis-stage-rendering-and-sandbox/verification.json +2 -2
  69. package/package.json +1 -1
@@ -22,17 +22,16 @@ files is one application: always check the folder, never one file of it.
22
22
 
23
23
  When choosing or upgrading a tool, or checking version-specific capabilities, read `references/versions.md`; it is the only version table, and other skills point to it.
24
24
 
25
- | Package | Version | Purpose |
26
- | --- | --- | --- |
27
- | `Cratis.Screenplay.Tool` | `4.68.0` (`79801bf`) | standalone compiler, binder and MCP server; admits ESM v7 (generated values and responses) |
28
- | cratis CLI | `3.40.7` (`v3.40.7`, `af9f18e`) | Tag pins Stage 4.51.1 and Screenplay 4.114.0, with `cratis/stage:4.51.1` as the runtime image. The public CLI executed render publication, the browser acceptance run and the real stdio MCP transcript harness (37 tools, `executableReady true`). Reading baselines: 3.40.3, 3.39.0 and 3.28.3 (`8b43fef`) |
29
- | Screenplay | bundled `4.114.0`; latest language package `4.122.0` | CLI 3.40.7 bundles 4.114.0 and reports `sourceSuccess true`, `semanticSuccess true`, `executableReady true` for the canonical corpus; the repo tool compiles it with `10 file(s) compiled - 0 error(s), 0 warning(s)`. Language features newer than 4.114.0 need the standalone 4.122.0 tool until a CLI bundles them |
30
- | Stage | `4.51.1` (CLI default; latest package 4.51.3) | Docker image `cratis/stage:4.51.1`; renders the canonical screen corpus with Arc `CommandForm` shells and query bindings, and refuses guarded Close and double-click with `STAGE-SCENE-ACTION-001` / `STAGE-SCENE-INTERACTION-001`. Check generated package sets before claiming exact Scene 4.14 runtime parity |
31
- | Arc / Chronicle | `22.50.5` / `19.32.0` | code-level facts cited here |
25
+ The standalone pin is Screenplay 4.125.0. CLI 3.41.0 bundles Screenplay 4.114.0,
26
+ Stage 4.51.3 and Cratis.Arc.Screenplay 22.54.0. The single version table records
27
+ released source evidence and historical probes separately; do not relabel an old
28
+ render/browser result as a probe of the current packages.
32
29
 
33
- Facts were read with `git show <tag>:<path>` and probed on the installed tools. Behaviour
34
- was probed on 4.63.1 and re-checked on 4.66.0 and 4.68.0 (the example gates). 4.65.0 adds command named-rule `implementation` blocks (handlers and operation phases already had the wrapper; it is rejected on concept rules, built-in property rules and whole-command `require`/`validate` bodies); 4.66.0 is editor tooling only. Neither changes execution.
35
- Re-verify before claiming another version behaves the same.
30
+ Historical screens-release evidence: CLI 3.40.7 / Stage 4.51.1 / bundled
31
+ Screenplay 4.114.0 opened the canonical corpus with `executableReady true`
32
+ and the stdio transcript exposed 37 tools; standalone language 4.122.0 was
33
+ recorded in that vector. These retained results are not a rerun on CLI 3.41.0
34
+ or Screenplay 4.125.0.
36
35
 
37
36
  ## Ground rules
38
37
 
@@ -42,10 +41,10 @@ Re-verify before claiming another version behaves the same.
42
41
  2. **Check the folder, warnings as errors.** `screenplay <folder> --warnaserror` or
43
42
  `cratis screenplay validate <folder> --warnings-as-errors`. Warnings hide defects:
44
43
  PLAY0029 (a misspelt keyword or a `type` inside a slice) drops a construct silently.
45
- 3. **Pick the compiler deliberately and name it.** Standalone `screenplay` for V1 to V3 (file
46
- mode follows imports); `cratis` 3.28.2 or later bundles the 4.66.0 compiler (same up to ESM v6, no ESM v7) and is the
47
- route for `render`. A cratis before 3.28.2 bundle (4.60.1) rejects ESM v6 and reports a
48
- false PLAY0285 on cascades (cli#242). Report tool and version with every verdict.
44
+ 3. **Pick the compiler deliberately and name it.** Standalone `screenplay` for
45
+ current language checks and reference specifications; `cratis` for rendering
46
+ and generation. Bundled and standalone versions differ. Report both tool and
47
+ version, rather than transferring a verdict across releases.
49
48
  4. **Know the mode** (design, executable, renderable) and write from its subset.
50
49
  5. **Capability is not correctness.** The tool you ran decides what is accepted today; the
51
50
  domain and the documented semantics decide what is correct. On conflict keep the correct
@@ -62,14 +61,13 @@ Re-verify before claiming another version behaves the same.
62
61
 
63
62
  ## The two compilers
64
63
 
65
- | | Standalone `screenplay` 4.68.0 | `cratis screenplay ...` 3.28.3 and 3.28.2 (bundle Screenplay 4.66.0) |
64
+ | | Standalone `screenplay` | `cratis screenplay ...` |
66
65
  | --- | --- | --- |
67
- | Check a folder | `screenplay <folder> --warnaserror --no-color` (exit 0 pass, 1 fail; an empty folder also exits 0, so read "N file(s) compiled") | `cratis screenplay validate <folder> --warnings-as-errors -o json-compact` (0 pass, 5 fail, 1 missing path or no files) |
68
- | ESM admitted | v1 to v7 | v1 to v6 (generated values and responses report `PLAY0268`; before 3.28.2 bundled 4.60.1: v1 to v5) |
69
- | Automation, Translate, reactions, captures, clocks, triggers | bind | bind (before 3.28.2: PLAY0268 "Slice '<name>' of type '<type>' is not admitted by ESM v1.") |
70
- | Cascade specs | compile | compile (before 3.28.2: false PLAY0285, cli#242) |
71
- | File argument | follows imports | ignores imports, false PLAY0165 warnings (cli#244, probed on 3.28.2): validate the folder |
72
- | MCP | `screenplay mcp <folder>`; 29 tools | `cratis screenplay mcp [root]`; 29 tools; registered by `cratis ai install` |
66
+ | Check root | `screenplay <root> --warnaserror --no-color` | `cratis screenplay validate <root> --warnings-as-errors -o json-compact` |
67
+ | Scope/checks | `--scope <address>`, `--check <names>`; a scoped pass is not whole-application success | Discover installed validation options |
68
+ | Reference execution | `screenplay test <root>` or MCP `run-specifications` | Discover bundled MCP capability; target tests are not V4 |
69
+ | MCP | `screenplay mcp <root>`; discover schemas | `cratis screenplay mcp [root]`; registered by `cratis ai install` |
70
+ | Render version boundary | Binder admission is not Stage admission | CLI 3.41.0 passes up to ESM v7 to Stage; newer versions: `CLI-RENDER-004` |
73
71
 
74
72
  Read `references/versions.md` when you need the exact messages, exit codes or the MCP roots bug.
75
73
 
@@ -84,7 +82,7 @@ Independent results, not a ladder. Read `references/verdicts.md` for the command
84
82
  | V1 | authorable (compiles, warnings as errors) | the folder command above |
85
83
  | V2 | executable diagnostics read | MCP `open-workspace`, then `read-workspace view=executable-diagnostics` |
86
84
  | V3 | binding-ready (binds, no blocking executable diagnostics) | `executableReady` true and no error-severity diagnostic in V2; informational PLAY0269/0270 are reported separately |
87
- | V4 | reference specifications run | the Screenplay reference execution route only (none ships in the pinned tools: `V4 not run: no route`); rendered Debug tests are V5.tests, never V4 |
85
+ | V4 | reference specifications run | `screenplay test` or MCP `run-specifications`; unsupported/unbound is not a pass; rendered Debug tests are V5.tests, never V4 |
88
86
  | V5 | rendered and target-verified | `cratis render`, then Debug build and tests; report admission, publication, build and tests separately |
89
87
 
90
88
  V2 and V3 need MCP: send `initialize`, then `notifications/initialized`, and start the
@@ -105,12 +103,14 @@ changes with the root folder name.
105
103
  only; no handler (PLAY0268, with or without `implementation`/`hint`); `reads` and
106
104
  `concurrency` do not bind (PLAY0271); no `@pii`; v6 constructs bind on Screenplay 4.61 or
107
105
  later (standalone, and cratis 3.28.2 or later); generated values and `returns` responses bind (ESM v7)
108
- only on standalone 4.68.0 or later (`references/generated-responses-example.md`). Read [references/executable-example.md](references/executable-example.md) when you need a small StateChange and StateView model that binds executable, [references/pdl-example.md](references/pdl-example.md) when writing projection forms that bind and run, and [references/automation-translate-example.md](references/automation-translate-example.md) when writing Automation and Translate slices (ESM v6).
109
- - **Renderable** (V5): `references/renderable-subset.md`. Stage 4.24.2 renders ESM v1 to v4 (evolved events refused, `STAGE-ESM-026`)
110
- `StateChange`/`StateView` slices; Automation and Translate are gap-fill (Stage#79), and so are generated values and responses (ESM v7: Stage refuses it with `STAGE-ESM-016`, tracked in Stage#201).
111
- - **Event sources, streams and command routes** (and operations): authorable and validatable, but never
112
- bound (`PLAY0268`: not admitted by any supported ESM version), run or rendered
113
- (`STAGE-ESM-016`); gap-fill with the model as contract (`references/sources-and-streams.md`).
106
+ from Screenplay 4.68.0 (also in the current CLI bundle) (`references/generated-responses-example.md`). Read [references/executable-example.md](references/executable-example.md) when you need a small StateChange and StateView model that binds executable, [references/pdl-example.md](references/pdl-example.md) when writing projection forms that bind and run, and [references/automation-translate-example.md](references/automation-translate-example.md) when writing Automation and Translate slices (ESM v6).
107
+ - **Renderable** (V5): `references/renderable-subset.md` retains explicitly labeled
108
+ older Stage probes. Current CLI admits v7 to planning, but its v7 corpus gets
109
+ Stage generated-value/response refusals `STAGE-ESM-028`/`029`, not a blanket
110
+ compiler refusal. Run admission before claiming a particular model renders.
111
+ - **Event sources, streams and routes** bind as ESM v8 at 4.125.0; CLI 3.41.0
112
+ render refuses versions above v7 (`CLI-RENDER-004`). Operations and exact numeric
113
+ mode remain authorable/unadmitted. Details: `references/sources-and-streams.md`.
114
114
 
115
115
  ## Edit strategy
116
116
 
@@ -144,10 +144,12 @@ Read [references/diagnostics.md](references/diagnostics.md) when a PLAY, STAGE o
144
144
  2. Write `for <identifier>` on every `produces`.
145
145
  3. PLAY0029 is a warning: validate with warnings as errors.
146
146
  4. Validate the folder; name the compiler (cli#244, cli#242).
147
- 5. Mappings to undeclared projection targets and undeclared events in `remove with`/capture
148
- `append` pass V1 and fail binding (V2/V3, PLAY0273); a declared read-model property that
149
- nothing maps is reported by no tool: run V3 and walk field lineage by hand.
150
- 6. A reaction's `invokes` has no caller: a gated command rejects it; keep the gate.
147
+ 5. V1 warns on undeclared projection targets (`PLAY0514`) and removal/capture
148
+ event references (`PLAY0166`). Unmapped declared fields can be reported by
149
+ opt-in `--check field-origins` (`PLAY0534`); unknown coverage is skipped, so
150
+ still walk lineage. See diagnostics for editor versus C#-only checks.
151
+ 6. Without reaction `runs as` an invoke is caller-less. Declare its trusted role
152
+ (ESM v10), keep the gate, and reference-test; CLI/Stage support is separate.
151
153
  7. Read-model identity is one `query XById => RM optional` with `by xId XId`, and the identifier equal to the
152
154
  projection's key (see trap 12); never `identifier` on a read model.
153
155
  8. Projection `key` routes only on `from`; joins never create; `all` is per source.
@@ -230,7 +230,7 @@ module Billing
230
230
  then InvoiceClosed // ESM v6: the Reconciler cascade (amount > 0)
231
231
  for "9c858901-8a57-4791-81fe-4c455b099bc9"
232
232
 
233
- module Housekeeping // no gates: a reaction's `invokes` has no caller
233
+ module Housekeeping // no gates: this reaction declares no `runs as`, so its `invokes` has no caller
234
234
  description "Background follow-up"
235
235
  feature FollowUp
236
236
  slice StateChange CloseInvoice
@@ -1,5 +1,20 @@
1
1
  # Screenplay cheat-sheet (tool versions: versions.md)
2
2
 
3
+ ## Contents
4
+
5
+ - Samples and preview fixtures
6
+ - Lexical and structural rules
7
+ - Exact numeric source mode
8
+ - Clause order inside a command (canonical)
9
+ - Slice contents (typical)
10
+ - `$context.` paths (command `produces`)
11
+ - `$eventContext.` (projections)
12
+ - PDL quick reference (most forms are compiled in `pdl-example.md` or `cheat-sheet-example.md`; `remove via join` and `$eventContext.occurred` are not)
13
+ - Specification forms
14
+
15
+ Current pins: standalone Screenplay 4.125.0 / CLI 3.41.0; `versions.md` is the
16
+ single table. Compile evidence below keeps its historical tool labels.
17
+
3
18
  The syntax lives in compiled example files next to this one (each is a Markdown file holding
4
19
  one complete `screenplay` fence). Copy shapes from them; do not write a form that none of
5
20
  them (or a compiled documentation example) shows. This file holds the prose rules; the
@@ -18,11 +33,31 @@ by `for_Documentation/when_comparing_the_grammar_against_the_parsers.cs`),
18
33
  Screenplay CI (`when_compiling_every_example.cs`) against repository main: the standalone
19
34
  compiler (4.68.0; `cratis` 3.28.2 or later bundles 4.66.0, which lacks ESM v7); older cratis bundles differ (`versions.md`).
20
35
 
36
+ ## Samples and preview fixtures
37
+
38
+ Invoicing is a warning-free syntax showcase, not a runnable whole-language proof.
39
+ The released samples policy excepts these preview families and points to dedicated
40
+ fixtures; do not infer binder admission from the sample's coverage list:
41
+
42
+ | Family | Screenplay v4.125.0 fixture |
43
+ | --- | --- |
44
+ | Exact numbers | `Source/Screenplay/Compiler/Conformance/exact-named-rule-intent.play` |
45
+ | Sources/streams/command routes | `Documentation/screenplay/fixtures/source-streams.play` |
46
+ | Specification routes | `Source/Screenplay/Compiler/Conformance/specification-streams.play` |
47
+ | Systems/operations/specification steps | `Documentation/screenplay/fixtures/operations.play` |
48
+ | Refusals/redelivery/no-events | `Source/Screenplay/Compiler/Conformance/reaction-refusals-redelivery.play`, `no-events.play` in that directory |
49
+
50
+ Source: `v4.125.0:.cratis/ai/rules/project/samples.md`. Its preview list retains
51
+ sources/specification routes, but the released binder/runner admits them as v8;
52
+ its old blanket PLAY0268 wording is not the current route verdict. Other rows
53
+ remain unadmitted. Compile and test each relevant fixture with the chosen tool.
54
+
21
55
  ## Lexical and structural rules
22
56
  - Spaces only, 2 per level (tabs: PLAY0006 W). Offside rule.
23
57
  - Comments: `//` only. `#` is not a comment (PLAY0058 E in a projection) despite doc examples.
24
- - Order is free (forward references fine) except `domain` first in the file and `description`
25
- first in a body.
58
+ - Body directives can appear in any order; singleton `description` still appears
59
+ at most once. Canonical printing may place it first, but the parser does not
60
+ require that position. Source preambles precede declarations.
26
61
  - Strings: `"..."`, escapes `\" \\ \n \r \t`; other backslashes kept (regex `"^INV-\d{6}$"` works).
27
62
  - Structured values: single-line JSON, quoted keys (`[{"sku": "A-1", "quantity": 2}]`).
28
63
  - One condition grammar (policy `require`, `produces when`, `require`, reaction `where`): `and`
@@ -40,6 +75,16 @@ compiler (4.68.0; `cratis` 3.28.2 or later bundles 4.66.0, which lacks ESM v7);
40
75
  or keyed query argument) or `matches <commandProperty>`; executable; renderable only for
41
76
  text-backed targets (Uuid-backed: STAGE-ESM-015).
42
77
 
78
+ ## Exact numeric source mode
79
+
80
+ Start each file/import barrel with `numbers exact` to retain bounded decimal
81
+ literals without Double rounding. All assembled files must agree on mode;
82
+ PLAY0508–PLAY0513 diagnose malformed directives, range errors and disagreement.
83
+ Exact mode is authoring-only (`PLAY0268` on binding), not ESM v7 generated values.
84
+ Typed JSON needs consistent `sourceOptions.numericMode: "exact"` on every root
85
+ and `ExactNumber` literal envelopes with canonical fixed-point string values,
86
+ never JSON numbers. Details: model-authoring `references/language-reference.md`.
87
+
43
88
  ## Clause order inside a command (canonical)
44
89
  description, properties, `reads`, `authorize`, `validate`, `produces`/`handler`, `concurrency`.
45
90
 
@@ -3,8 +3,9 @@
3
3
  ## Contents
4
4
 
5
5
  - Warnings that hide defects (always validate with `--warnings-as-errors`)
6
- - Not caught at V1 (fail binding: V2/V3, PLAY0273)
7
- - Silent at every level
6
+ - Source reference and identifier checks
7
+ - Structural completeness and timeline checks
8
+ - Editor versus C# verdicts
8
9
  - Consistency errors (V1: the model contradicts itself)
9
10
  - Binding (V2 and V3) - see `executable-subset.md` for the full table
10
11
  - Frequent errors
@@ -33,13 +34,56 @@ then STAGE (V5 admission). Tool differences: `versions.md`.
33
34
  | PLAY0455 | quoted import glob matches no file | fix the glob |
34
35
  | PLAY0196/0197/0198 | unknown query/screen; ambiguous bare name | declare or qualify `Slice.Name` |
35
36
 
36
- ## Not caught at V1 (fail binding: V2/V3, PLAY0273)
37
- - Projection mapping to a property the read model does not declare.
38
- - Undeclared event in `remove with` or in a capture `append`.
39
- (Screenplay v4.66.0 `SemanticModelBinder` `BindMapping`, `LevelEvent`, `BindCaptureAppends`.)
37
+ ## Source reference and identifier checks
40
38
 
41
- ## Silent at every level
42
- - A declared read-model property that nothing maps (it stays empty): walk field lineage by hand.
39
+ At Screenplay 4.125.0 these are V1 source checks, not binding-only gaps:
40
+
41
+ | Code | Severity | Meaning |
42
+ | --- | --- | --- |
43
+ | PLAY0514 | W | Projection mapping, children or nested target absent from the declared read-model/element shape; unknown/imported shapes are not guessed |
44
+ | PLAY0166 | W | Unknown event, including `remove with`, `remove via join on` and capture `append` |
45
+ | PLAY0515 | E | Personal/secret concept in a command identifier, typed `for` destination, event-source identity, stream-id type/part or route mapping source (including nested paths); keep a surrogate identity and protected data in payload |
46
+
47
+ Legacy compliance spellings (`@pii`/`@sensitive`) do not evade PLAY0515.
48
+
49
+ ## Structural completeness and timeline checks
50
+
51
+ Opt in with `--check <names>` or MCP diagnostics `checks`, then treat warnings
52
+ as errors if gating. Ordinary compile success does not imply these ran:
53
+
54
+ | Family | Codes | Checks |
55
+ | --- | --- | --- |
56
+ | data-bindings | PLAY0530/0531 | Conflicting visible bindings; binding/query read-model or cardinality mismatch |
57
+ | input-surfaces | PLAY0532/0533 | Missing command input form/issuing screen; missing reachable issuer |
58
+ | field-origins | PLAY0534 | Missing read-model builder or top-level field origin (AutoMap, identity and variants considered) |
59
+ | query-keys | PLAY0535 | Query argument not representable by known identity/fields |
60
+ | event-consumers | PLAY0536 | Latest local event generation lacks an operational consumer; a terminal fact can legitimately be reported |
61
+ | navigation | PLAY0537 | Unreachable screens; unreachable cycles do not establish an entry point |
62
+
63
+ Whole-source errors skip completeness checks. Unknown/opaque coverage is not
64
+ invented: report skipped status/coverage and walk field lineage manually.
65
+
66
+ PLAY0516/0517 are **information**, so never fail `--warnaserror`. They review
67
+ presentation order, not execution: a backward event/read-model dependency or a
68
+ mutually dependent sibling group. A cycle group replaces internal individual
69
+ backward findings. Ordering roots are the sole source document, an importing
70
+ `application.play`, or a unique importing root; without one, folder timeline
71
+ checking is skipped. Safe PLAY0516 repairs move siblings/imports or pin files
72
+ before a retained glob; cycles and own-sub-feature findings have no repair.
73
+
74
+ ## Editor versus C# verdicts
75
+
76
+ Monaco/VS Code use the TypeScript syntax/authoring compiler. They share projection
77
+ and protected-identifier checks (PLAY0514/0515), typed-example syntax (0518/0519),
78
+ guarded actions (0341–0348), and reaction-refusal syntax/checks (0538–0545).
79
+ A shared catalog code is not proof that a check is implemented in both compilers.
80
+
81
+ C# CLI/MCP owns whole-application scoped diagnostics, opt-in completeness
82
+ (PLAY0530–0537), semantic binding and PLAY0546 (a negated claim targets optional,
83
+ unavailable-subject or non-text data). The VS Code repair bridge is not a general
84
+ C# validator. A clean editor is not V1 for the complete application, V3 binding
85
+ or V4 execution. Run the CLI or MCP for those verdicts. Authority:
86
+ `v4.125.0:Documentation/screenplay/editor-diagnostics.md`, `diagnostics.md`.
43
87
 
44
88
  ## Consistency errors (V1: the model contradicts itself)
45
89
  | Code | Meaning |
@@ -99,7 +143,11 @@ Fix order: E at V1 -> W at V1 -> silent-gap check -> V2 codes (if the mode needs
99
143
  Report each as `code file:line one-line meaning`; never paste more than about 30 lines.
100
144
 
101
145
  ## Render admission (V5): `STAGE-*`, `CLI-RENDER-*`, `STAGE-CRATIS-*`
102
- Full table with causes: `renderable-subset.md`. Codes you meet most:
146
+ Full table with causes: `renderable-subset.md`. The Stage 4.24.x rows below
147
+ retain historical source/probe evidence. Current CLI 3.41.0 admits up to ESM v7
148
+ for Stage planning; above that is CLI-RENDER-004. Its v7 corpus is refused by
149
+ STAGE-ESM-028 (generated values) and -029 (responses), not the old v7 version gate.
150
+ Codes in the historical snapshot:
103
151
  | Code | Meaning |
104
152
  |---|---|
105
153
  | STAGE-ESM-016 | model above the admitted ESM schema (v4 on Stage 4.24.2: v5 absence and v6 constructs; 4.24.1 admitted v3, so a v4 model with generations was refused): whole model refused |
@@ -1,5 +1,10 @@
1
1
  # Documentation contradictions and which side to trust
2
2
 
3
+ Current pins are Screenplay 4.125.0 / CLI 3.41.0 (`versions.md`). This is a
4
+ **historical** contradiction inventory, not a claim that all listed defects still
5
+ exist. Current grammar documents exact numbers and free description placement;
6
+ sources/routes bind as ESM v8; PLAY0515 is a source error; CLI v7 reaches Stage.
7
+
3
8
  `D/` is Screenplay `Documentation/screenplay/` at **v4.66.0**; line numbers were re-read at
4
9
  that tag. Rule: the compiler you ran decides what the tool accepts today; the documentation
5
10
  and the domain decide what the model should mean. When they disagree, follow the compiler
@@ -32,7 +37,7 @@ read from source or documentation.
32
37
  | 19 | `$strings` constraint messages | `D/constraints.md:31` vs `D/internationalization.md:55` | the compiler keeps the key; realization localizes |
33
38
  | 20 | composite key braces | optional in the EBNF; both forms in docs | both fine |
34
39
  | 21 | counters list | `D/projections/index.md:54` lists only increment and decrement | `count` exists too [probed] |
35
- | 22 | ESM version allocation | older text and decisions 0023 and 0024 give exact numbers, operations, streams and reads fixed numbers (v7 to v11) | decision 0025 (accepted 2026-10-06): v7 is generated values and responses (decision 0026, released in 4.68.0); every other feature has no number until its release-ready admission, so say "not admitted by any supported ESM version" |
40
+ | 22 | ESM version allocation | older text and decisions 0023 and 0024 give exact numbers, operations, streams and reads fixed numbers (v7 to v11) | use actual released binder selection: v7 generated values/responses, v8 routing, v10 reaction identity at 4.125.0; operations and exact numbers remain unadmitted. Never infer current admission from older proposed allocations |
36
41
  | 23 | claim conditions | the condition grammar lists `==` | claims need `matches` (PLAY0120) [probed] |
37
42
  | 24 | `numbers exact` | released in 4.64.0 as syntax only, but absent from `D/grammar.md`; documented only in `D/diagnostics.md` (PLAY0508 to PLAY0513) | the compiler: it parses, never binds (PLAY0268, "not admitted by any supported executable model (ESM) version yet"), PLAY0001 on older compilers [probed] |
38
43
  | 25 | command `concurrency` | `D/commands.md:609` says the executable model "does not bind the `concurrency` block yet" | the binder reports PLAY0271 as an **error**, not a silent skip (`SemanticModelBinder.Commands.cs:32-38`) |
@@ -10,6 +10,12 @@
10
10
  - Not refused, but do not rely on it
11
11
  - Never do this to reach V3
12
12
 
13
+ Current pins are Screenplay 4.125.0 / CLI 3.41.0 (`versions.md`). Detailed
14
+ 4.66.0/4.68.0 binder probes below retain their historical labels. Current source
15
+ admits sources/streams/routes as ESM v8 and policy negation as ESM v7; operations,
16
+ exact numbers and reaction refusals/redelivery remain unadmitted. Use the actual
17
+ binder before promoting an older probe to a current capability claim.
18
+
13
19
  What the binder admits, and what it refuses with which code. The answer depends on the
14
20
  compiler version: standalone Screenplay 4.68.0 admits ESM v1 to v7; the 4.66.0 compiler bundled in
15
21
  cratis 3.28.2 and 3.28.3 admits v1 to v6; the 4.60.1 compiler bundled in cratis before 3.28.2 admits v1 to v5.
@@ -63,9 +69,10 @@ Complete examples that bind live in `executable-example.md` (both compilers),
63
69
 
64
70
  - `slice Automation` with `reaction`: `when <Event>` (with values) then `produces` (no
65
71
  `for` means the trigger's event source) or `invokes <Command>`; `where`; clock `at ... on
66
- ...` with an explicit `for`. The invoked command runs its full pipeline with **no caller**
67
- (Screenplay#383, open): a gated command rejects and the rejection ends the scenario.
68
- Keep the gate and record the capability gap; never strip authorization.
72
+ ...` with an explicit `for`. Without a declared actor, a gated invocation denies.
73
+ On 4.125.0 reaction `runs as system role "<Role>"` supplies the actor and
74
+ selects ESM v10; keep the gate. CLI 3.41.0's older compiler rejects this syntax,
75
+ while standalone reference execution admits it.
69
76
  - Application `trigger` declarations and `when trigger` specifications.
70
77
  - `slice Translate` with `capture` (`key`, `map ... translate`, `append ... when x from "a"
71
78
  to "b"`), and `given capture` / `when capture` specifications.
@@ -173,7 +180,7 @@ bodies still leave their owner non-executable.
173
180
  | `$eventContext.occurred.Week` | PLAY0273 | derived value |
174
181
  | Projection `parent p` where `p` is not on the child event | PLAY0273 | "Event property not found" |
175
182
  | `generated` or `returns` on a compiler before 4.68.0 (4.66.0 and 4.67.0 refuse; 4.66.0 is bundled in cratis 3.28.x) | PLAY0268 | admitted from standalone 4.68.0 (ESM v7), see above |
176
- | Operations or systems, `numbers exact`, eventsource or stream | PLAY0268 | not admitted by any supported ESM version; syntax only (`sources-and-streams.md`); one such construct leaves the **whole** application without an executable model |
183
+ | Operations or systems, `numbers exact`, reaction refusals/redelivery | PLAY0268 | not admitted by any supported ESM version; one such construct leaves the **whole** application without an executable model. Event sources/streams/routes instead bind as ESM v8 on the current compiler (`sources-and-streams.md`) |
177
184
  | Spec of a gated command or query without `given caller` | PLAY0389 | module and feature gates count |
178
185
  | `given` or `then readmodel` missing the key property | PLAY0351 | key is the keyed query's `by` |
179
186
  | When-less spec asserting events or errors | PLAY0352 | |
@@ -185,15 +192,17 @@ bodies still leave their owner non-executable.
185
192
  - Plain `produces` without `for` binds (PLAY0478, information) but means allocation in the
186
193
  ESM and "the identifier" in rendered Arc code. Always write `for`.
187
194
  - A projection-level (root) `remove via join` binds, but the reference execution plan refuses it (`UnsupportedProjectionBlock`), so no specification in the application runs; Chronicle wires it as a child pull. See the blocked-plan rows above.
188
- - A projection mapping to a property the read model does not declare, and an undeclared
189
- event in `remove with` or a capture `append`: V1 does not report them; binding (V3) does,
190
- with PLAY0273 (Screenplay v4.66.0 `BindMapping`, `LevelEvent`, `BindCaptureAppends`). A
191
- declared read-model property that nothing maps is different: no tool reports it, so check
192
- field lineage by hand.
195
+ - At Screenplay 4.125.0, V1 reports absent projection/children/nested targets
196
+ with PLAY0514 and unknown removal/capture events with PLAY0166. An unmapped
197
+ declared field can be found by opt-in `--check field-origins` (PLAY0534);
198
+ unknown or opaque coverage is skipped, so still check lineage by hand.
193
199
 
194
200
  ## Never do this to reach V3
195
201
 
196
202
  Do not remove `@pii`, `@sensitive`, `authorize` or policies, list queries, automations or
197
203
  rules a domain needs just to make binding pass. Report `V3 blocked: <codes>` and record the
198
204
  slice in the gap list. A `@pii` or `@sensitive` attribute blocks V3 and rendering, and
199
- either attribute on an event-source identifier is not reported by the pinned tools (`PLAY0515` ships for `@pii` in Screenplay 4.69.1 and for `@sensitive` in 4.84.1); only Chronicle rejects it, at build time of the generated code (CHR0034 for `[PII]`, CHR0052 for `[Encrypted]`).
205
+ either attribute on an identifier or typed destination is a source error
206
+ PLAY0515 on the current compiler (including stream-id parts and route mapping
207
+ sources). Chronicle also rejects `[PII]`/`[Encrypted]` on event-source identifiers
208
+ (CHR0034/CHR0052). Keep surrogate identity and protected payload separate.
@@ -28,6 +28,7 @@ is adapted with the agreement of Martin Dilger and Nebulit GmbH.
28
28
 
29
29
  ## Sources read for facts
30
30
 
31
+ - Current baseline: Screenplay `v4.125.0` `Documentation/screenplay/{tool,diagnostics,editor-diagnostics,grammar,event-sources,specifications,policies}.md`, MCP reference/authoring guides and `Semantics/Versions.cs`; CLI `v3.41.0` dependency pins, `RenderedSemanticVersions.cs` and its v7 planning specification. Installed versions/CLI help and changed examples were checked separately. Pins are in `versions.md`; the older probes below retain their original labels.
31
32
  - Screenplay `v4.66.0` (`c89198b`): `Documentation/screenplay/` (grammar, commands, queries,
32
33
  specifications, reactions, diagnostics, mcp), `decisions/0017`, `0020`, `0022` to `0024`,
33
34
  `Source/DotNET/Screenplay/Semantics/` (binder, versions, execution),
@@ -39,8 +40,9 @@ is adapted with the agreement of Martin Dilger and Nebulit GmbH.
39
40
  - cratis `v3.28.2` (`141c499`; `Render/`, `Run/`, `Prologue/` and `Screenplay/Generate*` are unchanged since `v3.27.1`, `a327e89`): `Source/Cli/Commands/Render/`, `ScreenplayMcpRoot.cs`,
40
41
  `Documentation/reference/screenplay.md`.
41
42
  - Arc `v22.50.5` and Chronicle `v19.32.0` for the code-level facts cited in `versions.md`.
42
- - Open issues cited as limits: cli#242, #243, #244, #245; Screenplay#377, #379, #383,
43
- #388; Stage#79, #165, #178; Chronicle#3744, #4123, #4131.
43
+ - Historical issue inventory at the old probes: cli#242, #243, #244, #245;
44
+ Stage#79, #165, #178; Chronicle#3744, #4123, #4131. Current invocation actor and
45
+ reference-execution availability are verified against v4.125.0, not old open-issue status.
44
46
 
45
47
  ## Changes from the earlier toolkit
46
48
 
@@ -1,6 +1,13 @@
1
1
  # Renderable subset (V5): what `cratis render` admits
2
2
 
3
- Sources, all read at tags: Stage v4.24.1 `Source/Rendering.Cratis/Semantics/SemanticSurfaceLedger.cs`
3
+ Current pins: standalone Screenplay 4.125.0; CLI 3.41.0 bundles Screenplay
4
+ 4.114.0 and Stage 4.51.3 (`versions.md`). CLI admits ESM v7 to Stage planning;
5
+ above v7 is CLI-RENDER-004. Its v7 canonical corpus gets STAGE-ESM-028/029 for
6
+ generated values/responses (`v3.41.0:Source/Cli.Specs/for_ScreenplayPlanning/when_planning_an_esm_v7_model.cs`).
7
+ The following detailed Stage 4.24.x results are **historical**, not reverified
8
+ 4.51.3 claims. Run the bundled renderer before asserting current renderability.
9
+
10
+ Historical sources, all read at tags: Stage v4.24.1 `Source/Rendering.Cratis/Semantics/SemanticSurfaceLedger.cs`
4
11
  (an exhaustive map of every ESM member to Rendered, Rejected(code) or Ignored),
5
12
  `CratisArtifactRenderPlanner.cs`, `PureTransitionAdmission.cs`; cli v3.28.2
6
13
  `Commands/Render/RenderSettings.cs` and `Documentation/reference/screenplay.md`. Re-run the
@@ -1,29 +1,92 @@
1
1
  # Event sources, streams and command routes
2
2
 
3
- What a model that uses `eventsource`, `stream`, `streamId` or a command route can and
4
- cannot do today. Facts read at Screenplay v4.68.0 (`SemanticModelBinder.CommandProductions.cs`),
5
- Stage v4.24.0 (`SemanticCratisAdmission.cs`) and Chronicle v19.30.0 / Arc v22.49.0.
6
-
7
- | Activity | Today |
8
- | --- | --- |
9
- | Author in `.play` (syntax, MCP views `event-sources`, `event-streams`, `command-routes`) | yes, since Screenplay v4.62.0 |
10
- | Validate (V1: authorable) | yes |
11
- | Bind (V3) and run specifications | no: binding reports `PLAY0268`; the whole application then has no executable model. V2 (executable diagnostics) shows that blocking `PLAY0268` as the evidence for the blocked V3 |
12
- | Render (V5) | no: Stage admits ESM v1 to v4 only, so a model of v5 or later is refused with `STAGE-ESM-016` and an evolved event with `STAGE-ESM-026` |
13
- | Deliver as code | gap-fill by hand with the model as the contract (`cratis-screenplay-render-and-gap-fill`, case C) |
14
-
15
- Why binding refuses: no supported executable model (ESM) version admits these constructs. At 4.68.0 the
16
- `PLAY0268` message reads "Event sources, streams and routes are not admitted by any supported executable model
17
- (ESM) version yet (#302)." They have no ESM version number: by decision 0025 a number is assigned only at a
18
- release-ready admission, so do not copy a number into a model, a skill or a decision. Tracked in
19
- Cratis/Screenplay#407 (increment 2 of #302).
20
-
21
- Stage: even when a model uses none of these constructs, Stage 4.24.0 renders appends
22
- without event source type, event stream type or event stream id, so Chronicle's defaults
23
- apply. Tracked in Cratis/Stage#177, #200 and #201. Keep a declared route as intent in the
24
- model and implement it in hand-written code; never remove it to make the model bind or render.
25
-
26
- Code-level target for the hand-written part: `IEventSource`, `[EventSource]`, `[EventStream]`
27
- (Chronicle 19.30.0 and later) and Arc's `[EventSource<TSource>(stream)]` on a command
28
- (Arc 22.49.0 and later); see `cratis-chronicle-client-dotnet` and `cratis-arc-command`
29
- (`references/handler-shapes.md`).
3
+ ## Contents
4
+
5
+ - Admission
6
+ - Declare and route
7
+ - Specification routes
8
+ - Boundaries
9
+
10
+ ## Admission
11
+
12
+ Sources, streams and command/specification routes bind and reference-execute as
13
+ **ESM v8** on Screenplay 4.125.0. Current evidence: released `event-sources.md`,
14
+ `specifications.md`, `Versions.cs`; the complete example below compiled with
15
+ `--warnaserror` and passed `screenplay test` on 4.125.0.
16
+
17
+ CLI 3.41.0 renders only model versions up to v7: routed v8 models receive
18
+ `CLI-RENDER-004` before planning/publication. This is not a source-validation or
19
+ binder refusal. Keep the routed model as contract and gap-fill its realization;
20
+ never remove routing to obtain a render. Pins: `versions.md`.
21
+
22
+ The 4.68.0 historical binder refusal (`PLAY0268`, no admitted version then) is
23
+ not the current disposition. Systems/operations and exact numbers still report
24
+ PLAY0268; they are separate capabilities, not evidence against v8 routing.
25
+
26
+ ## Declare and route
27
+
28
+ An `eventsource` belongs to the application. Its `identifier` states the nominal
29
+ source-id type; streams belong to that source. A command's `stream Source.Stream`
30
+ selects the exact declared source/stream, with nested scalar `streamId = <value>`
31
+ for a keyed stream. Portable mapping sources are required direct non-generated
32
+ command properties or compatible scalar literals; nested paths can be authored
33
+ but refuse executable admission with PLAY0268. An unkeyed stream takes no id. Composite stream ids instead
34
+ use a bare nested `streamId` followed by all named part mappings exactly once.
35
+ A property literally named `stream` is written `@stream` where the command clause
36
+ would otherwise consume it. Do not invent source-only route syntax.
37
+
38
+ ```screenplay
39
+ concept AccountId : Uuid
40
+ concept Month : Int
41
+ eventsource Account
42
+ identifier AccountId
43
+ stream Transactions
44
+ streamId Month
45
+ module Banking
46
+ feature Deposits
47
+ slice StateChange Deposit
48
+ command Deposit
49
+ accountId AccountId identifier
50
+ month Month
51
+ amount Decimal
52
+ stream Account.Transactions
53
+ streamId = month
54
+ produces event Deposited
55
+ amount Decimal = amount
56
+ specification Depositing
57
+ when Deposit
58
+ accountId = "3fa85f64-5717-4562-b3fc-2c963f66afa6"
59
+ month = 10
60
+ amount = 40
61
+ then Deposited
62
+ for "3fa85f64-5717-4562-b3fc-2c963f66afa6"
63
+ stream Account.Transactions
64
+ streamId = 10
65
+ amount = 40
66
+ ```
67
+
68
+ ## Specification routes
69
+
70
+ `given <Event>`, `when append <Event>` and `then <Event>` may state a route;
71
+ `when <Command>` may not, because its route comes from the declaration. Routes
72
+ belong to occurrences, not event types. Scalar ids are concrete literals of the
73
+ stream's declared type; composite ids name every declared part. Routed history
74
+ and appends require a concrete `for` of the source identifier type; routed `then`
75
+ may omit it. Unknown/ambiguous destination types refuse, never default to text.
76
+
77
+ `then` without routing leaves the route unspecified (wildcard), while
78
+ `then ... no stream` explicitly expects an unrouted occurrence. `no stream` is
79
+ not permitted on `given` or `when append`; no route there already means unrouted.
80
+ An event-level `stream = ...` or `streamId = ...` remains payload, not routing.
81
+ Typed event examples may supply a route, replaced as a whole by step overrides;
82
+ `for` is independent. No spelling restores a wildcard after an example supplies
83
+ a route. See `cratis-screenplay-specifications` for fixture provenance.
84
+
85
+ ## Boundaries
86
+
87
+ Reference routing does not prove target deployment, concurrency or protected
88
+ reads. Personal/secret values cannot become source or stream ids (PLAY0515),
89
+ including composite parts and nested command mapping sources. Use surrogates.
90
+ Code-level realization uses Chronicle `IEventSource`, `[EventSource]`,
91
+ `[EventStream]` and Arc's event-source route attribute; follow the corresponding
92
+ client/command skills rather than translating route metadata to payload copies.
@@ -1,6 +1,10 @@
1
1
  # Traps (one line each, with the fix)
2
2
 
3
- Re-checked against Screenplay v4.66.0 and cli v3.28.2 where marked [probed] or [source]. Tool and version facts: `versions.md`. Compiler-verified syntax: `cheat-sheet.md`.
3
+ Current pins: Screenplay 4.125.0 / CLI 3.41.0 (`versions.md`). Unless explicitly
4
+ updated below, [probed]/[source] rows retain their historical v4.66.0/CLI 3.28.2
5
+ scope; negative capability claims there are not current verdicts. Current routes
6
+ bind as v8, v7 reaches Stage planning, reference tests have CLI/MCP routes, and
7
+ exact numbers are documented in the grammar. Compiler syntax: `cheat-sheet.md`.
4
8
 
5
9
  1. Clean V1 is not executable: binding errors appear only through MCP (V2) or `render`. Neither `screenplay <folder>` nor `cratis screenplay validate` binds. [probed]
6
10
  2. The Screenplay samples validate clean but are not all executable; copying their idioms (list queries, `@pii`, `today`, `reads`, `$causedBy`, templates, performers) breaks V3. [probed]
@@ -8,10 +12,10 @@ Re-checked against Screenplay v4.66.0 and cli v3.28.2 where marked [probed] or [
8
12
  4. Plain `produces` without `for` means allocation in the ESM but "the identifier" in rendered code. Always write `for <identifier>`. [PLAY0478 probed]
9
13
  5. PLAY0029 is a warning: a misspelled keyword (or `type` inside a slice) drops the construct silently. Use `--warnings-as-errors`. [probed]
10
14
  6. Validate the folder: `cratis screenplay validate file.play` ignores imports and reports false unknown-name warnings (cli#244, open); the standalone tool follows them. [probed on 3.28.2 and 4.66.0]
11
- 7. Unresolved names are warnings by design. Mappings to undeclared projection targets and undeclared events in `remove with`/capture `append` pass V1 and fail binding (V3, PLAY0273); a declared read-model property that nothing maps is reported by no tool. Run V3 and check field lineage by hand.
15
+ 7. Current V1 warns on absent projection/children/nested targets (PLAY0514) and unknown removal/capture events (PLAY0166). Opt-in field-origins checks find unmapped declared fields (PLAY0534) where coverage is known; still walk lineage for skipped/opaque shapes.
12
16
  8. Severity does not soften a rule: `severity warning` still rejects the command.
13
17
  9. Authorization (module AND feature AND construct) runs before validation; unauthorized is `then denied`, never `then error`.
14
- 10. A reaction's `invokes` runs with no caller (no syntax for an identity yet: Screenplay#383, open): a gated invoked command rejects and ends the scenario. Design the trusted path (`cratis-screenplay-automations-and-translations`): keep the gate and record the capability gap; at code level `[ExecuteCommandsAsSystem]` (Arc 20.56.0 and later, so also in a Stage-rendered app on Arc 22.25.0); never invent `runs as`. Never strip authorization.
18
+ 10. Without a declared actor an invocation is caller-less. At 4.125.0 declare reaction `runs as system role "<Role>"` (ESM v10), keep its gate, and reference-test the trusted path. CLI 3.41.0's 4.114.0 parser rejects this syntax (PLAY0137); Stage 4.51.3 audits through v7 only. Arc gap-fill uses `[ExecuteCommandsAsSystem]` for returned commands, not a fictional `given caller`.
15
19
  11. A reaction `produces` without `for` lands on the trigger's event source; clock and application triggers need an explicit `for`.
16
20
  12. Read-model identity comes from its keyed queries, which must all use the same `by` property: `query XById => RM optional` + `by xId XId` with `xId` a read-model property, and the identifier equals the projection's effective key (table in slice-design `references/read-model-design.md`; full rule, including Stage's narrower admission and `STAGE-ESM-017`, in `cratis-stage-rendering-and-sandbox` `references/admission.md`). Never mark a read-model property `identifier`. (PLAY0268 when the keyed queries do not share one `by` property; PLAY0351 when a `given`/`then` readmodel block omits that property.)
17
21
  13. Projection `key` routes only on `from` (projection-level: PLAY0381). `all` is per event source. Joins never create instances and match the joined event's source id. [probed]
@@ -27,10 +31,10 @@ Re-checked against Screenplay v4.66.0 and cli v3.28.2 where marked [probed] or [
27
31
  23. `@` escapes are mandatory for `tag`, `authorize`, `produces`, `reads`, `file`, `validate`, `sequence`, `occurred`, `causedBy`, `namespace`, `correlation`, `causation`, and projection `key`/`parent`/`with` as names.
28
32
  24. Comments do not survive canonicalizing edits (PLAY0288 reprint; `droppedCommentCount`); keep durable rationale in `description` text, not `//`.
29
33
  25. MCP writes: propose, review, approval, apply by the identity owner (the session that owns the MCP connection); other subagents return edit requests; proposals are connection-local, at most 16 (`cratis-screenplay-model-authoring`).
30
- 26. Future syntax (operations, systems, eventsource/stream) parses but never binds (not admitted by any supported ESM version); `generated` and `returns` bind from standalone 4.68.0 (ESM v7) and still report PLAY0268 on the 4.66.0 bundled in cratis 3.28.x; never invent ADR-planned syntax (`derive`, `provide`, `advisory`, `origin`, subject marks, `order by`, paging, `occurred at`, `from` filters, `for each`).
34
+ 26. Operations/systems and exact numbers remain unadmitted. Sources/streams/routes bind and reference-execute as ESM v8 at 4.125.0; generated values/responses bind as v7. CLI 3.41.0 renders through v7 only, with construct-specific Stage refusals. Consult released grammar rather than inventing syntax from decisions.
31
35
  27. Translate vs Automation is semantic: external facts become local facts in `Translate`; in-app event-to-event goes in `Automation`.
32
36
  28. Personas drive the board: a persona must list every policy on the path, including module-level `IsAuthenticated`.
33
- 29. Sample specifications are never executed; their expected values (e.g. `.0000000Z` clock fraction, given==when clock boundary) are illustrative only.
37
+ 29. A sample's source check is not execution. Run selected admitted specifications through `screenplay test`/MCP; given==when clock still fires no scheduled occurrence.
34
38
  30. Claims compare with `matches` (`claim "dept" matches "Finance"`); `==` is PLAY0120. Conditions with `contains`/`starts with` compile but do not bind. [probed]
35
39
  31. One `every`/`all` block per projection level for V3; `$eventContext.occurred.Week` does not bind. [probed]
36
40
  32. Concept rules: `min`/`max`/`length ==`, not `length 3 to 10` (PLAY0141). [probed]
@@ -38,7 +42,7 @@ Re-checked against Screenplay v4.66.0 and cli v3.28.2 where marked [probed] or [
38
42
 
39
43
  34. A `from <Event> key <property>` routes only if every such event carries that property: an event that frees or updates a row keyed by another stream's id must carry that id in its payload, or the row never changes. Whether the compiler reports a missing key property is unverified [to probe]; check by hand.
40
44
  35. `description`/`documentation` are authoring metadata: board, MCP and Prologue show them; `cratis render` never does (Stage#178). A rule only in prose is unenforced in rendered code; make it a rule layer, a spec or a recorded target requirement.
41
- 36. Any `system`/`operation`, event source or stream (not admitted by any supported ESM version), and `generated`/`returns` on a compiler before 4.68.0 (including the 4.66.0 in cratis 3.28.x), leaves the whole application without an executable model (PLAY0268), not just the slice: keep them out of executable/renderable scope. Even on 4.68.0 Stage 4.24.2 refuses generated values and responses (ESM v7) whole with `STAGE-ESM-016`; gap-fill.
45
+ 36. One unadmitted construct (operations, exact numbers, refusal/redelivery) blocks whole-model binding. Routing is admitted v8, not one of those constructs; CLI render's v7 boundary is a separate refusal. Do not remove routing or authorization to render a model.
42
46
  37. Personas are not in the ESM (Screenplay#254); specs cannot reference them. Write `given caller` as the roles/claims that stand for the persona.
43
47
  38. A rule that depends on stored state is `reads <View>` + `require <expr> message "..."` (stated intent; PLAY0268/0271 at binding are expected in design mode). The slice `description` must mark it NOT enforced in the model today (Screenplay#129/#209) and name the target: Arc `[ProtectedDecision]` + `DecisionRead<T>` (Arc v22.39.0 and later; not available in a Stage-rendered app on Arc 22.25.0), Chronicle DCB (`concurrency` scope), or a constraint where one fits. Forbidden: caller-supplied copies of state in `require`, boolean attestation inputs (`confirmsX == true`), rules hidden in `handler`/implementation-hint prose. An unguarded materialized read is unsafe for a protected decision.
44
48