@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
@@ -0,0 +1,87 @@
1
+ <!-- Copyright (c) Cratis. All rights reserved. -->
2
+ <!-- Licensed under the MIT license. See LICENSE file in the project root for full license information. -->
3
+
4
+ # Keep reasoning on the model
5
+
6
+ Use `description` for a short summary and `documentation` for assumptions,
7
+ boundaries, trade-offs and rejected alternatives. Put reasoning on the declaration
8
+ it explains, not in comments or disconnected session notes. Modules, features,
9
+ slices, commands, events, read models and reactions accept one nonempty block,
10
+ directly in their body (not beneath a reaction trigger). Queries, personas and other
11
+ declarations do not accept `documentation`: keep their intent in `description` (a
12
+ query's ordering, "oldest first", for example). A short status marker such as **NOT
13
+ enforced in the model today** or **ASSUMED** stays in `description`, where a reader
14
+ sees it first; the reasoning behind it goes in `documentation`:
15
+
16
+ ````screenplay
17
+ module Billing
18
+ documentation
19
+ ```markdown
20
+ ## Boundary
21
+ Billing records agreed amounts; payment delivery belongs elsewhere.
22
+ ```
23
+ feature Amounts
24
+ documentation
25
+ ```markdown
26
+ Keep the agreed amount, not a running total.
27
+ ```
28
+ slice StateChange RecordAmount
29
+ documentation
30
+ ```markdown
31
+ A recorded amount is a decision, not a recalculated view.
32
+ ```
33
+ command RecordAmount
34
+ documentation
35
+ ```markdown
36
+ The caller supplies the agreed amount.
37
+ ```
38
+ recordId String identifier
39
+ amount Int
40
+ produces AmountRecorded
41
+ for recordId
42
+ amount = amount
43
+ event AmountRecorded
44
+ amount Int
45
+ specification RecordingAnAmount
46
+ description "Witnesses that the agreed amount is retained"
47
+ when RecordAmount amount = 10
48
+ recordId = "amount-1"
49
+ then AmountRecorded amount = 10
50
+ slice StateView AmountHistory
51
+ readmodel AmountView
52
+ documentation
53
+ ```markdown
54
+ This view is display state, not an atomic decision input.
55
+ ```
56
+ id String
57
+ amount Int
58
+ projection AmountHistory => AmountView
59
+ from AmountRecorded
60
+ id = $eventSourceId
61
+ amount = amount
62
+ query AmountById => AmountView optional
63
+ by id String
64
+ slice Automation ObserveAmount
65
+ reaction ObserveAmount
66
+ documentation
67
+ ```markdown
68
+ Observation does not certify an exactly-once external effect.
69
+ ```
70
+ when AmountRecorded
71
+ ````
72
+
73
+ A specification accepts a `description` naming the behavior it witnesses, not
74
+ `documentation`; longer reasoning belongs to its slice. Projections and screens
75
+ do not accept documentation. `documentation String` remains a typed property
76
+ where properties are allowed; bare `documentation` starts metadata.
77
+
78
+ Both metadata fields are report-only (PLAY0270): no executable bytes,
79
+ `modelRevision` or ESM version change, no rule enforcement or rendered code.
80
+ Canonical printing retains documentation on its owner; source identity changes. MCP `declaration-details` summary exposes
81
+ `description` and `documentation` wherever supported. Folder merge keeps the
82
+ first module/feature block: identical copies are accepted, conflicting copies
83
+ warn PLAY0559. Malformed, empty or repeated blocks report PLAY0558; events retain
84
+ PLAY0477. These diagnostics have no automatic repair; choose the owning text.
85
+
86
+ Authority: Screenplay v4.127.0 `slices.md` and `specifications.md`. The complete
87
+ model above validates and its specification passes on standalone 4.127.0.
@@ -28,7 +28,7 @@ is adapted with the agreement of Martin Dilger and Nebulit GmbH.
28
28
  | `eventmodeling-identifying-outputs/SKILL.md`: events vs read models test, recalculated-state anti-pattern, processor outputs categorized (new event, view update, notification) | `references/read-model-design.md` "Events or views" | shared with TrogonStack's version, including the processor-output categories (row above); adapted closely; the "independent means event" and "no computed fields" rows dropped because decided calculations are facts in Screenplay |
29
29
  | `eventmodeling-identifying-outputs/SKILL.md` Step 5a/5c: enumerate consumers, one component one read model, homogeneous list is one component, wide-fan-in versus cheap fields | `references/read-model-design.md` "Components" | adapted closely; "always split" softened to "split when you can name the consequence" (existing decision); screen copies become one `data` line per component |
30
30
  | `eventmodeling-identifying-outputs/SKILL.md` Step 5d: build read models from the screen's field mappings, not from its title or a summary | `references/read-model-design.md` "Components"; `references/field-lineage.md` | adapted closely |
31
- | `eventmodeling-identifying-outputs/SKILL.md` Step 5h.4, 5i: event-to-field reasoning note, per-node verification result list | `SKILL.md` step 8; `references/read-model-design.md` "Checks before handing off"; `references/field-lineage.md` | adapted closely; the note lives in the StateView slice `description` |
31
+ | `eventmodeling-identifying-outputs/SKILL.md` Step 5h.4, 5i: event-to-field reasoning note, per-node verification result list | `SKILL.md` step 8; `references/read-model-design.md` "Checks before handing off"; `references/field-lineage.md` | adapted closely; the reasoning note lives in StateView slice `documentation` |
32
32
  | `eventmodeling-identifying-outputs/SKILL.md` lines 378-379: before completion re-read every read model and recheck each field and every reason note (roll-ups, additions) | `references/read-model-design.md` "Checks before handing off" | adapted closely; Cratis named-consequence threshold kept instead of "always split" |
33
33
  | `eventmodeling-identifying-outputs/SKILL.md` Interview: calculated fields confirmation wording | `SKILL.md` *Interview phase* question 3 | adapted closely |
34
34
  | `eventmodeling-identifying-inputs/SKILL.md`: automation level and outside-trigger questions, user versus processor commands marked, conditional input pattern, processor failure/retry stated | `SKILL.md` *Interview phase* question 1; `references/command-inventory.md` | adapted closely; `[USER]`/`[AUTO]` kept as plain classification |
@@ -127,7 +127,7 @@ it stays.
127
127
  (worklists, status awaiting an outside answer); one-shot otherwise. Design mode only
128
128
  (PLAY0268). If access can be revoked mid-session, record that the target re-checks per emission.
129
129
  - Never model paging or page size (no syntax, Screenplay#140). State the order in the query
130
- `description` ("oldest first"); an unbounded list is a review question.
130
+ `description` ("oldest first"; queries do not accept `documentation`); an unbounded list is a review question.
131
131
  - A gated keyed query needs its own denial spec.
132
132
 
133
133
  Never drop a list query from a design model just to make it bind; record the capability gap.
@@ -260,7 +260,7 @@ module Berths
260
260
 
261
261
  ## Checks before handing off
262
262
 
263
- - The StateView slice `description` gives, per contributing event, the fields it sets and why
263
+ - StateView slice `documentation` gives, per contributing event, the fields it sets and why
264
264
  (see `LockerBoard` in `worked-example.md`); extend it whenever a `from` is added. Shape of
265
265
  the note: `BerthBooked sets bookingId, status="booked": the view's creation event; the booking
266
266
  does not exist before it.` / `BoatArrived sets status="arrived", arrivedAt: the only
@@ -9,7 +9,8 @@ domain consequence.
9
9
  - Does this command apply in every state and set most of the entity's fields? That is a form:
10
10
  which business reasons hide behind it? What does a person decide with each field?
11
11
  - Does a command input carry a secret or personal value (by default the causation chain keeps it; retention is configurable, verify it)?
12
- Mark the concept `@pii` or record the need for a not-audited marking.
12
+ Mark the concept bare `pii` for personal data or `secret` for an operational
13
+ secret; inspect declared purpose coverage, not just the reason. Never protect an identifier.
13
14
  - Does this optional event property hide two situations, or is it an optional detail?
14
15
  - Does an event exist for a derived condition? Only when a domain expert names it and something
15
16
  reacts to it; merge causes only when they mean the same to the business.
@@ -14,18 +14,18 @@ rendered code (Stage#178): a rule that exists only in prose is unenforced in ren
14
14
  | stored state (record exists, balance, current status) | `reads <View>` + `require <expr> message "..."` | stated intent, **NOT enforced in the model today** (PLAY0268/0271 at binding are expected in design mode; Screenplay#129/#209). Name the target: Arc `[ProtectedDecision]` + `DecisionRead<T>` (Arc 22.39.0 or later), Chronicle DCB (`concurrency` scope), or a constraint |
15
15
 
16
16
  An unguarded materialized read is unsafe for a protected decision; a guarded read is the
17
- supported route. Availability: `[ProtectedDecision]` and `DecisionRead<T>` need Arc 22.39.0 or
18
- later and are **not available in Stage-rendered apps**, whose scaffold pins Arc 22.25.0 (Stage
19
- 4.24.0); never edit the managed dependency files to get them. For rendered scope, record a
20
- capability gap (or a separately verified compatible enforcement path, such as a constraint or
21
- a Chronicle DCB scope) and keep the rule as NOT enforced. Forbidden: caller-supplied copies of state in `require`, boolean attestation
17
+ supported route. Availability: `[ProtectedDecision]` and `DecisionRead<T>` exist in
18
+ Stage 4.51.3's Arc 22.50.5/Chronicle 19.32.0 package set, but Stage does not emit
19
+ protected decisions. Gap-fill must use an admitted projection/key shape and active
20
+ unit-of-work enrollment; do not edit managed dependencies. Keep the `.play` rule
21
+ NOT enforced until its target enforcement is separately verified. Forbidden: caller-supplied copies of state in `require`, boolean attestation
22
22
  inputs (`confirmsX == true`), rules in `handler` / implementation-hint prose.
23
23
 
24
24
  ## Authorization is executable
25
25
 
26
26
  Persona Does/Reads/Cannot text is intent. Every Cannot line resolves to an `authorize` gate
27
- (policy or ownership claim) plus a `then denied` spec whose `given caller` carries the roles
28
- and claims standing for that persona; otherwise record a gap. Every command and query under an
27
+ (policy or ownership claim) plus a `then denied` spec using `given caller as <Persona>` or an explicit
28
+ caller for the effective gate; otherwise record a gap. Every command and query under an
29
29
  inherited module/feature `authorize` gets its own `then denied` spec. Ownership gates need a
30
30
  second caller with another claim value.
31
31
 
@@ -33,9 +33,10 @@ second caller with another claim value.
33
33
 
34
34
  Command property values are, by default, recorded in the causation chain of the events they
35
35
  produce, so treat them as permanent. Newer Chronicle versions can omit causation properties
36
- (`CausationPropertyRetention.Omit`, Chronicle v19.32.0); rendered apps pin Chronicle 19.8.1.
36
+ (`CausationPropertyRetention.Omit`, Chronicle v19.32.0); Stage 4.51.3 rendered apps pin 19.32.0.
37
37
  Verify the actual auditing and retention configuration before relying on omission, and never
38
- audit secrets. Never mark the identifier's
39
- concept `@pii`; use a surrogate `Uuid` identity and carry the personal value as a `@pii`
40
- property. Bearer tokens, magic links and signed URLs are never facts (record a keyed hash or
38
+ audit secrets. Classify personal values as bare `pii` and operational secrets as
39
+ `secret` on their concepts, never the identifier concept. Use a surrogate identity
40
+ and protected payload (PLAY0515). Processing use/basis/retention is a `purpose`,
41
+ not a reason; see command-surface `references/compliance.md`. Bearer tokens, magic links and signed URLs are never facts (record a keyed hash or
41
42
  reference).
@@ -23,7 +23,7 @@ step at the end: design each behaviour as its slice, then audit the set.
23
23
  | `Translate` | captures, translated events | the integration (`CarrierManifests`) | see `cratis-screenplay-automations-and-translations` |
24
24
 
25
25
  Screenplay allows several commands or read models in one slice; prefer splitting unless the
26
- behaviour is genuinely one (and say why in the `description`).
26
+ behaviour is genuinely one (and say why in `documentation`).
27
27
 
28
28
  ## Slice dependencies
29
29
 
@@ -142,8 +142,8 @@ result in every row and no refusal anywhere, whose event restates most of the en
142
142
  relocated).
143
143
  4. Apply rule coverage (below) to each new path.
144
144
  5. If the business treats a multi-value data-entry correction as one act, keep one correction
145
- command named for the correction (never `Update`), with the reason in the slice
146
- `description`; rule coverage still applies.
145
+ command named for the correction (never `Update`), with the reason in slice
146
+ `documentation`; rule coverage still applies.
147
147
 
148
148
  A repeated-field event is a review signal; it is major only when business meaning is lost, a
149
149
  rule is bypassed or consumers become ambiguous. Historical generations repeat prior shape on
@@ -13,9 +13,15 @@ complete givens) so they are the right form once binding is possible.
13
13
  Lineage matrix: `field-lineage.md`. State-transition table and rule coverage: `slicing.md`.
14
14
  Per-command refusal inventory: `command-inventory.md`.
15
15
 
16
- The per-event reason lines in each StateView `description` are the lineage record
17
- (`field-lineage.md`). Multi-line descriptions use a tagged ` ```text ` fence in a real model;
18
- they are written as one string here so this document stays a single compiling fence.
16
+ This historical compiled example keeps per-event reasoning in StateView
17
+ `description` strings. For current 4.127.0 authoring, keep descriptions as summaries
18
+ and record lineage reasoning in fenced Markdown `documentation` (`field-lineage.md`).
19
+ The historical source below stays unchanged; it is not the current placement recipe.
20
+
21
+ The excerpt's Stage availability note is historical (Stage 4.24.x, Arc 22.25.0).
22
+ Stage 4.51.3 pins Arc 22.50.5/Chronicle 19.32.0, so protected-read APIs are available
23
+ to gap-fill; this neither admits these `.play` rules nor proves target protection.
24
+ The original compiled excerpt is retained unchanged.
19
25
 
20
26
  ```screenplay
21
27
  domain Parcelpoint.Lockers
@@ -37,7 +37,7 @@ The update follows `commands.md`, `events.md`, `types.md` and
37
37
  `specifications.md` at that main commit (after v4.52.0). This pass compiles the
38
38
  changed examples; it does not rerun the reference runner.
39
39
 
40
- Current specification syntax follows Screenplay v4.125.0 `specifications.md`;
40
+ Current specification syntax follows Screenplay v4.127.0 `specifications.md`;
41
41
  older probes in the table remain historical. Pins: `cratis-screenplay-toolchain`
42
42
  `references/versions.md`. Compile commands check source, not reference execution.
43
43
  Use `screenplay test` or MCP `run-specifications` for V4; Stage/target tests are
@@ -95,13 +95,27 @@ Unsupported is not passed. Report it as "needs a target", not as green. "Specifi
95
95
  and "bound" are never "passing": run the reference CLI/MCP route or the owning
96
96
  target tests, and name the engine, version and expected/discovered selection.
97
97
 
98
+ ## Descriptions, persona callers and case tables
99
+
100
+ Use one `description "<rule or behavior>"` (or a fenced `text` description) to
101
+ name what the specification witnesses. It is report-only (PLAY0270), changing
102
+ neither execution nor ESM bytes. Specifications do not accept `documentation`;
103
+ put longer assumptions and rejected alternatives on the owning slice's fenced
104
+ Markdown `documentation` block.
105
+
106
+ `given caller as <Persona>` expands to one authenticated policy witness before
107
+ binding. Named `parameter`/`case` tables share steps and read values as
108
+ `case.<parameter>`; each case runs independently as `<Specification>_<Case>`.
109
+ Read [persona callers and case tables](references/persona-callers-and-cases.md)
110
+ for synthesis refusals, selection, provenance and a complete passing model.
111
+
98
112
  ## The vocabulary
99
113
 
100
114
  | Construct | Meaning |
101
115
  | --- | --- |
102
116
  | `given <EventType>` | prior state, established by replaying events before the action |
103
117
  | `given readmodel <ReadModelType>` | prior read-model state, established directly — a **complete** instance including its identifier |
104
- | `given caller` | the caller: `authenticated`, `role "<r>"`, repeatable `claim "<type>" = "<value>"`; empty means unauthenticated |
118
+ | `given caller` / `given caller as <Persona>` | explicit caller (`authenticated`, roles, claims; empty means anonymous), or an authenticated synthesized persona witness |
105
119
  | `when <CommandType>` | run a command |
106
120
  | `when append <EventType>` | append one event: constraints and projections run, the command does not; reactions run only from ESM v6, where `then` lists what followed |
107
121
  | `when query <Query>` | perform a query with the argument values beneath it (v4.48.0) |
@@ -146,7 +160,7 @@ Rules the binder enforces:
146
160
  - **`then denied` stands alone**: not with events, errors or state assertions
147
161
  (`PLAY0388`). For a query, pair it with one `then query` that has `arguments`
148
162
  and no `result`.
149
- - **Authorized commands and queries need `given caller`** (`PLAY0389`). The runner
163
+ - **Authorized commands and queries need `given caller` or `given caller as <Persona>`** (`PLAY0389`). The runner
150
164
  never invents a caller.
151
165
  - **`null` only in optional read-model values.** A `null` in a command or event
152
166
  value is `PLAY0350`: an optional fact is a separate event.
@@ -168,7 +182,7 @@ the one-rejection rule (`PLAY0273`) are reported only when the model binds, so
168
182
  - **Rejections:** `then error "<message>"` matches the message whatever the rule's
169
183
  validation severity; no form asserts severity. Bare `then error` never matches
170
184
  a denial. Quote a localized key: `then error "$strings.invoices.reasonRequired"`.
171
- The grammar takes only quoted messages here, never an unquoted `$strings` token
185
+ Besides a String `case.<parameter>`, the grammar takes only quoted messages here, never an unquoted `$strings` token
172
186
  (unlike a rule's `message` operand). The reference runner compares the symbolic key
173
187
  and requires the rejection to carry the string-key marker; it never loads
174
188
  translated text; resolving the key is the realization's job.
@@ -197,7 +211,10 @@ Read [references/reactions-and-cascades.md](references/reactions-and-cascades.md
197
211
 
198
212
  Use typed `example` declarations for repeated event/command/read-model values;
199
213
  step overrides keep the action/outcome visible and carry authored/example/override
200
- provenance. Event `stream`/`no stream` assertions bind as ESM v8; typed `for` and
214
+ provenance. Event examples can carry routes, replaced as a whole by a step.
215
+ Redelivery locators may state `stream` or `no stream` to select one definitely
216
+ matching given occurrence with no undecided candidates (PLAY0543); redelivery
217
+ remains authoring-only. Event `stream`/`no stream` assertions bind as ESM v8; typed `for` and
201
218
  stream ids are not guessed. Read [examples and routes](references/examples-and-routes.md).
202
219
 
203
220
  `given operation ... fails`, `then operation` and `then compensated` describe
@@ -261,7 +278,7 @@ For view specifications:
261
278
  ## Verify
262
279
 
263
280
  - [ ] Validate the complete root with warnings as errors, naming tool/version.
264
- Current standalone pin: 4.125.0. Run specification examples through
281
+ Current standalone pin: 4.127.0. Run specification examples through
265
282
  `screenplay test`; expected unadmitted syntax reports unbound, not passed.
266
283
  - [ ] Executable diagnostics are clean too: `PLAY0350`, `PLAY0352`, `PLAY0388`,
267
284
  `PLAY0389` and `PLAY0273` are only reported at binding.
@@ -8,6 +8,7 @@
8
8
  - Typed examples
9
9
  - Effective values
10
10
  - Event routes
11
+ - Redelivery locators
11
12
  - Operation and recovery intent
12
13
 
13
14
  ## Typed examples
@@ -85,9 +86,74 @@ it. `then ... no stream` expects no route; no route in a then is a wildcard.
85
86
  steps replace the entire route, independently of `for`; an inherited route
86
87
  cannot be changed back to a wildcard. Literal compatibility/route contradiction
87
88
  checks use resolved source/stream types, not guessed text (PLAY0547–PLAY0551).
89
+ At Screenplay 4.127.0, route literals must be nonempty, well-formed NFC text
90
+ (refused, not normalized); Double integer ids are within ±(2^53−1), while Exact
91
+ has no such bound but remains unadmitted. Invalid specification routes report
92
+ PLAY0549. Contradictions compare canonical scalar ids and every composite part,
93
+ so UUID casing is immaterial. Composite mappings supply each named part once,
94
+ using literals only; encoding escapes `%`/`|` and preserves declaration order.
95
+ Source: v4.127.0 `event-sources.md`, `specifications.md`, `diagnostics.md`.
96
+
88
97
  CLI 3.41.0 rendering rejects versions above v7 before planning, even though
89
98
  source compilation and reference routing pass.
90
99
 
100
+ Command and read-model examples refuse routes (PLAY0526). Effective role and
101
+ `for` checks use the inherited or replaced route: inherited `no stream` on a
102
+ `given`/append is PLAY0547; incompatible destination/route pairs are PLAY0550,
103
+ and contradictory expectations PLAY0551. Declaration checks still run on unused
104
+ examples and routes overridden at every use. MCP route rows retain the origin
105
+ (authored/example/override), with the replaced whole route on the stream/no-stream
106
+ row and individual lineage on id parts.
107
+
108
+ ## Redelivery locators
109
+
110
+ `when redelivered <Event> to <Reaction>` may contain a route, using the same scalar
111
+ or complete composite `streamId` shape as event steps. No route is a wildcard;
112
+ `no stream` selects the unrouted given. Compare effective, example-expanded givens.
113
+ Every `for`, payload and route comparison is true, false or unknown: a definite
114
+ mismatch excludes a candidate even when another comparison is unknown. Selection
115
+ needs exactly one definitely matching candidate and **no undecided candidates**
116
+ (PLAY0543). Equal duplicate givens remain separate candidates. Narrow with `for`,
117
+ values, `stream` or `no stream`; do not guess an unknown value. A locator's `for`
118
+ is optional but typed against the routed source when present.
119
+
120
+ This complete syntax-only model validates on 4.127.0; `screenplay test` reports
121
+ PLAY0268 for redelivery, not a passing scenario:
122
+
123
+ ```screenplay
124
+ eventsource Account
125
+ identifier String
126
+ stream Transactions
127
+ streamId String
128
+ module Accounts
129
+ feature Recovery
130
+ slice Automation Observe
131
+ event Recorded
132
+ amount Int
133
+ reaction Observer
134
+ when Recorded
135
+ example FirstPartition : Recorded
136
+ for "account-1"
137
+ stream Account.Transactions
138
+ streamId = "first"
139
+ amount = 10
140
+ specification RedeliveringTheSecondPartition
141
+ given FirstPartition
142
+ given FirstPartition
143
+ stream Account.Transactions
144
+ streamId = "second"
145
+ when redelivered Recorded to Observer
146
+ stream Account.Transactions
147
+ streamId = "second"
148
+ then no events
149
+ ```
150
+
151
+ The second given replaces the example's **entire** route, independently of `for`,
152
+ not just its id. PLAY0548 is command-action-only, never a locator route error;
153
+ malformed routes use PLAY0547 and resolution/key-shape errors PLAY0549. MCP labels
154
+ locator fixtures `whenRedeliveredEvent` with route-origin rows. Route admission
155
+ alone does not admit redelivery or `then no events`.
156
+
91
157
  ## Operation and recovery intent
92
158
 
93
159
  Operation failure/request/compensation forms are authoring-only (PLAY0268):
@@ -100,4 +166,4 @@ remain unadmitted; they are not executed append scenarios. Forms, matching,
100
166
  acknowledgement and their whole-model refusal boundary are in
101
167
  captures-and-reactions `references/refusals-and-redelivery.md`.
102
168
 
103
- Authority: Screenplay `v4.125.0:Documentation/screenplay/specifications.md`.
169
+ Authority: Screenplay `v4.127.0:Documentation/screenplay/specifications.md`.
@@ -0,0 +1,117 @@
1
+ <!-- Copyright (c) Cratis. All rights reserved. -->
2
+ <!-- Licensed under the MIT license. See LICENSE file in the project root for full license information. -->
3
+
4
+ # Persona callers and named case tables
5
+
6
+ ## Contents
7
+
8
+ - Persona callers
9
+ - Case tables
10
+
11
+ Authority: Screenplay v4.127.0 `specifications.md`, `personas.md` and `mcp/reference.md`.
12
+
13
+ ## Persona callers
14
+
15
+ `given caller as <Persona>` has no body and cannot coexist with an explicit
16
+ `given caller`. It expands before binding into an ordinary authenticated caller
17
+ satisfying every persona policy; persona names remain outside ESM bytes. Required
18
+ atoms are collected first. Policies are visited in declared order, depth first,
19
+ left to right: an already satisfied `or` adds nothing, otherwise the leftmost
20
+ buildable alternative wins. Operand order matters. This witnesses one minimal
21
+ caller, not every caller fitting the persona.
22
+
23
+ Synthesis refuses no policies, any policy containing `not` (including
24
+ `not authenticated`), inline/file policy code, and required non-literal claims.
25
+ An `or` may skip an unsupported claim alternative. The role-URI claim type
26
+ `http://schemas.microsoft.com/ws/2008/06/identity/claims/role` is never synthesized;
27
+ use role atoms, not that claim. Use explicit `given caller` when synthesis is
28
+ refused (binding PLAY0573), never infer a runtime allow/deny. Malformed references,
29
+ body lines or unknown top-level personas report PLAY0572.
30
+
31
+ Hover or `declaration-details` (`kind: "Persona"`, `view: "caller"`) shows the
32
+ chosen caller and policy contributions or refusal. Opt-in `personas` completeness
33
+ checks report personas gating nothing (PLAY0574), gates denying every known
34
+ synthesized persona (PLAY0575), and unpinned buildable alternatives (PLAY0576).
35
+ Unsynthesizable/undecidable callers are unknown, not denials. A persona-backed
36
+ denial still uses `then denied`; a visitor persona is not an anonymous caller.
37
+
38
+ ## Case tables
39
+
40
+ Use tables for validation matrices whose steps stay the same. Rows are **cases**,
41
+ not examples: `example` means a named typed fixture. This complete model's five
42
+ expanded specifications pass in the 4.127.0 reference runner:
43
+
44
+ ```screenplay
45
+ policy IsAccountant
46
+ require role "Accountant"
47
+ policy IsVisitor
48
+ require role "Visitor"
49
+ persona Accountant
50
+ policy IsAccountant
51
+ persona Visitor
52
+ policy IsVisitor
53
+ module Billing
54
+ feature Invoices
55
+ slice StateChange RecordAmount
56
+ command RecordAmount
57
+ recordId String identifier
58
+ amount Int
59
+ authorize IsAccountant
60
+ validate
61
+ require amount > 0
62
+ message "The amount must be positive"
63
+ produces AmountRecorded
64
+ for recordId
65
+ amount = amount
66
+ event AmountRecorded
67
+ amount Int
68
+ specification RecordingAmounts
69
+ description "An accountant can record a positive amount"
70
+ parameter amount Int
71
+ case Small amount = 10
72
+ case Large amount = 100
73
+ given caller as Accountant
74
+ when RecordAmount amount = case.amount
75
+ recordId = "amount-1"
76
+ then AmountRecorded amount = case.amount
77
+ specification RejectingAmounts
78
+ parameter amount Int
79
+ parameter reason String
80
+ case Zero
81
+ amount = 0
82
+ reason = "The amount must be positive"
83
+ case Negative
84
+ amount = -1
85
+ reason = "The amount must be positive"
86
+ given caller as Accountant
87
+ when RecordAmount amount = case.amount
88
+ recordId = "amount-1"
89
+ then error case.reason
90
+ specification RefusingAVisitor
91
+ given caller as Visitor
92
+ when RecordAmount amount = 10
93
+ recordId = "amount-1"
94
+ then denied
95
+ ```
96
+
97
+ Every case assigns every typed parameter exactly once, inline or indented.
98
+ Values are concrete literals or whole single-line objects/lists, never mappings,
99
+ `$` expressions, examples or other case references. `optional` permits `null`,
100
+ not omission or a default; ordinary command/event null restrictions still apply.
101
+
102
+ `case.<parameter>` fills a whole value position, after example expansion and step
103
+ overrides. It works in step assignments, generated fixtures, query arguments and
104
+ results, `for`, absent read-model keys and scalar `streamId` mappings in a restated
105
+ route. Types must match (concept/underlying primitive in either direction is
106
+ allowed); optional cannot feed required. `then error case.reason` needs String.
107
+ Callers, redelivery locators, clocks, declaration names, step kinds and members
108
+ inside structured literals cannot use case values: pass the whole object/list.
109
+
110
+ Each case expands independently to `<Specification>_<Case>`, in case order,
111
+ inheriting the description, with the same executable bytes as hand-expanded
112
+ specifications. Derived names must not collide in scope. Failures name the case.
113
+ Selecting a table address in `run-specifications` or `screenplay test --filter`
114
+ selects all cases; a derived address selects one. MCP specification `cases` pages
115
+ effective addresses and values; `find-fixtures` accepts `case` and retains
116
+ `table`, `case`, `caseParameter` provenance. C# singular `Expand` refuses tables
117
+ (PLAY0589); use `SpecificationExamples.ExpandAll`.
@@ -41,7 +41,7 @@
41
41
  },
42
42
  {
43
43
  "kind": "skill-contains",
44
- "value": "**Authorized commands and queries need `given caller`**"
44
+ "value": "**Authorized commands and queries need `given caller` or `given caller as <Persona>`**"
45
45
  },
46
46
  {
47
47
  "kind": "skill-contains",
@@ -28,8 +28,8 @@ Require target evidence that the check ran: a concurrent first-append scenario a
28
28
  Chronicle, asserting one append wins, one is rejected, and `IAppendResult.ConcurrencyCheckPerformed`
29
29
  is `true` (a skipped check and a passing one look identical otherwise; a current client against
30
30
  an older kernel always reads `false`). This was source- and documentation-inspected, not
31
- concurrency-tested here. Stage-rendered apps pin Chronicle client 19.8.1: do not assume these
32
- APIs exist there; confirm the package version before recommending them.
31
+ concurrency-tested here. Stage 4.51.3 rendered apps pin Chronicle client/kernel 19.32.0
32
+ and Arc 22.50.5; the APIs exist for gap-fill, not as automatically rendered enforcement.
33
33
 
34
34
  ## Verified product sources
35
35
 
@@ -38,7 +38,7 @@ APIs exist there; confirm the package version before recommending them.
38
38
  | Screenplay | v4.68.0 (`79801bf`) | ESM v7 generated values (`generated identifier`, decision 0026) and decision 0025's numbering; the diagnostics below were read at v4.66.0 (`c89198b`): `identifier`, `for`, constraints, generations, `id` pins, diagnostics PLAY0019/0135/0268/0271/0273/0391-0393/0446-0449/0469/0471 |
39
39
  | Chronicle | v19.32.0 (`f17a2ff`) | CHR0012, CHR0034; open defects #3744, #4123, #4131 |
40
40
  | Arc | v22.50.5 | `[ProtectedDecision]` and `DecisionRead<T>` (since v22.39.0) |
41
- | Stage | v4.24.2 | rendered apps pin Arc 22.25.0 and Chronicle client 19.8.1 (unchanged from 4.24.0); admits ESM v4 but refuses evolved events with `STAGE-ESM-026` (migrations not rendered, Stage#204) |
41
+ | Stage | v4.51.3 | rendered apps pin Arc 22.50.5 and Chronicle client/kernel 19.32.0; protected-read APIs available to gap-fill. Historical 4.24.2 admission probe: ESM v4, evolved events refused with `STAGE-ESM-026` |
42
42
 
43
43
  Full pin table: `references/versions.md` in `cratis-screenplay-toolchain`. Re-check the three
44
44
  Chronicle issues before relying on a constraint in a later release.
@@ -52,13 +52,13 @@ Chronicle issues before relying on a constraint in a later release.
52
52
  themselves (`cratis-screenplay-scenario-coverage`), Chronicle C# mechanics
53
53
  (`cratis-chronicle-event-modeling`). See Route near misses.
54
54
  - Model-first applies: when an accepted model covers the scope, change the model and its
55
- specifications, not code. Do not weaken authorization, `@pii` or rules to make a model compile.
55
+ specifications, not code. Do not weaken authorization, `pii` or rules to make a model compile.
56
56
 
57
57
  ## Interview phase
58
58
  **Skip if** the user or the model already states the stream identities, who owns each module, how
59
59
  much autonomy each side has, the external systems, and rough growth. Otherwise ask only what is
60
60
  missing, one question at a time, with options. **Unattended:** assume the most conservative
61
- option, mark it `ASSUMED` in the slice or module `description` and in the session `STATE.md`
61
+ option, mark it `ASSUMED` in the slice or module `documentation` and in the session `STATE.md`
62
62
  (`.ai-work/screenplay/<model-slug>/STATE.md`), and continue.
63
63
 
64
64
  1. **Instance.** "What is the real-world thing this stream is about, and when does it start and
@@ -103,8 +103,8 @@ option, mark it `ASSUMED` in the slice or module `description` and in the sessio
103
103
  `unique event`, `released by`); list every event that sets the claimed value;
104
104
  - a state-dependent rule not reducible to those: write `reads <View>` + `require <expr>
105
105
  message "..."` as stated intent (PLAY0268/0271 at binding are expected in design mode) and
106
- mark it **NOT enforced in the model today** in the slice `description`, with requirement,
107
- missing guarantee, race consequence and the named target enforcement. Add a `STATE.md` row
106
+ mark it **NOT enforced in the model today** in the slice `description` with the named target,
107
+ and record requirement, missing guarantee and race consequence in the slice `documentation`. Add a `STATE.md` row
108
108
  with an owner. A general "some rules are unsupported" note is not enough.
109
109
  - Forbidden: a caller-supplied copy of state in `require`, a boolean attestation input
110
110
  (`confirmsX == true`) standing in for a rule, and rules hidden in `handler` or
@@ -118,9 +118,14 @@ option, mark it `ASSUMED` in the slice or module `description` and in the sessio
118
118
  4. **Set granularity.** One decision usually records one event; several facts are fine when each
119
119
  is a fact the business recognises. Different meanings get different events, not a flag with
120
120
  nullable siblings. Event properties are required by default (CHR0012, PLAY0350): an optional
121
- detail is a separate event, and any deviation is justified in the description. One data
122
- subject per event and stream; never personal data, a secret, or a `@pii` or `@sensitive` concept as the identifier (CHR0034, CHR0052):
123
- use a surrogate `Uuid` and a `@pii` or `@sensitive` property.
121
+ detail is a separate event, and any deviation is justified in the event's `documentation`. One data
122
+ subject per event; never personal data, a secret, or a `pii`/`secret` concept as
123
+ identifier or subject (CHR0034, CHR0052, PLAY0515/0592). Use a surrogate identity
124
+ and protected payload. A stream identity and an event's data subject may differ:
125
+ trailing event-property `subject` records that lineage but is report-only
126
+ (PLAY0270), not runtime propagation or generated C# `[Subject]`. Without a
127
+ supplied subject, the runtime defaults to the event source; see command-surface
128
+ `references/compliance.md` for allowed types and the policy/encryption distinction.
124
129
  5. **Plan evolution** with `references/evolution.md`: classify each event change (additive,
125
130
  meaning change, rename, removal, split or merge) and write its compatibility scenarios before
126
131
  editing. Renames and other identity-affecting edits are made by the identity owner (the
@@ -129,7 +134,7 @@ option, mark it `ASSUMED` in the slice or module `description` and in the sessio
129
134
  interface and processor inventory, one real interaction walked across each boundary, coupling
130
135
  check. Keep team, module, stream and deployment boundaries distinct; inbound facts via
131
136
  Translate; unresolved decisions stay visible.
132
- 7. **Record and gate.** Durable rationale in feature and slice `description`; open consistency
137
+ 7. **Record and gate.** Durable rationale in feature and slice `documentation`; open consistency
133
138
  decisions and capability gaps in `STATE.md`. Then the gate below.
134
139
 
135
140
  ## Rules
@@ -148,13 +153,23 @@ option, mark it `ASSUMED` in the slice or module `description` and in the sessio
148
153
  block compiles but is PLAY0271 at binding. Keep both when they state real intent; they are not
149
154
  protection. `description` text never reaches rendered code: a rule that lives only in prose is
150
155
  unenforced there.
151
- - `@pii` and `@sensitive` block binding (PLAY0268). Never remove them to pass a tool.
156
+ - `pii` and `secret` block binding (PLAY0268); legacy markers are deprecated
157
+ (PLAY0565). Never remove protection to pass a tool. PLAY0515 also refuses
158
+ scalar/composite stream-id types and route mapping sources, including nested paths.
159
+ - At 4.127.0 stream-id literals must be nonempty, well-formed NFC text (refused,
160
+ not normalized); integer ids in Double mode stay within ±(2^53−1). Exact mode
161
+ has no such bound but is unadmitted. PLAY0504 is an error for route/destination
162
+ nominal type mismatch. Composite ids use at least two named scalar parts,
163
+ complete named mappings and canonical comparison, not guessed legacy splits.
164
+ Stored key-schema changes require a new stream identity or migration; see
165
+ toolchain `references/sources-and-streams.md`.
152
166
  - Chronicle (open at v19.32.0): the SQL and InMemory providers do not settle unique claims
153
167
  (#3744); index updates run after commit and may fail silently (#4123); composite values can
154
168
  collide on the separator (#4131). A declared constraint is a declaration, not a runtime test.
155
- - `[ProtectedDecision]` is available in Arc v22.39.0 or later, **not** in Stage-rendered apps
156
- (Arc 22.25.0). In a rendered app, record the rule as NOT enforced and choose the stream or
157
- identity redesign (`references/consistency-and-concurrency.md`, section 3).
169
+ - `[ProtectedDecision]` is available in Arc v22.39.0 or later, including Stage 4.51.3's
170
+ rendered package set. It is not emitted protection: gap-fill must enroll an admitted
171
+ decision read, or redesign the stream/identity when the shape is refused
172
+ (`references/consistency-and-concurrency.md`, section 3).
158
173
 
159
174
  **Modeling defaults** (deviate with a recorded reason)
160
175
  - One business identity per stream; cross-stream references are payload properties.
@@ -190,8 +205,8 @@ option, mark it `ASSUMED` in the slice or module `description` and in the sessio
190
205
  Do not report done until all hold; otherwise report what is open:
191
206
  - Every identifier has its identity sentence, the event-membership table and a justified decision.
192
207
  - Every rule has an invariant-table row with an exact construct or limitation reference.
193
- - Every `recorded` rule is in its slice `description` and `STATE.md` with requirement, missing
194
- guarantee, race consequence and intended enforcement owner.
208
+ - Every `recorded` rule has its NOT-enforced marker in the slice `description`, and its requirement,
209
+ missing guarantee, race consequence and intended enforcement owner in the slice `documentation` and `STATE.md`.
195
210
  - Every changed event has compatibility scenarios; identity changes were made by the identity owner.
196
211
  - Every changed boundary has a named owner (or `ASSUMED`), callers, processors and contracts.
197
212
  - Verdicts are stated V1-V5 per `cratis-screenplay-modeling-lifecycle`, each a result or "not run".