@cratis/pi 7.82.0 → 7.83.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 (21) hide show
  1. package/package/corpus/product-sync.json +3 -3
  2. package/package/corpus/skills/cratis-screenplay-command-surface/references/inline-events.md +3 -2
  3. package/package/corpus/skills/cratis-screenplay-command-surface/references/routes-and-external-operations.md +1 -1
  4. package/package/corpus/skills/cratis-screenplay-model-authoring/SKILL.md +1 -1
  5. package/package/corpus/skills/cratis-screenplay-model-authoring/references/destination-intent-repair.md +107 -0
  6. package/package/corpus/skills/cratis-screenplay-model-authoring/references/language-reference.md +7 -3
  7. package/package/corpus/skills/cratis-screenplay-model-authoring/references/mcp-loop.md +1 -1
  8. package/package/corpus/skills/cratis-screenplay-model-authoring/references/mcp-tools.md +9 -7
  9. package/package/corpus/skills/cratis-screenplay-model-authoring/references/repairs.md +3 -1
  10. package/package/corpus/skills/cratis-screenplay-scenario-coverage/references/view-and-story-specs.md +2 -2
  11. package/package/corpus/skills/cratis-screenplay-specifications/SKILL.md +2 -2
  12. package/package/corpus/skills/cratis-screenplay-streams-and-consistency/SKILL.md +1 -1
  13. package/package/corpus/skills/cratis-screenplay-streams-and-consistency/references/stream-id-rules.md +3 -2
  14. package/package/corpus/skills/cratis-screenplay-toolchain/references/cheat-sheet.md +2 -2
  15. package/package/corpus/skills/cratis-screenplay-toolchain/references/diagnostics.md +4 -3
  16. package/package/corpus/skills/cratis-screenplay-toolchain/references/executable-subset.md +6 -5
  17. package/package/corpus/skills/cratis-screenplay-toolchain/references/pdl-example.md +1 -1
  18. package/package/corpus/skills/cratis-screenplay-toolchain/references/screenplay-contract.json +205 -2
  19. package/package/corpus/skills/cratis-screenplay-toolchain/references/screenplay-contract.version +1 -1
  20. package/package/corpus/skills/cratis-screenplay-toolchain/references/sources-and-streams.md +4 -3
  21. package/package.json +1 -1
@@ -171,9 +171,9 @@
171
171
  }
172
172
  ],
173
173
  "synced": {
174
- "version": "4.213.0",
174
+ "version": "4.216.0",
175
175
  "date": "2026-10-18",
176
- "by": "Cratis/AI#771"
176
+ "by": "Cratis/AI#784"
177
177
  },
178
178
  "covers": {
179
179
  "skills": [
@@ -201,7 +201,7 @@
201
201
  ],
202
202
  "rules": []
203
203
  },
204
- "notes": "Cratis/AI#771: standalone Screenplay 4.213.0 pinned; regenerated compiler contract is byte-identical to the v4.213.0 release asset and unchanged from 4.212.4. Reviewed the full v4.212.4-v4.213.0 delta against tagged decision 0093 and MCP reference: pre-binding container identities and stable binding/migration continuity, own-slice member substitutions, containerIdentities completeness/ambiguity/collision refusals, retained ambiguous notes, explicit semanticRenames/retirements, binding fixes through MCP, exact reopen exception, notes/identity rollback and exact-ID re-add anchoring. No grammar, binder, ESM or diagnostic-code changes; no new render/runtime probe. Prior: Cratis/AI#772: standalone Screenplay 4.212.4 pinned; regenerated compiler contract is byte-identical to the v4.212.4 release asset. Source-checked joined-event automap/no automap overrides and level fallback in executable binding; PLAY0380 covers only all inside children/nested. No new render/runtime probe. Prior: Cratis/AI#769: standalone Screenplay 4.212.3 pinned; regenerated compiler contract is byte-identical to the v4.212.3 release asset. Source-checked both compilers and projection documentation for PLAY0801 DuplicateEventInProjectionScope: shared from/removal/clear set, separate join set, fresh sets per children/nested/variant level, and no two-row update through repeated from blocks with different keys. No new render/runtime probe. Prior: Cratis/AI#768: standalone Screenplay 4.212.2 pinned; regenerated compiler contract is byte-identical to the v4.212.2 release asset (unchanged from the previous contract). Source-checked v4.212.0 split-model dotted note targets, open-workspace applicationIdentity and complete add/reanchor substitutions; unbound container identities are not claimed. v4.212.1 aligns PLAY0535 collection fields, optional parameters and single-result identity inference. v4.212.2 counts read-only query denials for SPEC004, not SPEC006. No new render/runtime probe. Prior: Cratis/AI#762 and #761: source-checked v4.210.0 and v4.211.0 contracts for PLAY0800 CommandHandlerRequiresAttachment (required typed subject, permanent code-attachment requirement, other PLAY0268 families unchanged), independent reference remove/add batches, located same-text ambiguity conflicts and string MCP conflict/move-report document fields. v4.211.1 mapping changes inspected but excluded from this guidance update at the user's request; no typed PLAY0273 property/type arguments are claimed. Standalone Screenplay 4.211.1 and its compiler contract pinned; the contract is a byte-identical copy of the v4.211.1 release asset. No new render/runtime probe. Prior: Standalone 4.205.0 and byte-identical compiler contract pinned. Cratis/AI#746: Uuid ==/!= in command require and produces when (ESM v28): same-concept rule, bare Uuid against a concept, canonical literals, protected read paths in require only; PLAY0268 (different concepts, ordering, Uuid validation and concept rules, read paths in produces when) and PLAY0273 (non-canonical literal) checked against the 4.205.0 compiler, v28 selection read from the MCP executable-model view; Stage admits exact v1-v21 and v23-v26 pairs so v28 is refused STAGE-ESM-016, not probed against a Stage image; CLI 3.74.0 renders through v26. Prior: Standalone 4.204.0 and byte-identical compiler contract pinned. Cratis/AI#702 and #691: PLAY0690 reducer identity (Screenplay 4.170.0, native compiler only) and the screenplay.json validation gate (Screenplay 4.165.0; cratis screenplay validate reads it from CLI 3.65.0) are taught and probed against the 4.204.0 compiler. Cratis/AI#743: flat composite read-model keys (ESM v27): untyped projection key blocks on root from and remove with, equality-filter lists, single-instance by blocks and per-part fixtures, with PLAY0661/PLAY0662/PLAY0268 refusals checked against the 4.204.0 compiler; Stage origin/main still refuses v27 with STAGE-ESM-016 (stage-rendering.md); Stage v4.135.0 v26 admission (Host and executor run date comparisons; renderer STAGE-ESM-046) was source-checked for this sync; no render or runtime probe. Prior: Standalone 4.201.0 and byte-identical compiler contract pinned. Cratis/AI#733: the ui profile root template, shell options, appearance and new screens default (PLAY0788-PLAY0799, quick fix for the legacy layout line, ui-profiles MCP tool, 44 tools). Cratis/AI#735: chronological Date/DateTime ordering in command conditions and command/property literal validation (ESM v26), UTC tick precision and pre-rule offset validation; then matching remains ordinal. Source-checked Screenplay v4.199.0 commands, diagnostics, interoperability and specifications documentation plus decision 0087. Stage v4.127.1 still refuses v26 with STAGE-ESM-016 (stage-rendering.md and SemanticVersionFeatures.Supports); no render/runtime probe. Cratis/AI#576: prior mechanical compiler catch-up. Language batch #717/#722/#723/#724/#720/#728/#734 teaches atomic reaction batches (v22), described payload handlers (v23), portable linear matching, ordinal text rules (v24), protected command reads (v25), diagnostic arguments and event-source invokes mappings. Facts read at Screenplay v4.198.0 and introducing tags; Stage v4.127.0 admits exact v1-v21 and v23-v25 pairs but refuses v22/v26 and mixed pairs (STAGE-ESM-016), protected reads (044), atomic mode (043) and described handlers (STAGE-IMPL-002), even Stub mode. Stage text rules execute/render; no new renderer/runtime probe or Stage pin uplift. Cratis/AI#706: application navigation regions (module inherit, extend or override), toolbar slice buttons, blueprint template references and sample data packs in cratis-screenplay-ui-composition (references/application-shell.md), with the canonical shell vector and the rejection codes PLAY0710-PLAY0722 and PLAY0740-PLAY0765. Examples moved to the executable-state rules since 4.164: translator reactions in an Automation slice beside the Translate slice (PLAY0694) and the first record of a capture key appended with `when added`. Earlier: Standalone 4.164.0 and byte-identical compiler contract pinned. Cratis/AI#663: one origin per capture (PLAY0687). #668: executable no-event/redelivery v17. #684: concept query-argument validation in every version and query-error assertions v18. #681: executable refusal branches and refusal values v19. #666: proposal summary/severity counts and exact structural source proposals. Generated-concept rules select v20 with PLAY0688/0689 proofs and derived-matches repair; generated secrets and preview strategies remain refused. Release-baseline from-esm admission reads storedName. Standalone binding is not renderer admission: Stage 4.103.0 admits v1-v17 and v19; CLI 3.62.0 bundles Screenplay 4.159.0 / Stage 4.99.0 and renders through v16. Prior evidence remains unless superseded; no new renderer, Docker or browser probe."
204
+ "notes": "Cratis/AI#779: reference-runner capability refusals taught as scoped per specification (introduced in v4.213.2, Cratis/Screenplay#897) from the v4.216.0 tool and MCP documentation and plan source: an unadmitted projection (UnsupportedEventContext, UnsupportedProjectionBlock) marks unsupported only the specifications that reach it or its read model, the others run and planIssues lists deferred issues; application-level issues still block every selected specification; no new render/runtime probe. Prior: Cratis/AI#776: PLAY0802 ReservedStoredName (introduced in v4.213.3, Cratis/Screenplay#893) taught from the v4.216.0 compilers and documentation: stored event source `Default` and stored event stream `All` (ordinal, name or `id` pin) refused at authoring time, a pin away from the reserved name valid, PLAY0273 kept as the binding backstop; no new render/runtime probe. Prior: Cratis/AI#784: standalone Screenplay 4.216.0 pinned; compiler contract replaced by the v4.216.0 release asset (adds the propose-repair destinationIntent v1 schema and PLAY0802 ReservedStoredName). Source-checked decision 0096 and the MCP reference for the explicit author-intent PLAY0470 repair: repair-intents discovery, intentActions feature detection, complete per-production selections, retained production-destination report and identity views, explicit apply and refusals. No new render/runtime probe. Prior: Cratis/AI#771: standalone Screenplay 4.213.0 pinned; regenerated compiler contract is byte-identical to the v4.213.0 release asset and unchanged from 4.212.4. Reviewed the full v4.212.4-v4.213.0 delta against tagged decision 0093 and MCP reference: pre-binding container identities and stable binding/migration continuity, own-slice member substitutions, containerIdentities completeness/ambiguity/collision refusals, retained ambiguous notes, explicit semanticRenames/retirements, binding fixes through MCP, exact reopen exception, notes/identity rollback and exact-ID re-add anchoring. No grammar, binder, ESM or diagnostic-code changes; no new render/runtime probe. Prior: Cratis/AI#772: standalone Screenplay 4.212.4 pinned; regenerated compiler contract is byte-identical to the v4.212.4 release asset. Source-checked joined-event automap/no automap overrides and level fallback in executable binding; PLAY0380 covers only all inside children/nested. No new render/runtime probe. Prior: Cratis/AI#769: standalone Screenplay 4.212.3 pinned; regenerated compiler contract is byte-identical to the v4.212.3 release asset. Source-checked both compilers and projection documentation for PLAY0801 DuplicateEventInProjectionScope: shared from/removal/clear set, separate join set, fresh sets per children/nested/variant level, and no two-row update through repeated from blocks with different keys. No new render/runtime probe. Prior: Cratis/AI#768: standalone Screenplay 4.212.2 pinned; regenerated compiler contract is byte-identical to the v4.212.2 release asset (unchanged from the previous contract). Source-checked v4.212.0 split-model dotted note targets, open-workspace applicationIdentity and complete add/reanchor substitutions; unbound container identities are not claimed. v4.212.1 aligns PLAY0535 collection fields, optional parameters and single-result identity inference. v4.212.2 counts read-only query denials for SPEC004, not SPEC006. No new render/runtime probe. Prior: Cratis/AI#762 and #761: source-checked v4.210.0 and v4.211.0 contracts for PLAY0800 CommandHandlerRequiresAttachment (required typed subject, permanent code-attachment requirement, other PLAY0268 families unchanged), independent reference remove/add batches, located same-text ambiguity conflicts and string MCP conflict/move-report document fields. v4.211.1 mapping changes inspected but excluded from this guidance update at the user's request; no typed PLAY0273 property/type arguments are claimed. Standalone Screenplay 4.211.1 and its compiler contract pinned; the contract is a byte-identical copy of the v4.211.1 release asset. No new render/runtime probe. Prior: Standalone 4.205.0 and byte-identical compiler contract pinned. Cratis/AI#746: Uuid ==/!= in command require and produces when (ESM v28): same-concept rule, bare Uuid against a concept, canonical literals, protected read paths in require only; PLAY0268 (different concepts, ordering, Uuid validation and concept rules, read paths in produces when) and PLAY0273 (non-canonical literal) checked against the 4.205.0 compiler, v28 selection read from the MCP executable-model view; Stage admits exact v1-v21 and v23-v26 pairs so v28 is refused STAGE-ESM-016, not probed against a Stage image; CLI 3.74.0 renders through v26. Prior: Standalone 4.204.0 and byte-identical compiler contract pinned. Cratis/AI#702 and #691: PLAY0690 reducer identity (Screenplay 4.170.0, native compiler only) and the screenplay.json validation gate (Screenplay 4.165.0; cratis screenplay validate reads it from CLI 3.65.0) are taught and probed against the 4.204.0 compiler. Cratis/AI#743: flat composite read-model keys (ESM v27): untyped projection key blocks on root from and remove with, equality-filter lists, single-instance by blocks and per-part fixtures, with PLAY0661/PLAY0662/PLAY0268 refusals checked against the 4.204.0 compiler; Stage origin/main still refuses v27 with STAGE-ESM-016 (stage-rendering.md); Stage v4.135.0 v26 admission (Host and executor run date comparisons; renderer STAGE-ESM-046) was source-checked for this sync; no render or runtime probe. Prior: Standalone 4.201.0 and byte-identical compiler contract pinned. Cratis/AI#733: the ui profile root template, shell options, appearance and new screens default (PLAY0788-PLAY0799, quick fix for the legacy layout line, ui-profiles MCP tool, 44 tools). Cratis/AI#735: chronological Date/DateTime ordering in command conditions and command/property literal validation (ESM v26), UTC tick precision and pre-rule offset validation; then matching remains ordinal. Source-checked Screenplay v4.199.0 commands, diagnostics, interoperability and specifications documentation plus decision 0087. Stage v4.127.1 still refuses v26 with STAGE-ESM-016 (stage-rendering.md and SemanticVersionFeatures.Supports); no render/runtime probe. Cratis/AI#576: prior mechanical compiler catch-up. Language batch #717/#722/#723/#724/#720/#728/#734 teaches atomic reaction batches (v22), described payload handlers (v23), portable linear matching, ordinal text rules (v24), protected command reads (v25), diagnostic arguments and event-source invokes mappings. Facts read at Screenplay v4.198.0 and introducing tags; Stage v4.127.0 admits exact v1-v21 and v23-v25 pairs but refuses v22/v26 and mixed pairs (STAGE-ESM-016), protected reads (044), atomic mode (043) and described handlers (STAGE-IMPL-002), even Stub mode. Stage text rules execute/render; no new renderer/runtime probe or Stage pin uplift. Cratis/AI#706: application navigation regions (module inherit, extend or override), toolbar slice buttons, blueprint template references and sample data packs in cratis-screenplay-ui-composition (references/application-shell.md), with the canonical shell vector and the rejection codes PLAY0710-PLAY0722 and PLAY0740-PLAY0765. Examples moved to the executable-state rules since 4.164: translator reactions in an Automation slice beside the Translate slice (PLAY0694) and the first record of a capture key appended with `when added`. Earlier: Standalone 4.164.0 and byte-identical compiler contract pinned. Cratis/AI#663: one origin per capture (PLAY0687). #668: executable no-event/redelivery v17. #684: concept query-argument validation in every version and query-error assertions v18. #681: executable refusal branches and refusal values v19. #666: proposal summary/severity counts and exact structural source proposals. Generated-concept rules select v20 with PLAY0688/0689 proofs and derived-matches repair; generated secrets and preview strategies remain refused. Release-baseline from-esm admission reads storedName. Standalone binding is not renderer admission: Stage 4.103.0 admits v1-v17 and v19; CLI 3.62.0 bundles Screenplay 4.159.0 / Stage 4.99.0 and renders through v16. Prior evidence remains unless superseded; no new renderer, Docker or browser probe."
205
205
  },
206
206
  {
207
207
  "id": "scene",
@@ -34,8 +34,9 @@ module Projects
34
34
  The omitted `for` means the command's required scalar identifier **only for
35
35
  inline productions**, when every production targets that same source. Once a
36
36
  production targets another source, every production must state `for`. Mixing
37
- omitted inline and plain destinations also fails (`PLAY0470`); there is no
38
- verified MCP repair for that diagnostic. Explicit syntax does not make cross-source
37
+ omitted inline and plain destinations also fails (`PLAY0470`); the MCP repair needs an explicit
38
+ author-chosen destination per production and never retargets an explicit one (see the
39
+ model-authoring skill's `references/destination-intent-repair.md`). Explicit syntax does not make cross-source
39
40
  execution supported.
40
41
 
41
42
  Plain `produces X` references a declared event; omitting `for` does not infer
@@ -7,7 +7,7 @@ This reference holds the route, public-event and external-operation guidance for
7
7
  Routes bind as ESM v8; production `stream Source.Stream` overrides
8
8
  select v10. Read toolchain [routes](../../cratis-screenplay-toolchain/references/production-routes-and-filters.md)
9
9
  and [source/stream declarations](../../cratis-screenplay-toolchain/references/sources-and-streams.md).
10
- A stored stream `All` / `id "All"` refuses PLAY0273;
10
+ A stored stream `All` / `id "All"` and a stored source `Default` refuse PLAY0802 (PLAY0273 at binding as a backstop);
11
11
  rename and history-migration guidance is in that reference.
12
12
  `public event X` is a local export; `event X from "store"` is a locally declared,
13
13
  unverified foreign shape. Commands never produce public events. Read
@@ -175,7 +175,7 @@ Choose formatting and disclose dropped comments before apply:
175
175
 
176
176
  ## Repair or extract before rewriting
177
177
 
178
- Read `read-workspace` with `view: "repairs"` at the same revision as diagnostics and pass the repair to `propose-repair`; use `propose-extract-inline-event` before adding generations. `PLAY0469` changes the event contract, so ask about stored contracts first. No automatic generation-evolution repair ships. `PLAY0479`: migrate optionality spelling with `PreserveTrivia`. `eventNeverPersisted: true` cannot unfreeze admitted revisions. Differing event pins carry `storedName` in ESM v16, shared by all generations and unique (PLAY0472). Read [references/repairs.md](references/repairs.md) when fixing `PLAY0166`, `PLAY0478`, `PLAY0516` or `PLAY0683`, or admitting a [release baseline](references/release-baseline.md).
178
+ Read `read-workspace` with `view: "repairs"` at the same revision as diagnostics and pass the repair to `propose-repair`; use `propose-extract-inline-event` before adding generations. `PLAY0469` changes the event contract, so ask about stored contracts first. No automatic generation-evolution repair ships. `PLAY0479`: migrate optionality spelling with `PreserveTrivia`. `eventNeverPersisted: true` cannot unfreeze admitted revisions. Differing event pins carry `storedName` in ESM v16, shared by all generations and unique (PLAY0472). Read [references/repairs.md](references/repairs.md) when fixing `PLAY0166`, `PLAY0478`, `PLAY0516` or `PLAY0683`, or admitting a [release baseline](references/release-baseline.md). Read [references/destination-intent-repair.md](references/destination-intent-repair.md) when `PLAY0470` needs a repair.
179
179
 
180
180
  ## Choose a readable layout
181
181
 
@@ -0,0 +1,107 @@
1
+ # Establishing production destinations (PLAY0470)
2
+
3
+ ## Contents
4
+
5
+ - Detect and discover
6
+ - Request
7
+ - Rules
8
+ - Review and apply
9
+ - Refusals and failures
10
+
11
+ Requires Screenplay 4.216.0 (`screenplay --version`); older servers offer no PLAY0470 repair, so
12
+ the author edits each `for` by hand.
13
+
14
+ `PLAY0470` is an error when a command targets another event source and a production omits `for`,
15
+ or when omitted inline and plain productions have different defaults. The repair needs the author's
16
+ explicit choice of every destination; the server never infers one. It is never in the no-input
17
+ `actions` list of `repair-capabilities`.
18
+
19
+ ## Detect and discover
20
+
21
+ 1. Feature-detect an entry in `repair-capabilities.intentActions` with `diagnosticCode: "PLAY0470"`.
22
+ It names the tool (`propose-repair`), the intent schema (`destinationIntent`, version 1), the
23
+ discovery view (`repair-intents`) and the report view (`production-destinations`). Absent entry:
24
+ the server cannot repair `PLAY0470`; edit through a reviewed `propose-ast` instead.
25
+ 2. `read-workspace` with `view: "repair-intents"` and `expectedRevision`. The response carries
26
+ `expressionSchema` (`syntax-schema:ExpressionSyntax`) and a `page`. Each item has `command`,
27
+ `diagnostics`, `subject` (the production occurrence handle), `event`, `condition`, `existingFor`,
28
+ `authoredRoute`, `effectiveRoute` and `route` (`null` when ambiguous).
29
+ 3. Page with `offset` (default 0) and `limit` (1 to 200, default 50) until `nextOffset` is `null`.
30
+ Pass `expectedCatalogRevision` on continuation pages. A row too large for a page refuses with
31
+ `LimitExceeded` and is never truncated.
32
+
33
+ ## Request
34
+
35
+ Handles are `{revision, documentId, path}` objects: reuse discovered ones exactly. Every value in
36
+ angle brackets below is a placeholder, not literal JSON.
37
+
38
+ ```json
39
+ {
40
+ "expectedRevision": "<workspace revision>",
41
+ "expectedCatalogRevision": "<catalog revision>",
42
+ "diagnosticCode": "PLAY0470",
43
+ "subject": "<command handle>",
44
+ "formatting": "CanonicalizeTouchedDocuments",
45
+ "destinationIntent": {
46
+ "version": 1,
47
+ "productions": [
48
+ {
49
+ "subject": "<production occurrence handle>",
50
+ "for": "<typed expression object from syntax-schema>",
51
+ "route": { "kind": "Legacy" }
52
+ }
53
+ ]
54
+ }
55
+ }
56
+ ```
57
+
58
+ A named route is `{ "kind": "Named", "source": <declaration handle>, "stream": <declaration handle> }`;
59
+ both handles are required, and `Legacy` takes neither.
60
+
61
+ ## Rules
62
+
63
+ - Give exactly one selection per event-production occurrence, including repeated events, conditional
64
+ productions and productions that already state `for`. An incomplete, duplicate, stale or foreign
65
+ selection refuses the whole request.
66
+ - `for` is a typed expression object obtained from `syntax-schema`; never invent its shape and never
67
+ guess an identifier. Choose each destination with the author.
68
+ - Confirm the route per selection as `Legacy` or `Named` with the exact source and stream handles.
69
+ - `formatting: "CanonicalizeTouchedDocuments"` is required. The server forces `Executable`
70
+ validation, so send no `validation` argument. Send no `pinRepairEvidence` and no
71
+ `expectedRepairEvidenceRevision`.
72
+ - Every missing `for` changes together in one transaction. A repair never retargets an explicit
73
+ destination or route; already-explicit selections must match what is authored.
74
+ - The whole workspace must bind. There is no fix-all, no inferred destination and no applyable subset.
75
+ - The repair claims neither preservation nor an executable baseline, including for other commands.
76
+ Binding proves neither business correctness nor target execution support.
77
+
78
+ ## Review and apply
79
+
80
+ `propose-repair` retains a proposal and writes nothing. Both report views page like discovery
81
+ (`offset`, `limit` 1 to 200); read each until `page.nextOffset` is `null`, because a first page can
82
+ hide routing rows or new identities. Before `apply`:
83
+
84
+ 1. `read-proposal` with `proposalId` and `view: "production-destinations"`: the `summary`
85
+ (`changedCount`, `productionCount`, `commandRoute`, `existingIdentitiesPreserved`) and one row per
86
+ production with `original`, `selectedFor`, `routeConfirmation`, `omission`, `classification`
87
+ (`MadeExplicit` or `ExplicitUnchanged`) and `effectiveClassification`.
88
+ 2. `view: "production-destination-identities"`: newly enrolled identity strings; existing identities
89
+ must survive unchanged.
90
+ 3. The `diagnostics` and `executable-diagnostics` views and the exact `before` and `after` bytes.
91
+ 4. Show the author the review, then call `apply` with `proposalId`, `expectedRevision` and
92
+ `expectedCatalogRevision`. Apply only the proposal that was reviewed.
93
+
94
+ Both report views refuse on a proposal that has no production destination report.
95
+
96
+ ## Refusals and failures
97
+
98
+ - Refusals include an incomplete, duplicate, stale or foreign selection, an ambiguous or mismatched
99
+ route, an attempt to retarget an explicit destination, an unsupported expression, incomplete
100
+ imports or source, comment or identity loss, an unrelated executable blocker and missing
101
+ formatting consent.
102
+ - Failure kinds: `StaleRevision` (rediscover), `FormattingConsentRequired`, `ProposalRejected`
103
+ (read the conflicts and diagnostics), `RepairEvidenceWriteConflict` and `RepairEvidenceDrift`
104
+ (obtain and review a fresh proposal).
105
+ - `RolledBack` is a failure with verified restoration. `RecoveryRequired` and `PendingOperation`
106
+ mean a journal needs attention: inspect `workspace-state` and make recovery its own explicit
107
+ request. Never retry automatically after an unknown outcome.
@@ -237,9 +237,13 @@ canonical bytes. Event `description`, `documentation` and rename-only `id` are
237
237
  authoring metadata, not new ESM bytes or replacements for catalog identity.
238
238
 
239
239
  Binding is not the last gate before the reference runner. The runner needs an
240
- execution plan, and the plan is created only when every reachable capability is
241
- admitted. One refused construct blocks the whole plan, so no specification in
242
- the model runs, including specifications that never touch it.
240
+ execution plan. An application-level refused construct blocks the whole plan, so no
241
+ specification in the model runs. An unadmitted projection (for example
242
+ `UnsupportedEventContext` or `UnsupportedProjectionBlock`) is scoped per specification:
243
+ only specifications whose given, appended, produced or cascaded events reach it, or that
244
+ supply, read, query or assert its read model, report unsupported; the others run and
245
+ `planIssues` lists the deferred issue. Older compilers block the whole plan for an
246
+ unadmitted projection; the toolchain executable subset names the introducing release.
243
247
 
244
248
  What binds today, what the reference execution plan refuses, what is opaque, what is
245
249
  authorable but not executable, and what blocks binding. A bundled compiler can be older
@@ -220,7 +220,7 @@ connection. Passing `open-workspace.path` does **not** avoid it, because the err
220
220
  | Address-preserving | descriptions; bodies of rules and expressions; mappings between members that already exist; any edit that adds, removes or renames no addressed element. Also every edit in a model with no `.screenplay/identities.json` except persisted names | bounded text edit of the `.play` file, then compile the folder; or `propose-ast` |
221
221
  | Catalog-changing (identity file present) | add, remove or rename a declaration (slice, command, event, read model, projection, ...), a property of a command, event, read model, composite type or trigger, a query, a query argument or a specification; create, delete, rename or move a mapped `.play` document (McpState refuses reopening with `IdentityMappingConflict`; use document operations in `propose-ast`); rename, remove or move an event, command, read model, constraint, module, feature or slice; move declarations between files (slices and features across logical parents: `propose-move`); contract evolution of a persisted event (new generation, property added, removed or retyped) | `propose-rename` or a reviewed `propose-ast`; never a blind text rename. Renaming a constraint resets its uniqueness index: ask first unless the request names it, then report the reset. A persisted event rename needs `id "OldName"` (added by default) |
222
222
  | Concept `generate` | set/change/remove strategy and modifiers | `propose-ast` replaces `ConceptSyntax.generation` (`GenerationSyntax`; omit/null to remove), or reviewed `propose-source`; never hand-edit `generate` text. Preserve other concept members and inspect executable diagnostics: sequence PLAY0682, generated secrets PLAY0268, generated-rule proofs PLAY0688/0689, finite-support failures PLAY0691/0692. Pattern/random/rule and checksum validation bind as ESM v21 (Requires Screenplay 4.172.0, `screenplay --version`; older compilers refuse PLAY0268). Read `mcp-tools.md#concept-generation` for `arguments`, exact support and `rules[]`, not parsed diagnostic prose. |
223
- | Repair | `PLAY0166`, `0478`, `0469`, `0471`, `0479`, `0516`, `0563`, `0564`, `0565`, `0614`, `0653`, `0683`, `0684` (and recipe-only `0397`) | `propose-repair` with `formatting`; PLAY0166/0478 may pin attachment evidence (`pinRepairEvidence` and `expectedRepairEvidenceRevision`), never fix-all PLAY0478 |
223
+ | Repair | `PLAY0166`, `0478`, `0469`, `0471`, `0479`, `0516`, `0563`, `0564`, `0565`, `0614`, `0653`, `0683`, `0684` (and recipe-only `0397`); `PLAY0470` only with author intent ([destination intent repair](destination-intent-repair.md)) | `propose-repair` with `formatting`; PLAY0166/0478 may pin attachment evidence (`pinRepairEvidence` and `expectedRepairEvidenceRevision`), never fix-all PLAY0478 |
224
224
  | Inline event extraction | `produces event ...` to a declared event | `propose-extract-inline-event` |
225
225
  | Parser-invalid document | no editable handles | `propose-source` `replace-document` with corrected source, or typed `propose-ast` document replacement |
226
226
  | Unadmitted constructs | systems/operations, the `numbers exact` source mode | reviewed Authoring `propose-source` (whole documents) or `propose-ast` (typed edits); preserve intent and report PLAY0268 |
@@ -111,7 +111,7 @@ Continue with the same `proposalId` and returned `sourceRevision` as
111
111
  or reads the root with its persisted identities.
112
112
 
113
113
  The response includes `sourceRevision`, `outcome`, discovered/selected/executed/
114
- passed/failed/unsupported counts, `executableDiagnostics`, `planIssues`, and `page`
114
+ passed/failed/unsupported counts, `executableDiagnostics`, `planIssues` (deferred projection issues stay listed even when the selected specifications pass), and `page`
115
115
  (plus `proposalId` for candidate runs). Counts cover the entire selection, not one
116
116
  page; unsupported cases are not executed. Outcomes are `passed`, `failed`,
117
117
  `unsupported`, or overall `unbound`; only `passed` has `isError: false`. An unbound
@@ -355,8 +355,10 @@ gets no new pin, while any admitted revision requires preserving its stored name
355
355
  `eventNeverPersisted: true` is refused for admitted revisions; otherwise it needs
356
356
  storage-history knowledge, not merely an identity catalog. It skips a new pin, removes a redundant current-name
357
357
  pin, but retains a pin for a different earlier name. Contradictory generation pins
358
- refuse the rename. Do not promise a generation-2 payload-removal repair or a
359
- `PLAY0470` repair: neither is available.
358
+ refuse the rename. Do not promise a generation-2 payload-removal repair. `PLAY0470` has an
359
+ author-intent repair, never a no-input one: read
360
+ [destination intent repair](destination-intent-repair.md) when `repair-capabilities`
361
+ lists it under `intentActions`.
360
362
 
361
363
  Requires Screenplay 4.152.0 or later (`screenplay --version`) for `storedName` (ESM v16).
362
364
 
@@ -378,12 +380,12 @@ then choose edits from evidence. Workflow, flags, guards and recovery:
378
380
  [release baseline](release-baseline.md). Target evidence: toolchain
379
381
  `references/diagnostics.md` (Reserved stored names and event pins).
380
382
 
381
- Requires Screenplay 4.150.0 or later (`screenplay --version`) for the stored stream name `All` refusal.
383
+ Requires Screenplay 4.213.3 or later (`screenplay --version`) for the authoring-time PLAY0802 refusal; earlier compilers refuse stored stream `All` only at binding (PLAY0273, 4.150.0 or later).
382
384
 
383
385
  A stream whose stored name is exactly `All`, from its name or `id "All"`,
384
- refuses executable binding/readiness with PLAY0273. Use discovered `propose-rename`
385
- to change that stored stream name; pinning it back to `All` is not a repair.
386
- There is no typed PLAY0273 repair for this case. Existing `All` history reads as
386
+ reports PLAY0802 in authoring diagnostics (binding keeps PLAY0273 as a backstop). Use discovered `propose-rename`
387
+ to change that stored stream name; pinning it back to `All` is not a repair, while a pin away from `All` is valid.
388
+ There is no typed PLAY0802 repair for this case. Existing `All` history reads as
387
389
  source-only appends. Source/stream pins otherwise travel as ESM v8 stored names;
388
390
  event stored names require v16.
389
391
 
@@ -23,6 +23,8 @@ from silently changing the reviewed candidate.
23
23
  No automatic generation-evolution repair ships.
24
24
  - `PLAY0479`: migrate optionality spelling with `PreserveTrivia`; document scope
25
25
  migrates all occurrences together. Keep the `query Q => observable?` exception.
26
+ - `PLAY0470` is repaired only from an author-supplied destination intent, never
27
+ from a no-input action: read [destination intent repair](destination-intent-repair.md).
26
28
  - Generation repairs PLAY0683/0684: [subjects, review and limits](mcp-tools.md#concept-generation).
27
29
  - Compliance repairs PLAY0565/0653: [MCP tool guide](mcp-tools.md).
28
30
 
@@ -36,7 +38,7 @@ admit in the release job; no baseline requires an explicit mode;
36
38
  `eventNeverPersisted: true` cannot unfreeze admitted revisions. Differing event pins carry
37
39
  `storedName` in ESM v16. Pins are event-name identifiers,
38
40
  shared by all generations and unique (PLAY0472). A renderer admits only the ESM versions it
39
- bundles, so an older Stage can refuse v16. Stored stream `All` (even `id "All"`) refuses PLAY0273; rename without
41
+ bundles, so an older Stage can refuse v16. Stored stream `All` (even `id "All"`) and stored source `Default` refuse PLAY0802; rename without
40
42
  that pin. Evidence/limits: [MCP tool guide](mcp-tools.md).
41
43
 
42
44
  Requires Screenplay 4.153.0 or later (`screenplay --version`) for the release baseline and its `baseline` command, and 4.152.0 or later for `storedName` (ESM v16).
@@ -144,8 +144,8 @@ not prove an entire list is empty: assert the unkeyed list query itself (an unke
144
144
  the command needs its own constraint, or the rule is `recorded` as target-enforced.
145
145
  - **Rebuild**: a view rebuilt from all facts must give the same rows. Mappings from
146
146
  `$eventContext.occurred` or other occurrence data cannot be executed:
147
- the plan blocks every event-context path except the event source id
148
- (`UnsupportedEventContext`). `given clock` does not change that; it supplies `$context.occurred`
147
+ the reference runner refuses every event-context path except the event source id
148
+ (`UnsupportedEventContext`), so specifications that reach that projection report unsupported. `given clock` does not change that; it supplies `$context.occurred`
149
149
  to command productions only. Record such projection cases as capability gaps (keep the
150
150
  mapping and the intended spec in design mode).
151
151
  - **Corrections and backdated facts**: a correction is a new fact; specify the view after it.
@@ -44,8 +44,8 @@ Binding is not plan admission. Read model-authoring's
44
44
  [language reference](../cratis-screenplay-model-authoring/references/language-reference.md)
45
45
  when distinguishing executable declarations, refused projection shapes and opaque
46
46
  code. Reached opaque code is **unsupported**, never passed; portable denial may
47
- still execute before it. Unsupported declarative constructs block the whole plan,
48
- not just the specifications that touch them.
47
+ still execute before it. An unadmitted projection makes unsupported only the specifications that reach it
48
+ (Screenplay 4.213.2 or later); other unsupported declarative constructs block the whole plan.
49
49
 
50
50
  Read [reactions and cascades](references/reactions-and-cascades.md) when testing
51
51
  ESM v6 actions; older compilers fail reaction/capture binding with PLAY0268.
@@ -121,7 +121,7 @@ Unattended work takes the conservative option and marks it `ASSUMED` in model
121
121
  refuse PLAY0268 (command-surface `references/compliance.md`). Legacy markers are
122
122
  deprecated (PLAY0565). Never remove protection to pass a tool. PLAY0515 also refuses
123
123
  scalar/composite stream-id types and route mapping sources, including nested paths.
124
- - Stream-id literals must be nonempty NFC text; composite ids use at least two named scalar parts; PLAY0504 is an error for route/destination type mismatch; a stored stream name exactly `All` refuses binding with PLAY0273 (rename via `propose-rename`). Read [references/stream-id-rules.md](references/stream-id-rules.md) when choosing stream-id types, literals, composite ids or renaming a stream.
124
+ - Stream-id literals must be nonempty NFC text; composite ids use at least two named scalar parts; PLAY0504 is an error for route/destination type mismatch; a stored stream name exactly `All` (and a stored source name exactly `Default`) is refused with PLAY0802, including via an `id` pin (rename via `propose-rename`; a pin away from `All` is valid). Read [references/stream-id-rules.md](references/stream-id-rules.md) when choosing stream-id types, literals, composite ids or renaming a stream.
125
125
 
126
126
  - Chronicle limits: before 19.59.6 (InMemory: 19.59.3) the SQL and InMemory providers do not settle unique claims (see the Requires line below);
127
127
  index updates run after commit and may fail silently; composite values can
@@ -8,8 +8,9 @@ Rules for stream-id literals, composite ids and the reserved `All` stream name.
8
8
  nominal type mismatch. Composite ids use at least two named scalar parts,
9
9
  complete named mappings and canonical comparison, not guessed legacy splits.
10
10
  Stored key-schema changes require a new stream identity or migration; see
11
- toolchain `references/sources-and-streams.md`. A stored stream name exactly `All` (name or `id "All"`) refuses binding with
12
- PLAY0273, parallel to source `Default`. Streams `all`, `ALL` and `Default`
11
+ toolchain `references/sources-and-streams.md`. A stored stream name exactly `All` (name or `id "All"`) is refused with
12
+ PLAY0802 at authoring time, parallel to stored source `Default`; binding keeps
13
+ PLAY0273 as a backstop. Streams `all`, `ALL` and `Default`
13
14
  remain valid. Rename via `propose-rename`; a pin retaining `All` cannot fix it.
14
15
  Existing `All` history reads as source-only appends, not the renamed stream.
15
16
  Source evidence and migration limits are in that reference.
@@ -166,7 +166,7 @@ processing or runtime retention. See command-surface `references/compliance.md`.
166
166
  `subjectIsEventSourceId`, `observationState` (unstable on replay). `causation` and `tags` are
167
167
  collections (path below them: PLAY0297 E). Unknown member: PLAY0295/0296 W.
168
168
  `$eventSourceId` is the short form used in mappings. `occurred.Week` compiles but does not bind
169
- (PLAY0273: derived value). Any `$eventContext` path other than `eventSourceId` binds, but the execution plan refuses it ("An event-context value other than the event source identity needs occurrence context that ESM v1 facts do not carry"), so a model that must run uses `$context.occurred` in the command `produces` instead (it executes when the scenario has `given clock`). Catalogue: `Documentation/screenplay/projections/event-context.md`.
169
+ (PLAY0273: derived value). Any `$eventContext` path other than `eventSourceId` binds, but the reference runner refuses it for the specifications that reach that projection ("An event-context value other than the event source identity needs occurrence context that ESM v1 facts do not carry"), so a model that must run uses `$context.occurred` in the command `produces` instead (it executes when the scenario has `given clock`). Catalogue: `Documentation/screenplay/projections/event-context.md`.
170
170
 
171
171
  ## PDL quick reference (most forms are compiled in `pdl-example.md` or `cheat-sheet-example.md`; `remove via join` and `$eventContext.occurred` are not)
172
172
  - Header `projection Name => ReadModel`; variant group `projection Name` + `variant RM` /
@@ -180,7 +180,7 @@ collections (path below them: PLAY0297 E). Unknown member: PLAY0295/0296 W.
180
180
  property; the label is decoration; joins never create instances).
181
181
  - `children prop identified by k` + `from E key k` + `remove with E key k`; `nested prop` +
182
182
  `from` + `clear with E`.
183
- - Removal: `remove with Event`; `remove via join on Event` is compile-only and bind-only: at projection level it blocks the whole reference execution plan (`UnsupportedProjectionBlock`), so no specification runs.
183
+ - Removal: `remove with Event`; `remove via join on Event` is compile-only and bind-only: at projection level it makes only the specifications that reach that projection unsupported (`UnsupportedProjectionBlock`); the others run (Screenplay 4.213.2 or later; earlier compilers refuse the whole plan).
184
184
  - Keys: only on `from` (a projection-level `key` routes nothing: PLAY0381 W).
185
185
  - One `every`/`all` block per level for the executable model (else PLAY0268).
186
186
  - Templates (`` `${a}` ``) and `$causedBy` parse but do not bind (PLAY0268).
@@ -117,12 +117,13 @@ older executable bytes/version. Consumer admission is separate.
117
117
 
118
118
  | Code | Layer / severity | Meaning / fix |
119
119
  | --- | --- | --- |
120
- | PLAY0273 | Binding error | A stored source exactly `Default`, or stored stream exactly `All` (name or `id "All"` pin), is reserved. Authoring still parses/prints it. Rename the stream with discovered `propose-rename`; keeping `id "All"` cannot fix it. Comparison is ordinal: streams `all`, `ALL` and `Default` remain valid. Old `All` events read as source-only appends; moving history needs a Chronicle migration, not a language repair. |
120
+ | PLAY0802 | Authoring error (`ReservedStoredName`) | A stored event-source name exactly `Default`, or stored event-stream name exactly `All`, is reserved; the stored name is the `id` pin when present, else the declaration name. Rename the stream with discovered `propose-rename`; keeping `id "All"` cannot fix it, while a pin away from the reserved name (`stream All` with `id "Archive"`) is valid. Comparison is ordinal: streams `all`, `ALL` and `Default` remain valid. Old `All` events read as source-only appends; moving history needs a Chronicle migration, not a language repair. Requires Screenplay 4.213.3 (`screenplay --version`); earlier compilers report these names only at binding, as PLAY0273. |
121
+ | PLAY0273 | Binding error | Executable binding keeps refusing a stored source `Default` or stored stream `All` (name or `id "All"` pin) as a backstop to PLAY0802. |
121
122
  | PLAY0472 | Binding error | An event pin is not a valid event-name identifier, effective stored names differ across generations, or two events share a stored name. Use a valid, application-unique stored name shared by all generations; never rename stored history merely to hide the error. |
122
123
  | PLAY0686 | Retired | Differing event pins travel as `storedName` in ESM v16. MCP's compatibility `eventPinWarnings` array is empty. Renderer admission is separate: a renderer that does not admit v16 must refuse the model rather than render it under the new name. |
123
124
 
124
- MCP readiness exposes the binding refusal. PLAY0273 is reused, not a new ESM
125
- version; match its reserved-name message before choosing the rename.
125
+ PLAY0802 appears in authoring diagnostics and MCP readiness; match its reserved-name
126
+ message before choosing the rename. It adds no ESM version.
126
127
  Source/stream pins already travel in ESM v8; differing event pins require v16.
127
128
  Equal-name event pins are no-ops; PLAY0471 removal preserves canonical bytes.
128
129
  Target evidence: a renderer must admit ESM v16 and preserve `storedName`, or refuse it.
@@ -375,10 +375,10 @@ bodies still leave their owner non-executable.
375
375
  | Arithmetic or raw expression in a `produces` mapping | PLAY0268 | |
376
376
  | Template `` `${x}` `` or `$causedBy` in a projection | PLAY0268 | |
377
377
  | More than one `every`/`all` on one projection level | PLAY0268 | Chronicle keeps only the last |
378
- | `$eventContext.<path>` other than `eventSourceId` | blocked plan | binds, but execution refuses: "An event-context value other than the event source identity needs occurrence context that ESM v1 facts do not carry". `$context.occurred` in command `produces` is different and executes when the scenario has `given clock` |
379
- | Projection-level `remove via join` | blocked plan | binds, but `UnsupportedProjectionBlock` blocks the whole reference execution plan: no specification in the application runs |
380
- | `all` beside removals, children or nested on one level | blocked plan | binds; `UnsupportedProjectionBlock` |
381
- | `join`, `children` or `remove via join` inside `nested` | blocked plan | binds; `UnsupportedProjectionBlock` |
378
+ | `$eventContext.<path>` other than `eventSourceId` | unsupported specs | binds, but execution refuses: "An event-context value other than the event source identity needs occurrence context that ESM v1 facts do not carry". `$context.occurred` in command `produces` is different and executes when the scenario has `given clock` |
379
+ | Projection-level `remove via join` | unsupported specs | binds, but `UnsupportedProjectionBlock` marks only the specifications that reach the projection unsupported; the others run and `planIssues` lists the deferred issue |
380
+ | `all` beside removals, children or nested on one level | unsupported specs | binds; `UnsupportedProjectionBlock` (scoped per specification, like the rows above) |
381
+ | `join`, `children` or `remove via join` inside `nested` | unsupported specs | binds; `UnsupportedProjectionBlock` (scoped per specification, like the rows above) |
382
382
  | `$eventContext.occurred.Week` | PLAY0273 | derived value |
383
383
  | Projection `parent p` where `p` is not on the child event | PLAY0273 | "Event property not found" |
384
384
  | `generated` or `returns` on an older compiler | PLAY0268 | admitted from ESM v7, see above |
@@ -393,7 +393,8 @@ bodies still leave their owner non-executable.
393
393
 
394
394
  - Plain `produces` without `for` binds (PLAY0478, information) but means allocation in the
395
395
  ESM and "the identifier" in rendered Arc code. Always write `for` on a plain `produces <Name>`; inline `produces event` omits it.
396
- - A projection-level (root) `remove via join` binds, but the reference execution plan refuses it (`UnsupportedProjectionBlock`), so no specification in the application runs; Chronicle wires it as a child pull. See the blocked-plan rows above.
396
+ - A projection-level (root) `remove via join` binds, but the reference execution plan refuses it (`UnsupportedProjectionBlock`): only specifications whose events reach that projection, or that supply, read, query or assert its read model, report unsupported, and the others run. Chronicle wires it as a child pull. See the unsupported-specs rows above.
397
+ Requires Screenplay 4.213.2 (`screenplay --version`); earlier compilers refuse the whole plan, so no specification runs.
397
398
  - V1 reports absent projection/children/nested targets
398
399
  with PLAY0514 and unknown removal/capture events with PLAY0166. An unmapped
399
400
  declared field can be found by opt-in `--check field-origins` (PLAY0534);
@@ -1,6 +1,6 @@
1
1
  # Projection (PDL) example
2
2
 
3
- Projection forms that compile warning-free, bind on both tools and run in the reference runner without Unsupported results (`PlacingAnOrder`, `CancellingAnOrder`, `Depositing` and `RejectingAnEmptyCode` pass). The specifications exercise every, from, `set`, increment, remove with, all + count, add/subtract by, `clear` and the concept rules; `PlacingAnOrder` also runs the `children lines` block (through `LineAdded`) without asserting it; join, nested and variant groups bind but no specification drives them. Forms in this example: every, join, children, nested, clear with, remove with, increment/decrement, all + count, add/subtract by, set to, clear, no automap, literal mapping, variant group (no `=> RM`), concept rules not empty/max/length ==. `lineCount` is initialized in `OrderPlaced` and `shipping` is optional, because the reference runner requires every non-optional read-model property to be set after each fact. Rejected by the binder: more than one every/all block on one level (PLAY0268); `$eventContext.occurred.Week` (PLAY0273, derived value). Not in this example because they block the whole execution plan in the reference runner: a `remove via join` on a projection's own (root) level (`UnsupportedProjectionBlock`; it binds, but on Chronicle v19.32.0 it creates no removal subscription, so `CustomerDeleted` would not remove an `OrderView`), and any event-context value other than the event source identity in a projection, such as `$eventContext.occurred` (`UnsupportedEventContext`). Quick reference: [cheat-sheet.md](cheat-sheet.md). The `every` block here maps a literal to show the form. Carry a timestamp on the event with `$context.occurred` in the producing command when a view must show it.
3
+ Projection forms that compile warning-free, bind on both tools and run in the reference runner without Unsupported results (`PlacingAnOrder`, `CancellingAnOrder`, `Depositing` and `RejectingAnEmptyCode` pass). The specifications exercise every, from, `set`, increment, remove with, all + count, add/subtract by, `clear` and the concept rules; `PlacingAnOrder` also runs the `children lines` block (through `LineAdded`) without asserting it; join, nested and variant groups bind but no specification drives them. Forms in this example: every, join, children, nested, clear with, remove with, increment/decrement, all + count, add/subtract by, set to, clear, no automap, literal mapping, variant group (no `=> RM`), concept rules not empty/max/length ==. `lineCount` is initialized in `OrderPlaced` and `shipping` is optional, because the reference runner requires every non-optional read-model property to be set after each fact. Rejected by the binder: more than one every/all block on one level (PLAY0268); `$eventContext.occurred.Week` (PLAY0273, derived value). Not in this example because the reference runner reports unsupported for every specification that reaches or asserts the projection (others run; `planIssues` lists the deferred issue): a `remove via join` on a projection's own (root) level (`UnsupportedProjectionBlock`; it binds, but on Chronicle v19.32.0 it creates no removal subscription, so `CustomerDeleted` would not remove an `OrderView`), and any event-context value other than the event source identity in a projection, such as `$eventContext.occurred` (`UnsupportedEventContext`). Quick reference: [cheat-sheet.md](cheat-sheet.md). The `every` block here maps a literal to show the form. Carry a timestamp on the event with `$context.occurred` in the producing command when a view must show it.
4
4
 
5
5
  ```screenplay
6
6
  // PDL forms that bind executable on both tools.
@@ -37849,6 +37849,17 @@
37849
37849
  "title": "An event is used more than once in one projection level\u0027s event or join set.",
37850
37850
  "reserved": false,
37851
37851
  "retired": false
37852
+ },
37853
+ {
37854
+ "code": "PLAY0802",
37855
+ "name": "ReservedStoredName",
37856
+ "severity": "error",
37857
+ "severities": [
37858
+ "error"
37859
+ ],
37860
+ "title": "An event source has the reserved stored name Default, or an event stream has the reserved stored name All, including through an id pin.",
37861
+ "reserved": false,
37862
+ "retired": false
37852
37863
  }
37853
37864
  ],
37854
37865
  "mcpTools": [
@@ -42192,6 +42203,7 @@
42192
42203
  "subject"
42193
42204
  ],
42194
42205
  "optionalParameters": [
42206
+ "destinationIntent",
42195
42207
  "expectedReleaseBaselineRevision",
42196
42208
  "expectedRepairEvidenceRevision",
42197
42209
  "includeContent",
@@ -42252,6 +42264,159 @@
42252
42264
  "expectedRepairEvidenceRevision": {
42253
42265
  "type": "string"
42254
42266
  },
42267
+ "destinationIntent": {
42268
+ "type": "object",
42269
+ "properties": {
42270
+ "version": {
42271
+ "type": "integer",
42272
+ "const": 1
42273
+ },
42274
+ "productions": {
42275
+ "type": "array",
42276
+ "items": {
42277
+ "type": "object",
42278
+ "properties": {
42279
+ "subject": {
42280
+ "type": "object",
42281
+ "properties": {
42282
+ "revision": {
42283
+ "type": "string"
42284
+ },
42285
+ "documentId": {
42286
+ "type": "string"
42287
+ },
42288
+ "path": {
42289
+ "type": "string"
42290
+ }
42291
+ },
42292
+ "required": [
42293
+ "revision",
42294
+ "documentId",
42295
+ "path"
42296
+ ],
42297
+ "additionalProperties": false
42298
+ },
42299
+ "for": {
42300
+ "type": "object",
42301
+ "description": "Existing typed ExpressionSyntax schema from syntax-schema. Non-null; executable binding admits only supported destination expressions.",
42302
+ "properties": {
42303
+ "kind": {
42304
+ "type": "string"
42305
+ }
42306
+ },
42307
+ "required": [
42308
+ "kind"
42309
+ ],
42310
+ "additionalProperties": true
42311
+ },
42312
+ "route": {
42313
+ "type": "object",
42314
+ "properties": {
42315
+ "kind": {
42316
+ "type": "string",
42317
+ "enum": [
42318
+ "Legacy",
42319
+ "Named"
42320
+ ]
42321
+ },
42322
+ "source": {
42323
+ "type": "object",
42324
+ "properties": {
42325
+ "revision": {
42326
+ "type": "string"
42327
+ },
42328
+ "documentId": {
42329
+ "type": "string"
42330
+ },
42331
+ "path": {
42332
+ "type": "string"
42333
+ }
42334
+ },
42335
+ "required": [
42336
+ "revision",
42337
+ "documentId",
42338
+ "path"
42339
+ ],
42340
+ "additionalProperties": false
42341
+ },
42342
+ "stream": {
42343
+ "type": "object",
42344
+ "properties": {
42345
+ "revision": {
42346
+ "type": "string"
42347
+ },
42348
+ "documentId": {
42349
+ "type": "string"
42350
+ },
42351
+ "path": {
42352
+ "type": "string"
42353
+ }
42354
+ },
42355
+ "required": [
42356
+ "revision",
42357
+ "documentId",
42358
+ "path"
42359
+ ],
42360
+ "additionalProperties": false
42361
+ }
42362
+ },
42363
+ "required": [
42364
+ "kind"
42365
+ ],
42366
+ "additionalProperties": false,
42367
+ "oneOf": [
42368
+ {
42369
+ "properties": {
42370
+ "kind": {
42371
+ "const": "Legacy"
42372
+ }
42373
+ },
42374
+ "not": {
42375
+ "anyOf": [
42376
+ {
42377
+ "required": [
42378
+ "source"
42379
+ ]
42380
+ },
42381
+ {
42382
+ "required": [
42383
+ "stream"
42384
+ ]
42385
+ }
42386
+ ]
42387
+ }
42388
+ },
42389
+ {
42390
+ "properties": {
42391
+ "kind": {
42392
+ "const": "Named"
42393
+ }
42394
+ },
42395
+ "required": [
42396
+ "source",
42397
+ "stream"
42398
+ ]
42399
+ }
42400
+ ]
42401
+ }
42402
+ },
42403
+ "required": [
42404
+ "subject",
42405
+ "for",
42406
+ "route"
42407
+ ],
42408
+ "additionalProperties": false
42409
+ },
42410
+ "maxItems": 256,
42411
+ "minItems": 1
42412
+ }
42413
+ },
42414
+ "required": [
42415
+ "version",
42416
+ "productions"
42417
+ ],
42418
+ "additionalProperties": false
42419
+ },
42255
42420
  "expectedReleaseBaselineRevision": {
42256
42421
  "type": "string"
42257
42422
  }
@@ -42263,7 +42428,42 @@
42263
42428
  "subject",
42264
42429
  "formatting"
42265
42430
  ],
42266
- "additionalProperties": false
42431
+ "additionalProperties": false,
42432
+ "if": {
42433
+ "properties": {
42434
+ "diagnosticCode": {
42435
+ "const": "PLAY0470"
42436
+ }
42437
+ },
42438
+ "required": [
42439
+ "diagnosticCode"
42440
+ ]
42441
+ },
42442
+ "then": {
42443
+ "required": [
42444
+ "destinationIntent"
42445
+ ],
42446
+ "properties": {
42447
+ "pinRepairEvidence": {
42448
+ "const": false
42449
+ },
42450
+ "formatting": {
42451
+ "const": "CanonicalizeTouchedDocuments"
42452
+ }
42453
+ },
42454
+ "not": {
42455
+ "required": [
42456
+ "expectedRepairEvidenceRevision"
42457
+ ]
42458
+ }
42459
+ },
42460
+ "else": {
42461
+ "not": {
42462
+ "required": [
42463
+ "destinationIntent"
42464
+ ]
42465
+ }
42466
+ }
42267
42467
  }
42268
42468
  },
42269
42469
  {
@@ -43029,7 +43229,9 @@
43029
43229
  "dropped-comments",
43030
43230
  "semantic-diff",
43031
43231
  "notes",
43032
- "release-baseline"
43232
+ "release-baseline",
43233
+ "production-destinations",
43234
+ "production-destination-identities"
43033
43235
  ]
43034
43236
  },
43035
43237
  "documentId": {
@@ -43146,6 +43348,7 @@
43146
43348
  "typed-contexts",
43147
43349
  "source-map",
43148
43350
  "repairs",
43351
+ "repair-intents",
43149
43352
  "executable-model"
43150
43353
  ],
43151
43354
  "description": "Source detail views return compact-header-v1, not full syntax: header metadata sizes and AST/source read pointers, then actual-parent child pages. Source pages enforce item and serialized-byte bounds; continue from nextOffset."
@@ -40,8 +40,9 @@ would otherwise consume it. Do not invent source-only route syntax.
40
40
  Exactly `All` is reserved as a stored stream
41
41
  name (declaration name or `id "All"` pin), just as `Default` is reserved for a
42
42
  stored source name. Comparison is ordinal: streams `all`, `ALL` and `Default`
43
- remain valid. Authoring parses/prints these names; executable binding and MCP
44
- readiness refuse `All` with **PLAY0273**. Stage's STAGE-ESM-030 remains defense
43
+ remain valid. Authoring compilation, both compilers and the editors refuse these
44
+ names with **PLAY0802** (`ReservedStoredName`); executable binding keeps refusing
45
+ them with **PLAY0273** as a backstop. Stage's STAGE-ESM-030 remains defense
45
46
  in depth, not an additional admitted route.
46
47
 
47
48
  Rename the stream through discovered `propose-rename`; an `id "All"` pin is
@@ -53,7 +54,7 @@ stream, so existing history stored under `All` reads as source-only appends
53
54
  (or unrouted facts), not as the newly named stream. Moving that history needs
54
55
  an explicit Chronicle data migration, not a language repair or invented route.
55
56
 
56
- Requires Screenplay 4.150.0 or later (`screenplay --version`) for the reserved stream name `All`; earlier compilers accept it silently.
57
+ Requires Screenplay 4.213.3 or later (`screenplay --version`) for the authoring-time PLAY0802 refusal of stored stream `All` and stored source `Default`. Requires 4.150.0 or later for the binding refusal of `All`; earlier compilers accept it silently.
57
58
 
58
59
  ```screenplay
59
60
  concept AccountId : Uuid
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@cratis/pi",
3
- "version": "7.82.0",
3
+ "version": "7.83.0",
4
4
  "description": "Configuration-aware Cratis AI integration for Pi",
5
5
  "type": "module",
6
6
  "files": [