@cratis/pi 7.22.0 → 7.24.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 (105) hide show
  1. package/package/corpus/skills/cratis-application-slice-conformance/SKILL.md +1 -1
  2. package/package/corpus/skills/cratis-application-slice-conformance/references/contract-and-precedence.md +5 -5
  3. package/package/corpus/skills/cratis-screenplay-automations-and-translations/SKILL.md +13 -4
  4. package/package/corpus/skills/cratis-screenplay-automations-and-translations/references/automation-patterns.md +3 -3
  5. package/package/corpus/skills/cratis-screenplay-automations-and-translations/references/cases-to-specify.md +1 -1
  6. package/package/corpus/skills/cratis-screenplay-automations-and-translations/references/effects-and-idempotency.md +1 -1
  7. package/package/corpus/skills/cratis-screenplay-automations-and-translations/references/integration-contracts.md +1 -1
  8. package/package/corpus/skills/cratis-screenplay-automations-and-translations/references/realization-and-gap-fill.md +5 -3
  9. package/package/corpus/skills/cratis-screenplay-automations-and-translations/references/translation-patterns.md +1 -1
  10. package/package/corpus/skills/cratis-screenplay-captures-and-reactions/SKILL.md +4 -3
  11. package/package/corpus/skills/cratis-screenplay-command-surface/SKILL.md +37 -36
  12. package/package/corpus/skills/cratis-screenplay-command-surface/references/compliance.md +154 -0
  13. package/package/corpus/skills/cratis-screenplay-command-surface/references/context.md +48 -0
  14. package/package/corpus/skills/cratis-screenplay-command-surface/references/generated-values-and-responses.md +1 -1
  15. package/package/corpus/skills/cratis-screenplay-command-surface/verification.json +6 -0
  16. package/package/corpus/skills/cratis-screenplay-discovery/SKILL.md +16 -8
  17. package/package/corpus/skills/cratis-screenplay-discovery/references/event-naming.md +1 -1
  18. package/package/corpus/skills/cratis-screenplay-discovery/references/facilitation.md +5 -4
  19. package/package/corpus/skills/cratis-screenplay-discovery/references/human-workshop.md +1 -1
  20. package/package/corpus/skills/cratis-screenplay-discovery/references/interview-questions.md +2 -2
  21. package/package/corpus/skills/cratis-screenplay-discovery/references/personas-and-causes.md +7 -4
  22. package/package/corpus/skills/cratis-screenplay-discovery/references/plotting-and-handoff.md +8 -7
  23. package/package/corpus/skills/cratis-screenplay-discovery/references/storming-loop.md +2 -2
  24. package/package/corpus/skills/cratis-screenplay-event-modeling/SKILL.md +13 -3
  25. package/package/corpus/skills/cratis-screenplay-event-modeling/references/naming-primitives.md +5 -3
  26. package/package/corpus/skills/cratis-screenplay-event-modeling/references/nine-steps.md +1 -2
  27. package/package/corpus/skills/cratis-screenplay-event-modeling/references/parsed-not-runnable.md +3 -1
  28. package/package/corpus/skills/cratis-screenplay-legacy-extraction/SKILL.md +11 -3
  29. package/package/corpus/skills/cratis-screenplay-legacy-extraction/references/loss-report-template.md +1 -1
  30. package/package/corpus/skills/cratis-screenplay-legacy-extraction/references/rule-modeling.md +4 -4
  31. package/package/corpus/skills/cratis-screenplay-legacy-extraction/references/signal-to-intent.md +1 -1
  32. package/package/corpus/skills/cratis-screenplay-model-authoring/SKILL.md +10 -6
  33. package/package/corpus/skills/cratis-screenplay-model-authoring/references/language-reference.md +33 -6
  34. package/package/corpus/skills/cratis-screenplay-model-authoring/references/mcp-loop.md +28 -6
  35. package/package/corpus/skills/cratis-screenplay-model-authoring/references/mcp-tools.md +108 -9
  36. package/package/corpus/skills/cratis-screenplay-model-authoring/verification.json +1 -1
  37. package/package/corpus/skills/cratis-screenplay-model-review/SKILL.md +23 -7
  38. package/package/corpus/skills/cratis-screenplay-model-review/references/anti-patterns.md +1 -1
  39. package/package/corpus/skills/cratis-screenplay-model-review/references/checklist.md +11 -10
  40. package/package/corpus/skills/cratis-screenplay-model-review/references/report-template.md +5 -1
  41. package/package/corpus/skills/cratis-screenplay-model-review/verification.json +1 -1
  42. package/package/corpus/skills/cratis-screenplay-modeling-lifecycle/SKILL.md +5 -5
  43. package/package/corpus/skills/cratis-screenplay-modeling-lifecycle/references/completeness-self-check.md +1 -1
  44. package/package/corpus/skills/cratis-screenplay-modeling-lifecycle/references/opt-in.md +7 -5
  45. package/package/corpus/skills/cratis-screenplay-modeling-lifecycle/references/phases.md +4 -4
  46. package/package/corpus/skills/cratis-screenplay-modeling-lifecycle/references/provenance.md +1 -1
  47. package/package/corpus/skills/cratis-screenplay-modeling-lifecycle/references/reasoning-notes.md +24 -19
  48. package/package/corpus/skills/cratis-screenplay-modeling-lifecycle/references/stop-or-assume.md +1 -1
  49. package/package/corpus/skills/cratis-screenplay-modeling-lifecycle/references/verdicts-and-modes.md +5 -3
  50. package/package/corpus/skills/cratis-screenplay-modeling-lifecycle/references/vocabulary-map.md +1 -1
  51. package/package/corpus/skills/cratis-screenplay-modeling-lifecycle/references/worked-example.md +15 -9
  52. package/package/corpus/skills/cratis-screenplay-read-surface/SKILL.md +11 -1
  53. package/package/corpus/skills/cratis-screenplay-read-surface/references/guarded-actions.md +4 -0
  54. package/package/corpus/skills/cratis-screenplay-render-and-gap-fill/SKILL.md +7 -6
  55. package/package/corpus/skills/cratis-screenplay-render-and-gap-fill/references/drift-and-ledger.md +1 -1
  56. package/package/corpus/skills/cratis-screenplay-render-and-gap-fill/references/gap-fill-handoff.md +3 -3
  57. package/package/corpus/skills/cratis-screenplay-render-and-gap-fill/references/renderability-gate.md +1 -1
  58. package/package/corpus/skills/cratis-screenplay-scenario-coverage/SKILL.md +25 -9
  59. package/package/corpus/skills/cratis-screenplay-scenario-coverage/references/coverage-matrix.md +1 -1
  60. package/package/corpus/skills/cratis-screenplay-scenario-coverage/references/invoicing-dues-design.md +5 -0
  61. package/package/corpus/skills/cratis-screenplay-scenario-coverage/references/scenario-catalogue.md +7 -4
  62. package/package/corpus/skills/cratis-screenplay-scenario-coverage/references/scenario-examples.md +1 -1
  63. package/package/corpus/skills/cratis-screenplay-scenario-coverage/references/scenario-workshop.md +1 -1
  64. package/package/corpus/skills/cratis-screenplay-scenario-coverage/references/spec-forms-by-mode.md +1 -1
  65. package/package/corpus/skills/cratis-screenplay-scenario-coverage/verification.json +1 -1
  66. package/package/corpus/skills/cratis-screenplay-slice-design/SKILL.md +22 -8
  67. package/package/corpus/skills/cratis-screenplay-slice-design/references/command-inventory.md +6 -4
  68. package/package/corpus/skills/cratis-screenplay-slice-design/references/field-lineage.md +2 -2
  69. package/package/corpus/skills/cratis-screenplay-slice-design/references/model-reasoning.md +87 -0
  70. package/package/corpus/skills/cratis-screenplay-slice-design/references/provenance.md +1 -1
  71. package/package/corpus/skills/cratis-screenplay-slice-design/references/read-model-design.md +2 -2
  72. package/package/corpus/skills/cratis-screenplay-slice-design/references/review-questions.md +2 -1
  73. package/package/corpus/skills/cratis-screenplay-slice-design/references/rule-layers.md +12 -11
  74. package/package/corpus/skills/cratis-screenplay-slice-design/references/slicing.md +3 -3
  75. package/package/corpus/skills/cratis-screenplay-slice-design/references/worked-example.md +9 -3
  76. package/package/corpus/skills/cratis-screenplay-specifications/SKILL.md +23 -6
  77. package/package/corpus/skills/cratis-screenplay-specifications/references/examples-and-routes.md +67 -1
  78. package/package/corpus/skills/cratis-screenplay-specifications/references/persona-callers-and-cases.md +117 -0
  79. package/package/corpus/skills/cratis-screenplay-specifications/verification.json +1 -1
  80. package/package/corpus/skills/cratis-screenplay-streams-and-consistency/SKILL.md +32 -17
  81. package/package/corpus/skills/cratis-screenplay-streams-and-consistency/references/boundaries.md +3 -3
  82. package/package/corpus/skills/cratis-screenplay-streams-and-consistency/references/chronicle-boundaries.md +11 -6
  83. package/package/corpus/skills/cratis-screenplay-streams-and-consistency/references/consistency-and-concurrency.md +24 -11
  84. package/package/corpus/skills/cratis-screenplay-streams-and-consistency/references/evolution.md +2 -2
  85. package/package/corpus/skills/cratis-screenplay-streams-and-consistency/references/stream-patterns.md +9 -0
  86. package/package/corpus/skills/cratis-screenplay-streams-and-consistency/references/streams-example.md +3 -3
  87. package/package/corpus/skills/cratis-screenplay-toolchain/SKILL.md +12 -5
  88. package/package/corpus/skills/cratis-screenplay-toolchain/references/cheat-sheet-example.md +2 -2
  89. package/package/corpus/skills/cratis-screenplay-toolchain/references/cheat-sheet.md +12 -1
  90. package/package/corpus/skills/cratis-screenplay-toolchain/references/diagnostics.md +124 -5
  91. package/package/corpus/skills/cratis-screenplay-toolchain/references/doc-contradictions.md +8 -1
  92. package/package/corpus/skills/cratis-screenplay-toolchain/references/executable-subset.md +19 -4
  93. package/package/corpus/skills/cratis-screenplay-toolchain/references/provenance.md +7 -1
  94. package/package/corpus/skills/cratis-screenplay-toolchain/references/renderable-subset.md +22 -4
  95. package/package/corpus/skills/cratis-screenplay-toolchain/references/sources-and-streams.md +21 -0
  96. package/package/corpus/skills/cratis-screenplay-toolchain/references/traps.md +22 -5
  97. package/package/corpus/skills/cratis-screenplay-toolchain/references/verdicts.md +7 -6
  98. package/package/corpus/skills/cratis-screenplay-toolchain/references/versions.md +20 -3
  99. package/package/corpus/skills/cratis-screenplay-toolchain/verification.json +6 -0
  100. package/package/corpus/skills/cratis-screenplay-ui-composition/SKILL.md +4 -2
  101. package/package/corpus/skills/cratis-screenplay-ui-composition/references/guarded-interactions.md +71 -0
  102. package/package/corpus/skills/cratis-stage-rendering-and-sandbox/SKILL.md +7 -4
  103. package/package/corpus/skills/cratis-stage-rendering-and-sandbox/references/rendered-application.md +17 -6
  104. package/package/corpus/skills/cratis-stage-rendering-and-sandbox/verification.json +1 -1
  105. package/package.json +1 -1
@@ -1,16 +1,21 @@
1
- # Feature reasoning descriptions
1
+ # Feature reasoning documentation
2
2
 
3
- Durable rationale goes in `description` text (it survives canonical printing; `//` comments do
4
- not), only for a real "why". Written as the last step of P3, once the feature's model and
5
- specifications are complete, describing the finished shape, for features with real decisions. A
6
- simple feature needs one or two sentences or nothing. P4 only checks that they exist; if one is
7
- missing, or the self-check forces a model change, return to a modeling batch, author it, and
8
- rerun V1 on the changed revision.
3
+ Use `description` for a short summary; durable rationale goes in a nonempty fenced
4
+ Markdown `documentation` block, only for a real "why". Write feature reasoning as
5
+ the last step of P3, once the model and specifications are complete, describing the
6
+ finished shape. A simple feature needs one or two sentences or nothing. P4 checks
7
+ that substantive decisions have their reasoning; if missing, or a self-check forces
8
+ a model change, return to a modeling batch, author it and rerun V1 on that revision.
9
9
 
10
- Descriptions never reach rendered code (Stage#178) and are not part of the canonical semantic
11
- revision (`modelRevision`), so editing one does not change it; they do change the source identity
12
- (`verdicts-and-modes.md`). Model the rule first: a rule
13
- that exists only in a description is unenforced in rendered scope.
10
+ Screenplay v4.127.0 `slices.md` accepts one `documentation` block directly on a
11
+ module, feature, slice, command, event, read model or reaction (not under its trigger).
12
+ Use a `markdown` fence; empty, malformed or repeated blocks report PLAY0558, with
13
+ PLAY0477 retained for events. Specifications accept `description`, not documentation;
14
+ put their longer reasoning on the owning slice. Projections/screens do not accept it.
15
+ Canonical printing retains documentation on its owner. It is report-only (PLAY0270),
16
+ absent from executable bytes and `modelRevision`; edits change source identity
17
+ (`verdicts-and-modes.md`). Neither description nor documentation is rendered as code
18
+ (Stage#178): model the rule first, never treat prose as enforcement.
14
19
 
15
20
  Cover, briefly and only where real:
16
21
  1. Scope: the business process and the identities its streams are keyed by.
@@ -24,22 +29,22 @@ Cover, briefly and only where real:
24
29
  6. Integration and capability gaps, each substantive one (outside facts, cross-feature or
25
30
  cross-module dependencies, mode gaps) as: the finding, the viable resolutions, and the
26
31
  open question or decision that records the choice (`Qn <address>`, or the decision in
27
- STATE.md), so the description and the question agree.
32
+ STATE.md), so the documentation and the question agree.
28
33
  7. A closing line for a feature with real decisions: what is covered (declaration kinds and
29
34
  the specification matrix in words, not a counter that goes stale). Review results and
30
- verdicts are never written into a description (it is authored before review and would change
35
+ verdicts are never written into documentation (it is authored before review and would change
31
36
  the reviewed source identity); they live in STATE.md and the packet.
32
37
 
33
38
  Write for the next person or session who opens the model cold, not for whoever just built it.
34
39
  Add a note **at any phase**, at the element it applies to, when an assumption fills a gap the
35
40
  brief left open, an alternative was rejected, or a constraint is not obvious; never as routine
36
- narration of what a step did. If a feature's story is genuinely simple, say so briefly rather
37
- than padding; where real design decisions sit behind it, the description is how they survive
38
- the session that made them.
41
+ narration of what a step did. Complete the feature's reasoning at the end of P3.
42
+ If a feature's story is genuinely simple, say so briefly rather than padding; where real
43
+ decisions sit behind it, documentation preserves why they were made.
39
44
 
40
- Slice, command, event and read-model descriptions: one sentence per genuine decision at that
41
- element. Counts, verdicts and session notes belong in STATE.md, never in the model.
45
+ Slice, command, event, read-model and reaction documentation: one sentence per genuine
46
+ decision at that element. Counts, verdicts and session notes belong in STATE.md, never in the model.
42
47
 
43
48
  ## Worked example
44
- `worked-example.md` shows a feature description carrying items 1-3, a constraint instead of a
49
+ `worked-example.md` shows feature documentation carrying items 1-3, a constraint instead of a
45
50
  second event type, and a decided rejection as a specification.
@@ -58,5 +58,5 @@ given for a named target. Approval is not repeated for the same scope.
58
58
 
59
59
  ## Unblocking
60
60
  A scope leaves `blocked` only when its question is answered; record the answer as a decision in
61
- STATE.md and, when durable, in the model `description`. Re-blocking a blocked scope is a no-op.
61
+ STATE.md and, when durable, in the model's fenced `documentation`. Re-blocking a blocked scope is a no-op.
62
62
  Blocked delivery scopes are reported in the packet; the main session creates any issue.
@@ -207,8 +207,10 @@ skill):
207
207
  - Never use syntax the toolchain does not show compiling. Future-facing syntax only on request.
208
208
  - Constructs outside the narrower subset stay in the model as design-mode content; the gap is
209
209
  recorded and routed (P8: fallback with the model as contract).
210
- - Never remove `@pii`, `@sensitive`, authorization, date or state-dependent rules to reach V3 or
210
+ - Never remove `pii`, `secret`, authorization, date or state-dependent rules to reach V3 or
211
211
  V5. Report blocked execution.
212
212
  - Narrowing the mode is the user's decision; widening back to design is always allowed.
213
- - Roadmap items that would change verdicts (a spec runner in the compiler tool, a lineage and
214
- completeness report) stay "not available" until the toolchain skill lists them as released.
213
+ - Never assume a roadmap item shipped. Current `screenplay test`, MCP
214
+ `run-specifications`, obligations/smells and opt-in completeness are released
215
+ at the toolchain pin; they do not prove full field lineage or target behavior.
216
+ Check `cratis-screenplay-toolchain` before changing a verdict.
@@ -21,7 +21,7 @@ speaks in them; never model board mechanics (lanes, node ids, positions).
21
21
  | Storyline (ordered beats) | a **family** of specifications sharing example data, each one transition (no storyline syntax at the verified Screenplay v4.66.0) | several spec classes | specifications |
22
22
  | Field validation | concept `validate` (every use) / command `validate`, `require` | `ConceptValidator<T>` / `CommandValidator<T>` | command validation |
23
23
  | Role permission ("Cannot") | `policy` + `authorize` + `then denied` spec; ownership via `claim ... matches subject` | `[Authorize(Policy)]`, generated policies | authorization |
24
- | Precondition on stream state | `reads` + `require` as stated intent, not enforced at the verified Screenplay v4.66.0 (target: Arc `[ProtectedDecision]` + `DecisionRead<T>`, or Chronicle DCB; `[ProtectedDecision]` is not available in Stage-rendered apps) | decision over a guarded read | command validation |
24
+ | Precondition on stream state | `reads` + `require` as stated intent, not enforced at the verified Screenplay v4.66.0 (target: Arc `[ProtectedDecision]` + `DecisionRead<T>`, or Chronicle DCB; APIs available to gap-fill in Stage 4.51.3's Arc 22.50.5/Chronicle 19.32.0, not emitted protection) | decision over a guarded read | command validation |
25
25
  | Generated id (`derived:uuid4()`) | `generated` (authorable, not executable) | id supplied before `Handle()` | commands |
26
26
  | External system / outbound call | `Translate` slice (inbound); `system`/`operation` (authorable, not executable) or Automation (outbound) | `ICommandOperation` / reactor | operations, reactors |
27
27
  | HTML mockup | `screen` Level 1 + board (`visualize-model`) | default Scene composition | ui composition |
@@ -1,12 +1,12 @@
1
- # Worked example: reasoning description, constraint, decided rejection
1
+ # Worked example: reasoning documentation, constraint, decided rejection
2
2
 
3
- A marina berth allocation feature. The feature `description` carries the reasoning (scope, an
3
+ A marina berth allocation feature. The feature `documentation` carries the reasoning (scope, an
4
4
  assumption tied to Q1, a rule kept as a constraint). The refusal for a boat that already holds a
5
- berth is a specification, not a note. Complete and compiling with the standalone compiler and with
6
- `cratis screenplay validate`.
5
+ berth is a specification, not a note. The complete model validates and its three specifications pass on standalone
6
+ Screenplay 4.127.0; these are reference-runner checks, not rendered-code evidence.
7
7
 
8
8
 
9
- ```screenplay
9
+ ````screenplay
10
10
  domain Marina.Berths
11
11
 
12
12
  concept BerthId : Uuid
@@ -21,7 +21,13 @@ persona HarbourMaster
21
21
 
22
22
  module Berths
23
23
  feature Allocation
24
- description "Allocating a berth to a boat. A boat holds one berth at a time; that rule is the OneBerthPerBoat constraint, not a second event type. Assumption Q1: allocation is always manual, so no automation is modeled."
24
+ description "Allocating a berth to a boat"
25
+ documentation
26
+ ```markdown
27
+ A boat holds one berth at a time; that rule is the OneBerthPerBoat
28
+ constraint, not a second event type. Assumption Q1: allocation is
29
+ always manual, so no automation is modeled.
30
+ ```
25
31
  authorize HarbourOffice
26
32
 
27
33
  slice StateChange AllocateBerth
@@ -70,7 +76,7 @@ module Berths
70
76
  berthId = "5d3c2a52-27c4-4d2b-a0ee-0a6a8a9f7b11"
71
77
  boat = "Sea Wren"
72
78
  then denied
73
- ```
79
+ ````
74
80
 
75
81
 
76
82
  ## Why it is shaped this way
@@ -78,9 +84,9 @@ module Berths
78
84
  specification can state the exact rejection. No `BerthReassigned` event was added to carry it.
79
85
  - The `Cannot` line in the persona resolves to the `HarbourOffice` policy and a `then denied`
80
86
  specification whose caller fixture carries a non-matching role.
81
- - Assumption Q1 lives in the feature description and in STATE.md (Open questions) with its address,
87
+ - Assumption Q1 lives in the feature documentation and in STATE.md (Open questions) with its address,
82
88
  `Berths.Allocation`.
83
- - The description is rationale only: the rules themselves are enforced by the constraint, the policy
89
+ - The documentation is rationale only: the rules themselves are enforced by the constraint, the policy
84
90
  and the specifications, not by the prose.
85
91
  - The constraint does not say a berth holds one boat at a time: a berth source may replace its
86
92
  claimed boat. If berth occupancy must be unique too, model and specify that as its own invariant.
@@ -131,6 +131,13 @@ down, rather than the one you get by forgetting."*
131
131
  language documents, but the grammar accepts any name — what scopes exist follows
132
132
  the identity model of whatever runs the document. A query declares at most one.
133
133
 
134
+ At Screenplay 4.127.0, `scoped to` remains an opaque name, **not** a reference
135
+ to a declared identity detail. An `identity` query source must be keyed and return
136
+ one result (possibly optional), with a type compatible with the detail; its key
137
+ uses only caller built-ins/claims/literals and its effective gate cannot depend
138
+ on details (PLAY0641–0646). Source resolution is metadata, not runtime execution.
139
+ See command-surface `references/context.md` for the full contract.
140
+
134
141
  Treat every `scoped to global` in a review as a question to answer, not a detail.
135
142
 
136
143
  ### `observable`
@@ -239,7 +246,10 @@ One labeled user decision can choose among commands using ordered
239
246
  without an execute fallback hides it. Inputs use typed `with ... from ...`
240
247
  bindings; the selected command still enforces its own gate/rules/constraints.
241
248
  Read [guarded actions](references/guarded-actions.md) for the checked model,
242
- missing-versus-null behavior and source-versus-renderer boundary.
249
+ missing-versus-null behavior and source-versus-renderer boundary. For a gesture
250
+ choosing a whole action list rather than one labeled command, use block-form
251
+ `when`/`otherwise` on click/double click/select:
252
+ [guarded interactions](../cratis-screenplay-ui-composition/references/guarded-interactions.md).
243
253
 
244
254
  ## How a bare name resolves
245
255
 
@@ -3,6 +3,10 @@
3
3
 
4
4
  # Guarded screen actions
5
5
 
6
+ For a gesture choosing a whole action list, rather than a labeled action choosing
7
+ one command, use [guarded interactions](../../cratis-screenplay-ui-composition/references/guarded-interactions.md).
8
+ They share item conditions/subject rules but run once without a click-time refetch.
9
+
6
10
  ## Contents
7
11
 
8
12
  - State one user decision
@@ -27,8 +27,8 @@ Version pins live once in `cratis-screenplay-toolchain` `references/versions.md`
27
27
  | --- | --- | --- |
28
28
  | cratis CLI | `3.41.0` (`v3.41.0`) | `cratis render` options, exit codes, publication receipt, UI-profile rejection (`CLI-RENDER-007` to `CLI-RENDER-010`); tag pins Stage 4.51.3, Screenplay 4.114.0 and `Cratis.Arc.Screenplay` 22.54.0, with `cratis/stage:4.51.3` as the runtime image. UI-profile rejection and render-then-recover shipped in 3.41.0 (Cratis/cli#301). The screens release vector was verified on 3.40.7 (`af9f18e`) with `cratis/stage:4.51.1`. Reading baselines: 3.40.3, 3.39.0 and 3.28.3 (`8b43fef`) |
29
29
  | Stage | `4.51.3` (CLI 3.41.0 default) | admission (`STAGE-ESM-*`, and `PLAY0268` render refusals surfaced by the CLI), ownership manifest, `Customizations/` seams, Debug-only specifications, fail-closed guarded actions (`STAGE-SCENE-ACTION-001`) and interactions (`STAGE-SCENE-INTERACTION-001`). Older baselines: 4.49.5, 4.43.0 and `v4.24.2` (`32dcac4`) |
30
- | Screenplay | bundled `4.114.0`; standalone `4.125.0` | standalone compiler for V1 to V3; binding codes `PLAY0268` and the code-attachment rules, read at `v4.66.0`; claims made through `cratis` are 4.114.0 claims |
31
- | Rendered apps | Arc `22.25.0`, Chronicle `19.8.1`, Scene packages | `[ProtectedDecision]` (Arc 22.39.0 and later) is not available in code written into one; verify the generated package set before claiming exact Scene 4.14.0 runtime parity |
30
+ | Screenplay | bundled `4.114.0`; standalone `4.127.0` | standalone compiler for V1 to V3; binding codes `PLAY0268` and the code-attachment rules, read at `v4.66.0`; claims made through `cratis` are 4.114.0 claims |
31
+ | Rendered apps | Arc `22.50.5`, Chronicle `19.32.0`, Scene packages | Stage 4.51.3 scaffold; `[ProtectedDecision]` / `DecisionRead<T>` available to gap-fill, not emitted enforcement. Embedded reverse extraction disabled; verify generated packages before claiming exact Scene runtime parity |
32
32
 
33
33
  Facts were read at those tags and `cratis render` was run at 3.28.2 and 3.28.3 for the worked example
34
34
  (`references/worked-example.md`); with public CLI 3.40.7 it was run over the canonical
@@ -99,7 +99,7 @@ import-only root file.
99
99
  capability gap, tool skew or environment. Group by code and count; do not paste the list.
100
100
  3. **When admission fails** (case A) present the options, the user decides:
101
101
  (a) keep design mode and record the gaps; (b) narrow to renderable mode, where the modeler
102
- changes the model for business reasons and **without** removing protection (`@pii`,
102
+ changes the model for business reasons and **without** removing protection (`pii`,
103
103
  authorization, rules); (c) deliver the non-renderable scope by hand (case C), with a ledger
104
104
  entry (`references/drift-and-ledger.md`). Partial render does not exist.
105
105
  4. **Publish.** The probe destination by default. Another destination needs the user's intent;
@@ -135,10 +135,11 @@ Adapters and non-renderable scope follow the contract rules of `cratis-applicati
135
135
  (`cratis-application-slice-conformance` `references/build-prompts.md`).
136
136
  - One ledger scope per `slice-implementer` brief; the brief carries addresses and paths, not contents.
137
137
  - Model-enforced rules realized in code (state-dependent rules) need a protected read or
138
- concurrency scope; never claim them from prose. In a Stage-rendered app, Arc is 22.25.0.
138
+ concurrency scope; never claim them from prose. Stage 4.51.3 rendered apps have
139
+ Arc 22.50.5/Chronicle 19.32.0; API availability alone is not verified enforcement.
139
140
  - Adapters that call outside systems follow `cratis-engineering-effect-boundaries`; slice
140
141
  specifications follow `cratis-application-slice-specifications`.
141
- - Realization notes are the explicit realization requirements stated in a slice `description`
142
+ - Realization notes are the explicit realization requirements stated in a slice `description` or `documentation`
142
143
  (definition: `cratis-application-slice-conformance`, `references/contract-and-precedence.md`).
143
144
  Executable parts (specifications, mappings, constraints) win over prose, and a contradicting description is a model defect to report.
144
145
 
@@ -153,7 +154,7 @@ Adapters and non-renderable scope follow the contract rules of `cratis-applicati
153
154
  unenforced there: ledger entry or target requirement, never "delivered".
154
155
  - The `cratis run` sandbox enforces neither validation nor authorization on its default engine; it
155
156
  is no evidence for denial behaviour.
156
- - Never remove `@pii`, `@sensitive`, authorization or rules to get a render through; report the gap.
157
+ - Never remove `pii`, `secret`, authorization or rules to get a render through; report the gap.
157
158
  - Stop and ask only on a genuine contradiction between model, specs, descriptions and declared
158
159
  contracts, after reading the slice fully (`cratis-screenplay-modeling-lifecycle` `references/stop-or-assume.md`).
159
160
  - Commit set after a delivery the user accepts: the destination's `.cratis-render.json`,
@@ -57,7 +57,7 @@ non-renderable scope:
57
57
  | fallback location | project and folder of the hand-written code |
58
58
  | spec mapping | `.play` specification to test name, one line each; missing tests listed |
59
59
  | field inventory | `n/n` command, event and read-model properties mapped; extras: none, or listed with reason |
60
- | realization requirements applied | explicit realization notes from slice descriptions applied, one line each; other description prose used as a hint is listed separately |
60
+ | realization requirements applied | explicit realization notes from slice `description` or `documentation` applied, one line each; other description prose used as a hint is listed separately |
61
61
  | spec delta | at re-delivery: specifications added, changed or removed since `last verified`, each with test status |
62
62
  | divergences | where the code deliberately differs from the model, with reason and approver |
63
63
  | revisit trigger | issue and condition (for example "Stage#58 ships list queries") |
@@ -27,7 +27,7 @@ paths and addresses, not pasted contents:
27
27
  with the same name; never weaken, skip or delete one to pass. Do not edit managed files.
28
28
  Return a field inventory (command, event and read-model properties mapped to code locations)
29
29
  and list anything you added that the model does not state (expected: none). Explicit
30
- realization requirements in the slice description bind adapters and fallback code, cannot
30
+ realization requirements in the slice `description` or `documentation` bind adapters and fallback code, cannot
31
31
  contradict executable parts and are never supplemented with inferred rules; descriptive prose
32
32
  that is not an explicit requirement is a hint. The repository's pattern wins over a
33
33
  generic template; report the mismatch. Stop on a contradiction and return an edit request.*
@@ -61,8 +61,8 @@ ambiguous addresses; contracts are never inferred from names.
61
61
  A rule that exists only in a description, or a state-dependent rule the model marks as not
62
62
  enforced, is unenforced in generated scope. List it in the ledger as a target requirement. In
63
63
  hand-written code it needs an atomic enforcement point: a protected read or a concurrency scope
64
- (in a Stage-rendered application Arc is 22.25.0, which has no `[ProtectedDecision]`; a
65
- hand-written application on a newer Arc may use it), or a Chronicle constraint. A stale view or
64
+ (Stage 4.51.3 rendered apps have Arc 22.50.5/Chronicle 19.32.0: protected-read APIs
65
+ are available to gap-fill, with projection/key admission and active enrollment), or a Chronicle constraint. A stale view or
66
66
  a caller-supplied status is not enforcement.
67
67
 
68
68
  ## Automation and Translate scope
@@ -33,7 +33,7 @@ ESM). Only the probe answers renderability. `PLAY0270` entries are information,
33
33
 
34
34
  ## Triage rules
35
35
  - A capability gap never becomes a model fix by deleting meaning. Turning a list screen into a
36
- keyed lookup, dropping `@pii`, removing authorization or a rule, or splitting a conditional
36
+ keyed lookup, dropping `pii`, removing authorization or a rule, or splitting a conditional
37
37
  outcome into separate commands is a **modeling decision** for the user and the modeler, made
38
38
  for business reasons, not to please the renderer.
39
39
  - A refusal never licenses dropping a specification, an event generation or a protection.
@@ -27,9 +27,11 @@ language cannot express today are recorded, not faked. Grammar and outcome compa
27
27
  Screenplay v4.66.0 (`c89198b`) and v4.68.0 (`79801bf`, ESM v7 fixtures and `then returns`):
28
28
  `Documentation/screenplay/specifications.md` and the standalone compiler; `cratis` 3.28.2 and
29
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
30
- `cratis-screenplay-toolchain` `references/versions.md`. Specification obligations reported by
31
- the MCP (Screenplay#390) and multi-step storylines (Screenplay#394) are **not available**: the
32
- coverage matrix is built by hand and lifecycle families emulate storylines.
30
+ `cratis-screenplay-toolchain` `references/versions.md`. At Screenplay v4.127.0,
31
+ MCP `find-specification-obligations` derives SPEC001–SPEC008 from declarations;
32
+ met means matching authored presence, not full coverage or passing execution.
33
+ Use it to seed, never replace, the matrix. Multi-step storylines remain unavailable;
34
+ lifecycle families emulate them.
33
35
 
34
36
  ## Interview phase
35
37
  **Skip if** the brief already states the coverage depth (rules, denials, state violations,
@@ -56,7 +58,9 @@ question is not four approvals.
56
58
  (Cannot lines, "only if", refusals, competition candidates, endings) as coverage seeds.
57
59
  3. **Inventory before drafting**: read commands, effective gates (own, feature, module), rules,
58
60
  constraints, productions, reactions, captures, read models and queries in scope; derive the
59
- obligations from those declarations, not from specs already present.
61
+ obligations from those declarations, not from specs already present. Use scoped
62
+ `find-specification-obligations` and inspect unmet/message-specific obligations;
63
+ ambiguous references and opaque code are not inferred coverage.
60
64
  4. **Coverage matrix before any spec** (`references/coverage-matrix.md`). Rows: every command,
61
65
  reaction, capture, read model and gated query. Columns: the scenario types below. Each cell
62
66
  is `spec <Name>`, `n/a: <domain reason>`, `recorded: <why not expressible>`,
@@ -70,7 +74,12 @@ question is not four approvals.
70
74
  existing intentional fixtures (`references/scenario-catalogue.md` "Example data").
71
75
  7. **Draft commands**: happy path, each rule, denial, duplicates and retries, competing claims,
72
76
  state violations, alternative branches, compensation, external failure, evolution. In each
73
- rejection vary only the value under test.
77
+ rejection vary only the value under test. Use typed `parameter`/named `case`
78
+ tables for a shared validation matrix, not for unrelated behaviors; rows are
79
+ cases, not typed fixture `example`s. `given caller as <Persona>` supplies one
80
+ authenticated policy witness for success/denial; use explicit callers for
81
+ anonymous/ownership or unsynthesizable personas. Syntax and complete model:
82
+ `cratis-screenplay-specifications` `references/persona-callers-and-cases.md`.
74
83
  8. **Separate view pass**: population, each update, accumulation, removal (with a surviving
75
84
  row), absence, ordering. Mark lifecycle branches as branches.
76
85
  9. **State-dependent rules**: `reads <View>` + `require <expr> message "..."` as stated intent,
@@ -97,9 +106,16 @@ question is not four approvals.
97
106
  | Ordering | Facts late or out of order? | view family with reordered givens; translation specs; else `recorded` |
98
107
  | External failure | The other system refuses, times out or answers twice? | outcome as a recorded fact (capture/translation), never a fake rejection |
99
108
  | Compensation | How is this undone, what does undoing free? | reversal command + spec showing the released claim or removed row |
100
- | Evolution | Do old facts still mean the same after a contract change? | spec on the new generation; compatibility note in `description` |
109
+ | Evolution | Do old facts still mean the same after a contract change? | spec on the new generation; compatibility reasoning in `documentation` |
101
110
  | View | What does each screen show after each fact? | `given` events (`for`) -> `then query`; `when append` -> update/removal |
102
111
 
112
+ For recovery intent, `when redelivered <Event> to <Reaction>` must select one
113
+ definitely matching effective given and no undecided candidate. Name `stream`
114
+ (with a complete id) or `no stream` when givens differ only by route; omitting it
115
+ is a wildcard, not an unrouted selector. Redelivery remains authoring-only
116
+ (PLAY0268), never evidence of an executed retry. Details:
117
+ `cratis-screenplay-specifications` `references/examples-and-routes.md`.
118
+
103
119
  **Once, idempotent, exactly once are different claims.** A `unique event` constraint proves the
104
120
  *fact* occurs once per event source; it does not make *command handling* idempotent (a retry is
105
121
  rejected, not answered with success), and nothing in the model proves an *external effect* (an
@@ -112,7 +128,7 @@ target requirements.
112
128
  - `then` events are exact in count and order (`then events in any order` relaxes order only).
113
129
  - Command denial: `then denied` with no success or error outcome. Read-only query denial:
114
130
  `then query <Query>` with `arguments` and no `result`, then `then denied`. Every gated command
115
- or query spec needs `given caller` (module and feature gates count); an authorized scenario
131
+ or query spec needs `given caller` or `given caller as <Persona>` (module and feature gates count); an authorized scenario
116
132
  gets no inferred fixture (PLAY0389). Unauthorized is never `then error`.
117
133
  - Duplicate and competing specs use `when <Command>`; `when append` is for projection and
118
134
  automation triggers, and for a constraint the command's own validation would reject first.
@@ -130,7 +146,7 @@ target requirements.
130
146
  never `n/a` automatically. This matches `cratis-screenplay-specifications`, which also
131
147
  requires one rejection spec per concept rule. Business rules get one rejection spec each.
132
148
  - Persona Cannot lines are intent: each needs an executable gate plus a `then denied` spec whose
133
- caller carries that persona's roles and claims, else record a gap.
149
+ caller is a synthesized persona witness or an explicit gate fixture, else record a gap.
134
150
  - Descriptions are not rendered: a rule only in prose is unenforced in rendered scope; turn it
135
151
  into a rule layer, a spec or a recorded target requirement.
136
152
  - Prove projections with events (`given`/`when append`), not `given readmodel`; seed read models
@@ -149,7 +165,7 @@ target requirements.
149
165
  - Read models are a separate, equally mandatory pass: a model with dozens of command specs and no
150
166
  read-model spec is not scenario-complete. Population, then update or removal where an event
151
167
  supersedes a row.
152
- - The why behind each business rule is written down (slice `description`), not only the what.
168
+ - The why behind each business rule is written down (slice `documentation`), not only the what.
153
169
  - Good and bad forms of givens, outcomes and rejections: `references/scenario-examples.md`.
154
170
 
155
171
  ### Review questions
@@ -9,7 +9,7 @@
9
9
  - Worked example (`berth-reservations.md`, design mode)
10
10
 
11
11
  Write it **before** drafting specs, keep it in `.ai-work/screenplay/<model-slug>/coverage.md` (or the
12
- `STATE.md` beside it), and update it with the specs. Reviewers check it against the model. The Screenplay MCP does not yet report which specifications a command, read model, policy or constraint still lacks (Screenplay#390, open, not available): the matrix is that report, built by hand from the declarations.
12
+ `STATE.md` beside it), and update it with the specs. Reviewers check it against the model. Screenplay 4.127.0 MCP `find-specification-obligations` seeds the inventory (SPEC001–SPEC008), for command success, requirements, command/concept validation, effective authorization gates, value constraints, read models, projection removals and reaction outcomes. A met row proves matching authored presence, not full coverage or passing execution: the matrix still records domain judgments and scenario types the heuristic cannot infer.
13
13
 
14
14
  ## Cell values
15
15
  - `spec <Name>` - written; the name exists in the model.
@@ -13,6 +13,11 @@ Keep those lines: they state real intent and are never
13
13
  replaced by prose. The runnable counterpart, which holds no stored-state rule, is
14
14
  `invoicing-dues-example.md`; `scenario-examples.md` copies `ReversingAReceivedPayment` from here.
15
15
 
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
19
+ original compiled source is retained unchanged.
20
+
16
21
  ```screenplay
17
22
  // Scenario coverage design-mode example: stored-state rules of invoicing club dues (complete document).
18
23
  // Design mode: `reads` is PLAY0271 and `require` over a view is PLAY0268 at binding (the only
@@ -80,9 +80,12 @@ name them as unfinished.
80
80
  (commands: no other outcome; read-only queries: `then query <Query>` with `arguments`, no
81
81
  `result`, then `then denied`; or `when query` + `then denied`). See `RefusingASkipper`.
82
82
  An empty `given caller` block is the anonymous caller.
83
- - Specs cannot name a persona: write the caller as the roles and claims that persona's
84
- policies grant and name the spec after the persona. One denial per persona that can reach the
85
- screen but may not act. Derive fixtures from the effective Boolean gate: AND - isolate each
83
+ - Use `given caller as <Persona>` for one authenticated witness synthesized from
84
+ that persona's policies (4.127.0). Inspect the leftmost buildable `or` choice;
85
+ it does not represent every possible caller. Use explicit roles/claims for
86
+ anonymous or ownership fixtures, missing conjuncts, or refused synthesis.
87
+ One denial per persona that can reach the screen but may not act. Derive
88
+ fixtures from the effective Boolean gate: AND - isolate each
86
89
  missing conjunct; OR - a caller meeting any permitted alternative must succeed (a success
87
90
  spec, not `then denied`); denial only when the whole gate is false.
88
91
  - Ownership policies (`claim ... matches subject|<property>`): the denial gives the right role
@@ -184,7 +187,7 @@ name them as unfinished.
184
187
  ## 11. Evolution compatibility
185
188
  - Ask (when an event's contract changes): "Do facts already stored still mean the same?"
186
189
  - Compatible change (added property with a defined default): declare the new generation;
187
- specify behaviour on the new generation; write the default for old facts in `description`
190
+ specify behaviour on the new generation; write the default and its reason for old facts in `documentation`
188
191
  (Screenplay does not express upcasters). Change of meaning: a new event, with its own specs.
189
192
  - Renaming a stored event keeps an `id "<OldName>"` pin. A rename the brief requests is done in
190
193
  this pass by the identity owner (`cratis-screenplay-modeling-lifecycle`); never leave it silently unapplied.
@@ -29,7 +29,7 @@ Screenplay specifications.
29
29
  | Then (success) | every production with payload and `for` | "an event is produced" |
30
30
  | Then (refusal) | `then error "Invoice already settled"`, the rule's own message | `then error` with no message, or `then error ""` |
31
31
  | Then (denial) | `then denied` | `then error` for a caller who is not allowed |
32
- | Reason | the slice `description` says why the rule exists | the rule appears only in a spec title |
32
+ | Reason | slice `documentation` says why the rule exists | the rule appears only in a spec title |
33
33
 
34
34
  ## 1. Command: success, rule rejection and denial
35
35
  One spec for the success, one per rule (varying only the value the rule checks), one denial.
@@ -75,7 +75,7 @@ survive; ask what a caller who may not look sees.
75
75
  - Do not perfect a scenario in the room. Capture it with its open question and move on.
76
76
  - Every "what if...?" from anyone becomes a named candidate at once.
77
77
  - Record why a rule behaves as it does when the room explains it; the modeler puts it in the
78
- slice `description`.
78
+ slice `documentation`.
79
79
 
80
80
  ## Multi-role check (before leaving the room)
81
81
  - Domain expert: is this the right business behaviour and message?
@@ -4,7 +4,7 @@ The subsets themselves (what binds, what renders) are owned by `cratis-screenpla
4
4
  (its executable and renderable subset references); version facts by its `references/versions.md`. This file
5
5
  says what that means for writing specs. A form outside the chosen mode is never deleted from a
6
6
  design model: keep it and record the gap. The detailed Stage 4.24.x rows below
7
- retain historical admission evidence; current pins are Screenplay 4.125.0 / CLI
7
+ retain historical admission evidence; current pins are Screenplay 4.127.0 / CLI
8
8
  3.41.0. Run actual target admission instead of assuming old restrictions carry over.
9
9
  Typed example/override forms: `cratis-screenplay-specifications`
10
10
  `references/examples-and-routes.md`.
@@ -6,7 +6,7 @@
6
6
  { "kind": "skill-contains", "value": "Coverage matrix before any spec" },
7
7
  { "kind": "skill-contains", "value": "Once, idempotent, exactly once are different claims" },
8
8
  { "kind": "skill-contains", "value": "Unauthorized is never `then error`" },
9
- { "kind": "skill-contains", "value": "Screenplay#390" },
9
+ { "kind": "skill-contains", "value": "find-specification-obligations" },
10
10
  { "kind": "skill-contains", "value": "v4.68.0" },
11
11
  { "kind": "skill-contains", "value": "false PLAY0285" },
12
12
  { "kind": "skill-contains", "value": "One behaviour per spec" },
@@ -31,7 +31,7 @@ Lifecycle, modes and hand-offs: `cratis-screenplay-modeling-lifecycle`.
31
31
  Skip if the request already names the command origins (screens, reactions, outside systems),
32
32
  the decision behind each shown field, and how fresh each view must be. Otherwise ask, in one
33
33
  batch, only what is missing. Unattended: assume visibly, record each assumption in the phase
34
- report and the slice `description`, and continue.
34
+ report and slice `documentation`, and continue.
35
35
 
36
36
  1. **Origin of each action.** Is it (A) user-initiated only, (B) automated, (C) a mix, or
37
37
  started by a clock or outside system (schedule, webhook, feed)? Impact: separates screen
@@ -80,8 +80,8 @@ report and the slice `description`, and continue.
80
80
  standing in for a rule. Place each rule in its layer (`references/rule-layers.md`). A rule
81
81
  over stored state is written as `reads <View>` + `require ... message "..."` and marked
82
82
  **NOT enforced in the model today** in the slice `description`, with its target named (Arc
83
- `[ProtectedDecision]` + `DecisionRead<T>` on Arc 22.39.0+, not available in Stage-rendered
84
- apps; Chronicle DCB; or a constraint). Never copy state
83
+ `[ProtectedDecision]` + `DecisionRead<T>` on Arc 22.39.0+ (available to gap-fill
84
+ code with Stage 4.51.3's Arc 22.50.5/Chronicle 19.32.0); Chronicle DCB; or a constraint). Never copy state
85
85
  into the command as input or hide a rule in `handler` / hint prose; descriptions are not
86
86
  rendered (Stage#178). Fill the **refusal inventory**: success, each distinct refusal with
87
87
  layer and message, and the denied persona.
@@ -93,7 +93,16 @@ report and the slice `description`, and continue.
93
93
  `$context.occurred` or caller identity. No event-source id in the payload (it is the `for`);
94
94
  references to other instances are payload. No nullable property by default (a required value
95
95
  or a separate event). No PII on the identifier; one data subject per stream. Add a field only
96
- when something downstream needs it.
96
+ when something downstream needs it. At 4.127.0 personal values use bare `pii`,
97
+ operational secrets `secret`; declare processing use/basis/retention in `purpose`,
98
+ not a reason. An event-property `subject` may identify a different person from
99
+ the stream but is report-only, not runtime propagation. See command-surface
100
+ `references/compliance.md`.
101
+ Trace caller details to claims or a keyed single-result identity-source query
102
+ (built-in/claim/literal key, detail-independent effective gate, compatible result).
103
+ The `identity` block is authoring metadata; executable `$identity.<detail>` reads
104
+ remain PLAY0268. `scoped to` is opaque, not a detail reference; see command-surface
105
+ `references/context.md`.
97
106
  5. **Events or views?** For each value someone needs: was it decided or supplied (event), or
98
107
  can it be worked out from facts already recorded (view)? Test, anti-patterns and where the
99
108
  outputs of an automation go: `references/read-model-design.md` *Events or views*. Decided calculations (a quoted
@@ -120,7 +129,7 @@ report and the slice `description`, and continue.
120
129
  actor sees each state change's result. Beyond Level 1: `cratis-screenplay-ui-composition`.
121
130
  8. **Lineage pass.** Build the matrix in `references/field-lineage.md` from the `.play` files
122
131
  (read them), not from memory or an earlier summary. For each read model, write one line per
123
- contributing event in its StateView slice `description`: which fields it sets and why. An
132
+ contributing event in its StateView slice `documentation`: which fields it sets and why. An
124
133
  event with no reason does not belong in the view. A field without an origin is a gap: add
125
134
  the missing input or event field, or record an open question. Never invent a source.
126
135
  9. **Slice and continue** (`references/slicing.md`): state-transition table per entity; one
@@ -154,9 +163,14 @@ report and the slice `description`, and continue.
154
163
 
155
164
  - One command per `StateChange` slice (renderable: required, plus no `produces when`).
156
165
  - One business decision usually produces one event; a decision establishing several facts the
157
- business recognises separately may produce several (say why in the `description`).
166
+ business recognises separately may produce several (say why in `documentation`).
158
167
  - Copy an identity into an event payload only when a consumer needs it as a value.
159
- - Keep durable design rationale in slice `description` text, not `//` comments.
168
+ - Keep the one-line summary in `description`, including short status markers such as
169
+ **NOT enforced in the model today** (with its target) or **ASSUMED**; record durable
170
+ reasoning, assumptions, causes and rejected alternatives in fenced Markdown
171
+ `documentation` on the module, feature, slice, command, event, read model or reaction, not `//` comments or disconnected notes. These are report-only, not
172
+ enforcement. Read [model reasoning](references/model-reasoning.md) for owners,
173
+ syntax, folder merge and PLAY0558/0559.
160
174
  - Rule coverage: for each value carrying a rule, list every path that sets it
161
175
  (`references/slicing.md`). A constraint on a claim covers every event setting that claim;
162
176
  value invariants live in the concept so they travel; command-level conditions are reviewed
@@ -190,7 +204,7 @@ Slice design is done when these hold; otherwise report what is open.
190
204
  denied persona); every gated command and query has a `then denied` row.
191
205
  - [ ] Every event is past tense, a specific change, and consumed or justified.
192
206
  - [ ] Every read model has a consumer and, when the scope is executable, one unambiguous key (keyed queries all using the same `by` property).
193
- - [ ] Every StateView `description` gives a reason per contributing event; every read-model
207
+ - [ ] Every StateView's `documentation` gives a reason per contributing event; every read-model
194
208
  field and screen field is traced; every `from` event sets a field.
195
209
  - [ ] No `screen` without `data` or `action`; every acting screen has `data` or a stated
196
210
  exemption.
@@ -16,7 +16,7 @@ and each persona that must be denied becomes a `given caller` fixture. Build it
16
16
  ## Command card
17
17
 
18
18
  Fill one card per command before (or while) writing the slice. Keep it in the phase report;
19
- durable rationale goes in the slice `description`.
19
+ durable rationale goes in fenced Markdown slice `documentation`.
20
20
 
21
21
  ```text
22
22
  Command: <ImperativeBusinessName> (one decision)
@@ -76,7 +76,8 @@ Rules for filling it:
76
76
  as a gap. Persona description text is intent only.
77
77
  - A refusal that depends on stored state is a row marked **NOT enforced in the model today**
78
78
  with its target (Arc `[ProtectedDecision]` + `DecisionRead<T>` where Arc 22.39.0 or later is
79
- available, which Stage-rendered apps are not; Chronicle DCB, or a
79
+ available, including Stage 4.51.3's rendered package set for gap-fill, not emitted
80
+ protection; Chronicle DCB, or a
80
81
  constraint). It still gets a spec row, because the intended behaviour is the contract.
81
82
  - A decided refusal never goes to open questions: it goes here, then to scenarios.
82
83
  - A refusal message is a fact of the design; keep the wording identical in the rule, the
@@ -101,7 +102,7 @@ Rules for filling it:
101
102
  | AssignLocker | caller is not an attendant | `authorize IsAttendant` | denied: Customer | RefusingACustomerAssigningALocker |
102
103
  | AssignLocker | locker already has a request | constraint `OneRequestPerLocker` | "The locker is already assigned" | AppendingASecondAssignmentOfALocker (`when append`: the command's own `require` would reject first) |
103
104
  | AssignLocker | request already has a locker | constraint `OneLockerPerRequest` | "The request already has a locker" | gap |
104
- | AssignLocker | locker is not free | `reads` + `require`, NOT enforced today | "The locker is not free"; target: `[ProtectedDecision]` (Arc 22.39.0+; unavailable in Stage-rendered apps, so a capability gap there) or DCB on the locker stream | RejectingASecondAssignmentOfALocker (pins the message; blocked until the target exists) |
105
+ | AssignLocker | locker is not free | `reads` + `require`, NOT enforced today | "The locker is not free"; target: `[ProtectedDecision]` (Arc 22.39.0+; available to Stage 4.51.3 gap-fill, not emitted protection) or DCB on the locker stream | RejectingASecondAssignmentOfALocker (pins the message; blocked until the target exists) |
105
106
  | AssignLocker | request is not waiting | `reads` + `require`, NOT enforced today | "The request is not waiting for a locker" | gap (same) |
106
107
  | LockerById, ListLockers | caller is anonymous | module `authorize IsAuthenticated` | denied: no caller | RefusingAnAnonymousLockerLookup, RefusingAnAnonymousLockerList |
107
108
  | RequestById | caller is anonymous | module `authorize IsAuthenticated` | denied: no caller | RefusingAnAnonymousRequestLookup |
@@ -124,4 +125,5 @@ not been asked the refusal questions.
124
125
  - Refusals recorded as prose in the `description` with no layer and no spec row.
125
126
  - Personal data or secrets as command input: values are by default recorded in the causation chain, so treat them as permanent
126
127
  (retention can be configured in newer Chronicle; verify it, never audit secrets).
127
- Mark the concept `@pii` or record the need; never put `@pii` on the identifier's concept.
128
+ Mark concepts bare `pii` for personal data or `secret` for operational secrets,
129
+ never on the identifier; declare use/basis/retention in a purpose, not a reason.
@@ -33,7 +33,7 @@ Those are the portable sources. The event-source id is the `for` value, not a pr
33
33
  an event field (same-named fields map automatically - AutoMap is on; its matching differs between flat and scoped projections, see `read-model-design.md` "Building it");
34
34
  `$eventSourceId` (the instance identity); a literal (status words); a counter or arithmetic;
35
35
  a join on another event stream; children for collections. A reducer is opaque: write its
36
- lineage in the slice `description`. A read model built by a query `performer` (no events)
36
+ lineage in slice `documentation`. A read model built by a query `performer` (no events)
37
37
  has lineage outside the model; say where.
38
38
 
39
39
  **Screen field** - from the query result named in `data ... via query`. A screen showing a
@@ -74,7 +74,7 @@ Filled for `worked-example.md`:
74
74
 
75
75
  ## The reason line per contributing event
76
76
 
77
- The matrix is the audit; the durable record is the StateView slice `description`: one line per
77
+ The matrix is the audit; the durable record is StateView slice `documentation`: one line per
78
78
  contributing event saying which fields it sets and why. Write it as a tagged text block in a
79
79
  real model (a bare fence warns with `PLAY0397`). `worked-example.md` uses one-string
80
80
  descriptions only so that it stays a single compiling fence.