@cratis/pi 7.33.0 → 7.34.1

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 (160) hide show
  1. package/package/corpus/agents/screenplay-modeler.md +1 -1
  2. package/package/corpus/agents/screenplay-renderer.md +1 -1
  3. package/package/corpus/agents/screenplay-reviewer.md +1 -1
  4. package/package/corpus/agents/slice-implementer.md +1 -1
  5. package/package/corpus/rules/profiles.md +1 -0
  6. package/package/corpus/skills/cratis-application-slice-conformance/LICENSE +2 -2
  7. package/package/corpus/skills/cratis-application-slice-conformance/SKILL.md +5 -0
  8. package/package/corpus/skills/cratis-application-slice-conformance/references/checklists.md +12 -0
  9. package/package/corpus/skills/cratis-application-slice-conformance/references/provenance.md +3 -4
  10. package/package/corpus/skills/cratis-application-slice-specifications/LICENSE +2 -2
  11. package/package/corpus/skills/cratis-application-slice-specifications/references/provenance.md +2 -3
  12. package/package/corpus/skills/cratis-arc-react-page/LICENSE +2 -2
  13. package/package/corpus/skills/cratis-arc-react-page/references/provenance.md +2 -3
  14. package/package/corpus/skills/cratis-chronicle-event-modeling/SKILL.md +12 -6
  15. package/package/corpus/skills/cratis-chronicle-reactor/LICENSE +2 -2
  16. package/package/corpus/skills/cratis-chronicle-reactor/SKILL.md +5 -2
  17. package/package/corpus/skills/cratis-chronicle-reactor/references/provenance.md +3 -3
  18. package/package/corpus/skills/cratis-chronicle-reactor/references/slice-delivery-checklist.md +93 -0
  19. package/package/corpus/skills/cratis-chronicle-read-model-specifications/LICENSE +2 -2
  20. package/package/corpus/skills/cratis-chronicle-read-model-specifications/SKILL.md +1 -1
  21. package/package/corpus/skills/cratis-chronicle-read-model-specifications/references/provenance.md +3 -3
  22. package/package/corpus/skills/cratis-chronicle-read-model-specifications/references/view-lifecycle-checks.md +79 -0
  23. package/package/corpus/skills/cratis-event-model-diagram/LICENSE +7 -0
  24. package/package/corpus/skills/cratis-event-model-diagram/SKILL.md +26 -2
  25. package/package/corpus/skills/cratis-event-model-diagram/references/provenance.md +19 -0
  26. package/package/corpus/skills/cratis-screenplay-automations-and-translations/LICENSE +2 -2
  27. package/package/corpus/skills/cratis-screenplay-automations-and-translations/SKILL.md +14 -9
  28. package/package/corpus/skills/cratis-screenplay-automations-and-translations/references/automation-patterns.md +5 -5
  29. package/package/corpus/skills/cratis-screenplay-automations-and-translations/references/effects-and-idempotency.md +1 -1
  30. package/package/corpus/skills/cratis-screenplay-automations-and-translations/references/provenance.md +2 -3
  31. package/package/corpus/skills/cratis-screenplay-automations-and-translations/references/public-events-and-direction.md +1 -2
  32. package/package/corpus/skills/cratis-screenplay-automations-and-translations/references/realization-and-gap-fill.md +9 -5
  33. package/package/corpus/skills/cratis-screenplay-automations-and-translations/references/todo-list-example.md +6 -6
  34. package/package/corpus/skills/cratis-screenplay-automations-and-translations/references/translate-example.md +1 -1
  35. package/package/corpus/skills/cratis-screenplay-captures-and-reactions/SKILL.md +14 -13
  36. package/package/corpus/skills/cratis-screenplay-command-surface/SKILL.md +12 -13
  37. package/package/corpus/skills/cratis-screenplay-command-surface/references/compliance.md +3 -1
  38. package/package/corpus/skills/cratis-screenplay-command-surface/references/generated-values-and-responses.md +2 -2
  39. package/package/corpus/skills/cratis-screenplay-command-surface/references/validate-rules.md +4 -2
  40. package/package/corpus/skills/cratis-screenplay-delivery-planning/LICENSE +9 -0
  41. package/package/corpus/skills/cratis-screenplay-delivery-planning/SKILL.md +118 -0
  42. package/package/corpus/skills/cratis-screenplay-delivery-planning/references/parallel-delivery.md +45 -0
  43. package/package/corpus/skills/cratis-screenplay-delivery-planning/references/provenance.md +29 -0
  44. package/package/corpus/skills/cratis-screenplay-delivery-planning/references/slice-counting.md +43 -0
  45. package/package/corpus/skills/cratis-screenplay-delivery-planning/references/velocity-and-capacity.md +48 -0
  46. package/package/corpus/skills/cratis-screenplay-delivery-planning/verification.json +16 -0
  47. package/package/corpus/skills/cratis-screenplay-discovery/LICENSE +2 -2
  48. package/package/corpus/skills/cratis-screenplay-discovery/SKILL.md +6 -5
  49. package/package/corpus/skills/cratis-screenplay-discovery/references/divergent-sweep.md +1 -0
  50. package/package/corpus/skills/cratis-screenplay-discovery/references/domain-analysis-template.md +92 -0
  51. package/package/corpus/skills/cratis-screenplay-discovery/references/personas-and-causes.md +2 -2
  52. package/package/corpus/skills/cratis-screenplay-discovery/references/provenance.md +4 -3
  53. package/package/corpus/skills/cratis-screenplay-discovery/verification.json +1 -1
  54. package/package/corpus/skills/cratis-screenplay-event-modeling/LICENSE +2 -2
  55. package/package/corpus/skills/cratis-screenplay-event-modeling/SKILL.md +28 -28
  56. package/package/corpus/skills/cratis-screenplay-event-modeling/references/nine-steps.md +7 -5
  57. package/package/corpus/skills/cratis-screenplay-event-modeling/references/parsed-not-runnable.md +12 -9
  58. package/package/corpus/skills/cratis-screenplay-event-modeling/references/provenance.md +2 -3
  59. package/package/corpus/skills/cratis-screenplay-legacy-extraction/LICENSE +2 -2
  60. package/package/corpus/skills/cratis-screenplay-legacy-extraction/SKILL.md +26 -13
  61. package/package/corpus/skills/cratis-screenplay-legacy-extraction/references/candidate-inventory.md +6 -1
  62. package/package/corpus/skills/cratis-screenplay-legacy-extraction/references/generate-notes.md +7 -0
  63. package/package/corpus/skills/cratis-screenplay-legacy-extraction/references/prologue-safety.md +22 -17
  64. package/package/corpus/skills/cratis-screenplay-legacy-extraction/references/provenance.md +2 -3
  65. package/package/corpus/skills/cratis-screenplay-legacy-extraction/references/rule-modeling.md +2 -2
  66. package/package/corpus/skills/cratis-screenplay-legacy-extraction/references/side-car-migration.md +1 -0
  67. package/package/corpus/skills/cratis-screenplay-legacy-extraction/verification.json +1 -1
  68. package/package/corpus/skills/cratis-screenplay-model-authoring/references/language-reference.md +2 -2
  69. package/package/corpus/skills/cratis-screenplay-model-authoring/references/mcp-loop.md +3 -3
  70. package/package/corpus/skills/cratis-screenplay-model-authoring/references/mcp-tools.md +3 -1
  71. package/package/corpus/skills/cratis-screenplay-model-review/LICENSE +2 -2
  72. package/package/corpus/skills/cratis-screenplay-model-review/SKILL.md +8 -8
  73. package/package/corpus/skills/cratis-screenplay-model-review/references/anti-patterns.md +2 -2
  74. package/package/corpus/skills/cratis-screenplay-model-review/references/checklist.md +4 -4
  75. package/package/corpus/skills/cratis-screenplay-model-review/references/model-inventory-report.md +75 -0
  76. package/package/corpus/skills/cratis-screenplay-model-review/references/provenance.md +3 -4
  77. package/package/corpus/skills/cratis-screenplay-model-review/references/public-keys-and-routes.md +1 -1
  78. package/package/corpus/skills/cratis-screenplay-model-review/references/worked-example.md +4 -3
  79. package/package/corpus/skills/cratis-screenplay-modeling-lifecycle/LICENSE +2 -2
  80. package/package/corpus/skills/cratis-screenplay-modeling-lifecycle/SKILL.md +7 -5
  81. package/package/corpus/skills/cratis-screenplay-modeling-lifecycle/references/core-rules-digest.md +131 -0
  82. package/package/corpus/skills/cratis-screenplay-modeling-lifecycle/references/phases.md +1 -1
  83. package/package/corpus/skills/cratis-screenplay-modeling-lifecycle/references/provenance.md +25 -4
  84. package/package/corpus/skills/cratis-screenplay-modeling-lifecycle/references/reasoning-notes.md +2 -2
  85. package/package/corpus/skills/cratis-screenplay-modeling-lifecycle/references/verdicts-and-modes.md +1 -1
  86. package/package/corpus/skills/cratis-screenplay-modeling-lifecycle/references/vocabulary-map.md +5 -4
  87. package/package/corpus/skills/cratis-screenplay-projections/SKILL.md +9 -5
  88. package/package/corpus/skills/cratis-screenplay-projections/references/pdl-grammar.md +4 -2
  89. package/package/corpus/skills/cratis-screenplay-read-surface/LICENSE +7 -0
  90. package/package/corpus/skills/cratis-screenplay-read-surface/SKILL.md +16 -8
  91. package/package/corpus/skills/cratis-screenplay-read-surface/references/provenance.md +21 -0
  92. package/package/corpus/skills/cratis-screenplay-read-surface/references/screen-patterns.md +130 -0
  93. package/package/corpus/skills/cratis-screenplay-read-surface/verification.json +1 -1
  94. package/package/corpus/skills/cratis-screenplay-render-and-gap-fill/LICENSE +2 -2
  95. package/package/corpus/skills/cratis-screenplay-render-and-gap-fill/SKILL.md +58 -46
  96. package/package/corpus/skills/cratis-screenplay-render-and-gap-fill/references/delivery-protocol.md +17 -2
  97. package/package/corpus/skills/cratis-screenplay-render-and-gap-fill/references/drift-and-ledger.md +19 -2
  98. package/package/corpus/skills/cratis-screenplay-render-and-gap-fill/references/gap-fill-handoff.md +22 -4
  99. package/package/corpus/skills/cratis-screenplay-render-and-gap-fill/references/provenance.md +2 -3
  100. package/package/corpus/skills/cratis-screenplay-render-and-gap-fill/references/renderability-gate.md +21 -16
  101. package/package/corpus/skills/cratis-screenplay-render-and-gap-fill/references/worked-example.md +34 -29
  102. package/package/corpus/skills/cratis-screenplay-scenario-coverage/LICENSE +2 -2
  103. package/package/corpus/skills/cratis-screenplay-scenario-coverage/SKILL.md +5 -4
  104. package/package/corpus/skills/cratis-screenplay-scenario-coverage/references/berth-reservations.md +1 -1
  105. package/package/corpus/skills/cratis-screenplay-scenario-coverage/references/invoicing-dues-design.md +5 -4
  106. package/package/corpus/skills/cratis-screenplay-scenario-coverage/references/invoicing-dues-example.md +32 -3
  107. package/package/corpus/skills/cratis-screenplay-scenario-coverage/references/provenance.md +3 -4
  108. package/package/corpus/skills/cratis-screenplay-scenario-coverage/references/scenario-catalogue.md +7 -6
  109. package/package/corpus/skills/cratis-screenplay-scenario-coverage/references/scenario-examples.md +3 -3
  110. package/package/corpus/skills/cratis-screenplay-scenario-coverage/references/scenario-workshop.md +15 -7
  111. package/package/corpus/skills/cratis-screenplay-scenario-coverage/references/spec-forms-by-mode.md +8 -7
  112. package/package/corpus/skills/cratis-screenplay-scenario-coverage/references/view-and-story-specs.md +6 -4
  113. package/package/corpus/skills/cratis-screenplay-slice-design/LICENSE +2 -2
  114. package/package/corpus/skills/cratis-screenplay-slice-design/SKILL.md +4 -3
  115. package/package/corpus/skills/cratis-screenplay-slice-design/references/command-inventory.md +2 -2
  116. package/package/corpus/skills/cratis-screenplay-slice-design/references/derived-condition-events.md +68 -0
  117. package/package/corpus/skills/cratis-screenplay-slice-design/references/field-lineage.md +1 -1
  118. package/package/corpus/skills/cratis-screenplay-slice-design/references/provenance.md +5 -5
  119. package/package/corpus/skills/cratis-screenplay-slice-design/references/read-model-design.md +17 -0
  120. package/package/corpus/skills/cratis-screenplay-slice-design/references/rule-layers.md +6 -6
  121. package/package/corpus/skills/cratis-screenplay-slice-design/references/worked-example.md +3 -3
  122. package/package/corpus/skills/cratis-screenplay-specifications/SKILL.md +6 -4
  123. package/package/corpus/skills/cratis-screenplay-specifications/references/examples-and-routes.md +2 -1
  124. package/package/corpus/skills/cratis-screenplay-specifications/references/generated-fixtures.md +3 -2
  125. package/package/corpus/skills/cratis-screenplay-specifications/references/persona-callers-and-cases.md +3 -0
  126. package/package/corpus/skills/cratis-screenplay-specifications/references/reactions-and-cascades.md +3 -2
  127. package/package/corpus/skills/cratis-screenplay-streams-and-consistency/LICENSE +2 -2
  128. package/package/corpus/skills/cratis-screenplay-streams-and-consistency/SKILL.md +9 -9
  129. package/package/corpus/skills/cratis-screenplay-streams-and-consistency/references/boundaries.md +31 -3
  130. package/package/corpus/skills/cratis-screenplay-streams-and-consistency/references/chronicle-boundaries.md +6 -6
  131. package/package/corpus/skills/cratis-screenplay-streams-and-consistency/references/consistency-and-concurrency.md +12 -11
  132. package/package/corpus/skills/cratis-screenplay-streams-and-consistency/references/evolution.md +1 -1
  133. package/package/corpus/skills/cratis-screenplay-streams-and-consistency/references/provenance.md +4 -4
  134. package/package/corpus/skills/cratis-screenplay-streams-and-consistency/references/streams-example.md +1 -1
  135. package/package/corpus/skills/cratis-screenplay-toolchain/LICENSE +2 -2
  136. package/package/corpus/skills/cratis-screenplay-toolchain/SKILL.md +14 -12
  137. package/package/corpus/skills/cratis-screenplay-toolchain/references/cheat-sheet-example.md +3 -3
  138. package/package/corpus/skills/cratis-screenplay-toolchain/references/cheat-sheet.md +1 -1
  139. package/package/corpus/skills/cratis-screenplay-toolchain/references/doc-contradictions.md +3 -1
  140. package/package/corpus/skills/cratis-screenplay-toolchain/references/executable-subset.md +24 -16
  141. package/package/corpus/skills/cratis-screenplay-toolchain/references/provenance.md +2 -3
  142. package/package/corpus/skills/cratis-screenplay-toolchain/references/renderable-subset.md +41 -12
  143. package/package/corpus/skills/cratis-screenplay-toolchain/references/traps.md +5 -5
  144. package/package/corpus/skills/cratis-screenplay-toolchain/references/verdicts.md +14 -9
  145. package/package/corpus/skills/cratis-screenplay-toolchain/references/versions.md +9 -3
  146. package/package/corpus/skills/cratis-screenplay-toolchain/verification.json +4 -1
  147. package/package/corpus/skills/cratis-screenplay-ui-composition/LICENSE +2 -2
  148. package/package/corpus/skills/cratis-screenplay-ui-composition/SKILL.md +10 -10
  149. package/package/corpus/skills/cratis-screenplay-ui-composition/references/flow-review.md +1 -1
  150. package/package/corpus/skills/cratis-screenplay-ui-composition/references/provenance.md +2 -3
  151. package/package/corpus/skills/cratis-screenplay-ui-composition/references/screen-composition-contract.md +39 -14
  152. package/package/corpus/skills/cratis-screenplay-ui-composition/references/worked-flow.md +17 -9
  153. package/package/corpus/skills/cratis-stage-rendering-and-sandbox/SKILL.md +83 -74
  154. package/package/corpus/skills/cratis-stage-rendering-and-sandbox/references/admission.md +62 -12
  155. package/package/corpus/skills/cratis-stage-rendering-and-sandbox/references/render-example.md +3 -1
  156. package/package/corpus/skills/cratis-stage-rendering-and-sandbox/references/rendered-application.md +30 -15
  157. package/package/corpus/skills/cratis-stage-rendering-and-sandbox/references/sandbox-and-specrunner.md +21 -1
  158. package/package/corpus/skills/cratis-stage-rendering-and-sandbox/verification.json +8 -3
  159. package/package/profile-catalog.json +1 -0
  160. package/package.json +1 -1
@@ -37,6 +37,9 @@ denial still uses `then denied`; a visitor persona is not an anonymous caller.
37
37
 
38
38
  ## Case tables
39
39
 
40
+ Two diagnostics to know: `PLAY0588` (warning) for a declared parameter no step references, and `PLAY0585`
41
+ (error) when an optional parameter feeds a required target.
42
+
40
43
  Use tables for validation matrices whose steps stay the same. Rows are **cases**,
41
44
  not examples: `example` means a named typed fixture. This complete model's five
42
45
  expanded specifications pass in the 4.127.0 reference runner:
@@ -53,8 +53,9 @@ module Collections
53
53
  - A reached reaction with a code body (`file` or inline) returns unsupported, as
54
54
  does a reaction that never settles. The reference stops at 1,000 new facts per
55
55
  scenario and 10,000 due occurrences per clock advance.
56
- - A model that uses these forms selects ESM v6 (`schemaVersion: 6`). Stage 4.24.2
57
- admits ESM v1-v4 and renders no `Automation` or `Translate` slice, so the whole
56
+ - A model that uses these forms selects ESM v6 (`schemaVersion: 6`). Stage 4.73.1
57
+ admits ESM v1-v10 by version but renders no `Automation` or `Translate` slice and no reaction
58
+ (`STAGE-ESM-024`; `-034` runsAs, `-035` filters, `-037` mixed effects), so the whole
58
59
  automation is gap-fill against this contract: `cratis-screenplay-render-and-gap-fill`.
59
60
 
60
61
  ### Version skew: cascades and the false `PLAY0285` (cratis before 3.28.2)
@@ -34,5 +34,5 @@ SOFTWARE.
34
34
 
35
35
  This skill also adapts material from agentic-engineer by Martin Dilger and Nebulit GmbH
36
36
  (https://github.com/Nebulit-GmbH/agentic-engineer, commit 07b0f30648d663cb588d7e2c7aa031af9dfc21f2;
37
- https://nebulit.de), used with the agreement of Martin Dilger and Nebulit GmbH. That repository
38
- carries no licence file; the adapted material remains credited to Martin Dilger and Nebulit GmbH.
37
+ https://nebulit.de), used with the explicit consent of Martin Dilger and Nebulit GmbH. The adapted
38
+ material remains credited to Martin Dilger and Nebulit GmbH.
@@ -12,7 +12,7 @@ which it only records, and what a retry, a race or a replay does. Grammar lives
12
12
  skills; this skill owns the decisions. The `.play` model is the source of truth: a rule that
13
13
  lives only in code, or only in a description, is a finding, not a solution.
14
14
 
15
- **First append into a scope (Chronicle v19.32.0, version-qualified).** The default optimistic
15
+ **First append into a scope (Chronicle v19.50.0, version-qualified).** The default optimistic
16
16
  strategy compares the scope's tail sequence number. When nothing matches the scope yet (the
17
17
  first event on a new event source, or the first event of a new source type, stream type or
18
18
  stream id), there is no tail and the append is **not checked**: two writers opening the same
@@ -28,17 +28,17 @@ Require target evidence that the check ran: a concurrent first-append scenario a
28
28
  Chronicle, asserting one append wins, one is rejected, and `IAppendResult.ConcurrencyCheckPerformed`
29
29
  is `true` (a skipped check and a passing one look identical otherwise; a current client against
30
30
  an older kernel always reads `false`). This was source- and documentation-inspected, not
31
- concurrency-tested here. The historically checked Stage 4.51.3 scaffold pins Chronicle client/kernel 19.32.0
32
- and Arc 22.50.5; the APIs exist for gap-fill, not as automatically rendered enforcement.
31
+ concurrency-tested here. The Stage scaffold pins Chronicle client/kernel and Arc releases (see `cratis-stage-rendering-and-sandbox` `references/rendered-application.md`;
32
+ the CLI bundle's Chronicle is in `cratis-screenplay-toolchain` `references/versions.md`); the APIs exist for gap-fill, not as automatically rendered enforcement.
33
33
 
34
34
  ## Verified product sources
35
35
 
36
36
  | Product | Pin | Used for |
37
37
  | --- | --- | --- |
38
38
  | Screenplay | v4.68.0 (`79801bf`) | ESM v7 generated values (`generated identifier`, decision 0026) and decision 0025's numbering; the diagnostics below were read at v4.66.0 (`c89198b`): `identifier`, `for`, constraints, generations, `id` pins, diagnostics PLAY0019/0135/0268/0271/0273/0391-0393/0446-0449/0469/0471 |
39
- | Chronicle | v19.32.0 (`f17a2ff`) | CHR0012, CHR0034; open defects #3744, #4123, #4131 |
40
- | Arc | v22.50.5 | `[ProtectedDecision]` and `DecisionRead<T>` (since v22.39.0) |
41
- | Stage (historical source check) | v4.51.3 | rendered apps pin Arc 22.50.5 and Chronicle client/kernel 19.32.0; protected-read APIs available to gap-fill. Historical 4.24.2 admission probe: ESM v4, evolved events refused with `STAGE-ESM-026` |
39
+ | Chronicle | v19.50.0 (read; first read at v19.32.0 `f17a2ff`) | CHR0012, CHR0034; open defects #3744, #4123, #4131 (still open) |
40
+ | Arc | v22.72.0 | `[ProtectedDecision]` and `DecisionRead<T>` (since v22.39.0) |
41
+ | Stage | v4.73.1 | rendered apps pin the Arc and Chronicle client/kernel listed in the Stage skill's `references/rendered-application.md`; protected-read APIs available to gap-fill. Historical 4.24.2 admission probe: ESM v4, evolved events refused with `STAGE-ESM-026` |
42
42
 
43
43
  Full pin table: `references/versions.md` in `cratis-screenplay-toolchain`. Re-check the three
44
44
  Chronicle issues before relying on a constraint in a later release.
@@ -90,7 +90,7 @@ option, mark it `ASSUMED` in the slice or module `documentation` and in the sess
90
90
  command/specification routes bind and reference-execute as ESM v8 on 4.125.0.
91
91
  The pinned CLI (toolchain `references/versions.md`) reaches Stage construct checks through v10; keep the routing
92
92
  contract when target admission requires gap-fill. Forms/boundaries:
93
- toolchain `references/sources-and-streams.md`. A `generated identifier` (ESM v7, standalone 4.68.0; not rendered by Stage yet) is
93
+ toolchain `references/sources-and-streams.md`. A `generated identifier` (ESM v7, standalone 4.68.0 and later; Stage 4.73.1 refuses it, STAGE-ESM-028) is
94
94
  generated fresh on every acceptance: it is not a retry identity, and generated values give no
95
95
  idempotency, retry or deduplication guarantee. When a retry must find the same stream, the caller
96
96
  supplies the identifier before the first attempt.
@@ -166,10 +166,10 @@ option, mark it `ASSUMED` in the slice or module `documentation` and in the sess
166
166
  complete named mappings and canonical comparison, not guessed legacy splits.
167
167
  Stored key-schema changes require a new stream identity or migration; see
168
168
  toolchain `references/sources-and-streams.md`.
169
- - Chronicle (open at v19.32.0): the SQL and InMemory providers do not settle unique claims
169
+ - Chronicle (open at v19.50.0): the SQL and InMemory providers do not settle unique claims
170
170
  (#3744); index updates run after commit and may fail silently (#4123); composite values can
171
171
  collide on the separator (#4131). A declared constraint is a declaration, not a runtime test.
172
- - `[ProtectedDecision]` is available in Arc v22.39.0 or later, including Stage 4.51.3's
172
+ - `[ProtectedDecision]` is available in Arc v22.39.0 or later, including Stage 4.73.1's
173
173
  rendered package set. It is not emitted protection: gap-fill must enroll an admitted
174
174
  decision read, or redesign the stream/identity when the shape is refused
175
175
  (`references/consistency-and-concurrency.md`, section 3).
@@ -3,6 +3,7 @@
3
3
  ## Contents
4
4
 
5
5
  - Establish the boundary, not an organizational formula
6
+ - Ownership by design (optional lens)
6
7
  - Ownership interview
7
8
  - Ownership and interface inventory
8
9
  - Cross-boundary walkthrough
@@ -29,6 +30,28 @@ decision visible in the session `STATE.md`; never report independence as establi
29
30
  splitting a boundary revisit every invariant that needs information from both sides: an event
30
31
  exchange does not make that decision atomic.
31
32
 
33
+ ## Ownership by design (optional lens)
34
+ Conway's observation is that systems come to mirror the teams that build them. Use it as a
35
+ deliberate lens when you shape boundaries, not as a law: decide the ownership you want and let the
36
+ boundaries follow it, instead of discovering later that the org chart set them.
37
+
38
+ - When one team will own a boundary end to end, treat the module as that team's system: it owns
39
+ its commands, the events it produces, the read models it maintains and the systems it calls.
40
+ Other teams interact only through its public events and its capture contracts, so each side can
41
+ be built, scaled and released on its own, coordinating through events rather than meetings.
42
+ - A system this process integrates with is, by definition, owned by someone else. Record that
43
+ owner next to the public fact or capture contract; it is the person you ask before changing it.
44
+ - Treat "team = system" as a hypothesis to test with the interview answers, not as a default. One
45
+ team may own several modules, a module may be shared during a transition, and a team boundary
46
+ does not make a decision atomic across it (see above). Write down which the model follows.
47
+
48
+ **Indirect producers.** When a fact reaches a receiver through an intermediate boundary (the
49
+ booking system's `BerthBooked` drives billing, whose `StayInvoiceDue` then reaches the harbour
50
+ office), attribute each public event to the boundary that decides it, and name the original
51
+ producer in the consumer's description as the indirect source. Ownership of the public contract
52
+ stays with the boundary that decides the fact; the indirect source tells a reader whom a change
53
+ upstream will surprise.
54
+
32
55
  ## Ownership interview
33
56
  Run it when ownership, autonomy or integration decisions are missing; skip it when the user or
34
57
  the model already states all three. Ask one question at a time, offer the options, and follow
@@ -136,14 +159,19 @@ integration support.
136
159
  internal step.
137
160
  - Treat a public event like a published API: evolution follows `evolution.md` with the
138
161
  consumers named, and breaking changes become new events.
139
- - Screenplay has no public/internal marker. Record the classification in the event's
140
- `documentation`, and keep the list in `STATE.md`.
162
+ - Events are private by default. Mark a public contract with `public event X` (ESM v9, released in
163
+ Screenplay 4.117.0); declare a foreign public event's shape locally with `event X from "store"`.
164
+ A command never produces a public event (PLAY0607/0613); crossing the boundary is a `Translate`
165
+ slice with an explicit direction (`cratis-screenplay-automations-and-translations`
166
+ `references/public-events-and-direction.md`). Nothing checks that the foreign shape matches the
167
+ other store, so also name the consumers in the event's `documentation` and keep the list in
168
+ `STATE.md`. Stage 4.73.1 refuses public events (`STAGE-ESM-032`).
141
169
 
142
170
  ## Crossing a boundary in Screenplay
143
171
  | Situation | Construct |
144
172
  |---|---|
145
173
  | another module in the same application | reference the event by name (cross-module resolution works within one application) |
146
- | another bounded context's contract | unquoted `import Context.Event` (foreign contract; does not bind on either compiler, PLAY0268; see `versions.md` in `cratis-screenplay-toolchain`) |
174
+ | another bounded context's contract | `event X from "store"` (shape declared locally, ESM v9); an unquoted `import Context.Event` or `import Q.X from "store"` has no local shape and stays PLAY0268 (see `versions.md` in `cratis-screenplay-toolchain`) |
147
175
  | my own files | quoted `import "glob"` |
148
176
  | outside data entering | `Translate` slice: `capture`, or a translator `reaction` over an imported event (`cratis-screenplay-automations-and-translations`) |
149
177
  | our fact another context needs | a public summary event; the other side translates it into its own language |
@@ -5,16 +5,16 @@ target facts; the `.play` model declares only part of them (`versions.md` in
5
5
  `cratis-screenplay-toolchain`).
6
6
 
7
7
  ## Pins
8
- Chronicle **v19.32.0** (`f17a2ff`): CHR0012 (nullable event properties) and CHR0034 (PII on an
9
- event-source id) are present. Three runtime defects are **open at v19.32.0**: #3744 (SQL and
8
+ Chronicle **v19.50.0** (first read at v19.32.0 `f17a2ff`): CHR0012 (nullable event properties) and CHR0034 (PII on an
9
+ event-source id) are present. Three runtime defects are **open at v19.50.0**: #3744 (SQL and
10
10
  InMemory providers do not settle unique claims), #4123 (constraint index updates run after commit
11
11
  and fail silently) and #4131 (composite unique constraints collide when a component contains the
12
- separator). Arc **v22.50.5** has `[ProtectedDecision]` (since v22.39.0, needs Chronicle 19.23 or
13
- later); Stage 4.51.3 rendered apps pin Arc 22.50.5 and Chronicle client/kernel
14
- 19.32.0, so the APIs are available to gap-fill, not automatically emitted or
12
+ separator). Arc **v22.72.0** has `[ProtectedDecision]` (since v22.39.0, needs Chronicle 19.23 or
13
+ later); Stage-rendered apps pin an Arc and Chronicle client/kernel release
14
+ (see the Stage skill's `references/rendered-application.md`) that include them, so the APIs are available to gap-fill, not automatically emitted or
15
15
  protected (see `consistency-and-concurrency.md` section 3). Re-check the issues before relying on a
16
16
  constraint in a new release.
17
- A concurrency scope's first append is unchecked by default at v19.32.0; see
17
+ A concurrency scope's first append is unchecked by default at v19.50.0 (the default is planned to become checked in the next major, `Documentation/events/concurrency.mdx`); see
18
18
  SKILL.md, ‘First append into a scope’.
19
19
 
20
20
  ## Identity, routing and claims
@@ -64,7 +64,7 @@ observed legacy check from verified atomic protection.
64
64
  Never accept the caller's copy of the state: `currentStatus Status` on the command with
65
65
  `require currentStatus == "approved"` protects nothing, and neither does a boolean attestation
66
66
  input (`confirmsX == true`) standing in for the rule. Never move the rule into `handler` or
67
- `implementation hint` prose; a description is not rendered (Stage#178), so prose alone leaves
67
+ `implementation hint` prose; a description renders only as an XML doc comment (Stage#178), so prose alone leaves
68
68
  the rule unenforced in rendered scope.
69
69
 
70
70
  Right: write the rule as stated intent and mark it unenforced.
@@ -74,7 +74,7 @@ Right: write the rule as stated intent and mark it unenforced.
74
74
  - Slice `description`: one short marker per rule, `NOT enforced in the model today; target: <mechanism>`.
75
75
  - Slice fenced `documentation`, one block per rule:
76
76
  - Requirement: the business rule in business words.
77
- - Status: NOT enforced in the model today (Screenplay#129, #209).
77
+ - Status: NOT enforced in the model today (Screenplay#129).
78
78
  - Decision inputs: the authoritative facts or state.
79
79
  - Missing guarantee: why the construct does not protect the decision.
80
80
  - Race consequence: what two individually plausible commands could jointly violate.
@@ -106,11 +106,11 @@ empty or `$eventSourceId`). Reducers, joins, children, nested sources and **even
106
106
  routing** (fan-in from many streams by a payload reference) are refused, and a concurrency scope
107
107
  on the referenced source does not see appends made on other sources. A rule over such a view, for
108
108
  example a course capacity computed from enrolment streams, needs option a or b: write the
109
- deciding fact on the source that owns the state, or give each scarce item its own identity. Sources: Arc `v22.50.5:Documentation/backend/csharp/chronicle/read-models/injecting-into-commands.md`;
109
+ deciding fact on the source that owns the state, or give each scarce item its own identity. Sources: Arc `v22.72.0:Documentation/backend/csharp/chronicle/read-models/injecting-into-commands.md` (limits unchanged since v22.50.5);
110
110
  `chronicle-boundaries.md`.
111
111
 
112
- **Availability in Stage-rendered applications.** Stage v4.51.3 scaffolds Arc 22.50.5
113
- and Chronicle client/kernel 19.32.0. `[ProtectedDecision]` and `DecisionRead<T>` /
112
+ **Availability in Stage-rendered applications.** The Stage scaffold pins Arc and Chronicle client/kernel
113
+ releases (not the latest). `[ProtectedDecision]` and `DecisionRead<T>` /
114
114
  `IDecisionReads` exist in that package set; source checks are in
115
115
  `cratis-stage-rendering-and-sandbox` `references/rendered-application.md`.
116
116
  This does not mean Stage emits protected decisions. Gap-fill must opt into the
@@ -119,7 +119,7 @@ read in the active unit of work. For refused shapes choose option a/b (state on
119
119
  its owning stream or one identity per scarce item), or agreed compensation c.
120
120
  Keep the rule **NOT enforced in the model today** with its race consequence.
121
121
  Never infer protection from `.play` `reads` + `require`, weaken the rule to render,
122
- or edit managed dependency files. Older Stage 4.24.x scaffolds predate these APIs.
122
+ or edit managed dependency files. Older Stage 4.24.x scaffolds predate these APIs. Arc 22.72.0 and Chronicle 19.50.0 are the latest releases; the scaffold does not move with them.
123
123
 
124
124
  ## 4. Concurrency scenarios
125
125
  For each enforced or recorded rule write three short scenarios:
@@ -185,11 +185,12 @@ behaviour. Write the answer in the slice `documentation`.
185
185
  date views and rules use. Constraints and reactions still see record order.
186
186
 
187
187
  ## 10. Specification limits (no local spec engine)
188
- - A spec can show a source re-claiming its own value and a `unique event` violation. Whether
189
- it can show a collision between two different sources is contested in the docs:
190
- `constraints.md` says not yet, `specifications.md` says `for` on `given` events allows it. Treat
191
- such a spec as parsed (V1), not proven; spec outcomes come only from a reference run (V4) or
192
- rendered tests. See `cratis-screenplay-scenario-coverage`.
188
+ - A spec can show a source re-claiming its own value, a `unique event` violation and a collision
189
+ between two different sources: `for` on `given` events (ESM v2) establishes a claim on one source
190
+ and attempts the same value on another (`specifications.md`; `streams-example.md` uses it). It is a
191
+ sequential history, not a race proof. The `constraints.md` sentence that it "cannot yet show a
192
+ collision between two event sources" is stale (`cratis-screenplay-toolchain` `references/doc-contradictions.md`).
193
+ Spec outcomes come only from a reference run (V4) or rendered tests. See `cratis-screenplay-scenario-coverage`.
193
194
  - Constraint violation messages are fixed strings: copy them exactly into `then error`.
194
195
  - For every value constraint write a competing-claim spec (one source owns the value, a
195
196
  different source attempts it) using `when <Command>` with the earlier fact as `given`.
@@ -77,7 +77,7 @@ Procedure and ownership: the identity procedure in `cratis-screenplay-modeling-l
77
77
  owning session, or a brief that asks for the rename, applies it; a subagent without MCP returns
78
78
  the catalog-changing request to the owner; never leave a requested change silently unapplied).
79
79
  - Several generations select ESM v4; that binds executably on both tools (compiled
80
- with `evolution-example.md`). Stage 4.24.2 admits v4 but refuses any evolved event and its
80
+ with `evolution-example.md`). Stage (still, at 4.73.1) admits v4 but refuses any evolved event and its
81
81
  dependent scope with `STAGE-ESM-026` (it cannot render event-type migrations yet, Stage#204,
82
82
  which depends on Screenplay#71), and its runtime still refuses evolved events: the evolved
83
83
  events are gap-fill, with migrations hand-written per `cratis-chronicle-event-type-migration`.
@@ -11,11 +11,10 @@
11
11
 
12
12
  Event Modeling practice is by Adam Dymitruk and Martin Dilger, cited as practice; no text taken.
13
13
 
14
- ## Adapted closely (Martin Dilger and Nebulit GmbH, with agreement)
14
+ ## Adapted closely (Martin Dilger and Nebulit GmbH)
15
15
 
16
16
  Source: https://github.com/Nebulit-GmbH/agentic-engineer at commit `07b0f30648d663cb588d7e2c7aa031af9dfc21f2`,
17
- by Martin Dilger and Nebulit GmbH (https://nebulit.de). The repository carries no licence file; this material
18
- is adapted with the agreement of Martin Dilger and Nebulit GmbH.
17
+ by Martin Dilger and Nebulit GmbH (https://nebulit.de), used with the explicit consent of Martin Dilger and Nebulit GmbH.
19
18
 
20
19
  | Source file | Used in | How |
21
20
  |---|---|---|
@@ -23,5 +22,6 @@ is adapted with the agreement of Martin Dilger and Nebulit GmbH.
23
22
  | `.claude/skills/eventmodeling-optimizing-stream-design`, patterns reference: decision tree, red flags 2-4, composite and collection and log patterns | `references/stream-patterns.md` "Boundary decision tree", "Red flags", "Boundary patterns by domain" | adapted closely, restored from #493; red flag 1 ("no natural end") dropped because it contradicts long-lived identities; event-granularity tip dropped (generic update events are a defect here) |
24
23
  | `.claude/skills/eventmodeling-optimizing-stream-design`, domain-patterns reference: per-domain identity entries | `references/stream-patterns.md` "Boundary patterns by domain" | translated to invoicing, marina, memberships, enrolment and hire; lifetimes and archival splits dropped |
25
24
  | `.claude/skills/eventmodeling-applying-conways-law/SKILL.md`: interview questions with follow-up triggers, six-step ownership workflow, quality checklist | `references/boundaries.md` "Ownership interview", "Ownership and interface inventory", "Responsibility matrix and ownership timeline", "Boundary checklist" | adapted closely; "team = system" absolutes deliberately not adopted, kept "not by law" |
26
- | `.claude/skills/eventmodeling-applying-conways-law`, examples reference: responsibility matrix, swimlane timeline, inter-system communication | `references/boundaries.md` "Responsibility matrix and ownership timeline", "Worked walkthrough" | translated to marina and invoicing; Martin Dilger and Nebulit GmbH's indirect-producer attribution not copied |
25
+ | `.claude/skills/eventmodeling-applying-conways-law`, examples reference: responsibility matrix, swimlane timeline, inter-system communication | `references/boundaries.md` "Responsibility matrix and ownership timeline", "Worked walkthrough" | translated to marina and invoicing (see the next row for the indirect-producer attribution) |
27
26
  | `.claude/skills/eventmodeling-core-rules/SKILL.md`: immutability, calculated-event anti-pattern, causality, open question versus decided failure, "left chair" fan-out, offline-first | `references/stream-patterns.md` "Core rules that bear on stream design", `SKILL.md` modeling defaults | adapted closely, translated to Screenplay constructs; board lanes, linked copies and role catalog not adopted here (other skills own them) |
27
+ | `.claude/skills/eventmodeling-applying-conways-law/SKILL.md`, examples reference: team and system boundary as one, indirect-producer attribution | `references/boundaries.md` "Ownership by design (optional lens)" | Adapted closely as an optional lens with the "team = system" claim kept as a hypothesis to test; indirect-producer attribution adopted for public events, with ownership staying with the deciding boundary |
@@ -164,7 +164,7 @@ module Courses
164
164
  then denied
165
165
 
166
166
  slice StateChange EnrolMember
167
- description "Atomic here: one active enrolment per member and course (composite unique constraint, released by withdrawal), and one MemberEnrolled per enrolment stream, so a retry with the same enrolment id after a lost reply cannot enrol twice (the composite constraint alone lets a source re-claim its own value). NOT enforced in the model today: 'enrolments never exceed the course capacity'. The rule depends on other streams' state: `reads` is PLAY0271 and `require` over a view is PLAY0268 at binding (Screenplay#129/#209). The enrolment-to-course fan-in cannot be protected as modeled (see the CourseAvailability slice): concurrent enrolments can overbook. Target enforcement is an open decision (consistency-and-concurrency.md section 3); the model stays as stated intent, recorded in STATE.md."
167
+ description "Atomic here: one active enrolment per member and course (composite unique constraint, released by withdrawal), and one MemberEnrolled per enrolment stream, so a retry with the same enrolment id after a lost reply cannot enrol twice (the composite constraint alone lets a source re-claim its own value). NOT enforced in the model today: 'enrolments never exceed the course capacity'. The rule depends on other streams' state: `reads` is PLAY0271 and `require` over a view is PLAY0268 at binding (Screenplay#129). The enrolment-to-course fan-in cannot be protected as modeled (see the CourseAvailability slice): concurrent enrolments can overbook. Target enforcement is an open decision (consistency-and-concurrency.md section 3); the model stays as stated intent, recorded in STATE.md."
168
168
  command EnrolMember
169
169
  enrolmentId EnrolmentId identifier
170
170
  courseId CourseId
@@ -5,5 +5,5 @@ Third-party notices
5
5
 
6
6
  This skill adapts material from agentic-engineer by Martin Dilger and Nebulit GmbH
7
7
  (https://github.com/Nebulit-GmbH/agentic-engineer, commit 07b0f30648d663cb588d7e2c7aa031af9dfc21f2;
8
- https://nebulit.de), used with the agreement of Martin Dilger and Nebulit GmbH. That repository
9
- carries no licence file; the adapted material remains credited to Martin Dilger and Nebulit GmbH.
8
+ https://nebulit.de), used with the explicit consent of Martin Dilger and Nebulit GmbH. The adapted
9
+ material remains credited to Martin Dilger and Nebulit GmbH.
@@ -43,7 +43,8 @@ or Screenplay 4.139.0.
43
43
  PLAY0029 (a misspelt keyword or a `type` inside a slice) drops a construct silently.
44
44
  3. **Pick the compiler deliberately and name it.** Standalone `screenplay` for
45
45
  current language checks and reference specifications; `cratis` for rendering
46
- and generation. Bundled and standalone versions differ. Report both tool and
46
+ and generation. Bundled and standalone versions differ (CLI 3.53.1 bundles 4.137.0;
47
+ the standalone pin is 4.139.0). Report both tool and
47
48
  version, rather than transferring a verdict across releases.
48
49
  4. **Know the mode** (design, executable, renderable) and write from its subset.
49
50
  5. **Capability is not correctness.** The tool you ran decides what is accepted today; the
@@ -64,7 +65,7 @@ or Screenplay 4.139.0.
64
65
  | | Standalone `screenplay` | `cratis screenplay ...` |
65
66
  | --- | --- | --- |
66
67
  | Check root | `screenplay <root> --warnaserror --no-color` | `cratis screenplay validate <root> --warnings-as-errors -o json-compact` |
67
- | Scope/checks | `--scope <address>`, `--check <names>`; a scoped pass is not whole-application success | Discover installed validation options |
68
+ | Scope/checks | `--scope <address>`, `--check <names>`; a scoped pass is not whole-application success | `validate --executable` (bundled binder, no write), `--check <names>`, `--scope`; `render --scope`/`--check`; `cratis screenplay conform` |
68
69
  | Reference execution | `screenplay test <root>` or MCP `run-specifications` | Discover bundled MCP capability; target tests are not V4 |
69
70
  | MCP | `screenplay mcp <root>`; discover schemas | `cratis screenplay mcp [root]`; registered by `cratis ai install` |
70
71
  | Render version boundary | Binder admission is not Stage admission | Pinned CLI (`versions.md`) passes through ESM v10 to Stage construct admission; bound newer models: `CLI-RENDER-004` |
@@ -85,12 +86,12 @@ Independent results, not a ladder. Read `references/verdicts.md` for the command
85
86
  | V4 | reference specifications run | `screenplay test` or MCP `run-specifications`; unsupported/unbound is not a pass; rendered Debug tests are V5.tests, never V4 |
86
87
  | V5 | rendered and target-verified | `cratis render`, then Debug build and tests; report admission, publication, build and tests separately |
87
88
 
88
- V2 and V3 need MCP: send `initialize`, then `notifications/initialized`, and start the
89
+ V2 and V3 need MCP (V3 alone can also be read from `cratis screenplay validate --executable <root>`, labeled as the bundled compiler): send `initialize`, then `notifications/initialized`, and start the
89
90
  server with a fixed root when the tool is older than 4.63.2 (the roots bug hit 4.63.1 and the
90
91
  4.60.1 bundled by cratis before 3.28.2; 4.66.0 and later and cratis 3.28.2 are fine). A subagent without MCP reports "V2 not run: no MCP in this agent".
91
92
 
92
- One line per verdict, tool first, for example `V1 pass (screenplay 4.68.0, 3 files)` and
93
- `V3 blocked: PLAY0268 x3 (list query, pii)`. Name the source identity (commit plus the digest from
93
+ One line per verdict, tool first, for example `V1 pass (screenplay 4.139.0, 3 files)` and
94
+ `V3 blocked: PLAY0268 x3 (filter query, pii)`. Name the source identity (commit plus the digest from
94
95
  the source-identity helper (`cratis-screenplay-modeling-lifecycle` `references/verdicts-and-modes.md` "Source identity")) the verdict ran on; keep it apart from the MCP
95
96
  `modelRevision`, which is semantic and, without `.screenplay/identities.json`,
96
97
  changes with the root folder name.
@@ -99,15 +100,16 @@ changes with the root folder name.
99
100
 
100
101
  - **Design**: every construct family parses; use it to model first. Compiled shapes:
101
102
  `references/cheat-sheet.md`. Read [references/cheat-sheet-example.md](references/cheat-sheet-example.md) when you need one complete design-mode document with every construct family.
102
- - **Executable** (binds, V3): `references/executable-subset.md`. Keyed optional queries
103
- only; no handler (PLAY0268, with or without `implementation`/`hint`); `reads` and
103
+ - **Executable** (binds, V3): `references/executable-subset.md`. Optional keyed lookups, unfiltered
104
+ lists and lists narrowed by one `by` key (observable too); `filter`, `scoped to`, `performer` and composite `by` do not bind; no handler (PLAY0268, with or without `implementation`/`hint`); `reads` and
104
105
  `concurrency` do not bind (PLAY0271); no compliance markers (`pii`/`secret`); v6 constructs bind on Screenplay 4.61 or
105
106
  later (standalone, and cratis 3.28.2 or later); generated values and `returns` responses bind (ESM v7)
106
107
  from Screenplay 4.68.0 (also in the current CLI bundle) (`references/generated-responses-example.md`). Read [references/executable-example.md](references/executable-example.md) when you need a small StateChange and StateView model that binds executable, [references/pdl-example.md](references/pdl-example.md) when writing projection forms that bind and run, and [references/automation-translate-example.md](references/automation-translate-example.md) when writing Automation and Translate slices (ESM v6).
107
- - **Renderable** (V5): `references/renderable-subset.md` retains explicitly labeled
108
- older Stage probes. Current CLI admits v7 to planning, but its v7 corpus gets
109
- Stage generated-value/response refusals `STAGE-ESM-028`/`029`, not a blanket
110
- compiler refusal. Run admission before claiming a particular model renders.
108
+ - **Renderable** (V5): `references/renderable-subset.md` has the current Stage 4.73.1 table and
109
+ explicitly labeled older probes. The CLI admits through v10 to Stage construct checks; generated
110
+ values and responses get `STAGE-ESM-028`/`029`, not a blanket compiler refusal. Run admission
111
+ before claiming a particular model renders (`cratis render --scope` for an admitted part, `--check`
112
+ for no-write planning).
111
113
  - **Event sources, streams and routes** bind as ESM v8 at 4.125.0.
112
114
  The pinned CLI/Stage pair (`references/versions.md`) reaches admission through v10, not blanket
113
115
  rendering. Operations and exact numeric source mode remain unadmitted.
@@ -183,7 +185,7 @@ Read [references/diagnostics.md](references/diagnostics.md) when a PLAY, STAGE o
183
185
  11. Declare an event once, in its producing slice.
184
186
  12. Quoted `import "glob"` is your own files; unquoted `import Ctx.Event` is a foreign
185
187
  contract and does not bind.
186
- 13. A handler never binds; `numbers exact` never binds; descriptions are never rendered.
188
+ 13. A handler never binds; `numbers exact` never binds; descriptions render only as XML doc comments, never as behavior.
187
189
 
188
190
  ## Gate
189
191
 
@@ -2,7 +2,7 @@
2
2
 
3
3
  One complete document with every construct family. Design mode, not executable. Prose rules: [cheat-sheet.md](cheat-sheet.md); tool versions: [versions.md](versions.md); what binds: [executable-subset.md](executable-subset.md).
4
4
 
5
- Binding blockers: unquoted import, `pii`, `reads` (PLAY0271), `starts with`, observable/list/filter query. Executable shapes are in the sibling examples. The bare-marker fence compiles warning-free on standalone 4.127.0; the earlier legacy-marker version compiled on 4.66.0 and CLI 3.28.2. `RecordingAPayment` lists the `InvoiceClosed` cascade, which the cratis 3.27.1 bundle (4.60.1) rejected with a false PLAY0285 ("outcome cannot be produced by 'RecordPayment'"); 3.28.2 accepts it.
5
+ Binding blockers: unquoted import, `pii`, `reads` (PLAY0271), `starts with`, a `filter` query (lists and observable lists bind). Executable shapes are in the sibling examples. The bare-marker fence compiles warning-free on standalone 4.127.0; the earlier legacy-marker version compiled on 4.66.0 and CLI 3.28.2. `RecordingAPayment` lists the `InvoiceClosed` cascade, which the cratis 3.27.1 bundle (4.60.1) rejected with a false PLAY0285 ("outcome cannot be produced by 'RecordPayment'"); 3.28.2 accepts it.
6
6
 
7
7
  ```screenplay test=unbound
8
8
  // Design-mode cheat-sheet: every construct family; compiles warning-free on the standalone tool.
@@ -153,9 +153,9 @@ module Billing
153
153
  readmodel InvoiceRow
154
154
  invoiceId InvoiceId
155
155
  number String
156
- query InvoiceById => InvoiceRow optional // keyed: the only executable query shape
156
+ query InvoiceById => InvoiceRow optional // keyed optional lookup (unfiltered lists bind too)
157
157
  by invoiceId InvoiceId
158
- query ListInvoices => observable InvoiceRow[] // design mode only (PLAY0268 at binding)
158
+ query ListInvoices => observable InvoiceRow[] // design mode only: the `filter` below is PLAY0268 at binding
159
159
  filter number String optional
160
160
  projection InvoiceList => InvoiceRow
161
161
  from InvoiceRegistered
@@ -87,7 +87,7 @@ remain unadmitted. Compile and test each relevant fixture with the chosen tool.
87
87
  generated identifier` (PLAY0484); legacy `?` is PLAY0479 (information).
88
88
  - Ownership policies: `require claim "ownerId" matches subject` (subject = command identifier
89
89
  or keyed query argument) or `matches <commandProperty>`; executable; renderable only for
90
- text-backed targets (Uuid-backed: STAGE-ESM-015).
90
+ text-backed targets at the 4.24-era Stage; Stage 4.73.1 also renders Uuid and Date claim targets (see `renderable-subset.md`; unsupported subjects: STAGE-ESM-015).
91
91
 
92
92
  ## Exact numeric source mode
93
93
 
@@ -55,8 +55,10 @@ read from source or documentation.
55
55
  | 27 | decision index | `decisions/README.md` row 0020 shows stage `none` while v5 is implemented | the code: v5 `then no readmodel` binds |
56
56
  | 28 | `visualize-model` kind | the tool filters on the kind "Reactor" (`McpVisualization.cs:21`) although the construct is a Reaction; its added/removed summary never counts reactions (Screenplay#379, open) | the model, not the summary |
57
57
  | 29 | bodied reducers in Stage | cli `Documentation/reference/screenplay.md:38` says bodied reducers are unsupported (STAGE-ESM-019) | Stage 4.24 code admits pure allowlisted reducer bodies (`PureTransitionAdmission.cs`); trust the code |
58
- | 30 | `cratis screenplay validate <file>` | the command reads as a document validator | file mode ignores the file's imports and reports false unknown-name warnings (cli#244, open): validate the folder [probed] |
58
+ | 30 | `cratis screenplay validate <file>` | the command reads as a document validator | file mode ignored the file's imports and reported false unknown-name warnings on CLI 3.28.2 (cli#244, closed by PR #258: later releases compile the file with its imports); validate the folder anyway [probed on 3.28.2] |
59
59
  | 31 | cli false PLAY0285 | `D/diagnostics.md:640` defines PLAY0285 as a contradiction against every possible producer | cratis before 3.28.2 reported it falsely on reaction cascades (cli#242); not reproduced on cratis 3.28.2 [probed] |
60
+ | 32 | competing-claim specification | `D/constraints.md` says a specification "cannot yet show a collision between two event sources" | `D/specifications.md`: `for` on `given` events establishes a claim on one source and attempts the same value on another; the specification page and the tool decide (checked at v4.139.0) |
61
+ | 33 | descriptions in rendered code | Stage `Documentation/reference/render-plans.md` says the cratis CLI does not yet call `WithAuthoringMetadata` | the CLI calls it since 3.51.0 (`CratisRenderTarget.cs`): descriptions and documentation render as XML doc comments; `CLI-RENDER-006` when skipped (checked at cli v3.53.1) |
60
62
 
61
63
  Rows 0 to 12, 14 to 21 and 23 were re-read at the v4.66.0 line numbers above; rows 14, 15,
62
64
  19, 20 and 23 are properties of the language rather than documentation defects and were
@@ -5,7 +5,7 @@
5
5
  - Caller and compliance boundary (4.127.0)
6
6
  - Admitted on both compilers
7
7
  - Admitted from Screenplay 4.61 (ESM v6): standalone tool and cratis 3.28.2 or later
8
- - Generated values and responses (ESM v7): standalone 4.68.0 or later only
8
+ - Generated values and responses (ESM v7): standalone 4.68.0 or later; the cratis 3.53.1 bundle binds them too
9
9
  - Released public boundaries and observer routes
10
10
  - Code attachments (what binds, what never does)
11
11
  - Refused (code, reason): fix, or record as a mode gap
@@ -15,25 +15,30 @@
15
15
  Current pins: `versions.md`. Detailed
16
16
  4.66.0/4.68.0 binder probes below retain their historical labels. Current source
17
17
  admits routes as ESM v8, public/direction constructs as v9, identity/overrides/filters
18
- as v10 and qualifying non-route Double literals as v11. Operations,
19
- `numbers exact` source mode and reaction refusals/redelivery remain unadmitted. Use the actual
18
+ as v10, qualifying non-route Double literals as v11 (exact lowering of Double-mode literals)
19
+ and non-positional enum numbers as v12. Operations, the `numbers exact` **source mode** (PLAY0268) and
20
+ reaction refusals/redelivery remain unadmitted. Use the actual
20
21
  binder before promoting an older probe to a current capability claim.
21
22
 
22
23
  What the binder admits, and what it refuses with which code. The answer depends on the
23
- compiler version: standalone Screenplay 4.68.0 admits ESM v1 to v7; the 4.66.0 compiler bundled in
24
- cratis 3.28.2 and 3.28.3 admits v1 to v6; the 4.60.1 compiler bundled in cratis before 3.28.2 admits v1 to v5.
24
+ compiler version: the standalone tool (4.139.0) binds through v12; the compiler bundled in cratis
25
+ 3.53.1 (4.137.0) binds ESM through v10 for rendering and refuses non-positional enum numbers at
26
+ binding; older bundles (4.66.0 in cratis 3.28.x, admitting v1 to v6; 4.60.1 before 3.28.2, v1 to v5)
27
+ are history.
25
28
  Tool facts and the exact v6 messages: `versions.md`. Always name
26
29
  the tool with a V2 or V3 result. When tool and documentation disagree, the tool decides
27
30
  current capability; the documentation and the domain decide intended correctness. Record
28
31
  the gap, never strip the model to pass.
29
32
 
30
- Binding is observed only through MCP (`read-workspace view=executable-diagnostics`) or a
31
- render. `screenplay <folder>` and `cratis screenplay validate` never bind (`verdicts.md`).
33
+ Binding is observed through MCP (`read-workspace view=executable-diagnostics`), a render, or
34
+ `cratis screenplay validate --executable <root>` (bundled compiler; binding errors only, writes
35
+ nothing; exit 5 when it does not bind). `screenplay <folder>` and plain `cratis screenplay validate`
36
+ never bind (`verdicts.md`).
32
37
 
33
38
  Complete examples that bind live in `executable-example.md` (both compilers),
34
39
  `pdl-example.md` (projections, both compilers) and `automation-translate-example.md`
35
40
  (ESM v6; standalone tool and cratis 3.28.2 or later) and `generated-responses-example.md`
36
- (ESM v7; standalone tool 4.68.0 or later only).
41
+ (ESM v7; standalone tool 4.68.0 or later, and the cratis 3.53.1 bundle).
37
42
 
38
43
  ## Caller and compliance boundary (4.127.0)
39
44
 
@@ -106,13 +111,15 @@ Authority: v4.127.0 `context.md`, `identity.md`, `concepts.md`, `events.md`, `pu
106
111
  - Command specifications that list reaction cascades (no false PLAY0285).
107
112
  - In a `then` list after `when append`, only what followed the appended event.
108
113
 
109
- ## Generated values and responses (ESM v7): standalone 4.68.0 or later only
114
+ ## Generated values and responses (ESM v7): standalone 4.68.0 or later; the cratis 3.53.1 bundle binds them too
110
115
 
111
116
  Facts read at `v4.68.0`: decision 0026 and `Documentation/screenplay/{commands,specifications,interoperability}.md`.
112
117
  A model selects ESM v7 only when it uses a generated property, a response, a generated fixture or a `then returns`
113
118
  expectation; every other model keeps its version, bytes and revision. The cratis CLI 3.28.3 (bundled 4.66.0)
114
- reports `PLAY0268` for these constructs, and Stage 4.24.2 refuses ESM v7 with `STAGE-ESM-016` (tracked in
115
- Stage#201), so they bind and run but are not rendered: gap-fill with the model as contract. Complete example:
119
+ reported `PLAY0268` for these constructs (history). The current CLI (3.53.1, bundled 4.137.0) binds them
120
+ and reaches Stage planning, where Stage 4.73.1 refuses generated values with `STAGE-ESM-028` and
121
+ responses with `STAGE-ESM-029` (Stage#175), so they bind and run but are not rendered: gap-fill with the
122
+ model as contract. Complete example:
116
123
  `generated-responses-example.md`.
117
124
 
118
125
  - A generated property is command-only, required, scalar and a concept backed by `Uuid`; bare `Uuid`, optional and collection
@@ -187,8 +194,9 @@ bodies still leave their owner non-executable.
187
194
  `require`/`validate` bodies (`v4.66.0:Documentation/screenplay/commands.md`, `context.md`).
188
195
  - A handler therefore makes the slice non-executable and non-renderable: it is gap-fill
189
196
  with the model as the contract.
190
- - Stage 4.24 admits only pure reducer bodies (Roslyn allowlist, STAGE-ESM-019 and 022);
191
- code validation (STAGE-ESM-005) and opaque policies (STAGE-ESM-015) are refused.
197
+ - Stage admits only pure reducer bodies (Roslyn allowlist, STAGE-ESM-019 and 022);
198
+ code validation is refused (STAGE-ESM-005). Opaque pure policies render at Stage 4.73.1 (4.24
199
+ refused them with STAGE-ESM-015).
192
200
  - The reference runner returns Unsupported for the opaque bodies that do bind (rule and
193
201
  policy predicates, code validation, reducer transitions); a specification that needs one
194
202
  never passes. Handlers, file constraints and query performers (and reaction effects on a trigger with
@@ -202,8 +210,8 @@ bodies still leave their owner non-executable.
202
210
  | `Automation` or `Translate` slice, `reaction`, `capture`, `trigger`; `given clock`, `when clock`, `when trigger`, `when capture` | PLAY0268 | **cratis before 3.28.2 bundles only** (4.60.1); messages in `versions.md` |
203
211
  | Unquoted `import Other.Contract` | PLAY0268 | external contract import is not bound |
204
212
  | `pii` or `secret` on any concept (also alias/legacy markers) | PLAY0268 | Compliance requires portable data-subject semantics; scopes/qualifiers do not admit it. Secret provider mapping is `[Encrypted]` + `[NotAudited]`, not a bind/render claim |
205
- | `query` returning a collection (`RM[]`), or without exactly one caller-supplied scalar `by` | PLAY0268 | Historical 4.135.0 source check: composite `by` blocks remain unadmitted (#599); optional scalar snapshot lookup binds |
206
- | `observable`, `filter`, `scoped to`, `performer` queries | PLAY0268 | "uses delivery, filtering, scope, or implementation behavior outside the first ESM v1 vertical." `observable` goes in the return position (`=> observable RM optional`); as a body line it is PLAY0048 |
213
+ | `query` with a composite `by` block, or `by ... from` context-derived arguments | PLAY0268 | composite `by` blocks remain unadmitted (#599). An optional scalar snapshot lookup, an unfiltered list (`RM[]`) and a list narrowed by one caller-supplied `by` key bind, in their `observable` form too (since 4.105.0) |
214
+ | `filter`, `scoped to`, `performer` queries | PLAY0268 | "uses delivery, filtering, scope, or implementation behavior outside the first ESM v1 vertical." `observable` is not the blocker: it goes in the return position (`=> observable RM[]`); as a body line it is PLAY0048 |
207
215
  | `contains` or `starts with` in conditions | PLAY0268 | equality and numeric ordering only |
208
216
  | Date or DateTime comparison, `today` | PLAY0268 | no runtime date value |
209
217
  | Rule on a nested path (`lines.qty all > 0`) | PLAY0268 | put the rule on the nested value's concept |
@@ -222,7 +230,7 @@ bodies still leave their owner non-executable.
222
230
  | `$eventContext.occurred.Week` | PLAY0273 | derived value |
223
231
  | Projection `parent p` where `p` is not on the child event | PLAY0273 | "Event property not found" |
224
232
  | `generated` or `returns` on a compiler before 4.68.0 (4.66.0 and 4.67.0 refuse; 4.66.0 is bundled in cratis 3.28.x) | PLAY0268 | admitted from standalone 4.68.0 (ESM v7), see above |
225
- | Operations or systems, `numbers exact`, reaction refusals/redelivery | PLAY0268 | not admitted by any supported ESM version; one such construct leaves the **whole** application without an executable model. Event sources/streams/routes instead bind as ESM v8 on the current compiler (`sources-and-streams.md`) |
233
+ | Operations or systems, `numbers exact` source mode, reaction refusals/redelivery | PLAY0268 | not admitted by any supported ESM version; one such construct leaves the **whole** application without an executable model. Event sources/streams/routes instead bind as ESM v8 on the current compiler (`sources-and-streams.md`) |
226
234
  | Spec of a gated command or query without `given caller` | PLAY0389 | module and feature gates count |
227
235
  | `given` or `then readmodel` missing key parts | PLAY0351 | explicit `key` marks replace inference; composite fixtures need every part but remain unadmitted (#599) |
228
236
  | When-less spec asserting events or errors | PLAY0352 | |
@@ -14,11 +14,10 @@ the file that holds it.
14
14
  | --- | --- | --- |
15
15
  | TrogonStack/agentskills `7b249d3ee42d8b7e11fa564141ebd5fbc37aadf1` (MIT, Copyright (c) 2025 Straw Hat, LLC) | none: no passage of this skill is adapted from it | no third-party notice needed in `LICENSE` |
16
16
 
17
- ## Adapted closely (Martin Dilger and Nebulit GmbH, with agreement)
17
+ ## Adapted closely (Martin Dilger and Nebulit GmbH)
18
18
 
19
19
  Source: https://github.com/Nebulit-GmbH/agentic-engineer at commit `07b0f30648d663cb588d7e2c7aa031af9dfc21f2`,
20
- by Martin Dilger and Nebulit GmbH (https://nebulit.de). The repository carries no licence file; this material
21
- is adapted with the agreement of Martin Dilger and Nebulit GmbH.
20
+ by Martin Dilger and Nebulit GmbH (https://nebulit.de), used with the explicit consent of Martin Dilger and Nebulit GmbH.
22
21
 
23
22
  | Source file | Used in | How |
24
23
  |---|---|---|