@cratis/pi 7.32.0 → 7.34.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 (176) 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 +16 -11
  28. package/package/corpus/skills/cratis-screenplay-automations-and-translations/references/audit-format.md +1 -1
  29. package/package/corpus/skills/cratis-screenplay-automations-and-translations/references/automation-patterns.md +7 -7
  30. package/package/corpus/skills/cratis-screenplay-automations-and-translations/references/effects-and-idempotency.md +1 -1
  31. package/package/corpus/skills/cratis-screenplay-automations-and-translations/references/provenance.md +5 -6
  32. package/package/corpus/skills/cratis-screenplay-automations-and-translations/references/public-events-and-direction.md +2 -3
  33. package/package/corpus/skills/cratis-screenplay-automations-and-translations/references/realization-and-gap-fill.md +9 -5
  34. package/package/corpus/skills/cratis-screenplay-automations-and-translations/references/todo-list-example.md +6 -6
  35. package/package/corpus/skills/cratis-screenplay-automations-and-translations/references/translate-example.md +1 -1
  36. package/package/corpus/skills/cratis-screenplay-captures-and-reactions/SKILL.md +16 -15
  37. package/package/corpus/skills/cratis-screenplay-captures-and-reactions/references/invocation-identity.md +2 -2
  38. package/package/corpus/skills/cratis-screenplay-command-surface/SKILL.md +20 -19
  39. package/package/corpus/skills/cratis-screenplay-command-surface/references/compliance.md +3 -1
  40. package/package/corpus/skills/cratis-screenplay-command-surface/references/context.md +1 -1
  41. package/package/corpus/skills/cratis-screenplay-command-surface/references/enum-numbers.md +93 -0
  42. package/package/corpus/skills/cratis-screenplay-command-surface/references/generated-values-and-responses.md +5 -6
  43. package/package/corpus/skills/cratis-screenplay-command-surface/references/validate-rules.md +4 -2
  44. package/package/corpus/skills/cratis-screenplay-delivery-planning/LICENSE +9 -0
  45. package/package/corpus/skills/cratis-screenplay-delivery-planning/SKILL.md +118 -0
  46. package/package/corpus/skills/cratis-screenplay-delivery-planning/references/parallel-delivery.md +45 -0
  47. package/package/corpus/skills/cratis-screenplay-delivery-planning/references/provenance.md +29 -0
  48. package/package/corpus/skills/cratis-screenplay-delivery-planning/references/slice-counting.md +43 -0
  49. package/package/corpus/skills/cratis-screenplay-delivery-planning/references/velocity-and-capacity.md +48 -0
  50. package/package/corpus/skills/cratis-screenplay-delivery-planning/verification.json +16 -0
  51. package/package/corpus/skills/cratis-screenplay-discovery/LICENSE +2 -2
  52. package/package/corpus/skills/cratis-screenplay-discovery/SKILL.md +6 -5
  53. package/package/corpus/skills/cratis-screenplay-discovery/references/divergent-sweep.md +1 -0
  54. package/package/corpus/skills/cratis-screenplay-discovery/references/domain-analysis-template.md +92 -0
  55. package/package/corpus/skills/cratis-screenplay-discovery/references/personas-and-causes.md +2 -2
  56. package/package/corpus/skills/cratis-screenplay-discovery/references/provenance.md +4 -3
  57. package/package/corpus/skills/cratis-screenplay-discovery/verification.json +1 -1
  58. package/package/corpus/skills/cratis-screenplay-event-modeling/LICENSE +2 -2
  59. package/package/corpus/skills/cratis-screenplay-event-modeling/SKILL.md +30 -29
  60. package/package/corpus/skills/cratis-screenplay-event-modeling/references/nine-steps.md +7 -5
  61. package/package/corpus/skills/cratis-screenplay-event-modeling/references/parsed-not-runnable.md +13 -10
  62. package/package/corpus/skills/cratis-screenplay-event-modeling/references/provenance.md +2 -3
  63. package/package/corpus/skills/cratis-screenplay-legacy-extraction/LICENSE +2 -2
  64. package/package/corpus/skills/cratis-screenplay-legacy-extraction/SKILL.md +26 -13
  65. package/package/corpus/skills/cratis-screenplay-legacy-extraction/references/candidate-inventory.md +6 -1
  66. package/package/corpus/skills/cratis-screenplay-legacy-extraction/references/generate-notes.md +7 -0
  67. package/package/corpus/skills/cratis-screenplay-legacy-extraction/references/prologue-safety.md +22 -17
  68. package/package/corpus/skills/cratis-screenplay-legacy-extraction/references/provenance.md +2 -3
  69. package/package/corpus/skills/cratis-screenplay-legacy-extraction/references/rule-modeling.md +2 -2
  70. package/package/corpus/skills/cratis-screenplay-legacy-extraction/references/side-car-migration.md +1 -0
  71. package/package/corpus/skills/cratis-screenplay-legacy-extraction/verification.json +1 -1
  72. package/package/corpus/skills/cratis-screenplay-model-authoring/SKILL.md +25 -25
  73. package/package/corpus/skills/cratis-screenplay-model-authoring/references/language-reference.md +8 -2
  74. package/package/corpus/skills/cratis-screenplay-model-authoring/references/mcp-loop.md +8 -3
  75. package/package/corpus/skills/cratis-screenplay-model-authoring/references/mcp-tools.md +38 -8
  76. package/package/corpus/skills/cratis-screenplay-model-authoring/references/property-links.md +126 -0
  77. package/package/corpus/skills/cratis-screenplay-model-authoring/references/screen-authoring-workflow.md +3 -4
  78. package/package/corpus/skills/cratis-screenplay-model-authoring/verification.json +1 -1
  79. package/package/corpus/skills/cratis-screenplay-model-review/LICENSE +2 -2
  80. package/package/corpus/skills/cratis-screenplay-model-review/SKILL.md +8 -8
  81. package/package/corpus/skills/cratis-screenplay-model-review/references/anti-patterns.md +2 -2
  82. package/package/corpus/skills/cratis-screenplay-model-review/references/checklist.md +4 -4
  83. package/package/corpus/skills/cratis-screenplay-model-review/references/model-inventory-report.md +75 -0
  84. package/package/corpus/skills/cratis-screenplay-model-review/references/provenance.md +3 -4
  85. package/package/corpus/skills/cratis-screenplay-model-review/references/public-keys-and-routes.md +1 -1
  86. package/package/corpus/skills/cratis-screenplay-model-review/references/worked-example.md +4 -3
  87. package/package/corpus/skills/cratis-screenplay-modeling-lifecycle/LICENSE +2 -2
  88. package/package/corpus/skills/cratis-screenplay-modeling-lifecycle/SKILL.md +7 -5
  89. package/package/corpus/skills/cratis-screenplay-modeling-lifecycle/references/core-rules-digest.md +131 -0
  90. package/package/corpus/skills/cratis-screenplay-modeling-lifecycle/references/phases.md +1 -1
  91. package/package/corpus/skills/cratis-screenplay-modeling-lifecycle/references/provenance.md +25 -4
  92. package/package/corpus/skills/cratis-screenplay-modeling-lifecycle/references/reasoning-notes.md +2 -2
  93. package/package/corpus/skills/cratis-screenplay-modeling-lifecycle/references/verdicts-and-modes.md +1 -1
  94. package/package/corpus/skills/cratis-screenplay-modeling-lifecycle/references/vocabulary-map.md +5 -4
  95. package/package/corpus/skills/cratis-screenplay-projections/SKILL.md +9 -5
  96. package/package/corpus/skills/cratis-screenplay-projections/references/pdl-grammar.md +4 -2
  97. package/package/corpus/skills/cratis-screenplay-read-surface/LICENSE +7 -0
  98. package/package/corpus/skills/cratis-screenplay-read-surface/SKILL.md +16 -8
  99. package/package/corpus/skills/cratis-screenplay-read-surface/references/provenance.md +21 -0
  100. package/package/corpus/skills/cratis-screenplay-read-surface/references/screen-patterns.md +130 -0
  101. package/package/corpus/skills/cratis-screenplay-read-surface/verification.json +1 -1
  102. package/package/corpus/skills/cratis-screenplay-render-and-gap-fill/LICENSE +2 -2
  103. package/package/corpus/skills/cratis-screenplay-render-and-gap-fill/SKILL.md +60 -47
  104. package/package/corpus/skills/cratis-screenplay-render-and-gap-fill/references/delivery-protocol.md +17 -2
  105. package/package/corpus/skills/cratis-screenplay-render-and-gap-fill/references/drift-and-ledger.md +19 -2
  106. package/package/corpus/skills/cratis-screenplay-render-and-gap-fill/references/gap-fill-handoff.md +24 -6
  107. package/package/corpus/skills/cratis-screenplay-render-and-gap-fill/references/provenance.md +2 -3
  108. package/package/corpus/skills/cratis-screenplay-render-and-gap-fill/references/renderability-gate.md +21 -16
  109. package/package/corpus/skills/cratis-screenplay-render-and-gap-fill/references/worked-example.md +34 -29
  110. package/package/corpus/skills/cratis-screenplay-scenario-coverage/LICENSE +2 -2
  111. package/package/corpus/skills/cratis-screenplay-scenario-coverage/SKILL.md +5 -4
  112. package/package/corpus/skills/cratis-screenplay-scenario-coverage/references/berth-reservations.md +1 -1
  113. package/package/corpus/skills/cratis-screenplay-scenario-coverage/references/invoicing-dues-design.md +5 -4
  114. package/package/corpus/skills/cratis-screenplay-scenario-coverage/references/invoicing-dues-example.md +32 -3
  115. package/package/corpus/skills/cratis-screenplay-scenario-coverage/references/provenance.md +3 -4
  116. package/package/corpus/skills/cratis-screenplay-scenario-coverage/references/scenario-catalogue.md +7 -6
  117. package/package/corpus/skills/cratis-screenplay-scenario-coverage/references/scenario-examples.md +3 -3
  118. package/package/corpus/skills/cratis-screenplay-scenario-coverage/references/scenario-workshop.md +15 -7
  119. package/package/corpus/skills/cratis-screenplay-scenario-coverage/references/spec-forms-by-mode.md +11 -10
  120. package/package/corpus/skills/cratis-screenplay-scenario-coverage/references/view-and-story-specs.md +6 -4
  121. package/package/corpus/skills/cratis-screenplay-slice-design/LICENSE +2 -2
  122. package/package/corpus/skills/cratis-screenplay-slice-design/SKILL.md +4 -3
  123. package/package/corpus/skills/cratis-screenplay-slice-design/references/command-inventory.md +2 -2
  124. package/package/corpus/skills/cratis-screenplay-slice-design/references/derived-condition-events.md +68 -0
  125. package/package/corpus/skills/cratis-screenplay-slice-design/references/field-lineage.md +1 -1
  126. package/package/corpus/skills/cratis-screenplay-slice-design/references/provenance.md +5 -5
  127. package/package/corpus/skills/cratis-screenplay-slice-design/references/read-model-design.md +17 -0
  128. package/package/corpus/skills/cratis-screenplay-slice-design/references/rule-layers.md +6 -6
  129. package/package/corpus/skills/cratis-screenplay-slice-design/references/worked-example.md +3 -3
  130. package/package/corpus/skills/cratis-screenplay-specifications/SKILL.md +7 -5
  131. package/package/corpus/skills/cratis-screenplay-specifications/references/examples-and-routes.md +4 -3
  132. package/package/corpus/skills/cratis-screenplay-specifications/references/generated-fixtures.md +3 -2
  133. package/package/corpus/skills/cratis-screenplay-specifications/references/persona-callers-and-cases.md +3 -0
  134. package/package/corpus/skills/cratis-screenplay-specifications/references/reactions-and-cascades.md +3 -2
  135. package/package/corpus/skills/cratis-screenplay-streams-and-consistency/LICENSE +2 -2
  136. package/package/corpus/skills/cratis-screenplay-streams-and-consistency/SKILL.md +14 -11
  137. package/package/corpus/skills/cratis-screenplay-streams-and-consistency/references/boundaries.md +31 -3
  138. package/package/corpus/skills/cratis-screenplay-streams-and-consistency/references/chronicle-boundaries.md +6 -6
  139. package/package/corpus/skills/cratis-screenplay-streams-and-consistency/references/consistency-and-concurrency.md +12 -11
  140. package/package/corpus/skills/cratis-screenplay-streams-and-consistency/references/evolution.md +18 -1
  141. package/package/corpus/skills/cratis-screenplay-streams-and-consistency/references/provenance.md +4 -4
  142. package/package/corpus/skills/cratis-screenplay-streams-and-consistency/references/stream-patterns.md +1 -1
  143. package/package/corpus/skills/cratis-screenplay-streams-and-consistency/references/streams-example.md +1 -1
  144. package/package/corpus/skills/cratis-screenplay-toolchain/LICENSE +2 -2
  145. package/package/corpus/skills/cratis-screenplay-toolchain/SKILL.md +29 -18
  146. package/package/corpus/skills/cratis-screenplay-toolchain/references/cheat-sheet-example.md +3 -3
  147. package/package/corpus/skills/cratis-screenplay-toolchain/references/cheat-sheet.md +7 -4
  148. package/package/corpus/skills/cratis-screenplay-toolchain/references/diagnostics.md +21 -2
  149. package/package/corpus/skills/cratis-screenplay-toolchain/references/doc-contradictions.md +5 -3
  150. package/package/corpus/skills/cratis-screenplay-toolchain/references/executable-subset.md +32 -18
  151. package/package/corpus/skills/cratis-screenplay-toolchain/references/production-routes-and-filters.md +1 -1
  152. package/package/corpus/skills/cratis-screenplay-toolchain/references/provenance.md +3 -4
  153. package/package/corpus/skills/cratis-screenplay-toolchain/references/renderable-subset.md +46 -16
  154. package/package/corpus/skills/cratis-screenplay-toolchain/references/screenplay-contract-exceptions.json +1 -1
  155. package/package/corpus/skills/cratis-screenplay-toolchain/references/screenplay-contract.json +1092 -17
  156. package/package/corpus/skills/cratis-screenplay-toolchain/references/screenplay-contract.version +1 -1
  157. package/package/corpus/skills/cratis-screenplay-toolchain/references/sources-and-streams.md +1 -1
  158. package/package/corpus/skills/cratis-screenplay-toolchain/references/traps.md +8 -8
  159. package/package/corpus/skills/cratis-screenplay-toolchain/references/verdicts.md +18 -13
  160. package/package/corpus/skills/cratis-screenplay-toolchain/references/versions.md +41 -20
  161. package/package/corpus/skills/cratis-screenplay-toolchain/verification.json +7 -2
  162. package/package/corpus/skills/cratis-screenplay-ui-composition/LICENSE +2 -2
  163. package/package/corpus/skills/cratis-screenplay-ui-composition/SKILL.md +10 -10
  164. package/package/corpus/skills/cratis-screenplay-ui-composition/references/flow-review.md +1 -1
  165. package/package/corpus/skills/cratis-screenplay-ui-composition/references/provenance.md +2 -3
  166. package/package/corpus/skills/cratis-screenplay-ui-composition/references/screen-composition-contract.md +41 -16
  167. package/package/corpus/skills/cratis-screenplay-ui-composition/references/worked-flow.md +17 -9
  168. package/package/corpus/skills/cratis-stage-rendering-and-sandbox/SKILL.md +85 -77
  169. package/package/corpus/skills/cratis-stage-rendering-and-sandbox/references/admission.md +65 -16
  170. package/package/corpus/skills/cratis-stage-rendering-and-sandbox/references/case-tables-and-whole-numbers.md +2 -2
  171. package/package/corpus/skills/cratis-stage-rendering-and-sandbox/references/render-example.md +3 -1
  172. package/package/corpus/skills/cratis-stage-rendering-and-sandbox/references/rendered-application.md +30 -15
  173. package/package/corpus/skills/cratis-stage-rendering-and-sandbox/references/sandbox-and-specrunner.md +21 -1
  174. package/package/corpus/skills/cratis-stage-rendering-and-sandbox/verification.json +9 -4
  175. package/package/profile-catalog.json +1 -0
  176. package/package.json +1 -1
@@ -1,5 +1,14 @@
1
1
  # Delivery protocol
2
2
 
3
+ ## Contents
4
+
5
+ - 1. Inputs to collect before the first command
6
+ - 2. Commands
7
+ - 3. Reading results
8
+ - 4. Customizations (bounded)
9
+ - 5. Done check (before reporting)
10
+ - 6. Stop and ask
11
+
3
12
  The render phase proves and publishes; it does not write business behaviour. Run one phase
4
13
  per tool call and read each result from its exit status, never from a grep of the log.
5
14
 
@@ -9,7 +18,8 @@ per tool call and read each result from its exit status, never from a grep of th
9
18
  identity"). A dirty flag is never a revision. Bind the whole run to it; if it changes, start over.
10
19
  - The **model root**. Use a dedicated folder: implementation attachments are read from it.
11
20
  - **Render inputs:** `--name` (application identity, required for plain source, a C# identifier),
12
- `--project-name`, `--root-namespace`, `--target cratis`. Keep them identical across
21
+ `--project-name`, `--root-namespace`, `--target cratis`, and `--scope <Module[.Feature][.Slice]>` (repeatable) when
22
+ only an admitted part is delivered; record the scope list with the source identity. Keep them identical across
13
23
  re-renders; changing the name or target makes publication refuse as an identity change.
14
24
  - **Destination:** `.ai-work/screenplay/<model-slug>/render-probe/<App>` unless the user named another.
15
25
  - Which modeled screens, personas and seams exist (UI omission list, section 4).
@@ -19,6 +29,8 @@ per tool call and read each result from its exit status, never from a grep of th
19
29
  | Phase | Command | Result is |
20
30
  | --- | --- | --- |
21
31
  | Admission and publication | `cratis render <root> --name <App> --destination <dir> [--project-name <P>] [--root-namespace <N>] -o json` (forward every option recorded in section 1) | exit 0 published (receipt on stdout), 5 refused (diagnostics, nothing published), 1 missing input |
32
+ | Drift or pending-change check | the same command plus `--check` (and `--scope`, `--force` as used) | no write, no recovery: exit 0 current, 6 `changes_pending`, 5 planning failure, refusal or pending recovery |
33
+ | Bundled-binder check | `cratis screenplay validate --executable <root>` | exit 5 with "does not bind into an executable semantic model" when it does not; never renders or writes. Uses the bundled compiler (CLI 3.53.1 = Screenplay 4.137.0), not standalone 4.139.0 |
22
34
  | Debug build | `dotnet build <dir>/<Project>.csproj -c Debug` | the build's exit status |
23
35
  | Debug tests | `dotnet test <dir>/<Project>.csproj -c Debug --no-build` | the test runner's exit status plus per-test results |
24
36
  | List the generated classes | `dotnet test <dir>/<Project>.csproj -c Debug --no-build --list-tests` | the names to map to specifications |
@@ -38,7 +50,10 @@ file (for example `--logger "trx"` with a results directory under the probe fold
38
50
  - **Publication:** written, unchanged and removed counts, plus `recovered`. `refused` when a managed file
39
51
  was modified, an unmanaged file sits on a planned path, a modified stale file would be removed,
40
52
  or the manifest identity changed (`drift-and-ledger.md`). Ok means `recovered: false` and
41
- `written + unchanged` equal to the artifact count.
53
+ `written + unchanged` equal to the artifact count (for a `--scope` render, the scope's artifacts: other
54
+ scopes' files are preserved and never counted; compare against the receipt's `owners`/`sources` for the
55
+ selected slices and the `orphaned` list). The receipt's `sources` (CLI 3.45.0 or later) map generated files back to
56
+ specifications and slices.
42
57
  - **Build:** Debug exit status. Classify each error location as `Customizations/`, managed or outside.
43
58
  An error in a managed file after a clean render is a renderer defect or an environment problem:
44
59
  report it, never patch the file.
@@ -4,7 +4,7 @@
4
4
  The ownership manifest `.cratis-render.json` at the destination records `semanticRevision`
5
5
  (`rev1:<sha256>`), the target, the renderer, the application name and a hash per managed file.
6
6
 
7
- Facts verified with `cratis render` 3.28.2 on one model: the same files rendered under the names
7
+ Facts verified with `cratis render` 3.28.2 on one model (historical probe; still how identity works): the same files rendered under the names
8
8
  `Marina` and `Harbour` gave different `semanticRevision` values, so **the application name is part
9
9
  of the revision**. The MCP workspace names the application after the model root folder (without
10
10
  `.screenplay/identities.json`), so its `modelRevision` is not comparable with a render's manifest
@@ -12,14 +12,31 @@ revision by assumption. Without `.screenplay/identities.json` it changes when th
12
12
  renamed (relocating the root while keeping its name does not); source positions and descriptions do
13
13
  not change it, and a file move changes it only if it changes logical placement or application identity.
14
14
 
15
+ **First probe: `cratis render <root> --name <App> --destination <dir> --check`** (CLI 3.44.0 or later; add
16
+ the `--scope` list used for delivery). It plans against the real destination, writes nothing and runs
17
+ no recovery: exit 0 current, 6 changes pending, 5 planning failure, refusal or pending recovery.
18
+ Documentation edits also change managed-file hashes, so they show as pending changes. `--check`
19
+ replaces the throwaway `-drift` render below; the manifest comparison stays as a cross-check.
20
+
15
21
  Compare in this order:
16
22
  1. **Source identity** (`cratis-screenplay-modeling-lifecycle` `references/verdicts-and-modes.md`):
17
23
  compute it for the current model and compare it with the identity recorded when the output was
18
24
  rendered. Equal: the same model bytes, whatever git says. Different: the output is behind the model.
19
- 2. **Manifest revision:** render the current model with the **same** `--name` and inputs into a
25
+ 2. **Manifest revision** (when `--check` is not available): render the current model with the **same** `--name` and inputs into a
20
26
  fresh probe folder (`.../render-probe/<App>-drift`) and compare its manifest `semanticRevision`
21
27
  with the published one. Equal: no semantic change since publication. Different: re-render and review the receipt.
22
28
  3. Equal revisions prove neither customization conformance nor faithful UI.
29
+ 4. **Hand-written scope against the accepted model:** `cratis screenplay conform <model-root> --project <path>`
30
+ (CLI 3.42.0 or later; Arc, Marten and Critter Stack code) compares the declarations recovered from
31
+ code with the model by exact structural address. Exit 0 no blocking findings, 1 defects (code-only
32
+ declarations, shape mismatches), 2 could not run or incomplete coverage; model-only members are
33
+ informational. It is **structural drift evidence only**, never a behavioral equivalence verdict and
34
+ never V4 or V5; it needs the same generation options (`--domain`, `--feature-root`, `--module`,
35
+ `--skip-segments`, `--modules-from-namespace-roots`) that reproduce the authored placement, or
36
+ everything looks missing. MSBuild evaluates the project (use a trusted clone) and the bundle's
37
+ `Cratis.Arc.Screenplay` is 22.54.0, so recovery behaves like that adapter. It does not replace
38
+ `cratis-application-slice-conformance`, which reconciles specifications, rules and behavior.
39
+ Whether it is meaningful on a Stage-rendered application is unverified.
23
40
 
24
41
  Use the same toolchain as the render; revisions from another Screenplay version are not
25
42
  comparable by assumption. A dirty git flag or commit is context, never a revision.
@@ -1,5 +1,13 @@
1
1
  # Gap-fill hand-off to `slice-implementer`
2
2
 
3
+ ## Contents
4
+
5
+ - One scope per brief
6
+ - What comes back
7
+ - Rules the model states only in prose
8
+ - Automation and Translate scope
9
+ - Re-delivery
10
+
3
11
  For scope the renderer rejects (case C in `SKILL.md`) and for hand-written scope next to a
4
12
  generated base (case B). The render phase reports the capability boundary; the implementer
5
13
  authors the code with the `.play` slice and its specifications as the contract. Contract
@@ -61,13 +69,13 @@ ambiguous addresses; contracts are never inferred from names.
61
69
  A rule that exists only in a description, or a state-dependent rule the model marks as not
62
70
  enforced, is unenforced in generated scope. List it in the ledger as a target requirement. In
63
71
  hand-written code it needs an atomic enforcement point: a protected read or a concurrency scope
64
- (Stage 4.51.3 rendered apps have Arc 22.50.5/Chronicle 19.32.0: protected-read APIs
72
+ (Stage 4.73.1 rendered apps scaffold Arc 22.68.0/Chronicle 19.45.0: protected-read APIs
65
73
  are available to gap-fill, with projection/key admission and active enrollment), or a Chronicle constraint. A stale view or
66
74
  a caller-supplied status is not enforcement.
67
75
 
68
76
  ## Automation and Translate scope
69
- Stage 4.24 renders no Automation or Translate slice, so the whole automation is gap-fill, written
70
- against the slice and its specifications. The realization follows the actual construct and
77
+ Stage (4.73.1) renders no Automation or Translate slice and no reaction or capture, so the whole
78
+ automation is gap-fill, written against the slice and its specifications. The realization follows the actual construct and
71
79
  trigger, not the slice label: a capture is an ingestion adapter, an event reaction (including a
72
80
  translator reaction) is a reactor, a clock or application trigger is a scheduler or host signal. Where they are
73
81
  registered depends on the case. Case B (a generated base exists, and the user authorized the
@@ -77,12 +85,22 @@ not bind a modeled reaction or capture. Case C (no generated application): there
77
85
  composition conventions (`rules/vertical-slices.md`, `cratis-chronicle-reactor`).
78
86
  Declare the trusted actor with reaction `runs as system role "<Role>"`
79
87
  (standalone 4.125.0, ESM v10); `given caller` is not an invocation actor.
80
- Historical CLI 3.41.0's older compiler rejected the syntax. CLI 3.50.0/Stage 4.67.0
81
- reaches v10 construct admission but still refuses reaction identity
82
- (STAGE-ESM-034); previous CLI 3.46.1 admitted through v7 only. Gap-fill retains the declared role and uses Arc
88
+ Historical CLI 3.41.0's older compiler rejected the syntax. The pinned CLI/Stage pair
89
+ (`cratis-screenplay-toolchain/references/versions.md`) reaches v10 construct admission but still refuses reaction identity
90
+ (STAGE-ESM-034). Gap-fill retains the declared role and uses Arc
83
91
  `[ExecuteCommandsAsSystem]` for returned commands. Checked model and diagnostics:
84
92
  captures-and-reactions `references/invocation-identity.md`.
85
93
 
94
+ A reaction that both produces events and invokes commands keeps its single modeled form
95
+ (`STAGE-ESM-037` is Stage's refusal, not a model defect). Hand-write one reactor returning the events
96
+ and the commands: on Arc 22.72.0 or later (the Stage 4.73.1 scaffold pins Arc 22.68.0, whose command handler accepts a collection only when every element is a command, so a rendered app needs a proven dependency override) the runtime appends the events first as one batch, then
97
+ runs the commands in order, with no transaction across the two effects; a failing command stops the
98
+ later ones but keeps the committed events, and a retry can append the events again, so make the
99
+ handler idempotent (`[OnceOnly]` and the failure behavior in `cratis-chronicle-reactor`). Return a
100
+ stable array or list. The Stage scaffold pins Arc 22.68.0, so raise the version through
101
+ `Customizations/Dependencies.props` only after a restore and build proves it. Never split the
102
+ reaction or drop an effect to dodge rendering.
103
+
86
104
  ## Re-delivery
87
105
  The work list is the full in-scope contract delta since the ledger's last verified source
88
106
  identity (specifications, rules, mappings, realization notes), then the whole contract is
@@ -10,11 +10,10 @@
10
10
  - Three delivery cases (admission failure, generated base plus authorized gap-fill, fully
11
11
  hand-written delivery) and the whole-model rule: from the #493 plan review of render versus gap-fill.
12
12
 
13
- ## Adapted closely (Martin Dilger and Nebulit GmbH, with agreement)
13
+ ## Adapted closely (Martin Dilger and Nebulit GmbH)
14
14
 
15
15
  Source: https://github.com/Nebulit-GmbH/agentic-engineer at commit `07b0f30648d663cb588d7e2c7aa031af9dfc21f2`,
16
- by Martin Dilger and Nebulit GmbH (https://nebulit.de). The repository carries no licence file; this material
17
- is adapted with the agreement of Martin Dilger and Nebulit GmbH.
16
+ by Martin Dilger and Nebulit GmbH (https://nebulit.de), used with the explicit consent of Martin Dilger and Nebulit GmbH.
18
17
 
19
18
  | Source file | Used in | How |
20
19
  |---|---|---|
@@ -7,17 +7,20 @@ The admitted subset itself (what Stage renders, member by member) is owned by
7
7
  probe reports and choosing what to do. Do not copy the code table here.
8
8
 
9
9
  ## Pipeline that produces the codes
10
- 1. The CLI compiles and binds the model with its **bundled** Screenplay (4.66.0 in cratis 3.28.2,
11
- ESM up to v6; 4.60.1, ESM up to v5, before 3.28.2). Binding errors are `PLAY0268` (outside the admitted vertical), `PLAY0269`
10
+ 1. The CLI compiles and binds the **whole** model with its **bundled** Screenplay (4.137.0 in
11
+ cratis 3.53.1, ESM up to v10 for rendering; older bundles bound less). Binding is never scoped:
12
+ any binding error blocks even a `--scope` render. Binding errors are `PLAY0268` (outside the admitted vertical), `PLAY0269`
12
13
  (deferred), `PLAY0270` (report-only information), `PLAY0271` (legacy semantics) and `PLAY0273`
13
14
  (a specification shape).
14
15
  2. Execution planning builds the plan and can emit `PLAN-*` diagnostics before Stage runs.
15
16
  3. Stage plans the target and admits or rejects each member: `STAGE-ESM-0xx`; profile and path
16
- problems `STAGE-CRATIS-0xx`. An ESM v4 model with an evolved event is reported with Stage's
17
- own `STAGE-ESM-026` (Stage 4.24.2 admits v4 but not evolved events); the CLI adds nothing
18
- since 3.28.3 (3.28.2 also reported `CLI-RENDER-003`, and refused a v4 model
19
- with `STAGE-ESM-016` on its bundled Stage 4.24.1).
20
- 4. Any error anywhere publishes nothing: the run ends with exit 5 and the diagnostics.
17
+ problems `STAGE-CRATIS-0xx`. An evolved event is reported with Stage's own `STAGE-ESM-026`
18
+ (still refused at Stage 4.73.1); the CLI adds nothing. Stage admits ESM v1 to v10 by version and
19
+ refuses each construct it does not render with its own code (`-024`, `-027` to `-037`).
20
+ 4. Any error in the selected scope publishes nothing: the run ends with exit 5 and the diagnostics.
21
+ Without `--scope` the scope is the whole application. With `--scope`, `PLAN-*` problems in
22
+ unselected slices are warnings and `STAGE-ESM-*` refusals in unselected slices do not block;
23
+ binding problems and application-level declarations still do.
21
24
 
22
25
  The standalone `screenplay` tool can report V3 ready where the bundled binder refuses (newer
23
26
  ESM). Only the probe answers renderability. `PLAY0270` entries are information, not blockers.
@@ -26,8 +29,8 @@ ESM). Only the probe answers renderability. `PLAY0270` entries are information,
26
29
 
27
30
  | Class | Meaning | Typical examples (each verified in `admission.md`) | Action |
28
31
  | --- | --- | --- | --- |
29
- | **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 without `authenticated` (`-015`) | edit request to the modeler session with address, change and rationale |
30
- | **Capability gap** | the intended meaning needs a construct Stage does not render yet | list, observable and filtered queries (`PLAY0268` "must declare one caller-supplied 'by'", `-010`); Automation and Translate slices (`PLAY0268` "not admitted by ESM v1", `-001`, Stage#79); reactions, clocks, captures and triggers (v6, `-016`); generated values and responses (v7: `-016`, and `PLAY0268` on the bundled 4.66.0; tracked in Stage#201); evolved events (`STAGE-ESM-026`); conditional `produces when` (`-006`); `reads` (`PLAY0271`); code validation (`-005`); opaque policies (`-015`); compliance attributes (`PLAY0268` "require portable data-subject semantics"); a command `handler` (`PLAY0268`) | keep the model; ledger entry; options a to c in `SKILL.md`; link the Stage issue |
32
+ | **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 at 4.73.1) | edit request to the modeler session with address, change and rationale |
33
+ | **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), and `filter`, `scoped to`, `performer` queries (`PLAY0268`); Automation and Translate slices (`-001`/`-024`, Stage#79); reactions, clocks, captures and triggers (`-024`); a reaction that both produces and invokes (`-037`: keep it whole and hand-write one reactor on Arc 22.72.0 or later (the scaffold pins 22.68.0: a proven override), never split it; Stage#207); generated values and responses (`-028`/`-029`, Stage#175); `then no readmodel` (`-027`); evolved events (`STAGE-ESM-026`); conditional `produces when` (`-006`); `reads` (`PLAY0271`); code validation (`-005`); compliance attributes (`PLAY0268` "require portable data-subject semantics"); a command `handler` (`PLAY0268`) | keep the model; ledger entry; options a to c in `SKILL.md`; link the Stage issue |
31
34
  | **Tool skew** | the bundled compiler disagrees with documented semantics | the false `PLAY0285` on reaction cascades from a cratis before 3.28.2 bundle (cli#242); codes the standalone compiler does not raise | record in the session state and the ledger; never "fix" a correct model |
32
35
  | **Environment** | not the model | restore failures, missing SDK, a destination that is not writable | fix the environment or report blocked |
33
36
 
@@ -39,19 +42,21 @@ ESM). Only the probe answers renderability. `PLAY0270` entries are information,
39
42
  - A refusal never licenses dropping a specification, an event generation or a protection.
40
43
  - Group codes by construct and count, report the first few with their `file(line,col)` location,
41
44
  and keep the full JSON in the probe folder. Do not paste the list.
42
- - One error blocks the whole application. Say how many slices are affected, and which slices
43
- would render if the blockers were removed (from the locations), marked as an estimate.
45
+ - One error blocks the selected scope. Say how many slices are affected, and which slices
46
+ would render if the blockers were removed (from the locations), marked as an estimate; offer a
47
+ `--scope` render of the admitted slices as an option, never a silently thinner render.
44
48
  - Admission can pass and a Debug test still fail. Admission is never a passing test; see
45
49
  `cratis-stage-rendering-and-sandbox` `references/render-example.md`.
46
50
 
47
51
  ## Stage issues to cite in ledger entries
48
- Read at the time of writing (all open): portable query semantics Stage#58 (list, observable and
49
- filtered queries); Automation and Translate slices Stage#79; mapping expressions and projection
50
- blocks Stage#117; modeled authentication Stage#120; event generation v4 Stage#165; per-persona
51
- screens Stage#194. Check that an issue is still open before citing
52
+ Read as open against Stage 4.73.1: portable query semantics Stage#58; Automation and Translate
53
+ slices Stage#79; mapping expressions and projection blocks Stage#117; modeled authentication
54
+ Stage#120; per-persona screens Stage#194; evolved events Stage#204; mixed reaction effects Stage#207;
55
+ generated values and responses Stage#175. Closed: event generation Stage#165, descriptions as code docs
56
+ Stage#178, ESM v7 Stage#201. Check that an issue is still open before citing
52
57
  it, and cite only numbers you have just read. A closed issue is a trigger to probe again.
53
58
 
54
59
  ## Reference outcomes
55
60
  - The complete marina model of `cratis-stage-rendering-and-sandbox` `references/render-example.md`:
56
- admission ok, 30 artifacts, Debug build ok, 7 tests passed (cratis 3.28.2).
61
+ admission ok, 30 artifacts, Debug build ok, 7 tests passed (cratis 3.28.2; on 3.53.1 admission and publication gave 56 artifacts, build and tests not re-run).
57
62
  - The model in `worked-example.md`: admission refused with 2 blocking `PLAY0268` diagnostics, nothing published.
@@ -8,14 +8,16 @@
8
8
  - Decision and ledger entry
9
9
  - The report
10
10
 
11
- A marina model with one renderable command and one list view. The model compiles; `cratis render`
12
- refuses it, so nothing is published. The example shows how to classify, decide and report.
11
+ A marina model with one renderable command and one snapshot list view. The model compiles and binds;
12
+ `cratis render` refuses it, so nothing is published. The example shows how to classify, decide and
13
+ report. Probed with the standalone compiler 4.139.0 and cratis 3.53.1 (scratch model, observed); the
14
+ earlier 3.28.2 outcome (two `PLAY0268` binding errors) is history.
13
15
 
14
16
  ## The model
15
17
 
16
18
  ```screenplay
17
19
  // cratis-screenplay-render-and-gap-fill: complete model for the refused-render example.
18
- // Compiles with warnings as errors; `cratis render` 3.28.2 refuses the list query.
20
+ // Compiles with warnings as errors; `cratis render` 3.53.1 refuses the snapshot list query (STAGE-ESM-010).
19
21
  domain Harbour.Marina
20
22
 
21
23
  concept BerthId : Uuid
@@ -65,42 +67,44 @@ module Berths
65
67
 
66
68
  ## The probe
67
69
 
68
- Source identity recorded first (`<commit>+<digest>`), tools named: `screenplay 4.66.0`, `cratis 3.28.2`.
69
- V1 passed on both. Then:
70
+ Source identity recorded first (`<commit>+<digest>`), tools named: `screenplay 4.139.0`, `cratis 3.53.1`.
71
+ V1 passed; the specification passes in `screenplay test`. Then:
70
72
 
71
73
  ```text
72
74
  $ cratis render <model-root> --name Marina --destination .ai-work/screenplay/marina/render-probe/Marina -o json
73
- exit 5, nothing published
74
- PLAY0268 hire.play(38,7) Read model 'BerthEntry' must have one unambiguous keyed query to identify
75
- instances in the first ESM v1 vertical.
76
- PLAY0268 hire.play(41,7) Query 'AllBerths' must declare one caller-supplied 'by' argument in the
77
- first ESM v1 vertical.
75
+ exit 5, nothing published ("planning reported 1 error(s)")
76
+ STAGE-ESM-010 Query 'AllBerths' is neither an optional snapshot lookup by identifier nor an
77
+ observable collection query the renderer can preserve.
78
78
  (+ four PLAY0270 information entries: authoring metadata, not blockers)
79
79
  ```
80
80
 
81
+ The list query binds (a list narrowed by nothing, or by one `by` key, is admitted by the binder);
82
+ Stage refuses it because it is a snapshot, not an observable collection.
83
+
81
84
  ## Classification
82
85
 
83
86
  | Diagnostic | Class | Why |
84
87
  | --- | --- | --- |
85
- | `PLAY0268` `AllBerths` | capability gap | the business question is "show all berths"; Stage renders only a keyed optional lookup (Stage#58) |
86
- | `PLAY0268` `BerthEntry` keyed query | capability gap (same cause) | it follows from the missing keyed query |
88
+ | `STAGE-ESM-010` `AllBerths` | capability gap | the business question is "show all berths" as a snapshot list; Stage renders a keyed optional snapshot lookup or an **observable** collection (Stage#58 tracks portable query semantics) |
87
89
 
88
- Both blockers sit in one slice, `Berths/Reservations/BerthRegister`; `ReserveBerth` would pass on
89
- its own (an estimate: the rest of the model was not probed alone, and a partial render does
90
- not exist). The tempting "model fix" is a keyed `BerthById` lookup in place of the list. That
91
- changes what the harbour master can see, so it is a **modeling decision for the user**, never a
92
- renderer workaround. Here the user keeps the list.
90
+ The blocker sits in one slice, `Berths/Reservations/BerthRegister`; `ReserveBerth` renders on its
91
+ own: `cratis render ... --scope Berths.Reservations.ReserveBerth` published 46 artifacts to a scratch
92
+ destination (observed; the whole model still compiled and bound, and the plain scaffold was added
93
+ because the destination had no manifest). Two tempting "model fixes" exist: a keyed `BerthById`
94
+ lookup, or marking the list `observable`. The first changes what the harbour master can see; the
95
+ second changes delivery from a snapshot to a live subscription. Both are **modeling decisions for
96
+ the user**, never renderer workarounds. Here the user keeps the snapshot list.
93
97
 
94
98
  ## Decision and ledger entry
95
99
 
96
- Case A, then case C for the list: the user keeps the full model, `ReserveBerth` and the view are
97
- delivered by hand, and the model stays the contract.
100
+ Case A, then case B for `ReserveBerth` (rendered with `--scope`) and case C for the list: the user keeps
101
+ the full model, the view is delivered by hand, and the model stays the contract.
98
102
 
99
103
  ```text
100
- F1 scope: Berths/Reservations/BerthRegister (spec: none yet) ; Berths/Reservations/ReserveBerth (ReservingABerth)
101
- blocking codes: PLAY0268 x2 (list query, keyed query)
104
+ F1 scope: Berths/Reservations/BerthRegister (spec: none yet)
105
+ blocking codes: STAGE-ESM-010 x1 (snapshot list query)
102
106
  class: capability gap decision: implementer (user, <date>)
103
- fallback location: src/Marina.Application/Berths/ spec mapping: ReservingABerth -> to be written
107
+ fallback location: src/Marina.Application/Berths/ spec mapping: none yet (BerthRegister has no specification)
104
108
  revisit trigger: Stage#58 (portable query semantics) last verified: <source identity>
105
109
  ```
106
110
 
@@ -112,12 +116,12 @@ what the reference execution route supports).
112
116
  ## The report
113
117
 
114
118
  ```text
115
- Mode: renderable (user chose) Source: <commit>+<digest> tools: screenplay 4.66.0, cratis 3.28.2
116
- V1 authorable: pass (1 file, screenplay 4.66.0; cratis validate also pass)
117
- V2 diagnostics: not run: no MCP in this session (the bundled binder's PLAY0268 came from the render probe)
118
- V3 binding: blocked: PLAY0268 x2 (cratis 3.28.2 bundled binder)
119
- V4 specs: not run: no reference execution route in this toolchain (1 specification written, none run)
120
- V5 admission: refused, 2 blocking diagnostics (list query), nothing published
119
+ Mode: renderable (user chose) Source: <commit>+<digest> tools: screenplay 4.139.0, cratis 3.53.1
120
+ V1 authorable: pass (1 file, screenplay 4.139.0)
121
+ V2 diagnostics: not run: no MCP in this session
122
+ V3 binding: pass (cratis validate --executable, bundled 4.137.0)
123
+ V4 specs: pass (screenplay test 4.139.0: 1 executed, 1 passed)
124
+ V5 admission: refused, 1 blocking diagnostic (STAGE-ESM-010), nothing published; scoped to Berths.Reservations.ReserveBerth: not part of this report
121
125
  V5 publication: not run: admission refused
122
126
  V5 build: not run: nothing published
123
127
  V5 tests: not run: nothing published
@@ -125,8 +129,9 @@ UI omissions: not applicable (no render)
125
129
  Hand-off: F1 to slice-implementer (brief: paths and addresses; contract: the .play slice and its
126
130
  specifications; conformance: cratis-application-slice-conformance)
127
131
  Edit request: BerthRegister needs a specification for the list (address, expected rows)
132
+ Note: a --scope render of ReserveBerth is a separate V5 result with its own scope line
128
133
  ```
129
134
 
130
- When the list query later renders, probe again with the same inputs. If it does, plan the
135
+ When the list query later renders (for example after Stage ships snapshot lists), probe again with the same inputs. If it does, plan the
131
136
  migration from hand-written files to managed output with the user before re-rendering; a hand
132
137
  file on a planned path makes publication refuse.
@@ -32,5 +32,5 @@ SOFTWARE.
32
32
 
33
33
  This skill also adapts material from agentic-engineer by Martin Dilger and Nebulit GmbH
34
34
  (https://github.com/Nebulit-GmbH/agentic-engineer, commit 07b0f30648d663cb588d7e2c7aa031af9dfc21f2;
35
- https://nebulit.de), used with the agreement of Martin Dilger and Nebulit GmbH. That repository
36
- carries no licence file; the adapted material remains credited to Martin Dilger and Nebulit GmbH.
35
+ https://nebulit.de), used with the explicit consent of Martin Dilger and Nebulit GmbH. The adapted
36
+ material remains credited to Martin Dilger and Nebulit GmbH.
@@ -24,9 +24,9 @@ language cannot express today are recorded, not faked. Grammar and outcome compa
24
24
  `cratis-specification-by-example`); a full audit (`cratis-screenplay-model-review`).
25
25
 
26
26
  ## Verified product sources
27
- Screenplay v4.66.0 (`c89198b`) and v4.68.0 (`79801bf`, ESM v7 fixtures and `then returns`):
28
- `Documentation/screenplay/specifications.md` and the standalone compiler; `cratis` 3.28.2 and
29
- 3.28.3 bundle Screenplay 4.66.0 (before 3.28.2 it bundled 4.60.1). The full pin table and the probes are in
27
+ Screenplay v4.66.0 (`c89198b`) and v4.68.0 (`79801bf`, ESM v7 fixtures and `then returns`) were the
28
+ original sources; released behavior was re-read at v4.139.0 (`Documentation/screenplay/specifications.md`,
29
+ `queries.md`, the standalone compiler). Current pins, the bundle and the probes are in
30
30
  `cratis-screenplay-toolchain` `references/versions.md`. At Screenplay v4.127.0,
31
31
  MCP `find-specification-obligations` derives SPEC001–SPEC008 from declarations;
32
32
  met means matching authored presence, not full coverage or passing execution.
@@ -84,7 +84,7 @@ question is not four approvals.
84
84
  row), absence, ordering. Mark lifecycle branches as branches.
85
85
  9. **State-dependent rules**: `reads <View>` + `require <expr> message "..."` as stated intent,
86
86
  marked **NOT enforced in the model today** in the slice `description` (binding reports
87
- PLAY0268/0271: expected in design mode; Screenplay#129/#209), target named (Arc
87
+ PLAY0268/0271: expected in design mode; Screenplay#129), target named (Arc
88
88
  `[ProtectedDecision]` + `DecisionRead<T>`, Chronicle DCB, or a constraint). Forbidden:
89
89
  caller-supplied copies of state in `require`, boolean attestation inputs (`confirmsX ==
90
90
  true`) and rules hidden in `handler`/hint prose. Never drop an unresolved given or assertion
@@ -187,6 +187,7 @@ production route failure, matching/wrong source/stream and unrouted facts;
187
187
  see toolchain `references/production-routes-and-filters.md`.
188
188
 
189
189
  ## Version skew: reaction cascades and false PLAY0285
190
+ (History: the 3.53.1 bundle carries Screenplay 4.137.0, so this skew no longer applies to it.)
190
191
  Under ESM v6 a command spec's `then` lists the events reactions cascade from it. The compiler
191
192
  bundled in `cratis` before 3.28.2 (Screenplay 4.60.1) reported a **false PLAY0285** for such
192
193
  a spec (cli#242); the standalone `screenplay` 4.66.0 and `cratis` 3.28.2 accept it (probed).
@@ -10,7 +10,7 @@ Complete, compiled design-mode model (marina guest berths) showing a coverage ma
10
10
  // Screens and personas are out of scope here (cratis-screenplay-slice-design). This is the canonical design-mode
11
11
  // example: stored-state rules (the reservation must be live) are stated as `reads BerthBooking`
12
12
  // + `require ... message` and marked NOT enforced in the slice descriptions, with their target
13
- // named. Binding reports PLAY0271/PLAY0268 for them (expected; Screenplay#129/#209): such a model
13
+ // named. Binding reports PLAY0271/PLAY0268 for them (expected; Screenplay#129): such a model
14
14
  // is design-complete but not binding-ready, and that is reported, never "fixed" by deleting the
15
15
  // rules. The past-date rule (`night >= today`) is declarative too: ESM v1 has no runtime date,
16
16
  // so binding reports PLAY0268 on it (recorded as blocked, not moved into prose); the rule and its rejection
@@ -14,8 +14,9 @@ replaced by prose. The runnable counterpart, which holds no stored-state rule, i
14
14
  `invoicing-dues-example.md`; `scenario-examples.md` copies `ReversingAReceivedPayment` from here.
15
15
 
16
16
  The excerpt's Stage API-availability comment describes the historical Stage 4.24.x
17
- scaffold. Stage 4.51.3 pins Arc 22.50.5/Chronicle 19.32.0: protected-read APIs are
18
- available to gap-fill, not emitted protection or `.play` rule admission. The
17
+ scaffold. Stage 4.73.1 pins Arc 22.68.0/Chronicle 19.45.0: protected-read APIs are
18
+ available to gap-fill (the "not in a Stage-rendered application" comment in the source is
19
+ superseded), not emitted protection or `.play` rule admission. The
19
20
  original compiled source is retained unchanged.
20
21
 
21
22
  ```screenplay expect PLAY0516 test=unbound
@@ -24,7 +25,7 @@ original compiled source is retained unchanged.
24
25
  // blockers), so this model compiles but is not executable; the specifications below do not run. The runnable counterpart
25
26
  // is invoicing-dues-example.md.
26
27
  // Target enforcement of every rule here: Arc [ProtectedDecision] with DecisionRead<T> (Arc v22.39.0
27
- // or later, not in a Stage-rendered application), or a Chronicle DCB; Screenplay#129/#209.
28
+ // or later, not in a Stage-rendered application), or a Chronicle DCB; Screenplay#129.
28
29
 
29
30
  concept InvoiceId : Uuid
30
31
  concept MemberId : Uuid
@@ -107,7 +108,7 @@ module Invoicing
107
108
  event PaymentReceived
108
109
 
109
110
  slice StateChange SettleOrVoidInvoice
110
- description "An invoice ends either settled or voided, never both (SettleOrVoid, enforced at append). NOT enforced in the model today: that the invoice exists and is still open (settling) and that only an open, unpaid invoice may be voided. Stated as `reads OpenInvoice` + `require` (PLAY0271/PLAY0268 at binding; Screenplay#129/#209). Target: Arc [ProtectedDecision] with DecisionRead, or a Chronicle DCB. Requirements to test in the target: settling an unknown invoice is rejected; voiding a paid invoice is rejected; voiding an open invoice succeeds."
111
+ description "An invoice ends either settled or voided, never both (SettleOrVoid, enforced at append). NOT enforced in the model today: that the invoice exists and is still open (settling) and that only an open, unpaid invoice may be voided. Stated as `reads OpenInvoice` + `require` (PLAY0271/PLAY0268 at binding; Screenplay#129). Target: Arc [ProtectedDecision] with DecisionRead, or a Chronicle DCB. Requirements to test in the target: settling an unknown invoice is rejected; voiding a paid invoice is rejected; voiding an open invoice succeeds."
111
112
  command SettleInvoice
112
113
  invoiceId InvoiceId identifier
113
114
  reads OpenInvoice as invoice by invoiceId // stated intent, unprotected (PLAY0271 at binding)
@@ -259,6 +259,7 @@ module Invoicing
259
259
  amount Decimal
260
260
  query OpenInvoiceById => OpenInvoice optional
261
261
  by invoiceId InvoiceId
262
+ query ListOpenInvoices => OpenInvoice[]
262
263
  projection OpenInvoices => OpenInvoice
263
264
  from InvoiceIssued
264
265
  invoiceId = $eventSourceId
@@ -338,6 +339,34 @@ module Invoicing
338
339
  arguments
339
340
  invoiceId = "9c1f0a52-6a4e-4b1c-9f55-0d2c7b8e1a01"
340
341
 
342
+ specification OpenInvoicesListHoldsTheIssuedInvoice
343
+ description "The unkeyed list query returns one row per open invoice; each row states the read-model identifier."
344
+ given caller
345
+ authenticated
346
+ role "Accounts"
347
+ given InvoiceIssued
348
+ for "9c1f0a52-6a4e-4b1c-9f55-0d2c7b8e1a01"
349
+ member = "6f1c2a8e-0b1d-4d55-9a3e-2f6a7c1d0e11"
350
+ amount = 130
351
+ then query ListOpenInvoices
352
+ result
353
+ invoiceId = "9c1f0a52-6a4e-4b1c-9f55-0d2c7b8e1a01"
354
+ member = "6f1c2a8e-0b1d-4d55-9a3e-2f6a7c1d0e11"
355
+ amount = 130
356
+
357
+ specification OpenInvoicesListIsEmptyAfterPayment
358
+ description "A paid invoice leaves the list: a query with no result block is the empty list."
359
+ given caller
360
+ authenticated
361
+ role "Accounts"
362
+ given InvoiceIssued
363
+ for "9c1f0a52-6a4e-4b1c-9f55-0d2c7b8e1a01"
364
+ member = "6f1c2a8e-0b1d-4d55-9a3e-2f6a7c1d0e11"
365
+ amount = 130
366
+ when append PaymentReceived
367
+ for "9c1f0a52-6a4e-4b1c-9f55-0d2c7b8e1a01"
368
+ then query ListOpenInvoices
369
+
341
370
  slice StateChange TopUpCredit
342
371
  description "Adds credit to a member. Why an amount above zero: a zero top-up changes nothing and hides a mistake."
343
372
  command TopUpCredit
@@ -412,6 +441,6 @@ module Invoicing
412
441
  - The command that reverses a payment, the refund reaction and their specifications
413
442
  (`ReversingAReceivedPayment`, `RequestingARefundAfterAReversal`) are in
414
443
  `invoicing-dues-design.md`, because the command needs a stored-state rule.
415
- - The query answers "absent" with no `result` block; the whole-list query and the `OpenInvoices`
416
- list view in the excerpts are design-mode expectations (list queries compile but do not bind at
417
- 4.66.0, PLAY0268, `cratis-screenplay-toolchain`, so they are retained as design-mode expectations): see `view-and-story-specs.md`.
444
+ - The query answers "absent" with no `result` block. The `ListOpenInvoices` list query and its two
445
+ specifications bind and run (list queries bind since Screenplay 4.105.0; they compiled but did
446
+ not bind at 4.66.0); only `filter`, `scoped to` and `performer` queries stay design-mode: see `view-and-story-specs.md`.
@@ -15,15 +15,14 @@ Source: TrogonStack/agentskills at `7b249d3ee42d8b7e11fa564141ebd5fbc37aadf1`, M
15
15
  | same file, Quality Checklist and Gherkin Best Practices (explicit givens, explicit outcomes, named reasons), and its Workflow sections 1-5 (command, state validation, view, error path, compensation) | `SKILL.md` "Quality checklist", `references/scenario-examples.md` "Good and bad forms" and categories | Mapped onto `.play` specification style (exact events, pinned messages, `for`, one behavior per spec) |
16
16
  | same file, Scenario Organization (happy path, validation, state violation, duplicates, alternatives, error handling, compensation) | `references/scenario-catalogue.md` ordering, `references/scenario-examples.md` categories | Extended with denial, competing claim, ordering, evolution and view types |
17
17
 
18
- ## Adapted closely (Martin Dilger and Nebulit GmbH, with agreement)
18
+ ## Adapted closely (Martin Dilger and Nebulit GmbH)
19
19
 
20
20
  Source: https://github.com/Nebulit-GmbH/agentic-engineer at commit `07b0f30648d663cb588d7e2c7aa031af9dfc21f2`,
21
- by Martin Dilger and Nebulit GmbH (https://nebulit.de). The repository carries no licence file; this material
22
- is adapted with the agreement of Martin Dilger and Nebulit GmbH.
21
+ by Martin Dilger and Nebulit GmbH (https://nebulit.de), used with the explicit consent of Martin Dilger and Nebulit GmbH.
23
22
 
24
23
  | Source file | Used in | How |
25
24
  |---|---|---|
26
- | `.claude/skills/eventmodeling-elaborating-scenarios/SKILL.md`: Interview Phase, Workshop Facilitation Guide, Multi-Role Review, Common Workshop Mistakes, Tips for Rapid Creation | `SKILL.md` "Interview phase", `references/scenario-workshop.md` | Text shared with TrogonStack's version (rows above, MIT; rationale, "what if" capture and multi-role review passages are not Nebulit-only); the Nebulit file is recorded here for completeness. Time-boxes and per-command quotas still deliberately dropped |
25
+ | `.claude/skills/eventmodeling-elaborating-scenarios/SKILL.md`: Interview Phase, Workshop Facilitation Guide, Multi-Role Review, Common Workshop Mistakes, Tips for Rapid Creation | `SKILL.md` "Interview phase", `references/scenario-workshop.md` | Text shared with TrogonStack's version (rows above, MIT; rationale, "what if" capture and multi-role review passages are not Nebulit-only); the Nebulit file is recorded here for completeness. Time-boxes and the three-to-five quota are kept only as optional pacing (`scenario-workshop.md` "Optional pacing"), subordinate to the coverage matrix |
27
26
  | same file: GWT vs. Storyline decision rule, Workflow 0 (decide per read model before drafting any payload; one reused schema may indicate a skipped judgment), todo lists as the prime storyline candidate, repeated event type as a driver | `SKILL.md` Procedure 5, `references/view-and-story-specs.md` "Worked family: a todo list" | Restored from #493 and adapted closely; storylines become lifecycle families of independent specs because Screenplay has no multi-step specification (Screenplay#394); storyline JSON, beats and layout dropped (board transport) |
28
27
  | same file: Scenario Types (seven questions, "not a good/bad pair", skip only for a domain reason) | `references/scenario-catalogue.md` | Idea; our own, broader catalogue kept |
29
28
  | same file: Quality Checklist (no command has only two scenarios; read models a separate, equally mandatory pass; why behind rules documented) | `SKILL.md` "Quality checklist" | Adapted closely; board posting and `expectEmptyList` items dropped |
@@ -45,7 +45,7 @@ name them as unfinished.
45
45
  order, with full payloads and `for`. See `ReservingAGuestBerth`.
46
46
  - Traps: asserting a subset of events (lists are exact); leaving out `given caller` on a gated
47
47
  command; omitting `for` so the event lands on an allocated source.
48
- - Generated values and responses (ESM v7, standalone Screenplay 4.68.0; syntax in `cratis-screenplay-specifications`):
48
+ - Generated values and responses (ESM v7, standalone Screenplay 4.68.0 and later; syntax in `cratis-screenplay-specifications`):
49
49
  when the command has a `generated` property, the happy path supplies its fixtures (`for` on the generated
50
50
  identifier, `generated <name> = <value>`); only when the command declares a response does it assert
51
51
  `then returns` (a return expectation without a response is rejected at compile time). Add the failing
@@ -90,11 +90,11 @@ name them as unfinished.
90
90
  spec, not `then denied`); denial only when the whole gate is false.
91
91
  - Ownership policies (`claim ... matches subject|<property>`): the denial gives the right role
92
92
  and a claim with another value (`claim "ownerId" = "<other id>"`); the success spec gives the
93
- matching value. Both are needed. Ownership checks on Uuid-backed identifiers do not render
94
- today (STAGE-ESM-015): note it.
93
+ matching value. Both are needed. Ownership checks on text, Uuid, Date and DateTime subjects render at Stage 4.73.1;
94
+ other subjects are STAGE-ESM-015: note it.
95
95
  - Traps: `then error` for a denial; a denial spec whose inputs also break a rule (it still
96
- denies, but reads ambiguously); trusting a `cratis run` sandbox answer (it enforces neither
97
- authorization nor validation); counting another command's denial.
96
+ denies, but reads ambiguously); trusting a `cratis run` sandbox answer (the default engine's enforcement is unverified here;
97
+ the opt-in semantic engine enforces both but reads forgeable caller headers, so it is no security boundary); counting another command's denial.
98
98
 
99
99
  ## 4. State violation
100
100
  - Ask: "After which earlier facts must this request be refused?"
@@ -151,7 +151,8 @@ name them as unfinished.
151
151
  all conditions are false the unconditional productions still occur. See
152
152
  `RecordingACleanDeparture` (only `BoatDeparted`) and `RecordingADepartureWithDamage` (both).
153
153
  - Zero new facts: a command whose productions are all conditional may be accepted with no
154
- facts. There is no `then no events` syntax. A command spec with no `then` events but with a
154
+ facts. `then no events` parses but binding refuses it with PLAY0268 (#433): state the zero-fact outcome through a
155
+ read-model or query assertion, and an action with no outcome at all does not bind. A command spec with no `then` events but with a
155
156
  view or query assertion is still executable as a zero-fact check: the runner compares the
156
157
  command's facts with the (empty) expected list by exact count, so any fact produced fails it
157
158
  (Screenplay v4.66.0). Write it that way, name it for the zero-fact outcome, and keep the view
@@ -12,8 +12,8 @@
12
12
 
13
13
  Compact examples for each scenario category, in one invoicing domain so the shapes compare
14
14
  easily. Every excerpt below is copied verbatim from the complete document in
15
- `invoicing-dues-example.md`, which compiles with warnings as errors and whose 21 specifications
16
- pass in the reference evaluator; it also holds the declarations the excerpts depend on. The two
15
+ `invoicing-dues-example.md`, which compiles with warnings as errors and whose 23 specifications
16
+ pass in the reference evaluator (standalone 4.139.0); it also holds the declarations the excerpts depend on. The two
17
17
  compensation excerpts in section 4 come from `invoicing-dues-design.md` instead: that document
18
18
  holds the stored-state rules (`reads` + `require`), compiles but does not bind (PLAY0271,
19
19
  PLAY0268), so its specifications are design mode and do not run. A second
@@ -207,4 +207,4 @@ specification MemberCreditAccumulatesTopUps
207
207
  A list query asserts one `result` block per expected row (count and order are exact), and the
208
208
  empty-list intent is a separate claim from a keyed row being absent (`view-and-story-specs.md`
209
209
  "Removal is a positive obligation"). The backing example proves the keyed forms only; whole-list
210
- queries stay design-mode expectations and are recorded as such in the coverage matrix.
210
+ queries are executable too (`ListOpenInvoices` in the backing example); only `filter`, `scoped to` and `performer` queries stay design-mode expectations recorded in the coverage matrix.