@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.
- package/package/corpus/skills/cratis-arc-command/SKILL.md +34 -11
- package/package/corpus/skills/cratis-arc-command/references/generated-values.md +166 -0
- package/package/corpus/skills/cratis-fundamentals-concept/SKILL.md +13 -5
- package/package/corpus/skills/cratis-screenplay-automations-and-translations/SKILL.md +3 -2
- package/package/corpus/skills/cratis-screenplay-automations-and-translations/references/audit-format.md +2 -2
- package/package/corpus/skills/cratis-screenplay-automations-and-translations/references/automation-patterns.md +4 -2
- package/package/corpus/skills/cratis-screenplay-automations-and-translations/references/provenance.md +5 -3
- package/package/corpus/skills/cratis-screenplay-captures-and-reactions/SKILL.md +3 -2
- package/package/corpus/skills/cratis-screenplay-captures-and-reactions/references/invocation-identity.md +6 -5
- package/package/corpus/skills/cratis-screenplay-captures-and-reactions/references/specifying-triggers-and-clock.md +1 -1
- package/package/corpus/skills/cratis-screenplay-command-surface/SKILL.md +4 -4
- package/package/corpus/skills/cratis-screenplay-command-surface/references/context.md +6 -5
- package/package/corpus/skills/cratis-screenplay-command-surface/references/generated-values-and-responses.md +5 -5
- package/package/corpus/skills/cratis-screenplay-event-modeling/SKILL.md +4 -3
- package/package/corpus/skills/cratis-screenplay-event-modeling/references/parsed-not-runnable.md +4 -4
- package/package/corpus/skills/cratis-screenplay-legacy-extraction/references/generate-notes.md +6 -4
- package/package/corpus/skills/cratis-screenplay-model-authoring/SKILL.md +10 -7
- package/package/corpus/skills/cratis-screenplay-model-authoring/references/mcp-tools.md +60 -10
- package/package/corpus/skills/cratis-screenplay-model-authoring/references/screen-authoring-workflow.md +6 -5
- package/package/corpus/skills/cratis-screenplay-model-authoring/verification.json +11 -1
- package/package/corpus/skills/cratis-screenplay-model-review/SKILL.md +29 -5
- package/package/corpus/skills/cratis-screenplay-model-review/references/anti-patterns.md +1 -1
- package/package/corpus/skills/cratis-screenplay-read-surface/references/guarded-actions.md +2 -2
- package/package/corpus/skills/cratis-screenplay-render-and-gap-fill/SKILL.md +12 -11
- package/package/corpus/skills/cratis-screenplay-render-and-gap-fill/references/gap-fill-handoff.md +3 -2
- package/package/corpus/skills/cratis-screenplay-scenario-coverage/references/spec-forms-by-mode.md +4 -4
- package/package/corpus/skills/cratis-screenplay-slice-design/references/worked-example.md +1 -1
- package/package/corpus/skills/cratis-screenplay-specifications/SKILL.md +2 -2
- package/package/corpus/skills/cratis-screenplay-specifications/references/examples-and-routes.md +1 -1
- package/package/corpus/skills/cratis-screenplay-streams-and-consistency/SKILL.md +3 -3
- package/package/corpus/skills/cratis-screenplay-streams-and-consistency/references/consistency-and-concurrency.md +2 -2
- package/package/corpus/skills/cratis-screenplay-streams-and-consistency/references/stream-patterns.md +1 -1
- package/package/corpus/skills/cratis-screenplay-toolchain/SKILL.md +6 -6
- package/package/corpus/skills/cratis-screenplay-toolchain/references/cheat-sheet.md +1 -1
- package/package/corpus/skills/cratis-screenplay-toolchain/references/diagnostics.md +1 -1
- package/package/corpus/skills/cratis-screenplay-toolchain/references/doc-contradictions.md +1 -1
- package/package/corpus/skills/cratis-screenplay-toolchain/references/executable-subset.md +4 -3
- package/package/corpus/skills/cratis-screenplay-toolchain/references/provenance.md +7 -1
- package/package/corpus/skills/cratis-screenplay-toolchain/references/renderable-subset.md +7 -6
- package/package/corpus/skills/cratis-screenplay-toolchain/references/screenplay-contract.json +364 -28
- package/package/corpus/skills/cratis-screenplay-toolchain/references/screenplay-contract.version +1 -1
- package/package/corpus/skills/cratis-screenplay-toolchain/references/sources-and-streams.md +1 -1
- package/package/corpus/skills/cratis-screenplay-toolchain/references/traps.md +4 -4
- package/package/corpus/skills/cratis-screenplay-toolchain/references/verdicts.md +4 -4
- package/package/corpus/skills/cratis-screenplay-toolchain/references/versions.md +23 -13
- package/package/corpus/skills/cratis-screenplay-toolchain/verification.json +1 -1
- package/package/corpus/skills/cratis-screenplay-ui-composition/references/screen-composition-contract.md +6 -6
- package/package/corpus/skills/cratis-specifications-csharp/SKILL.md +21 -0
- package/package/corpus/skills/cratis-specifications-csharp/references/application-scenarios.md +80 -4
- package/package/corpus/skills/cratis-stage-rendering-and-sandbox/SKILL.md +18 -8
- package/package/corpus/skills/cratis-stage-rendering-and-sandbox/references/admission.md +5 -3
- package/package/corpus/skills/cratis-stage-rendering-and-sandbox/references/case-tables-and-whole-numbers.md +127 -0
- package/package/corpus/skills/cratis-stage-rendering-and-sandbox/verification.json +5 -1
- 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
|
|
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
|
|
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
|
-
-
|
|
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
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
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.
|
|
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
|
|
38
|
-
|
|
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
|
|
15
|
-
|
|
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
|
|
75
|
-
compiler
|
|
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).
|
|
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
|
|
46
|
-
3.41.0's older parser and Stage 4.51.3's v7 planner
|
|
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
|
|
79
|
-
|
|
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
|
|
73
|
-
`cratis screenplay validate --executable --warnings-as-errors`
|
|
74
|
-
exit 5.
|
|
75
|
-
|
|
76
|
-
4.
|
|
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
|
-
|
|
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` |
|
|
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.
|
|
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
|
|
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.
|
|
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
|
-
|
|
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.
|
|
106
|
-
its parser
|
|
107
|
-
`$identity.<property>` mapping as a raw expression (`PLAY0268`).
|
|
108
|
-
|
|
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.
|
|
5
|
-
(bundled Screenplay 4.
|
|
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
|
|
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.
|
|
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
|
|
142
|
-
|
|
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`) |
|
|
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
|
package/package/corpus/skills/cratis-screenplay-event-modeling/references/parsed-not-runnable.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# Parsed is not runnable: ESM versions and dispositions
|
|
2
2
|
|
|
3
|
-
|
|
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 |
|
|
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.
|
|
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 |
|
package/package/corpus/skills/cratis-screenplay-legacy-extraction/references/generate-notes.md
CHANGED
|
@@ -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.
|
|
21
|
-
|
|
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
|
|
100
|
-
Stage
|
|
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.
|
|
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.
|
|
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
|
-
|
|
311
|
-
|
|
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
|
|