@cratis/pi 7.27.3 → 7.28.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 (54) hide show
  1. package/package/corpus/skills/cratis-arc-command/SKILL.md +34 -11
  2. package/package/corpus/skills/cratis-arc-command/references/generated-values.md +166 -0
  3. package/package/corpus/skills/cratis-fundamentals-concept/SKILL.md +13 -5
  4. package/package/corpus/skills/cratis-screenplay-automations-and-translations/SKILL.md +3 -2
  5. package/package/corpus/skills/cratis-screenplay-automations-and-translations/references/audit-format.md +2 -2
  6. package/package/corpus/skills/cratis-screenplay-automations-and-translations/references/automation-patterns.md +4 -2
  7. package/package/corpus/skills/cratis-screenplay-automations-and-translations/references/provenance.md +5 -3
  8. package/package/corpus/skills/cratis-screenplay-captures-and-reactions/SKILL.md +3 -2
  9. package/package/corpus/skills/cratis-screenplay-captures-and-reactions/references/invocation-identity.md +6 -5
  10. package/package/corpus/skills/cratis-screenplay-captures-and-reactions/references/specifying-triggers-and-clock.md +1 -1
  11. package/package/corpus/skills/cratis-screenplay-command-surface/SKILL.md +4 -4
  12. package/package/corpus/skills/cratis-screenplay-command-surface/references/context.md +6 -5
  13. package/package/corpus/skills/cratis-screenplay-command-surface/references/generated-values-and-responses.md +5 -5
  14. package/package/corpus/skills/cratis-screenplay-event-modeling/SKILL.md +4 -3
  15. package/package/corpus/skills/cratis-screenplay-event-modeling/references/parsed-not-runnable.md +4 -4
  16. package/package/corpus/skills/cratis-screenplay-legacy-extraction/references/generate-notes.md +6 -4
  17. package/package/corpus/skills/cratis-screenplay-model-authoring/SKILL.md +10 -7
  18. package/package/corpus/skills/cratis-screenplay-model-authoring/references/mcp-tools.md +60 -10
  19. package/package/corpus/skills/cratis-screenplay-model-authoring/references/screen-authoring-workflow.md +6 -5
  20. package/package/corpus/skills/cratis-screenplay-model-authoring/verification.json +11 -1
  21. package/package/corpus/skills/cratis-screenplay-model-review/SKILL.md +29 -5
  22. package/package/corpus/skills/cratis-screenplay-model-review/references/anti-patterns.md +1 -1
  23. package/package/corpus/skills/cratis-screenplay-read-surface/references/guarded-actions.md +2 -2
  24. package/package/corpus/skills/cratis-screenplay-render-and-gap-fill/SKILL.md +12 -11
  25. package/package/corpus/skills/cratis-screenplay-render-and-gap-fill/references/gap-fill-handoff.md +3 -2
  26. package/package/corpus/skills/cratis-screenplay-scenario-coverage/references/spec-forms-by-mode.md +4 -4
  27. package/package/corpus/skills/cratis-screenplay-slice-design/references/worked-example.md +1 -1
  28. package/package/corpus/skills/cratis-screenplay-specifications/SKILL.md +2 -2
  29. package/package/corpus/skills/cratis-screenplay-specifications/references/examples-and-routes.md +1 -1
  30. package/package/corpus/skills/cratis-screenplay-streams-and-consistency/SKILL.md +3 -3
  31. package/package/corpus/skills/cratis-screenplay-streams-and-consistency/references/consistency-and-concurrency.md +2 -2
  32. package/package/corpus/skills/cratis-screenplay-streams-and-consistency/references/stream-patterns.md +1 -1
  33. package/package/corpus/skills/cratis-screenplay-toolchain/SKILL.md +6 -6
  34. package/package/corpus/skills/cratis-screenplay-toolchain/references/cheat-sheet.md +1 -1
  35. package/package/corpus/skills/cratis-screenplay-toolchain/references/diagnostics.md +1 -1
  36. package/package/corpus/skills/cratis-screenplay-toolchain/references/doc-contradictions.md +1 -1
  37. package/package/corpus/skills/cratis-screenplay-toolchain/references/executable-subset.md +4 -3
  38. package/package/corpus/skills/cratis-screenplay-toolchain/references/provenance.md +7 -1
  39. package/package/corpus/skills/cratis-screenplay-toolchain/references/renderable-subset.md +7 -6
  40. package/package/corpus/skills/cratis-screenplay-toolchain/references/screenplay-contract.json +364 -28
  41. package/package/corpus/skills/cratis-screenplay-toolchain/references/screenplay-contract.version +1 -1
  42. package/package/corpus/skills/cratis-screenplay-toolchain/references/sources-and-streams.md +1 -1
  43. package/package/corpus/skills/cratis-screenplay-toolchain/references/traps.md +4 -4
  44. package/package/corpus/skills/cratis-screenplay-toolchain/references/verdicts.md +4 -4
  45. package/package/corpus/skills/cratis-screenplay-toolchain/references/versions.md +23 -13
  46. package/package/corpus/skills/cratis-screenplay-toolchain/verification.json +1 -1
  47. package/package/corpus/skills/cratis-screenplay-ui-composition/references/screen-composition-contract.md +6 -6
  48. package/package/corpus/skills/cratis-specifications-csharp/SKILL.md +21 -0
  49. package/package/corpus/skills/cratis-specifications-csharp/references/application-scenarios.md +80 -4
  50. package/package/corpus/skills/cratis-stage-rendering-and-sandbox/SKILL.md +18 -8
  51. package/package/corpus/skills/cratis-stage-rendering-and-sandbox/references/admission.md +5 -3
  52. package/package/corpus/skills/cratis-stage-rendering-and-sandbox/references/case-tables-and-whole-numbers.md +127 -0
  53. package/package/corpus/skills/cratis-stage-rendering-and-sandbox/verification.json +5 -1
  54. package/package.json +1 -1
@@ -75,8 +75,9 @@ Rules the framework actually enforces:
75
75
  operation collections, and `ARC0018` checks generated-invoker accessibility.
76
76
  - Name the command as the action — `OpenDebitAccount`, not
77
77
  `OpenDebitAccountCommand`.
78
- - `Handle` parameters are resolved from DI, so ask for services there rather
79
- than through a constructor.
78
+ - Unmarked `Handle` parameters resolve from `Provide()` or DI; ask for services
79
+ there rather than through a constructor. Server-owned new values use
80
+ `[GeneratedValue]` instead (below).
80
81
  - Never inject `IEventLog` into `Handle` to append the command's own events —
81
82
  `ARCCHR0007` warns, and it bypasses Arc's append pipeline. Express the append
82
83
  through the return type.
@@ -137,8 +138,8 @@ Two consequences worth knowing before writing the first command:
137
138
  the events in that same tuple are appended to. Returning more than one
138
139
  unhandleable element throws `MultipleUnhandledTupleValues`. When the command
139
140
  also returns an operation keyed by that id, have the caller supply the id
140
- instead of calling `New()` in `Handle()`, so a retried request reuses the same
141
- ownership key.
141
+ instead of generating a new value, so a retried request reuses the same
142
+ ownership key. A generated value alone does not provide idempotency.
142
143
  - **Events never carry their own event source.** Cross-stream writes use
143
144
  `EventForEventSourceId`; they are not expressed by a property on the event.
144
145
 
@@ -146,11 +147,8 @@ Two consequences worth knowing before writing the first command:
146
147
  [Command]
147
148
  public record Register<Thing>(<ConceptType> <Name>)
148
149
  {
149
- public (<ThingId>, <ThingRegistered>) Handle()
150
- {
151
- var id = <ThingId>.New();
152
- return (id, new(<Name>));
153
- }
150
+ public (<ThingId>, <ThingRegistered>) Handle([GeneratedValue("thing")] <ThingId> id) =>
151
+ (id, new(<Name>));
154
152
  }
155
153
  ```
156
154
 
@@ -166,6 +164,28 @@ public record Transfer(<AccountId> From, <AccountId> To, <Money> Amount)
166
164
  }
167
165
  ```
168
166
 
167
+ ## Generate a server-owned new identifier
168
+
169
+ **Arc 22.66.0+**, verified at **v22.68.0**: the create-command example above
170
+ requires `<ThingId>` to implement `IGeneratable<ThingId>` with a static `New()`
171
+ strategy (Fundamentals 7.23.0+; see `cratis-fundamentals-concept`). Replace
172
+ `Guid.NewGuid()` or `<ThingId>.New()` inside `Handle()` with a generated parameter,
173
+ not a new request property. Return the id as the ordinary response or in the
174
+ id/event tuple so the caller receives it.
175
+
176
+ `[GeneratedValue]` is in `Cratis.Arc.Commands.ModelBound` and applies only to
177
+ parameters of a non-static command `Handle()`. Arc generates after `Provide()`
178
+ control results permit execution, validates the concept, then invokes `Handle`.
179
+ `Provide()` and DI cannot override it. Use a non-nullable self-generatable type,
180
+ not raw `Guid`; names default to the parameter name or an explicit attribute name
181
+ and are case-sensitive, non-empty and unique within the command.
182
+
183
+ Keep client-chosen ids/references as inputs and services/read models as ordinary
184
+ dependencies. A UUID is not a secret, token, authorization proof, idempotency key,
185
+ or a gapless/sequential invoice number. For validation failures, captures,
186
+ ARC0022–ARC0025, migration and the pinned-spec workflow, read
187
+ [generated values](references/generated-values.md).
188
+
169
189
  ## Where the event source id comes from
170
190
 
171
191
  Chronicle resolves the command's event source id in this order:
@@ -330,8 +350,11 @@ Components guidance, not to this skill.
330
350
  - The event source id resolves from exactly one place; `ARCCHR0002` is silent.
331
351
  - `[Key]`, where used, is `Cratis.Chronicle.Keys.KeyAttribute`.
332
352
  - No `IEventLog` is injected into `Handle`.
333
- - Every value `Provide` returns is consumed by `Handle`.
334
- - Rejections are validation results, never thrown exceptions.
353
+ - Every value `Provide` returns is consumed by an unmarked `Handle` parameter.
354
+ - Generated parameters follow [generated values](references/generated-values.md)
355
+ and are pinned before scenario execution (`cratis-specifications-csharp`).
356
+ - User-correctable rejections are validation results, never thrown exceptions;
357
+ `GeneratedValueRejected` instead signals a defective server generation strategy.
335
358
  - Every secret or personal value is marked before it can reach the event log.
336
359
  - `dotnet build` is clean in Debug and Release, with no suppressed `ARC*` or
337
360
  `ARCCHR*` diagnostic left unjustified.
@@ -0,0 +1,166 @@
1
+ # Server-generated Handle values
2
+
3
+ ## Contents
4
+
5
+ - Declare the value and command
6
+ - Resolution, validation and captures
7
+ - Analyzer diagnostics
8
+ - Migrate generation inside Handle
9
+ - Pin generated values in specifications
10
+ - Verified sources and release boundary
11
+
12
+ <!-- Copyright (c) Cratis. All rights reserved. -->
13
+ <!-- Licensed under the MIT license. See LICENSE file in the project root for full license information. -->
14
+
15
+ ## Declare the value and command
16
+
17
+ Generated parameters arrived in Arc **22.66.0**, scenario pinning in **22.67.0**,
18
+ and analyzers in **22.68.0**. The examples and behavior here are verified at
19
+ **v22.68.0**, which pins Fundamentals **7.23.0**.
20
+
21
+ Use a concept for a server-owned new identifier. This standalone Arc example
22
+ allocates an id; it does not append an event or persist a cart:
23
+
24
+ ```csharp
25
+ // Copyright (c) Cratis. All rights reserved.
26
+ // Licensed under the MIT license. See LICENSE file in the project root for full license information.
27
+
28
+ using Cratis.Arc.Commands.ModelBound;
29
+ using Cratis.Concepts;
30
+
31
+ namespace Shopping.Carts;
32
+
33
+ /// <summary>
34
+ /// Represents a cart identifier.
35
+ /// </summary>
36
+ /// <param name="Value">The underlying identifier.</param>
37
+ public record CartId(Guid Value) : ConceptAs<Guid>(Value), IGeneratable<CartId>
38
+ {
39
+ /// <summary>
40
+ /// Creates a new cart identifier.
41
+ /// </summary>
42
+ /// <returns>A new cart identifier.</returns>
43
+ public static CartId New() => new(GenerateValue.Uuid());
44
+ }
45
+
46
+ /// <summary>
47
+ /// Allocates a server-owned cart identifier.
48
+ /// </summary>
49
+ [Command]
50
+ public record AllocateCartId
51
+ {
52
+ /// <summary>
53
+ /// Returns the allocated identifier to the caller.
54
+ /// </summary>
55
+ /// <param name="cartId">The server-generated identifier.</param>
56
+ /// <returns>The allocated identifier.</returns>
57
+ public CartId Handle([GeneratedValue("cart")] CartId cartId) => cartId;
58
+ }
59
+ ```
60
+
61
+ For a Chronicle stream identity, derive `CartId` from `EventSourceId<Guid>`
62
+ instead; see `cratis-fundamentals-concept`. Return `(id, event)` to both append
63
+ and give the caller the new stream id, as in SKILL.md. An identifier is not an
64
+ event, and generation alone does not persist anything.
65
+
66
+ Keep existing/client-chosen identifiers and references on command properties.
67
+ Services and read models remain ordinary dependencies, not generated values.
68
+ UUID generation does not establish authorization, secrecy, idempotency, storage
69
+ freshness, or gapless/sequential numbering. Use the domain's authoritative
70
+ allocation mechanism for invoice numbers, not a random UUID strategy.
71
+
72
+ ## Resolution, validation and captures
73
+
74
+ `GeneratedValueAttribute` targets parameters only. Use it on a command's public
75
+ instance `Handle()`, not a property, constructor or `Provide()` parameter.
76
+ The type must be non-nullable and implement `IGeneratable<TSelf>` for itself;
77
+ a raw `Guid`, nullable concept or by-reference parameter is invalid. Use domain
78
+ concepts; the runtime's type check is the self-generatable interface contract.
79
+
80
+ `[GeneratedValue]` uses the parameter name. `[GeneratedValue("cart")]` keeps the
81
+ pin/capture name stable across a parameter rename. Names are case-sensitive,
82
+ non-whitespace and unique within the command.
83
+
84
+ Arc first runs `Provide()` and checks its control results. Only if execution may
85
+ continue does it call the concept's `New()` strategy and validate the value before
86
+ invoking `Handle()`. Neither a provided value nor a DI registration overrides a
87
+ generated parameter. Unmarked parameters retain their normal resolution.
88
+
89
+ Discoverable concept validators run with the command's scoped provider and
90
+ cancellation token. Errors produce `GeneratedValueRejected`, an exception
91
+ outcome in `CommandResult`: a server-generation defect, not a request-validation
92
+ 400. Warnings/information allow execution. Fix the strategy or invariant; do not
93
+ turn the defect into a user rejection or disable validation to make it pass.
94
+
95
+ Validated values enter `CommandContext.GeneratedValues` in parameter-resolution
96
+ order. Each capture has zero-based `Order`, `Name`, declared `Type` and `Value`;
97
+ `Get<CartId>("cart")` retrieves the latest matching capture. Rejected values are
98
+ not captured. A Handle parameter is not a request property and is not audited
99
+ as command input. Do not log or trace captures or validator failure text, which
100
+ can contain values. Returning a value or putting it in an event still follows the
101
+ ordinary response, event and compliance contracts.
102
+
103
+ ## Analyzer diagnostics
104
+
105
+ Arc v22.68.0 reports these at compile time; none has a code fix. Runtime
106
+ handler-construction checks remain for declarations compiled without analyzers.
107
+
108
+ | Diagnostic | Severity | Fix |
109
+ | --- | --- | --- |
110
+ | ARC0022 | Error | Use a non-nullable type implementing `IGeneratable<TSelf>` for itself; no raw `Guid` or by-reference parameter. |
111
+ | ARC0023 | Error | Move the attribute to a non-static command `Handle()` parameter, not `Provide()`, a read model or controller. |
112
+ | ARC0024 | Error | Give each generated parameter a non-empty unique name; comparison is case-sensitive. |
113
+ | ARC0025 | Warning | Remove a redundant provided value of the generated type, or remove the attribute if `Provide()` should supply it. An unmarked parameter can still consume that provided type. |
114
+
115
+ ## Migrate generation inside Handle
116
+
117
+ For `var id = new CartId(Guid.NewGuid());` or `var id = CartId.New();` in
118
+ `Handle()`, keep the request contract unchanged:
119
+
120
+ 1. Make the concept implement `IGeneratable<CartId>` with static `New()` using
121
+ `GenerateValue.Uuid()` or `GenerateValue.UuidV7()`.
122
+ 2. Replace the local allocation with `[GeneratedValue("cart")] CartId cartId`
123
+ on `Handle()`, then use that parameter in the existing return/operation shape.
124
+ 3. Return the id if the caller needs it; a capture is not an automatic response.
125
+ 4. Pin the concept by generated name in pipeline specifications. For a pure
126
+ direct-call specification, pass the known concept to `Handle()` yourself.
127
+
128
+ Do not migrate caller-owned inputs into server generation. A retried request
129
+ would otherwise allocate a different value; random generation is not an
130
+ idempotency mechanism. UUIDv7 reveals creation time and is not monotonic within
131
+ a millisecond; choose it for index locality only after checking storage ordering.
132
+
133
+ ## Pin generated values in specifications
134
+
135
+ Use `cratis-specifications-csharp` and its `references/application-scenarios.md`
136
+ for the complete pinned example. `Cratis.Arc.Testing.Commands` supplies
137
+ `PinGeneratedValue(name, concept)`, `AllowGeneration()` and the `GeneratedValues`
138
+ capture helpers on `CommandScenario<TCommand>`.
139
+
140
+ Scenarios default to strict: an unpinned generated parameter yields
141
+ `GeneratedValueNotPinned` in the command result, not a throw from `Execute`.
142
+ Configure before execution. Nested pins use both generic arguments at the call
143
+ site: `PinGeneratedValue<TCommand, TOtherCommand>(name, concept)`.
144
+
145
+ ## Verified sources and release boundary
146
+
147
+ Published guides:
148
+
149
+ - [Generated values](/arc/backend/csharp/commands/generated-values/)
150
+ - [Pin generated values in command specs](/arc/backend/csharp/testing/generated-values/)
151
+ - [Migrate generated identifiers](/arc/upgrading/generated-values/)
152
+ - Analyzer pages: [ARC0022](/arc/backend/csharp/code-analysis/arc0022/),
153
+ [ARC0023](/arc/backend/csharp/code-analysis/arc0023/),
154
+ [ARC0024](/arc/backend/csharp/code-analysis/arc0024/),
155
+ [ARC0025](/arc/backend/csharp/code-analysis/arc0025/).
156
+
157
+ Source at **Arc v22.68.0**: `Source/DotNET/Arc.Core/Commands/ModelBound/GeneratedValueAttribute.cs`,
158
+ `Commands/GeneratedValueParameters.cs`, `GeneratedValueFactories.cs`,
159
+ `CommandHandlerArgumentResolver.cs`, `GeneratedValueResolution.cs`;
160
+ `Source/DotNET/Arc.Core.CodeAnalysis/DiagnosticDescriptors.cs`; and
161
+ `Source/DotNET/Testing/Commands/CommandScenarioGeneratedValueExtensions.cs`.
162
+
163
+ This release has no freshness/collision guard, contextual clock/tenant/pattern
164
+ generation, or additional built-in strategies beyond Fundamentals' UUID/UUIDv7
165
+ helpers. Do not teach proposals as available APIs or invent Screenplay `generate`
166
+ syntax for this feature.
@@ -78,10 +78,14 @@ Do not assume `string.Empty`, `0`, or `Guid.Empty` is universally invalid.
78
78
 
79
79
  ## Let a concept generate its own value
80
80
 
81
- Check the Cratis.Fundamentals version the project resolves first. Arc and
82
- Chronicle can bring an older one; when it is below 7.23.0, add a direct
83
- `Cratis.Fundamentals` 7.23.0 or later package reference, or keep the existing
84
- `static New()` (without the interface) until you can.
81
+ Check the Cratis.Fundamentals version the project resolves first. Arc first
82
+ pinned **7.23.0 in v22.66.0** (also verified at v22.68.0); the older-version
83
+ caveat is not a reason to add a direct reference for Arc 22.66.0+ when it already
84
+ resolves 7.23.0 or later. Chronicle **v19.43.0** still pins **7.22.0** in
85
+ `Directory.Packages.props`. For older Arc or Chronicle-only applications, when
86
+ the resolved version is below 7.23.0, add a direct `Cratis.Fundamentals` 7.23.0
87
+ or later package reference, or keep the existing `static New()` (without the
88
+ interface) until you can.
85
89
 
86
90
  When the system, not the caller, creates a value, the concept declares how by
87
91
  implementing `IGeneratable<TSelf>` (`Cratis.Concepts`, Cratis.Fundamentals
@@ -123,7 +127,11 @@ Do not generate when:
123
127
 
124
128
  In specifications, construct the concept from a known value
125
129
  (`new <ConceptName>(Guid.Parse("…"))`) and assert against it. Do not seed or
126
- replace the generator. Guide: `/fundamentals/csharp/generating-values/`.
130
+ replace the generator. In Arc **22.66.0+**, let a server-owned new identifier
131
+ reach `Handle()` through `[GeneratedValue]` rather than calling `New()` inside
132
+ it; see `cratis-arc-command` for declaration and migration, and
133
+ `cratis-specifications-csharp` for named scenario pins (Arc **22.67.0+**).
134
+ Guide: `/fundamentals/csharp/generating-values/`.
127
135
 
128
136
  ## Create a Guid-backed Chronicle stream identity
129
137
 
@@ -34,8 +34,9 @@ identity, effect and pending-work contract at that point; do not postpone it to
34
34
  planner audits through v7. Deliver that scope as authorized gap-fill
35
35
  (`references/realization-and-gap-fill.md`).
36
36
  - Reaction `runs as system role "<Role>"` declares an invocation actor (ESM v10).
37
- Without it the invoke has no caller. CLI 3.41.0's 4.114.0 compiler rejects the
38
- new syntax (PLAY0137). Checked model/diagnostics: captures-and-reactions
37
+ Without it the invoke has no caller. Historical CLI 3.41.0's 4.114.0 compiler
38
+ rejected the syntax (PLAY0137); current CLI 3.46.1 instead refuses ESM v10
39
+ at render admission (CLI-RENDER-004). Checked model/diagnostics: captures-and-reactions
39
40
  `references/invocation-identity.md`.
40
41
 
41
42
  ## Effect guarantees and recovery traps
@@ -11,8 +11,8 @@ technique: partial work stays visible and nothing is skipped because it looked r
11
11
 
12
12
  Result is `complete` only when every column is filled or says why it does not apply (for example
13
13
  "direct effect: immediate, internal, cannot fail"). `open` names the unresolved decision and who
14
- answers. `blocked` names the actual capability gap (for example CLI 3.41.0's
15
- older compiler cannot parse a declared ESM v10 reaction actor) with intended behavior.
14
+ answers. `blocked` names the actual capability gap (for example current CLI
15
+ 3.46.1 refuses ESM v10 at render admission with CLI-RENDER-004) with intended behavior.
16
16
 
17
17
  ## Per translation (capture or translator reaction)
18
18
  | Source and type | Location | Correlation | Field dispositions | Target fields traced | Dedup and ordering | Trust boundary | Recovery owner | Named cases | Result |
@@ -71,8 +71,10 @@ When a todo list is not needed: the effect is immediate, internal and cannot fai
71
71
  Screenplay 4.125.0 declares the actor with reaction-level `runs as system role
72
72
  "<Role>"` (ESM v10); without it a gated invocation has no caller and denies.
73
73
  `given caller` is not an invocation actor. Role requirements remain enforced;
74
- claim conditions for this system principal remain unknown. CLI 3.41.0's older
75
- compiler rejects the syntax (PLAY0137), and Stage 4.51.3 admits through v7 only.
74
+ claim conditions for this system principal remain unknown. Historical CLI 3.41.0's
75
+ older compiler rejected the syntax (PLAY0137). Current CLI 3.46.1 bundles
76
+ Screenplay 4.130.0 / Stage 4.52.0 and refuses v10 at render admission
77
+ (CLI-RENDER-004; toolchain `references/versions.md`).
76
78
  Use the checked model in captures-and-reactions `references/invocation-identity.md`.
77
79
  Arc gap-fill uses `[ExecuteCommandsAsSystem("<role>")]` for returned commands,
78
80
  not identity inferred from prose or an imperative pipeline call.
@@ -40,7 +40,9 @@ Changes in this version: the examples are complete fenced documents that compile
40
40
  example's anonymous-booking spec gained the `given caller` PLAY0389 requires; the todo-list
41
41
  example's list query, `reads` and retry sweep moved to marked design-only excerpts so the core
42
42
  binds); tool-qualified verdict text; the trusted-actor text now names `[ExecuteCommandsAsSystem]`
43
- (Arc v20.56.0). Current actor syntax was reverified at Screenplay v4.125.0
43
+ (Arc v20.56.0). Actor syntax was reverified at Screenplay v4.125.0
44
44
  `reactions.md`, `ReactionIdentityParser.cs`, `ReactionRefusalValidator.cs` and the
45
- binder's v10 selection; the checked scenario passes reference execution. CLI
46
- 3.41.0's older parser and Stage 4.51.3's v7 planner remain target limits.
45
+ binder's v10 selection; the checked scenario passed reference execution. CLI
46
+ 3.41.0's older parser and Stage 4.51.3's v7 planner were historical target limits.
47
+ Current CLI 3.46.1 bundles Screenplay 4.130.0 / Stage 4.52.0 and still refuses
48
+ v10 at render admission (CLI-RENDER-004; toolchain `references/versions.md`).
@@ -75,8 +75,9 @@ reference invocation's authenticated system principal with exactly those roles;
75
75
  Read [invocation identity](references/invocation-identity.md) for the checked
76
76
  scenario, claim/unknown semantics and PLAY0647–0652/0557 diagnostics.
77
77
 
78
- CLI 3.41.0's 4.114.0 compiler rejects this source with PLAY0137; its version gate
79
- and Stage 4.51.3 planner admit only through v7. Target realization is gap-fill,
78
+ Historical CLI 3.41.0's 4.114.0 compiler rejected this source with PLAY0137.
79
+ Current CLI 3.46.1 bundles Screenplay 4.130.0 / Stage 4.52.0; its render version
80
+ gate still admits only through v7 (CLI-RENDER-004 for v10). Target realization is gap-fill,
80
81
  using Arc `[ExecuteCommandsAsSystem]` for returned commands. Without that attribute
81
82
  Arc supplies no principal and `[Authorize]`/`[Roles]` deny. Each invoked command
82
83
  is atomic, not the whole cascade; earlier accepted facts remain after a later refusal.
@@ -69,11 +69,12 @@ module Work
69
69
  denial; opaque/unknown cases are not guessed. `--check privilege` (PLAY0652)
70
70
  reviews whether event producers require every elevated role, not runtime safety.
71
71
 
72
- CLI 3.41.0 bundles Screenplay 4.114.0, which does not parse `runs as`: the example's
73
- `cratis screenplay validate --executable --warnings-as-errors` returns PLAY0137,
74
- exit 5. It cannot render this source. Its render version gate separately admits
75
- only through v7 (CLI-RENDER-004 for newer admitted compiler output), while Stage
76
- 4.51.3's direct planner audits through v7 and refuses v10 with STAGE-ESM-016.
72
+ Historical CLI 3.41.0 bundled Screenplay 4.114.0, which did not parse `runs as`:
73
+ the example's `cratis screenplay validate --executable --warnings-as-errors`
74
+ returned PLAY0137, exit 5. This is not a current parser claim. Current CLI 3.46.1
75
+ bundles Screenplay 4.130.0 but its render gate still admits only through v7
76
+ (CLI-RENDER-004 for v10); bundled Stage 4.52.0's direct planner audits through
77
+ v7 and refuses v10 with STAGE-ESM-016 (`references/versions.md` in toolchain).
77
78
  Clock/application-trigger identities have no Stage Arc realization either.
78
79
  Use authorized gap-fill with the model as contract; returned-command Arc identity
79
80
  uses `[ExecuteCommandsAsSystem]`, never permission inferred from a model header.
@@ -19,7 +19,7 @@ specification IssuingTheWeeklyDigest
19
19
 
20
20
  Under `cratis` before 3.28.2 these actions parsed and were checked against the application
21
21
  but bound to nothing (`PLAY0268` names ESM v6, decision 0022); on 3.28.2 they bind.
22
- Current standalone 4.125.0 executes admitted scenarios through `screenplay test`
22
+ Standalone 4.125.0 (checked; current pins in the toolchain `versions.md`) executes admitted scenarios through `screenplay test`
23
23
  or MCP `run-specifications`; source compilation alone is authored evidence.
24
24
  Clock rules: the clock is UTC and exact; an
25
25
  occurrence fires once when it is **due after `given clock` and at or before
@@ -32,7 +32,7 @@ source is the single flow model.
32
32
  | `Cratis.Screenplay` | main `fd18129` | Inline events, repairs and canonical `optional`; changed examples compiled |
33
33
  | `Cratis.Screenplay` | `4.66.0` (`c89198b`) | Binding behaviour of `handler`, code attachments, `persona` and compliance attributes: `Semantics/SemanticModelBinder*.cs`, `Diagnostics/DiagnosticCodes.cs` |
34
34
  | `Cratis.Screenplay` | `4.68.0` (`79801bf`) | Historical generated-value/response rule probes (ESM v7) |
35
- | `Cratis.Screenplay` | `4.127.0` | Current identity and compliance guidance: released `identity.md`, `context.md`, `concepts.md`, `purposes.md`, `events.md`, `diagnostics.md`; changed examples compiled |
35
+ | `Cratis.Screenplay` (historical check) | `4.127.0` | Identity and compliance guidance checked at this release: released `identity.md`, `context.md`, `concepts.md`, `purposes.md`, `events.md`, `diagnostics.md`; changed examples compiled |
36
36
 
37
37
  Historical examples/probes retain the table's original versions; current source
38
38
  guidance is not a relabeled old execution result. Compilation checks syntax and
@@ -261,7 +261,7 @@ produces when isProForma == true
261
261
  ## Routes and external operations
262
262
 
263
263
  Named event sources/streams and command routes bind as ESM v8 (verified at 4.125.0);
264
- CLI 3.41.0 render rejects models above v7. A routed command's identifier and
264
+ CLI 3.46.1 render rejects models above v7. A routed command's identifier and
265
265
  known event destinations must match the source's nominal identifier type
266
266
  (PLAY0504, error). Allocation uses the generated identifier's type, or without
267
267
  one requires a UUID-based source. Composite `streamId` routes map every named
@@ -297,7 +297,7 @@ to the routed scope. This does not make command `reads` protected.
297
297
  ## Generated values and responses (ESM v7)
298
298
 
299
299
  Generated values/responses bind as ESM v7, including in the current CLI bundle.
300
- CLI 3.41.0 admits v7 to Stage planning; its canonical corpus gets generated-value
300
+ The historical CLI 3.41.0 check admitted v7 to Stage planning; its canonical corpus got generated-value
301
301
  and response refusals STAGE-ESM-028/029. Binding is not a render claim.
302
302
  Read [references/generated-values-and-responses.md](references/generated-values-and-responses.md) when adding or
303
303
  reviewing `generated` properties, `returns` responses, or decision 0023 constructs.
@@ -369,7 +369,7 @@ Four contexts, and **what each omits is load-bearing** — when writing a code b
369
369
  ## Verify
370
370
 
371
371
  - [ ] Validate the complete model root with warnings as errors; name the tool,
372
- version and result. Current pins: standalone 4.127.0 / CLI 3.41.0; bundle
372
+ version and result. Current pins: standalone 4.131.0 / CLI 3.46.1; bundle
373
373
  compatibility and execution are separate checks.
374
374
  - [ ] No unintended `PLAY0478` or `PLAY0479` information remains.
375
375
  - [ ] At most one command property carries `identifier`, and no event property does.
@@ -100,12 +100,13 @@ An unknown `$context.` path is reported, so a typo does not silently become null
100
100
 
101
101
  ## Caller paths and identity details
102
102
 
103
- At Screenplay 4.127.0, `$identity.<property>` is the same caller value as
103
+ Checked at Screenplay 4.127.0: `$identity.<property>` is the same caller value as
104
104
  `$context.identity.<property>`. Prefer `$identity` in new mappings; the older root
105
- is supported, not deprecated. The `cratis` CLI 3.41.0 bundles Screenplay 4.114.0, which predates both:
106
- its parser rejects a top-level `identity` block (`PLAY0001`), and with `--executable` it reads a
107
- `$identity.<property>` mapping as a raw expression (`PLAY0268`). Check these with standalone 4.127.0,
108
- and keep `$context.identity.<property>` where a model must go through `cratis render` today. Built-ins are `id`, `name`, `userName`,
105
+ is supported, not deprecated. Historical `cratis` CLI 3.41.0 bundled Screenplay 4.114.0, which predated both:
106
+ its parser rejected a top-level `identity` block (`PLAY0001`), and with `--executable` it read a
107
+ `$identity.<property>` mapping as a raw expression (`PLAY0268`). Those checks used standalone 4.127.0;
108
+ they are not current CLI 3.46.1/Screenplay 4.130.0 parser claims. Check current renderer
109
+ admission separately before choosing caller mappings. Built-ins are `id`, `name`, `userName`,
109
110
  `isAuthenticated`, `roles`, `claims.<name>` (everything after `claims.` is opaque).
110
111
  Bare `$identity` reports PLAY0152; unknown properties report PLAY0155. Only
111
112
  `$identity.id`/`.name`/`.userName` bind in portable `produces` mappings, exactly
@@ -1,11 +1,11 @@
1
1
  ## Generated values and responses (ESM v7)
2
2
 
3
3
  A `generated` command property and `returns` response bind and reference-execute
4
- as ESM v7. Current pins are standalone Screenplay 4.127.0 and CLI 3.41.0
5
- (bundled Screenplay 4.114.0/Stage 4.51.3); `cratis-screenplay-toolchain`
4
+ as ESM v7 (checked at 4.68.0). Current pins are standalone Screenplay 4.131.0
5
+ and CLI 3.46.1 (bundled Screenplay 4.130.0/Stage 4.52.0); `cratis-screenplay-toolchain`
6
6
  `references/versions.md` owns the table. CLI#261 is closed: CLI now admits v7
7
- to Stage planning, but its v7 canonical corpus receives Stage generated-value
8
- and response refusals STAGE-ESM-028/029. Do not turn this into a blanket compiler
7
+ to Stage planning. The historical CLI 3.41.0 v7 canonical corpus received Stage
8
+ generated-value and response refusals STAGE-ESM-028/029. Do not turn this into a blanket compiler
9
9
  refusal or promise a render from binding alone. Preserve the contract for gap-fill
10
10
  where admission refuses. Historical rules below were read at 4.68.0. Complete compiled example:
11
11
  `cratis-screenplay-toolchain` `references/generated-responses-example.md`.
@@ -45,7 +45,7 @@ Rules (all read at `v4.68.0`):
45
45
 
46
46
  Operations remain authorable/unadmitted (PLAY0268). Named event sources,
47
47
  streams and command/specification routes instead bind and reference-execute as
48
- ESM v8 at 4.125.0; CLI 3.41.0 render refuses versions above v7 before planning
48
+ ESM v8 at 4.125.0; CLI 3.46.1 render refuses versions above v7 before planning
49
49
  (CLI-RENDER-004). Syntax/MCP acceptance alone is not execution. Source/stream
50
50
  forms and realization boundary: `cratis-screenplay-toolchain`
51
51
  `references/sources-and-streams.md`. Do not infer further syntax or provider
@@ -138,8 +138,9 @@ What binds depends on **which tool** you ask, so name the tool and its version:
138
138
  and command/specification routes as v8; reaction `runs as` identity as v10 on
139
139
  standalone 4.125.0. Use `screenplay test` or MCP `run-specifications` for V4.
140
140
  Operations/systems, exact numbers and refusal/redelivery remain unadmitted.
141
- CLI 3.41.0 bundles older syntax and renders through v7 only: its parser rejects
142
- `runs as`, and Stage refuses generated values/responses with STAGE-ESM-028/029.
141
+ Historical CLI 3.41.0 rejected `runs as` syntax and its Stage 4.51.3 check
142
+ refused generated values/responses with STAGE-ESM-028/029. Current CLI 3.46.1
143
+ bundles Screenplay 4.130.0 / Stage 4.52.0 but still renders through v7 only.
143
144
  Source/binding admission and target realization are separate gates.
144
145
 
145
146
  The ESM versions, the full disposition table and the Step 7 clock example's binding
@@ -170,7 +171,7 @@ source is the single flow model.
170
171
  | `Cratis.Screenplay` | `4.31.0` | Compiler: parser, validator, diagnostics, folder merge, semantic binder |
171
172
  | `Cratis.Screenplay.Tool` | `4.31.0` | The `screenplay` dotnet tool |
172
173
  | `Cratis.Screenplay` | main `fd18129` | Inline contracts and event context; changed nine-step examples compiled |
173
- | `Cratis.Screenplay.Tool` | `4.68.0` (`79801bf`) | Current pin: the nine-step examples compile and their specifications run in the reference runner; generated values and responses (ESM v7) were read at this tag |
174
+ | `Cratis.Screenplay.Tool` | `4.68.0` (`79801bf`) | Checked at 4.68.0 (current pins in `cratis-screenplay-toolchain` `references/versions.md`): the nine-step examples compile and their specifications run in the reference runner; generated values and responses (ESM v7) were read at this tag |
174
175
  | `Cratis.Screenplay.Tool` | `4.66.0` (`c89198b`) | Persona, operation and stream dispositions below were read at this tag, and the Step 7 clock example was probed through MCP on it |
175
176
 
176
177
  The pin set for the whole Screenplay family, and which tool reports what, lives only in
@@ -1,6 +1,6 @@
1
1
  # Parsed is not runnable: ESM versions and dispositions
2
2
 
3
- Current evidence: Screenplay v4.125.0 `SemanticModelBinder.cs`, `Versions.cs`,
3
+ Checked at Screenplay v4.125.0: `SemanticModelBinder.cs`, `Versions.cs`,
4
4
  `Documentation/screenplay/{commands,operations,event-sources,reactions,tool}.md`.
5
5
  The binder selects v8 for event routes and v10 for declared reaction identity.
6
6
  Pins and consumer boundaries: toolchain `references/versions.md`.
@@ -19,7 +19,7 @@ Pins and consumer boundaries: toolchain `references/versions.md`.
19
19
 
20
20
  ## Dispositions to keep apart
21
21
 
22
- | Construct | Current standalone disposition |
22
+ | Construct | Standalone disposition (checked at v4.125.0) |
23
23
  | --- | --- |
24
24
  | `persona`, domain/authentication metadata | Report-only; unknown named policies remain source defects |
25
25
  | Compliance concepts | Bare `pii`/`secret` (4.127.0); binding still refuses PLAY0268, never remove protection |
@@ -27,8 +27,8 @@ Pins and consumer boundaries: toolchain `references/versions.md`.
27
27
  | Composite stream ids | v8 routing; complete named parts/canonical comparisons, PLAY0515 refuses protected keys/sources; not a legacy text split |
28
28
  | Command reads/concurrency | Legacy unprotected decisions, PLAY0271 |
29
29
  | Invokes-only trigger reads | Report-only, not protected state; direct production with reads refuses |
30
- | Generated values/responses | v7 binding/reference execution; Stage 4.51.3 member refusals STAGE-ESM-028/029 |
31
- | Sources/streams and command/specification routes | v8 binding/reference execution; CLI 3.41.0 render boundary is v7 |
30
+ | Generated values/responses | v7 binding/reference execution; historical Stage 4.51.3 check: member refusals STAGE-ESM-028/029 |
31
+ | Sources/streams and command/specification routes | v8 binding/reference execution; current CLI 3.46.1 render boundary is v7 |
32
32
  | Declared reaction invocation actor | v10 binding/reference execution; older CLI parser PLAY0137; Stage planner refuses v10 |
33
33
  | Operations/systems, exact numbers, refusal/redelivery | Source accepted; whole binding refuses PLAY0268 |
34
34
  | UI | Authoring/deferred metadata; runtime support is a separate consumer contract |
@@ -17,8 +17,10 @@ cratis-screenplay-toolchain `references/versions.md`; behaviour from the cratis
17
17
  Screenplay.CritterStack `v0.24.0`. Version-specific capability facts belong in cratis-screenplay-toolchain
18
18
  `references/versions.md`.
19
19
 
20
- Current CLI is 3.41.0, with Arc.Screenplay 22.54.0 (`references/versions.md` in
21
- the toolchain). Current option/admission evidence: CLI released
20
+ Current CLI is 3.46.1, with Screenplay 4.130.0 / Stage 4.52.0 /
21
+ Arc.Screenplay 22.54.0 / Chronicle 19.32.0 / Fundamentals 7.22.8
22
+ (`references/versions.md` in the toolchain; standalone Screenplay is 4.131.0).
23
+ Option/admission evidence checked at CLI 3.41.0: released
22
24
  `GenerateScreenplaySettings.cs`, `ArcScreenplayGeneration.cs`, v7 planning specs
23
25
  and `Documentation/reference/screenplay.md`; older diagnostic probes below keep
24
26
  their original labels. Arc#3054 and CLI#270 describe the recovered-source expansion.
@@ -96,8 +98,8 @@ The expanded Arc recovery surface includes:
96
98
  deterministic generation fixtures and response expectations can be recovered.
97
99
  Unsupported shapes/pre-generation protection remain code with SP0052.
98
100
 
99
- Generated values/responses select ESM v7. CLI 3.41.0 admits v7 to planning, but
100
- Stage refuses those members with STAGE-ESM-028/029. CLI#261 is closed; do not say
101
+ Generated values/responses select ESM v7. The historical CLI 3.41.0 check
102
+ admitted v7 to planning, but Stage 4.51.3 refused those members with STAGE-ESM-028/029. CLI#261 is closed; do not say
101
103
  the compiler or CLI version gate universally refuses v7. Above v7 remains
102
104
  CLI-RENDER-004. A generated source model is evidence, not guaranteed render output.
103
105
 
@@ -23,7 +23,7 @@ contract is in `cratis-screenplay-ui-composition`.
23
23
 
24
24
  ## Verified product sources
25
25
 
26
- Current authoring/MCP guidance follows Screenplay v4.127.0
26
+ Current authoring/MCP guidance follows Screenplay v4.131.0
27
27
  `Documentation/screenplay/mcp/`, `ast-authoring.md`, `folders.md`, `vscode.md`.
28
28
  Discover installed tools and schemas; CLI bundles can differ from the standalone
29
29
  tool. Pins are in `cratis-screenplay-toolchain` `references/versions.md`.
@@ -105,6 +105,12 @@ Keep reads scoped to the relevant module, feature, slice or document. Do not
105
105
  request a whole merged AST when a bounded declaration/property query answers the
106
106
  question. Size-limit refusals require narrower reads, not truncation.
107
107
 
108
+ ## Compare models
109
+
110
+ For a `main` comparison, pass a worktree `path` to `semantic-diff`, not two
111
+ exports. Read [comparison sources](references/mcp-tools.md#semantic-revision-comparison)
112
+ for paging and proposal review.
113
+
108
114
  ## Make one coherent proposal
109
115
 
110
116
  **One edit strategy.** Discover what the server offers. Prefer typed,
@@ -286,7 +292,7 @@ that the code compiles or behaves. Read `references/mcp-tools.md#code-attachment
286
292
  syntax plus the consistency rules (`PLAY0282`-`PLAY0294`) but never binds, so a
287
293
  clean run is not a bound or executable result.
288
294
  - Operations/exact numbers remain unadmitted; source/stream routes bind as ESM v8,
289
- and generated values/responses as v7. CLI 3.41.0 render passes v7 to Stage but
295
+ and generated values/responses as v7. CLI 3.46.1 render passes v7 to Stage but
290
296
  refuses newer versions. A source contract is never dropped or stubbed to bind.
291
297
  - Distinguish authoring acceptance from `executableReady`; unsupported backend
292
298
  capabilities are not a reason to drop source constructs or invent stubs.
@@ -307,11 +313,8 @@ a generated app that silently drops authored UI. Use the Screenplay-owned canoni
307
313
  corpus fixture path when it exists instead of copying `.play` examples into this
308
314
  repository.
309
315
 
310
- Repair and refactoring guidance follows Screenplay v4.127.0. The Cratis
311
- CLI bundles its own Screenplay version, so check the installed `tools/list`
312
- schemas before relying on a view or argument named here (for example
313
- `dropped-comments` or `implementation-requirements`). Do not invent a command,
314
- parameter, syntax node or downstream capability.
316
+ Check installed `tools/list` schemas: the CLI bundle can differ. Never invent
317
+ commands, parameters, syntax nodes or downstream capabilities.
315
318
 
316
319
  ## Route near misses
317
320