@cratis/pi 7.38.2 → 7.39.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 (71) hide show
  1. package/package/corpus/agents/screenplay-modeler.md +1 -1
  2. package/package/corpus/agents/screenplay-reviewer.md +1 -1
  3. package/package/corpus/product-sync.json +3 -3
  4. package/package/corpus/skills/cratis-screenplay-automations-and-translations/SKILL.md +1 -1
  5. package/package/corpus/skills/cratis-screenplay-automations-and-translations/references/automation-patterns.md +1 -1
  6. package/package/corpus/skills/cratis-screenplay-automations-and-translations/references/public-events-and-direction.md +2 -5
  7. package/package/corpus/skills/cratis-screenplay-automations-and-translations/references/todo-list-example.md +2 -5
  8. package/package/corpus/skills/cratis-screenplay-automations-and-translations/references/translate-example.md +2 -5
  9. package/package/corpus/skills/cratis-screenplay-captures-and-reactions/SKILL.md +7 -11
  10. package/package/corpus/skills/cratis-screenplay-captures-and-reactions/references/complete-examples.md +6 -15
  11. package/package/corpus/skills/cratis-screenplay-captures-and-reactions/references/specifying-triggers-and-clock.md +1 -1
  12. package/package/corpus/skills/cratis-screenplay-command-surface/SKILL.md +14 -15
  13. package/package/corpus/skills/cratis-screenplay-command-surface/references/compliance.md +2 -2
  14. package/package/corpus/skills/cratis-screenplay-command-surface/references/enum-numbers.md +2 -5
  15. package/package/corpus/skills/cratis-screenplay-command-surface/references/inline-events.md +23 -1
  16. package/package/corpus/skills/cratis-screenplay-discovery/references/provenance.md +1 -1
  17. package/package/corpus/skills/cratis-screenplay-event-modeling/references/invoicing-example.md +3 -7
  18. package/package/corpus/skills/cratis-screenplay-event-modeling/references/nine-steps.md +7 -10
  19. package/package/corpus/skills/cratis-screenplay-legacy-extraction/references/generate-notes.md +1 -1
  20. package/package/corpus/skills/cratis-screenplay-legacy-extraction/references/intent-example.md +3 -8
  21. package/package/corpus/skills/cratis-screenplay-model-authoring/SKILL.md +8 -3
  22. package/package/corpus/skills/cratis-screenplay-model-authoring/references/language-reference.md +7 -5
  23. package/package/corpus/skills/cratis-screenplay-model-authoring/references/mcp-loop.md +26 -6
  24. package/package/corpus/skills/cratis-screenplay-model-authoring/references/mcp-tools.md +40 -0
  25. package/package/corpus/skills/cratis-screenplay-model-authoring/references/property-links.md +3 -1
  26. package/package/corpus/skills/cratis-screenplay-model-review/references/checklist.md +1 -1
  27. package/package/corpus/skills/cratis-screenplay-model-review/references/report-template.md +1 -1
  28. package/package/corpus/skills/cratis-screenplay-modeling-lifecycle/references/verdicts-and-modes.md +3 -2
  29. package/package/corpus/skills/cratis-screenplay-modeling-lifecycle/references/worked-example.md +2 -6
  30. package/package/corpus/skills/cratis-screenplay-projections/SKILL.md +2 -0
  31. package/package/corpus/skills/cratis-screenplay-read-surface/SKILL.md +26 -18
  32. package/package/corpus/skills/cratis-screenplay-read-surface/references/equality-filters.md +211 -0
  33. package/package/corpus/skills/cratis-screenplay-read-surface/references/screen-patterns.md +2 -5
  34. package/package/corpus/skills/cratis-screenplay-read-surface/verification.json +4 -0
  35. package/package/corpus/skills/cratis-screenplay-render-and-gap-fill/references/renderability-gate.md +1 -1
  36. package/package/corpus/skills/cratis-screenplay-render-and-gap-fill/references/worked-example.md +2 -5
  37. package/package/corpus/skills/cratis-screenplay-scenario-coverage/SKILL.md +4 -1
  38. package/package/corpus/skills/cratis-screenplay-scenario-coverage/references/berth-reservations.md +8 -19
  39. package/package/corpus/skills/cratis-screenplay-scenario-coverage/references/invoicing-dues-design.md +8 -20
  40. package/package/corpus/skills/cratis-screenplay-scenario-coverage/references/invoicing-dues-example.md +9 -23
  41. package/package/corpus/skills/cratis-screenplay-scenario-coverage/references/scenario-examples.md +9 -3
  42. package/package/corpus/skills/cratis-screenplay-scenario-coverage/references/spec-forms-by-mode.md +3 -2
  43. package/package/corpus/skills/cratis-screenplay-scenario-coverage/references/view-and-story-specs.md +2 -1
  44. package/package/corpus/skills/cratis-screenplay-slice-design/SKILL.md +7 -4
  45. package/package/corpus/skills/cratis-screenplay-slice-design/references/model-reasoning.md +2 -5
  46. package/package/corpus/skills/cratis-screenplay-slice-design/references/read-model-design.md +5 -10
  47. package/package/corpus/skills/cratis-screenplay-slice-design/references/worked-example.md +8 -19
  48. package/package/corpus/skills/cratis-screenplay-specifications/SKILL.md +17 -25
  49. package/package/corpus/skills/cratis-screenplay-specifications/references/actions-beyond-commands.md +2 -1
  50. package/package/corpus/skills/cratis-screenplay-specifications/references/persona-callers-and-cases.md +2 -5
  51. package/package/corpus/skills/cratis-screenplay-specifications/references/source-notes.md +10 -0
  52. package/package/corpus/skills/cratis-screenplay-streams-and-consistency/references/streams-example.md +10 -24
  53. package/package/corpus/skills/cratis-screenplay-toolchain/SKILL.md +11 -6
  54. package/package/corpus/skills/cratis-screenplay-toolchain/references/automation-translate-example.md +4 -10
  55. package/package/corpus/skills/cratis-screenplay-toolchain/references/cheat-sheet-example.md +9 -20
  56. package/package/corpus/skills/cratis-screenplay-toolchain/references/doc-contradictions.md +2 -1
  57. package/package/corpus/skills/cratis-screenplay-toolchain/references/executable-example.md +3 -7
  58. package/package/corpus/skills/cratis-screenplay-toolchain/references/executable-subset.md +24 -8
  59. package/package/corpus/skills/cratis-screenplay-toolchain/references/pdl-example.md +27 -69
  60. package/package/corpus/skills/cratis-screenplay-toolchain/references/preferred-syntax.md +73 -0
  61. package/package/corpus/skills/cratis-screenplay-toolchain/references/renderable-subset.md +2 -2
  62. package/package/corpus/skills/cratis-screenplay-toolchain/references/screenplay-contract-exceptions.json +21 -0
  63. package/package/corpus/skills/cratis-screenplay-toolchain/references/screenplay-contract.json +7 -1
  64. package/package/corpus/skills/cratis-screenplay-toolchain/references/screenplay-contract.version +1 -1
  65. package/package/corpus/skills/cratis-screenplay-toolchain/references/sources-and-streams.md +1 -1
  66. package/package/corpus/skills/cratis-screenplay-toolchain/references/traps.md +2 -2
  67. package/package/corpus/skills/cratis-screenplay-toolchain/references/verdicts.md +14 -2
  68. package/package/corpus/skills/cratis-screenplay-toolchain/references/versions.md +25 -5
  69. package/package/corpus/skills/cratis-screenplay-ui-composition/SKILL.md +7 -11
  70. package/package/corpus/skills/cratis-stage-rendering-and-sandbox/references/admission.md +2 -2
  71. package/package.json +1 -1
@@ -22,17 +22,13 @@ module Gallery
22
22
  authorize IsCurator
23
23
  validate
24
24
  insuredValue > 0 message "An insured value must be positive"
25
- produces ArtworkRegistered
26
- for artworkId
27
- title = title
28
- insuredValue = insuredValue
25
+ produces event ArtworkRegistered
26
+ title ArtworkTitle = title
27
+ insuredValue Decimal = insuredValue
29
28
  produces when insuredValue > 100000
30
29
  HighValueArtworkFlagged
31
30
  for artworkId
32
31
  insuredValue = insuredValue
33
- event ArtworkRegistered
34
- title ArtworkTitle
35
- insuredValue Decimal
36
32
  event HighValueArtworkFlagged
37
33
  insuredValue Decimal
38
34
  constraint UniqueArtworkTitle
@@ -4,6 +4,7 @@
4
4
 
5
5
  - Caller and compliance boundary (4.142.0)
6
6
  - Admitted on both compilers
7
+ - Equality query filters (ESM v14, since 4.143.0)
7
8
  - Admitted from Screenplay 4.61 (ESM v6): standalone tool and cratis 3.28.2 or later
8
9
  - Generated values and responses (ESM v7): standalone 4.68.0 or later; the cratis 3.53.1 bundle binds them too
9
10
  - Released public boundaries and observer routes
@@ -16,12 +17,13 @@ Current pins: `versions.md`. Detailed
16
17
  4.66.0/4.68.0 binder probes below retain their historical labels. Current source
17
18
  admits routes as ESM v8, public/direction constructs as v9, identity/overrides/filters
18
19
  as v10, qualifying non-route Double literals as v11 (exact lowering of Double-mode literals)
19
- and non-positional enum numbers as v12; concept compliance as v13. Operations, the `numbers exact` **source mode** (PLAY0268) and
20
+ and non-positional enum numbers as v12; concept compliance as v13; caller-supplied
21
+ collection equality filters as v14 since 4.143.0. Operations, the `numbers exact` **source mode** (PLAY0268) and
20
22
  reaction refusals/redelivery remain unadmitted. Use the actual
21
23
  binder before promoting an older probe to a current capability claim.
22
24
 
23
25
  What the binder admits, and what it refuses with which code. The answer depends on the
24
- compiler version: the standalone tool (4.142.0) binds through v13; the compiler bundled in cratis
26
+ compiler version: the standalone tool (4.145.0) binds through v14; the compiler bundled in cratis
25
27
  3.53.1 (4.137.0) binds ESM through v10 for rendering and refuses non-positional enum numbers at
26
28
  binding; older bundles (4.66.0 in cratis 3.28.x, admitting v1 to v6; 4.60.1 before 3.28.2, v1 to v5)
27
29
  are history.
@@ -61,8 +63,8 @@ caller and purpose guidance retains v4.127.0 `context.md`, `identity.md`, `purpo
61
63
  ## Admitted on both compilers
62
64
 
63
65
  - `StateChange` and `StateView` slices.
64
- - A command with one `identifier`; `produces <Event>` with `for <identifier>` on every
65
- production.
66
+ - A command with one `identifier`; inline `produces event <Name>` (omit `for`) for a command-owned event, or
67
+ plain `produces <Event>` with explicit `for <identifier>` for a shared event.
66
68
  - `produces when` with `==`/`!=` on scalar text, enum, number or boolean, and ordering on
67
69
  numbers.
68
70
  - Mappings from command properties, string and number literals, `$context.occurred`,
@@ -84,8 +86,9 @@ caller and purpose guidance retains v4.127.0 `context.md`, `identity.md`, `purpo
84
86
  Queryless read models need an explicit `key`. Explicit single keys preserve
85
87
  equivalent inferred ESM bytes. Composite read-model keys, query `by` blocks and
86
88
  their fixtures remain PLAY0268 (#599), not the 4.129.0 authoring delivery's
87
- executable admission. Collections and observable delivery bind; filters, scope,
88
- performer and context-derived `by` remain separate blockers.
89
+ executable admission. Collections and observable delivery bind. Since 4.143.0,
90
+ caller-supplied equality filters on collections also bind as ESM v14; context
91
+ sources, single-result filters, scope, performer and composite `by` remain blocked.
89
92
  - One projection per read model: `from`, `every`, `all` (one block per level), `join`,
90
93
  `children`, `nested`, `remove with`, `remove via join` (binds; blocks the execution plan at the projection level, see below), `clear with`, counters, `add`,
91
94
  `subtract`, `set`, `clear`, variants, and the identifier mapped from the projection's key (`xId = $eventSourceId` only for an event-source key).
@@ -96,6 +99,19 @@ caller and purpose guidance retains v4.127.0 `context.md`, `identity.md`, `purpo
96
99
  - `seed`. Personas, screens and descriptions are PLAY0270/PLAY0269 information, not
97
100
  blocking.
98
101
 
102
+ ## Equality query filters (ESM v14, since 4.143.0)
103
+
104
+ `filter <name> <Type> [optional]` binds on collections with no `from`, targeting a
105
+ same-named scalar primitive/concept/enum property of the same nominal type
106
+ (ignoring optionality). Distinct filter names must not repeat `by`. All supplied
107
+ filters AND with `by`; optional omission does not narrow, supplied null is refused.
108
+ `then query … arguments` and `when query` accept both `by` and filters; PLAY0468
109
+ reports unknown/repeated/missing required arguments. Collection results match by
110
+ read model/key regardless of row order. The standalone 4.145.0 pin admits this;
111
+ CLI 3.53.1's 4.137.0 compiler does not. Stage 4.73.1 admits through v10 and the
112
+ latest checked Stage 4.80.0 through v13, neither v14. Complete compiled specs:
113
+ read-surface [equality filters](../../cratis-screenplay-read-surface/references/equality-filters.md).
114
+
99
115
  ## Admitted from Screenplay 4.61 (ESM v6): standalone tool and cratis 3.28.2 or later
100
116
 
101
117
  - `slice Automation` with `reaction`: `when <Event>` (with values) then `produces` (no
@@ -223,7 +239,7 @@ bodies still leave their owner non-executable.
223
239
  | Unquoted `import Other.Contract` | PLAY0268 | external contract import is not bound |
224
240
  | `pii` or `secret` on a concept | PLAY0268 | Blanket refusal on CLI 3.53.1's 4.137.0 bundle only. Standalone 4.142.0 admits 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 |
225
241
  | `query` with a composite `by` block, or `by ... from` context-derived arguments | PLAY0268 | composite `by` blocks remain unadmitted (#599). 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 (since 4.105.0) |
226
- | `filter`, `scoped to`, `performer` queries | PLAY0268 | "uses delivery, filtering, scope, or implementation behavior outside the first ESM v1 vertical." `observable` is not the blocker: it goes in the return position (`=> observable RM[]`); as a body line it is PLAY0048 |
242
+ | 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 |
227
243
  | `contains` or `starts with` in conditions | PLAY0268 | equality and numeric ordering only |
228
244
  | Date or DateTime comparison, `today` | PLAY0268 | no runtime date value |
229
245
  | Rule on a nested path (`lines.qty all > 0`) | PLAY0268 | put the rule on the nested value's concept |
@@ -252,7 +268,7 @@ bodies still leave their owner non-executable.
252
268
  ## Not refused, but do not rely on it
253
269
 
254
270
  - Plain `produces` without `for` binds (PLAY0478, information) but means allocation in the
255
- ESM and "the identifier" in rendered Arc code. Always write `for`.
271
+ ESM and "the identifier" in rendered Arc code. Always write `for` on a plain `produces <Name>`; inline `produces event` omits it.
256
272
  - 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.
257
273
  - At Screenplay 4.125.0, V1 reports absent projection/children/nested targets
258
274
  with PLAY0514 and unknown removal/capture events with PLAY0166. An unmapped
@@ -25,20 +25,12 @@ module Shop
25
25
  orderId OrderId identifier
26
26
  customerId CustomerId
27
27
  total Decimal
28
- produces OrderPlaced
29
- for orderId
30
- customerId = customerId
31
- total = total
32
- produces LineAdded
33
- for orderId
34
- lineNumber = 1
35
- sku = "A-1"
36
- event OrderPlaced
37
- customerId CustomerId
38
- total Decimal
39
- event LineAdded
40
- lineNumber Int
41
- sku String
28
+ produces event OrderPlaced
29
+ customerId CustomerId = customerId
30
+ total Decimal = total
31
+ produces event LineAdded
32
+ lineNumber Int = 1
33
+ sku String = "A-1"
42
34
  specification PlacingAnOrder
43
35
  when PlaceOrder
44
36
  orderId = "7a1c2e30-4b5d-4e6f-8a9b-0c1d2e3f4a5b"
@@ -64,29 +56,19 @@ module Shop
64
56
  command RemoveLine
65
57
  orderId OrderId identifier
66
58
  lineNumber Int
67
- produces LineRemoved
68
- for orderId
69
- lineNumber = lineNumber
70
- event LineRemoved
71
- lineNumber Int
59
+ produces event LineRemoved
60
+ lineNumber Int = lineNumber
72
61
  slice StateChange ShipOrder
73
62
  command ShipOrder
74
63
  orderId OrderId identifier
75
64
  carrier String
76
- produces Shipped
77
- for orderId
78
- carrier = carrier
79
- produces ShippingCleared
80
- for orderId
81
- event Shipped
82
- carrier String
83
- event ShippingCleared
65
+ produces event Shipped
66
+ carrier String = carrier
67
+ produces event ShippingCleared
84
68
  slice StateChange CancelOrder
85
69
  command CancelOrder
86
70
  orderId OrderId identifier
87
- produces OrderCancelled
88
- for orderId
89
- event OrderCancelled
71
+ produces event OrderCancelled
90
72
  specification CancellingAnOrder
91
73
  given OrderPlaced
92
74
  for "7a1c2e30-4b5d-4e6f-8a9b-0c1d2e3f4a5b"
@@ -101,14 +83,9 @@ module Shop
101
83
  command RenameCustomer
102
84
  customerId CustomerId identifier
103
85
  name String
104
- produces CustomerRenamed
105
- for customerId
106
- name = name
107
- produces CustomerDeleted
108
- for customerId
109
- event CustomerRenamed
110
- name String
111
- event CustomerDeleted
86
+ produces event CustomerRenamed
87
+ name String = name
88
+ produces event CustomerDeleted
112
89
  slice StateView OrderOverview
113
90
  readmodel OrderView
114
91
  orderId OrderId
@@ -156,28 +133,17 @@ module Work
156
133
  command OpenIssue
157
134
  issueId IssueId identifier
158
135
  title String
159
- produces IssueCreated
160
- for issueId
161
- title = title
162
- produces IssueTitleCorrected
163
- for issueId
164
- title = title
165
- event IssueCreated
166
- title String
167
- event IssueTitleCorrected
168
- title String
136
+ produces event IssueCreated
137
+ title String = title
138
+ produces event IssueTitleCorrected
139
+ title String = title
169
140
  slice StateChange OpenPullRequest
170
141
  command OpenPullRequest
171
142
  issueId IssueId identifier
172
143
  status String
173
- produces PullRequestCreated
174
- for issueId
175
- produces BuildCompleted
176
- for issueId
177
- status = status
178
- event PullRequestCreated
179
- event BuildCompleted
180
- status String
144
+ produces event PullRequestCreated
145
+ produces event BuildCompleted
146
+ status String = status
181
147
  slice StateView WorkItems
182
148
  readmodel BacklogItem
183
149
  issueId IssueId
@@ -207,19 +173,11 @@ module Bank
207
173
  accountId AccountId identifier
208
174
  amount Decimal
209
175
  code Code
210
- produces Deposited
211
- for accountId
212
- amount = amount
213
- produces Withdrawn
214
- for accountId
215
- amount = amount
216
- produces Frozen
217
- for accountId
218
- event Deposited
219
- amount Decimal
220
- event Withdrawn
221
- amount Decimal
222
- event Frozen
176
+ produces event Deposited
177
+ amount Decimal = amount
178
+ produces event Withdrawn
179
+ amount Decimal = amount
180
+ produces event Frozen
223
181
  specification Depositing
224
182
  when Deposit
225
183
  accountId = "5d1f0c2e-8a47-4c1b-9b3e-6f2a7c9d1e10"
@@ -0,0 +1,73 @@
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
+ # Preferred Screenplay syntax
5
+
6
+ Use these forms when writing or reviewing `.play`. Acceptance of an older
7
+ spelling is not a recommendation to teach it. Information diagnostics do not
8
+ fail `--warnaserror`; the corpus verification gate rejects the nine style codes
9
+ below even when a fence declares `expect`, unless an exact, reasoned migration
10
+ exception exists in the verifier's preferred-syntax allowlist. That allowlist also
11
+ covers deliberate legacy explanations in prose; stale entries fail.
12
+
13
+ ## Forms
14
+
15
+ | Construct | Preferred form | Accepted older form or redundancy | Diagnostic |
16
+ | --- | --- | --- | --- |
17
+ | Optional type | `T optional`, `T[] optional` | `T?`, `T[]?` | PLAY0479 (information) |
18
+ | Compliance | Header `concept X : String pii` or `secret`; body settings `pii reason`, `pii special health`, `secret scope namespace` | `@pii`, `@sensitive`, `sensitive`; `personal` is an accepted alias without a diagnostic | PLAY0565 (information); repeated markers warn PLAY0653 |
19
+ | Inline code | A construct header such as `validate`, followed by an indented language-tagged fence; descriptions use a tagged `text` fence, event documentation `markdown` | `validate csharp`, a language line above a bare fence, or a bare description fence | PLAY0397 (warning) |
20
+ | Event identity | Omit `id` for a new event; preserve `id "OldName"` for a renamed stored contract | `id` equal to the current event name | PLAY0471 (information) |
21
+ | Source/stream identity | Omit `id` unless preserving a previous stored name | A pin equal to the current name | PLAY0507 (information) |
22
+ | Production route | Inherit the command's route | Repeating the same `stream` / `streamId` on a production | PLAY0664 (warning) |
23
+ | Imports | Import only declarations not already declared by the application | Importing the application's own names | PLAY0290 (warning) |
24
+ | Interaction guard | Block-form `when` alternatives | Opaque interaction `where` on click, double click or select | PLAY0564 (warning or information) |
25
+ | Projection transition cardinality | Source binding emits `One` | Constructed/deserialized ESM v1–v3 `ZeroOrOne` / `Many` | PLAY0445 (warning; ESM-only, not a source spelling) |
26
+
27
+ `query Q => observable?` is not a legacy optional type suffix and has no keyword
28
+ replacement. Reaction/Translate `where` is current syntax, not an interaction
29
+ legacy guard. Keep a real rename pin; do not remove it to resemble a new event.
30
+
31
+ ## Command productions
32
+
33
+ **Cratis convention:** prefer inline `produces event <Name>` when one command
34
+ owns the event. Declare payload types and mappings together; omit `for` to use
35
+ the command identifier and never copy that identifier into the event payload.
36
+ For an event shared by commands or reactions, keep a standalone `event` and use
37
+ plain `produces <Name>` with explicit `for <identifier>` on commands. Reactions
38
+ cannot declare inline events; omission there follows the triggering event's
39
+ source, and clock/application triggers require a destination.
40
+
41
+ Plain command production omission is accepted *legacy omission behavior*, not
42
+ identifier inference: it can use allocation or a sibling's resolved destination.
43
+ PLAY0478 is advice, not a forbidden style code or permission to retarget a stored
44
+ contract automatically. PLAY0469 concerns payload design and contract impact;
45
+ it is not a syntax-style ban either. Neither are PLAY0516, PLAY0553 or PLAY0520.
46
+ Read command-surface [inline events and destinations](../../cratis-screenplay-command-surface/references/inline-events.md)
47
+ for mixed destinations, extraction and generation evolution.
48
+
49
+ **Stage caveat:** rendered Arc commands ignore production `for` (Stage#187).
50
+ An authored destination is not proof of rendered routing; verify the target
51
+ implementation separately.
52
+
53
+ ## Navigation `by` and form `columns`
54
+
55
+ Both are current, not legacy (settled in Screenplay#688, v4.145.1). Screen
56
+ navigation passes the target's key with `by <parameter>` (`on row-click navigate
57
+ to InvoiceDetail by invoiceId`) and further values with `parameter <name> from
58
+ <binding>`; navigation inside an interaction block passes values with `with <name>
59
+ from <binding>`. A form's `columns auto|manual` chooses which command properties
60
+ it shows and in which order; `layout`/`place` positions them. Use whichever the
61
+ case needs; neither has a style diagnostic.
62
+
63
+ ## Verified product sources
64
+
65
+ Screenplay **v4.145.0** (syntax unchanged from 4.144.0):
66
+ `Documentation/screenplay/types.md:23-25`, `concepts.md:34-37,142-146`,
67
+ `ast-compatibility.md:68`, `commands.md:80-90,136-176,503`,
68
+ `events.md:114,118-120`, `event-sources.md:7,86,132`, `reactions.md:298-312`,
69
+ `interactions.md:105-107`, `folders.md:418-421`, `diagnostics.md:825,979-987,1013,1084,1105-1120,1271`.
70
+ Printer: `Source/DotNET/Screenplay/Printing/ScreenplaySyntaxText.cs:41`,
71
+ `ScreenplayPrinter.Expressions.cs:18-32`, `ScreenplayPrinter.Commands.cs:481-530`.
72
+ Navigation and forms: Screenplay v4.145.1 `glossary.md:65`, `forms.md:40`; https://github.com/Cratis/Screenplay/issues/688.
73
+ The published contract is the selector's authority, not this hand-written table.
@@ -46,7 +46,7 @@ version; each construct it does not render refuses with its own code before any
46
46
  | Area | Renders at 4.73.1 | Refused (code) |
47
47
  | --- | --- | --- |
48
48
  | Slice kinds | `StateChange`, `StateView` | `Automation`, `Translate`, every reaction, capture, application trigger and clock specification (`STAGE-ESM-001`/`-024`); a reaction that both produces and invokes (`-037`, Stage#207; Arc 22.72.0+ can run it, and the Arc the scaffold pins needs a proven override; hand-write one reactor, never split the reaction) |
49
- | Queries | optional keyed snapshot lookups; observable collections, keyed or unkeyed (since 4.49.0) | a snapshot list: `STAGE-ESM-010`; `filter`, `scoped to`, `performer`, composite `by`: `PLAY0268` at binding |
49
+ | Queries | optional keyed snapshot lookups; observable collections, keyed or unkeyed (since 4.49.0) | a snapshot list: `STAGE-ESM-010`; context/single-result filters, opaque `scoped to`/`performer` and composite `by`: PLAY0268. Caller-supplied collection equality filters bind since 4.143.0 as v14, above this bundle's v10 admission ceiling |
50
50
  | Authorization | role-only, authenticated, opaque pure policies, claim conditions with Uuid, Date, DateTime or text targets (numeric and Boolean claim matches render as always false; Stage 4.73.1 `IsSupportedClaimPath`), `not`/and/or; roles read through the identity's `RoleClaimType` | role-claim URIs, nested opaque policies, unresolved or non-portable policies, no single identifier, opaque-policy subjects that are not text, Uuid, Date or DateTime (`STAGE-ESM-015`; Stage 4.73.1 `IsTextualSubject`, a restriction separate from declarative claim targets) |
51
51
  | Event sources, streams, routes (ESM v8) | rendered, with routed specifications | reserved stored names, unformattable routed fixtures, unsupported routed replay (`STAGE-ESM-030`) |
52
52
  | Numbers, case tables | whole numbers as `long` from ESM v8; case tables | out-of-`int` literals below v8 (`STAGE-ESM-031`) |
@@ -87,7 +87,7 @@ whole automation is hand-written (gap-fill).
87
87
  | Constraints | unique property value, unique event occurrence; admitted even though Chronicle#4123 means index updates run after commit | intra-command multi-event change to one constraint; multi-claim in one command: 014 |
88
88
  | Authorization | authenticated, role, claim and logical policies; caller fixtures; ownership claims against text-backed targets | opaque policy code, role-claim URIs, a claim matched against a Uuid-backed subject or path: 015 |
89
89
  | Specifications | command-action scenarios: given events, `when <Command>`, `then` events (ordered or any order), `then readmodel`, `then query`, `then error` (naming a rendered constraint or message), `then denied`, `given caller`. Two narrow when-less routes: an unprotected single `then query` seeded by exactly one `given readmodel` whose key and values match (no given events, no caller), and a query-only denial (`given caller`, one `then query` with no results, `then denied`, a protected query, no role claims) | `then no readmodel`, `when append`, composite values, error codes not naming a rendered constraint: 011. Any other when-less specification (for example given events with `then query`) fails 011 |
90
- | Compliance | none | any `@pii` or `@sensitive` already fails binding (PLAY0268). The C# provider mapping (Stage v4.29.0, Stage#197) is `@pii` to `[PII]`, `@sensitive` to `[Encrypted]` + `[NotAudited]`, both to `[PII]` only |
90
+ | Compliance | none | any `pii` or `secret` already fails binding (PLAY0268) on the pinned CLI. The C# provider mapping (Stage v4.29.0, Stage#197) is personal data to `[PII]`, operational secrets to `[Encrypted]` + `[NotAudited]`, both to `[PII]` only |
91
91
 
92
92
  At standalone 4.127.0, compliance uses bare `pii`/`secret` (legacy markers are
93
93
  accepted with PLAY0565 information); either still refuses binding on that compiler.
@@ -1,4 +1,25 @@
1
1
  [
2
+ {
3
+ "file": ".cratis/ai/skills/cratis-screenplay-model-authoring/references/mcp-loop.md",
4
+ "text": " 3 unsupported/unbound. `test` rejects `--no-color`. Hand off to the verdict",
5
+ "kind": "cliOption",
6
+ "value": "--no-color",
7
+ "reason": "Explicitly documents a rejected option, not a supported CLI argument; Screenplay v4.145.0 ModelTest.cs:22-26. Remove with the warning."
8
+ },
9
+ {
10
+ "file": ".cratis/ai/skills/cratis-screenplay-model-authoring/references/mcp-tools.md",
11
+ "text": "or unbound. `--no-color` is rejected (exit 2); there is no proposal or paging option.",
12
+ "kind": "cliOption",
13
+ "value": "--no-color",
14
+ "reason": "Explicit warning that test does not accept this flag; Screenplay v4.145.0 ModelTest.cs:22-26. Remove with the warning."
15
+ },
16
+ {
17
+ "file": ".cratis/ai/skills/cratis-screenplay-toolchain/references/verdicts.md",
18
+ "text": "is not proof of coverage. `test` rejects `--no-color` (exit 2).",
19
+ "kind": "cliOption",
20
+ "value": "--no-color",
21
+ "reason": "Negative option guidance, not a command recommendation; Screenplay v4.145.0 ModelTest.cs:22-26. Remove with the warning."
22
+ },
2
23
  {
3
24
  "file": ".cratis/ai/skills/cratis-screenplay-model-authoring/references/mcp-loop.md",
4
25
  "text": "4.63.1. Cratis CLI 3.28.2 bundles Screenplay 4.66.0 (probed: 29 tools and the same views);",
@@ -24512,12 +24512,17 @@
24512
24512
  "expectedSourceRevision",
24513
24513
  "limit",
24514
24514
  "offset",
24515
+ "proposalId",
24515
24516
  "scope",
24516
24517
  "specification"
24517
24518
  ],
24518
24519
  "inputSchema": {
24519
24520
  "type": "object",
24520
24521
  "properties": {
24522
+ "proposalId": {
24523
+ "type": "string",
24524
+ "description": "Outstanding proposal from this connection. Runs its retained candidate and identity catalog without refreshing, applying or mutating it; an externally changed base does not replace the snapshot."
24525
+ },
24521
24526
  "specification": {
24522
24527
  "type": "string"
24523
24528
  },
@@ -24534,7 +24539,8 @@
24534
24539
  "maximum": 200
24535
24540
  },
24536
24541
  "expectedSourceRevision": {
24537
- "type": "string"
24542
+ "type": "string",
24543
+ "description": "Echo sourceRevision from the first execution response on continuation. With proposalId, pins the candidate source rather than the current model."
24538
24544
  }
24539
24545
  },
24540
24546
  "required": [],
@@ -11,7 +11,7 @@
11
11
  ## Admission
12
12
 
13
13
  Sources, streams and command/specification routes bind and reference-execute as
14
- **ESM v8** on Screenplay 4.125.0. Current evidence: released `event-sources.md`,
14
+ **ESM v8** since Screenplay 4.125.0. Current evidence: released `event-sources.md`,
15
15
  `specifications.md`, `Versions.cs`; the complete example below compiled with
16
16
  `--warnaserror` and passed `screenplay test` on 4.125.0.
17
17
 
@@ -7,9 +7,9 @@ bind as v8, v7 reaches Stage planning, reference tests have CLI/MCP routes, and
7
7
  exact numbers are documented in the grammar. Compiler syntax: `cheat-sheet.md`.
8
8
 
9
9
  1. Clean V1 is not executable: binding errors appear through MCP (V2), `render` or `cratis screenplay validate --executable` (bundled compiler, writes nothing). Neither `screenplay <folder>` nor plain `cratis screenplay validate` binds. [probed]
10
- 2. The Screenplay samples validate clean but are not all executable; copying their idioms (filtered queries, `@pii`, `today`, `reads`, `$causedBy`, templates, performers) breaks V3. [probed]
10
+ 2. The Screenplay samples validate clean but are not all executable; copying their idioms (context-filtered queries, enum/identity compliance, `today`, `reads`, `$causedBy`, templates, performers) can block V3. Caller-supplied collection equality filters bind since 4.143.0 (ESM v14); read read-surface `references/equality-filters.md`. [historical probes; current filter source checked]
11
11
  3. Know the target mode (design/executable/renderable) before writing; state it.
12
- 4. Plain `produces` without `for` means allocation in the ESM but "the identifier" in rendered code. Always write `for <identifier>`. [PLAY0478 probed]
12
+ 4. Plain `produces` without `for` means allocation in the ESM but "the identifier" in rendered code. Always write `for <identifier>` on a plain `produces <Name>`; inline `produces event <Name>` omits `for` and defaults to the identifier. [PLAY0478 probed]
13
13
  5. PLAY0029 is a warning: a misspelled keyword (or `type` inside a slice) drops the construct silently. Use `--warnings-as-errors`. [probed]
14
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]
15
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.
@@ -104,13 +104,25 @@ never "specifications pass".
104
104
  ## V4: reference specifications run
105
105
 
106
106
  Run `screenplay test <root> [--filter <exact-address>] [--format text|json]` on
107
- 4.125.0, or MCP `run-specifications`. The compile command alone still does not
107
+ the standalone pin, or MCP `run-specifications`. The compile command alone still does not
108
108
  execute scenarios. Reference execution is in-memory: no external services or
109
109
  opaque code run. Record route, expected versus discovered/selected counts,
110
110
  passed, failed and unsupported outcomes. Exit 0 means all selected passed; 1
111
111
  failed, 2 could not run/invalid input or selection, 3 unbound or unsupported.
112
112
  Unknown filters refuse rather than select zero. No discovered specifications
113
- is not proof of coverage.
113
+ is not proof of coverage. `test` rejects `--no-color` (exit 2).
114
+
115
+ MCP selectors are `specification` (exact address/id) and `scope` (prefix);
116
+ both supplied mean intersection. `offset`/`limit` page results; continuation
117
+ requires `expectedSourceRevision`. On **Screenplay 4.145.0 and later**, pass
118
+ `proposalId` between proposal review and `apply` to run the retained candidate
119
+ read-only. Without that argument it runs the workspace. A candidate
120
+ V4 belongs only to its returned source revision, not to the disk model.
121
+ Unknown/applied/discarded/reopened proposals give `UnknownProposal`.
122
+ A statically impossible `then` reports PLAY0285: the whole model is unbound,
123
+ exit 3, and no specifications run. Details and source evidence:
124
+ [reference execution](../../cratis-screenplay-model-authoring/references/mcp-tools.md#run-reference-specifications).
125
+
114
126
  The reference runner returns unsupported for a specification that reads a reducer-built read
115
127
  model and for any construct whose evaluation needs an opaque body.
116
128
 
@@ -3,6 +3,7 @@
3
3
  ## Contents
4
4
 
5
5
  - Pin set
6
+ - Equality-filter rendering boundary
6
7
  - Two compilers, one rule
7
8
  - Commands and exit codes
8
9
  - Model notes gate
@@ -18,11 +19,11 @@ probe; older probes retain their original labels in the other references.
18
19
 
19
20
  | Source | Pin | Evidence |
20
21
  | --- | --- | --- |
21
- | Screenplay language, standalone tool and MCP | **4.144.0** (`b5da55a2`) | Released tag `v4.144.0` and its unchanged published contract; committed model notes and the standalone open-question gate; equality query filters admitted as ESM v14 since 4.143.0 |
22
+ | Screenplay language, standalone tool and MCP | **4.145.0** (`bf58b489`) | Released tag `v4.145.0`, published NuGet tool and byte-identical Golden contract; read-only proposal specification execution with `proposalId`; model notes/open-question gate and ESM v14 equality filters retained |
22
23
  | cratis CLI | **3.53.1** | Released tag `v3.53.1`; source-checked, not a new render/browser probe |
23
24
  | Screenplay bundled by CLI | **4.137.0** | CLI `v3.53.1:Directory.Packages.props`; enum-number authoring, not v12 binding |
24
25
  | Stage bundled by CLI | **4.73.1** | Same file; Stage's own `Directory.Packages.props` also pins Screenplay 4.137.0 |
25
- | Latest standalone Stage released when this was checked | **4.76.0** (Screenplay 4.139.0) | Released tag `v4.76.0`; no cli release bundles Stage 4.74.0 to 4.76.0, so a cli user observes none of it. It admits ESM v1 to v12 (v11 from 4.75.0, v12 from 4.76.0), renders UUID-concept generated values and responses (4.74.0) and explicit enum numbers (4.76.0). Its scaffold pins match 4.73.1 (Arc 22.68.0, Chronicle 19.45.0, frontend pins); `Directory.Packages.props` takes Scene 4.21.0 |
26
+ | Historical standalone Stage source baseline | **4.76.0** (Screenplay 4.139.0) | Released tag `v4.76.0`; no cli release bundles Stage 4.74.0 to 4.76.0, so a cli user observes none of it. It admits ESM v1 to v12 (v11 from 4.75.0, v12 from 4.76.0), renders UUID-concept generated values and responses (4.74.0) and explicit enum numbers (4.76.0). Its scaffold pins match 4.73.1 (Arc 22.68.0, Chronicle 19.45.0, frontend pins); `Directory.Packages.props` takes Scene 4.21.0 |
26
27
  | Screenplay.Generation / CritterStack / Prologue bundled by CLI | **0.18.0 / 0.24.0 / 2.0.0** | CLI `v3.53.1:Directory.Packages.props`. Latest released: Generation 0.18.1, CritterStack 0.26.0, Prologue 2.0.0 (no release after 2.0.0); the newer Generation and CritterStack releases are not in a cli |
27
28
  | Cratis.Arc.Screenplay bundled by CLI | **22.54.0** | Same file; this is the generator package, not a blanket rendered-app dependency pin |
28
29
  | Chronicle / Fundamentals bundled by CLI | **19.32.0 / 7.22.8** | Same file |
@@ -52,9 +53,25 @@ and `Source/Cli.Specs/for_AiMcpRegistration/when_installing/with_a_composed_prof
52
53
  at tag `v3.46.1` (CLI#322 / CLI#311). This minimum does not re-label the compiler
53
54
  or renderer probes below as results from the newer bundle.
54
55
 
56
+ ## Equality-filter rendering boundary
57
+
58
+ Caller-supplied collection equality filters shipped in Screenplay **4.143.0**
59
+ (decision 0069), selecting ESM v14; the standalone **4.145.0** pin binds and
60
+ reference-tests them. No-filter models retain their version/bytes/revision.
61
+ The latest released Stage checked for this boundary, **4.80.0**, admits through
62
+ v13 (`Source/Rendering.Cratis/Semantics/SemanticVersionFeatures.cs:100`,
63
+ `EsmSchemaV13Support`) and refuses authored filters in its legacy renderer
64
+ (`Renderers/QueryAdmission.cs:13-22`); it pins Screenplay 4.141.0. It does not
65
+ admit v14. CLI **3.53.1** still bundles Screenplay **4.137.0** / Stage **4.73.1**,
66
+ whose audited pair ceiling is v10 (`SemanticVersionFeatures.cs:89`). These are
67
+ source checks at Stage `v4.80.0` / `v4.73.1` and CLI `v3.53.1`, not new render
68
+ probes or scaffold dependency upgrades. A future consumer must explicitly admit
69
+ v14 and preserve equality selection rather than drop filters. Complete examples:
70
+ read-surface [equality filters](../../cratis-screenplay-read-surface/references/equality-filters.md).
71
+
55
72
  ## Two compilers, one rule
56
73
 
57
- Standalone Screenplay 4.144.0 and CLI 3.53.1's 4.137.0 bundle are different releases.
74
+ Standalone Screenplay 4.145.0 and CLI 3.53.1's 4.137.0 bundle are different releases.
58
75
  Prefer standalone for the current language checks; CLI owns generation, Prologue
59
76
  and rendering. Name the tool/version with every verdict. No verdict transfers
60
77
  between differing compilers without checking the same inputs there.
@@ -76,13 +93,16 @@ conflicts: `cratis-screenplay-model-authoring`.
76
93
  | Completeness | Add `--check <name>[,<name>]` (repeatable) or `--check all` | Opt-in warnings; whole-source errors skip checks, not pass them |
77
94
  | CLI source validation | `cratis screenplay validate <root> --warnings-as-errors -o json-compact` | Read producer exit and JSON errors/warnings/file count. Passing source-only probe on CLI 3.41.0: dependencies example, exit 0 |
78
95
  | Binding | MCP workspace readiness and `executable-diagnostics` | V2 reads diagnostics; V3 requires binding with no blocking diagnostics |
79
- | Reference specifications | `screenplay test <root> [--filter <address>] [--format text|json]`, or MCP `run-specifications` | 0 all selected passed; 1 failed; 2 could not run/invalid selection; 3 unsupported or unbound. Counts of zero do not prove coverage |
96
+ | Reference specifications | `screenplay test <root> [--filter <address>] [--format text|json]`, or MCP `run-specifications` (`specification`, `scope`, `offset`, `limit`, `expectedSourceRevision`; `proposalId` from 4.145.0) | 0 all selected passed; 1 failed; 2 invalid arguments/input/selection or IO; 3 unsupported or unbound. `test` rejects `--no-color`; counts of zero do not prove coverage |
80
97
  | Rendering | `cratis render` | Separate admission, publication, target build and target tests (V5) |
81
98
 
82
99
  Source validation does not bind or run attached code. Reference execution is
83
100
  in-memory and does not run opaque attachments or external services. CLI-derived
84
101
  specification IDs need not match persisted MCP identities after renames; use MCP
85
- for identity-stable selection.
102
+ for identity-stable selection. On Screenplay **4.145.0 and later**, run a retained
103
+ proposal read-only with `proposalId` after review and before apply. Without that
104
+ argument it runs the current workspace. An impossible `then` (PLAY0285)
105
+ unbinds the entire model and prevents every specification running.
86
106
 
87
107
  ## Model notes gate
88
108
 
@@ -6,6 +6,8 @@ license: MIT
6
6
 
7
7
  # UI composition in Screenplay
8
8
 
9
+ Read [preferred syntax](../cratis-screenplay-toolchain/references/preferred-syntax.md) when writing or reviewing `.play`.
10
+
9
11
  Event Modeling's wireframe step is a first-class part of the language. The shell,
10
12
  the reusable shapes inside it, the forms bound to commands, and the navigation
11
13
  entries other modules contribute are all declared in the `.play` model.
@@ -17,17 +19,11 @@ a trigger value named `file` is written `@file`.
17
19
 
18
20
  ## Locate the model
19
21
 
20
- Look first for the project's existing `.play` files: the folder holding them is the
21
- model. A new model goes under the repository's `Source/` or `src/` folder, else in a
22
- `Screenplay/` folder at the repository root; never under `.cratis/`, which holds
23
- configuration and the shared AI corpus only. This is the
24
- conventional home for consumer-owned `.play` source; do not invent another
25
- location or search the whole repository before checking it.
26
-
27
- `cratis ai install` manages `.cratis/ai/`, never model files. Never
28
- hand-copy Screenplay source between repositories. Keep Markdown that explains,
29
- questions or navigates the model in the repository's documentation; the `.play`
30
- source is the single flow model.
22
+ Look first for the project's existing `.play` files: their folder is the model.
23
+ For a new model, check `Source/` or `src/`, else use `Screenplay/` at the repository
24
+ root. Never put a model under `.cratis/` or hand-copy it between repositories.
25
+ `cratis ai install` manages `.cratis/ai/`, never model files. Keep explanatory
26
+ Markdown in project documentation; `.play` is the single flow model.
31
27
 
32
28
  ## Verified product sources
33
29
 
@@ -70,7 +70,7 @@ model owner's decision.
70
70
  | `STAGE-ESM-005` | Code validation or rule predicate bodies; or a command beyond the first capability (optional event property, event revision other than the first, validation or requirement that cannot be rendered, no `produces`) | Use declarative validation; non-initial event generations are not rendered |
71
71
  | `STAGE-ESM-006` | `produces` that cannot render without changing its destination or mappings (`produces when`, literal or computed mappings, `for` not a command identifier, mappings not one-to-one with event properties, duplicate tags) | Map properties one to one; conditional outcomes (`produces when`) are a different behavior, so gap-fill unless the owner accepts splitting them into commands |
72
72
  | `STAGE-ESM-007`, `-008`, `-009` | Projection count per read model (exactly one projection or reducer each); unresolvable properties or no single read-model transition (**flat** projections only); affected instance not one, not keyed by an event property, or not the event-source identity (flat projections only) | One projection per read model; see "Projections" below |
73
- | `STAGE-ESM-010` | A query is neither an optional snapshot lookup by the read-model identifier nor an observable collection query (for example a snapshot list); each query is checked on its own. Observable list queries (keyed or unkeyed) render since Stage 4.49.0. Through Stage 4.79.0 (so in cratis CLI 3.53.1, which bundles 4.73.1) an optional snapshot lookup whose key concept has validation rules is refused; Stage 4.79.1 renders a scalar validated key, in keyed lookups and filtered observable collections, as its primitive and converts it inside the query, so an out-of-rule key finds no instance instead of failing validation, and still refuses a validated concept inside a composite or collection argument (Stage `v4.79.1` `Source/Rendering.Cratis/Semantics/SemanticCratisAdmission.StateView.cs:117-141`) | Keyed `XById => X optional` queries or `observable` lists; a snapshot list is gap-fill. `filter`, `scoped to`, `performer` queries do not bind (`PLAY0268`) |
73
+ | `STAGE-ESM-010` | A query is neither an optional snapshot lookup by the read-model identifier nor an observable collection query (for example a snapshot list); each query is checked on its own. Observable list queries (keyed or unkeyed) render since Stage 4.49.0. Through Stage 4.79.0 (so in cratis CLI 3.53.1, which bundles 4.73.1) an optional snapshot lookup whose key concept has validation rules is refused; Stage 4.79.1 renders a scalar validated key, in keyed lookups and filtered observable collections, as its primitive and converts it inside the query, so an out-of-rule key finds no instance instead of failing validation, and still refuses a validated concept inside a composite or collection argument (Stage `v4.79.1` `Source/Rendering.Cratis/Semantics/SemanticCratisAdmission.StateView.cs:117-141`) | Keyed `XById => X optional` queries or `observable` lists; a snapshot list is gap-fill. Caller-supplied collection equality filters bind as v14 since 4.143.0 but exceed this Stage 4.73.1 v10 ceiling (latest checked 4.80.0 admits through v13). Context/single-result filters, opaque scope/performer and composite `by` remain PLAY0268 |
74
74
  | `STAGE-ESM-011` | A specification cannot render (see the rules below) | Reshape it only if the assertion keeps its meaning; otherwise keep the specification, record the gap, and gap-fill with the specification as the oracle. Never weaken or delete it to get a render |
75
75
  | `STAGE-ESM-012` | Generated C# names collide (properties, types, namespaces, constraints) | Rename |
76
76
  | `STAGE-ESM-013` | An event-context value other than `$context.occurred` mapped in `produces` | Map a command property when that preserves the meaning; otherwise gap-fill |
@@ -249,7 +249,7 @@ Whole-model admission needs ESM schema v1 to v4; v5 and v6 are `STAGE-ESM-016`.
249
249
  Not rendered: `Automation` and `Translate` slices (Stage#79, open: the whole automation
250
250
  is gap-fill), reactions and captures, list, observable, filtered and scoped queries,
251
251
  `produces when`, command `handler`s, code validation and opaque policies (they refuse),
252
- composite-key projections, `all`, and compliance attributes (`@pii`, `@sensitive`, which
252
+ composite-key projections, `all`, and compliance markers (`pii`, `secret`, which
253
253
  already fail binding with `PLAY0268`). Any one blocking diagnostic fails the whole plan.
254
254
  A refusal is not a licence to weaken the model: drop no specification, event generation
255
255
  or protection to get a render; keep the model, record the capability gap and gap-fill.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@cratis/pi",
3
- "version": "7.38.2",
3
+ "version": "7.39.0",
4
4
  "description": "Configuration-aware Cratis AI integration for Pi",
5
5
  "type": "module",
6
6
  "files": [