@cratis/pi 7.21.0 → 7.22.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/package/corpus/skills/cratis-screenplay-automations-and-translations/SKILL.md +19 -12
- package/package/corpus/skills/cratis-screenplay-automations-and-translations/references/audit-format.md +4 -3
- package/package/corpus/skills/cratis-screenplay-automations-and-translations/references/automation-patterns.md +13 -15
- package/package/corpus/skills/cratis-screenplay-automations-and-translations/references/cases-to-specify.md +4 -4
- package/package/corpus/skills/cratis-screenplay-automations-and-translations/references/effects-and-idempotency.md +21 -0
- package/package/corpus/skills/cratis-screenplay-automations-and-translations/references/provenance.md +4 -2
- package/package/corpus/skills/cratis-screenplay-automations-and-translations/references/todo-list-example.md +7 -4
- package/package/corpus/skills/cratis-screenplay-automations-and-translations/verification.json +4 -4
- package/package/corpus/skills/cratis-screenplay-captures-and-reactions/SKILL.md +38 -36
- package/package/corpus/skills/cratis-screenplay-captures-and-reactions/references/complete-examples.md +1 -1
- package/package/corpus/skills/cratis-screenplay-captures-and-reactions/references/invocation-identity.md +84 -0
- package/package/corpus/skills/cratis-screenplay-captures-and-reactions/references/refusals-and-redelivery.md +102 -0
- package/package/corpus/skills/cratis-screenplay-captures-and-reactions/references/specifying-triggers-and-clock.md +4 -2
- package/package/corpus/skills/cratis-screenplay-captures-and-reactions/verification.json +1 -1
- package/package/corpus/skills/cratis-screenplay-command-surface/SKILL.md +28 -16
- package/package/corpus/skills/cratis-screenplay-command-surface/references/context.md +9 -0
- package/package/corpus/skills/cratis-screenplay-command-surface/references/generated-values-and-responses.md +15 -13
- package/package/corpus/skills/cratis-screenplay-command-surface/references/operations.md +80 -0
- package/package/corpus/skills/cratis-screenplay-command-surface/references/policy-persona-seed.md +23 -1
- package/package/corpus/skills/cratis-screenplay-command-surface/verification.json +2 -2
- package/package/corpus/skills/cratis-screenplay-discovery/SKILL.md +9 -6
- package/package/corpus/skills/cratis-screenplay-discovery/references/storming-loop.md +6 -5
- package/package/corpus/skills/cratis-screenplay-event-modeling/SKILL.md +7 -5
- package/package/corpus/skills/cratis-screenplay-event-modeling/references/nine-steps.md +6 -5
- package/package/corpus/skills/cratis-screenplay-event-modeling/references/parsed-not-runnable.md +39 -49
- package/package/corpus/skills/cratis-screenplay-legacy-extraction/SKILL.md +5 -3
- package/package/corpus/skills/cratis-screenplay-legacy-extraction/references/generate-notes.md +48 -8
- package/package/corpus/skills/cratis-screenplay-model-authoring/SKILL.md +44 -42
- package/package/corpus/skills/cratis-screenplay-model-authoring/references/language-reference.md +46 -9
- package/package/corpus/skills/cratis-screenplay-model-authoring/references/mcp-loop.md +35 -11
- package/package/corpus/skills/cratis-screenplay-model-authoring/references/mcp-tools.md +118 -13
- package/package/corpus/skills/cratis-screenplay-model-authoring/verification.json +3 -3
- package/package/corpus/skills/cratis-screenplay-model-review/SKILL.md +11 -6
- package/package/corpus/skills/cratis-screenplay-model-review/references/anti-patterns.md +1 -1
- package/package/corpus/skills/cratis-screenplay-model-review/references/checklist.md +11 -2
- package/package/corpus/skills/cratis-screenplay-read-surface/SKILL.md +10 -0
- package/package/corpus/skills/cratis-screenplay-read-surface/references/guarded-actions.md +79 -0
- package/package/corpus/skills/cratis-screenplay-render-and-gap-fill/SKILL.md +9 -7
- package/package/corpus/skills/cratis-screenplay-render-and-gap-fill/references/gap-fill-handoff.md +6 -3
- package/package/corpus/skills/cratis-screenplay-render-and-gap-fill/verification.json +2 -2
- package/package/corpus/skills/cratis-screenplay-scenario-coverage/SKILL.md +3 -2
- package/package/corpus/skills/cratis-screenplay-scenario-coverage/references/spec-forms-by-mode.md +13 -2
- package/package/corpus/skills/cratis-screenplay-slice-design/SKILL.md +3 -2
- package/package/corpus/skills/cratis-screenplay-slice-design/references/command-inventory.md +3 -2
- package/package/corpus/skills/cratis-screenplay-slice-design/references/slicing.md +40 -0
- package/package/corpus/skills/cratis-screenplay-specifications/SKILL.md +24 -16
- package/package/corpus/skills/cratis-screenplay-specifications/references/examples-and-routes.md +103 -0
- package/package/corpus/skills/cratis-screenplay-specifications/references/reactions-and-cascades.md +5 -6
- package/package/corpus/skills/cratis-screenplay-streams-and-consistency/SKILL.md +4 -4
- package/package/corpus/skills/cratis-screenplay-streams-and-consistency/references/stream-patterns.md +4 -2
- package/package/corpus/skills/cratis-screenplay-streams-and-consistency/verification.json +2 -2
- package/package/corpus/skills/cratis-screenplay-toolchain/SKILL.md +34 -32
- package/package/corpus/skills/cratis-screenplay-toolchain/references/cheat-sheet-example.md +1 -1
- package/package/corpus/skills/cratis-screenplay-toolchain/references/cheat-sheet.md +47 -2
- package/package/corpus/skills/cratis-screenplay-toolchain/references/diagnostics.md +57 -9
- package/package/corpus/skills/cratis-screenplay-toolchain/references/doc-contradictions.md +6 -1
- package/package/corpus/skills/cratis-screenplay-toolchain/references/executable-subset.md +19 -10
- package/package/corpus/skills/cratis-screenplay-toolchain/references/provenance.md +4 -2
- package/package/corpus/skills/cratis-screenplay-toolchain/references/renderable-subset.md +8 -1
- package/package/corpus/skills/cratis-screenplay-toolchain/references/sources-and-streams.md +90 -27
- package/package/corpus/skills/cratis-screenplay-toolchain/references/traps.md +10 -6
- package/package/corpus/skills/cratis-screenplay-toolchain/references/verdicts.md +29 -12
- package/package/corpus/skills/cratis-screenplay-toolchain/references/versions.md +91 -136
- package/package/corpus/skills/cratis-screenplay-toolchain/verification.json +7 -5
- package/package/corpus/skills/cratis-screenplay-ui-composition/references/screen-composition-contract.md +20 -0
- package/package/corpus/skills/cratis-stage-rendering-and-sandbox/SKILL.md +9 -5
- package/package/corpus/skills/cratis-stage-rendering-and-sandbox/references/admission.md +8 -1
- package/package/corpus/skills/cratis-stage-rendering-and-sandbox/verification.json +2 -2
- package/package.json +1 -1
|
@@ -74,7 +74,7 @@ the format in `worked-example.md`.
|
|
|
74
74
|
|
|
75
75
|
| Id | Check | Evidence | Tier |
|
|
76
76
|
|---|---|---|---|
|
|
77
|
-
| A1 | Every read-model field maps from an event field, `$eventSourceId`, `$eventContext`, a literal, or a documented derivation (`count`, `add ... by`) | projection blocks; AutoMap name matches (on by default) | D (
|
|
77
|
+
| A1 | Every read-model field maps from an event field, `$eventSourceId`, `$eventContext`, a literal, or a documented derivation (`count`, `add ... by`) | projection blocks; AutoMap name matches (on by default) | D (opt-in PLAY0534 detects known missing origins; unknown coverage still needs a walk. Absent mapping targets warn at V1 with PLAY0514, tier C for source validity) |
|
|
78
78
|
| A2 | Every event field comes from a command input, `$context` value, literal, capture field or reaction mapping | `produces` mappings, capture `map`, reaction `invokes` | C for undeclared names (warning), D for meaning |
|
|
79
79
|
| A3 | Every command input is supplied by someone: screen form field, reaction mapping, capture, or a caller who knows it | screens, forms, reactions | D |
|
|
80
80
|
| A4 | Every command input ends in an event field or is used by a rule | `produces`, `validate`, `require` | Q (an unused input is often a missed fact) |
|
|
@@ -100,7 +100,7 @@ the format in `worked-example.md`.
|
|
|
100
100
|
| C2 | A fact, not a request, a running calculation, a UI action or a technical step | names and payloads | D |
|
|
101
101
|
| C3 | No speculative or pending events ("MayBe...", "...Pending") where a decision is meant | names | Q |
|
|
102
102
|
| C4 | No nullable or optional event property by default: a required value, or a separate event for the second situation (CHR0012; a `null` in a specification value is PLAY0350); a kept `optional` has its reason in the `description` | `optional` members | D |
|
|
103
|
-
| C5 | Sensitive members marked (`@pii`/`@sensitive`) and not mixed across data subjects; operational secrets are `@sensitive`, not `@pii`; no `@pii` or `@sensitive` on the event-source id (no such identifier concept; use a surrogate id; Chronicle CHR0034 and CHR0052, and Screenplay PLAY0515 from 4.69.1 for `@pii` and 4.84.1 for `@sensitive`, only on tools at those versions -
|
|
103
|
+
| C5 | Sensitive members marked (`@pii`/`@sensitive`) and not mixed across data subjects; operational secrets are `@sensitive`, not `@pii`; no `@pii` or `@sensitive` on the event-source id (no such identifier concept; use a surrogate id; Chronicle CHR0034 and CHR0052, and Screenplay PLAY0515 from 4.69.1 for `@pii` and 4.84.1 for `@sensitive`, only on tools at those versions - current pins report it as a source error, including typed destinations and route-id parts); one data subject per event or stream | concepts and members | D; removal to pass tools = critical |
|
|
104
104
|
| C6 | No secret or bearer values as facts (tokens, magic links, signed URLs): record a keyed hash or a reference | event payloads | D |
|
|
105
105
|
| C7 | No two events of one kind of event source mean the same thing (a shared property set is a signal, not a defect: distinct facts may share a shape and historical generations are exempt; major only when meaning is lost, a rule bypassed or consumers ambiguous); one fact is not recorded twice (aggregate event plus per-item fan-out) | event declarations side by side | D |
|
|
106
106
|
| C8 | Corrections are new facts that name what they correct; redaction and crypto-erasure are compliance tools, not corrections | event names | D |
|
|
@@ -131,6 +131,15 @@ the format in `worked-example.md`.
|
|
|
131
131
|
| E9 | A decided refusal is a `then error` or `then denied` specification (permanent behavior), never a lingering open question; only a genuinely unanswered question counts as open, and resolving it means answering it | specs, `STATE.md` questions, descriptions | D |
|
|
132
132
|
|
|
133
133
|
## Phase 8. Flow and lifecycle (13 checks, F1-F13)
|
|
134
|
+
|
|
135
|
+
Review PLAY0516 backward-flow and PLAY0517 sibling-cycle findings as
|
|
136
|
+
**presentation-only** information: they do not fail `--warnaserror`, change
|
|
137
|
+
execution or prove a business deadlock. An ordering root is required; without
|
|
138
|
+
one the folder check is skipped. A real F6 defect needs a named domain
|
|
139
|
+
consequence, not just the diagram's cycle. Suggested graph order and safe
|
|
140
|
+
PLAY0516 moves preserve executable bytes/identities. Source: Screenplay
|
|
141
|
+
`v4.125.0:Documentation/screenplay/imports.md`, `diagnostics.md`.
|
|
142
|
+
|
|
134
143
|
| Id | Check | Evidence | Tier |
|
|
135
144
|
|---|---|---|---|
|
|
136
145
|
| F1 | Each entity has a first fact, a state-transition table (including refused transitions) and terminal states | slices, constraints, `description` | D |
|
|
@@ -231,6 +231,16 @@ block or a named `behavior` attached with `uses`. See
|
|
|
231
231
|
`cratis-screenplay-ui-composition`. Screens and interactions are deferred from the
|
|
232
232
|
executable model (information `PLAY0269`); they never block binding.
|
|
233
233
|
|
|
234
|
+
## Guarded screen actions
|
|
235
|
+
|
|
236
|
+
One labeled user decision can choose among commands using ordered
|
|
237
|
+
`when item.<path> ... execute <Command>` alternatives, with optional last
|
|
238
|
+
`otherwise execute` or `otherwise hidden`. First match wins; no item or no match
|
|
239
|
+
without an execute fallback hides it. Inputs use typed `with ... from ...`
|
|
240
|
+
bindings; the selected command still enforces its own gate/rules/constraints.
|
|
241
|
+
Read [guarded actions](references/guarded-actions.md) for the checked model,
|
|
242
|
+
missing-versus-null behavior and source-versus-renderer boundary.
|
|
243
|
+
|
|
234
244
|
## How a bare name resolves
|
|
235
245
|
|
|
236
246
|
**Inside out:** the slice, then the enclosing feature, then the module, then the
|
|
@@ -0,0 +1,79 @@
|
|
|
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
|
+
# Guarded screen actions
|
|
5
|
+
|
|
6
|
+
## Contents
|
|
7
|
+
|
|
8
|
+
- State one user decision
|
|
9
|
+
- Select and bind
|
|
10
|
+
- Guard boundaries
|
|
11
|
+
|
|
12
|
+
## State one user decision
|
|
13
|
+
|
|
14
|
+
A label-headed `action "<text>"` (or `$strings.<key>`) can choose a command
|
|
15
|
+
from the displayed item's state. The label replaces a plain action's `label`
|
|
16
|
+
child. This complete model compiled without warnings on Screenplay 4.125.0;
|
|
17
|
+
it is authoring evidence, not a rendered interaction test:
|
|
18
|
+
|
|
19
|
+
```screenplay
|
|
20
|
+
module Tasks
|
|
21
|
+
feature Work
|
|
22
|
+
slice StateChange CloseTask
|
|
23
|
+
command CloseTask
|
|
24
|
+
taskId String identifier
|
|
25
|
+
produces event TaskClosed
|
|
26
|
+
slice StateView Details
|
|
27
|
+
readmodel TaskDetails
|
|
28
|
+
taskId String
|
|
29
|
+
status String
|
|
30
|
+
query TaskById => TaskDetails optional
|
|
31
|
+
by taskId String
|
|
32
|
+
screen Details
|
|
33
|
+
data TaskDetails via query TaskById by taskId
|
|
34
|
+
action "Close"
|
|
35
|
+
when item.status == "open" execute CloseTask
|
|
36
|
+
with taskId from item.taskId
|
|
37
|
+
otherwise hidden
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
## Select and bind
|
|
41
|
+
|
|
42
|
+
`item` is the nearest container's data item, or selected element for collection
|
|
43
|
+
data. Sibling data in the action's container takes precedence over outer data
|
|
44
|
+
regardless of text order; ambiguous/missing data warns rather than guessing.
|
|
45
|
+
Without an item (loading/no selection), always hide the action, even if it has an
|
|
46
|
+
execute fallback.
|
|
47
|
+
|
|
48
|
+
Check alternatives in authored order whenever data changes; **first match wins**.
|
|
49
|
+
At least one when is required. Last optional `otherwise execute <Command>` is
|
|
50
|
+
a fallback; `otherwise hidden` or omission hides unmatched actions. Intentional
|
|
51
|
+
overlap is valid; only provable shadowing warns. Inputs resolve from explicit
|
|
52
|
+
`with <property> from <binding>`, matching subject fields, declared command form,
|
|
53
|
+
then renderer input. Terminal collection fields may fill collection inputs;
|
|
54
|
+
traversing through a collection is not supported.
|
|
55
|
+
|
|
56
|
+
A single `navigate to` runs after the chosen command succeeds, not to open that
|
|
57
|
+
command's input screen. Open a form/dialog first when it needs separate input.
|
|
58
|
+
A click runs the choice shown; if a click-time check changes it, refresh instead
|
|
59
|
+
of executing the newly selected command.
|
|
60
|
+
|
|
61
|
+
## Guard boundaries
|
|
62
|
+
|
|
63
|
+
Conditions compare item paths to literals, not other paths, route/screen state,
|
|
64
|
+
`$context` or `$env`. Equality/inequality, numeric ordering, string contains/starts
|
|
65
|
+
with and grouped and/or are supported; and binds tighter than or. Collections
|
|
66
|
+
cannot be condition operands. Missing/null fields compare false, including !=
|
|
67
|
+
to a non-null literal; == null matches an explicit null, not a missing member.
|
|
68
|
+
Type mismatches compare false. Editors validate syntax/shape, not runtime choices.
|
|
69
|
+
|
|
70
|
+
The guard controls an offer, never server permission. The selected command still
|
|
71
|
+
runs authorization, validation and constraints; denial never falls through to a
|
|
72
|
+
second command. Screens remain outside portable ESM execution. A downstream
|
|
73
|
+
renderer must explicitly admit guarded selection or report unsupported behavior,
|
|
74
|
+
not approximate it as a plain action. CLI 3.41.0's bundled screen renderer reports
|
|
75
|
+
unsupported guarded actions with STAGE-SCENE-ACTION-001; source compilation alone
|
|
76
|
+
cannot establish usable controls.
|
|
77
|
+
|
|
78
|
+
Authority: Screenplay `v4.125.0:Documentation/screenplay/screens.md`;
|
|
79
|
+
CLI `v3.41.0:Documentation/reference/screenplay.md` for renderer disposition.
|
|
@@ -25,9 +25,9 @@ Version pins live once in `cratis-screenplay-toolchain` `references/versions.md`
|
|
|
25
25
|
|
|
26
26
|
| Source | Pin | Used for |
|
|
27
27
|
| --- | --- | --- |
|
|
28
|
-
| cratis CLI | `3.
|
|
29
|
-
| Stage | `4.51.
|
|
30
|
-
| Screenplay | bundled `4.114.0`;
|
|
28
|
+
| cratis CLI | `3.41.0` (`v3.41.0`) | `cratis render` options, exit codes, publication receipt, UI-profile rejection (`CLI-RENDER-007` to `CLI-RENDER-010`); tag pins Stage 4.51.3, Screenplay 4.114.0 and `Cratis.Arc.Screenplay` 22.54.0, with `cratis/stage:4.51.3` as the runtime image. UI-profile rejection and render-then-recover shipped in 3.41.0 (Cratis/cli#301). The screens release vector was verified on 3.40.7 (`af9f18e`) with `cratis/stage:4.51.1`. Reading baselines: 3.40.3, 3.39.0 and 3.28.3 (`8b43fef`) |
|
|
29
|
+
| Stage | `4.51.3` (CLI 3.41.0 default) | admission (`STAGE-ESM-*`, and `PLAY0268` render refusals surfaced by the CLI), ownership manifest, `Customizations/` seams, Debug-only specifications, fail-closed guarded actions (`STAGE-SCENE-ACTION-001`) and interactions (`STAGE-SCENE-INTERACTION-001`). Older baselines: 4.49.5, 4.43.0 and `v4.24.2` (`32dcac4`) |
|
|
30
|
+
| Screenplay | bundled `4.114.0`; standalone `4.125.0` | standalone compiler for V1 to V3; binding codes `PLAY0268` and the code-attachment rules, read at `v4.66.0`; claims made through `cratis` are 4.114.0 claims |
|
|
31
31
|
| Rendered apps | Arc `22.25.0`, Chronicle `19.8.1`, Scene packages | `[ProtectedDecision]` (Arc 22.39.0 and later) is not available in code written into one; verify the generated package set before claiming exact Scene 4.14.0 runtime parity |
|
|
32
32
|
|
|
33
33
|
Facts were read at those tags and `cratis render` was run at 3.28.2 and 3.28.3 for the worked example
|
|
@@ -68,13 +68,15 @@ assume an answer to 4, and record it as `blocked` for the user.
|
|
|
68
68
|
Evolved events (a model that selects ESM v4) are gap-fill too: Stage 4.24.2 admits the v4 model but refuses any evolved event and its dependent scope with `STAGE-ESM-026`, because it cannot render Chronicle event-type migrations yet (Stage#204). Events at their initial revision still render. Hand-write the evolved events and their migrations per `cratis-chronicle-event-type-migration`, with the model as the contract. The cratis CLI bundles Stage 4.24.2 since 3.28.3 and reports an evolved event with `STAGE-ESM-026` (probed); 3.28.2 bundled Stage 4.24.1 (3.28.1 and earlier: 4.24.0) and refused a v4 model with `STAGE-ESM-016`.
|
|
69
69
|
|
|
70
70
|
Generated command values and `returns` responses (ESM v7) bind and run in the reference runner on standalone
|
|
71
|
-
Screenplay 4.68.0 but are not rendered:
|
|
72
|
-
|
|
71
|
+
Screenplay 4.68.0 and later but are not rendered: CLI 3.41.0 admits ESM v7 to Stage planning, and Stage 4.51.3
|
|
72
|
+
refuses generated values and responses with `STAGE-ESM-028`/`STAGE-ESM-029` (`cratis-screenplay-toolchain`
|
|
73
|
+
`references/versions.md`). A command that uses them is case A or C: keep
|
|
73
74
|
the model, hand-write the command and its response with the model (and its fixtures and `then returns`
|
|
74
75
|
specifications) as the contract, and report V3 from the standalone tool and V5 as `not run: no render`.
|
|
75
76
|
|
|
76
|
-
Models with event sources, streams or command routes
|
|
77
|
-
|
|
77
|
+
Models with event sources, streams or command routes bind and reference-execute as ESM v8 on standalone
|
|
78
|
+
Screenplay 4.125.0, so report V3 and V4 from that tool. They are still case A or C for rendering: CLI 3.41.0
|
|
79
|
+
refuses models above ESM v7 with `CLI-RENDER-004`, so hand-write the code with the model as the
|
|
78
80
|
contract (`cratis-screenplay-toolchain` `references/sources-and-streams.md`).
|
|
79
81
|
|
|
80
82
|
Two rules hold in every case: a customization never makes a rejected model renderable, and
|
package/package/corpus/skills/cratis-screenplay-render-and-gap-fill/references/gap-fill-handoff.md
CHANGED
|
@@ -75,9 +75,12 @@ gap-fill): the registration goes through the seams in `Customizations/Program.cs
|
|
|
75
75
|
not bind a modeled reaction or capture. Case C (no generated application): there is no generated
|
|
76
76
|
`Program.cs` or partial hook, so the registration follows the hand-written application's own
|
|
77
77
|
composition conventions (`rules/vertical-slices.md`, `cratis-chronicle-reactor`).
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
78
|
+
Declare the trusted actor with reaction `runs as system role "<Role>"`
|
|
79
|
+
(standalone 4.125.0, ESM v10); `given caller` is not an invocation actor.
|
|
80
|
+
CLI 3.41.0's older compiler rejects the syntax, and Stage 4.51.3's planner admits
|
|
81
|
+
through v7 only. Gap-fill retains the declared role and uses Arc
|
|
82
|
+
`[ExecuteCommandsAsSystem]` for returned commands. Checked model and diagnostics:
|
|
83
|
+
captures-and-reactions `references/invocation-identity.md`.
|
|
81
84
|
|
|
82
85
|
## Re-delivery
|
|
83
86
|
The work list is the full in-scope contract delta since the ledger's last verified source
|
|
@@ -37,14 +37,14 @@
|
|
|
37
37
|
},
|
|
38
38
|
{
|
|
39
39
|
"kind": "skill-contains",
|
|
40
|
-
"value": "case A or C
|
|
40
|
+
"value": "case A or C for rendering"
|
|
41
41
|
},
|
|
42
42
|
{
|
|
43
43
|
"kind": "skill-contains",
|
|
44
44
|
"value": "STAGE-ESM-026"
|
|
45
45
|
},
|
|
46
46
|
{ "kind": "skill-contains", "value": "Generated command values and `returns` responses (ESM v7) bind and run" },
|
|
47
|
-
{ "kind": "skill-contains", "value": "
|
|
47
|
+
{ "kind": "skill-contains", "value": "STAGE-ESM-028`/`STAGE-ESM-029" },
|
|
48
48
|
{ "kind": "skill-contains", "value": "authored-UI parity" },
|
|
49
49
|
{ "kind": "skill-contains", "value": "responsible tool version" }
|
|
50
50
|
]
|
|
@@ -183,8 +183,9 @@ scope is reported as explicitly incomplete); V1 passes with the tool named in
|
|
|
183
183
|
populated-then-removed spec.
|
|
184
184
|
- V1 passes (standalone `screenplay` required when cascades are specified); report tool and
|
|
185
185
|
version.
|
|
186
|
-
- V4
|
|
187
|
-
|
|
186
|
+
- Run V4 through standalone `screenplay test` or MCP `run-specifications`;
|
|
187
|
+
if not executed, report the actual host/input reason, not a blanket no-route
|
|
188
|
+
claim. Stage's runner is target-engine evidence, never V4; V1/V3 do not prove pass. V5 is "not run" unless rendering was attempted; report admission, publication, build and
|
|
188
189
|
tests separately.
|
|
189
190
|
- Match guarantees to evidence: `.play` outcomes, in-process Chronicle scenarios and real-kernel
|
|
190
191
|
tests are not interchangeable (`references/chronicle-verification.md`).
|
package/package/corpus/skills/cratis-screenplay-scenario-coverage/references/spec-forms-by-mode.md
CHANGED
|
@@ -3,7 +3,11 @@
|
|
|
3
3
|
The subsets themselves (what binds, what renders) are owned by `cratis-screenplay-toolchain`
|
|
4
4
|
(its executable and renderable subset references); version facts by its `references/versions.md`. This file
|
|
5
5
|
says what that means for writing specs. A form outside the chosen mode is never deleted from a
|
|
6
|
-
design model: keep it and record the gap.
|
|
6
|
+
design model: keep it and record the gap. The detailed Stage 4.24.x rows below
|
|
7
|
+
retain historical admission evidence; current pins are Screenplay 4.125.0 / CLI
|
|
8
|
+
3.41.0. Run actual target admission instead of assuming old restrictions carry over.
|
|
9
|
+
Typed example/override forms: `cratis-screenplay-specifications`
|
|
10
|
+
`references/examples-and-routes.md`.
|
|
7
11
|
|
|
8
12
|
| Form | design | executable | renderable |
|
|
9
13
|
|---|---|---|---|
|
|
@@ -19,6 +23,10 @@ design model: keep it and record the gap.
|
|
|
19
23
|
| Command spec listing reaction cascade events | yes (v6 semantics) | false PLAY0285 on a cratis before 3.28.2 bundle only; see SKILL.md "Version skew" | no (no reactions) |
|
|
20
24
|
| `generated <name> = <value>` under `when`, `then returns` (ESM v7) | yes | yes on standalone Screenplay 4.68.0 or later; not on the 4.66.0 bundled in cratis 3.28.x (`PLAY0268`) | no (Stage does not render ESM v7) |
|
|
21
25
|
| `then events in any order` | yes | yes | yes |
|
|
26
|
+
| Event `stream` / `no stream`, typed `for` and stream ids | yes | ESM v8 at 4.125.0 | CLI 3.41.0 refuses models above v7 before planning |
|
|
27
|
+
| Typed examples and overrides | yes | expanded and type-checked before binding; required fields remain required | depends on expanded contract, not fixture reuse |
|
|
28
|
+
| `given operation ... fails`, `then operation`, `then compensated` | yes | unadmitted PLAY0268 | gap-fill |
|
|
29
|
+
| Refusal branches, `when redelivered`, `then no events` | yes | unadmitted PLAY0268 | gap-fill |
|
|
22
30
|
| Composite (JSON) values in specs | yes | yes | no |
|
|
23
31
|
| Rules over dates or `today`, nested paths | spec them in design | rule does not bind: `recorded` | `recorded` |
|
|
24
32
|
| Bodied rules, code policies | spec them | spec reported **unsupported**, never passed | no |
|
|
@@ -36,7 +44,10 @@ bundle is available). Mark each such spec in the coverage matrix as
|
|
|
36
44
|
the projection's effective key (`cratis-screenplay-slice-design` `references/read-model-design.md`
|
|
37
45
|
decision table). View specs assert through a keyed query.
|
|
38
46
|
- Run V3 (binding-ready, per `cratis-screenplay-toolchain`); binding-only codes (PLAY0273/0350/0352/0388/0389) appear only there.
|
|
39
|
-
- V4
|
|
47
|
+
- V4 runs through `screenplay test` or MCP `run-specifications`; record expected,
|
|
48
|
+
discovered/selected and passed/failed/unsupported counts. Unbound/unsupported
|
|
49
|
+
is not passed. Authoring-only refusal/redelivery/operation specs remain recorded
|
|
50
|
+
contracts; test them at the owning target after authorized gap-fill.
|
|
40
51
|
|
|
41
52
|
## Renderable mode
|
|
42
53
|
- Specs use given events, a command `when`, and then events / readmodel / query / error /
|
|
@@ -65,8 +65,9 @@ report and the slice `description`, and continue.
|
|
|
65
65
|
origin must be **reachable** (some screen, form, reaction or integration leads to the
|
|
66
66
|
command) and **authorized** (the persona's policies satisfy every gate on module, feature
|
|
67
67
|
and command). A command may have several origins; each must be real. A reaction's `invokes`
|
|
68
|
-
has no caller
|
|
69
|
-
|
|
68
|
+
has no caller unless the reaction declares `runs as system role "<Role>"` (ESM v10), so a
|
|
69
|
+
gated command it invokes is refused: declare that trusted path with the role the gate
|
|
70
|
+
admits, never delete the gate.
|
|
70
71
|
3. **Design the command** (`references/command-inventory.md`). Imperative business name for
|
|
71
72
|
**one** decision (`ReassignLocker`, `CorrectLockerVolume`). A form verb (`Update`, `Edit`,
|
|
72
73
|
`Save`, `Set`, `Change`, `Manage` + noun) means several decisions share a form: ask which
|
package/package/corpus/skills/cratis-screenplay-slice-design/references/command-inventory.md
CHANGED
|
@@ -118,8 +118,9 @@ not been asked the refusal questions.
|
|
|
118
118
|
- Copying state into the command so `require` can read it, instead of `reads <View>`.
|
|
119
119
|
- An origin that is neither reachable (no screen, form or reaction leads there) nor authorized
|
|
120
120
|
for the persona who should act.
|
|
121
|
-
- A reaction invoking a gated command
|
|
122
|
-
trusted path
|
|
121
|
+
- A reaction invoking a gated command without `runs as system role "<Role>"`: the invocation has
|
|
122
|
+
no caller and is refused; declare the trusted path with the role the gate admits
|
|
123
|
+
(`cratis-screenplay-automations-and-translations`), never delete the gate.
|
|
123
124
|
- Refusals recorded as prose in the `description` with no layer and no spec row.
|
|
124
125
|
- Personal data or secrets as command input: values are by default recorded in the causation chain, so treat them as permanent
|
|
125
126
|
(retention can be configured in newer Chronicle; verify it, never audit secrets).
|
|
@@ -62,6 +62,46 @@ For `worked-example.md`:
|
|
|
62
62
|
| LockerBoard | LockerInstalled, LockerAssigned | InstallLocker, AssignLocker | |
|
|
63
63
|
| RequestProgress | LockerRequested, LockerAssigned | RequestLocker, AssignLocker | |
|
|
64
64
|
|
|
65
|
+
### Declare container dependencies
|
|
66
|
+
|
|
67
|
+
At Screenplay 4.125.0, modules and features may declare `depends on <Name>`, one
|
|
68
|
+
target per line. Use a bare sibling name or a qualified module/feature address.
|
|
69
|
+
Bare names resolve inside out: siblings, ancestor siblings, then root modules;
|
|
70
|
+
qualified names match an unambiguous trailing address. Ambiguity is `PLAY0198`.
|
|
71
|
+
Self, ancestor, descendant and unresolved targets warn with `PLAY0554`; repeats
|
|
72
|
+
keep the first resolved target and warn with `PLAY0555`.
|
|
73
|
+
|
|
74
|
+
Declarations accumulate on the same owner in ordinal file-path order, independent
|
|
75
|
+
of board import order. Layout expansion writes them only in the owner's file.
|
|
76
|
+
They are authoring metadata: no execution rule, implementation order, identity
|
|
77
|
+
or executable-model revision change.
|
|
78
|
+
|
|
79
|
+
Once a container declares dependencies, its own inventory must cover counted
|
|
80
|
+
explicit references leaving it, including descendants. Parent and child lists
|
|
81
|
+
are independent. Module targets cover all their features; feature targets cover
|
|
82
|
+
their descendants. `usesFactsFrom`, `reactsTo`, `decidesFrom`, `asks` and `shows`
|
|
83
|
+
count; specification-only and outside-context edges do not. `PLAY0552` warns on
|
|
84
|
+
uncovered producer modules; `PLAY0553` marks unused declarations and `PLAY0556`
|
|
85
|
+
mutual declarations as information. Ambiguous ownership is provisional, not proof
|
|
86
|
+
of an undeclared dependency. Inspect MCP `dependency-graph`'s `declarations` view.
|
|
87
|
+
|
|
88
|
+
Example: Payroll declares Timesheets; its Handover feature declares
|
|
89
|
+
Timesheets.Approval and sibling Runs. These are dependency inventories, not
|
|
90
|
+
actual references or execution dependencies:
|
|
91
|
+
|
|
92
|
+
```screenplay
|
|
93
|
+
module Payroll
|
|
94
|
+
depends on Timesheets
|
|
95
|
+
feature Handover
|
|
96
|
+
depends on Timesheets.Approval
|
|
97
|
+
depends on Runs
|
|
98
|
+
feature Runs
|
|
99
|
+
module Timesheets
|
|
100
|
+
feature Approval
|
|
101
|
+
```
|
|
102
|
+
|
|
103
|
+
Source: Screenplay `v4.125.0:Documentation/screenplay/slices.md` and `folders.md`.
|
|
104
|
+
|
|
65
105
|
## State-transition table (per entity)
|
|
66
106
|
|
|
67
107
|
Rows are states (named after the fact that put the entity there); columns are commands. Each
|
|
@@ -37,15 +37,12 @@ The update follows `commands.md`, `events.md`, `types.md` and
|
|
|
37
37
|
`specifications.md` at that main commit (after v4.52.0). This pass compiles the
|
|
38
38
|
changed examples; it does not rerun the reference runner.
|
|
39
39
|
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
`
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
`cratis screenplay validate` parse and check consistency, the MCP server also binds,
|
|
47
|
-
and spec outcomes come only from the reference runner as a library, Stage's
|
|
48
|
-
specification runner or a rendered application's tests.
|
|
40
|
+
Current specification syntax follows Screenplay v4.125.0 `specifications.md`;
|
|
41
|
+
older probes in the table remain historical. Pins: `cratis-screenplay-toolchain`
|
|
42
|
+
`references/versions.md`. Compile commands check source, not reference execution.
|
|
43
|
+
Use `screenplay test` or MCP `run-specifications` for V4; Stage/target tests are
|
|
44
|
+
separate evidence. Unsupported/unbound is never a pass. Typed examples and
|
|
45
|
+
route assertions are in [examples and routes](references/examples-and-routes.md).
|
|
49
46
|
|
|
50
47
|
Checked against the Screenplay repository at tag `v4.31.0` (commit `355dffb`):
|
|
51
48
|
`Documentation/screenplay/{specifications,policies,constraints,readmodels,diagnostics}.md`.
|
|
@@ -95,9 +92,8 @@ target has one normalized behavior to match.
|
|
|
95
92
|
rejects, the earlier accepted facts and their projections remain.
|
|
96
93
|
|
|
97
94
|
Unsupported is not passed. Report it as "needs a target", not as green. "Specified"
|
|
98
|
-
and "bound" are never "passing":
|
|
99
|
-
|
|
100
|
-
rendered application's tests, and named as such.
|
|
95
|
+
and "bound" are never "passing": run the reference CLI/MCP route or the owning
|
|
96
|
+
target tests, and name the engine, version and expected/discovered selection.
|
|
101
97
|
|
|
102
98
|
## The vocabulary
|
|
103
99
|
|
|
@@ -184,7 +180,7 @@ Read [references/worked-example.md](references/worked-example.md) when writing o
|
|
|
184
180
|
|
|
185
181
|
## Generated fixtures and return expectations (ESM v7)
|
|
186
182
|
|
|
187
|
-
|
|
183
|
+
Current standalone and bundled compilers bind generated fixtures (`generated <name> = <value>`, `for` beneath `when`) and `then returns` as ESM v7. If execution reaches generation without every generated value supplied, the run is unsupported and never passes.
|
|
188
184
|
Read [references/generated-fixtures.md](references/generated-fixtures.md) when writing generated-value fixtures or scalar and record return expectations for a command.
|
|
189
185
|
|
|
190
186
|
## Actions beyond commands
|
|
@@ -197,6 +193,18 @@ Read [references/actions-beyond-commands.md](references/actions-beyond-commands.
|
|
|
197
193
|
From ESM v6 every action sets reactions off and `then` events compare every new fact, the action's and the reactions'. A specification whose action is a command goes in the slice that declares the command. A false `PLAY0285` on a cascade under `cratis` before 3.28.2 is tool skew, not a modeling error: never delete the `then` line to silence it.
|
|
198
194
|
Read [references/reactions-and-cascades.md](references/reactions-and-cascades.md) when a specification's expected events include what a reaction appends, when a cascade, clock tick or invoked command is involved, or when `cratis` reports `PLAY0285` on a model that `screenplay` accepts (it holds the "Version skew: cascades and the false `PLAY0285` (cratis before 3.28.2)" section).
|
|
199
195
|
|
|
196
|
+
## Reusable fixtures, routes and recovery intent
|
|
197
|
+
|
|
198
|
+
Use typed `example` declarations for repeated event/command/read-model values;
|
|
199
|
+
step overrides keep the action/outcome visible and carry authored/example/override
|
|
200
|
+
provenance. Event `stream`/`no stream` assertions bind as ESM v8; typed `for` and
|
|
201
|
+
stream ids are not guessed. Read [examples and routes](references/examples-and-routes.md).
|
|
202
|
+
|
|
203
|
+
`given operation ... fails`, `then operation` and `then compensated` describe
|
|
204
|
+
future external-work behavior. Reaction refusal branches, `when redelivered`
|
|
205
|
+
and `then no events` are also authoring-only: compile them, but report their
|
|
206
|
+
PLAY0268 binding refusal instead of an executed result. Preserve the contract.
|
|
207
|
+
|
|
200
208
|
## Rejections and denials say different things
|
|
201
209
|
|
|
202
210
|
`then error "<message>"` says **rejected, for this reason** — pin it when the
|
|
@@ -252,9 +260,9 @@ For view specifications:
|
|
|
252
260
|
|
|
253
261
|
## Verify
|
|
254
262
|
|
|
255
|
-
- [ ]
|
|
256
|
-
|
|
257
|
-
`
|
|
263
|
+
- [ ] Validate the complete root with warnings as errors, naming tool/version.
|
|
264
|
+
Current standalone pin: 4.125.0. Run specification examples through
|
|
265
|
+
`screenplay test`; expected unadmitted syntax reports unbound, not passed.
|
|
258
266
|
- [ ] Executable diagnostics are clean too: `PLAY0350`, `PLAY0352`, `PLAY0388`,
|
|
259
267
|
`PLAY0389` and `PLAY0273` are only reported at binding.
|
|
260
268
|
- [ ] Every slice has at least one boundary specification.
|
package/package/corpus/skills/cratis-screenplay-specifications/references/examples-and-routes.md
ADDED
|
@@ -0,0 +1,103 @@
|
|
|
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
|
+
# Typed examples, overrides and event routes
|
|
5
|
+
|
|
6
|
+
## Contents
|
|
7
|
+
|
|
8
|
+
- Typed examples
|
|
9
|
+
- Effective values
|
|
10
|
+
- Event routes
|
|
11
|
+
- Operation and recovery intent
|
|
12
|
+
|
|
13
|
+
## Typed examples
|
|
14
|
+
|
|
15
|
+
`example <Name> : <EventOrCommandOrReadModel>` declares a possibly partial typed
|
|
16
|
+
fixture at document/module/feature/slice scope. Its underlying type resolves in
|
|
17
|
+
the declaration scope, not the use scope. It can state properties, description,
|
|
18
|
+
`for` and command generated fixtures, not callers/clocks or a whole scenario.
|
|
19
|
+
Examples share the type namespace and use the current event generation. They
|
|
20
|
+
cannot inherit from examples or serve as query results/returns/trigger/capture
|
|
21
|
+
fixtures. They are specification data, not operational `seed` events.
|
|
22
|
+
|
|
23
|
+
This complete example compiled and its two reference scenarios passed on 4.125.0:
|
|
24
|
+
|
|
25
|
+
```screenplay
|
|
26
|
+
concept ProjectId : Uuid
|
|
27
|
+
module Projects
|
|
28
|
+
feature Registration
|
|
29
|
+
example DefaultProject : RegisterProject
|
|
30
|
+
name = "Default"
|
|
31
|
+
slice StateChange Register
|
|
32
|
+
command RegisterProject
|
|
33
|
+
projectId ProjectId identifier
|
|
34
|
+
name String
|
|
35
|
+
produces event ProjectRegistered
|
|
36
|
+
name String = name
|
|
37
|
+
specification RegisteringTheDefault
|
|
38
|
+
when DefaultProject
|
|
39
|
+
projectId = "3fa85f64-5717-4562-b3fc-2c963f66afa6"
|
|
40
|
+
then ProjectRegistered
|
|
41
|
+
for "3fa85f64-5717-4562-b3fc-2c963f66afa6"
|
|
42
|
+
name = "Default"
|
|
43
|
+
specification OverridingTheName
|
|
44
|
+
when DefaultProject name = "Override"
|
|
45
|
+
projectId = "3fa85f64-5717-4562-b3fc-2c963f66afa6"
|
|
46
|
+
then ProjectRegistered
|
|
47
|
+
for "3fa85f64-5717-4562-b3fc-2c963f66afa6"
|
|
48
|
+
name = "Override"
|
|
49
|
+
```
|
|
50
|
+
|
|
51
|
+
## Effective values
|
|
52
|
+
|
|
53
|
+
An example occupies the ordinary name slot in given/event, given readmodel,
|
|
54
|
+
when command, when append, then event or then readmodel. One assignment may be
|
|
55
|
+
inline after the name; more stay indented. There is **no with keyword**.
|
|
56
|
+
Step values override example values by property name; objects/lists replace
|
|
57
|
+
whole values, never recursively merge. Indented `for` replaces its destination;
|
|
58
|
+
generated fixtures merge by name. A new step-only value is authored, not an
|
|
59
|
+
override. Each step/declaration assigns a property once (PLAY0519); malformed
|
|
60
|
+
headers are PLAY0518.
|
|
61
|
+
|
|
62
|
+
After expansion, required given-event/read-model, command, append and expected
|
|
63
|
+
event fields must be complete (binding PLAY0524); examples can remain partial.
|
|
64
|
+
Read-model assertions retain subset matching unless `exactly` is authored.
|
|
65
|
+
Even unused example values or values overridden at every use are type-checked.
|
|
66
|
+
No default fixture values are invented. A command action must belong to the
|
|
67
|
+
specification's own slice even when a qualified example resolves elsewhere.
|
|
68
|
+
|
|
69
|
+
MCP `find-fixtures` reports effective authored/example/override origins and
|
|
70
|
+
replaced values. Source-bound runner failures retain that provenance; canonical
|
|
71
|
+
ESM contains merged values only, equivalent to hand-expansion. ESM-only runners
|
|
72
|
+
cannot reconstruct source origins.
|
|
73
|
+
|
|
74
|
+
## Event routes
|
|
75
|
+
|
|
76
|
+
Event occurrences in `given`, `when append` and `then` accept `stream Source.Stream`
|
|
77
|
+
with nested scalar `streamId = <literal>` or a complete composite part block.
|
|
78
|
+
These select ESM v8 and reference-execute at 4.125.0; the complete checked model
|
|
79
|
+
is in toolchain `references/sources-and-streams.md`. Command actions take their
|
|
80
|
+
route from the command declaration, never the fixture.
|
|
81
|
+
|
|
82
|
+
Routed history/appends need typed concrete `for`; routed expectations may omit
|
|
83
|
+
it. `then ... no stream` expects no route; no route in a then is a wildcard.
|
|
84
|
+
`no stream` is invalid on given/appends. Event examples can supply routes, but
|
|
85
|
+
steps replace the entire route, independently of `for`; an inherited route
|
|
86
|
+
cannot be changed back to a wildcard. Literal compatibility/route contradiction
|
|
87
|
+
checks use resolved source/stream types, not guessed text (PLAY0547–PLAY0551).
|
|
88
|
+
CLI 3.41.0 rendering rejects versions above v7 before planning, even though
|
|
89
|
+
source compilation and reference routing pass.
|
|
90
|
+
|
|
91
|
+
## Operation and recovery intent
|
|
92
|
+
|
|
93
|
+
Operation failure/request/compensation forms are authoring-only (PLAY0268):
|
|
94
|
+
`given operation <Name> fails`, `then operation <Name>` with a partial input
|
|
95
|
+
subset, and leaf `then compensated <Name>`. See command-surface
|
|
96
|
+
`references/operations.md` for the complete checked authoring fixture.
|
|
97
|
+
|
|
98
|
+
Refusal selectors, redelivery to one observer and `then no events` likewise
|
|
99
|
+
remain unadmitted; they are not executed append scenarios. Forms, matching,
|
|
100
|
+
acknowledgement and their whole-model refusal boundary are in
|
|
101
|
+
captures-and-reactions `references/refusals-and-redelivery.md`.
|
|
102
|
+
|
|
103
|
+
Authority: Screenplay `v4.125.0:Documentation/screenplay/specifications.md`.
|
package/package/corpus/skills/cratis-screenplay-specifications/references/reactions-and-cascades.md
CHANGED
|
@@ -42,12 +42,11 @@ module Collections
|
|
|
42
42
|
- A specification whose action is a command goes in the slice that declares that
|
|
43
43
|
command, here `SendInvoice`, not in the `Automation` slice that reacts: a command
|
|
44
44
|
from another slice is `PLAY0273` "command is unresolved in its slice" at binding.
|
|
45
|
-
- A
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
`cratis-screenplay-captures-and-reactions`.
|
|
45
|
+
- A reaction invocation without a declared actor has no caller and a gated
|
|
46
|
+
command denies. At 4.125.0 reaction `runs as system role "<Role>"` supplies the
|
|
47
|
+
authenticated system actor (ESM v10); `given caller` does not. Each command is
|
|
48
|
+
atomic, not the cascade. Checked actor scenario and CLI/Stage limitations:
|
|
49
|
+
captures-and-reactions `references/invocation-identity.md`.
|
|
51
50
|
- The clock is UTC and exact. An `every` or `at` occurrence fires once when it is
|
|
52
51
|
due after `given clock` and at or before `when clock`; `when clock` needs
|
|
53
52
|
`given clock`, so the same instant twice fires nothing.
|
|
@@ -87,10 +87,10 @@ option, mark it `ASSUMED` in the slice or module `description` and in the sessio
|
|
|
87
87
|
invariant consequences, not names or length. For Chronicle keep event-source identity,
|
|
88
88
|
namespace, process-stream routing and concurrency scope apart
|
|
89
89
|
(`references/chronicle-boundaries.md`). Declared `eventsource`/`stream`/`streamId` and
|
|
90
|
-
command routes
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
90
|
+
command/specification routes bind and reference-execute as ESM v8 on 4.125.0.
|
|
91
|
+
CLI 3.41.0 rendering admits through v7 only (CLI-RENDER-004); keep the routing
|
|
92
|
+
contract and gap-fill its target realization. Forms/boundaries:
|
|
93
|
+
toolchain `references/sources-and-streams.md`. A `generated identifier` (ESM v7, standalone 4.68.0; not rendered by Stage yet) is
|
|
94
94
|
generated fresh on every acceptance: it is not a retry identity, and generated values give no
|
|
95
95
|
idempotency, retry or deduplication guarantee. When a retry must find the same stream, the caller
|
|
96
96
|
supplies the identifier before the first attempt.
|
|
@@ -205,8 +205,10 @@ Ask for each stream:
|
|
|
205
205
|
Some event stores decide consistency by a query over tagged events instead of one stream
|
|
206
206
|
(often called dynamic consistency boundaries). Chronicle's concurrency scopes can narrow a
|
|
207
207
|
check to event types, source type or stream (`concurrency` block, Screenplay
|
|
208
|
-
`commands.md`)
|
|
209
|
-
|
|
208
|
+
`commands.md`). Legacy concurrency metadata still fails binding (PLAY0271),
|
|
209
|
+
but sources/streams/routes bind and reference-execute as ESM v8 on 4.125.0.
|
|
210
|
+
Route admission does not make a view read protected. CLI 3.41.0's render boundary
|
|
211
|
+
is v7; see toolchain `references/versions.md`. Model the stream by business
|
|
210
212
|
identity; when a rule truly needs a cross-stream decision, record it (see
|
|
211
213
|
`consistency-and-concurrency.md`) rather than inventing a construct.
|
|
212
214
|
|
|
@@ -12,9 +12,9 @@
|
|
|
12
12
|
{ "kind": "skill-contains", "value": "CHR0034" },
|
|
13
13
|
{ "kind": "skill-contains", "value": "No calculated events" },
|
|
14
14
|
{ "kind": "skill-contains", "value": "decision tree and red flags" },
|
|
15
|
-
{ "kind": "skill-contains", "value": "
|
|
15
|
+
{ "kind": "skill-contains", "value": "bind and reference-execute as ESM v8" },
|
|
16
16
|
{ "kind": "skill-contains", "value": "STAGE-ESM-026" },
|
|
17
17
|
{ "kind": "skill-contains", "value": "generated values give no\n idempotency, retry or deduplication guarantee" },
|
|
18
|
-
{ "kind": "skill-contains", "value": "
|
|
18
|
+
{ "kind": "skill-contains", "value": "CLI-RENDER-004" }
|
|
19
19
|
]
|
|
20
20
|
}
|