@cratis/pi 7.62.0 → 7.63.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 (103) hide show
  1. package/package/corpus/product-sync.json +9 -9
  2. package/package/corpus/skills/cratis-application-slice-conformance/SKILL.md +1 -1
  3. package/package/corpus/skills/cratis-arc-command/references/generated-values.md +27 -12
  4. package/package/corpus/skills/cratis-arc-command/references/shop-generation.md +17 -6
  5. package/package/corpus/skills/cratis-fundamentals-concept/SKILL.md +10 -2
  6. package/package/corpus/skills/cratis-fundamentals-concept/references/shop-generation.md +49 -6
  7. package/package/corpus/skills/cratis-screenplay-automations-and-translations/SKILL.md +43 -41
  8. package/package/corpus/skills/cratis-screenplay-automations-and-translations/references/cases-to-specify.md +11 -2
  9. package/package/corpus/skills/cratis-screenplay-automations-and-translations/references/integration-interview.md +24 -0
  10. package/package/corpus/skills/cratis-screenplay-automations-and-translations/references/public-events-and-direction.md +76 -10
  11. package/package/corpus/skills/cratis-screenplay-automations-and-translations/references/realization-and-gap-fill.md +5 -0
  12. package/package/corpus/skills/cratis-screenplay-automations-and-translations/references/todo-list-example.md +1 -1
  13. package/package/corpus/skills/cratis-screenplay-automations-and-translations/references/translate-example.md +39 -23
  14. package/package/corpus/skills/cratis-screenplay-automations-and-translations/references/translation-patterns.md +35 -12
  15. package/package/corpus/skills/cratis-screenplay-captures-and-reactions/SKILL.md +51 -81
  16. package/package/corpus/skills/cratis-screenplay-captures-and-reactions/references/atomic-batches-and-source-mappings.md +83 -0
  17. package/package/corpus/skills/cratis-screenplay-captures-and-reactions/references/capture-map-and-example.md +14 -4
  18. package/package/corpus/skills/cratis-screenplay-captures-and-reactions/references/reaction-forms.md +59 -0
  19. package/package/corpus/skills/cratis-screenplay-captures-and-reactions/references/record-capture-specifications.md +60 -0
  20. package/package/corpus/skills/cratis-screenplay-captures-and-reactions/references/specifying-triggers-and-clock.md +5 -1
  21. package/package/corpus/skills/cratis-screenplay-command-surface/SKILL.md +26 -28
  22. package/package/corpus/skills/cratis-screenplay-command-surface/references/described-handlers.md +82 -0
  23. package/package/corpus/skills/cratis-screenplay-command-surface/references/generated-values-and-responses.md +82 -28
  24. package/package/corpus/skills/cratis-screenplay-command-surface/references/protected-reads.md +113 -0
  25. package/package/corpus/skills/cratis-screenplay-command-surface/references/shop-generation.md +45 -12
  26. package/package/corpus/skills/cratis-screenplay-command-surface/references/text-and-match-rules.md +119 -0
  27. package/package/corpus/skills/cratis-screenplay-command-surface/references/validate-rules.md +14 -4
  28. package/package/corpus/skills/cratis-screenplay-command-surface/verification.json +10 -3
  29. package/package/corpus/skills/cratis-screenplay-event-modeling/SKILL.md +12 -12
  30. package/package/corpus/skills/cratis-screenplay-event-modeling/references/parsed-not-runnable.md +5 -3
  31. package/package/corpus/skills/cratis-screenplay-event-modeling/verification.json +5 -1
  32. package/package/corpus/skills/cratis-screenplay-legacy-extraction/SKILL.md +2 -2
  33. package/package/corpus/skills/cratis-screenplay-legacy-extraction/references/evidence-table-template.md +1 -1
  34. package/package/corpus/skills/cratis-screenplay-legacy-extraction/references/generated-recovery.md +51 -14
  35. package/package/corpus/skills/cratis-screenplay-legacy-extraction/references/intent-example.md +5 -0
  36. package/package/corpus/skills/cratis-screenplay-legacy-extraction/references/loss-report-template.md +2 -1
  37. package/package/corpus/skills/cratis-screenplay-legacy-extraction/references/rule-modeling.md +6 -3
  38. package/package/corpus/skills/cratis-screenplay-legacy-extraction/references/signal-to-intent.md +1 -1
  39. package/package/corpus/skills/cratis-screenplay-model-authoring/SKILL.md +22 -28
  40. package/package/corpus/skills/cratis-screenplay-model-authoring/references/choosing-generation.md +20 -7
  41. package/package/corpus/skills/cratis-screenplay-model-authoring/references/language-reference.md +12 -6
  42. package/package/corpus/skills/cratis-screenplay-model-authoring/references/mcp-loop.md +9 -1
  43. package/package/corpus/skills/cratis-screenplay-model-authoring/references/mcp-tools.md +58 -10
  44. package/package/corpus/skills/cratis-screenplay-model-authoring/verification.json +4 -2
  45. package/package/corpus/skills/cratis-screenplay-model-review/SKILL.md +2 -5
  46. package/package/corpus/skills/cratis-screenplay-model-review/references/anti-patterns.md +2 -2
  47. package/package/corpus/skills/cratis-screenplay-model-review/references/checklist.md +2 -2
  48. package/package/corpus/skills/cratis-screenplay-model-review/references/quick-self-check.md +2 -1
  49. package/package/corpus/skills/cratis-screenplay-model-review/references/review-questions.md +3 -2
  50. package/package/corpus/skills/cratis-screenplay-modeling-lifecycle/references/principles.md +1 -1
  51. package/package/corpus/skills/cratis-screenplay-modeling-lifecycle/references/vocabulary-map.md +1 -1
  52. package/package/corpus/skills/cratis-screenplay-read-surface/SKILL.md +2 -3
  53. package/package/corpus/skills/cratis-screenplay-read-surface/references/named-keys.md +3 -1
  54. package/package/corpus/skills/cratis-screenplay-render-and-gap-fill/SKILL.md +8 -3
  55. package/package/corpus/skills/cratis-screenplay-render-and-gap-fill/references/gap-fill-handoff.md +8 -0
  56. package/package/corpus/skills/cratis-screenplay-render-and-gap-fill/references/renderability-gate.md +6 -4
  57. package/package/corpus/skills/cratis-screenplay-scenario-coverage/SKILL.md +36 -29
  58. package/package/corpus/skills/cratis-screenplay-scenario-coverage/references/berth-reservations.md +6 -0
  59. package/package/corpus/skills/cratis-screenplay-scenario-coverage/references/invoicing-dues-design.md +15 -4
  60. package/package/corpus/skills/cratis-screenplay-scenario-coverage/references/invoicing-dues-example.md +25 -20
  61. package/package/corpus/skills/cratis-screenplay-scenario-coverage/references/public-event-coverage.md +14 -3
  62. package/package/corpus/skills/cratis-screenplay-scenario-coverage/references/scenario-examples.md +9 -3
  63. package/package/corpus/skills/cratis-screenplay-scenario-coverage/references/spec-forms-by-mode.md +7 -3
  64. package/package/corpus/skills/cratis-screenplay-slice-design/SKILL.md +3 -1
  65. package/package/corpus/skills/cratis-screenplay-slice-design/references/command-inventory.md +4 -4
  66. package/package/corpus/skills/cratis-screenplay-slice-design/references/rule-layers.md +4 -2
  67. package/package/corpus/skills/cratis-screenplay-slice-design/references/slicing.md +4 -3
  68. package/package/corpus/skills/cratis-screenplay-slice-design/references/worked-example.md +8 -8
  69. package/package/corpus/skills/cratis-screenplay-specifications/SKILL.md +49 -47
  70. package/package/corpus/skills/cratis-screenplay-specifications/references/actions-beyond-commands.md +11 -1
  71. package/package/corpus/skills/cratis-screenplay-specifications/references/generated-fixtures.md +48 -17
  72. package/package/corpus/skills/cratis-screenplay-specifications/references/vocabulary.md +14 -1
  73. package/package/corpus/skills/cratis-screenplay-streams-and-consistency/SKILL.md +25 -21
  74. package/package/corpus/skills/cratis-screenplay-streams-and-consistency/references/boundaries.md +2 -2
  75. package/package/corpus/skills/cratis-screenplay-streams-and-consistency/references/consistency-and-concurrency.md +9 -3
  76. package/package/corpus/skills/cratis-screenplay-streams-and-consistency/references/multi-service-models.md +4 -3
  77. package/package/corpus/skills/cratis-screenplay-streams-and-consistency/references/streams-example.md +7 -0
  78. package/package/corpus/skills/cratis-screenplay-toolchain/SKILL.md +30 -22
  79. package/package/corpus/skills/cratis-screenplay-toolchain/references/cheat-sheet-example.md +3 -1
  80. package/package/corpus/skills/cratis-screenplay-toolchain/references/cheat-sheet.md +47 -2
  81. package/package/corpus/skills/cratis-screenplay-toolchain/references/diagnostic-arguments.md +60 -0
  82. package/package/corpus/skills/cratis-screenplay-toolchain/references/diagnostics.md +65 -5
  83. package/package/corpus/skills/cratis-screenplay-toolchain/references/executable-subset.md +50 -22
  84. package/package/corpus/skills/cratis-screenplay-toolchain/references/generation-checks.md +93 -0
  85. package/package/corpus/skills/cratis-screenplay-toolchain/references/generation-strategies-example.md +117 -35
  86. package/package/corpus/skills/cratis-screenplay-toolchain/references/language-admission.md +46 -0
  87. package/package/corpus/skills/cratis-screenplay-toolchain/references/preferred-syntax.md +3 -1
  88. package/package/corpus/skills/cratis-screenplay-toolchain/references/renderable-subset.md +25 -10
  89. package/package/corpus/skills/cratis-screenplay-toolchain/references/screenplay-contract.json +1800 -50
  90. package/package/corpus/skills/cratis-screenplay-toolchain/references/screenplay-contract.version +1 -1
  91. package/package/corpus/skills/cratis-screenplay-toolchain/references/traps.md +5 -3
  92. package/package/corpus/skills/cratis-screenplay-toolchain/verification.json +6 -1
  93. package/package/corpus/skills/cratis-screenplay-ui-composition/SKILL.md +8 -53
  94. package/package/corpus/skills/cratis-screenplay-ui-composition/references/file-references.md +2 -2
  95. package/package/corpus/skills/cratis-screenplay-ui-composition/references/interaction-example.md +54 -0
  96. package/package/corpus/skills/cratis-screenplay-ui-composition/verification.json +6 -3
  97. package/package/corpus/skills/cratis-stage-rendering-and-sandbox/SKILL.md +30 -29
  98. package/package/corpus/skills/cratis-stage-rendering-and-sandbox/references/admission.md +36 -9
  99. package/package/corpus/skills/cratis-stage-rendering-and-sandbox/references/choosing-generation.md +28 -8
  100. package/package/corpus/skills/cratis-stage-rendering-and-sandbox/references/publication-and-recovery.md +31 -0
  101. package/package/corpus/skills/cratis-stage-rendering-and-sandbox/references/sandbox-and-specrunner.md +8 -0
  102. package/package/corpus/skills/cratis-stage-rendering-and-sandbox/verification.json +4 -1
  103. package/package.json +1 -1
@@ -40,25 +40,18 @@ editing concept generation or `generated identifier`.
40
40
 
41
41
  ## When not to
42
42
 
43
- The same reference separates inputs, credentials and context/secret generation that is not available.
43
+ For generation proofs/PLAY0688 repairs, read [generation details](references/mcp-tools.md#concept-generation):
44
+ use `rules[]`, not parsed diagnostics (Requires Screenplay 4.173.0,
45
+ `screenplay --version`; older servers omit proofs).
44
46
 
45
47
  ## Locate and connect
46
48
 
47
49
  Use the declared `screenplay` MCP server (for example `open-workspace`).
48
50
 
49
- Never ask the user which folder to use before trying. Call `open-workspace` with no
50
- arguments first: a server started without a fixed root binds the folder the host or
51
- launch directory offers (the client's single workspace root, else the working
52
- directory when it holds `.play` files). Only when it answers that no root was given,
53
- or that several roots are offered, pass `path`: the folder holding the project's `.play` files, otherwise the
54
- folder the user names. Without a project, the server works in `Documents/Screenplay`
55
- in the user's home folder, so do not invent a location. A root fixed at launch
56
- can switch only to the same model folder in a registered Git worktree of the
57
- same repository; rules and refusals are in [MCP loop](references/mcp-loop.md).
58
-
59
- Prefer a fixed root (dynamic-roots history: [MCP loop](references/mcp-loop.md)). Send `initialize` and
60
- `notifications/initialized` before any tool call, then discover `tools/list`
61
- schemas rather than relying on a remembered count.
51
+ Never ask the user which folder to use before trying `open-workspace` without
52
+ arguments; do not invent a root. Read [MCP loop](references/mcp-loop.md) when connecting or switching roots;
53
+ it owns fallback discovery, fixed-root limits and the initialization protocol.
54
+ Discover `tools/list` schemas rather than relying on a remembered count.
62
55
 
63
56
 
64
57
  Look first for the project's existing `.play` files: their folder is the model.
@@ -71,20 +64,12 @@ explanatory Markdown belongs in repository documentation.
71
64
  `mcp-servers.json` declares the Screenplay server; supported client registration
72
65
  is owned by the Cratis CLI, which preserves other servers and user configuration.
73
66
 
74
- The CLI entry point is:
75
-
76
- ```shell
77
- cratis screenplay mcp <model-folder>
78
- ```
67
+ The CLI-bundled MCP can be older than the standalone tool: discover schemas.
68
+ Read [MCP loop](references/mcp-loop.md) for launch options. Use the supported
69
+ channel, not another global tool, Docker or copied managed configuration.
79
70
 
80
- The CLI-bundled MCP can be older than the standalone tool and lack newer capabilities, such as the generation summary and entropy repairs.
81
- Discover installed capabilities. Do not ask for a second global .NET tool, Docker
82
- or hand-copied managed MCP configuration. Installation/status must confirm adapter
83
- support and no conflicts.
84
-
85
- If the MCP is unavailable, report that gap. Do not claim compiler-validated AST
86
- editing while falling back to regex. Existing standalone `screenplay mcp` users
87
- can keep that entry point; use the project's supported installation channel.
71
+ If MCP is unavailable, report it; regex edits are not compiler-validated AST
72
+ editing. Existing standalone `screenplay mcp` users may retain that entry point.
88
73
 
89
74
  ## Understand before editing
90
75
 
@@ -96,7 +81,9 @@ can keep that entry point; use the project's supported installation channel.
96
81
  `kind: "Property"`, `Owner.member` / `Owner.generationN.member`, direct mappings.
97
82
  `complete: false` is incomplete evidence, never a successful empty list.
98
83
  Edit through MCP proposals, not hand-edited text; [generation](references/mcp-tools.md#concept-generation).
99
- 3. Read diagnostics and coverage limitations. Use `dependency-graph` for container
84
+ 3. Read diagnostics and coverage limitations. Identify subjects by code and typed
85
+ `arguments`, never by parsing message text. Read [diagnostic arguments](../cratis-screenplay-toolchain/references/diagnostic-arguments.md)
86
+ for kinds, PLAY0524 step paths/indices, unknown fields and older responses. Use `dependency-graph` for container
100
87
  edges, declared-dependency coverage, cycles and advisory order; the board's
101
88
  dependency-map toggle exposes this evidence visually. Unknown or ambiguous
102
89
  bindings are not an empty, successful dependency graph.
@@ -114,6 +101,13 @@ Keep reads scoped to the relevant module, feature, slice or document. Do not
114
101
  request a whole merged AST when a bounded declaration/property query answers the
115
102
  question. Size-limit refusals require narrower reads, not truncation.
116
103
 
104
+ ## Application modes and described handler intent
105
+
106
+ Start new models with `reaction batches atomic`; preserve it through proposals.
107
+ Read [language admission](../cratis-screenplay-toolchain/references/language-admission.md)
108
+ for atomic/protected modes and Stage refusals. Read [intent inventories](references/mcp-tools.md#dependencies-and-intent-inventories)
109
+ for handler views: `executableReady` means binding, not an implemented body.
110
+
117
111
  ## Compare models
118
112
 
119
113
  For a `main` comparison, pass a worktree `path` to `semantic-diff`, not two
@@ -7,14 +7,21 @@
7
7
 
8
8
  Follow the [threaded shop model](../../cratis-screenplay-command-surface/references/shop-generation.md):
9
9
  CustomerId (`cus_` + ULID), OrderId (TypeID) and InviteCode (NanoID) are released
10
- strategies. ApiKey stays secret without executable generation. Neither the
11
- OrderId's Arc received-time/tenant context nor ApiKey's .NET Bytes(32) secret
12
- factory can be promised as Screenplay generation today.
10
+ strategies. InvoiceNumber uses a readable pattern/checksum and TicketNumber an
11
+ Int pickup-ticket range. ApiKey stays secret without executable generation.
12
+ An attached generation rule can use Now/Tenant, but the reference runner consumes
13
+ pinned Strings rather than executing its implementation.
13
14
 
14
15
  For a server-owned new value, choose implicit UUID for an ordinary identity,
15
16
  UUIDv7 for time-ordered UUIDs, ULID for compact time-ordered text, TypeID for
16
17
  recognizable typed text, NanoID for opaque text, or bytes for an exact random-bit
17
- budget. Inspect entropy separately from executable admission; prefixes add no
18
+ budget. Choose `pattern` for readable references (dates/check digits add no
19
+ entropy), `random` for bounded Int values, `rule` only when an opaque implementation
20
+ is needed.
21
+
22
+ Requires Screenplay 4.172.0 (`screenplay --version`) for these v21 constructs; older compilers refuse PLAY0268.
23
+
24
+ Inspect entropy separately from executable admission; prefixes add no
18
25
  random bits and identifiers need at least 64. Time-ordered is not strict
19
26
  millisecond ordering. Use the existing [strategy and MCP reference](../../cratis-screenplay-command-surface/references/generated-values-and-responses.md),
20
27
  not a per-property strategy: the concept owns `generate`, the command property
@@ -23,7 +30,13 @@ says `generated identifier` or `generated`.
23
30
  ## When not to
24
31
 
25
32
  Do not replace client-minted inputs, authorization, idempotency keys or a gapless
26
- invoice allocator with generation. Secret generation, pattern/random/rule execution
27
- and generated-concept rule consistency are not released capabilities. Preserve
28
- refused rules instead of deleting them or inventing a repair.
33
+ invoice allocator with generation. Patterns are not sequential/gapless allocators
34
+ or secrets; check digits detect typos, not forgery. Use a unique constraint for
35
+ short payload codes, and retain whole-source freshness for generated destinations.
36
+ Secret generation and sequence allocation remain refused. Inspect authored-order
37
+ MCP `rules[]` and `derivedPattern` for rule proofs and reviewed PLAY0688 repair;
38
+ never delete a business invariant to silence PLAY0689. Read
39
+ [Stage admission](../../cratis-stage-rendering-and-sandbox/references/admission.md)
40
+ for checksum validation and pattern/random rendering prerequisites.
41
+ `generate rule` remains STAGE-ESM-028, so model admission does not promise rendering.
29
42
  Sources: `Documentation/screenplay/generated-values/choosing.md` and `Documentation/screenplay/generated-values.md` in `Cratis/Screenplay`.
@@ -260,16 +260,21 @@ See read-surface `references/named-keys.md` for the collection-key exclusion alg
260
260
  | Information only, never blocks | `persona` (report-only: `PLAY0270`, the policies it lists must exist), `authentication`, `domain`, `seed`, descriptions and `file` provenance. A persona does not block binding and does not change behavior, so state persona scope in a description or a policy the model uses |
261
261
  | Binds as ESM v7 (`PLAY0268` on a compiler that stops before v7) | `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 generated-concept rules select v20 with PLAY0688/0689 proof diagnostics. Stage renders supported UUID/String strategies, scalar/named responses and fixtures; unsupported types/result combinations remain `-028`/`-038` |
262
262
  | Authorable, not executable (PLAY0268) | Systems/operations, the `numbers exact` source mode (PLAY0268; exact lowering of qualifying Double literals is the admitted v11) remain unadmitted |
263
- | Concept generation strategies (ESM v15) | Required scalar generatable Uuid/String concepts; concept-owned uuid/uuidv7/ulid/typeid/nanoid/bytes strategies and admitted modifiers. Strict fixture encoding; Guarded whole-source freshness rejects Concurrency with no append/retry. Generated secrets, pattern/random/rule and sequence remain refused; generated-concept rules select v20. Stage renders supported strategies: command-surface `references/generated-values-and-responses.md` |
263
+ | Concept generation strategies (ESM v15) | Required scalar generatable Uuid/String concepts; concept-owned uuid/uuidv7/ulid/typeid/nanoid/bytes strategies and admitted modifiers. Strict fixture encoding; Guarded whole-source freshness rejects Concurrency with no append/retry. Generated secrets and sequence remain refused; generated-concept rules select v20, pattern/random/rule and checksum validation select v21. Stage renders supported strategies: command-surface `references/generated-values-and-responses.md` |
264
264
  | Response-name UI continuations (no ESM change) | Form submit and execute-success scopes, own failure PLAY0685, nested shadowing and outer success in inner failure; field/parameter precedence. An older bundled compiler lacks resolution; Scene runtime binding remains downstream. UI composition `references/response-continuations.md` |
265
265
  | Collection equality filters (ESM v14) | Caller-supplied `filter name Type [optional]`, no `from`, matching a same-named scalar primitive/concept/enum read-model property with the same nominal type. AND with `by`; optional omission does not narrow, supplied null is refused. PLAY0468 covers unknown/repeated/missing required spec arguments; result rows compare by read-model/key regardless of order. Read read-surface `references/equality-filters.md` for the compiled example and renderer ceilings |
266
266
  | Recovery and no-event assertions (ESM v17) | `when redelivered` delivers one given occurrence to one reaction without append; `then no events` checks no new facts, excluding append input. Requires Screenplay 4.157.0 or later (`screenplay --version`); older compilers report PLAY0268. |
267
267
  | Query Validation rejection (ESM v18) | Exactly one queried call plus one `then error`, no other action/result/denial. Concept key/supplied filters validate after authorization in every version. Requires Screenplay 4.161.0 or later (`screenplay --version`); older runners may answer absence. |
268
268
  | Invocation refusal branches (ESM v19) | Ordered first-match `on refused` productions or acknowledgement, `$refusal` values; bare refusal excludes authorization. Requires Screenplay 4.160.0 or later (`screenplay --version`); older compilers report PLAY0268. |
269
- | Generated-concept rules (ESM v20) | Proven rules bind, Refuted PLAY0688 errors, Unproven PLAY0689 warnings; fixtures obey shape and rules. Requires Screenplay 4.164.0 or later (`screenplay --version`); older compilers report PLAY0268. |
269
+ | Generated-concept rules (ESM v20) | Proven rules bind silently, Refuted PLAY0688 errors include a witness, Unproven PLAY0689 warnings include a reason; deterministic regex containment only, not passing samples. Fixtures obey shape and rules. Requires Screenplay 4.164.0 or later (`screenplay --version`); older compilers report PLAY0268. |
270
+ | Finite generation and attachments (ESM v21) | String pattern with optional Luhn/Mod11/Mod97 checksum, inclusive Int random range, attached String generation rule with language-neutral Now/Tenant context and String result, String checksum validation. Requires Screenplay 4.172.0 (`screenplay --version`); older compilers report PLAY0268. PLAY0691 is support-budget exhaustion, PLAY0692 empty support on a scanned date. Pin date fixtures with given clock. Requires Stage 4.118.0 for checksum validation and 4.119.0 for pattern/random rendering; older renderers refuse them. `generate rule` remains STAGE-ESM-028; see command-surface `references/generated-values-and-responses.md`. |
271
+ | Atomic reaction batches (ESM v22) | Root `reaction batches atomic`; direct productions per occurrence and selected refusal branches are separate batches, commands independent; Stage refuses v22 and atomic mode |
272
+ | Described handlers (ESM v23) | Pending implementation beside unconditional produces; payload-only contract, reached body Unsupported ImplementationBody; Stage STAGE-IMPL-002 even Stub mode |
273
+ | Ordinal text rules (ESM v24) | contains/not contains/starts with/ends with on scalar non-enum text properties; quoted literals, not conditions; Stage semantic engines execute/render |
274
+ | Protected command reads (ESM v25) | Root `command reads protected`; eligible read paths in requirements and production mappings, absence Validation, concurrent matching facts Conflict; Stage admits v25 but refuses protected reads STAGE-ESM-044 |
270
275
  | 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. Whole-workspace binding determines executable availability; CLI/Stage realization remains separate |
271
- | Blocks binding (`PLAY0268`) | enum/identity compliance and events combining personal or explicitly subject-scoped secret values with explicit subject marks; a compiler that stops before v13 refuses all `pii`/`secret` concepts ("compliance attributes require portable data-subject semantics"), while v13 binds them and Stage renders protection; 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 context `from` sources (typed query context is unadmitted), single-result filters (collections only), `scoped to` (opaque scope), `performer` (opaque implementation) or composite `by` blocks; optional keyed and collection queries, including caller-supplied equality filters and observable delivery, bind, `$causedBy` and templates in projections |
272
- | Blocks binding (`PLAY0271`, legacy meaning) | Command `reads` and `concurrency` |
276
+ | Blocks binding (`PLAY0268`) | enum/identity compliance and events combining personal or explicitly subject-scoped secret values with explicit subject marks; a compiler that stops before v13 refuses all `pii`/`secret` concepts ("compliance attributes require portable data-subject semantics"), while v13 binds them and Stage renders protection; attached command `handler` (PLAY0035 beside productions; pending described intent instead binds v23), bare `rule <Name>`, read paths without protected opt-in or in unsupported positions such as `produces when`, 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 context `from` sources (typed query context is unadmitted), single-result filters (collections only), `scoped to` (opaque scope), `performer` (opaque implementation) or composite `by` blocks; optional keyed and collection queries, including caller-supplied equality filters and observable delivery, bind, `$causedBy` and templates in projections |
277
+ | Blocks binding (`PLAY0271`, legacy meaning) | Command reads without protected opt-in and `concurrency`; combined protected reads/concurrency is PLAY0783 |
273
278
  | Deferred (`PLAY0269`, information) | Screens, layouts, templates, forms, contributions, UI profiles, themes, behaviors and `on`/`uses` |
274
279
  | Metadata only (`PLAY0270`, information) | `domain`, `seed`, `persona`, trigger and other descriptions, and `file` provenance on declarations |
275
280
 
@@ -301,8 +306,9 @@ and routes bind and reference-execute as v8; reaction identity as v10.
301
306
  Use standalone `screenplay test` or MCP `run-specifications` for a reference
302
307
  verdict, and independently check CLI/Stage admission. Never drop a contract to bind.
303
308
  Generated values and `returns` are not in this group: they bind as ESM v7.
304
- Protected reads and `derive`/`provide` (not admitted by any supported ESM version) have no documented
305
- syntax: do not teach or invent one. Affected-instance declarations and query paging/sorting/change-set delivery
309
+ Protected command reads have documented v25 opt-in; see command-surface
310
+ `references/protected-reads.md`. `derive`/`provide` remain undocumented and
311
+ unadmitted: do not invent syntax. Affected-instance declarations and query paging/sorting/change-set delivery
306
312
  remain unavailable here. Event `subject` is report-only authoring metadata;
307
313
  public events/origin are admitted as ESM v9 (not provider realization).
308
314
  Purpose declarations, references and processing records are authoring metadata,
@@ -24,6 +24,14 @@ defined by `cratis-screenplay-modeling-lifecycle`. Discover the installed tool s
24
24
 
25
25
  ## Connect
26
26
 
27
+ Never ask which folder to use before trying `open-workspace` with no arguments.
28
+ Without a fixed root, it binds the client's single workspace root, else a launch
29
+ directory holding `.play` files. Only after a no-root or multiple-roots response,
30
+ pass `path`: the folder holding the project's models, otherwise the folder the
31
+ user names. Without a project the server uses `Documents/Screenplay` in the user's
32
+ home; do not invent a location. A fixed root can switch only to the same model
33
+ folder in a registered Git worktree of the same repository.
34
+
27
35
  1. Launch with a **fixed root**: `screenplay mcp <model-folder>`, or
28
36
  `cratis screenplay mcp <model-folder>`, or `cratis screenplay mcp` inside a
29
37
  project, where the CLI locates the model (the project's `.play` files, else `Source/`
@@ -210,7 +218,7 @@ connection. Passing `open-workspace.path` does **not** avoid it, because the err
210
218
  | --- | --- | --- |
211
219
  | 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` |
212
220
  | 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) |
213
- | 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, preview strategies PLAY0268, generated-rule proofs PLAY0688/0689. |
221
+ | 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. |
214
222
  | 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 |
215
223
  | Inline event extraction | `produces event ...` to a declared event | `propose-extract-inline-event` |
216
224
  | Parser-invalid document | no editable handles | `propose-source` `replace-document` with corrected source, or typed `propose-ast` document replacement |
@@ -166,8 +166,12 @@ exists only for authored `generate`; an implicit UUID default has no block.
166
166
  | --- | --- |
167
167
  | `strategy` | Authored strategy name |
168
168
  | `modifiers` | Only set `prefix`, `case`, `size`, `alphabet`, `count`, `encoding`; omitted defaults are not filled in |
169
- | `previewArguments` | Present only for authored `pattern`, `checksum`, `range`, `rule`; each is `{value, executable: false}` |
170
- | `entropyBits` | Exact random bits, or null for unknown strategy/invalid entropy inputs |
169
+ | `arguments` | Authored `pattern`, `checksum`, `rule` strings and `range: {text, minimum, maximum}` with exact Int64 endpoints; malformed range retains text only. Replaces `previewArguments`. |
170
+ | `supportCount` | Exact JSON integer for assessed pattern/random distinct support; preserve large numbers without floating-point rounding. Dates use minimum conditioned support over the compiler's 100-year UTC horizon. |
171
+ | `entropyBits` | Built-in random bits; pattern/random use log2(supportCount). Null for opaque rule implementations or invalid/unsupported inputs. |
172
+ | `derivedPattern` | Anchored strategy-derived regex, or null; pattern expressions are deterministic and bounded, but date/checksum digit runs describe shape, not arithmetic containment. |
173
+ | `derivedPatternUnknownReason` | Reason when derivedPattern is null; never invent a regex from it. |
174
+ | `rules` | Authored-order entries: rule kind, line/column, status proven/refuted/unproven; witness for refuted, reason for unproven. diagnosticCode only for reported PLAY0688/0689; repair PLAY0688 only for a reported refuted declarative rule. |
171
175
  | `entropyUnknownReason` | Present only when entropy is unknown |
172
176
  | `valuesAtOnePercentCollision` | JSON number estimating the 1% birthday collision count, or null; scientific notation can exceed client floating-point range |
173
177
  | `executable` | `status`, `diagnosticCodes`, and `reason` only for `notAssessed` |
@@ -178,7 +182,10 @@ and no such error exists; otherwise `notAssessed`, with a reason that whole-mode
178
182
  binding failed. `diagnosticCodes` contains only errors at these declaration locations.
179
183
  An empty list is not admission; low-entropy property diagnostics require workspace
180
184
  inspection. Invalid alphabets/non-positive sizes or counts yield null estimates
181
- with `entropyUnknownReason`, preserving compiler diagnostics. Time, prefixes,
185
+ with `entropyUnknownReason`, preserving compiler diagnostics. Pattern support
186
+ budget exhaustion (PLAY0691) or empty support on a scanned date (PLAY0692) also
187
+ leaves estimates null with the compiler's reason; an opaque `rule` has unknown,
188
+ not zero, entropy. Time, prefixes,
182
189
  case and encoding add no randomness; the compiler, details and repairs share
183
190
  `GenerationEntropy`, not an agent's parallel estimate.
184
191
 
@@ -191,8 +198,9 @@ source document under the same revision/review contract. Canonical printing
191
198
  retains `generate`. Review `read-proposal` changes and `view: "executable-diagnostics"`,
192
199
  run candidate specifications where executable, then explicitly `apply`.
193
200
  Authoring acceptance does not imply executable readiness: `sequence` reports
194
- PLAY0682; `pattern`/`random`/`rule` and generated-concept validation rules report
195
- PLAY0268. Do not retype a refused proposal to bypass those diagnostics.
201
+ PLAY0682; generated secrets still report PLAY0268, rule proofs PLAY0688/0689,
202
+ and finite-support failures PLAY0691/0692. Pattern/random/rule and checksum
203
+ validation bind as ESM v21. Do not retype a refused proposal to bypass diagnostics.
196
204
 
197
205
  `screenplay_repair_capabilities` advertises PLAY0683/PLAY0684. Discover concrete
198
206
  verified actions with `read-workspace view: "repairs"` at the diagnostic revision:
@@ -211,10 +219,40 @@ concept; uniqueness changes append-time behavior. Review every changed document
211
219
  before applying; discovery/proposal write nothing. The saved-file VS Code repair
212
220
  picker does not expose these entropy actions.
213
221
 
214
- PLAY0688 repair replaces a refuted generated-concept rule with the strategy-derived
215
- `matches` pattern. Review it as a validation change for input/stored values too.
216
- PLAY0689 is an unproven warning, not proof; checksum repairs remain unadmitted.
217
- MCP does not generate values.
222
+ Read `generation.rules[]` instead of parsing diagnostic prose: `refuted` names
223
+ the violating `witness`; `unproven` explains its `reason`; `proven` needs no diagnostic.
224
+ A refuted result without `diagnosticCode` means the compiler did not check that
225
+ rule (for example, a UUID concept unused by generated command properties), so
226
+ there is no reported repair. Proof status is not executable admission, and
227
+ passing samples do not prove containment.
228
+
229
+ To add a rule the strategy satisfies, put `derivedPattern` into a typed `matches`
230
+ proposal preserving other concept members. If null, read
231
+ `derivedPatternUnknownReason` and keep the intended invariant; do not fabricate
232
+ an expression. PLAY0688 repair replaces a refuted generated-concept rule with
233
+ the strategy-derived matches pattern. Discover its subject through
234
+ `read-workspace view: "repairs"`, then `propose-repair` with both revisions and
235
+ canonical formatting. Review input/stored-value effects, not just generation.
236
+ For a checksum pattern the same proposal explicitly adds the declared checksum
237
+ validation if absent. Ambiguous/unbounded derived regexes have no repair.
238
+ PLAY0689 is an Unproven warning, not proof; MCP never generates values.
239
+ For an opaque generation rule, inspect `read-workspace view:
240
+ "implementation-requirements"` for its ValueGeneration requirement; the reference
241
+ runner consumes a pinned String and never executes its attached body.
242
+ Requires Screenplay 4.181.1 (`screenplay --version`) for the language-neutral
243
+ version-1 ValueGeneration context contract (Now instant, Tenant portable ID,
244
+ String result); older Cratis C# bindings cannot compile all context-aware bodies.
245
+ The provider selects the binding, not the fence tag: Cratis C# uses Fundamentals'
246
+ `Cratis.Concepts.GenerationContext`; BCL-only C# hosts can use Screenplay's record.
247
+ Portable bodies use Now, tenant interpolation/string assignment and BCL types.
248
+ Passing context to `GenerateValue.*`, constructing/naming the context type or
249
+ reading `Tenant.Value` is target-bound, not a shared language contract. See
250
+ [context reference](https://github.com/Cratis/Screenplay/blob/main/Documentation/screenplay/context.md).
251
+
252
+ Requires Screenplay 4.173.0 or later (`screenplay --version`) for `arguments`,
253
+ exact support, derived patterns and `rules[]`; older servers can expose
254
+ `previewArguments` and omit proofs. Discover schemas and diagnostics instead of
255
+ assuming these fields. Reference: [generation details](https://github.com/Cratis/Screenplay/blob/main/Documentation/screenplay/mcp/reference.md#generated-values-and-responses).
218
256
 
219
257
  Requires Screenplay 4.164.0 or later (`screenplay --version`) for generated-rule proofs and PLAY0688 repair; older servers lack this action. The CLI-bundled MCP can lack
220
258
  this generation summary and the entropy repairs. Existing typed concept proposals predate the
@@ -453,6 +491,11 @@ inspect authored links, not code execution or a transitive runtime graph.
453
491
 
454
492
  ## Dependencies and intent inventories
455
493
 
494
+ Diagnostic subjects use code plus typed `arguments`, not parsed messages. This applies
495
+ to `diagnostics`, executable diagnostics and proposal introducedExecutableErrors.
496
+ Read [diagnostic arguments](../../cratis-screenplay-toolchain/references/diagnostic-arguments.md)
497
+ for optional subjects, declaration paths and PLAY0524 step indices.
498
+
456
499
  `dependency-graph` edges point consumer → producer. Views: `edges`, `cycles`,
457
500
  `order`, `unresolved`, `declarations`; `from`/`to` select slice/feature/module
458
501
  aggregation (`to` also accepts context). `scope`, `direction`, `kinds` and
@@ -479,7 +522,12 @@ Workspace views `named-rule-intents`/`named-rule-intent-details` cover CommandNa
479
522
  only, including pending hints without a requirement ID. Details select either
480
523
  `subject` or attached `requirementId`, not both. `handler-intents` and
481
524
  `handler-intent-details` cover CommandHandler only; handler details select
482
- `requirementId`. All page ordered hints, not implementation correctness. Continue
525
+ `requirementId`. A handler entry's `executableReady` means successful v23 binding
526
+ with a matching Pending requirement, not a supplied body; `admission` is described,
527
+ refused or authoring-only. `implementation-requirements` exposes ordered hints and
528
+ provisional/ambiguous flags. Edit HandlerSyntax/ImplementationSyntax/ImplementationHintSyntax
529
+ through `propose-ast` with Authoring validation, preview then apply; unwrapping
530
+ pending metadata is refused. All page ordered hints, not implementation correctness. Continue
483
531
  with `expectedRevision` and `expectedCatalogRevision`; provisional owner IDs are
484
532
  not authoritative. Edit hints through reviewed `propose-ast`.
485
533
 
@@ -137,7 +137,8 @@
137
137
  },
138
138
  {
139
139
  "kind": "skill-contains",
140
- "value": "cratis screenplay mcp <model-folder>"
140
+ "value": "cratis screenplay mcp <model-folder>",
141
+ "file": "references/mcp-loop.md"
141
142
  },
142
143
  {
143
144
  "kind": "skill-contains",
@@ -174,7 +175,8 @@
174
175
  },
175
176
  {
176
177
  "kind": "skill-contains",
177
- "value": "registered Git worktree"
178
+ "value": "registered Git worktree",
179
+ "file": "references/mcp-loop.md"
178
180
  },
179
181
  {
180
182
  "kind": "skill-contains",
@@ -127,11 +127,8 @@ rejected state and its evidence.
127
127
  Optional, on request, all read-only and yielding edit requests: a subject's information journey (`references/model-inventory-report.md`), a resilience pass (`references/stressor-analysis.md`) and a slice-by-slice walkthrough (`references/walkthrough.md`).
128
128
 
129
129
  ## Quick self-check (modeler, P4; about ten minutes)
130
- Eleven yes/no checks the modeler runs on its own work before P5 (V1 clean, no dropped constructs,
131
- every event production has `for`, every field has an origin, every command a reachable authorized
132
- origin, NOT-enforced rules marked, coverage matrix filled, personas with their denials, rationale in
133
- `documentation`, open questions as anchored notes, every Automation with pending work). Any "no" is
134
- fixed or explained before P5. The list: [quick self-check](references/quick-self-check.md).
130
+ Read [quick self-check](references/quick-self-check.md) before P5 for the eleven
131
+ modeler checks. Fix or explain every "no"; this is not the independent review.
135
132
 
136
133
  ## Business-question pass (explain brief)
137
134
  Be a sharp business analyst seeing the domain fresh: walk each persona's journey and ask only what a domain person must decide, in plain language with no engineering words (could a non-technical product owner read it and immediately understand what is being asked?), anchored to a place in the model, at most 12 questions (zero is valid). Method, element prompts and the model-word translation table: `references/business-questions.md`. A behavior walk in the Stage sandbox (`cratis-stage-rendering-and-sandbox`) is a separate, optional check; its findings arrive here as review findings.
@@ -64,8 +64,8 @@ the problem, the checks it violates, the fix, all pinned to one declaration.
64
64
  | Undeclared removal/append event | `remove with` or capture `append` names an undeclared event | V1 warns (PLAY0166, a failure under warnings as errors); binding fails PLAY0273 | C (executable) / D | declare or fix the name; run V3 |
65
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; Stage 4.89.1 renders role/authenticated trusted actors, but claim-reading/opaque gates still refuse STAGE-ESM-034 and need 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
- | `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
- | 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 |
67
+ | Unadmitted read claimed protected | rule "checked" by legacy command or trigger reads | no protected contract or target realization | D (major) | opt eligible command reads into `command reads protected` (v25); inspect shape, absence and conflict cases. Stage refuses protected reads (STAGE-ESM-044); distinguish reference protection from target evidence; checklist E3 |
68
+ | Caller-supplied state rule | `require currentStatus == "open"` where the caller sends `currentStatus` | the caller decides its own permission | D (major) | read authoritative stored state through admitted protected reads and `require`; mark legacy/refused shapes and target realization as gaps; checklist E3 |
69
69
  | `severity warning` as soft rule | rule meant to warn but still rejects | blocks valid requests | C semantics | remove or make it a real rule |
70
70
  | Relay events | `*Synced`, `*Forwarded` events that only move data | noise, not facts | D | translate once into a business fact |
71
71
  | External event driving a worker directly | captured external record invokes commands with no local fact | no audit of what was learned | D | append a local fact in `Translate`; automate from it |
@@ -123,7 +123,7 @@ the format in `worked-example.md`.
123
123
  |---|---|---|---|
124
124
  | E1 | Value formats on `concept`s; input rules on the command; uniqueness as `constraint`; access as `authorize` | declarations | D |
125
125
  | E2 | Every refusal has a message a person understands; constraint messages copied verbatim in specs | `message`, specs | D |
126
- | E3 | A state-dependent rule is `reads <View>` + `require <expr> message "..."` as stated intent, and the slice `description` marks it NOT enforced in the model today (PLAY0268/0271 at binding expected in design mode) with its target named (`[ProtectedDecision]` + `DecisionRead<T>`, Chronicle DCB / `concurrency` scope, or a constraint). Not: caller-supplied copies of state, attestation booleans (`confirmsX == true`), rules in `handler` / `implementation hint` prose, or `reads` treated as protection | slice `description`, `require`, `handler` | D (faking or hiding = major) |
126
+ | E3 | A state-dependent rule uses `reads` + `require` over authoritative state: eligible reads opt into `command reads protected` (v25), with required absence and decide/commit conflict cases. Legacy/refused reads are marked unenforced with a named target. Stage refuses protected reads (STAGE-ESM-044); reference protection is not target realization. Not: caller-supplied copies of state, attestation booleans (`confirmsX == true`), rules in `handler` / `implementation hint` prose, or `reads` treated as protection | slice `description`, `require`, `handler` | D (faking or hiding = major) |
127
127
  | E4 | `severity warning` is not used as "soft" validation (it still rejects) | validate lines | C semantics |
128
128
  | E5 | Preconditions are explicit; nothing relies on "obviously you can't" | descriptions, specs | Q |
129
129
  | E6 | Each invariant has an atomic enforcement point (name the storage provider where constraint admission matters); the race loser's outcome is specified | constraints, specs | D |
@@ -147,7 +147,7 @@ PLAY0516 moves preserve executable bytes/identities. Source: Screenplay
147
147
  | F2 | No impossible sequence (a fact that requires one that can never precede it) | constraints, specs | D |
148
148
  | F3 | Cancellation, failure and correction paths exist where the business has them | slices | Q |
149
149
  | F4 | Automations: trigger, todo/work item if work can be pending, a closing fact, retry and once-only story | reactions, views | D (`cratis-screenplay-automations-and-translations`) |
150
- | F5 | External facts enter through `Translate`; in-app follow-ups through `Automation` | slice kinds | C semantics |
150
+ | F5 | External facts enter through `Translate`; in-app follow-ups through separate `Automation` slices. Keep a capture in Translate, move reactions to its local appends out (PLAY0694 for directionless/unrouted co-location, including child/nested appends; PLAY0616 for explicit inbound). PLAY0694 is a warning that fails `--warnaserror`, with no automatic split | slice kinds, capture appends and reaction triggers | C semantics |
151
151
  | F6 | No cycle where fact A's reaction needs fact B and B's needs A, or two features each wait on the other | reactions, MCP `dependencies` | D (redesign the boundary) |
152
152
  | F7 | Each slice's consumed events and their producing slices are known; a slice calls another's command only through `invokes` | reactions, `reads` | Q |
153
153
  | F8 | Every Automation has a pending-work view (a todo list: membership is the pending work), or a written reason a direct effect needs none (immediate, internal, cannot fail). A "simple relay" is not exempt from the question | reactions, `reads`, views | D |
@@ -8,7 +8,8 @@ About ten minutes, before the independent review.
8
8
  4. Every read-model field has an origin; every event has a consumer or terminal reason.
9
9
  5. Every command has a reachable, authorized origin (screen or form action, or a reaction to an event, clock or application trigger; a capture appends facts and a command after it is reached through a reaction).
10
10
  6. No gated command is invoked by a reaction without a recorded trusted-path decision.
11
- 7. State-dependent rules are `reads` + `require ... message` marked NOT enforced; no
11
+ 7. State-dependent rules use admitted protected command reads plus `require`, or
12
+ record the legacy/refused shape and target gap; no
12
13
  caller-supplied state, attestation boolean (`confirmsX == true`) or handler/hint prose.
13
14
  8. Coverage matrix filled; every `n/a` has a domain reason.
14
15
  9. Persona text says what each role cannot do, each line backed by a gate and a `then denied`
@@ -37,8 +37,9 @@ needs; a "no" is a finding only when it has a business consequence.
37
37
 
38
38
  ## For each slice and the model as a whole
39
39
  1. Does each slice depend on other slices only through event contracts, `invokes` and explicitly
40
- recorded cross-slice `reads` of another slice's view (F7)? A `reads` is unprotected (a
41
- stored-state rule over it stays not enforced) and couples the slice to that view's interface:
40
+ recorded cross-slice `reads` of another slice's view (F7)? Check protected-command
41
+ opt-in/admission and absence/conflict cases separately from target realization;
42
+ legacy and trigger reads remain unprotected. The view interface is a dependency:
42
43
  check that it is recorded, not implied.
43
44
  2. Could two people work on two slices at the same time without reading each other's
44
45
  declarations, given only the events' fields (A8)?
@@ -11,7 +11,7 @@ instruction for the work, not background reading. Skills that restate one cite i
11
11
  6. **Keep semantic identity independent of names, paths, layout and generated symbols.** Commit the identity catalog with the model.
12
12
  7. **Keep unsupported intent visible.** Return a precise gap and its owning issue; never weaken the model so rendering passes.
13
13
  8. **Write specifications with intent, including rejection and denial.** Never report an unexecuted or unsupported scenario as passed.
14
- 9. **Treat state reads as a correctness boundary.** Do not claim protection until the opted-in contract and the target support exist.
14
+ 9. **Treat state reads as a correctness boundary.** Eligible command reads opt into `command reads protected` (v25); legacy/trigger reads remain unprotected. Stage refuses protected reads (STAGE-ESM-044), not the v25 pair: reference absence/conflict guarantees and verified target realization are different claims.
15
15
  10. **Separate event-source identity from event payload and choose destinations explicitly.**
16
16
  11. **Persisted event shape changes are evolution, never cleanup.** Keep historical generations.
17
17
  12. **Model external work as business intent.** Provider interfaces and transport mechanics stay out of the language.
@@ -21,7 +21,7 @@ speaks in them; never model board mechanics (lanes, node ids, positions).
21
21
  | Storyline (ordered beats) | a **family** of specifications sharing example data, each one transition (no storyline syntax) | several spec classes | specifications |
22
22
  | Field validation | concept `validate` (every use) / command `validate`, `require` | `ConceptValidator<T>` / `CommandValidator<T>` | command validation |
23
23
  | Role permission ("Cannot") | `policy` + `authorize` + `then denied` spec; ownership via `claim ... matches subject` | `[Authorize(Policy)]`, generated policies | authorization |
24
- | Precondition on stream state | `reads` + `require` as stated intent, not enforced (target: Arc `[ProtectedDecision]` + `DecisionRead<T>`, or Chronicle DCB; APIs available to gap-fill in the Arc and Chronicle the Stage scaffold pins, not emitted protection) | decision over a guarded read | command validation |
24
+ | Precondition on stream state | `command reads protected` + eligible `reads`/`require` (v25 reference protection); legacy/refused reads remain stated intent. Stage refuses protected reads (STAGE-ESM-044); target Arc `[ProtectedDecision]` + `DecisionRead<T>` or Chronicle DCB needs separate verification | decision over a guarded read | command validation |
25
25
  | Generated id (`derived:uuid4()`) | `generated` (authorable, not executable) | id supplied before `Handle()` | commands |
26
26
  | External system / outbound call | `Translate` slice (inbound); `system`/`operation` (authorable, not executable) or Automation (outbound) | `ICommandOperation` / reactor | operations, reactors |
27
27
  | HTML mockup | `screen` Level 1 + board (`visualize-model`) | default Scene composition | ui composition |
@@ -263,9 +263,8 @@ choosing a whole action list rather than one labeled command, use block-form
263
263
  **Inside out:** the slice, then the enclosing feature, then the module, then the
264
264
  document. The innermost match wins.
265
265
 
266
- That rule exists because a generated document cannot make every name unique — one
267
- real application declares 76 queries under 37 distinct names, with `All` appearing
268
- 21 times. Two sibling slices can each declare `All`, and each screen gets its own.
266
+ Sibling slices may each declare `All`; each screen resolves its own query.
267
+ Read `references/named-keys.md` when query scope affects identity inference.
269
268
 
270
269
  Reach across slices by qualifying with **any trailing part** of the scope.
271
270
  Excerpt: `Queue` and `Deviations` are sibling slices that each declare `All`.
@@ -100,7 +100,9 @@ Composite read-model keys, query `by` blocks and fixtures
100
100
  over those views remain authoring-only: binding reports PLAY0268 citing
101
101
  Screenplay#599 (still open). They do not reference-execute or render. This is not
102
102
  ESM v10 admission; v10 covers reaction identity, production routes and observer
103
- filters. Command reads independently remain unprotected/unadmitted (PLAY0271).
103
+ filters. Eligible command reads separately opt into v25 with `command reads protected`;
104
+ legacy reads remain PLAY0271, and composite keys are still refused (PLAY0781 ByParts).
105
+ See command-surface [protected reads](../../cratis-screenplay-command-surface/references/protected-reads.md).
104
106
  A single explicit key does bind; Stage admission still depends on the complete
105
107
  model and projection/query shape, not just the key modifier.
106
108
 
@@ -32,6 +32,12 @@ Tool versions are covered in `cratis-screenplay-toolchain` `SKILL.md`; read it b
32
32
  (the user); Stage internals and the sandbox (`cratis-stage-rendering-and-sandbox`); judging
33
33
  hand-written code against its slice (`cratis-application-slice-conformance`).
34
34
 
35
+ ## Language modes that block target delivery
36
+
37
+ Read [language admission](../cratis-screenplay-toolchain/references/language-admission.md)
38
+ for v22–v25: Stage refuses atomic batches, described bodies (even Stub mode) and
39
+ protected reads. Preserve contracts; reference success is not target realization.
40
+
35
41
  ## Interview phase
36
42
  **Skip if** the request names the model root, the application name, the destination and the
37
43
  decision on non-renderable scope. Otherwise ask only what is missing:
@@ -143,9 +149,8 @@ Adapters and non-renderable scope follow the contract rules of `cratis-applicati
143
149
  the Arc/Chronicle set in `cratis-stage-rendering-and-sandbox` `references/rendered-application.md`; API availability alone is not verified enforcement.
144
150
  - Adapters that call outside systems follow `cratis-engineering-effect-boundaries`; slice
145
151
  specifications follow `cratis-application-slice-specifications`.
146
- - Realization notes are the explicit realization requirements stated in a slice `description` or `documentation`
147
- (definition: `cratis-application-slice-conformance`, `references/contract-and-precedence.md`).
148
- Executable parts (specifications, mappings, constraints) win over prose, and a contradicting description is a model defect to report.
152
+ - Read conformance's `references/contract-and-precedence.md` for realization-note
153
+ authority. Executable contract wins over prose; report contradictions.
149
154
 
150
155
  ## Rules
151
156
 
@@ -105,6 +105,14 @@ stable array or list. The Stage scaffold pins an older Arc, so raise the version
105
105
  `Customizations/Dependencies.props` only after a restore and build proves it. Never split the
106
106
  reaction or drop an effect to dodge rendering.
107
107
 
108
+ Preserve declared `reaction batches atomic` boundaries: each trigger occurrence's
109
+ direct productions and each selected refusal branch are separate batches, with
110
+ invoked commands independent. Stage refuses v22 (STAGE-ESM-016) and atomic mode
111
+ in admitted v23–v25 (STAGE-ESM-043); the declaration is not external-effect deduplication.
112
+ For described handlers, hand off only payload computation under the v23 result
113
+ contract; Stage STAGE-IMPL-002 means no stubs, even Stub mode. Protected v25 reads
114
+ refuse STAGE-ESM-044 despite version admission and need target admission/enrollment tests; ordinary injection never supplies protection.
115
+
108
116
  ## Re-delivery
109
117
  The work list is the full in-scope contract delta since the fallback record's last verified source
110
118
  identity (specifications, rules, mappings, realization notes), then the whole contract is
@@ -14,8 +14,10 @@ probe reports and choosing what to do. Do not copy the code table here.
14
14
  2. Execution planning builds the plan and can emit `PLAN-*` diagnostics before Stage runs.
15
15
  3. Stage plans the target and admits or rejects each member: `STAGE-ESM-0xx`; profile and path
16
16
  problems `STAGE-CRATIS-0xx`. An evolved event is reported with Stage's own `STAGE-ESM-026`
17
- (still refused); the CLI adds nothing. Stage admits exact ESM v1–v17 and v19 pairs, not v18/v20; CLI admission remains bounded by its bundled renderer and
18
- refuses each construct it does not render with its own code (see Stage's current code table, including `-024`, `-027`, `-028`, `-030` to `-041`).
17
+ (still refused); the CLI adds nothing. Read the owning Stage admission table and
18
+ toolchain `references/renderable-subset.md` for exact pairs and version minimums;
19
+ CLI admission remains bounded by its bundled renderer. Each unsupported construct
20
+ has its own code; version admission is not construct support.
19
21
  4. Any error in the selected scope publishes nothing: the run ends with exit 5 and the diagnostics.
20
22
  Without `--scope` the scope is the whole application. With `--scope`, `PLAN-*` problems in
21
23
  unselected slices are warnings and `STAGE-ESM-*` refusals in unselected slices do not block;
@@ -28,8 +30,8 @@ ESM). Only the probe answers renderability. `PLAY0270` entries are information,
28
30
 
29
31
  | Class | Meaning | Typical examples (each verified in `admission.md`) | Action |
30
32
  | --- | --- | --- | --- |
31
- | **Model fix (in mode)** | the model is in, or the user chose, renderable mode and breaks its own subset in a way that has a renderable equivalent with the same meaning | a `produces` whose `for` is not the command identifier; one `StateChange` slice with two commands (`STAGE-ESM-004`); two projections for one read model (`-007`); a policy Stage cannot express portably (`-015`; role-only and opaque pure policies render) | edit request to the modeler session with address, change and rationale |
32
- | **Capability gap** | the intended meaning needs a construct Stage does not render yet | a snapshot list query (`-010`; observable lists and keyed or unkeyed lists bind and observable lists render), DateTime equality filters and required parameters after optional filters (`-010`); context/single-result filters, opaque `scoped to`/`performer` and composite `by` remain PLAY0268; Translate, clocks, captures, non-event triggers and opaque reaction bodies (`-024`); claim-reading/opaque `runs as` gates (`-034`), legacy `from` (`-035`), mixed effects in one handler (`-037`, retries can duplicate events; keep it whole), unsupported reaction mappings (`-039`); unsupported generated types/result combinations (`-028`/`-038`); `then no readmodel` (`-027`); evolved events (`STAGE-ESM-026`); conditional `produces when` (`-006`); `reads` (`PLAY0271`); code validation (`-005`); protected identities/enums (`-040`), non-text secrets (`-041`) or unadmitted explicit subject lineage (`PLAY0268`); a command `handler` (`PLAY0268`) | keep the model; fallback record entry; options a to c in `SKILL.md`; link the Stage issue |
33
+ | **Model fix (in mode)** | the model is in, or the user chose, renderable mode and breaks its own subset in a way that has a renderable equivalent with the same meaning | a `produces` whose `for` is not the command identifier; two projections for one read model (`-007`); a policy Stage cannot express portably (`-015`; role-only and opaque pure policies render) | edit request to the modeler session with address, change and rationale |
34
+ | **Capability gap** | the intended meaning needs a construct Stage does not render yet | DateTime equality filters and required parameters after optional filters (`-010`); context/single-result filters, opaque `scoped to`/`performer` and composite `by` remain PLAY0268; Translate, clocks, captures, non-event triggers and opaque reaction bodies (`-024`); claim-reading/opaque `runs as` gates (`-034`), legacy `from` (`-035`), mixed effects in one handler (`-037`, retries can duplicate events; keep it whole), unsupported reaction mappings (`-039`); unsupported generated types/result combinations (`-028`/`-038`); `then no readmodel` (`-027`); evolved events (`STAGE-ESM-026`); unsupported expression/enum production conditions (`-006`; supported conditional productions render); legacy reads (`PLAY0271`), protected reads (STAGE-ESM-044 despite v25 admission); code validation (`-005`); protected identities/enums (`-040`) or unadmitted explicit subject lineage (`PLAY0268`); attached command handlers (PLAY0268), described handlers (v23, STAGE-IMPL-002 even Stub mode), atomic mode (STAGE-ESM-016 for v22, STAGE-ESM-043 in admitted v23–v25) | keep the model; fallback record entry; options a to c in `SKILL.md`; link the Stage issue |
33
35
  | **Tool skew** | the bundled compiler disagrees with documented semantics | the false `PLAY0285` on reaction cascades from an older bundle; codes the standalone compiler does not raise | record in the session state and the fallback record; never "fix" a correct model |
34
36
  | **Environment** | not the model | restore failures, missing SDK, a destination that is not writable | fix the environment or report blocked |
35
37