@cratis/pi 7.61.0 → 7.63.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 (132) hide show
  1. package/package/corpus/agents/spec-writer.md +2 -2
  2. package/package/corpus/harnesses/copilot/instructions/application-profile.instructions.md +2 -2
  3. package/package/corpus/harnesses/copilot/instructions/glossary.instructions.md +2 -2
  4. package/package/corpus/harnesses/copilot/instructions/specs.scenarios.csharp.instructions.md +7 -4
  5. package/package/corpus/harnesses/copilot/instructions/vertical-slices.instructions.md +22 -13
  6. package/package/corpus/product-sync.json +11 -10
  7. package/package/corpus/prompts/add-business-rule.prompt.md +1 -1
  8. package/package/corpus/rules/application-profile.md +2 -2
  9. package/package/corpus/rules/glossary.md +2 -2
  10. package/package/corpus/rules/specs.scenarios.csharp.md +7 -4
  11. package/package/corpus/rules/vertical-slices.md +22 -13
  12. package/package/corpus/skills/cratis-application-slice-conformance/SKILL.md +1 -1
  13. package/package/corpus/skills/cratis-application-slice-specifications/SKILL.md +4 -3
  14. package/package/corpus/skills/cratis-application-slice-specifications/references/query-and-decision-scenarios.md +12 -3
  15. package/package/corpus/skills/cratis-arc-authentication-authorization-and-identity/SKILL.md +12 -7
  16. package/package/corpus/skills/cratis-arc-authentication-authorization-and-identity/references/authorization.md +11 -11
  17. package/package/corpus/skills/cratis-arc-command/SKILL.md +3 -2
  18. package/package/corpus/skills/cratis-arc-command/references/decisions-and-routing.md +95 -51
  19. package/package/corpus/skills/cratis-arc-command/references/fresh-identifiers.md +5 -2
  20. package/package/corpus/skills/cratis-arc-command/references/generated-values.md +27 -12
  21. package/package/corpus/skills/cratis-arc-command/references/read-model-injection.md +9 -5
  22. package/package/corpus/skills/cratis-arc-command/references/shop-generation.md +17 -6
  23. package/package/corpus/skills/cratis-arc-command-validation/SKILL.md +99 -52
  24. package/package/corpus/skills/cratis-chronicle-decision-reads/SKILL.md +37 -15
  25. package/package/corpus/skills/cratis-chronicle-decision-reads/references/admission-and-ownership.md +3 -2
  26. package/package/corpus/skills/cratis-chronicle-decision-reads/references/choosing-how-a-rule-holds.md +277 -138
  27. package/package/corpus/skills/cratis-chronicle-event-constraints/SKILL.md +4 -4
  28. package/package/corpus/skills/cratis-chronicle-event-modeling/SKILL.md +6 -4
  29. package/package/corpus/skills/cratis-chronicle-read-model/SKILL.md +2 -1
  30. package/package/corpus/skills/cratis-chronicle-reducer/SKILL.md +6 -3
  31. package/package/corpus/skills/cratis-code-review/SKILL.md +6 -3
  32. package/package/corpus/skills/cratis-fundamentals-concept/SKILL.md +10 -2
  33. package/package/corpus/skills/cratis-fundamentals-concept/references/shop-generation.md +49 -6
  34. package/package/corpus/skills/cratis-screenplay-automations-and-translations/SKILL.md +43 -41
  35. package/package/corpus/skills/cratis-screenplay-automations-and-translations/references/cases-to-specify.md +11 -2
  36. package/package/corpus/skills/cratis-screenplay-automations-and-translations/references/integration-interview.md +24 -0
  37. package/package/corpus/skills/cratis-screenplay-automations-and-translations/references/public-events-and-direction.md +76 -10
  38. package/package/corpus/skills/cratis-screenplay-automations-and-translations/references/realization-and-gap-fill.md +5 -0
  39. package/package/corpus/skills/cratis-screenplay-automations-and-translations/references/todo-list-example.md +1 -1
  40. package/package/corpus/skills/cratis-screenplay-automations-and-translations/references/translate-example.md +39 -23
  41. package/package/corpus/skills/cratis-screenplay-automations-and-translations/references/translation-patterns.md +35 -12
  42. package/package/corpus/skills/cratis-screenplay-captures-and-reactions/SKILL.md +51 -81
  43. package/package/corpus/skills/cratis-screenplay-captures-and-reactions/references/atomic-batches-and-source-mappings.md +83 -0
  44. package/package/corpus/skills/cratis-screenplay-captures-and-reactions/references/capture-map-and-example.md +14 -4
  45. package/package/corpus/skills/cratis-screenplay-captures-and-reactions/references/reaction-forms.md +59 -0
  46. package/package/corpus/skills/cratis-screenplay-captures-and-reactions/references/record-capture-specifications.md +60 -0
  47. package/package/corpus/skills/cratis-screenplay-captures-and-reactions/references/specifying-triggers-and-clock.md +5 -1
  48. package/package/corpus/skills/cratis-screenplay-command-surface/SKILL.md +26 -28
  49. package/package/corpus/skills/cratis-screenplay-command-surface/references/described-handlers.md +82 -0
  50. package/package/corpus/skills/cratis-screenplay-command-surface/references/generated-values-and-responses.md +82 -28
  51. package/package/corpus/skills/cratis-screenplay-command-surface/references/protected-reads.md +113 -0
  52. package/package/corpus/skills/cratis-screenplay-command-surface/references/shop-generation.md +45 -12
  53. package/package/corpus/skills/cratis-screenplay-command-surface/references/text-and-match-rules.md +119 -0
  54. package/package/corpus/skills/cratis-screenplay-command-surface/references/validate-rules.md +14 -4
  55. package/package/corpus/skills/cratis-screenplay-command-surface/verification.json +10 -3
  56. package/package/corpus/skills/cratis-screenplay-event-modeling/SKILL.md +12 -12
  57. package/package/corpus/skills/cratis-screenplay-event-modeling/references/parsed-not-runnable.md +5 -3
  58. package/package/corpus/skills/cratis-screenplay-event-modeling/verification.json +5 -1
  59. package/package/corpus/skills/cratis-screenplay-legacy-extraction/SKILL.md +2 -2
  60. package/package/corpus/skills/cratis-screenplay-legacy-extraction/references/evidence-table-template.md +1 -1
  61. package/package/corpus/skills/cratis-screenplay-legacy-extraction/references/generated-recovery.md +51 -14
  62. package/package/corpus/skills/cratis-screenplay-legacy-extraction/references/intent-example.md +5 -0
  63. package/package/corpus/skills/cratis-screenplay-legacy-extraction/references/loss-report-template.md +2 -1
  64. package/package/corpus/skills/cratis-screenplay-legacy-extraction/references/rule-modeling.md +6 -3
  65. package/package/corpus/skills/cratis-screenplay-legacy-extraction/references/signal-to-intent.md +1 -1
  66. package/package/corpus/skills/cratis-screenplay-model-authoring/SKILL.md +22 -28
  67. package/package/corpus/skills/cratis-screenplay-model-authoring/references/choosing-generation.md +20 -7
  68. package/package/corpus/skills/cratis-screenplay-model-authoring/references/language-reference.md +12 -6
  69. package/package/corpus/skills/cratis-screenplay-model-authoring/references/mcp-loop.md +9 -1
  70. package/package/corpus/skills/cratis-screenplay-model-authoring/references/mcp-tools.md +58 -10
  71. package/package/corpus/skills/cratis-screenplay-model-authoring/verification.json +4 -2
  72. package/package/corpus/skills/cratis-screenplay-model-review/SKILL.md +2 -5
  73. package/package/corpus/skills/cratis-screenplay-model-review/references/anti-patterns.md +2 -2
  74. package/package/corpus/skills/cratis-screenplay-model-review/references/checklist.md +2 -2
  75. package/package/corpus/skills/cratis-screenplay-model-review/references/quick-self-check.md +2 -1
  76. package/package/corpus/skills/cratis-screenplay-model-review/references/review-questions.md +3 -2
  77. package/package/corpus/skills/cratis-screenplay-modeling-lifecycle/references/principles.md +1 -1
  78. package/package/corpus/skills/cratis-screenplay-modeling-lifecycle/references/vocabulary-map.md +1 -1
  79. package/package/corpus/skills/cratis-screenplay-read-surface/SKILL.md +2 -3
  80. package/package/corpus/skills/cratis-screenplay-read-surface/references/named-keys.md +3 -1
  81. package/package/corpus/skills/cratis-screenplay-render-and-gap-fill/SKILL.md +8 -3
  82. package/package/corpus/skills/cratis-screenplay-render-and-gap-fill/references/gap-fill-handoff.md +8 -0
  83. package/package/corpus/skills/cratis-screenplay-render-and-gap-fill/references/renderability-gate.md +6 -4
  84. package/package/corpus/skills/cratis-screenplay-scenario-coverage/SKILL.md +36 -29
  85. package/package/corpus/skills/cratis-screenplay-scenario-coverage/references/berth-reservations.md +6 -0
  86. package/package/corpus/skills/cratis-screenplay-scenario-coverage/references/invoicing-dues-design.md +15 -4
  87. package/package/corpus/skills/cratis-screenplay-scenario-coverage/references/invoicing-dues-example.md +25 -20
  88. package/package/corpus/skills/cratis-screenplay-scenario-coverage/references/public-event-coverage.md +14 -3
  89. package/package/corpus/skills/cratis-screenplay-scenario-coverage/references/scenario-examples.md +9 -3
  90. package/package/corpus/skills/cratis-screenplay-scenario-coverage/references/spec-forms-by-mode.md +7 -3
  91. package/package/corpus/skills/cratis-screenplay-slice-design/SKILL.md +3 -1
  92. package/package/corpus/skills/cratis-screenplay-slice-design/references/command-inventory.md +4 -4
  93. package/package/corpus/skills/cratis-screenplay-slice-design/references/rule-layers.md +4 -2
  94. package/package/corpus/skills/cratis-screenplay-slice-design/references/slicing.md +4 -3
  95. package/package/corpus/skills/cratis-screenplay-slice-design/references/worked-example.md +8 -8
  96. package/package/corpus/skills/cratis-screenplay-specifications/SKILL.md +49 -47
  97. package/package/corpus/skills/cratis-screenplay-specifications/references/actions-beyond-commands.md +11 -1
  98. package/package/corpus/skills/cratis-screenplay-specifications/references/generated-fixtures.md +48 -17
  99. package/package/corpus/skills/cratis-screenplay-specifications/references/vocabulary.md +14 -1
  100. package/package/corpus/skills/cratis-screenplay-streams-and-consistency/SKILL.md +25 -21
  101. package/package/corpus/skills/cratis-screenplay-streams-and-consistency/references/boundaries.md +2 -2
  102. package/package/corpus/skills/cratis-screenplay-streams-and-consistency/references/consistency-and-concurrency.md +14 -6
  103. package/package/corpus/skills/cratis-screenplay-streams-and-consistency/references/multi-service-models.md +4 -3
  104. package/package/corpus/skills/cratis-screenplay-streams-and-consistency/references/streams-example.md +7 -0
  105. package/package/corpus/skills/cratis-screenplay-toolchain/SKILL.md +30 -22
  106. package/package/corpus/skills/cratis-screenplay-toolchain/references/cheat-sheet-example.md +3 -1
  107. package/package/corpus/skills/cratis-screenplay-toolchain/references/cheat-sheet.md +47 -2
  108. package/package/corpus/skills/cratis-screenplay-toolchain/references/diagnostic-arguments.md +60 -0
  109. package/package/corpus/skills/cratis-screenplay-toolchain/references/diagnostics.md +65 -5
  110. package/package/corpus/skills/cratis-screenplay-toolchain/references/executable-subset.md +50 -22
  111. package/package/corpus/skills/cratis-screenplay-toolchain/references/generation-checks.md +93 -0
  112. package/package/corpus/skills/cratis-screenplay-toolchain/references/generation-strategies-example.md +117 -35
  113. package/package/corpus/skills/cratis-screenplay-toolchain/references/language-admission.md +46 -0
  114. package/package/corpus/skills/cratis-screenplay-toolchain/references/preferred-syntax.md +3 -1
  115. package/package/corpus/skills/cratis-screenplay-toolchain/references/renderable-subset.md +25 -10
  116. package/package/corpus/skills/cratis-screenplay-toolchain/references/screenplay-contract.json +1800 -50
  117. package/package/corpus/skills/cratis-screenplay-toolchain/references/screenplay-contract.version +1 -1
  118. package/package/corpus/skills/cratis-screenplay-toolchain/references/traps.md +5 -3
  119. package/package/corpus/skills/cratis-screenplay-toolchain/verification.json +6 -1
  120. package/package/corpus/skills/cratis-screenplay-ui-composition/SKILL.md +8 -53
  121. package/package/corpus/skills/cratis-screenplay-ui-composition/references/file-references.md +2 -2
  122. package/package/corpus/skills/cratis-screenplay-ui-composition/references/interaction-example.md +54 -0
  123. package/package/corpus/skills/cratis-screenplay-ui-composition/verification.json +6 -3
  124. package/package/corpus/skills/cratis-specifications-csharp/SKILL.md +3 -2
  125. package/package/corpus/skills/cratis-specifications-csharp/references/application-scenarios.md +1 -1
  126. package/package/corpus/skills/cratis-stage-rendering-and-sandbox/SKILL.md +30 -29
  127. package/package/corpus/skills/cratis-stage-rendering-and-sandbox/references/admission.md +36 -9
  128. package/package/corpus/skills/cratis-stage-rendering-and-sandbox/references/choosing-generation.md +28 -8
  129. package/package/corpus/skills/cratis-stage-rendering-and-sandbox/references/publication-and-recovery.md +31 -0
  130. package/package/corpus/skills/cratis-stage-rendering-and-sandbox/references/sandbox-and-specrunner.md +8 -0
  131. package/package/corpus/skills/cratis-stage-rendering-and-sandbox/verification.json +4 -1
  132. package/package.json +1 -1
@@ -57,8 +57,8 @@ observed legacy check from verified atomic protection.
57
57
  | several command properties / constants | `require` | runs after property rules, before production |
58
58
  | a value across all sources | `unique <prop> on <Event>` | value owned by one source; same source may re-claim |
59
59
  | a fact at most once per source; mutually exclusive facts | `unique event` (+ `released by`) | covers simple lifecycle transitions |
60
- | state-dependent rule not reducible to the supported uniqueness/release semantics (a balance, capacity, "only if approved") | no protected decision read in `.play` today | state it as `reads` + `require … message`, mark NOT enforced, name the target enforcement (below) |
61
- | a view (read model) | an unguarded materialized read is not protection | views lag; `reads` is PLAY0271, `require` over views PLAY0268 at binding (expected in design mode) |
60
+ | state-dependent rule (balance, capacity, "only if approved") | eligible `reads` + `require` under `command reads protected` (v25) | required absence rejects; matching intervening facts conflict. Payload-key fan-in, joins, reducers and other refused shapes remain target gaps |
61
+ | a view (read model) | unguarded materialized reads are not protection | legacy command and trigger reads remain unprotected; Stage refuses protected reads (STAGE-ESM-044), so reference protection is not target realization |
62
62
 
63
63
  ## 3. Record each state-dependent rule that the model cannot enforce
64
64
  Never accept the caller's copy of the state: `currentStatus Status` on the command with
@@ -67,7 +67,13 @@ input (`confirmsX == true`) standing in for the rule. Never move the rule into `
67
67
  `implementation hint` prose; a description renders only as an XML doc comment (Stage#178), so prose alone leaves
68
68
  the rule unenforced in rendered scope.
69
69
 
70
- Right: write the rule as stated intent and mark it unenforced.
70
+ First inspect [protected reads](../../cratis-screenplay-command-surface/references/protected-reads.md):
71
+ opt eligible command reads into v25, retain absence/conflict specifications and verify
72
+ target consistency separately. Stage admits v25 but refuses protected reads (STAGE-ESM-044). A payload-keyed
73
+ fan-in such as the course-capacity example remains refused; the preamble is not a
74
+ blanket admission of arbitrary projections.
75
+
76
+ For legacy models without opt-in or refused shapes, write stated intent and mark it unenforced.
71
77
  - `reads <View> as x by …` plus `require <expr over x> message "…"` on the command (the
72
78
  `StateChange` slice in `streams-example.md`). Binding reports PLAY0271 / PLAY0268; that is
73
79
  expected in design mode, so keep the lines. Do not remove them to pass a tool.
@@ -101,9 +107,11 @@ another event source) in `Provide()`/`Handle()` and returning a validation resul
101
107
  at commit is reported as a concurrency violation. Equivalently a Chronicle decision-consistency
102
108
  read with a `concurrency` scope on the event source or stream. A passive read is fresh
103
109
  computation, not an atomic read-and-append; a plain materialized view and a validator are
104
- advisory. Protection covers only a single projection keyed directly by the event source id (routing key
105
- empty or `$eventSourceId`). Reducers, joins, children, nested sources and **event-property
106
- routing** (fan-in from many streams by a payload reference) are refused, and a concurrency scope
110
+ advisory under Arc read protection `Off` (the default); under `On` (Arc 22.106.0 or later) the read
111
+ model parameters of `Handle()` and of a validator constructor are guarded. Protection covers a single
112
+ projection keyed directly by the event source id (routing key empty or `$eventSourceId`) and an
113
+ unfiltered reducer without constructor dependencies. Filtered reducers, reducers with dependencies,
114
+ joins, children, nested sources and **event-property routing** (fan-in from many streams by a payload reference) are refused, and a concurrency scope
107
115
  on the referenced source does not see appends made on other sources. A rule over such a view, for
108
116
  example a course capacity computed from enrolment streams, needs option a or b: write the
109
117
  deciding fact on the source that owns the state, or give each scarce item its own identity. Sources: Arc `Documentation/backend/csharp/chronicle/read-models/injecting-into-commands.md` (limits unchanged);
@@ -115,9 +115,10 @@ module Billing
115
115
  another reason each service has its own folder.
116
116
  - A capture keys on the incoming content, so the contract carries the identity
117
117
  the consumer keys on.
118
- - The producer's publication specification runs in the reference evaluator; the
119
- consumer's capture over events binds but evaluates as typed Unsupported. Specify
120
- the consumer's private behavior downstream of the capture.
118
+ - Both sides run in the reference evaluator: the producer's publication
119
+ specification, and the consumer's capture over events, which a specification
120
+ drives by presenting the consumed public event (`when append <Event>`;
121
+ Requires Screenplay 4.171.0).
121
122
  - Syntax, publication semantics and the full rules: read
122
123
  `cratis-screenplay-automations-and-translations`
123
124
  `references/public-events-and-direction.md`.
@@ -1,5 +1,12 @@
1
1
  # Example: streams, constraints and a recorded rule
2
2
 
3
+ Legacy control: no `command reads protected` preamble is declared. The course-capacity
4
+ payload-key fan-in remains refused even with opt-in; eligible active-enrolment reads
5
+ can protect under v25, but reads plus concurrency cannot combine (PLAY0783). Read
6
+ [protected reads](../../cratis-screenplay-command-surface/references/protected-reads.md)
7
+ for admission and Stage's protected-read refusal (STAGE-ESM-044). The legacy diagnostics below describe this
8
+ control, not a blanket refusal of command reads.
9
+
3
10
  A complete design-mode model for course enrolment. It shows one business identity per stream,
4
11
  cross-stream references as payload, three kinds of uniqueness constraint, a state-dependent
5
12
  rule recorded as **NOT enforced in the model today**, a declared `concurrency` scope, and an
@@ -8,12 +8,9 @@ license: MIT
8
8
 
9
9
  Read [preferred syntax](references/preferred-syntax.md) when writing or reviewing `.play`.
10
10
 
11
- Which tool to run, what its result means, and what each tool can and cannot admit. This
12
- skill answers "does it compile, bind, render, and which compiler said so". The method
13
- (what to model, in which order, with which gates) lives in
14
- `cratis-screenplay-modeling-lifecycle`; construct syntax lives in the construct skills
15
- (`cratis-screenplay-command-surface`, `-projections`, `-read-surface`,
16
- `-captures-and-reactions`, `-specifications`, `-ui-composition`).
11
+ This skill owns tool selection, verdict meaning and admission. Modeling method
12
+ lives in `cratis-screenplay-modeling-lifecycle`; construct syntax lives in command,
13
+ projection, read-surface, capture/reaction, specification and UI skills.
17
14
 
18
15
  ## Locate the model
19
16
 
@@ -28,7 +25,11 @@ bundled in the CLI are different releases, and the bundled one can be older; a c
28
25
  standalone tool binds may be refused or unrendered through the CLI. Capabilities that need a
29
26
  minimum release carry a one-line `Requires ...` note in the reference that teaches them.
30
27
 
31
- For exact diagnostic codes, MCP names/parameters and standalone CLI options, search the large published [references/screenplay-contract.json](references/screenplay-contract.json), named by [references/screenplay-contract.version](references/screenplay-contract.version), rather than loading it in full. Locate a diagnostic by its exact `code` (for example `"code": "PLAY0029"`), a tool by its exact `name` (for example `"name": "read-workspace"`), or a command in `cliCommands`; read the matched object for retirement, parameters or options. [references/screenplay-contract-exceptions.json](references/screenplay-contract-exceptions.json) records reasoned exceptions for superseded statements; it does not change the current contract.
28
+ Search [screenplay-contract.json](references/screenplay-contract.json), not its
29
+ whole contents, for exact diagnostic `code`, tool `name` or `cliCommands` options.
30
+ Its version is [screenplay-contract.version](references/screenplay-contract.version).
31
+ Read [contract exceptions](references/screenplay-contract-exceptions.json) when a
32
+ superseded statement needs context; exceptions do not change the contract.
32
33
 
33
34
  ## Ground rules
34
35
 
@@ -101,8 +102,11 @@ changes with the root folder name.
101
102
  lists and lists narrowed by one `by` key (observable too) bind; caller-supplied equality
102
103
  filters on collections bind as ESM v14. Context `from`, single-result
103
104
  filters, opaque `scoped to`/`performer` and composite `by` remain PLAY0268. Read
104
- read-surface [equality filters](../cratis-screenplay-read-surface/references/equality-filters.md). No handler (PLAY0268, with or without `implementation`/`hint`); `reads` and
105
- `concurrency` do not bind (PLAY0271); concept compliance binds as v13 (precise refusals: command-surface `references/compliance.md`);
105
+ read-surface [equality filters](../cratis-screenplay-read-surface/references/equality-filters.md).
106
+ Pending handlers beside unconditional productions bind as described commands (v23),
107
+ but reached bodies are Unsupported; attached handlers remain PLAY0268.
108
+ Eligible protected reads opt into v25; legacy reads and `concurrency` retain PLAY0271.
109
+ Concept compliance binds as v13 (precise refusals: command-surface `references/compliance.md`);
106
110
  generated values and `returns` responses bind (ESM v7, `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
111
  - **Renderable** (V5): `references/renderable-subset.md` has the admission table. The CLI admits through
108
112
  its newest known ESM version to construct checks; supported UUID/String
@@ -119,18 +123,22 @@ changes with the root folder name.
119
123
  Composite view keys remain authoring-only (PLAY0268), while one explicit
120
124
  `key` binds. Read `references/production-routes-and-filters.md` and read-surface
121
125
  `references/named-keys.md`.
122
- - **Enum numbers (v12):** non-positional enum numbers bind; canonical
123
- `numbers` parallels `values`. Positional pins preserve earlier executable
124
- bytes/version. Specifications still use names. Stage admits v12 and emits `Member = N`. Syntax:
125
- command-surface `references/enum-numbers.md`; errors PLAY0667–0670 and opt-in
126
- `enum-pinning` hint PLAY0671: `references/diagnostics.md`.
127
- - **Concept strategies (v15):** concept strategies and Guarded freshness; strict fixture shapes,
128
- no silent retry. Read [references/generation-strategies-example.md](references/generation-strategies-example.md)
129
- and command-surface `references/generated-values-and-responses.md` for supported strategies/refusals.
130
- - **v17–v20:** recovery/no-event assertions (v17), query Validation errors (v18),
131
- invocation refusal branches (v19), generated-concept rules (v20). Read
132
- `references/executable-subset.md` when choosing a version; specifications and
133
- command-surface references own examples. Newer binding is not render admission.
126
+ - **Enum numbers (v12):** read command-surface `references/enum-numbers.md` for
127
+ pins, stored numbers and Stage output; `references/diagnostics.md` owns PLAY0667–0671.
128
+ - **Concept strategies (v15):** read
129
+ [generation strategies](references/generation-strategies-example.md) for Guarded
130
+ freshness and strict fixtures, and command-surface
131
+ `references/generated-values-and-responses.md` for strategy/refusal depth.
132
+ - **v17–v21:** recovery/no-events (v17), query Validation errors (v18), refusal
133
+ branches (v19), generated-concept proofs (v20), pattern/random/rule/checksum (v21).
134
+ Read `references/executable-subset.md` for version prerequisites and
135
+ `references/diagnostics.md` for proof/support failures. Binding is not rendering.
136
+ Tool/renderer authors: read [references/generation-checks.md](references/generation-checks.md)
137
+ when discovering strategy options, checking one concept or value, or consuming rule proofs.
138
+ - **v22–v25:** read [language admission](references/language-admission.md) for atomic
139
+ batches, described handlers, text rules, protected reads and Stage refusals.
140
+ Read [diagnostic arguments](references/diagnostic-arguments.md) for MCP/JSON subjects:
141
+ code and typed arguments, never message parsing.
134
142
  - **Caller/compliance metadata:** `$identity` aliases caller built-ins;
135
143
  additional identity details are metadata and executable reads still refuse.
136
144
  Bare `pii`/`secret` replace legacy spellings; `pii personal` repeats one marker
@@ -186,7 +194,7 @@ Read [references/diagnostics.md](references/diagnostics.md) when a PLAY, STAGE o
186
194
  11. Declare an event once, in its producing slice.
187
195
  12. Quoted `import "glob"` is your own files; unquoted `import Ctx.Event` is a foreign
188
196
  contract and does not bind.
189
- 13. A handler never binds; `numbers exact` never binds; descriptions render only as XML doc comments, never as behavior.
197
+ 13. Pending described handlers bind but do not execute their bodies; attached handlers and `numbers exact` do not bind. Descriptions render as XML doc comments, not behavior.
190
198
 
191
199
  ## Gate
192
200
 
@@ -2,7 +2,9 @@
2
2
 
3
3
  One complete document with every construct family. Design mode, not executable. Prose rules: [cheat-sheet.md](cheat-sheet.md); what binds: [executable-subset.md](executable-subset.md).
4
4
 
5
- Binding blockers: unquoted import, `reads` (PLAY0271), `starts with`. Caller-supplied collection equality filters bind as ESM v14; context and single-result filters remain blocked. Executable shapes are in the sibling examples. `RecordingAPayment` lists the `InvoiceClosed` cascade; an older bundled compiler rejected it with a false PLAY0285 ("outcome cannot be produced by 'RecordPayment'").
5
+ Binding blockers in this legacy control without protected-read opt-in: unquoted
6
+ import, legacy `reads` (PLAY0271), condition-only `starts with` (PLAY0268).
7
+ Property/concept text rules bind v24; eligible protected reads bind v25. Caller-supplied collection equality filters bind as ESM v14; context and single-result filters remain blocked. Executable shapes are in the sibling examples. `RecordingAPayment` lists the `InvoiceClosed` cascade; an older bundled compiler rejected it with a false PLAY0285 ("outcome cannot be produced by 'RecordPayment'").
6
8
 
7
9
  Concept compliance itself binds as ESM v13; reasons remain report-only PLAY0270. Stage renders v13 concept
8
10
  protection. Binder-only PLAY0268 refusals and subject-lineage limits: command-surface `references/compliance.md`.
@@ -10,11 +10,23 @@
10
10
  - `$context.` paths (command `produces`)
11
11
  - `$eventContext.` (projections)
12
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
+ - Generated values and proofs
13
14
  - Specification forms
14
15
 
15
16
  Released boundary forms: `public event X`, `event X from "store"`, Translate
16
17
  `direction inbound|outbound`, event-target `projection/reducer P => PublicEvent`,
17
- and capture `source events` with `from ForeignEvent` select v9. Read
18
+ and capture `source events` with `from ForeignEvent` select v9.
19
+ For event captures, present `given <FromEvent>` / `when append <FromEvent>`, not
20
+ capture records (PLAY0701). The key must be required on every `from` event, never
21
+ a context key (PLAY0700). PLAY0701 repairs only an unambiguous single-`from` capture;
22
+ PLAY0700 has no automatic repair.
23
+ Requires Screenplay 4.171.0 or later (`screenplay --version`); older runners do not
24
+ deliver these events to captures.
25
+ A directionless Translate reacting without a `from` route to its own capture's
26
+ append warns PLAY0694 (fails `--warnaserror`): move the reaction to Automation,
27
+ keeping the capture in Translate. No automatic split.
28
+ Requires Screenplay 4.176.0 or later; older compilers leave that shape unchecked.
29
+ Read
18
30
  [public contracts](../../cratis-screenplay-automations-and-translations/references/public-events-and-direction.md).
19
31
  View properties use trailing `key`; multipart `by` query/read blocks remain
20
32
  PLAY0268, not v10. Read [named keys](../../cratis-screenplay-read-surface/references/named-keys.md).
@@ -71,9 +83,14 @@ remain unadmitted. Compile and test each relevant fixture with the chosen tool.
71
83
  require that position. Source preambles precede declarations.
72
84
  - Strings: `"..."`, escapes `\" \\ \n \r \t`; other backslashes kept (regex `"^INV-\d{6}$"` works).
73
85
  - Structured values: single-line JSON, quoted keys (`[{"sku": "A-1", "quantity": 2}]`).
86
+ - Literal property/concept text rules use `contains`, `not contains`, `starts with`,
87
+ `ends with` with quoted operands (v24, ordinal UTF-16). Portable `matches` refuses
88
+ nonportable constructs with PLAY0699; exact Studio patterns warn PLAY0787.
89
+ Read command-surface [text and match rules](../../cratis-screenplay-command-surface/references/text-and-match-rules.md).
74
90
  - One condition grammar (policy `require`, `produces when`, `require`, reaction `where`): `and`
75
91
  binds tighter than `or`; operators `== != > >= < <= contains`, `starts with`; claims use
76
- `claim "x" matches "v"` (not `==`: PLAY0120).
92
+ `claim "x" matches "v"` (not `==`: PLAY0120). Text operators here are condition-only
93
+ authoring syntax (PLAY0268 at binding), not the admitted property text rules.
77
94
  - Keyword escape `@name` for properties named `tag`, `authorize`, `produces`, `reads`, `file`,
78
95
  `validate` (enum value), `sequence`, `occurred`, `causedBy`, `namespace`, `correlation`,
79
96
  `causation`, and projection `key`/`parent`/`with`.
@@ -153,6 +170,34 @@ collections (path below them: PLAY0297 E). Unknown member: PLAY0295/0296 W.
153
170
  - One `every`/`all` block per level for the executable model (else PLAY0268).
154
171
  - Templates (`` `${a}` ``) and `$causedBy` parse but do not bind (PLAY0268).
155
172
 
173
+ ## Generated values and proofs
174
+
175
+ Choose readable invoice/order references with `generate pattern "INV-{yyyy}{MM}-#{7}" checksum luhn`
176
+ on a String concept and author `validate checksum luhn` separately. `#`, `?`, `*`
177
+ mean digit, uppercase letter, letter-or-digit; ASCII classes and repeats up to
178
+ 64 are finite. UTC segments are `{yyyy}`, `{yy}`, `{MM}`, `{dd}`. Int
179
+ `generate random 100000..999999` is inclusive; `generate rule Name` attaches one
180
+ file/tagged fence with Now/Tenant context and unknown entropy. These are ESM v21.
181
+ Requires Screenplay 4.172.0 (`screenplay --version`) for these constructs; older compilers report PLAY0268.
182
+ Sequence and generated secrets remain refused.
183
+
184
+ Generated-concept rules select v20 (older compilers refuse them with PLAY0268): Proven silent, Refuted PLAY0688 plus witness, Unproven PLAY0689
185
+ plus reason. Finite support exhaustion is PLAY0691, empty support on a scanned
186
+ date PLAY0692, not a proof warning. MCP rules[]/derivedPattern support typed
187
+ matches/PLAY0688 repair proposals.
188
+ Requires Screenplay 4.173.0 for those MCP fields; older servers omit them.
189
+ See [generation example](generation-strategies-example.md).
190
+
191
+ Pin whole identifiers with `for`, other values with named `generated`; pins obey
192
+ shape and rules. `given clock` fixes all UTC pattern date segments, not randomness;
193
+ without it only digit widths are checked. Patterns are not gapless sequences or
194
+ secrets; check digits catch typos, not forgery. Short payload codes need uniqueness,
195
+ generated source destinations need freshness. Read
196
+ [Stage admission](../../cratis-stage-rendering-and-sandbox/references/admission.md)
197
+ for v21 admission, all-Proven unpinned specs and the separate prerequisites for
198
+ warning/info rules, checksum validation and pattern/random rendering.
199
+ `generate rule` remains STAGE-ESM-028. Reference binding is not rendering.
200
+
156
201
  ## Specification forms
157
202
  Full list with semantics: `Documentation/screenplay/specifications.md`. Compiled in the
158
203
  examples: `given caller` (+`authenticated`, `role`), `given clock`, `given <Event> for`,
@@ -0,0 +1,60 @@
1
+ <!-- Copyright (c) Cratis. All rights reserved. -->
2
+ <!-- Licensed under the MIT license. See LICENSE file in the project root for full license information. -->
3
+
4
+ # Read diagnostic subjects from arguments
5
+
6
+ Requires Screenplay 4.194.0 or later (`screenplay --version`) for typed diagnostic arguments; older diagnostics may omit the field.
7
+
8
+ Use code plus declared `arguments` to identify subjects, never parse message text.
9
+ Messages are display prose and may be reworded. Published names, kinds, meanings
10
+ and optionality are permanent; tolerate unknown names and keyword values.
11
+ Missing `arguments` remains readable; no subjects is `{}`; optional subjects are
12
+ omitted when unavailable. This changes neither text output nor ESM version.
13
+
14
+ The `screenplay` MCP server's `diagnostics`, `read-workspace` executable diagnostics,
15
+ proposal `diagnostics` and `introducedExecutableErrors[].arguments`, plus the CLI's
16
+ JSON output, expose the same structure. Resolve the harness-native tool name from
17
+ the listing; this is not a new diagnostic tool. C# exposes Diagnostic.Arguments.
18
+
19
+ ```json
20
+ {
21
+ "specification": { "kind": "specification", "path": ["Billing", "Invoices", "SendReminder", "Overdue"] },
22
+ "step": { "kind": "keyword", "value": "when" },
23
+ "stepIndex": { "kind": "index", "value": 0 },
24
+ "property": { "kind": "text", "value": "amount" }
25
+ }
26
+ ```
27
+
28
+ Each argument is keyed by name. `text` is verbatim authored text, `keyword` a stable
29
+ never-localized language spelling, `index` a zero-based number. A declaration uses
30
+ its declaration kind as `kind` (for example `specification`) and `path`, not a
31
+ `value`: module if present, features outermost first, slice if present, declaration
32
+ name; never repeat a slice's own name. Specification names are authored names;
33
+ a separate `case` names an expansion. Argument order is immaterial.
34
+
35
+ ## Codes with declared subjects
36
+
37
+ `?` denotes optional. Except where marked, arguments are text.
38
+
39
+ | Code | Arguments |
40
+ | --- | --- |
41
+ | PLAY0044, PLAY0075, PLAY0101, PLAY0518 | `text` |
42
+ | PLAY0351 | `readmodel`, `property` |
43
+ | PLAY0468 | `query?`, `argument` |
44
+ | PLAY0514, PLAY0519 | `property` |
45
+ | PLAY0520 | `example`, `type?`, `kind?` (keyword: event, command, readmodel, concept, type, example) |
46
+ | PLAY0521 | `example` |
47
+ | PLAY0522 | `example`, `kind`, `expectedKind` (both keyword: event, command, readmodel) |
48
+ | PLAY0523 | `example`, `type`, `property?` |
49
+ | PLAY0524 | `specification` (declaration), `step` (keyword), `stepIndex` (index), `property`, `type`, `example?`, `case?`, `parameter?` |
50
+ | PLAY0525, PLAY0526 | `example` |
51
+ | PLAY0583 | `case?`, `parameter?`, `type?`, `text?` |
52
+
53
+ For PLAY0524, `step` is given, given readmodel, when, when append or then.
54
+ `stepIndex` counts every authored given/when/then clause once across all forms,
55
+ not nested lines, synthesized callers or defaults. Example/case expansion retains
56
+ that position. Read the missing property and its type directly, navigate the
57
+ specification path and optional case, then repair the effective fixture; do not
58
+ infer these from a translated message. Codes outside this table may have no
59
+ subjects, including PLAY0198. Check the published contract for the code rather
60
+ than assuming every diagnostic names a declaration.
@@ -14,6 +14,7 @@
14
14
  - Structural completeness and timeline checks
15
15
  - Editor versus C# verdicts
16
16
  - Consistency errors (V1: the model contradicts itself)
17
+ - Batches, described handlers, text rules and protected reads
17
18
  - Binding (V2 and V3) - see `executable-subset.md` for the full table
18
19
  - Frequent errors
19
20
  - Render admission (V5): `STAGE-*`, `CLI-RENDER-*`, `STAGE-CRATIS-*`
@@ -55,7 +56,7 @@ Legacy compliance spellings (`@pii`/`@sensitive`) do not evade PLAY0515.
55
56
 
56
57
  ## Public events and translation direction
57
58
 
58
- All are errors. These constructs bind as ESM v9, except public/foreign imports without local shapes (PLAY0268).
59
+ PLAY0607–0620 are errors. These constructs bind as ESM v9, except public/foreign imports without local shapes (PLAY0268).
59
60
 
60
61
  | Code | Meaning / fix |
61
62
  | --- | --- |
@@ -80,6 +81,18 @@ or non-Translate direction. Repair discovery uses `repair-capabilities`, workspa
80
81
  `repairs`, then revision-checked `propose-repair`; do not guess a direction.
81
82
  See automations-and-translations `references/public-events-and-direction.md`.
82
83
 
84
+ | Code | Severity | Meaning / fix |
85
+ | --- | --- | --- |
86
+ | PLAY0694 | W | An unrouted reaction in a directionless Translate consumes an event its own capture appends (root, children or nested). Keep the capture here and move the reaction to a separate Automation slice with its specs. No automatic repair; `--warnaserror` fails. Other slices' captures and reactions with a `from` route do not trigger this check; explicit inbound local-event consumption is PLAY0616. |
87
+ | PLAY0700 | E | Event-capture `key` is not required on every `from` event, or uses a `$` context key. Choose a required content property or deliberately change the source contracts; no repair. |
88
+ | PLAY0701 | E | `given capture` / `when capture` names a capture over events. Present `given <FromEvent>` / `when append <FromEvent>`. A compiler-authored repair exists only for exactly one `from` event; several are ambiguous. Review the specification repair individually; no fix-all or pinned evidence. |
89
+
90
+ Requires Screenplay 4.171.0 or later (`screenplay --version`) for PLAY0700/0701
91
+ and event delivery to captures; older runners do not execute that delivery.
92
+ Requires Screenplay 4.176.0 or later for PLAY0694; older compilers leave the
93
+ legacy directionless co-location unchecked. Full capture execution and ordering:
94
+ automations-and-translations `references/public-events-and-direction.md`.
95
+
83
96
  ## Explicit enum member numbers
84
97
 
85
98
  Source errors; the pins bind as ESM v12:
@@ -290,12 +303,43 @@ or V4 execution. Run the CLI or MCP for those verdicts.
290
303
  | PLAY0287 | producer/capture/spec assigns a field the event lacks |
291
304
  | PLAY0291-0294 | bad single-line JSON / unknown key / wrong shape / duplicate key |
292
305
 
306
+ ## Batches, described handlers, text rules and protected reads
307
+
308
+ Use code and typed subjects from [diagnostic arguments](diagnostic-arguments.md), not
309
+ message parsing, for codes that declare arguments. Other messages still explain
310
+ refusal reasons. Read [language admission](language-admission.md) before changing modes.
311
+
312
+ | Code | Meaning / fix |
313
+ | --- | --- |
314
+ | PLAY0693 | Duplicate/conflicting/invalid atomic batch declaration; keep one application-root declaration, do not remove intended atomicity |
315
+ | PLAY0695 (I) | Described handler admitted; a target must supply its payload body |
316
+ | PLAY0696 | Pending handler without productions, including response-only; declare unconditional productions |
317
+ | PLAY0697 | Conditional productions under pending intent; result v1 needs unconditional events |
318
+ | PLAY0698 | Pending intent plus another handler; retain one |
319
+ | PLAY0699 | Pattern outside portable dialect or over 1,000 UTF-16 units / 3,000 expanded nodes; rewrite the refused construct |
320
+ | PLAY0780 | Invalid placement/repetition of `command reads protected`; declare once at root |
321
+ | PLAY0781 | Protected read shape/key refused; inspect the closed reason, never downgrade to an unguarded read |
322
+ | PLAY0782 | Omitted `by` without command identifier; declare the lookup input |
323
+ | PLAY0783 | Command combines reads and concurrency; choose the intended boundary |
324
+ | PLAY0784 | Unknown read/property path; reference a declared read or alias |
325
+ | PLAY0785 | Ambiguous view path; use distinct aliases on repeated reads |
326
+ | PLAY0786 (I) | Eligible legacy model; preview typed preamble repair, individually review absence/conflict semantics |
327
+ | PLAY0787 (W) | Exact deprecated Studio text-rule pattern; repair to literal rule or equality, preserving message/severity |
328
+ | STAGE-ESM-043 | Atomic mode not realized, even in admitted v23–v25; retain declaration and gap-fill |
329
+ | STAGE-ESM-044 | Protected reads not realized despite v25 version admission; keep protection and gap-fill |
330
+ | STAGE-IMPL-002 | Described handler body not realized by Stage, even Stub mode; no stubs emitted |
331
+
332
+ Invalid match syntax remains PLAY0367. Property/concept text rules bind v24;
333
+ `contains`/`starts with` in conditions only still fail PLAY0268. Stage rejects
334
+ v22/v26 and mixed pairs with STAGE-ESM-016; v23–v25 admission does not implement
335
+ bodies, batches or protected reads (STAGE-ESM-044).
336
+
293
337
  ## Binding (V2 and V3) - see `executable-subset.md` for the full table
294
338
  | Code | Meaning | Fix |
295
339
  |---|---|---|
296
- | PLAY0268 | construct the ESM cannot represent; read the message for the construct (`executable-subset.md` lists the common ones: handler, list or observable query, `pii`, `produces when` over read models, v6 constructs on an older bundled compiler) | stay in design mode, or change the construct if the domain allows; never strip `pii`/authorization |
340
+ | PLAY0268 | construct the ESM cannot represent; read the message for the construct (`executable-subset.md` lists attached handlers, unsupported query shapes, protected enum/identity concepts, read paths without opt-in or in conditions, and older bundled-compiler limits) | stay in design mode, or change the construct if the domain allows; never strip `pii`/authorization |
297
341
  | PLAY0269 / 0270 | UI deferred / authoring metadata (I) | none |
298
- | PLAY0271 | legacy `reads` or a `concurrency` block keeps its legacy meaning and cannot bind (error) | design gap; a constraint for uniqueness; protected decisions are a target requirement |
342
+ | PLAY0271 | legacy `reads` or a `concurrency` block keeps its legacy meaning and cannot bind (error) | opt eligible command reads into v25 with reviewed preamble repair; `concurrency` remains unbound; uniqueness uses a constraint, target realization stays separate |
299
343
  | PLAY0273 | incoherent: ambiguous `for`, property not on event revision, operand type mismatch, derived `$eventContext` path | fix the reference |
300
344
  | PLAY0350 | `null` in command/event value | Chronicle semantics (nullable event properties are CHR0012; an optional fact is a separate event), not only a binder limitation: specs cannot state an absent command/event value. Omit the value or record a capability gap; whether the optional detail is really a separate fact is a review question, not this code's fix |
301
345
  | PLAY0351 | given/then readmodel lacks the key property | add the keyed query's `by` property |
@@ -336,10 +380,26 @@ or V4 execution. Run the CLI or MCP for those verdicts.
336
380
  | PLAY0683/0684 | PLAY0683: generated non-identifier below 64 random bits warns (a single-property unique constraint suppresses it); PLAY0684: generated identifier below 64 random bits is an error |
337
381
  | PLAY0687 | capture `source events` spans multiple origins; split into one capture per origin (event store) |
338
382
  | PLAY0688 | generated strategy refutes a concept rule; read its violating example, align the rule/strategy or review the derived-`matches` repair |
339
- | PLAY0689 (W) | generated-concept rule proof is undecided; reason names regex fragment/budget/opaque limits. Never treat a warning as proof |
383
+ | PLAY0689 (W) | generated-concept rule proof is undecided; reason names regex fragment/budget/opaque limits or ambiguity. Only deterministic matches patterns prove containment; passing samples prove nothing |
384
+ | PLAY0691 | finite pattern support cannot be counted within the generation budget; simplify the strategy, never treat it as an Unproven rule warning or redraw |
385
+ | PLAY0692 | pattern support is empty for some valid UTC date in the compiler's next-100-year horizon; repair the pattern/checksum contract, never sample around it |
340
386
  | PLAY0685 | own response name used under execute failure; outer successful responses remain available. UI composition `references/response-continuations.md` |
341
387
  | PLAY0289 | (binding) no documents: empty root |
342
388
 
389
+ Requires Screenplay 4.164.0 (`screenplay --version`) for PLAY0688/0689 (ESM v20),
390
+ 4.172.0 for finite generation PLAY0691/0692 and checksum validation (v21); older
391
+ compilers refuse those constructs with PLAY0268. A refuted rule's PLAY0688 repair
392
+ uses the strategy-derived matches pattern (and declared checksum validation if
393
+ absent). Inspect MCP `rules[]` for status/witness/reason and only use a repair
394
+ when diagnosticCode/repair is reported. Pattern/random/rule no longer refuse
395
+ PLAY0268; generated secrets still do. Requires Stage 4.109.0 for v20, 4.115.0
396
+ for v21 admission/all-Proven unpinned specs, 4.117.0 for warning/info rules,
397
+ 4.118.0 for checksum validation and 4.119.0 for pattern/random. Older renderers
398
+ refuse those constructs or require pins even for Proven rules. Bad pins fail
399
+ STAGE-ESM-011; unpinned Unproven/Refuted rules fail -038; opaque rules fail -005
400
+ before pin evaluation. `generate rule` remains -028; checksum remains -042 only
401
+ on legacy syntax paths. Tool-author checks: [generation checks](generation-checks.md).
402
+
343
403
  Fix order: E at V1 -> W at V1 -> silent-gap check -> V2 codes (if the mode needs V3).
344
404
  Report each as `code file:line one-line meaning`; never paste more than about 30 lines.
345
405
 
@@ -358,7 +418,7 @@ Publication STAGE-ESM-032, foreign facts/event captures 033, claim-reading/opaqu
358
418
  | STAGE-ESM-004 / 006 / 013 | a `StateChange` without commands; `produces` that cannot render (expression/enum conditions, literal or computed mappings, duplicate tags); event-context value other than `$context.occurred` (reactions: `$context.causedBy.*`, `$context.eventSourceId`) |
359
419
  | STAGE-ESM-005 / 015 | code rule or code validation bodies; authorization Stage cannot render exactly (role-claim URIs, nested or unresolved opaque policies, opaque-policy subjects that are not text, Uuid, Date or DateTime). Role-only, authenticated, opaque pure policies and Uuid/Date/DateTime/text claim targets render |
360
420
  | STAGE-ESM-007 / 009 / 010 / 017 | projection shape (one projection or reducer per read model, affected-instance key, unsupported query shapes, keys, unsupported `all` mappings, event-context values) |
361
- | STAGE-ESM-011 | specification shape not rendered (`when append` outside the single-hop reaction subset, command specifications that cascade into reactions, composite values, an unauthenticated caller carrying roles or claims, v15 fixtures that do not match their strategy). Command scenarios and single-hop reaction appends render |
421
+ | STAGE-ESM-011 | specification shape not rendered (`when append` outside the single-hop reaction subset, command specifications that cascade into reactions, composite values, an unauthenticated caller carrying roles or claims, generated fixtures that do not match their strategy shape or concept rules). Command scenarios and single-hop reaction appends render |
362
422
  | STAGE-ESM-014 | constraint shape (multi-claim in one command, optional or composite targets) |
363
423
  | STAGE-ESM-019/022 | reducer or opaque pure policy body outside the pure allowlist |
364
424
  | STAGE-ESM-024 | interval, schedule, application, startup and shutdown triggers, opaque reaction bodies, captures, Translate, clock/trigger/capture specifications |
@@ -24,7 +24,8 @@ non-route Double literals (exact lowering of Double-mode literals) as v11, non-p
24
24
  numbers as v12, concept compliance as v13, caller-supplied collection equality filters as v14,
25
25
  concept generation strategies and freshness as v15, stored event names as v16,
26
26
  no-event assertions/redelivery as v17, query-error specifications as v18,
27
- invocation refusal branches as v19 and generated-concept rules as v20. Always name
27
+ invocation refusal branches as v19, generated-concept rules as v20, and finite
28
+ pattern/random/rule generation plus checksum validation as v21. Always name
28
29
  the tool with a V2 or V3 result. When tool and documentation disagree, the tool decides
29
30
  current capability; the documentation and the domain decide intended correctness. Record
30
31
  the gap, never strip the model to pass. Use the actual binder before promoting an older
@@ -38,6 +39,10 @@ never bind (`verdicts.md`).
38
39
  Complete examples that bind live in `executable-example.md`, `pdl-example.md` (projections),
39
40
  `automation-translate-example.md` (ESM v6) and `generated-responses-example.md` (ESM v7).
40
41
 
42
+ For atomic batches (v22), described handlers (v23), ordinal text rules (v24) and
43
+ protected reads (v25), read [language admission](language-admission.md). A later
44
+ version alone does not enable either application opt-in.
45
+
41
46
  ## Caller and compliance boundary
42
47
 
43
48
  `$identity.id`/`.name`/`.userName` are aliases of the admitted
@@ -168,11 +173,14 @@ fixtures and `then returns`. Unsupported generated types (`-028`) and result com
168
173
  `references/generated-values-and-responses.md`.
169
174
  Complete examples: `generated-responses-example.md`, `generation-strategies-example.md`.
170
175
 
171
- - A generated property is command-only, required, scalar and a generatable concept backed by Uuid or String;
172
- bare primitives, optional and collection types are invalid. Uuid has implicit `uuid`; String needs a strategy.
176
+ - A generated property is command-only, required, scalar and a generatable concept backed by Uuid/String,
177
+ or Int with `random` (v21). Bare primitives, optional and collection types are invalid.
178
+ Uuid has implicit `uuid`; String needs a strategy. Generated identifiers remain Uuid/String only.
173
179
  Explicit serialized generation selects v15, with strict fixture encoding and whole-source freshness for all
174
- generated destinations. `pattern`, `random`, `rule`, `sequence` and generated secrets remain unadmitted;
175
- generated-concept rules bind as v20 with proof diagnostics PLAY0688/0689.
180
+ generated destinations. Sequence and generated secrets remain refused.
181
+ Generated-concept rules bind as v20 with proof diagnostics PLAY0688/0689;
182
+ pattern/random/rule and checksum validation bind as v21. PLAY0691 is uncountable
183
+ support within budget; PLAY0692 is empty support on a scanned UTC date.
176
184
  See command-surface `references/generated-values-and-responses.md` and `generation-strategies-example.md`. Modifier order is `Type optional generated identifier`.
177
185
  - Generated values are not request inputs, form fields, invocation arguments or ordinary `when` values. Generation
178
186
  runs after authorization and validation and before productions, so a denial or a validation failure never
@@ -180,7 +188,10 @@ Complete examples: `generated-responses-example.md`, `generation-strategies-exam
180
188
  - A policy (including inherited or composed ones and the implicit `subject` of a generated identifier), a property
181
189
  rule or a requirement that references a generated value reports `PLAY0273`; reference input properties only. A
182
190
  generated property whose concept declares rules selects v20; refuted rules report
183
- PLAY0688 and unproven rules warn PLAY0689. Opaque execution needs a target.
191
+ PLAY0688 with a witness and Unproven rules warn PLAY0689 with a reason. Proven
192
+ rules bind silently; matches containment requires deterministic patterns, not
193
+ passing samples. Opaque validation needs a target. Opaque generation rules use
194
+ pinned String results without executing their bodies.
184
195
  A reaction mapping into a generated property is invalid.
185
196
  - Responses: `returns <property>` is scalar; bare `returns` opens an ordered record of `<name> [<Type>] = <property>` fields
186
197
  over direct properties of the same command (collections, read aliases, arithmetic and whole read models are not
@@ -198,14 +209,25 @@ Complete examples: `generated-responses-example.md`, `generation-strategies-exam
198
209
  - A reaction-invoked command that reaches generation is `Unsupported(IdentityAllocation)`; response-only commands run
199
210
  and discard the response. Generated values give no idempotency, retry or deduplication guarantee.
200
211
 
201
- Requires Screenplay 4.68.0 or later (`screenplay --version`) for generated values and responses (ESM v7), and 4.147.0 or later for concept generation strategies and freshness (ESM v15); older compilers refuse them with PLAY0268.
212
+ Requires Screenplay 4.68.0 or later (`screenplay --version`) for generated values and responses (ESM v7), 4.147.0 for strategies/freshness (v15), 4.164.0 for generated-concept rules (v20), and 4.172.0 for pattern/random/rule/checksum (v21); older compilers refuse the respective constructs with PLAY0268.
213
+
214
+ Pins satisfy both strategy shape and concept rules; failure is Rejected(Contract),
215
+ not an input error or redraw. Pin date segments with `given clock`; without it the
216
+ runner checks digit widths only. Generation checksum does not add validation:
217
+ author `validate checksum` for arithmetic. Requires Stage 4.109.0 for v20,
218
+ 4.115.0 for v21 admission/all-Proven unpinned specs, 4.117.0 for warning/info rules,
219
+ 4.118.0 for checksum validation and 4.119.0 for pattern/random rendering; older
220
+ renderers refuse those constructs or require rule-bearing pins even when Proven.
221
+ Unproven/Refuted rules still need pins (-038), bad pins fail -011, and
222
+ `generate rule` remains -028. Do not remove rules or classification to render.
202
223
 
203
224
  ## Released public boundaries and observer routes
204
225
 
205
226
  Public/origin events, explicit Translate direction, event-target builders and
206
- `source events` captures bind as ESM v9. Publication folds execute;
207
- source-event captures and reached opaque event-target reducers return typed
208
- Unsupported. Public/foreign imports still lack a local shape and refuse PLAY0268.
227
+ `source events` captures bind as ESM v9. Publication folds execute, and so do
228
+ captures over events (Requires Screenplay 4.171.0; a specification presents the
229
+ consumed event with `given <Event>` / `when append <Event>`); reached opaque
230
+ event-target reducers return typed Unsupported. Public/foreign imports still lack a local shape and refuse PLAY0268.
209
231
  See automations-and-translations `references/public-events-and-direction.md`.
210
232
  Production overrides and reaction/reducer filters bind and select v10;
211
233
  filters match routed source/stream names only. Read
@@ -231,9 +253,15 @@ Requires Screenplay 4.117.0 or later (`screenplay --version`) for ESM v9, 4.129.
231
253
 
232
254
  ## Code attachments (what binds, what never does)
233
255
 
256
+ Pending `handler implementation` beside unconditional `produces` binds as a described
257
+ command (v23). Its payload-only body returns Unsupported ImplementationBody when reached;
258
+ denial/validation specs still run. Read [language admission](language-admission.md) for
259
+ v22–v25 and [described handlers](../../cratis-screenplay-command-surface/references/described-handlers.md)
260
+ for the result contract. Attached handlers remain unbound.
261
+
234
262
  Inline fences (`csharp`, `typescript`, `react`, `html`, `sql`) and `file <path>` attach
235
263
  code to an owner. Three kinds block binding (PLAY0268, V3 blocked, no specification runs):
236
- the command `handler`, the `file` constraint (see below) and a query `performer`
264
+ the attached command `handler`, the `file` constraint (see below) and a query `performer`
237
265
  ("uses delivery, filtering, scope, or implementation behavior outside the first ESM v1
238
266
  vertical"). Everything else binds as an **opaque requirement** that needs a target to
239
267
  execute: reducer transitions, rule predicates, command and concept code validation, policy
@@ -246,22 +274,22 @@ bodies still leave their owner non-executable.
246
274
  can only declare uniqueness: declare it with `unique ...`, and put other rules in command
247
275
  validation or a `require` condition.
248
276
 
249
- - A command `handler` **never binds**: PLAY0268 "Command '<n>' handler requires a
250
- constrained implementation attachment." This holds with a `file`, with a fence, and with
251
- `implementation` or `hint` (including a pending intent with no payload). On a handler,
252
- `implementation` and `hint` are authoring intent: no execution, lock or confirmation.
277
+ - A file/fenced command `handler` remains PLAY0268, wrapped or direct. A pending
278
+ intent instead selects v23 with unconditional productions (PLAY0695 information).
279
+ Missing productions use PLAY0696, conditional ones PLAY0697, duplicate handlers PLAY0698.
280
+ Hints are not executable code, locks or confirmation.
253
281
  - A command property named rule also accepts an `implementation` block (ordered
254
282
  `hint` lines, at most one `file` or tagged fence). With a source attached it binds like a
255
283
  direct source; hints-only or empty is pending intent: valid source, PLAY0268 at binding.
256
284
  The block is rejected on concept rules, built-in property rules and whole-command
257
285
  `require`/`validate` bodies.
258
- - A handler therefore makes the slice non-executable and non-renderable: it is gap-fill
259
- with the model as the contract.
286
+ - A reached described body is Unsupported, not a passing specification; Stage refuses
287
+ it with STAGE-IMPL-002, even in Stub mode. Deliver its body as authorized gap-fill.
260
288
  - Stage admits only pure reducer bodies (Roslyn allowlist, STAGE-ESM-019 and 022);
261
289
  code validation is refused (STAGE-ESM-005). Opaque pure policies render.
262
290
  - The reference runner returns Unsupported for the opaque bodies that do bind (rule and
263
291
  policy predicates, code validation, reducer transitions); a specification that needs one
264
- never passes. Handlers, file constraints and query performers (and reaction effects on a trigger with
292
+ never passes. Attached handlers, file constraints and query performers (and reaction effects on a trigger with
265
293
  `reads`) are different: they leave the whole model unbound, so no specification runs at
266
294
  all.
267
295
 
@@ -274,13 +302,13 @@ bodies still leave their owner non-executable.
274
302
  | `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 |
275
303
  | `query` with a composite `by` block, or `by ... from` context-derived arguments | PLAY0268 | composite `by` blocks remain unadmitted. An optional scalar snapshot lookup, an unfiltered list (`RM[]`) and a list narrowed by one caller-supplied `by` key bind, in their `observable` form too |
276
304
  | Context `from`, single-result filters, `scoped to`, `performer` queries | PLAY0268 | Typed query context, filtering of single results, opaque scope and query implementation remain unadmitted; each refusal names its reason. Caller-supplied collection equality filters bind as v14. `observable` goes in the return position (`=> observable RM[]`); as a body line it is PLAY0048 |
277
- | `contains` or `starts with` in conditions | PLAY0268 | equality and numeric ordering only |
305
+ | `contains` or `starts with` in conditions only | PLAY0268 | `require`/`produces when` conditions admit equality and numeric ordering only; property/concept text rules bind as v24 |
278
306
  | Date or DateTime comparison, `today` | PLAY0268 | no runtime date value |
279
307
  | Rule on a nested path (`lines.qty all > 0`) | PLAY0268 | put the rule on the nested value's concept |
280
- | `require` or `produces when` over a read-model path | PLAY0268 | needs decision-consistent reads |
281
- | `reads <View> ...` on a command | PLAY0271 (error) | legacy, cannot imply decision consistency |
308
+ | Read paths without protected opt-in, or in `produces when` | PLAY0268 | v25 admits single-level paths only in `require` and produced-event mappings |
309
+ | Legacy `reads <View> ...` on a command | PLAY0271 (error) | `command reads protected` opts eligible views into v25; see command-surface protected reads |
282
310
  | `concurrency` block on a command | PLAY0271 (error) | "concurrency metadata keeps its legacy meaning and cannot bind to ESM v1" |
283
- | `handler` (see above) | PLAY0268 | gap-fill |
311
+ | File/inline `handler` (see above) | PLAY0268 | pending described handlers instead bind v23; body execution and rendering remain gaps |
284
312
  | `$context.tenant`, roles, claims, causation | PLAY0268 | no portable scalar counterpart |
285
313
  | Arithmetic or raw expression in a `produces` mapping | PLAY0268 | |
286
314
  | Template `` `${x}` `` or `$causedBy` in a projection | PLAY0268 | |