@cratis/pi 7.29.1 → 7.31.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (68) hide show
  1. package/package/corpus/skills/cratis-chronicle-client-dotnet/SKILL.md +14 -0
  2. package/package/corpus/skills/cratis-chronicle-client-dotnet/references/pinned-generation-delivery.md +92 -0
  3. package/package/corpus/skills/cratis-chronicle-event-type-migration/SKILL.md +24 -2
  4. package/package/corpus/skills/cratis-chronicle-event-type-migration/references/pinned-generations.md +114 -0
  5. package/package/corpus/skills/cratis-screenplay-automations-and-translations/SKILL.md +9 -4
  6. package/package/corpus/skills/cratis-screenplay-automations-and-translations/references/audit-format.md +4 -2
  7. package/package/corpus/skills/cratis-screenplay-automations-and-translations/references/automation-patterns.md +3 -3
  8. package/package/corpus/skills/cratis-screenplay-automations-and-translations/references/provenance.md +5 -2
  9. package/package/corpus/skills/cratis-screenplay-automations-and-translations/references/public-events-and-direction.md +137 -0
  10. package/package/corpus/skills/cratis-screenplay-automations-and-translations/verification.json +5 -1
  11. package/package/corpus/skills/cratis-screenplay-captures-and-reactions/SKILL.md +15 -16
  12. package/package/corpus/skills/cratis-screenplay-captures-and-reactions/references/invocation-identity.md +4 -4
  13. package/package/corpus/skills/cratis-screenplay-captures-and-reactions/references/product-sources.md +15 -0
  14. package/package/corpus/skills/cratis-screenplay-captures-and-reactions/verification.json +3 -1
  15. package/package/corpus/skills/cratis-screenplay-command-surface/SKILL.md +8 -9
  16. package/package/corpus/skills/cratis-screenplay-command-surface/references/context.md +1 -1
  17. package/package/corpus/skills/cratis-screenplay-command-surface/references/generated-values-and-responses.md +4 -4
  18. package/package/corpus/skills/cratis-screenplay-event-modeling/SKILL.md +2 -2
  19. package/package/corpus/skills/cratis-screenplay-event-modeling/references/parsed-not-runnable.md +1 -1
  20. package/package/corpus/skills/cratis-screenplay-legacy-extraction/references/generate-notes.md +2 -2
  21. package/package/corpus/skills/cratis-screenplay-model-authoring/SKILL.md +4 -4
  22. package/package/corpus/skills/cratis-screenplay-model-authoring/references/language-reference.md +7 -1
  23. package/package/corpus/skills/cratis-screenplay-model-authoring/references/mcp-tools.md +7 -2
  24. package/package/corpus/skills/cratis-screenplay-model-authoring/references/screen-authoring-workflow.md +5 -3
  25. package/package/corpus/skills/cratis-screenplay-model-authoring/verification.json +1 -1
  26. package/package/corpus/skills/cratis-screenplay-model-review/SKILL.md +10 -11
  27. package/package/corpus/skills/cratis-screenplay-model-review/references/anti-patterns.md +1 -1
  28. package/package/corpus/skills/cratis-screenplay-model-review/references/public-keys-and-routes.md +32 -0
  29. package/package/corpus/skills/cratis-screenplay-model-review/verification.json +1 -0
  30. package/package/corpus/skills/cratis-screenplay-projections/SKILL.md +11 -0
  31. package/package/corpus/skills/cratis-screenplay-read-surface/SKILL.md +19 -16
  32. package/package/corpus/skills/cratis-screenplay-read-surface/references/named-keys.md +122 -0
  33. package/package/corpus/skills/cratis-screenplay-read-surface/verification.json +3 -0
  34. package/package/corpus/skills/cratis-screenplay-render-and-gap-fill/SKILL.md +9 -6
  35. package/package/corpus/skills/cratis-screenplay-render-and-gap-fill/references/gap-fill-handoff.md +3 -3
  36. package/package/corpus/skills/cratis-screenplay-render-and-gap-fill/verification.json +1 -1
  37. package/package/corpus/skills/cratis-screenplay-scenario-coverage/SKILL.md +11 -0
  38. package/package/corpus/skills/cratis-screenplay-scenario-coverage/references/spec-forms-by-mode.md +2 -2
  39. package/package/corpus/skills/cratis-screenplay-slice-design/SKILL.md +32 -9
  40. package/package/corpus/skills/cratis-screenplay-slice-design/references/read-model-design.md +20 -13
  41. package/package/corpus/skills/cratis-screenplay-specifications/SKILL.md +12 -10
  42. package/package/corpus/skills/cratis-screenplay-specifications/references/examples-and-routes.md +3 -2
  43. package/package/corpus/skills/cratis-screenplay-specifications/references/source-notes.md +16 -0
  44. package/package/corpus/skills/cratis-screenplay-specifications/verification.json +2 -2
  45. package/package/corpus/skills/cratis-screenplay-streams-and-consistency/SKILL.md +2 -2
  46. package/package/corpus/skills/cratis-screenplay-streams-and-consistency/references/stream-patterns.md +2 -2
  47. package/package/corpus/skills/cratis-screenplay-streams-and-consistency/verification.json +1 -1
  48. package/package/corpus/skills/cratis-screenplay-toolchain/SKILL.md +19 -10
  49. package/package/corpus/skills/cratis-screenplay-toolchain/references/cheat-sheet.md +12 -1
  50. package/package/corpus/skills/cratis-screenplay-toolchain/references/diagnostics.md +55 -3
  51. package/package/corpus/skills/cratis-screenplay-toolchain/references/doc-contradictions.md +7 -4
  52. package/package/corpus/skills/cratis-screenplay-toolchain/references/executable-subset.md +30 -10
  53. package/package/corpus/skills/cratis-screenplay-toolchain/references/production-routes-and-filters.md +119 -0
  54. package/package/corpus/skills/cratis-screenplay-toolchain/references/provenance.md +8 -1
  55. package/package/corpus/skills/cratis-screenplay-toolchain/references/renderable-subset.md +11 -5
  56. package/package/corpus/skills/cratis-screenplay-toolchain/references/screenplay-contract.json +813 -0
  57. package/package/corpus/skills/cratis-screenplay-toolchain/references/screenplay-contract.version +1 -1
  58. package/package/corpus/skills/cratis-screenplay-toolchain/references/sources-and-streams.md +7 -5
  59. package/package/corpus/skills/cratis-screenplay-toolchain/references/traps.md +6 -6
  60. package/package/corpus/skills/cratis-screenplay-toolchain/references/verdicts.md +6 -5
  61. package/package/corpus/skills/cratis-screenplay-toolchain/references/versions.md +56 -28
  62. package/package/corpus/skills/cratis-screenplay-toolchain/verification.json +7 -1
  63. package/package/corpus/skills/cratis-screenplay-ui-composition/references/screen-composition-contract.md +4 -3
  64. package/package/corpus/skills/cratis-stage-rendering-and-sandbox/SKILL.md +11 -12
  65. package/package/corpus/skills/cratis-stage-rendering-and-sandbox/references/admission.md +14 -3
  66. package/package/corpus/skills/cratis-stage-rendering-and-sandbox/references/case-tables-and-whole-numbers.md +8 -6
  67. package/package/corpus/skills/cratis-stage-rendering-and-sandbox/verification.json +3 -1
  68. package/package.json +1 -1
@@ -105,7 +105,7 @@ Checked at Screenplay 4.127.0: `$identity.<property>` is the same caller value a
105
105
  is supported, not deprecated. Historical `cratis` CLI 3.41.0 bundled Screenplay 4.114.0, which predated both:
106
106
  its parser rejected a top-level `identity` block (`PLAY0001`), and with `--executable` it read a
107
107
  `$identity.<property>` mapping as a raw expression (`PLAY0268`). Those checks used standalone 4.127.0;
108
- they are not current CLI 3.46.1/Screenplay 4.130.0 parser claims. Check current renderer
108
+ they are not current CLI 3.50.0/Screenplay 4.131.0 parser claims. Check current renderer
109
109
  admission separately before choosing caller mappings. Built-ins are `id`, `name`, `userName`,
110
110
  `isAuthenticated`, `roles`, `claims.<name>` (everything after `claims.` is opaque).
111
111
  Bare `$identity` reports PLAY0152; unknown properties report PLAY0155. Only
@@ -1,8 +1,8 @@
1
1
  ## Generated values and responses (ESM v7)
2
2
 
3
3
  A `generated` command property and `returns` response bind and reference-execute
4
- as ESM v7 (checked at 4.68.0). Current pins are standalone Screenplay 4.131.0
5
- and CLI 3.46.1 (bundled Screenplay 4.130.0/Stage 4.52.0); `cratis-screenplay-toolchain`
4
+ as ESM v7 (checked at 4.68.0). Current pins are standalone Screenplay 4.135.0
5
+ and CLI 3.50.0 (bundled Screenplay 4.131.0/Stage 4.67.0); `cratis-screenplay-toolchain`
6
6
  `references/versions.md` owns the table. CLI#261 is closed: CLI now admits v7
7
7
  to Stage planning. The historical CLI 3.41.0 v7 canonical corpus received Stage
8
8
  generated-value and response refusals STAGE-ESM-028/029. Do not turn this into a blanket compiler
@@ -45,8 +45,8 @@ Rules (all read at `v4.68.0`):
45
45
 
46
46
  Operations remain authorable/unadmitted (PLAY0268). Named event sources,
47
47
  streams and command/specification routes instead bind and reference-execute as
48
- ESM v8 at 4.125.0; CLI 3.46.1 render refuses versions above v7 before planning
49
- (CLI-RENDER-004). Syntax/MCP acceptance alone is not execution. Source/stream
48
+ ESM v8 at 4.125.0; CLI 3.50.0 reaches Stage construct admission through v10,
49
+ not blanket target support. Syntax/MCP acceptance alone is not execution. Source/stream
50
50
  forms and realization boundary: `cratis-screenplay-toolchain`
51
51
  `references/sources-and-streams.md`. Do not infer further syntax or provider
52
52
  admission from decision numbers.
@@ -139,8 +139,8 @@ What binds depends on **which tool** you ask, so name the tool and its version:
139
139
  standalone 4.125.0. Use `screenplay test` or MCP `run-specifications` for V4.
140
140
  Operations/systems, exact numbers and refusal/redelivery remain unadmitted.
141
141
  Historical CLI 3.41.0 rejected `runs as` syntax and its Stage 4.51.3 check
142
- refused generated values/responses with STAGE-ESM-028/029. Current CLI 3.46.1
143
- bundles Screenplay 4.130.0 / Stage 4.52.0 but still renders through v7 only.
142
+ refused generated values/responses with STAGE-ESM-028/029. CLI 3.50.0 bundles
143
+ Screenplay 4.131.0/Stage 4.67.0; v10 reaches construct admission, not full support.
144
144
  Source/binding admission and target realization are separate gates.
145
145
 
146
146
  The ESM versions, the full disposition table and the Step 7 clock example's binding
@@ -28,7 +28,7 @@ Pins and consumer boundaries: toolchain `references/versions.md`.
28
28
  | Command reads/concurrency | Legacy unprotected decisions, PLAY0271 |
29
29
  | Invokes-only trigger reads | Report-only, not protected state; direct production with reads refuses |
30
30
  | Generated values/responses | v7 binding/reference execution; historical Stage 4.51.3 check: member refusals STAGE-ESM-028/029 |
31
- | Sources/streams and command/specification routes | v8 binding/reference execution; current CLI 3.46.1 render boundary is v7 |
31
+ | Sources/streams and command/specification routes | v8 binding/reference execution; CLI 3.50.0 reaches Stage construct checks through v10 |
32
32
  | Declared reaction invocation actor | v10 binding/reference execution; older CLI parser PLAY0137; Stage planner refuses v10 |
33
33
  | Operations/systems, exact numbers, refusal/redelivery | Source accepted; whole binding refuses PLAY0268 |
34
34
  | UI | Authoring/deferred metadata; runtime support is a separate consumer contract |
@@ -17,9 +17,9 @@ cratis-screenplay-toolchain `references/versions.md`; behaviour from the cratis
17
17
  Screenplay.CritterStack `v0.24.0`. Version-specific capability facts belong in cratis-screenplay-toolchain
18
18
  `references/versions.md`.
19
19
 
20
- Current CLI is 3.46.1, with Screenplay 4.130.0 / Stage 4.52.0 /
20
+ Current CLI is 3.50.0, with Screenplay 4.131.0 / Stage 4.67.0 /
21
21
  Arc.Screenplay 22.54.0 / Chronicle 19.32.0 / Fundamentals 7.22.8
22
- (`references/versions.md` in the toolchain; standalone Screenplay is 4.131.0).
22
+ (`references/versions.md` in the toolchain; standalone Screenplay is 4.135.0).
23
23
  Option/admission evidence checked at CLI 3.41.0: released
24
24
  `GenerateScreenplaySettings.cs`, `ArcScreenplayGeneration.cs`, v7 planning specs
25
25
  and `Documentation/reference/screenplay.md`; older diagnostic probes below keep
@@ -23,7 +23,7 @@ contract is in `cratis-screenplay-ui-composition`.
23
23
 
24
24
  ## Verified product sources
25
25
 
26
- Current authoring/MCP guidance follows Screenplay v4.131.0
26
+ Current authoring/MCP guidance follows Screenplay v4.135.0
27
27
  `Documentation/screenplay/mcp/`, `ast-authoring.md`, `folders.md`, `vscode.md`.
28
28
  Discover installed tools and schemas; CLI bundles can differ from the standalone
29
29
  tool. Pins are in `cratis-screenplay-toolchain` `references/versions.md`.
@@ -291,9 +291,9 @@ that the code compiles or behaves. Read `references/mcp-tools.md#code-attachment
291
291
  it defines them and maps them onto V1 to V5. `screenplay --warnaserror` checks
292
292
  syntax plus the consistency rules (`PLAY0282`-`PLAY0294`) but never binds, so a
293
293
  clean run is not a bound or executable result.
294
- - Operations/exact numbers remain unadmitted; source/stream routes bind as ESM v8,
295
- and generated values/responses as v7. CLI 3.46.1 render passes v7 to Stage but
296
- refuses newer versions. A source contract is never dropped or stubbed to bind.
294
+ - Operations/`numbers exact` remain unadmitted; routes bind as v8, public
295
+ boundaries v9, identity/overrides/filters v10, qualifying non-route Double
296
+ literals v11. CLI 3.50.0 reaches Stage checks through v10. Never drop or stub source contracts to bind.
297
297
  - Distinguish authoring acceptance from `executableReady`; unsupported backend
298
298
  capabilities are not a reason to drop source constructs or invent stubs.
299
299
  - If execution is intended, validate with the owning downstream runtime as well.
@@ -243,6 +243,12 @@ v4.31.0 table, re-read against v4.66.0 and v4.68.0 documentation and probed thro
243
243
  the standalone 4.66.0 tool for the rows marked "probed"; Cratis CLI 3.28.2 and 3.28.3 bundle
244
244
  Screenplay 4.66.0 (before 3.28.2, Screenplay 4.60.1, differ where stated).
245
245
 
246
+ Read-model identity and query admission below are corrected to 4.135.0:
247
+ explicit trailing `key` wins; otherwise single-instance queries in the owning slice
248
+ must agree on `by`. Only with no single-instance identifier and an admitted list
249
+ query does conventional `*Id` inference run. Queryless views need explicit `key`.
250
+ See read-surface `references/named-keys.md` for the collection-key exclusion algorithm.
251
+
246
252
  | Disposition | Constructs |
247
253
  | --- | --- |
248
254
  | Binds and runs in the reference runner | `StateChange`/`StateView` slices; `produces` including `when` conditions over command properties and literal tags; the portable validation rules, `matches email`, quoted `matches` patterns and `require` over command properties; declarative policies and `authorize` on modules, features, commands and keyed queries; `unique` constraints; projections as Chronicle lowers them, including variants, except the projection constructs in the next row; specifications, including `given caller`, `then denied` and `when append` |
@@ -254,7 +260,7 @@ Screenplay 4.66.0 (before 3.28.2, Screenplay 4.60.1, differ where stated).
254
260
  | Binds as ESM v7 on standalone Screenplay 4.68.0 (source and release notes; `PLAY0268` on the 4.66.0 in Cratis CLI 3.28.x, probed) | `generated` properties and `returns` responses, generated fixtures and `then returns`: bound and executed by the reference runner; a policy, rule or requirement that references a generated value is `PLAY0273`, and a generated property on a concept with validation rules is `PLAY0268`. Stage 4.24.2 does not render them (`STAGE-ESM-016`, tracked in Stage#201): gap-fill |
255
261
  | Authorable, not executable (PLAY0268) | Systems/operations, exact numbers and refusal/redelivery remain unadmitted |
256
262
  | Current routing and actor admission | Sources/streams and command/specification routes bind and reference-execute as v8; reaction `runs as system role` supplies the invocation actor as v10 on 4.125.0. Whole-workspace binding determines executable availability; CLI/Stage realization remains separate |
257
- | Blocks binding (`PLAY0268`) | `pii`/`secret` concepts (also legacy spellings; historical probe: "compliance attributes require portable data-subject semantics"), command `handler` (never binds; a command cannot declare both `produces` and `handler`, `PLAY0035`), bare `rule <Name>`, `require` or conditions over read-model paths, dates and `today` in comparisons, `$context.tenant`/claims/roles/causation in `produces`, `$env` conditions, `file` constraints, unquoted `import` of an external contract, a read model whose keyed queries in its own slice do not share one `by` property (none, or two different properties; several queries over the same property bind), any query other than `=> <ReadModel> optional` with one caller-supplied `by` argument (so also observable, filtered, scoped and performer-backed queries), `$causedBy` and templates in projections |
263
+ | Blocks binding (`PLAY0268`) | `pii`/`secret` concepts (also legacy spellings; historical probe: "compliance attributes require portable data-subject semantics"), command `handler` (never binds; a command cannot declare both `produces` and `handler`, `PLAY0035`), bare `rule <Name>`, `require` or conditions over read-model paths, dates and `today` in comparisons, `$context.tenant`/claims/roles/causation in `produces`, `$env` conditions, `file` constraints, unquoted `import` of an external contract, a read model with neither explicit `key` nor unambiguous query-based identity as described above (composite keys remain unadmitted), queries with filters, scope, performer, context-derived `by` or composite `by` blocks (optional keyed and collection queries, including observable delivery, bind at 4.135.0), `$causedBy` and templates in projections |
258
264
  | Blocks binding (`PLAY0271`, legacy meaning) | Command `reads` and `concurrency` |
259
265
  | Deferred (`PLAY0269`, information) | Screens, layouts, templates, forms, contributions, UI profiles, themes, behaviors and `on`/`uses` |
260
266
  | Metadata only (`PLAY0270`, information) | `domain`, `seed`, `persona`, trigger and other descriptions, and `file` provenance on declarations |
@@ -98,6 +98,9 @@ with `view: "diagnostics"`, then `view: "repairs"` at the current revision.
98
98
  | `PLAY0469` | Remove an inline same-source identifier property and mapping, retiring its semantic address. This changes the contract; `canFixAll` is false. Refuse other consumers, opaque impact, changed routing or comment loss. Plain contracts get guidance only. |
99
99
  | `PLAY0479` | Migrate one optional type spelling, or all in a document, preserving syntax and trivia. Exclude `query Q => observable?`. |
100
100
  | `PLAY0563/0564` | Expand a one-line interaction alternative / turn a strict item `where` into one block-form `when`. Individual review, canonical formatting, no pinned evidence; refuse comment loss. Opaque non-item-condition text has no PLAY0564 repair. |
101
+ | `PLAY0614` | Declare Translate direction only when exactly one inbound/outbound interpretation fits public metadata; never change event visibility to make a repair fit. |
102
+ | `PLAY0661` | Complete command reads only when each missing part has one same-named compatible source; preserve authored parts and refuse ambiguity. Queries and trigger reads have no repair. |
103
+ | `PLAY0664` | Remove an override identical to the command's complete source/stream/id route. |
101
104
  | `PLAY0516` | Move a producing sibling declaration/import before its consumer, or pin an already placed file before a retained glob. Preserve catalogs, comments, placement and executable readiness; introduce no timeline findings. Own-sub-feature edges, cycles, unranked members and mixed/different-parent boundaries have no repair. Rediscover after each move; pinned evidence is unsupported. |
102
105
 
103
106
  These discoveries verify acceptance before listing a repair. Only compact
@@ -188,7 +191,8 @@ persona/policy and table/case/caseParameter provenance. Neither view executes.
188
191
 
189
192
  Screenplay v4.127.0 `mcp/reference.md` and `authoring-tools.md` describe these
190
193
  additions (checked at 4.127.0); discover installed schemas because current
191
- CLI 3.46.1 bundles Screenplay 4.130.0, not standalone 4.131.0.
194
+ Previous CLI 3.46.1 bundled Screenplay 4.130.0; CLI 3.50.0 bundles
195
+ 4.131.0, so these source objects are available there too.
192
196
 
193
197
  - Identity/detail summaries expose declared sources; `$identity` has its own
194
198
  expression node. The block alone stays executable-ready, but executable reads
@@ -322,7 +326,8 @@ the open model as candidate:
322
326
  }
323
327
  ```
324
328
 
325
- These source objects require Screenplay 4.131.0; CLI 3.46.1 bundles 4.130.0.
329
+ These source objects require Screenplay 4.131.0; CLI 3.50.0 bundles it
330
+ (previous CLI 3.46.1 bundled 4.130.0).
326
331
  Discover installed schemas rather than assuming bundle parity.
327
332
  Check that the registered worktree is checked out at the intended commit and
328
333
  contains the baseline model; Git refs are not resolved. An admitted missing
@@ -146,10 +146,12 @@ Historical verified public vector and executable checks:
146
146
 
147
147
  - executed toolchain: public CLI 3.43.0 (`23e5a24`), whose default runtime was
148
148
  `cratis/stage:4.52.0` and which bundled Screenplay 4.127.0. Published since,
149
- and not verified by this vector: Scene 4.17.0, Screenplay 4.133.1, Stage 4.64.0, CLI
150
- 3.46.1 (bundling Screenplay 4.130.0, default Stage still 4.52.0) and Studio 0.152.2.
149
+ and not verified by this vector: Scene 4.17.0, Screenplay 4.133.1, Stage 4.64.0,
150
+ previous CLI 3.46.1 (bundling Screenplay 4.130.0, then-default Stage 4.52.0) and
151
+ Studio 0.152.2. Current pins are CLI 3.50.0 (Screenplay 4.131.0 / Stage 4.67.0)
152
+ and standalone Screenplay 4.135.0; see toolchain `references/versions.md`.
151
153
  Compiler claims from this `cratis` probe are 4.127.0 claims, not current CLI
152
- 3.46.1/Screenplay 4.130.0 claims;
154
+ 3.50.0/Screenplay 4.131.0 claims;
153
155
  - fixture root: `Source/DotNET/Screenplay.CanonicalCorpus/Corpus/ScreenComposition/v1/source/folder`
154
156
  in the Screenplay repository;
155
157
  - Screenplay repo tool (available checkout): `dotnet run --project Source/DotNET/Tool
@@ -6,7 +6,7 @@
6
6
  { "kind": "play-compiles" },
7
7
  {
8
8
  "kind": "skill-contains",
9
- "value": "Screenplay v4.131.0"
9
+ "value": "Screenplay v4.135.0"
10
10
  },
11
11
  {
12
12
  "kind": "skill-contains",
@@ -31,7 +31,7 @@ adapted to `.play` declarations (`references/provenance.md`).
31
31
  |---|---|---|
32
32
  | Screenplay | `v4.66.0` (`c89198b`) | MCP catalog (29 tools: `describe-application`, `search-declarations`, `dependencies`, `find-assertion-gaps`, `read-workspace`, `declaration-details`) in `Source/DotNET/Screenplay.Mcp/McpToolCatalog.cs`; diagnostics PLAY0029, PLAY0191, PLAY0268, PLAY0271, PLAY0350, PLAY0381, PLAY0469 in `Source/DotNET/Screenplay/Diagnostics/DiagnosticCodes.cs`; decision 0008 (one data subject per event) |
33
33
  | Screenplay | `v4.127.0` | `find-specification-obligations` (SPEC001–SPEC008 authored presence), `find-modeling-smells` (SMELL001–SMELL005 advisory questions); neither proves executed behavior or complete lineage |
34
- | Screenplay | `v4.131.0` | `semantic-diff` source objects and revision-pinned pages: `Source/DotNET/Screenplay.Mcp/{McpRevisionDiff,McpWorkspaces.Comparison,McpToolCatalog}.cs`, `Documentation/screenplay/mcp/reference.md`; CLI 3.46.1's 4.130.0 bundle predates these arguments |
34
+ | Screenplay | `v4.131.0` | `semantic-diff` source objects and revision-pinned pages: `Source/DotNET/Screenplay.Mcp/{McpRevisionDiff,McpWorkspaces.Comparison,McpToolCatalog}.cs`, `Documentation/screenplay/mcp/reference.md`; previous CLI 3.46.1 predates these; CLI 3.50.0 bundles them |
35
35
  | cratis CLI | `v3.28.3` | bundles Screenplay 4.66.0 and Stage 4.24.2; see the toolchain skill |
36
36
 
37
37
  The full pin table lives in `cratis-screenplay-toolchain` `references/versions.md`; do not copy
@@ -243,18 +243,17 @@ verdict follows the rules in `references/report-template.md`.
243
243
  - Complete examples in this skill compile: `references/worked-example.md`.
244
244
 
245
245
  ## Route near misses
246
- - Writing missing specs: `cratis-screenplay-scenario-coverage`. Slice redesign:
247
- `cratis-screenplay-slice-design`. Stream and invariant fixes:
248
- `cratis-screenplay-streams-and-consistency`. Automations and translations:
249
- `cratis-screenplay-automations-and-translations`.
250
- - Phases, modes and verdicts: `cratis-screenplay-modeling-lifecycle`. Tools, versions and
251
- diagnostics: `cratis-screenplay-toolchain`. Construct mechanics: `cratis-screenplay-specifications`,
246
+ - Specs: `cratis-screenplay-scenario-coverage`; slices: `cratis-screenplay-slice-design`;
247
+ streams/invariants: `cratis-screenplay-streams-and-consistency`;
248
+ reactions/translations: `cratis-screenplay-automations-and-translations`.
249
+ - Modes/verdicts: `cratis-screenplay-modeling-lifecycle`; tools/diagnostics:
250
+ `cratis-screenplay-toolchain`; syntax: `cratis-screenplay-specifications`,
252
251
  `cratis-screenplay-command-surface`, `cratis-screenplay-projections`.
253
- - Chronicle compliance review: `cratis-chronicle-event-modeling`. Rendered code, gap-fill and
254
- code review: `cratis-screenplay-render-and-gap-fill`, `cratis-code-review`,
255
- `cratis-application-slice-conformance`.
252
+ - Compliance: `cratis-chronicle-event-modeling`; rendered/gap-filled code:
253
+ `cratis-screenplay-render-and-gap-fill`, `cratis-code-review`, `cratis-application-slice-conformance`.
256
254
 
257
255
  ## References (load on demand)
256
+ - Review public leaks, direction, complete keys and effective routes with [public/key/route checks](references/public-keys-and-routes.md).
258
257
  - Read `references/checklist.md` when performing the element sweep and phased audit; it contains eleven phases, 89 checks, tiers and evidence sources.
259
258
  - Read `references/anti-patterns.md` when investigating an anti-pattern signal; it gives the signal, why it matters, tier and Screenplay fix.
260
259
  - Read `references/report-template.md` when classifying findings, deciding the verdict, writing the report or conducting a re-review; it defines report, severity and verdict rules.
@@ -263,4 +262,4 @@ verdict follows the rules in `references/report-template.md`.
263
262
  - Read `references/business-questions.md` when conducting the business-question pass; it contains the explainer journey method, prompts and word translation.
264
263
 
265
264
  ## Lineage
266
- Read `references/provenance.md` when checking method lineage, attribution or adaptation permissions.
265
+ Method lineage, attribution and adaptation permissions: `references/provenance.md`.
@@ -62,7 +62,7 @@ the problem, the checks it violates, the fix, all pinned to one declaration.
62
62
  | Missing `for` | an event production (`produces <Event>` or `produces event`) without `for`. Not operation productions: they are authorable design intent, belong to commands, and take no event `for`, tags or routing | runtimes disagree on the destination | C (executable) / D | `for <identifier>` |
63
63
  | Unbuilt read-model field | field no projection maps and AutoMap cannot fill | always empty; not reported by the compiler | D | map it or remove it |
64
64
  | Undeclared removal/append event | `remove with` or capture `append` names an undeclared event | passes V1, fails binding (V2/V3, PLAY0273) | C (executable) / D | declare or fix the name; run V3 |
65
- | Gated command invoked by a reaction without a declared actor | reaction `invokes` a command under a caller policy and has no `runs as system role "<Role>"` that satisfies the gate | the invocation carries no caller: rejected at run time | D (major) | declare `runs as system role "<Role>"` with the least-privilege role the gate admits (ESM v10, Screenplay 4.125.0; current CLI 3.46.1 refuses v10 with CLI-RENDER-004, so gap-fill) or record another trusted-path decision - never just delete the gate. A matching `runs as system role` is the admitted trusted path, not a defect |
65
+ | Gated command invoked by a reaction without a declared actor | reaction `invokes` a command under a caller policy and has no `runs as system role "<Role>"` that satisfies the gate | the invocation carries no caller: rejected at run time | D (major) | declare `runs as system role "<Role>"` with the least-privilege role the gate admits (ESM v10, Screenplay 4.125.0; previous CLI 3.46.1 refused v10 with CLI-RENDER-004, so gap-fill) or record another trusted-path decision - never just delete the gate. A matching `runs as system role` is the admitted trusted path, not a defect |
66
66
  | `reads` + `produces` reaction | reaction both reads a view and produces | fails binding | C (executable) | invoke a command, or produce without reads |
67
67
  | `reads` treated as protection | rule "checked" because the command or reaction `reads` a view | `reads` enforces nothing | D (major) | keep or introduce `reads <View>` + `require ... message` as stated intent, mark it NOT enforced in the slice `description`, name the target (`[ProtectedDecision]` + `DecisionRead<T>`, Chronicle DCB, or a constraint where it fits); checklist E3 |
68
68
  | Caller-supplied state rule | `require currentStatus == "open"` where the caller sends `currentStatus` | the caller decides its own permission | D (major) | read the stored state with `reads`; keep or introduce `reads <View>` + `require ... message` as stated intent, mark it NOT enforced in the slice `description`, name the target (`[ProtectedDecision]` + `DecisionRead<T>`, Chronicle DCB, or a constraint where it fits); checklist E3 |
@@ -0,0 +1,32 @@
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
+ # Public contracts, lookup keys and observer routes
5
+
6
+ Add these to the element sweep, with evidence pinned to the declaration:
7
+
8
+ - Does a command publish a public event, a foreign event get produced locally,
9
+ or a local public event get produced outside an explicit outbound Translate?
10
+ Check for unintended personal/secret fields in the exported contract. An outbound
11
+ slice owns exactly one local public event type and consumes private local facts.
12
+ - Is direction explicit when public metadata is used? Does an inbound translation
13
+ accept public foreign events and emit private local facts? A quoted origin is
14
+ an opaque store name with an unverified local shape, not proof of interoperability.
15
+ Read automations-and-translations `references/public-events-and-direction.md`.
16
+ - Is the view identity explicitly marked `key` or unambiguously inferred? Does each
17
+ single-instance query/read supply every part exactly once, with compatible types,
18
+ and do state fixtures contain all parts? Do PDL keys align with the view's key?
19
+ Composite view keys still refuse binding at 4.135.0 (PLAY0268, #599); compilation
20
+ is not executable evidence. Read read-surface `references/named-keys.md`.
21
+ - Does a production override replace the whole source/stream/id route, rather than
22
+ assume partial inheritance? Is its `for` destination still explicit and compatible?
23
+ Are skipped production routes valid, so eager resolution cannot fail unexpectedly?
24
+ - Does a reaction/reducer `from Source[.Stream]` include the intended producers'
25
+ effective routes? Unrouted facts never match, including capture, reaction-direct
26
+ facts and public publication. PLAY0666 is a C# warning about all *known* producers,
27
+ not proof that a handler/foreign source will deliver. Filters have no stream-id
28
+ predicate and are not projection filters. Read toolchain
29
+ `references/production-routes-and-filters.md`.
30
+
31
+ Report binding, reference execution and Stage admission separately. Never remove
32
+ public metadata, key parts or filters to make a review's mode gate pass.
@@ -3,6 +3,7 @@
3
3
  "input": "Review the marina berth .play model before we accept it: check the model and report findings, do not change anything.",
4
4
  "fixtures": [],
5
5
  "assertions": [
6
+ { "kind": "skill-contains", "value": "all *known* producers", "file": "references/public-keys-and-routes.md" },
6
7
  { "kind": "play-compiles" },
7
8
  { "kind": "skill-contains", "value": "PASS WITH WARNINGS" },
8
9
  { "kind": "skill-contains", "value": "Every finding is pinned to one declaration" },
@@ -75,6 +75,17 @@ build a read model** — two builders is error `PLAY0191`: *a projection or a
75
75
  reducer builds it, and only one of them*. A slice may still declare several
76
76
  projections, each building a **different** read model.
77
77
 
78
+ ## Public-event targets and observer filters
79
+
80
+ In an explicitly outbound Translate slice, `projection P => PublicEvent` or
81
+ `reducer P => PublicEvent` targets the slice's one local public event (ESM v9).
82
+ The projection folds one instance per event source id; opaque reducers remain
83
+ Unsupported in reference execution. Read
84
+ [public-event folds](../cratis-screenplay-automations-and-translations/references/public-events-and-direction.md)
85
+ for publication rules and the `when append`/`then PublicEvent` specification.
86
+ A reducer can filter `from Source[.Stream]` (ESM v10); a projection cannot.
87
+ Read [observer filters](../cratis-screenplay-toolchain/references/production-routes-and-filters.md).
88
+
78
89
  ## Projection-level directives
79
90
 
80
91
  `no automap`, `sequence <name>`, `file <path>`. `sequence` is a realization
@@ -55,16 +55,19 @@ A read model declares what it **is** — nothing about what builds it. Whatever
55
55
  builds it points at it with `=>`, and **exactly one thing may**: two builders is
56
56
  error `PLAY0191`. See `cratis-screenplay-projections` for the builder side.
57
57
 
58
- Do not mark a read-model property `identifier`. The executable model infers the
59
- instance identifier from the `by` property of the keyed queries that return the
60
- read model in its own slice
61
- (`query InvoiceById => InvoiceSummary optional`, then `by invoiceId InvoiceId`
62
- on its own body line). Several queries
63
- over the same `by` property are fine; each must still have the shape the
64
- executable model admits, `=> <ReadModel> optional` with one caller-supplied `by`. A read
65
- model with no keyed query, or with keyed queries over different `by` properties,
66
- has no unambiguous identifier and does not bind (`PLAY0268`), and specifications
67
- cannot select an instance of it.
58
+ Use trailing `key` on top-level read-model properties, never `identifier`.
59
+ Explicit marks replace inference; otherwise a single-instance query's `by` supplies
60
+ identity (all such queries must agree). Only with no single-instance identifier
61
+ and an admitted list query does the binder infer an unambiguous `*Id`; queryless
62
+ read models need an explicit `key`. See named keys below for collection-key exclusions.
63
+ One explicit key binds byte-identically to equivalent inference. Several marks
64
+ form a composite key, supplied by name in query/read
65
+ `by` blocks. At Screenplay 4.135.0 composite keys and block queries remain
66
+ **authoring-only** (PLAY0268, #599); the scalar optional snapshot shape binds.
67
+ Read [named keys](references/named-keys.md) for complete examples, trigger/command
68
+ reads, all-parts fixtures, PLAY0660–0662 and command-read-only PLAY0661 repair.
69
+ A `=>` target resolving to an event is an event-target builder, not a read model;
70
+ keep event and read-model names distinct (see projections' public-event targets).
68
71
 
69
72
  ## `query`
70
73
 
@@ -79,12 +82,12 @@ query ListInvoices => InvoiceListReadModel[]
79
82
  authorize IsAuthenticated
80
83
  ```
81
84
 
82
- ⚠️ **A list query is design-only.** `=> RM[]`, `observable`, `filter`, `scoped to` and
83
- `performer` are valid model language, but neither the executable model nor Stage
84
- 4.24.0 binds or renders them (`PLAY0268`). Model them when the application needs them,
85
- and keep a list the domain needs. A keyed `XById => RM optional` query with one `by` is
86
- the shape that binds, runs in specifications and renders, but adding it beside a list
87
- does not unblock anything: while a list remains, the whole application stays unbound.
85
+ **Name the compiler and renderer.** At Screenplay 4.135.0, optional keyed queries
86
+ and collection queries bind, including `observable`, with caller-supplied `by`
87
+ or no `by` on a collection. Filters, scope, performer and context-derived `by`
88
+ remain PLAY0268. The old Stage 4.24.0 list refusal is not a current compiler
89
+ limitation; check the target renderer's admission separately. Keep a list the
90
+ domain needs rather than inventing a keyed query solely to infer identity.
88
91
 
89
92
  Return-type forms after `=>`: `ReadModel`, `ReadModel optional`, `ReadModel[]`,
90
93
  each optionally prefixed `observable`. `ReadModel[] optional` permits an absent
@@ -0,0 +1,122 @@
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
+ # Named read-model keys and complete lookups
5
+
6
+ ## Contents
7
+
8
+ - Declare identity
9
+ - Supply every part
10
+ - Specifications and executable boundary
11
+ - Repairs and evidence
12
+
13
+ ## Declare identity
14
+
15
+ A trailing `key` on a top-level read-model property declares instance identity.
16
+ One explicit mark replaces inference and binds byte-identically to the equivalent
17
+ inferred identifier. Several marks declare a composite key. At 4.135.0, identity
18
+ selection is:
19
+
20
+ 1. Explicit `key` marks take precedence over inference.
21
+ 2. Without marks, single-instance queries in the owning slice supply identity from
22
+ their `by` property; their distinct `by` names must identify one property.
23
+ 3. Only when no single-instance query supplies an identifier **and** an admitted
24
+ collection/list query exists does the binder consider conventional `*Id` names
25
+ (case-sensitive). It first excludes collection-query `by` properties: if exactly
26
+ one candidate remains, that is the identifier; otherwise it uses all `*Id`
27
+ candidates and requires exactly one. An admitted list query here is a collection
28
+ query without context-derived `by`, filters, scope or performer.
29
+
30
+ A projection-only/queryless read model needs an explicit `key`: a lone `*Id`
31
+ property alone does not infer identity. Never use the command's `identifier`
32
+ modifier on a read model.
33
+
34
+ A key part is required and noncollection; it cannot also be `optional`, `generated`,
35
+ `identifier` or `subject`. A single key may have a composite type, but parts of a
36
+ multipart key must be scalar. Declaration order is display order, not identity:
37
+ Chronicle's object keys are not ordered, encoded event stream ids.
38
+
39
+ Choose a composite key when independent coordinates identify the business view,
40
+ such as resource and reporting period. Prefer the natural single id when the view
41
+ is one entity's state. Do not concatenate parts into an invented string id merely
42
+ to pass binding; keep the truthful model and report the capability gap. Read-model
43
+ keys do not supply projection routes: align each PDL `from ... key` mapping with
44
+ the declared view identity (projection keys are a separate contract).
45
+
46
+ ## Supply every part
47
+
48
+ A scalar query keeps `by name Type` on its own body line. A composite query has a
49
+ bare `by` header and at least two distinct `name Type [from source]` children.
50
+ Do not combine scalar and block forms. A single-instance lookup must supply every
51
+ key part exactly once, with the declared types; collection queries may narrow by
52
+ a subset but still have their separate executable-query limitations.
53
+
54
+ A command or reaction trigger read uses a child `by` block of `part = source`.
55
+ Sources are required, noncollection property paths with compatible nominal types,
56
+ not literals. Trigger reads map from the trigger's declared values. The historical
57
+ single `reads View by value` form remains available for a single key.
58
+
59
+ This complete authoring-only example declares all lookup parts:
60
+
61
+ ```screenplay
62
+ concept ResourceId : Uuid
63
+ concept Period : String
64
+ module Reporting
65
+ feature Months
66
+ slice StateView Totals
67
+ readmodel ResourceMonth
68
+ resourceId ResourceId key
69
+ period Period key
70
+ hours Decimal
71
+ query FindMonth => ResourceMonth optional
72
+ by
73
+ resourceId ResourceId
74
+ period Period
75
+ slice StateChange CloseMonth
76
+ command CloseMonth
77
+ resourceId ResourceId identifier
78
+ period Period
79
+ reads ResourceMonth as totals
80
+ by
81
+ resourceId = resourceId
82
+ period = period
83
+ produces event MonthClosed
84
+ for resourceId
85
+ period Period = period
86
+ ```
87
+
88
+ Screen `data ... via query ... by value`, forms and navigation remain scalar
89
+ lookups: they cannot supply a composite single-instance key (PLAY0661). Do not
90
+ invent UI tuple syntax. Context-derived query parts do not become caller inputs;
91
+ keep tenant/subject ownership at the runtime boundary, not in editable UI filters.
92
+
93
+ ## Specifications and executable boundary
94
+
95
+ `given readmodel` and `then readmodel` state every key part (PLAY0351 if missing).
96
+ A composite absence fixture uses an object with every named part. Query result
97
+ assertions may omit keys when arguments already select the instance.
98
+
99
+ At Screenplay 4.135.0, composite read-model keys, query `by` blocks and fixtures
100
+ over those views remain authoring-only: binding reports PLAY0268 citing
101
+ Screenplay#599 (still open). They do not reference-execute or render. This is not
102
+ ESM v10 admission; v10 covers reaction identity, production routes and observer
103
+ filters. Command reads independently remain unprotected/unadmitted (PLAY0271).
104
+ A single explicit key does bind; Stage admission still depends on the complete
105
+ model and projection/query shape, not just the key modifier.
106
+
107
+ ## Repairs and evidence
108
+
109
+ - PLAY0660: fix key owner, modifier or type; no automatic repair.
110
+ - PLAY0661: supply missing parts. The typed repair covers **command reads only**
111
+ when each missing part has one same-named compatible source. It preserves
112
+ authored mappings and refuses ambiguity; queries/trigger reads are not repaired.
113
+ - PLAY0662: fix shape, duplicate/unknown parts or incompatible sources; no repair.
114
+ - Read-model property rename remains unsupported until its mapping chain can be
115
+ preserved. Use the model-authoring proposal/preview/apply contract, not a text
116
+ shortcut around an identity-preserving refusal.
117
+
118
+ Source: Screenplay `v4.135.0:Documentation/screenplay/{readmodels,queries,commands,reactions,specifications}.md`,
119
+ `fixtures/named-read-model-keys.play`, decision 0060, and
120
+ `Source/DotNET/Screenplay/Semantics/SemanticModelBinder.ReadModels.cs` (identity inference).
121
+ Its authoring delivery shipped
122
+ in 4.129.0; that release did not deliver #599's executable composite-key contract.
@@ -3,6 +3,9 @@
3
3
  "input": "Declare a Screenplay query and the screen that binds to it.",
4
4
  "fixtures": [],
5
5
  "assertions": [
6
+ { "kind": "skill-contains", "value": "query FindMonth", "file": "references/named-keys.md" },
7
+ { "kind": "skill-contains", "value": "command reads only", "file": "references/named-keys.md" },
8
+ { "kind": "skill-contains", "value": "remain authoring-only", "file": "references/named-keys.md" },
6
9
  { "kind": "play-compiles" },
7
10
  { "kind": "skill-contains", "value": "main `fd18129`" },
8
11
  { "kind": "skill-contains", "value": "filter status InvoiceStatus optional" },
@@ -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.46.1` (`v3.46.1`) | Source-checked `Directory.Packages.props`: Stage 4.52.0, Screenplay 4.130.0, `Cratis.Arc.Screenplay` 22.54.0, Chronicle 19.32.0, Fundamentals 7.22.8; default runtime image `cratis/stage:4.52.0`. No new render/browser probe. UI-profile rejection (`CLI-RENDER-007` to `CLI-RENDER-010`) and render-then-recover shipped in 3.41.0 (Cratis/cli#301). Historical screens release vector: 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.52.0` (CLI 3.46.1 default) | Executed on CLI 3.43.0. Admission (`STAGE-ESM-*`, and `PLAY0268` render refusals surfaced by the CLI), ownership manifest, `Customizations/` seams, Debug-only specifications, guarded actions (`STAGE-SCENE-ACTION-001`) and interactions (`STAGE-SCENE-INTERACTION-001`) were source-checked at 4.51.3. Older baselines: 4.49.5, 4.43.0 and `v4.24.2` (`32dcac4`) |
30
- | Screenplay | bundled `4.130.0`; standalone `4.131.0` | Standalone compiler for V1 to V3; binding codes `PLAY0268` and code-attachment rules were read at `v4.66.0`. Historical CLI 3.41.0 probes used bundled 4.114.0; current `cratis` compiler claims require checking 4.130.0 |
28
+ | cratis CLI | `3.50.0` (`v3.50.0`) | Source-checked `Directory.Packages.props`: Stage 4.67.0, Screenplay 4.131.0, `Cratis.Arc.Screenplay` 22.54.0, Chronicle 19.32.0, Fundamentals 7.22.8; default runtime image `cratis/stage:4.67.0`. Previous CLI 3.46.1 used Stage 4.52.0/Screenplay 4.130.0. No new render/browser probe. UI-profile rejection (`CLI-RENDER-007` to `CLI-RENDER-010`) and render-then-recover shipped in 3.41.0 (Cratis/cli#301). Historical screens release vector: 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.67.0` (CLI 3.50.0 default) | Source-checked, not executed as a new vector. Previous Stage 4.52.0 was executed on CLI 3.43.0. Admission (`STAGE-ESM-*`, and `PLAY0268` render refusals surfaced by the CLI), ownership manifest, `Customizations/` seams, Debug-only specifications, guarded actions (`STAGE-SCENE-ACTION-001`) and interactions (`STAGE-SCENE-INTERACTION-001`) were source-checked at 4.51.3. Older baselines: 4.49.5, 4.43.0 and `v4.24.2` (`32dcac4`) |
30
+ | Screenplay | bundled `4.131.0`; standalone `4.135.0` | Standalone compiler for V1 to V3; binding codes `PLAY0268` and code-attachment rules were read at `v4.66.0`. Historical CLI 3.41.0 probes used bundled 4.114.0; current `cratis` compiler claims require checking 4.131.0 |
31
31
  | Rendered apps (historical check) | Arc `22.50.5`, Chronicle `19.32.0`, Scene packages | Stage 4.51.3 scaffold; `[ProtectedDecision]` / `DecisionRead<T>` available to gap-fill, not emitted enforcement. Embedded reverse extraction disabled; verify generated packages before claiming exact Scene runtime parity |
32
32
 
33
33
  Historical facts retain their checked tags; current pins are source-checked, not new runtime probes.
@@ -77,9 +77,12 @@ the model, hand-write the command and its response with the model (and its fixtu
77
77
  specifications) as the contract, and report V3 from the standalone tool and V5 as `not run: no render`.
78
78
 
79
79
  Models with event sources, streams or command routes bind and reference-execute as ESM v8 on standalone
80
- Screenplay 4.125.0, so report V3 and V4 from that tool. They are still case A or C for rendering: current CLI 3.46.1
81
- refuses models above ESM v7 with `CLI-RENDER-004`, so hand-write the code with the model as the
82
- contract (`cratis-screenplay-toolchain` `references/sources-and-streams.md`).
80
+ Screenplay 4.125.0, so report V3 and V4 from that tool. Previous CLI 3.46.1 refused above v7 with CLI-RENDER-004. Current CLI 3.50.0/Stage
81
+ 4.67.0 reaches v8 route checks and construct admission through v10. Public publication,
82
+ foreign events/event captures and v10 reaction identity/filters/production overrides
83
+ still receive typed refusals; reducer filters render. Keep refused scope as case A/C,
84
+ never infer target support from binding. Read Stage's `references/admission.md` and
85
+ toolchain `references/sources-and-streams.md`.
83
86
 
84
87
  Two rules hold in every case: a customization never makes a rejected model renderable, and
85
88
  a whole-application V5 is never claimed from a subset. The CLI renders whole applications
@@ -77,9 +77,9 @@ not bind a modeled reaction or capture. Case C (no generated application): there
77
77
  composition conventions (`rules/vertical-slices.md`, `cratis-chronicle-reactor`).
78
78
  Declare the trusted actor with reaction `runs as system role "<Role>"`
79
79
  (standalone 4.125.0, ESM v10); `given caller` is not an invocation actor.
80
- Historical CLI 3.41.0's older compiler rejected the syntax. Current CLI 3.46.1
81
- bundles Screenplay 4.130.0 / Stage 4.52.0 but still admits through v7 only
82
- (CLI-RENDER-004 for v10). Gap-fill retains the declared role and uses Arc
80
+ Historical CLI 3.41.0's older compiler rejected the syntax. CLI 3.50.0/Stage 4.67.0
81
+ reaches v10 construct admission but still refuses reaction identity
82
+ (STAGE-ESM-034); previous CLI 3.46.1 admitted through v7 only. Gap-fill retains the declared role and uses Arc
83
83
  `[ExecuteCommandsAsSystem]` for returned commands. Checked model and diagnostics:
84
84
  captures-and-reactions `references/invocation-identity.md`.
85
85
 
@@ -38,7 +38,7 @@
38
38
  },
39
39
  {
40
40
  "kind": "skill-contains",
41
- "value": "case A or C for rendering"
41
+ "value": "Keep refused scope as case A/C"
42
42
  },
43
43
  {
44
44
  "kind": "skill-contains",
@@ -175,6 +175,17 @@ target requirements.
175
175
  - After a correction or backdated fact, does the view still say something true?
176
176
  - Cross-context views: are the real source contracts resolved, or is missing evidence a gap?
177
177
 
178
+ ## Public-event coverage (ESM v9)
179
+
180
+ Outbound publication needs `when append <private>` and `then <PublicEvent>`:
181
+ complete state, incomplete state, unchanged repeat, changed instance, separate
182
+ source ids and the exported field boundary. Reference publication is executable;
183
+ source-event captures and reached opaque event-target reducers are typed
184
+ Unsupported. Read automations-and-translations `references/public-events-and-direction.md`.
185
+ For routed producers/observers, cover override versus inherited route, skipped
186
+ production route failure, matching/wrong source/stream and unrouted facts;
187
+ see toolchain `references/production-routes-and-filters.md`.
188
+
178
189
  ## Version skew: reaction cascades and false PLAY0285
179
190
  Under ESM v6 a command spec's `then` lists the events reactions cascade from it. The compiler
180
191
  bundled in `cratis` before 3.28.2 (Screenplay 4.60.1) reported a **false PLAY0285** for such
@@ -5,7 +5,7 @@ The subsets themselves (what binds, what renders) are owned by `cratis-screenpla
5
5
  says what that means for writing specs. A form outside the chosen mode is never deleted from a
6
6
  design model: keep it and record the gap. The detailed Stage 4.24.x rows below
7
7
  retain historical admission evidence; current pins are standalone Screenplay
8
- 4.131.0 / CLI 3.46.1 (Screenplay 4.130.0 / Stage 4.52.0). Run actual target admission instead of assuming old restrictions carry over.
8
+ 4.135.0 / CLI 3.50.0 (Screenplay 4.131.0 / Stage 4.67.0). Run actual target admission instead of assuming old restrictions carry over.
9
9
  Typed example/override forms: `cratis-screenplay-specifications`
10
10
  `references/examples-and-routes.md`.
11
11
 
@@ -23,7 +23,7 @@ Typed example/override forms: `cratis-screenplay-specifications`
23
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) |
24
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`) | historically no at Stage 4.24.x; check current target admission |
25
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.46.1 refuses models above v7 before planning |
26
+ | Event `stream` / `no stream`, typed `for` and stream ids | yes | ESM v8 at 4.125.0 | CLI 3.50.0 reaches Stage route checks; routed read-model/query replay can still refuse STAGE-ESM-030 |
27
27
  | Typed examples and overrides | yes | expanded and type-checked before binding; required fields remain required | depends on expanded contract, not fixture reuse |
28
28
  | `given operation ... fails`, `then operation`, `then compensated` | yes | unadmitted PLAY0268 | gap-fill |
29
29
  | Refusal branches, `when redelivered`, `then no events` | yes | unadmitted PLAY0268 | gap-fill |