@cratis/pi 7.62.0 → 7.64.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/package/corpus/product-sync.json +9 -9
- package/package/corpus/skills/cratis-application-slice-conformance/SKILL.md +1 -1
- package/package/corpus/skills/cratis-arc-command/references/generated-values.md +27 -12
- package/package/corpus/skills/cratis-arc-command/references/shop-generation.md +17 -6
- package/package/corpus/skills/cratis-fundamentals-concept/SKILL.md +10 -2
- package/package/corpus/skills/cratis-fundamentals-concept/references/shop-generation.md +49 -6
- package/package/corpus/skills/cratis-screenplay-automations-and-translations/SKILL.md +43 -41
- package/package/corpus/skills/cratis-screenplay-automations-and-translations/references/cases-to-specify.md +11 -2
- package/package/corpus/skills/cratis-screenplay-automations-and-translations/references/integration-interview.md +24 -0
- package/package/corpus/skills/cratis-screenplay-automations-and-translations/references/public-events-and-direction.md +76 -10
- package/package/corpus/skills/cratis-screenplay-automations-and-translations/references/realization-and-gap-fill.md +5 -0
- package/package/corpus/skills/cratis-screenplay-automations-and-translations/references/todo-list-example.md +1 -1
- package/package/corpus/skills/cratis-screenplay-automations-and-translations/references/translate-example.md +39 -23
- package/package/corpus/skills/cratis-screenplay-automations-and-translations/references/translation-patterns.md +35 -12
- package/package/corpus/skills/cratis-screenplay-captures-and-reactions/SKILL.md +51 -81
- package/package/corpus/skills/cratis-screenplay-captures-and-reactions/references/atomic-batches-and-source-mappings.md +83 -0
- package/package/corpus/skills/cratis-screenplay-captures-and-reactions/references/capture-map-and-example.md +14 -4
- package/package/corpus/skills/cratis-screenplay-captures-and-reactions/references/reaction-forms.md +59 -0
- package/package/corpus/skills/cratis-screenplay-captures-and-reactions/references/record-capture-specifications.md +60 -0
- package/package/corpus/skills/cratis-screenplay-captures-and-reactions/references/specifying-triggers-and-clock.md +5 -1
- package/package/corpus/skills/cratis-screenplay-command-surface/SKILL.md +37 -30
- package/package/corpus/skills/cratis-screenplay-command-surface/references/date-comparisons.md +100 -0
- package/package/corpus/skills/cratis-screenplay-command-surface/references/described-handlers.md +82 -0
- package/package/corpus/skills/cratis-screenplay-command-surface/references/generated-values-and-responses.md +82 -28
- package/package/corpus/skills/cratis-screenplay-command-surface/references/protected-reads.md +113 -0
- package/package/corpus/skills/cratis-screenplay-command-surface/references/shop-generation.md +45 -12
- package/package/corpus/skills/cratis-screenplay-command-surface/references/text-and-match-rules.md +119 -0
- package/package/corpus/skills/cratis-screenplay-command-surface/references/validate-rules.md +26 -6
- package/package/corpus/skills/cratis-screenplay-command-surface/verification.json +13 -3
- package/package/corpus/skills/cratis-screenplay-event-modeling/SKILL.md +12 -12
- package/package/corpus/skills/cratis-screenplay-event-modeling/references/parsed-not-runnable.md +5 -3
- package/package/corpus/skills/cratis-screenplay-event-modeling/verification.json +5 -1
- package/package/corpus/skills/cratis-screenplay-legacy-extraction/SKILL.md +2 -2
- package/package/corpus/skills/cratis-screenplay-legacy-extraction/references/evidence-table-template.md +1 -1
- package/package/corpus/skills/cratis-screenplay-legacy-extraction/references/generated-recovery.md +51 -14
- package/package/corpus/skills/cratis-screenplay-legacy-extraction/references/intent-example.md +5 -0
- package/package/corpus/skills/cratis-screenplay-legacy-extraction/references/loss-report-template.md +2 -1
- package/package/corpus/skills/cratis-screenplay-legacy-extraction/references/rule-modeling.md +6 -3
- package/package/corpus/skills/cratis-screenplay-legacy-extraction/references/signal-to-intent.md +1 -1
- package/package/corpus/skills/cratis-screenplay-model-authoring/SKILL.md +22 -28
- package/package/corpus/skills/cratis-screenplay-model-authoring/references/choosing-generation.md +20 -7
- package/package/corpus/skills/cratis-screenplay-model-authoring/references/language-reference.md +13 -6
- package/package/corpus/skills/cratis-screenplay-model-authoring/references/mcp-loop.md +9 -1
- package/package/corpus/skills/cratis-screenplay-model-authoring/references/mcp-tools.md +58 -10
- package/package/corpus/skills/cratis-screenplay-model-authoring/verification.json +4 -2
- package/package/corpus/skills/cratis-screenplay-model-review/SKILL.md +2 -5
- package/package/corpus/skills/cratis-screenplay-model-review/references/anti-patterns.md +2 -2
- package/package/corpus/skills/cratis-screenplay-model-review/references/checklist.md +2 -2
- package/package/corpus/skills/cratis-screenplay-model-review/references/quick-self-check.md +2 -1
- package/package/corpus/skills/cratis-screenplay-model-review/references/review-questions.md +3 -2
- package/package/corpus/skills/cratis-screenplay-modeling-lifecycle/references/principles.md +1 -1
- package/package/corpus/skills/cratis-screenplay-modeling-lifecycle/references/vocabulary-map.md +1 -1
- package/package/corpus/skills/cratis-screenplay-read-surface/SKILL.md +2 -3
- package/package/corpus/skills/cratis-screenplay-read-surface/references/named-keys.md +3 -1
- package/package/corpus/skills/cratis-screenplay-render-and-gap-fill/SKILL.md +8 -3
- package/package/corpus/skills/cratis-screenplay-render-and-gap-fill/references/gap-fill-handoff.md +8 -0
- package/package/corpus/skills/cratis-screenplay-render-and-gap-fill/references/renderability-gate.md +6 -4
- package/package/corpus/skills/cratis-screenplay-scenario-coverage/SKILL.md +48 -30
- package/package/corpus/skills/cratis-screenplay-scenario-coverage/references/berth-reservations.md +10 -4
- package/package/corpus/skills/cratis-screenplay-scenario-coverage/references/invoicing-dues-design.md +15 -4
- package/package/corpus/skills/cratis-screenplay-scenario-coverage/references/invoicing-dues-example.md +25 -20
- package/package/corpus/skills/cratis-screenplay-scenario-coverage/references/public-event-coverage.md +14 -3
- package/package/corpus/skills/cratis-screenplay-scenario-coverage/references/scenario-examples.md +9 -3
- package/package/corpus/skills/cratis-screenplay-scenario-coverage/references/spec-forms-by-mode.md +9 -4
- package/package/corpus/skills/cratis-screenplay-slice-design/SKILL.md +3 -1
- package/package/corpus/skills/cratis-screenplay-slice-design/references/command-inventory.md +4 -4
- package/package/corpus/skills/cratis-screenplay-slice-design/references/rule-layers.md +4 -2
- package/package/corpus/skills/cratis-screenplay-slice-design/references/slicing.md +4 -3
- package/package/corpus/skills/cratis-screenplay-slice-design/references/worked-example.md +8 -8
- package/package/corpus/skills/cratis-screenplay-specifications/SKILL.md +69 -47
- package/package/corpus/skills/cratis-screenplay-specifications/references/actions-beyond-commands.md +11 -1
- package/package/corpus/skills/cratis-screenplay-specifications/references/generated-fixtures.md +48 -17
- package/package/corpus/skills/cratis-screenplay-specifications/references/outcome-comparison.md +6 -0
- package/package/corpus/skills/cratis-screenplay-specifications/references/vocabulary.md +14 -1
- package/package/corpus/skills/cratis-screenplay-streams-and-consistency/SKILL.md +25 -21
- package/package/corpus/skills/cratis-screenplay-streams-and-consistency/references/boundaries.md +2 -2
- package/package/corpus/skills/cratis-screenplay-streams-and-consistency/references/consistency-and-concurrency.md +9 -3
- package/package/corpus/skills/cratis-screenplay-streams-and-consistency/references/multi-service-models.md +4 -3
- package/package/corpus/skills/cratis-screenplay-streams-and-consistency/references/streams-example.md +7 -0
- package/package/corpus/skills/cratis-screenplay-toolchain/SKILL.md +32 -22
- package/package/corpus/skills/cratis-screenplay-toolchain/references/cheat-sheet-example.md +3 -1
- package/package/corpus/skills/cratis-screenplay-toolchain/references/cheat-sheet.md +47 -2
- package/package/corpus/skills/cratis-screenplay-toolchain/references/diagnostic-arguments.md +60 -0
- package/package/corpus/skills/cratis-screenplay-toolchain/references/diagnostics.md +66 -6
- package/package/corpus/skills/cratis-screenplay-toolchain/references/executable-subset.md +67 -23
- package/package/corpus/skills/cratis-screenplay-toolchain/references/generation-checks.md +93 -0
- package/package/corpus/skills/cratis-screenplay-toolchain/references/generation-strategies-example.md +117 -35
- package/package/corpus/skills/cratis-screenplay-toolchain/references/language-admission.md +61 -0
- package/package/corpus/skills/cratis-screenplay-toolchain/references/preferred-syntax.md +3 -1
- package/package/corpus/skills/cratis-screenplay-toolchain/references/renderable-subset.md +27 -10
- package/package/corpus/skills/cratis-screenplay-toolchain/references/screenplay-contract.json +3489 -335
- package/package/corpus/skills/cratis-screenplay-toolchain/references/screenplay-contract.version +1 -1
- package/package/corpus/skills/cratis-screenplay-toolchain/references/traps.md +5 -3
- package/package/corpus/skills/cratis-screenplay-toolchain/verification.json +6 -1
- package/package/corpus/skills/cratis-screenplay-ui-composition/SKILL.md +8 -53
- package/package/corpus/skills/cratis-screenplay-ui-composition/references/file-references.md +2 -2
- package/package/corpus/skills/cratis-screenplay-ui-composition/references/interaction-example.md +54 -0
- package/package/corpus/skills/cratis-screenplay-ui-composition/verification.json +6 -3
- package/package/corpus/skills/cratis-stage-rendering-and-sandbox/SKILL.md +30 -29
- package/package/corpus/skills/cratis-stage-rendering-and-sandbox/references/admission.md +39 -9
- package/package/corpus/skills/cratis-stage-rendering-and-sandbox/references/choosing-generation.md +28 -8
- package/package/corpus/skills/cratis-stage-rendering-and-sandbox/references/publication-and-recovery.md +31 -0
- package/package/corpus/skills/cratis-stage-rendering-and-sandbox/references/sandbox-and-specrunner.md +8 -0
- package/package/corpus/skills/cratis-stage-rendering-and-sandbox/verification.json +4 -1
- package/package.json +1 -1
|
@@ -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
|
+
# First sight and updates in record captures
|
|
5
|
+
|
|
6
|
+
Requires Screenplay 4.175.0 or later (`screenplay --version`); older reference evaluators treat fields of a first record as changed. Upgrade before relying on added-only outcomes.
|
|
7
|
+
|
|
8
|
+
For `source api`, webhook, poll and other record sources, a first record of a typed key is **added only**. `when <field>`, field-change `and`/`or` and transitions need an earlier record of that same key. For an update scenario, seed it with `given capture`. A baseline for another key does not count. To record both first sight and later changes, use separate appends with `when added` and `when <field>`; do not replace the update guard with `when added`.
|
|
9
|
+
|
|
10
|
+
This applies independently to each child identity in its parent's previous collection and each nested record: a missing/null previous nested value is new, and every child of a new parent is new. Expression guards still evaluate the mapped current record on first sight; maps and unguarded appends keep their meaning. These record fixtures are not valid for `source events`: use typed events instead (automations-and-translations [public event captures](../../cratis-screenplay-automations-and-translations/references/public-events-and-direction.md)).
|
|
11
|
+
|
|
12
|
+
The complete model separates a new observation, an update and an unchanged repeat:
|
|
13
|
+
|
|
14
|
+
```screenplay
|
|
15
|
+
domain LegacyBilling
|
|
16
|
+
module Integration
|
|
17
|
+
feature Invoices
|
|
18
|
+
slice Translate ImportInvoiceStatus
|
|
19
|
+
event InvoiceStatusObserved
|
|
20
|
+
status String
|
|
21
|
+
capture InvoiceRecords
|
|
22
|
+
source api
|
|
23
|
+
api LegacyBilling
|
|
24
|
+
route /invoices
|
|
25
|
+
poll 5m
|
|
26
|
+
key id
|
|
27
|
+
append InvoiceStatusObserved
|
|
28
|
+
when added
|
|
29
|
+
status = $.status
|
|
30
|
+
append InvoiceStatusObserved
|
|
31
|
+
when status
|
|
32
|
+
status = $.status
|
|
33
|
+
specification RecordingFirstSight
|
|
34
|
+
when capture InvoiceRecords
|
|
35
|
+
id = "inv-42"
|
|
36
|
+
status = "sent"
|
|
37
|
+
then InvoiceStatusObserved
|
|
38
|
+
for "inv-42"
|
|
39
|
+
status = "sent"
|
|
40
|
+
specification RecordingAnUpdate
|
|
41
|
+
given capture InvoiceRecords
|
|
42
|
+
id = "inv-42"
|
|
43
|
+
status = "sent"
|
|
44
|
+
when capture InvoiceRecords
|
|
45
|
+
id = "inv-42"
|
|
46
|
+
status = "paid"
|
|
47
|
+
then InvoiceStatusObserved
|
|
48
|
+
for "inv-42"
|
|
49
|
+
status = "paid"
|
|
50
|
+
specification IgnoringAnUnchangedRecord
|
|
51
|
+
given capture InvoiceRecords
|
|
52
|
+
id = "inv-42"
|
|
53
|
+
status = "paid"
|
|
54
|
+
when capture InvoiceRecords
|
|
55
|
+
id = "inv-42"
|
|
56
|
+
status = "paid"
|
|
57
|
+
then no events
|
|
58
|
+
```
|
|
59
|
+
|
|
60
|
+
Run `screenplay <model> --warnaserror` (zero errors/warnings), then `screenplay test <model>` (all three specifications passed). Each specification supplies its own immutable baseline; no last-seen record persists between runs. Reference execution never contacts the configured API and does not prove source acknowledgement or retry safety.
|
|
@@ -3,7 +3,11 @@
|
|
|
3
3
|
**Specify what sets them off** (execution from ESM v6): `when clock "<instant>"`
|
|
4
4
|
for a reaction on `every` or `at`, `when trigger <Trigger>` with its values for one
|
|
5
5
|
on an application trigger, and `given capture` / `when capture <Capture>` with the
|
|
6
|
-
source record's fields for a capture, then the events that should follow.
|
|
6
|
+
source record's fields for a record capture, then the events that should follow.
|
|
7
|
+
For `source events`, use `given <FromEvent>` / `when append <FromEvent>` instead
|
|
8
|
+
(PLAY0701). First sight is `added` only; update guards need the same key's prior
|
|
9
|
+
record or events. See [record capture cases](record-capture-specifications.md) and
|
|
10
|
+
[public event captures](../../cratis-screenplay-automations-and-translations/references/public-events-and-direction.md).
|
|
7
11
|
`given clock` fixes the occurrence time, so values mapped from `$context.occurred`
|
|
8
12
|
can be asserted. Excerpt of the complete example in [complete-examples.md](complete-examples.md):
|
|
9
13
|
|
|
@@ -50,9 +50,8 @@ concept InvoiceStatus : Enum
|
|
|
50
50
|
paid
|
|
51
51
|
```
|
|
52
52
|
|
|
53
|
-
|
|
54
|
-
`
|
|
55
|
-
is why the compiler says *expected … or Enum* rather than listing it among them.
|
|
53
|
+
Primitives: `Uuid`, `String`, `Int`, `Decimal`, `Bool`, `Date`, `DateTime`.
|
|
54
|
+
`Enum` is a separate concept kind; details: `references/enum-numbers.md`.
|
|
56
55
|
Use bare `pii` (`personal` alias) and `secret` on concepts; **Compliance is inherited**.
|
|
57
56
|
Keep protection even when a compiler or renderer refuses it. Read
|
|
58
57
|
[compliance and purposes](references/compliance.md) for ESM v13, binder-only refusals,
|
|
@@ -106,12 +105,12 @@ fix to migrate. `--warnaserror` does not reject information diagnostics.
|
|
|
106
105
|
properties, `reads`, `authorize`, `validate`, `produces`/`handler`, `concurrency`.
|
|
107
106
|
Keep to it.
|
|
108
107
|
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
108
|
+
A file/code `handler` cannot coexist with `produces` and still fails binding
|
|
109
|
+
with PLAY0268. A pending `handler implementation` beside unconditional `produces`
|
|
110
|
+
is a described command (ESM v23): the body owns payload values only. Prefer plain
|
|
111
|
+
`produces` for declarative logic. Read [described handlers](references/described-handlers.md)
|
|
112
|
+
when logic needs prose, for the result contract, PLAY0695–0698, Unsupported
|
|
113
|
+
ImplementationBody and Stage's STAGE-IMPL-002 refusal (no stubs, even in Stub mode).
|
|
115
114
|
|
|
116
115
|
## `identifier` — the stream boundary decision
|
|
117
116
|
|
|
@@ -149,18 +148,11 @@ alias on **every** read (`PLAY0410`), aliases are unique (`PLAY0411`) and must n
|
|
|
149
148
|
match a command property (`PLAY0412`). A `require` path uses the alias, or the
|
|
150
149
|
view name when that view is read once.
|
|
151
150
|
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
`concurrency` block does not fix this: its scope is not the read's watermark, and the
|
|
158
|
-
combination is planned to become an error once protected reads ship.
|
|
159
|
-
When a rule depends on state:
|
|
160
|
-
|
|
161
|
-
- if it is uniqueness, declare a `unique` constraint (below);
|
|
162
|
-
- otherwise state the rule, and say in review that the target implementation
|
|
163
|
-
must enforce it consistently. Do not claim the model guarantees it.
|
|
151
|
+
Opt eligible state reads into application-root `command reads protected` (v25).
|
|
152
|
+
Absence rejects; matching intervening facts conflict. Read [protected reads](references/protected-reads.md)
|
|
153
|
+
for strict admission, paths and PLAY0780–0786. Legacy reads stay unprotected;
|
|
154
|
+
reads/concurrency cannot combine (PLAY0783). Stage refuses protected reads (STAGE-ESM-044), not v25 itself.
|
|
155
|
+
Uniqueness still uses a constraint; reference success is not target realization.
|
|
164
156
|
|
|
165
157
|
Do not use `reads` to fetch data the caller could supply. A composite-key view's `by` block is
|
|
166
158
|
`PLAY0268` (read-surface `references/named-keys.md`).
|
|
@@ -170,8 +162,11 @@ Do not use `reads` to fetch data the caller could supply. A composite-key view's
|
|
|
170
162
|
Each rule takes an optional `severity information|warning|error` and then an
|
|
171
163
|
optional `message "<text>"` (or `$strings.<key>`). The default severity is `error`.
|
|
172
164
|
|
|
173
|
-
The rule vocabulary (`not empty`, `min`/`max`, comparisons, `length`, `matches`, `all`, `rule <Name>`) is in
|
|
165
|
+
The rule vocabulary (`not empty`, `min`/`max`, comparisons, `length`, literal text rules, `matches`, `all`, `rule <Name>`) is in
|
|
174
166
|
[references/validate-rules.md](references/validate-rules.md): read it when choosing or writing a rule form.
|
|
167
|
+
Read [text and match rules](references/text-and-match-rules.md) for ordinal `contains`,
|
|
168
|
+
`not contains`, `starts with`, `ends with` (v24), the portable linear match dialect,
|
|
169
|
+
PLAY0699/0787, Studio repairs and public pattern checks. Text rules are not conditions.
|
|
175
170
|
|
|
176
171
|
⚠️ **Validation severity is not compiler severity.** Every failed rule and
|
|
177
172
|
`require` rejects the command, at `information` and `warning` too; severity only
|
|
@@ -182,11 +177,18 @@ optional `severity`, sharing the condition grammar with `produces … when`:
|
|
|
182
177
|
`and` binds tighter than `or`, parentheses group. A conditional rule is an
|
|
183
178
|
implication: `require isExtension == false or newEndDate > endDate`.
|
|
184
179
|
|
|
180
|
+
Requires Screenplay 4.199.0 (ESM v26; `screenplay --version`) for Date/DateTime
|
|
181
|
+
comparisons; older binders report PLAY0268. Read [date comparisons](references/date-comparisons.md)
|
|
182
|
+
when ordering a retention window with `require to >= from`, comparing instants
|
|
183
|
+
across offsets, or rejecting offset-less inputs before rules. It covers admitted
|
|
184
|
+
positions, PLAY0268/0273, ordinal `then` matching and Stage's v26 refusal.
|
|
185
|
+
|
|
185
186
|
**Rules whose logic is code.** A bare `rule <Name>` has no portable meaning (`PLAY0268`) and a bodied rule binds only as
|
|
186
187
|
opaque code. Read [references/validate-rules.md](references/validate-rules.md) when a rule's logic must live in a `file`
|
|
187
188
|
or fenced code body.
|
|
188
189
|
|
|
189
|
-
**Put format rules on the `concept`, not the command
|
|
190
|
+
**Put format rules on the `concept`, not the command** (except date comparisons,
|
|
191
|
+
which bind only on command properties, not as concept rules). A concept carries its own
|
|
190
192
|
`validate` block and every use inherits it — that is Screenplay's type system, and
|
|
191
193
|
a rule that travels is worth more than one that is repeated.
|
|
192
194
|
|
|
@@ -241,8 +243,11 @@ One `concurrency` block per command; it is not bound (`PLAY0271`) and does not p
|
|
|
241
243
|
|
|
242
244
|
UUID generation/responses bind as v7; serialized concept `generate` selects v15:
|
|
243
245
|
UUIDv7/ULID/TypeID/NanoID/bytes, strict fixtures and whole-source freshness.
|
|
244
|
-
Reuse rejects Concurrency, no append/retry.
|
|
245
|
-
|
|
246
|
+
Reuse rejects Concurrency, no append/retry. Rules select v20 (Requires Screenplay
|
|
247
|
+
4.164.0, `screenplay --version`); pattern/checksum, Int random and attached rules
|
|
248
|
+
select v21 (Requires 4.172.0). Older compilers refuse PLAY0268. Secrets and sequences
|
|
249
|
+
remain refused. Patterns are readable references, not gapless allocators or secrets;
|
|
250
|
+
check digits catch typos, not forgery. Keep uniqueness/freshness enforcement.
|
|
246
251
|
Read [references/generated-values-and-responses.md](references/generated-values-and-responses.md)
|
|
247
252
|
for `generated`, `generate`, `returns`, strict fixtures/freshness and renderer limits.
|
|
248
253
|
|
|
@@ -283,17 +288,19 @@ Four contexts, and **what each omits is load-bearing** — when writing a code b
|
|
|
283
288
|
bundle compatibility and execution are separate checks.
|
|
284
289
|
- [ ] No unintended `PLAY0478` or `PLAY0479` information remains.
|
|
285
290
|
- [ ] At most one command property carries `identifier`, and no event property does.
|
|
286
|
-
- [ ] Format rules live on the `concept
|
|
291
|
+
- [ ] Format rules live on the `concept` except command-only date comparisons;
|
|
292
|
+
state-dependent rules are specifications. DateTime comparisons preserve UTC
|
|
293
|
+
ticks; specs include missing-offset Validation rejection.
|
|
287
294
|
- [ ] Every `authorize` combining policies writes `and`/`or` explicitly.
|
|
288
|
-
- [ ]
|
|
289
|
-
|
|
295
|
+
- [ ] Protected reads opt in, meet admission and distinguish reference protection
|
|
296
|
+
from target realization; legacy reads and `concurrency` imply no protection.
|
|
290
297
|
- [ ] Constraints are `unique` forms; no `file` constraint stands in for another rule.
|
|
291
298
|
- [ ] Each policy has one `require` or one implementation, not both.
|
|
292
299
|
- [ ] Personal data is `pii` on the concept; operational secrets are `secret`;
|
|
293
300
|
no identifier or subject concept carries either. Reasons explain the value,
|
|
294
301
|
while purposes declare basis/retention; run `--check purposes` separately.
|
|
295
|
-
- [ ]
|
|
296
|
-
|
|
302
|
+
- [ ] Described handlers distinguish binding from Unsupported body execution and
|
|
303
|
+
Stage refusal; attached handlers remain unbound. Name the admitting tool.
|
|
297
304
|
- [ ] No event carries an optional property covering two situations.
|
|
298
305
|
|
|
299
306
|
Compiler versions and admission: `cratis-screenplay-toolchain/SKILL.md`.
|
package/package/corpus/skills/cratis-screenplay-command-surface/references/date-comparisons.md
ADDED
|
@@ -0,0 +1,100 @@
|
|
|
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
|
+
# Chronological command date comparisons
|
|
5
|
+
|
|
6
|
+
Requires Screenplay 4.199.0 (ESM v26; `screenplay --version`); older binders refuse date comparisons with PLAY0268. Upgrade the compiler without weakening the rule.
|
|
7
|
+
|
|
8
|
+
Use `==`, `!=`, `>`, `>=`, `<` or `<=` with matching primitives: Date/Date or
|
|
9
|
+
DateTime/DateTime. A concept may type a command property; date rules on the concept
|
|
10
|
+
itself remain refused. These are the admitted positions:
|
|
11
|
+
|
|
12
|
+
| Position | Left | Right |
|
|
13
|
+
| --- | --- | --- |
|
|
14
|
+
| `require`, `produces when` | Required scalar command property | Required scalar command property of the same primitive, or literal |
|
|
15
|
+
| Command/property validation rule | Subject property | Literal only |
|
|
16
|
+
|
|
17
|
+
`Date` orders calendar dates without a time zone. `DateTime` compares UTC instants
|
|
18
|
+
at tick precision (seven fractional digits), including `==`/`!=`: different offsets
|
|
19
|
+
can name equal instants. Literal operands bind to canonical text (`yyyy-MM-dd`, or
|
|
20
|
+
UTC `yyyy-MM-ddTHH:mm:ss.fffffffZ`). An unparsable date literal or an offset-less
|
|
21
|
+
DateTime literal in an admitted position reports PLAY0273.
|
|
22
|
+
|
|
23
|
+
Every participating DateTime input must carry an offset or `Z`. Otherwise input
|
|
24
|
+
validation rejects the command with Validation **before any rule or condition**,
|
|
25
|
+
even if the comparison would short-circuit or its production would be skipped.
|
|
26
|
+
Targets must enforce this before deserialization attaches a local offset, and
|
|
27
|
+
preserve tick precision or refuse the comparison; JavaScript `Date` alone truncates
|
|
28
|
+
precision. Client validators omit date ordering rules. Optional absent values still
|
|
29
|
+
pass validation rules other than `not empty`; optional condition operands refuse.
|
|
30
|
+
|
|
31
|
+
PLAY0268 still refuses mixed Date/DateTime, `$context` operands (including
|
|
32
|
+
`$context.occurred`), `today`, protected read paths, date rules on concepts and
|
|
33
|
+
reaction `where`. A refused whole comparison reports only PLAY0268, without
|
|
34
|
+
validating its literals. A `given clock` does not admit `today` or now.
|
|
35
|
+
Stage refuses v26 with STAGE-ESM-016; standalone binding/reference execution is
|
|
36
|
+
not rendering. Preserve the rule and route delivery to authorized gap-fill.
|
|
37
|
+
|
|
38
|
+
## Retention window and rejection specifications
|
|
39
|
+
|
|
40
|
+
Two required DateTime inputs express a caller-chosen interval, not the server's
|
|
41
|
+
clock. Keep state-dependent retention-policy reads separately protected; this
|
|
42
|
+
example models only interval ordering. `then` matching remains ordinal, as do
|
|
43
|
+
keys, constraints and freshness: preserve the exact produced payload spelling,
|
|
44
|
+
not a different offset that happens to name the same instant.
|
|
45
|
+
|
|
46
|
+
```screenplay
|
|
47
|
+
concept WindowId : Uuid
|
|
48
|
+
module Retention
|
|
49
|
+
feature Windows
|
|
50
|
+
slice StateChange KeepWindow
|
|
51
|
+
command KeepWindow
|
|
52
|
+
windowId WindowId identifier
|
|
53
|
+
from DateTime
|
|
54
|
+
to DateTime
|
|
55
|
+
validate
|
|
56
|
+
require to >= from
|
|
57
|
+
message "The window must not end before it starts"
|
|
58
|
+
produces event WindowKept
|
|
59
|
+
from DateTime = from
|
|
60
|
+
to DateTime = to
|
|
61
|
+
specification AcceptingEqualInstantsWithDifferentOffsets
|
|
62
|
+
when KeepWindow
|
|
63
|
+
windowId = "3fa85f64-5717-4562-b3fc-2c963f66afa6"
|
|
64
|
+
from = "2026-10-01T10:00:00+02:00"
|
|
65
|
+
to = "2026-10-01T08:00:00Z"
|
|
66
|
+
then WindowKept
|
|
67
|
+
for "3fa85f64-5717-4562-b3fc-2c963f66afa6"
|
|
68
|
+
from = "2026-10-01T10:00:00+02:00"
|
|
69
|
+
to = "2026-10-01T08:00:00Z"
|
|
70
|
+
specification RejectingAnInvertedWindowByOneTick
|
|
71
|
+
when KeepWindow
|
|
72
|
+
windowId = "3fa85f64-5717-4562-b3fc-2c963f66afa6"
|
|
73
|
+
from = "2026-10-01T08:00:00.0000002Z"
|
|
74
|
+
to = "2026-10-01T08:00:00.0000001Z"
|
|
75
|
+
then error "The window must not end before it starts"
|
|
76
|
+
specification AcceptingAnIncreasingWindow
|
|
77
|
+
when KeepWindow
|
|
78
|
+
windowId = "3fa85f64-5717-4562-b3fc-2c963f66afa6"
|
|
79
|
+
from = "2026-10-01T08:00:00Z"
|
|
80
|
+
to = "2026-10-01T09:00:00Z"
|
|
81
|
+
then WindowKept
|
|
82
|
+
for "3fa85f64-5717-4562-b3fc-2c963f66afa6"
|
|
83
|
+
from = "2026-10-01T08:00:00Z"
|
|
84
|
+
to = "2026-10-01T09:00:00Z"
|
|
85
|
+
```
|
|
86
|
+
|
|
87
|
+
Extract the complete fence into an ignored `.ai-work/` model folder. Run
|
|
88
|
+
`screenplay <folder> --warnaserror --no-color` (zero errors/warnings), then
|
|
89
|
+
`screenplay test <folder>` (all three specifications passed, none Unsupported).
|
|
90
|
+
|
|
91
|
+
## Missing-offset input rejection
|
|
92
|
+
|
|
93
|
+
Add a `RejectingAMissingOffset` test at the evaluator-request or target input
|
|
94
|
+
boundary: submit `from = "2026-10-01T08:00:00"` with a valid `to`, then reverse which
|
|
95
|
+
input lacks an offset. Expect Validation before any rule, no facts, and the message
|
|
96
|
+
`DateTime command property 'from' requires an explicit offset or Z.` (or `'to'`).
|
|
97
|
+
Include a skipped-condition case where applicable. A typed `.play` fixture with
|
|
98
|
+
that invalid value refuses binding with PLAY0273; `then error` does not turn it
|
|
99
|
+
into an executed runtime rejection. Record the target test separately, not as a
|
|
100
|
+
passing `.play` specification or a `given clock` workaround.
|
package/package/corpus/skills/cratis-screenplay-command-surface/references/described-handlers.md
ADDED
|
@@ -0,0 +1,82 @@
|
|
|
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
|
+
# Described command handlers
|
|
5
|
+
|
|
6
|
+
Requires Screenplay 4.182.0 or later (`screenplay --version`); older compilers refuse pending handlers with PLAY0268.
|
|
7
|
+
|
|
8
|
+
Use a described command when payload computation needs words rather than an invented
|
|
9
|
+
expression. Prefer ordinary `produces` when the logic is declarative. Do not use a
|
|
10
|
+
described body to reject a command or decide how many events to emit.
|
|
11
|
+
|
|
12
|
+
Complete model:
|
|
13
|
+
|
|
14
|
+
```screenplay
|
|
15
|
+
domain Billing
|
|
16
|
+
module Invoices
|
|
17
|
+
feature Fees
|
|
18
|
+
slice StateChange ApplyLateFee
|
|
19
|
+
command ApplyLateFee
|
|
20
|
+
invoiceId String identifier
|
|
21
|
+
daysOverdue Int
|
|
22
|
+
validate
|
|
23
|
+
daysOverdue >= 1 message "The invoice must be overdue"
|
|
24
|
+
handler
|
|
25
|
+
implementation
|
|
26
|
+
hint "Calculate the late fee from overdue days using the agreed daily rate"
|
|
27
|
+
produces LateFeeApplied
|
|
28
|
+
for invoiceId
|
|
29
|
+
event LateFeeApplied
|
|
30
|
+
amount Decimal
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
A pending `implementation` has no `file` or fence. Bare `implementation` is valid;
|
|
34
|
+
optional `hint` lines are ordered, nonblank quoted strings, decoded without trimming.
|
|
35
|
+
One wrapper and at most one payload are permitted. Attaching a file or fence stops
|
|
36
|
+
being a described command: attached handlers still fail binding with PLAY0268 and
|
|
37
|
+
cannot coexist with `produces`.
|
|
38
|
+
|
|
39
|
+
## Result contract v1
|
|
40
|
+
|
|
41
|
+
| Part | Owner |
|
|
42
|
+
| --- | --- |
|
|
43
|
+
| Events, count, order | Declarative; each unconditional `produces` means exactly one event |
|
|
44
|
+
| Destination, routes, allocation, tags and metadata | Declarative |
|
|
45
|
+
| Generated values and response | Declarative; generation precedes the body |
|
|
46
|
+
| Authorization and validation | Declarative; denial or refusal never reaches the body |
|
|
47
|
+
| Event payload values | Body; mappings are non-normative hints, required properties may be unmapped |
|
|
48
|
+
|
|
49
|
+
Mapping type checks still apply. Neither a renderer nor reference execution evaluates
|
|
50
|
+
these payload mappings. Conditional productions, repeated/occurrence productions,
|
|
51
|
+
body-decided cardinality and body rejection are outside this contract.
|
|
52
|
+
|
|
53
|
+
The command selects ESM v23 with `handler: { requirementId, resultVersion: 1 }`.
|
|
54
|
+
The requirements sidecar carries a Pending CommandHandler requirement with ordered
|
|
55
|
+
hints, context/result versions 1, and provisional/ambiguous flags. Consumers must
|
|
56
|
+
explicitly admit this version, never silently drop the body.
|
|
57
|
+
|
|
58
|
+
| Diagnostic | Meaning and action |
|
|
59
|
+
| --- | --- |
|
|
60
|
+
| PLAY0695 (information) | Described command admitted; command and RequirementId name the missing body |
|
|
61
|
+
| PLAY0696 (error) | No productions, including response-only; add unconditional productions |
|
|
62
|
+
| PLAY0697 (error) | Conditional productions; result v1 needs unconditional events |
|
|
63
|
+
| PLAY0698 (error) | Pending intent plus another handler; keep one handler |
|
|
64
|
+
| PLAY0492–0494 | Invalid wrapper, hint or payload composition; fix the source shape |
|
|
65
|
+
|
|
66
|
+
## Execution and realization
|
|
67
|
+
|
|
68
|
+
Reference execution runs the gates, routing and generation in ordinary order, then
|
|
69
|
+
returns Unsupported (`ImplementationBody`) on reaching the body, naming command and
|
|
70
|
+
RequirementId. This also applies through an invoking reaction. No payload mapping runs
|
|
71
|
+
and no event is emitted. Denial and validation specifications still execute. Unsupported
|
|
72
|
+
specifications are counted separately; an all-Unsupported run is never green.
|
|
73
|
+
|
|
74
|
+
Stage admits v23 but refuses described handlers with STAGE-IMPL-002 in the renderer,
|
|
75
|
+
Host and specification executor, including Stub mode: it emits no stubs. Hand-write
|
|
76
|
+
the body against the declared contract as authorized gap-fill; do not claim that a
|
|
77
|
+
pending requirement is implementation evidence. Moving the body into `handler file`
|
|
78
|
+
keeps its RequirementId but does not admit that attached handler alongside `produces`.
|
|
79
|
+
|
|
80
|
+
Validate the model root with `screenplay <root> --warnaserror`; expect no errors or
|
|
81
|
+
warnings and PLAY0695 information. Run `screenplay test <root>` separately: body-reaching
|
|
82
|
+
specifications must be reported Unsupported, not passed. Target tests are separate.
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
# Generated values
|
|
1
|
+
# Generated values, rule proofs and responses
|
|
2
2
|
|
|
3
3
|
## Contents
|
|
4
4
|
|
|
@@ -28,16 +28,17 @@ Only the released generation phase is taught here.
|
|
|
28
28
|
## Choosing a strategy
|
|
29
29
|
|
|
30
30
|
Use the [threaded shop model](shop-generation.md): CustomerId is `cus_` + ULID,
|
|
31
|
-
OrderId is TypeID, InviteCode is NanoID
|
|
32
|
-
|
|
33
|
-
|
|
31
|
+
OrderId is TypeID, InviteCode is NanoID, InvoiceNumber is a readable pattern with
|
|
32
|
+
Luhn check digit, and TicketNumber is a random Int value. Keep short references
|
|
33
|
+
separate from event-source identities. The table below owns exact strategy shapes.
|
|
34
34
|
|
|
35
35
|
## When not to
|
|
36
36
|
|
|
37
37
|
Client-minted values remain inputs. Generation is not authorization, idempotency,
|
|
38
|
-
gapless invoice allocation or a credential contract.
|
|
39
|
-
|
|
40
|
-
|
|
38
|
+
gapless/sequential invoice allocation or a credential contract. A pattern is not
|
|
39
|
+
an allocator; check digits catch typing mistakes, not forgery. Preserve ApiKey's
|
|
40
|
+
`secret` classification without generated properties: generated secrets remain
|
|
41
|
+
refused, not a reason to strip protection.
|
|
41
42
|
|
|
42
43
|
## The concept declares how; the property declares that
|
|
43
44
|
|
|
@@ -46,7 +47,7 @@ strategies on concepts and `generated`/`generated identifier` on properties.
|
|
|
46
47
|
It includes whole-value fixture pins and returned IDs.
|
|
47
48
|
|
|
48
49
|
A generated property must be a required scalar **concept**, not a bare primitive,
|
|
49
|
-
optional value or collection.
|
|
50
|
+
optional value or collection. Uuid/String generation and Int `random` are executable.
|
|
50
51
|
A Uuid concept implicitly generates `uuid`; String needs an explicit strategy.
|
|
51
52
|
Each concept owns at most one `generate` line; there is no per-property override.
|
|
52
53
|
Generated identifiers need Uuid or String backing and at least 64 random bits.
|
|
@@ -59,6 +60,9 @@ Generated identifiers need Uuid or String backing and at least 64 random bits.
|
|
|
59
60
|
| `typeid "user"` | String | TypeID 0.3, lowercase Crockford UUIDv7 suffix; 74 random bits; prefix 1–63 lowercase letters/underscores, no leading/trailing underscore; empty prefix omits separator |
|
|
60
61
|
| `nanoid [size]` | String | Default 21 symbols from `A-Za-z0-9_-`; size 1–256; entropy is size × log2(alphabet size) |
|
|
61
62
|
| `bytes <count> base64url` / `hex` / `base32` | String | Count 1–512; 8 × count random bits; RFC 4648 without padding; hex lowercase, base32 uppercase; unused trailing bits zero |
|
|
63
|
+
| `pattern "INV-{yyyy}{MM}-#{7}" checksum luhn` | String | Finite readable reference; UTC dates and check digits add no entropy |
|
|
64
|
+
| `random 100000..999999` | Int | Inclusive signed Int64 interval; numeric value, not an identifier |
|
|
65
|
+
| `rule Name` | String | Exactly one file or tagged fence; opaque ValueGeneration implementation with language-neutral Now/Tenant context, String result and unknown entropy |
|
|
62
66
|
|
|
63
67
|
Modifiers occur once each, in any authored order. `prefix "text"` is printable
|
|
64
68
|
ASCII, at most 32 characters, on uuid/uuidv7/ulid/nanoid/bytes; UUID prefixes need
|
|
@@ -71,17 +75,31 @@ identifier; non-identifiers warn PLAY0683 unless a single-property unique
|
|
|
71
75
|
constraint covers the mapped event property. That suppression is not a runtime collision guarantee; use the constraint when
|
|
72
76
|
collisions must reject the command.
|
|
73
77
|
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
+
Requires Screenplay 4.172.0 or later (`screenplay --version`) for pattern/random/rule
|
|
79
|
+
and String-concept `validate checksum luhn|mod11|mod97` (ESM v21); older compilers
|
|
80
|
+
refuse them with PLAY0268. Pattern `#` draws a digit, `?` an uppercase letter,
|
|
81
|
+
`*` an uppercase letter or digit; positive ASCII classes and `{n}`/`{m,n}` repeats
|
|
82
|
+
up to 64 are supported. `{yyyy}`, `{yy}`, `{MM}`, `{dd}` use one UTC date.
|
|
83
|
+
The expanded value, including check digits, is at most 256 characters. Only pattern
|
|
84
|
+
accepts `checksum`; write literals/classes rather than prefix/case/alphabet modifiers.
|
|
85
|
+
Read Cratis/Screenplay `Documentation/screenplay/generated-values/patterns.md`
|
|
86
|
+
for escaping and support limits. PLAY0691 means support counting exhausted its
|
|
87
|
+
budget; PLAY0692 means some date in the 100-year assessment horizon has empty
|
|
88
|
+
support. Neither is a proof warning or permission to redraw.
|
|
89
|
+
|
|
90
|
+
Checksum generation appends one Luhn/Mod11 digit or two Mod97 digits over preceding
|
|
91
|
+
ASCII digits, including date/literal digits. Author `validate checksum` separately
|
|
92
|
+
for arithmetic validation of supplied/stored values and fixtures; generation alone
|
|
93
|
+
checks only suffix shape on fixtures. `generate sequence` stays reserved (PLAY0682),
|
|
94
|
+
and compliance markers on generated concepts, including secrets, remain refused.
|
|
95
|
+
Never remove classification to make a model bind.
|
|
78
96
|
|
|
79
97
|
## Inspect and edit generation through MCP
|
|
80
98
|
|
|
81
99
|
A concept `generation` summary and entropy repairs are available.
|
|
82
100
|
Use `screenplay_declaration_details` with `kind: "Concept"`, `view: "summary"`:
|
|
83
101
|
only authored `generate` gets a block, with strategy, set modifiers,
|
|
84
|
-
|
|
102
|
+
`arguments`, `supportCount`, `entropyBits`, `entropyUnknownReason` when null,
|
|
85
103
|
`valuesAtOnePercentCollision` and `executable.status`. Status is `admitted` only
|
|
86
104
|
after whole-model binding, `refused` for errors at this concept/generation, or
|
|
87
105
|
`notAssessed` with a reason for unrelated binding failures. Empty local codes do
|
|
@@ -91,7 +109,7 @@ Set/change/remove `generate` through `screenplay_propose_ast` (replace the conce
|
|
|
91
109
|
`GenerationSyntax`, omit/null `generation` to remove) or reviewed
|
|
92
110
|
`screenplay_propose_source`; do not hand-edit the text. Inspect executable
|
|
93
111
|
diagnostics independently of authoring acceptance: sequence PLAY0682;
|
|
94
|
-
|
|
112
|
+
support failures PLAY0691/0692; generated-rule proofs PLAY0688/0689. Review, run candidate
|
|
95
113
|
specifications where executable, then apply with revisions.
|
|
96
114
|
|
|
97
115
|
`screenplay_repair_capabilities` advertises PLAY0683/0684; workspace repairs supply
|
|
@@ -104,12 +122,19 @@ individual review and `CanonicalizeTouchedDocuments`, with no pinned evidence.
|
|
|
104
122
|
Length changes affect all concept uses; uniqueness changes append-time behavior.
|
|
105
123
|
PLAY0688 repair replaces a refuted rule with the strategy-derived `matches`
|
|
106
124
|
pattern. Review input/stored-value uses because this changes their validation,
|
|
107
|
-
not just generation.
|
|
125
|
+
not just generation. A deterministic bounded pattern repair also adds the declared
|
|
126
|
+
checksum validation if absent; review both rule changes. Ambiguous derived regexes
|
|
127
|
+
have no repair. Date/checksum digit shapes alone do not prove containment.
|
|
108
128
|
A CLI-bundled MCP can lack this summary and these repairs; it still
|
|
109
129
|
supports existing typed concept proposals.
|
|
110
130
|
|
|
111
|
-
Requires Screenplay 4.
|
|
112
|
-
|
|
131
|
+
Requires Screenplay 4.173.0 or later (`screenplay --version`) for `arguments`,
|
|
132
|
+
exact support counts, `derivedPattern` and authored-order `rules[]`; older servers
|
|
133
|
+
can expose `previewArguments` instead. Read `rules[].status`, `witness` and `reason`
|
|
134
|
+
instead of parsing diagnostic text. Use `derivedPattern` as `matches` through a
|
|
135
|
+
typed proposal; use the discovered PLAY0688 repair to replace a refuted rule.
|
|
136
|
+
A refuted rule without `diagnosticCode` was not checked by the compiler (for example,
|
|
137
|
+
an unused UUID concept), so do not invent a repair. Full fields and mapping limits: [MCP generation guide](../../cratis-screenplay-model-authoring/references/mcp-tools.md#concept-generation).
|
|
113
138
|
Sources: Cratis/Screenplay `Documentation/screenplay/generated-values.md`,
|
|
114
139
|
`Source/DotNET/Screenplay.Mcp/McpGenerationDetails.cs`,
|
|
115
140
|
`Source/DotNET/Screenplay/Workspaces/WorkspaceGenerationRepairs.cs`.
|
|
@@ -135,20 +160,27 @@ that cannot backtrack on generated values. Passing samples alone prove nothing.
|
|
|
135
160
|
Providers validate generated values too: a failing fixture is a Contract violation,
|
|
136
161
|
not client rejection or a reason to redraw. Opaque rules need a target.
|
|
137
162
|
|
|
138
|
-
|
|
163
|
+
Generated-concept validation rules select ESM v20 even on implicit UUID generation.
|
|
164
|
+
No proof status is serialized;
|
|
139
165
|
strategy changes do not silently change rules on stored/input values.
|
|
140
166
|
|
|
167
|
+
Tool and renderer authors: read the toolchain's
|
|
168
|
+
[generation checks](../../cratis-screenplay-toolchain/references/generation-checks.md)
|
|
169
|
+
for declaration checks, value checks, strategy discovery and rule proofs.
|
|
170
|
+
Proof status is not serialized; the reference evaluator always requires pins.
|
|
171
|
+
|
|
141
172
|
## Version and freshness
|
|
142
173
|
|
|
143
174
|
A serialized concept `generation` member selects **v15**. Implicit Uuid generation
|
|
144
175
|
and explicit unmodified Uuid `generate uuid` omit it and preserve earlier executable
|
|
145
|
-
bytes/revision.
|
|
146
|
-
implicit UUIDs. An append whose destination equals any value generated in that
|
|
176
|
+
bytes/revision. Any model with a serialized strategy guards **all** generated destinations,
|
|
177
|
+
including its implicit UUIDs; ESM version alone does not enable the guard. An append whose destination equals any value generated in that
|
|
147
178
|
invocation requires the **whole source** to have no existing facts, regardless
|
|
148
179
|
of stream or event type. Multiple initial facts in one invocation are allowed;
|
|
149
180
|
a skipped production makes no freshness claim. Reuse rejects the whole command
|
|
150
181
|
with `Concurrency`, appends nothing and does not silently regenerate or retry.
|
|
151
|
-
|
|
182
|
+
Models without a serialized strategy are Unguarded and retain legacy fixture
|
|
183
|
+
reuse, even if rules select v20.
|
|
152
184
|
|
|
153
185
|
Freshness is neither authorization nor idempotency. Client-minted identifiers
|
|
154
186
|
remain inputs; protect their invariants with constraints. Never use generation
|
|
@@ -158,7 +190,12 @@ Specifications pin values, not seeds: `for` pins a generated identifier;
|
|
|
158
190
|
`generated <name> = <value>` pins another generated property. The reference
|
|
159
191
|
evaluator draws no randomness. From v15 every pin must match exact strategy
|
|
160
192
|
encoding, size, case, UUID version/variant and zero trailing bits. Invalid pins
|
|
161
|
-
are Contract rejections, not client validation failures.
|
|
193
|
+
are Contract rejections, not client validation failures. Rule-bearing concepts
|
|
194
|
+
also check rules, including implicit UUID. Pin date segments with `given clock`;
|
|
195
|
+
all segments must match the same UTC instant. Without a clock only digit widths
|
|
196
|
+
are checked, never the wall clock. Opaque generation rules consume String pins
|
|
197
|
+
without executing attached code; opaque validation still yields Unsupported.
|
|
198
|
+
Older rule-free implicit-UUID models retain
|
|
162
199
|
canonical UUID checks without a version check. Complete executable examples:
|
|
163
200
|
[generated responses](../../cratis-screenplay-toolchain/references/generated-responses-example.md)
|
|
164
201
|
and [generation strategies](../../cratis-screenplay-toolchain/references/generation-strategies-example.md).
|
|
@@ -188,7 +225,7 @@ and [generation strategies](../../cratis-screenplay-toolchain/references/generat
|
|
|
188
225
|
## What the CLI and Stage realize
|
|
189
226
|
|
|
190
227
|
Stage emits strategy-specific `IGeneratable<T>.New()` factories over Fundamentals
|
|
191
|
-
7.
|
|
228
|
+
7.25.0 or later for pattern/random/checksum (via the Arc scaffold pin in Stage's `references/rendered-application.md`). v15 generated destinations use explicit
|
|
192
229
|
`EventsWithConcurrencyScopes` with `BeforeFirst` whole-source scopes; Chronicle
|
|
193
230
|
checks atomically at append: a batch's scopes are checked once against the state before
|
|
194
231
|
the batch, all or nothing, and a storage retry that renumbers the append checks them again. Generated rejection specs assert
|
|
@@ -201,10 +238,12 @@ Requires Stage 4.94.0 or later for receipt-time generation; older factories use
|
|
|
201
238
|
|
|
202
239
|
| Refusal | Still unsupported |
|
|
203
240
|
| --- | --- |
|
|
204
|
-
| STAGE-ESM-028 |
|
|
205
|
-
| STAGE-ESM-011 | A
|
|
206
|
-
| STAGE-ESM-038 | Routing combined with generation/responses; generated-property rules/requirements
|
|
207
|
-
| STAGE-ESM-038 | Unpinned generation with unordered event
|
|
241
|
+
| STAGE-ESM-028 | `generate rule`, unknown strategies, non-concepts, optional/collection generation; every explicit strategy on the legacy syntax engine |
|
|
242
|
+
| STAGE-ESM-011 | A fixture that does not match its strategy shape or concept rules |
|
|
243
|
+
| STAGE-ESM-038 | Routing combined with generation/responses; generated-property rules/requirements; occurrence parameter/response/factory name collisions; unsupported response sources/composites/collections; generated identifier plus destination-less plain production |
|
|
244
|
+
| STAGE-ESM-038 | Unpinned generation with any Unproven/Refuted concept rule, production-condition reads, unordered event/read-model/query expectations or collision-sensitive generated constraints |
|
|
245
|
+
| STAGE-ESM-042 | Unsupported concept-rule kinds; checksum remains refused only on the legacy syntax path |
|
|
246
|
+
| STAGE-ESM-005 | Opaque/unsupported generated-concept rules, before pin evaluation |
|
|
208
247
|
| STAGE-ESM-004 / -006 | StateChange slices without commands / expression or enum production conditions |
|
|
209
248
|
|
|
210
249
|
Sequence generation is refused at binding (PLAY0682) and never reaches Stage;
|
|
@@ -213,7 +252,22 @@ command `given clock` fixtures render when whole milliseconds at or after 1970;
|
|
|
213
252
|
|
|
214
253
|
Requires Stage 4.95.0 for command clock fixtures, 4.98.0 for multiple commands and
|
|
215
254
|
conditional productions, and 4.100.0 for generated text unique constraints; older
|
|
216
|
-
renderers refuse those shapes.
|
|
255
|
+
renderers refuse those shapes.
|
|
256
|
+
|
|
257
|
+
Requires Stage 4.109.0 for ESM v20 factories plus `ConceptValidator`; older renderers refuse v20.
|
|
258
|
+
Requires Stage 4.115.0 for ESM v21 admission and all-Proven unpinned generation;
|
|
259
|
+
older renderers require pins even for Proven rules. Unproven/Refuted rules still
|
|
260
|
+
require pins (-038), and invalid pins fail -011.
|
|
261
|
+
Requires Stage 4.117.0 for warning/info-severity generated-concept rules; older
|
|
262
|
+
renderers refuse them with -038. Every severity is enforced as a generation defect.
|
|
263
|
+
Requires Stage 4.118.0 for semantic checksum validation and 4.119.0 for
|
|
264
|
+
pattern/random factories, Host sampling and executor fixture checks; older
|
|
265
|
+
renderers refuse those constructs with -042/-028. Dated patterns use receipt-time
|
|
266
|
+
context; Int ranges render as `long`. `generate rule` still refuses -028.
|
|
267
|
+
Requires Arc.Screenplay 22.107.0 for pattern/random/checksum and self-contained
|
|
268
|
+
String-rule recovery; older adapters leave these factories in code. Recovery is
|
|
269
|
+
not Stage rendering: keep refused rule contracts for gap-fill, never delete rules
|
|
270
|
+
or secret classification.
|
|
217
271
|
|
|
218
272
|
Missing pins in generated Debug specs use `AllowGeneration()` with relational
|
|
219
273
|
assertions against captured values; v15 captures also check strategy shape.
|