@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.
- package/package/corpus/skills/cratis-application-slice-conformance/SKILL.md +1 -1
- package/package/corpus/skills/cratis-application-slice-conformance/references/contract-and-precedence.md +5 -5
- package/package/corpus/skills/cratis-screenplay-automations-and-translations/SKILL.md +13 -4
- package/package/corpus/skills/cratis-screenplay-automations-and-translations/references/automation-patterns.md +3 -3
- package/package/corpus/skills/cratis-screenplay-automations-and-translations/references/cases-to-specify.md +1 -1
- package/package/corpus/skills/cratis-screenplay-automations-and-translations/references/effects-and-idempotency.md +1 -1
- package/package/corpus/skills/cratis-screenplay-automations-and-translations/references/integration-contracts.md +1 -1
- package/package/corpus/skills/cratis-screenplay-automations-and-translations/references/realization-and-gap-fill.md +5 -3
- package/package/corpus/skills/cratis-screenplay-automations-and-translations/references/translation-patterns.md +1 -1
- package/package/corpus/skills/cratis-screenplay-captures-and-reactions/SKILL.md +4 -3
- package/package/corpus/skills/cratis-screenplay-command-surface/SKILL.md +37 -36
- package/package/corpus/skills/cratis-screenplay-command-surface/references/compliance.md +154 -0
- package/package/corpus/skills/cratis-screenplay-command-surface/references/context.md +48 -0
- package/package/corpus/skills/cratis-screenplay-command-surface/references/generated-values-and-responses.md +1 -1
- package/package/corpus/skills/cratis-screenplay-command-surface/verification.json +6 -0
- package/package/corpus/skills/cratis-screenplay-discovery/SKILL.md +16 -8
- package/package/corpus/skills/cratis-screenplay-discovery/references/event-naming.md +1 -1
- package/package/corpus/skills/cratis-screenplay-discovery/references/facilitation.md +5 -4
- package/package/corpus/skills/cratis-screenplay-discovery/references/human-workshop.md +1 -1
- package/package/corpus/skills/cratis-screenplay-discovery/references/interview-questions.md +2 -2
- package/package/corpus/skills/cratis-screenplay-discovery/references/personas-and-causes.md +7 -4
- package/package/corpus/skills/cratis-screenplay-discovery/references/plotting-and-handoff.md +8 -7
- package/package/corpus/skills/cratis-screenplay-discovery/references/storming-loop.md +2 -2
- package/package/corpus/skills/cratis-screenplay-event-modeling/SKILL.md +13 -3
- package/package/corpus/skills/cratis-screenplay-event-modeling/references/naming-primitives.md +5 -3
- package/package/corpus/skills/cratis-screenplay-event-modeling/references/nine-steps.md +1 -2
- package/package/corpus/skills/cratis-screenplay-event-modeling/references/parsed-not-runnable.md +3 -1
- package/package/corpus/skills/cratis-screenplay-legacy-extraction/SKILL.md +11 -3
- package/package/corpus/skills/cratis-screenplay-legacy-extraction/references/loss-report-template.md +1 -1
- package/package/corpus/skills/cratis-screenplay-legacy-extraction/references/rule-modeling.md +4 -4
- package/package/corpus/skills/cratis-screenplay-legacy-extraction/references/signal-to-intent.md +1 -1
- package/package/corpus/skills/cratis-screenplay-model-authoring/SKILL.md +10 -6
- package/package/corpus/skills/cratis-screenplay-model-authoring/references/language-reference.md +33 -6
- package/package/corpus/skills/cratis-screenplay-model-authoring/references/mcp-loop.md +28 -6
- package/package/corpus/skills/cratis-screenplay-model-authoring/references/mcp-tools.md +108 -9
- package/package/corpus/skills/cratis-screenplay-model-authoring/verification.json +1 -1
- package/package/corpus/skills/cratis-screenplay-model-review/SKILL.md +23 -7
- package/package/corpus/skills/cratis-screenplay-model-review/references/anti-patterns.md +1 -1
- package/package/corpus/skills/cratis-screenplay-model-review/references/checklist.md +11 -10
- package/package/corpus/skills/cratis-screenplay-model-review/references/report-template.md +5 -1
- package/package/corpus/skills/cratis-screenplay-model-review/verification.json +1 -1
- package/package/corpus/skills/cratis-screenplay-modeling-lifecycle/SKILL.md +5 -5
- package/package/corpus/skills/cratis-screenplay-modeling-lifecycle/references/completeness-self-check.md +1 -1
- package/package/corpus/skills/cratis-screenplay-modeling-lifecycle/references/opt-in.md +7 -5
- package/package/corpus/skills/cratis-screenplay-modeling-lifecycle/references/phases.md +4 -4
- package/package/corpus/skills/cratis-screenplay-modeling-lifecycle/references/provenance.md +1 -1
- package/package/corpus/skills/cratis-screenplay-modeling-lifecycle/references/reasoning-notes.md +24 -19
- package/package/corpus/skills/cratis-screenplay-modeling-lifecycle/references/stop-or-assume.md +1 -1
- package/package/corpus/skills/cratis-screenplay-modeling-lifecycle/references/verdicts-and-modes.md +5 -3
- package/package/corpus/skills/cratis-screenplay-modeling-lifecycle/references/vocabulary-map.md +1 -1
- package/package/corpus/skills/cratis-screenplay-modeling-lifecycle/references/worked-example.md +15 -9
- package/package/corpus/skills/cratis-screenplay-read-surface/SKILL.md +11 -1
- package/package/corpus/skills/cratis-screenplay-read-surface/references/guarded-actions.md +4 -0
- package/package/corpus/skills/cratis-screenplay-render-and-gap-fill/SKILL.md +7 -6
- package/package/corpus/skills/cratis-screenplay-render-and-gap-fill/references/drift-and-ledger.md +1 -1
- package/package/corpus/skills/cratis-screenplay-render-and-gap-fill/references/gap-fill-handoff.md +3 -3
- package/package/corpus/skills/cratis-screenplay-render-and-gap-fill/references/renderability-gate.md +1 -1
- package/package/corpus/skills/cratis-screenplay-scenario-coverage/SKILL.md +25 -9
- package/package/corpus/skills/cratis-screenplay-scenario-coverage/references/coverage-matrix.md +1 -1
- package/package/corpus/skills/cratis-screenplay-scenario-coverage/references/invoicing-dues-design.md +5 -0
- package/package/corpus/skills/cratis-screenplay-scenario-coverage/references/scenario-catalogue.md +7 -4
- package/package/corpus/skills/cratis-screenplay-scenario-coverage/references/scenario-examples.md +1 -1
- package/package/corpus/skills/cratis-screenplay-scenario-coverage/references/scenario-workshop.md +1 -1
- package/package/corpus/skills/cratis-screenplay-scenario-coverage/references/spec-forms-by-mode.md +1 -1
- package/package/corpus/skills/cratis-screenplay-scenario-coverage/verification.json +1 -1
- package/package/corpus/skills/cratis-screenplay-slice-design/SKILL.md +22 -8
- package/package/corpus/skills/cratis-screenplay-slice-design/references/command-inventory.md +6 -4
- package/package/corpus/skills/cratis-screenplay-slice-design/references/field-lineage.md +2 -2
- package/package/corpus/skills/cratis-screenplay-slice-design/references/model-reasoning.md +87 -0
- package/package/corpus/skills/cratis-screenplay-slice-design/references/provenance.md +1 -1
- package/package/corpus/skills/cratis-screenplay-slice-design/references/read-model-design.md +2 -2
- package/package/corpus/skills/cratis-screenplay-slice-design/references/review-questions.md +2 -1
- package/package/corpus/skills/cratis-screenplay-slice-design/references/rule-layers.md +12 -11
- package/package/corpus/skills/cratis-screenplay-slice-design/references/slicing.md +3 -3
- package/package/corpus/skills/cratis-screenplay-slice-design/references/worked-example.md +9 -3
- package/package/corpus/skills/cratis-screenplay-specifications/SKILL.md +23 -6
- package/package/corpus/skills/cratis-screenplay-specifications/references/examples-and-routes.md +67 -1
- package/package/corpus/skills/cratis-screenplay-specifications/references/persona-callers-and-cases.md +117 -0
- package/package/corpus/skills/cratis-screenplay-specifications/verification.json +1 -1
- package/package/corpus/skills/cratis-screenplay-streams-and-consistency/SKILL.md +32 -17
- package/package/corpus/skills/cratis-screenplay-streams-and-consistency/references/boundaries.md +3 -3
- package/package/corpus/skills/cratis-screenplay-streams-and-consistency/references/chronicle-boundaries.md +11 -6
- package/package/corpus/skills/cratis-screenplay-streams-and-consistency/references/consistency-and-concurrency.md +24 -11
- package/package/corpus/skills/cratis-screenplay-streams-and-consistency/references/evolution.md +2 -2
- package/package/corpus/skills/cratis-screenplay-streams-and-consistency/references/stream-patterns.md +9 -0
- package/package/corpus/skills/cratis-screenplay-streams-and-consistency/references/streams-example.md +3 -3
- package/package/corpus/skills/cratis-screenplay-toolchain/SKILL.md +12 -5
- package/package/corpus/skills/cratis-screenplay-toolchain/references/cheat-sheet-example.md +2 -2
- package/package/corpus/skills/cratis-screenplay-toolchain/references/cheat-sheet.md +12 -1
- package/package/corpus/skills/cratis-screenplay-toolchain/references/diagnostics.md +124 -5
- package/package/corpus/skills/cratis-screenplay-toolchain/references/doc-contradictions.md +8 -1
- package/package/corpus/skills/cratis-screenplay-toolchain/references/executable-subset.md +19 -4
- package/package/corpus/skills/cratis-screenplay-toolchain/references/provenance.md +7 -1
- package/package/corpus/skills/cratis-screenplay-toolchain/references/renderable-subset.md +22 -4
- package/package/corpus/skills/cratis-screenplay-toolchain/references/sources-and-streams.md +21 -0
- package/package/corpus/skills/cratis-screenplay-toolchain/references/traps.md +22 -5
- package/package/corpus/skills/cratis-screenplay-toolchain/references/verdicts.md +7 -6
- package/package/corpus/skills/cratis-screenplay-toolchain/references/versions.md +20 -3
- package/package/corpus/skills/cratis-screenplay-toolchain/verification.json +6 -0
- package/package/corpus/skills/cratis-screenplay-ui-composition/SKILL.md +4 -2
- package/package/corpus/skills/cratis-screenplay-ui-composition/references/guarded-interactions.md +71 -0
- package/package/corpus/skills/cratis-stage-rendering-and-sandbox/SKILL.md +7 -4
- package/package/corpus/skills/cratis-stage-rendering-and-sandbox/references/rendered-application.md +17 -6
- package/package/corpus/skills/cratis-stage-rendering-and-sandbox/verification.json +1 -1
- 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
|
|
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 |
|
package/package/corpus/skills/cratis-screenplay-slice-design/references/read-model-design.md
CHANGED
|
@@ -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
|
-
-
|
|
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
|
|
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>`
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
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
|
|
28
|
-
|
|
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
|
|
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.
|
|
39
|
-
|
|
40
|
-
|
|
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
|
|
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
|
|
146
|
-
`
|
|
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
|
-
|
|
17
|
-
|
|
18
|
-
|
|
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.
|
|
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` |
|
|
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
|
|
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
|
-
|
|
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
|
|
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.
|
|
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.
|
package/package/corpus/skills/cratis-screenplay-specifications/references/examples-and-routes.md
CHANGED
|
@@ -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.
|
|
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`.
|
|
@@ -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
|
|
32
|
-
APIs exist
|
|
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.
|
|
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,
|
|
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 `
|
|
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
|
|
107
|
-
missing guarantee
|
|
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
|
|
122
|
-
subject per event
|
|
123
|
-
|
|
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 `
|
|
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
|
-
-
|
|
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,
|
|
156
|
-
|
|
157
|
-
|
|
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
|
|
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".
|