@cratis/pi 7.19.0 → 7.21.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.
@@ -64,15 +64,23 @@ public record AuthorName(string Value) : ConceptAs<string>(Value)
64
64
  ## Chronicle stream identity rules
65
65
 
66
66
  ```csharp
67
- public record AuthorId(Guid Value) : EventSourceId<Guid>(Value)
67
+ public record AuthorId(Guid Value) : EventSourceId<Guid>(Value), IGeneratable<AuthorId>
68
68
  {
69
- public static AuthorId New() => new(Guid.NewGuid());
69
+ public static AuthorId New() => new(GenerateValue.Uuid());
70
70
  public static implicit operator AuthorId(Guid value) => new(value);
71
71
  }
72
72
  ```
73
73
 
74
74
  - `New()`, primitive → derived ID conversion, and sentinels are optional domain
75
75
  conveniences; `EventSourceId<T>` does not create an arbitrary derived type.
76
+ - When the system creates the value, implement `IGeneratable<TSelf>` and use
77
+ `GenerateValue.Uuid()` (or `GenerateValue.UuidV7()` when index locality
78
+ matters), both from `Cratis.Concepts` in Cratis.Fundamentals 7.23.0 or later.
79
+ Never `System.Random`. A client-supplied identifier is an input, not something
80
+ to generate; see the **cratis-fundamentals-concept** skill.
81
+ - Arc and Chronicle can resolve an older Cratis.Fundamentals. Check the resolved
82
+ version first; if it is below 7.23.0, add a direct `Cratis.Fundamentals`
83
+ 7.23.0 or later reference, or keep the existing `static New()` (without the interface) until you can.
76
84
  - The exact `EventSourceId<T>` base supports conversions among its underlying
77
85
  `T`, string, typed ID, and untyped `EventSourceId`, but those operators do not
78
86
  construct your derived domain record from every source form.
@@ -54,10 +54,10 @@ Every domain identifier or named value is a typed record — raw `string`/`Guid`
54
54
  - **[contract] Chronicle stream identities** derive from `EventSourceId<T>` with an `IComparable` underlying primitive. Add `NotSet`, `New()`, or a `T` → derived-id operator only when the domain API justifies it; typed empty/zero values are real specified stream IDs. The base conversion surface does not construct every derived domain record automatically.
55
55
 
56
56
  ```csharp
57
- public record AuthorId(Guid Value) : EventSourceId<Guid>(Value)
57
+ public record AuthorId(Guid Value) : EventSourceId<Guid>(Value), IGeneratable<AuthorId>
58
58
  {
59
59
  public static readonly AuthorId NotSet = new(Guid.Empty);
60
- public static AuthorId New() => new(Guid.NewGuid());
60
+ public static AuthorId New() => new(GenerateValue.Uuid());
61
61
  public static implicit operator AuthorId(Guid value) => new(value);
62
62
  }
63
63
 
@@ -67,6 +67,8 @@ public record AuthorName(string Value) : ConceptAs<string>(Value)
67
67
  }
68
68
  ```
69
69
 
70
+ `IGeneratable<T>` and `GenerateValue` need Cratis.Fundamentals 7.23.0 or later. Arc and Chronicle can resolve an older version; add a direct reference or keep a plain `static New()` until then (see [concepts.md](./concepts.md)).
71
+
70
72
  **[convention] Placement:** slice-specific concept → in the slice file; feature-shared → feature folder; module-shared → module folder; app-wide → `Common/`. Scan `Common/` and the feature folder before creating a new concept. See [concepts.md](./concepts.md) for full patterns, or invoke the **cratis-fundamentals-concept** skill.
71
73
 
72
74
  ## Commands
@@ -15,7 +15,7 @@ This skill is verified against these exact public releases:
15
15
 
16
16
  | Package | Version | Purpose |
17
17
  | --- | --- | --- |
18
- | `Cratis.Fundamentals` | `7.19.2` | `Cratis.Concepts.ConceptAs<T>` |
18
+ | `Cratis.Fundamentals` | `7.23.0` | `Cratis.Concepts.ConceptAs<T>`, `IGeneratable<TSelf>` and `GenerateValue` |
19
19
  | `Cratis.Chronicle` | `18.3.0` | `Cratis.Chronicle.Events.EventSourceId` and `EventSourceId<T>` |
20
20
 
21
21
  Reverify product sources before claiming support for another version.
@@ -76,6 +76,55 @@ A `NotSet` or `Empty` value is optional domain policy. Add one only when the
76
76
  chosen primitive value is impossible or explicitly reserved in that domain.
77
77
  Do not assume `string.Empty`, `0`, or `Guid.Empty` is universally invalid.
78
78
 
79
+ ## Let a concept generate its own value
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.
85
+
86
+ When the system, not the caller, creates a value, the concept declares how by
87
+ implementing `IGeneratable<TSelf>` (`Cratis.Concepts`, Cratis.Fundamentals
88
+ 7.23.0 or later). The interface requires `static abstract TSelf New()`, so
89
+ generic code constrained on `where T : IGeneratable<T>` calls `T.New()` without
90
+ reflection. Generate a UUID with `GenerateValue`, never with `Guid.NewGuid()` in
91
+ scattered call sites and never with `System.Random`:
92
+
93
+ ```csharp
94
+ using Cratis.Concepts;
95
+
96
+ public record <ConceptName>(Guid Value) : ConceptAs<Guid>(Value), IGeneratable<<ConceptName>>
97
+ {
98
+ public static <ConceptName> New() => new(GenerateValue.Uuid());
99
+ }
100
+ ```
101
+
102
+ Both helpers return a `Guid` with the RFC 9562 variant and fill their random
103
+ bits from `RandomNumberGenerator`:
104
+
105
+ - `GenerateValue.Uuid()` — version 4, 122 random bits. The default.
106
+ - `GenerateValue.UuidV7()` — version 7: Unix-epoch milliseconds first, then 74
107
+ random bits. Choose it only when database index locality or rough creation
108
+ order matters, after checking how the database stores and compares UUIDs. It reveals the creation time, it is **not** monotonic within a
109
+ millisecond, and clock adjustments can reorder values.
110
+
111
+ Neither helper guarantees uniqueness; a collision is extremely unlikely, not
112
+ impossible. `IGeneratable<TSelf>` is not limited to Guid-backed concepts, but
113
+ `GenerateValue` only produces UUIDs.
114
+
115
+ Do not generate when:
116
+
117
+ - The client supplies the identifier. It is an input; keep it.
118
+ - The value must be secret or authenticate someone. A UUID is an identifier,
119
+ not a token; use a dedicated secure-token API.
120
+ - The same input must yield the same value. Random generation is not
121
+ idempotency; derive the value deterministically, or persist and reuse the
122
+ first one.
123
+
124
+ In specifications, construct the concept from a known value
125
+ (`new <ConceptName>(Guid.Parse("…"))`) and assert against it. Do not seed or
126
+ replace the generator. Guide: `/fundamentals/csharp/generating-values/`.
127
+
79
128
  ## Create a Guid-backed Chronicle stream identity
80
129
 
81
130
  Use this shape only for an identity actually supplied to Chronicle append/read
@@ -86,6 +135,7 @@ operations as the event-source ID.
86
135
  // Licensed under the MIT license. See LICENSE file in the project root for full license information.
87
136
 
88
137
  using Cratis.Chronicle.Events;
138
+ using Cratis.Concepts;
89
139
 
90
140
  namespace <NamespaceRoot>.<Feature>;
91
141
 
@@ -93,13 +143,13 @@ namespace <NamespaceRoot>.<Feature>;
93
143
  /// Represents the event-source identity of a <description>.
94
144
  /// </summary>
95
145
  /// <param name="Value">The underlying Guid value.</param>
96
- public record <ConceptName>(Guid Value) : EventSourceId<Guid>(Value)
146
+ public record <ConceptName>(Guid Value) : EventSourceId<Guid>(Value), IGeneratable<<ConceptName>>
97
147
  {
98
148
  /// <summary>
99
149
  /// Creates a new <ConceptName>.
100
150
  /// </summary>
101
151
  /// <returns>A new <ConceptName>.</returns>
102
- public static <ConceptName> New() => new(Guid.NewGuid());
152
+ public static <ConceptName> New() => new(GenerateValue.Uuid());
103
153
 
104
154
  /// <summary>
105
155
  /// Converts a Guid to a <ConceptName>.
@@ -108,8 +158,8 @@ public record <ConceptName>(Guid Value) : EventSourceId<Guid>(Value)
108
158
  }
109
159
  ```
110
160
 
111
- `New()` and the primitive-to-derived conversion are conveniences on this domain
112
- type. `EventSourceId<T>` does not construct an arbitrary derived identity for
161
+ `New()` (through `IGeneratable<TSelf>`) and the primitive-to-derived conversion
162
+ are conveniences on this domain type. `EventSourceId<T>` does not construct an arbitrary derived identity for
113
163
  you.
114
164
 
115
165
  ## Create a non-Guid Chronicle stream identity
@@ -185,6 +235,9 @@ repository structure.
185
235
  - `ConceptAs<T>` and `EventSourceId<T>` use an `IComparable` underlying type.
186
236
  - A concept contains exactly one wrapped value and no extra properties.
187
237
  - Enums remain enums.
238
+ - A concept that creates its own value implements `IGeneratable<TSelf>`; a
239
+ Guid-backed one uses `GenerateValue`, not `Guid.NewGuid()` or `Random`.
240
+ Client-supplied, secret or idempotent values are not generated.
188
241
  - Null absence uses a nullable concept reference rather than a null wrapped
189
242
  value.
190
243
  - Primitive-to-derived conversions and sentinels exist only when justified by
@@ -3,6 +3,9 @@
3
3
  "input": "Create a strongly typed value for a domain concept.",
4
4
  "fixtures": [],
5
5
  "assertions": [
6
- { "kind": "skill-contains", "value": "ConceptAs<T>" }
6
+ { "kind": "skill-contains", "value": "ConceptAs<T>" },
7
+ { "kind": "skill-contains", "value": "IGeneratable<TSelf>" },
8
+ { "kind": "skill-contains", "value": "GenerateValue.Uuid()" },
9
+ { "kind": "skill-contains", "value": "not** monotonic within a" }
7
10
  ]
8
11
  }
@@ -121,13 +121,12 @@ not to the AI corpus. Link to the fixture path and run its published checks; do
121
121
  copy those `.play` files into `.cratis/ai/` or into a skill reference as a
122
122
  maintained duplicate.
123
123
 
124
- Round-5 vector and executable checks (2026-10-09):
124
+ Verified public vector and executable checks:
125
125
 
126
- - final public vector: Scene 4.12.0, Screenplay 4.114.0 (final ABI release after #592), Stage
127
- 4.49.5, Docker `cratis/stage:4.49.5`, CLI 3.40.3 and Studio 0.136.4; public
128
- NuGet flat-container visibility was verified for `Cratis.Screenplay` and
129
- `Cratis.Screenplay.CanonicalCorpus` 4.114.0, while CLI 3.40.3 still pins
130
- Screenplay 4.105.0, so keep the package pairing visible;
126
+ - toolchain: public CLI 3.40.7 (`af9f18e`), whose default runtime is
127
+ `cratis/stage:4.51.1` and which bundles Screenplay 4.114.0. Latest public
128
+ packages are Scene 4.14.0, Screenplay 4.122.0, Stage 4.51.3 and Studio 0.141;
129
+ claims made through `cratis` are 4.114.0 compiler claims;
131
130
  - fixture root: `Source/DotNET/Screenplay.CanonicalCorpus/Corpus/ScreenComposition/v1/source/folder`
132
131
  in the Screenplay repository;
133
132
  - Screenplay repo tool (available checkout): `dotnet run --project Source/DotNET/Tool
@@ -140,9 +139,15 @@ Round-5 vector and executable checks (2026-10-09):
140
139
  `apply`, real `apply` and `open-workspace` again. It uses a scratch copy,
141
140
  changes `application.play` with a comment-preservation probe, fails closed on a
142
141
  stale revision, applies with the matching revision and verifies the comment
143
- remains on disk;
142
+ remains on disk. On CLI 3.40.7: 9 requests and 9 responses, 37 tools,
143
+ `executableReady true`, stale apply `StaleRevision`, comment preserved;
144
144
  - render (`cratis render <corpus-folder> --name ScreenComposition --destination
145
- <dir> -o json`) with packaged CLI 3.40.3 publishes the corpus.
145
+ <dir> -o json`) with CLI 3.40.7 publishes the corpus, and its browser
146
+ acceptance run passes 51 assertions (Cratis/Screenplay#605);
147
+ - still refused by design: guarded Close (`STAGE-SCENE-ACTION-001`) and
148
+ double-click (`STAGE-SCENE-INTERACTION-001`); still pending: UI-profile
149
+ rejection and render-then-recover (Cratis/cli#301) and Studio production Play
150
+ proof (test-account decision).
146
151
 
147
152
  Report a corpus the released compiler, MCP server or renderer refuses as a
148
153
  capability/version-pairing gap with the exact diagnostics; never soften it to a
@@ -25,14 +25,15 @@ Version pins live once in `cratis-screenplay-toolchain` `references/versions.md`
25
25
 
26
26
  | Source | Pin | Used for |
27
27
  | --- | --- | --- |
28
- | cratis CLI | `3.40.3` (public package/tag #295) | `cratis render` options, exit codes, publication receipt; tag pins Stage 4.49.5 and Screenplay 4.105.0, with `cratis/stage:4.49.5` as the runtime image. Reading baselines: 3.40.2, 3.39.0 and 3.28.3 (`8b43fef`) |
29
- | Stage | `4.49.5` | admission (`STAGE-ESM-*`, and `PLAY0268` render refusals surfaced by the CLI), ownership manifest, `Customizations/` seams, Debug-only specifications, generated query specs, guarded-action safety and frontend form stability. Older baselines: 4.49.2, 4.49.1, 4.43.0 and `v4.24.2` (`32dcac4`) |
30
- | Screenplay | `4.114.0` final ABI release | standalone compiler for V1 to V3; binding codes `PLAY0268` and the code-attachment rules, read at `v4.66.0`; CLI 3.40.3 still bundles 4.105.0, so rerun if a later CLI consumes 4.114.0 |
31
- | Rendered apps | Arc `22.25.0`, Chronicle `19.8.1`, Scene packages | `[ProtectedDecision]` (Arc 22.39.0 and later) is not available in code written into one; verify the generated package set before claiming exact Scene 4.12.0 runtime parity |
28
+ | cratis CLI | `3.40.7` (`v3.40.7`, `af9f18e`) | `cratis render` options, exit codes, publication receipt; tag pins Stage 4.51.1 and Screenplay 4.114.0, with `cratis/stage:4.51.1` as the runtime image. UI-profile rejection and render-then-recover fixes are pending in Cratis/cli#301. Reading baselines: 3.40.3, 3.39.0 and 3.28.3 (`8b43fef`) |
29
+ | Stage | `4.51.1` (CLI default; latest package 4.51.3) | admission (`STAGE-ESM-*`, and `PLAY0268` render refusals surfaced by the CLI), ownership manifest, `Customizations/` seams, Debug-only specifications, fail-closed guarded actions (`STAGE-SCENE-ACTION-001`) and interactions (`STAGE-SCENE-INTERACTION-001`). Older baselines: 4.49.5, 4.43.0 and `v4.24.2` (`32dcac4`) |
30
+ | Screenplay | bundled `4.114.0`; latest language package `4.122.0` | standalone compiler for V1 to V3; binding codes `PLAY0268` and the code-attachment rules, read at `v4.66.0`; claims made through `cratis` are 4.114.0 claims |
31
+ | Rendered apps | Arc `22.25.0`, Chronicle `19.8.1`, Scene packages | `[ProtectedDecision]` (Arc 22.39.0 and later) is not available in code written into one; verify the generated package set before claiming exact Scene 4.14.0 runtime parity |
32
32
 
33
33
  Facts were read at those tags and `cratis render` was run at 3.28.2 and 3.28.3 for the worked example
34
- (`references/worked-example.md`); with packaged CLI 3.40.3 it was run over the canonical
35
- `ScreenComposition` corpus and published successfully. The AI repository's `screenplay-mcp-transcript.ts`
34
+ (`references/worked-example.md`); with public CLI 3.40.7 it was run over the canonical
35
+ `ScreenComposition` corpus and published successfully, and its browser acceptance run passed 51
36
+ assertions (Cratis/Screenplay#605). The AI repository's `screenplay-mcp-transcript.ts`
36
37
  harness proves the real stdio proposal/apply path against the packaged CLI. The renderer facts are owned by `cratis-stage-rendering-and-sandbox`;
37
38
  this skill links them and never restates the admission table.
38
39
 
@@ -25,9 +25,9 @@ When choosing or upgrading a tool, or checking version-specific capabilities, re
25
25
  | Package | Version | Purpose |
26
26
  | --- | --- | --- |
27
27
  | `Cratis.Screenplay.Tool` | `4.68.0` (`79801bf`) | standalone compiler, binder and MCP server; admits ESM v7 (generated values and responses) |
28
- | cratis CLI | `3.40.3` public package/tag #295 | Tag pins Stage 4.49.5 and Screenplay 4.105.0, with `cratis/stage:4.49.5` as the runtime image. The packaged CLI executed render publication and the real stdio MCP transcript harness. Reading baselines: 3.40.2, 3.39.0 and 3.28.3 (`8b43fef`) |
29
- | Screenplay | `4.114.0` final ABI release | Exact public Screenplay release after #592. CLI 3.40.3 still bundles 4.105.0 and reports `sourceSuccess true`, `semanticSuccess true`, `executableReady true`; the repo tool compiles the corpus with `10 file(s) compiled - 0 error(s), 0 warning(s)`. Rerun if a later CLI consumes 4.114.0 |
30
- | Stage | `4.49.5` | Docker image `cratis/stage:4.49.5`; includes the 4.49.x generated query spec, guarded-action safety and frontend form-stability line. Packaged CLI 3.40.3 renders the canonical screen corpus and publishes Scene output with Arc `CommandForm` shells plus query bindings. Check generated package sets before claiming exact Scene 4.12 runtime parity |
28
+ | cratis CLI | `3.40.7` (`v3.40.7`, `af9f18e`) | Tag pins Stage 4.51.1 and Screenplay 4.114.0, with `cratis/stage:4.51.1` as the runtime image. The public CLI executed render publication, the browser acceptance run and the real stdio MCP transcript harness (37 tools, `executableReady true`). Reading baselines: 3.40.3, 3.39.0 and 3.28.3 (`8b43fef`) |
29
+ | Screenplay | bundled `4.114.0`; latest language package `4.122.0` | CLI 3.40.7 bundles 4.114.0 and reports `sourceSuccess true`, `semanticSuccess true`, `executableReady true` for the canonical corpus; the repo tool compiles it with `10 file(s) compiled - 0 error(s), 0 warning(s)`. Language features newer than 4.114.0 need the standalone 4.122.0 tool until a CLI bundles them |
30
+ | Stage | `4.51.1` (CLI default; latest package 4.51.3) | Docker image `cratis/stage:4.51.1`; renders the canonical screen corpus with Arc `CommandForm` shells and query bindings, and refuses guarded Close and double-click with `STAGE-SCENE-ACTION-001` / `STAGE-SCENE-INTERACTION-001`. Check generated package sets before claiming exact Scene 4.14 runtime parity |
31
31
  | Arc / Chronicle | `22.50.5` / `19.32.0` | code-level facts cited here |
32
32
 
33
33
  Facts were read with `git show <tag>:<path>` and probed on the installed tools. Behaviour
@@ -225,10 +225,9 @@ same typed navigate binding a screen action uses.
225
225
  ⚠️ The v4.31.0 baseline, re-verified at v4.66.0, ships `navigate`, `label` and `order` only. Grouping beyond a
226
226
  flat ordered list, and an explicit override for when nearest-enclosing is not the
227
227
  point you mean, are deliberately left for later. The screens-release vector
228
- (Screenplay 4.105.0, canonical `ScreenComposition` corpus v1) adds typed screen
229
- composition; CLI 3.40.0 renders it through Stage 4.49.1. Report a refused form as
230
- a capability gap, never a flat-list fallback, and keep browser/Studio production
231
- proof separate from render publication.
228
+ (canonical `ScreenComposition` corpus v1) adds typed screen composition; public
229
+ CLI 3.40.7 renders it and passes the browser run. Report a refused form as a
230
+ capability gap, never a flat-list fallback; Studio production proof is separate.
232
231
 
233
232
  ## Interactions — what a click does
234
233
 
@@ -31,20 +31,27 @@ hand-writing an alternate shape.
31
31
  without dropping it, silently falling back or replacing it with a default.
32
32
 
33
33
  Keep those three lines separate in reports. Correct an old limitation only when
34
- the package/version you are using proves the new level. Round-5 target vector:
35
- Scene 4.12.0, Screenplay 4.114.0 (final ABI release after #592), Stage 4.49.5, Docker
36
- `cratis/stage:4.49.5`, CLI 3.40.3 and Studio 0.136.4. Executed packaged-CLI
37
- protocol proof: the canonical `ScreenComposition` corpus opens with `sourceSuccess true`,
38
- `semanticSuccess true`, `executableReady true`; the stdio MCP harness sends real
39
- proposal/apply requests, rejects a stale revision and preserves an authored
40
- comment on disk. Render publication is verified on the available CLI checkout;
41
- the CLI 3.40.3 package still pins Screenplay 4.105.0, so rerun if a later CLI
42
- package consumes Screenplay 4.114.0. Runtime/browser
43
- behavior, Studio Play and production deploy are separate checks; Studio 0.136.4
44
- production deploy proof remains pending because Pulumi lock recovery cleared but
45
- deploy failed on Core CrashLoopBackOff. On Stage
46
- 4.24.2 or cratis 3.28.x renderers, authored screens are still reported as
47
- omitted/default composition.
34
+ the package/version you are using proves the new level. Verified public vector:
35
+ CLI 3.40.7 with its default `cratis/stage:4.51.1` and bundled Screenplay 4.114.0;
36
+ latest public packages are Scene 4.14.0, Screenplay 4.122.0, Stage 4.51.3 and
37
+ Studio 0.141. All three levels hold for the canonical `ScreenComposition` corpus
38
+ on that CLI:
39
+
40
+ - authoring and executable admission: MCP opens it with `sourceSuccess true`,
41
+ `semanticSuccess true`, `executableReady true`, and the stdio MCP harness sends
42
+ real proposal/apply requests, rejects a stale revision and preserves an
43
+ authored comment on disk;
44
+ - runtime: render publishes, and the browser acceptance run passes 51
45
+ assertions with none blocked or pending (Cratis/Screenplay#605) - native
46
+ command forms, required fields, scoped comments, deep links, stale-response
47
+ handling and theme included.
48
+
49
+ Still true on that vector: a guarded Close action and a double-click interaction
50
+ are refused (`STAGE-SCENE-ACTION-001`, `STAGE-SCENE-INTERACTION-001`) and recorded
51
+ as unsupported, never emulated; refusing an unresolvable UI profile and recovering
52
+ a rendered application are pending in Cratis/cli#301; Studio production Play
53
+ proof is pending a test-account decision. On Stage 4.24.2 or cratis 3.28.x
54
+ renderers, authored screens are still reported as omitted/default composition.
48
55
 
49
56
  ## Data context and component bindings
50
57
 
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: cratis-stage-rendering-and-sandbox
3
- description: "What Cratis Stage and `cratis render` actually do with a Screenplay `.play` model today: the narrow model shape Stage 4.49.5 admits and refuses (`STAGE-ESM-*`, `PLAY0268` render refusals), what it emits (C# Arc/Chronicle backend, React/Vite scaffold with Arc `CommandForm` shell emission over Scene 4.12 typed bindings, Debug specifications), managed publication, `--force` and recovery, authored-UI omission/parity checks, the unmanaged `Customizations/` seam, and the `cratis/stage` sandbox and `cratis/stage-specrunner` job. Use when deciding whether Stage can render a model, reading a blocked render, re-rendering safely, checking generated/runtime screen parity, or running the sandbox. Not for: authoring the model (use `cratis-screenplay-model-authoring`) or the render and gap-fill workflow (use `cratis-screenplay-render-and-gap-fill`)."
3
+ description: "What Cratis Stage and `cratis render` actually do with a Screenplay `.play` model today: the narrow model shape Stage 4.51 admits and refuses (`STAGE-ESM-*`, `PLAY0268` render refusals), what it emits (C# Arc/Chronicle backend, React/Vite scaffold with Arc `CommandForm` shell emission over Scene 4.12 typed bindings, Debug specifications), managed publication, `--force` and recovery, authored-UI omission/parity checks, the unmanaged `Customizations/` seam, and the `cratis/stage` sandbox and `cratis/stage-specrunner` job. Use when deciding whether Stage can render a model, reading a blocked render, re-rendering safely, checking generated/runtime screen parity, or running the sandbox. Not for: authoring the model (use `cratis-screenplay-model-authoring`) or the render and gap-fill workflow (use `cratis-screenplay-render-and-gap-fill`)."
4
4
  license: MIT
5
5
  ---
6
6
 
@@ -18,14 +18,16 @@ reading in this skill is not a render result.
18
18
 
19
19
  Authored UI has its own parity hazard. Stage 4.24 rendered a default React/Vite
20
20
  scaffold and did not prove that modeled screens, templates, forms, toolbars,
21
- components, outlets, package icons or routes were implemented. The final public
22
- vector is Stage 4.49.5, Screenplay 4.114.0 (the final ABI release), Scene 4.12.0,
23
- CLI 3.40.3 and Studio 0.136.4; the sandbox image is `cratis/stage:4.49.5`.
24
- The packaged CLI 3.40.3 render/MCP transcript publishes the canonical corpus, but
25
- its tag still pins Screenplay 4.105.0, so keep the CLI/Screenplay pairing visible
26
- when claiming exact compiler coverage. Runtime/browser parity is still a
27
- separate claim: require a generated plan or artifact entry for every authored UI
28
- construct, and report every unsupported UI directive as a diagnostic.
21
+ components, outlets, package icons or routes were implemented. The first fully
22
+ passing public browser vector is CLI 3.40.7 with its default `cratis/stage:4.51.1`
23
+ and bundled Screenplay 4.114.0: 51 browser assertions passed, none blocked or
24
+ pending (recorded in Cratis/Screenplay#605). Native command forms, required
25
+ fields, scoped comments, deep links, stale-response handling and theme all pass
26
+ there. Two behaviors stay fail-closed by design: a guarded Close action
27
+ (`STAGE-SCENE-ACTION-001`) and a double-click interaction
28
+ (`STAGE-SCENE-INTERACTION-001`) are refused and recorded as unsupported
29
+ capabilities, never emulated. Require a generated plan or artifact entry for every
30
+ authored UI construct, and report every unsupported UI directive as a diagnostic.
29
31
  Silent fallback to a default screen is a failure, not a partial render.
30
32
 
31
33
  ## Specification runner exit codes
@@ -39,10 +41,10 @@ argument or an invalid semantic option.
39
41
 
40
42
  | Source | Pin | Notes |
41
43
  | --- | --- | --- |
42
- | Stage | `4.49.5` (`v4.49.5`) | Renderer, sandbox host, spec runner; includes the 4.49.x generated query specs, guarded-action safety and frontend form-stability fixes. The Docker image is `cratis/stage:4.49.5`. Earlier executed baselines: 4.49.2, 4.49.1, 4.43.0 and `v4.24.2` (`32dcac4`) |
43
- | cratis CLI | `3.40.3` (`v3.40.3`, PR #295) | `cratis render`, `cratis run`; public packaged CLI 3.40.3 renders the canonical corpus and runs the stdio MCP transcript. Its tag pins Stage 4.49.5 and Screenplay 4.105.0, so mention that pairing until a CLI package consumes Screenplay 4.114.0. Older baseline: `v3.28.2` (`141c499`, Cratis/cli#253) |
44
- | Screenplay | `4.114.0` (`v4.114.0`, final ABI release after #592) | Standalone Screenplay final release after #592. The canonical screen corpus and MCP transcript were rerun through packaged CLI 3.40.3, which still bundles Screenplay 4.105.0; rerun if a CLI package moves to 4.114.0 |
45
- | Rendered applications | Arc, Chronicle, Scene 4.12.0, .NET 10 | Stage 4.49.5 / CLI 3.40.3 renders the canonical corpus to `.cratis-render.json`, backend artifacts, `.frontend/**`, `scene.json`, `src/bindings.ts`. Verify the generated package set for each render before claiming exact Scene runtime parity |
44
+ | Stage | `4.51.1` (`v4.51.1`, `0fe4a63`) as the CLI default; latest public package `4.51.3` (`e7dc0a0`) | Renderer, sandbox host, spec runner; the CLI 3.40.7 default image is `cratis/stage:4.51.1`. Defines `STAGE-SCENE-ACTION-001` and `STAGE-SCENE-INTERACTION-001`. Earlier executed baselines: 4.49.5, 4.43.0 and `v4.24.2` (`32dcac4`) |
45
+ | cratis CLI | `3.40.7` (`v3.40.7`, `af9f18e`) | `cratis render`, `cratis run`; the tag pins `StageVersion` 4.51.1 and `ScreenplayVersion` 4.114.0. The public CLI renders the canonical corpus and runs the stdio MCP transcript. Unresolvable UI-profile rejection and render-then-recover fixes are pending in Cratis/cli#301. Older baseline: `v3.28.2` (`141c499`, Cratis/cli#253) |
46
+ | Screenplay | bundled `4.114.0`; latest public language package `4.122.0` | The CLI bundles 4.114.0, so compiler claims made through `cratis` are 4.114.0 claims; use the standalone 4.122.0 tool only for language features newer than the bundle |
47
+ | Rendered applications | Arc, Chronicle, Scene 4.14.0, .NET 10 | CLI 3.40.7 renders the canonical corpus to `.cratis-render.json`, backend artifacts, `.frontend/**`, `scene.json`, `src/bindings.ts`. Verify the generated package set for each render before claiming exact Scene runtime parity |
46
48
 
47
49
  Everything below was read at those tags (`Source/Rendering.Cratis/**`, `README.md`,
48
50
  `Documentation/**` in Stage; `Source/Cli/Commands/Render/**` and
@@ -51,10 +53,11 @@ Everything below was read at those tags (`Source/Rendering.Cratis/**`, `README.m
51
53
  tested with cratis 3.28.2 (re-run on 3.28.3). Read `references/render-example.md` when you need a complete renderable model and the observed render, build, and test results. The full version table (Screenplay 4.66.0, Arc 22.50.5,
52
54
  Chronicle 19.32.0 and the tool split) is in the `cratis-screenplay-toolchain` skill,
53
55
  `references/versions.md`. Rendered apps are on Arc `22.25.0`, so `[ProtectedDecision]`
54
- (Arc 22.39.0 and later) is not available in code written into one. Screen UI render publication for the canonical corpus is verified on packaged
55
- CLI 3.40.3 / Stage 4.49.5. Browser runtime behavior, Studio Play and production
56
- deploy remain separate checks; Studio 0.136.4 production deploy proof is pending
57
- because Pulumi lock recovery cleared but deploy failed on Core CrashLoopBackOff.
56
+ (Arc 22.39.0 and later) is not available in code written into one. Screen render
57
+ publication and browser behavior for the canonical corpus are verified on public
58
+ CLI 3.40.7 / `cratis/stage:4.51.1`. Studio 0.141 is released and production runs
59
+ v0.139.0 or later, but production UI automation is pending a
60
+ test-account decision, so Studio production Play proof is not claimed.
58
61
 
59
62
  ## Model-first rule
60
63
 
@@ -185,10 +188,10 @@ read models `when_<snake>_is_projected`.
185
188
 
186
189
  For UI, record what the generated output claims separately from what the model
187
190
  authored. On Stage 4.24 the generated scaffold is not screen parity evidence.
188
- On packaged CLI 3.40.3 / Stage 4.49.5 the canonical corpus publishes and
189
- `scene.json` contains Arc `commandForm` components while `src/bindings.ts`
190
- registers the modeled commands and queries. That is render-output evidence, not
191
- browser or Studio production proof. Require an explicit plan, manifest entry or
191
+ On public CLI 3.40.7 / `cratis/stage:4.51.1` the canonical corpus publishes,
192
+ `scene.json` contains Arc `commandForm` components, `src/bindings.ts` registers
193
+ the modeled commands and queries, and the browser acceptance run passes. That is
194
+ not Studio production proof. Require an explicit plan, manifest entry or
192
195
  generated artifact for each
193
196
  screen/template/form/toolbar/component/outlet/route/package-icon use, or a
194
197
  blocking diagnostic explaining why it was not generated.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@cratis/pi",
3
- "version": "7.19.0",
3
+ "version": "7.21.0",
4
4
  "description": "Configuration-aware Cratis AI integration for Pi",
5
5
  "type": "module",
6
6
  "files": [