Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion Directory.Packages.props
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@
<CratisScreenplayGenerationVersion>0.18.0</CratisScreenplayGenerationVersion>
<ScreenplayVersion Condition="'$(ScreenplayVersion)' == ''">4.137.0</ScreenplayVersion>
<!-- The Stage packages the renderer uses and the Stage container 'cratis run' starts are the same release. -->
<StageVersion Condition="'$(StageVersion)' == ''">4.73.0</StageVersion>
<StageVersion Condition="'$(StageVersion)' == ''">4.73.1</StageVersion>
</PropertyGroup>
<ItemGroup>
<!-- Cratis -->
Expand Down
2 changes: 1 addition & 1 deletion Documentation/reference/screenplay-mcp.md
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ description: Run the embedded Screenplay MCP server and configure project-local

`cratis screenplay mcp` hosts the embedded Screenplay 4.137.0 Model Context Protocol (MCP) server over standard input and output. `cratis version` shows the bundled compiler version; JSON output includes `screenplay.version`. It does not install tools, download packages, or check for CLI updates at startup. Native and Homebrew CLI distributions include the runtime; this command does not require a separate .NET installation.

The server can author and bind every ESM version the bundled Screenplay compiler reads; this does not establish renderability. The CLI's bundled Stage 4.73.0 renderer admits ESM v1 through v10, including event sources, streams and routes, and renders policy negation and authored XML documentation, but refuses generated command values (`STAGE-ESM-028`), command responses (`STAGE-ESM-029`), reactions, captures, triggers and Automation/Translate slices (`STAGE-ESM-024`), read-model absence assertions (`STAGE-ESM-027`), public events and event-target projections and reducers (`STAGE-ESM-032`), foreign origins and event-source captures (`STAGE-ESM-033`), reaction system identity (`STAGE-ESM-034`), reaction observer filters (`STAGE-ESM-035`) and per-production route overrides (`STAGE-ESM-036`); reducer observer filters render. A specification whose unauthenticated caller carries roles or claims is refused with `STAGE-ESM-011`, including the unchanged canonical negation example. See [Screenplay rendering](screenplay.md#executable-model-versions) for command-specific compatibility.
The server can author and bind every ESM version the bundled Screenplay compiler reads; this does not establish renderability. The CLI's bundled Stage 4.73.1 renderer admits ESM v1 through v10, including event sources, streams and routes, and renders policy negation and authored XML documentation, but refuses generated command values (`STAGE-ESM-028`), command responses (`STAGE-ESM-029`), reactions, captures, triggers and Automation/Translate slices (`STAGE-ESM-024`), read-model absence assertions (`STAGE-ESM-027`), public events and event-target projections and reducers (`STAGE-ESM-032`), foreign origins and event-source captures (`STAGE-ESM-033`), reaction system identity (`STAGE-ESM-034`), reaction observer filters (`STAGE-ESM-035`) and per-production route overrides (`STAGE-ESM-036`); reducer observer filters render. A specification whose unauthenticated caller carries roles or claims is refused with `STAGE-ESM-011`, including the unchanged canonical negation example. See [Screenplay rendering](screenplay.md#executable-model-versions) for command-specific compatibility.

For Claude Desktop and ChatGPT Desktop **installation**, see
[Screenplay desktop MCP](screenplay-desktop-mcp.md). Desktop management uses
Expand Down
10 changes: 5 additions & 5 deletions Documentation/reference/screenplay.md
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ cratis screenplay mcp [PATH]
cratis screenplay desktop install
```

The CLI bundles Screenplay 4.137.0 (including its MCP server), Stage 4.73.0, and the Arc source adapter 22.54.0. `cratis render` admits ESM v1 through v10, including the canonical screen-composition corpus observable query and query-only specification shapes, and preserves authored Scene layouts, profiles, templates, navigation and forms when a model declares screens. Guarded screen actions render as runnable Scene guards: the generated frontend evaluates the authored guard, including enum-typed comparisons against the read model's declared members, and shows the action only when it passes. The renderer still refuses unsupported constructs within those versions: reactions, captures, triggers and Automation/Translate slices report `STAGE-ESM-024`, read-model absence assertions report `STAGE-ESM-027`, and the v9 and v10 constructs report their own codes (`STAGE-ESM-032` to `STAGE-ESM-036`, listed in the admission table below). Reducer observer filters render. It also refuses an evolved event until Stage can render its event-type migrations. Validation rejects `numbers exact` and `implementation` attachments on concept, built-in, and whole-command rules.
The CLI bundles Screenplay 4.137.0 (including its MCP server), Stage 4.73.1, and the Arc source adapter 22.54.0. `cratis render` admits ESM v1 through v10, including the canonical screen-composition corpus observable query and query-only specification shapes, and preserves authored Scene layouts, profiles, templates, navigation and forms when a model declares screens. Guarded screen actions render as runnable Scene guards: the generated frontend evaluates the authored guard, including enum-typed comparisons against the read model's declared members, and shows the action only when it passes. The renderer still refuses unsupported constructs within those versions: reactions, captures, triggers and Automation/Translate slices report `STAGE-ESM-024`, read-model absence assertions report `STAGE-ESM-027`, and the v9 and v10 constructs report their own codes (`STAGE-ESM-032` to `STAGE-ESM-036`, listed in the admission table below). Reducer observer filters render. It also refuses an evolved event until Stage can render its event-type migrations. Validation rejects `numbers exact` and `implementation` attachments on concept, built-in, and whole-command rules.

For the embedded stdio server, the `visualize-model` MCP App, and native AI host registration, see [Screenplay MCP](screenplay-mcp.md). For Claude Desktop and ChatGPT Desktop installation, see [Screenplay desktop MCP](screenplay-desktop-mcp.md).

Expand All @@ -30,7 +30,7 @@ A newer bundled compiler can produce a newer executable semantic model (ESM) ver
| `cratis screenplay mcp` | Admitted for authoring and reading. The embedded server binds v7 models, pages their executable model (generated properties, responses, generation fixtures and return expectations) and reports execution readiness. Reference execution is not offered: neither the CLI nor the embedded server runs specifications. |
| `cratis render` | Admitted. Policy negation renders. Generated command values and command responses are refused by the renderer with `STAGE-ESM-028` and `STAGE-ESM-029`, respectively; see [Cratis/Stage#175](https://github.com/Cratis/Stage/issues/175). Stage refuses a specification whose unauthenticated caller carries roles or claims with `STAGE-ESM-011`; this includes the unchanged canonical negation example. A refusal leaves no publishable artifacts. Versions newer than v10 are still blocked by `CLI-RENDER-004`, naming the version. |
| `cratis screenplay generate` | From Arc 22.52.0, the Arc adapter recovers supported generated UUID values and command responses by default for commands without successful scenarios. Output containing these constructs compiles to ESM v7, which `cratis render` admits, but the renderer refuses generated values with `STAGE-ESM-028` and responses with `STAGE-ESM-029`, even without `--authoring-only-constructs`; see [Cratis/Stage#175](https://github.com/Cratis/Stage/issues/175). Unsupported shapes and values needed by pre-generation protection remain in code with `SP0052`. Marten and Critter Stack retain their existing recovery surface. |
| `cratis run` | The Stage 4.73.0 container compiles the mounted `.play` files with its own Screenplay release, 4.137.0. Passing `cratis screenplay validate` does not establish Stage support for every construct. |
| `cratis run` | The Stage 4.73.1 container compiles the mounted `.play` files with its own Screenplay release, 4.137.0. Passing `cratis screenplay validate` does not establish Stage support for every construct. |

The bundled Screenplay reader supports ESM schemas through v10. ESM v5 adds keyed read-model absence assertions; v8 adds event sources, streams, command routes and specification routes. ESM v9 adds public events, foreign event origins, translation direction, event-target projections/reducers and event-source captures; v10 adds reaction system identity (`runsAs`), per-production route overrides (`SemanticProducedEvent.Route`) and observer filters (`SemanticReaction.From` and `SemanticReducer.From`). Version reading and command admission are separate:

Expand All @@ -42,8 +42,8 @@ The bundled Screenplay reader supports ESM schemas through v10. ESM v5 adds keye
| `cratis screenplay generate` | Checks recovered source with the bundled compiler. The Arc adapter's output remains ESM v7; recovery is provider-owned. | Does not execute or render these constructs. Recovery remains provider-owned. | Does not execute or render these constructs. Recovery remains provider-owned. |
| `cratis view` | Serves embedded or generated source through the bundled event-model explorer. | Viewing is not renderer admission. | Viewing is not renderer admission. |
| Generation statistics | Count declarations in compiled source, including documents with event routes. | Counts do not establish executable or renderer support. | Counts do not establish executable or renderer support. |
| `cratis render` | Admitted through Stage 4.73.0, including routed commands and supported routed specifications. Unsupported constructs still block publication. | Admitted for construct-level planning. Public events and event-target projections/reducers report `STAGE-ESM-032`; foreign origins and event-source captures report `STAGE-ESM-033`; translation direction reports `STAGE-ESM-024`. | Admitted for construct-level planning. Reaction `runsAs` reports `STAGE-ESM-034`; reaction `from` filters (`SemanticReaction.From`) report `STAGE-ESM-035`; per-production route overrides (`SemanticProducedEvent.Route`) report `STAGE-ESM-036`. Reducer `from` filters (`SemanticReducer.From`) render as Chronicle source/stream attributes; specifications requiring filtered read-model replay remain refused. |
| `cratis run` | Refused by the Stage 4.73.0 container: `cratis run` starts Stage's default `eventmodel` engine, which reports `STAGE-ESM-030` for named event sources, streams and routes because only Stage's semantic engine runs them. Render the model with `cratis render` instead. | Stage applies its own runtime admission; CLI validation is not Stage admission. | Stage applies its own runtime admission; CLI validation is not Stage admission. |
| `cratis render` | Admitted through Stage 4.73.1, including routed commands and supported routed specifications. Unsupported constructs still block publication. | Admitted for construct-level planning. Public events and event-target projections/reducers report `STAGE-ESM-032`; foreign origins and event-source captures report `STAGE-ESM-033`; translation direction reports `STAGE-ESM-024`. | Admitted for construct-level planning. Reaction `runsAs` reports `STAGE-ESM-034`; reaction `from` filters (`SemanticReaction.From`) report `STAGE-ESM-035`; per-production route overrides (`SemanticProducedEvent.Route`) report `STAGE-ESM-036`. Reducer `from` filters (`SemanticReducer.From`) render as Chronicle source/stream attributes; specifications requiring filtered read-model replay remain refused. |
| `cratis run` | Refused by the Stage 4.73.1 container: `cratis run` starts Stage's default `eventmodel` engine, which reports `STAGE-ESM-030` for named event sources, streams and routes because only Stage's semantic engine runs them. Render the model with `cratis render` instead. | Stage applies its own runtime admission; CLI validation is not Stage admission. | Stage applies its own runtime admission; CLI validation is not Stage admission. |

Version admission does not admit every construct. A selected scope without unsupported constructs can plan normally at v9 or v10; a typed renderer refusal leaves no publishable artifacts. ESM v11 and newer remain blocked by `CLI-RENDER-004` before target planning or publication.

Expand Down Expand Up @@ -95,7 +95,7 @@ For example, `cratis render ./plays --name MyApplication --project-name Delivery

The bundled Stage renderer applies `--root-namespace Company.MyApplication` to the generated project and C# namespaces. This remains independent of `--project-name` and does not rename the application. Rendering admits only supported backend semantics; a successful artifact plan is not a generated-application build or runtime verification. Screenplay validation accepts events with multiple declared generations, but the bundled Stage renderer does not yet render an evolved event: `cratis render` reports `STAGE-ESM-026` naming the event and its revision, because Stage cannot render the Chronicle event-type migrations it needs yet, and publishes no artifacts. Stage's direct `.play` syntax route refuses event generations with `STAGE-EVENT-001`. `cratis screenplay validate` only checks the Screenplay model, not Stage renderer support.

Navigation contributions render with everything they declare: `id`, `icon`, `presentation`, `group` and `destination outlet|dialog|external` reach the Scene the bundled Stage renderer plans, and the running application honours them - the menu shows the entry as its `presentation` asks and opens an outlet or a dialog destination through the Scene navigation host. A contribution on a module reaches every screen beneath the module, and a screen no entry lists is shown under its own module and feature. A `toolbar` renders with its items' destinations and presentation hints. (`CLI-RENDER-015`, which refused these properties before Stage 4.73.0, is retired.)
Navigation contributions render with everything they declare: `id`, `icon`, `presentation`, `group` and `destination outlet|dialog|external` reach the Scene the bundled Stage renderer plans, and the running application honours them - the menu shows the entry as its `presentation` asks and opens an outlet or a dialog destination through the Scene navigation host. A contribution on a module reaches every screen beneath the module, and a screen no entry lists is shown under its own module and feature. A `toolbar` renders with its items' destinations and presentation hints. (`CLI-RENDER-015`, which refused these properties before Stage 4.73.1, is retired.)

The initial `cratis` target covers the released backend vertical: concepts and composite types, a command with `not empty` validation, its event destination and mappings, a one-instance projection, an optional snapshot by-key query, and generated success/rejection specifications. Unsupported reachable semantics are blocking diagnostics, never omitted behavior or generated TODOs.

Expand Down
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -459,7 +459,7 @@ The CLI repository carries additional command groups whose exact behavior and st

- `cratis arc` inspects registered commands and queries in a running [Arc](https://github.com/Cratis/Arc) application.
- `cratis view` opens a .NET application as an event model in the browser, from the Screenplay documents it embeds or ones generated from its source. See the [View command reference](https://github.com/Cratis/cli/blob/main/Documentation/reference/view.md).
- `cratis screenplay` and `cratis render` work with Cratis Screenplay (`.play`) documents — generation, validation, and rendering from files, with nothing running. The CLI bundles Screenplay 4.137.0 and Stage 4.73.0; rendering admits ESM v8, including event sources, streams, routed commands and policy negation, and carries authored `description` and event `documentation` into XML doc comments. Generated values and command responses remain renderer refusals (`STAGE-ESM-028`/`STAGE-ESM-029`); specifications whose unauthenticated callers carry roles or claims are refused with `STAGE-ESM-011`. See the [Screenplay command reference](https://github.com/Cratis/cli/blob/main/Documentation/reference/screenplay.md) for the supported constructs and other renderer limits.
- `cratis screenplay` and `cratis render` work with Cratis Screenplay (`.play`) documents — generation, validation, and rendering from files, with nothing running. The CLI bundles Screenplay 4.137.0 and Stage 4.73.1; rendering admits ESM v8, including event sources, streams, routed commands and policy negation, and carries authored `description` and event `documentation` into XML doc comments. Generated values and command responses remain renderer refusals (`STAGE-ESM-028`/`STAGE-ESM-029`); specifications whose unauthenticated callers carry roles or claims are refused with `STAGE-ESM-011`. See the [Screenplay command reference](https://github.com/Cratis/cli/blob/main/Documentation/reference/screenplay.md) for the supported constructs and other renderer limits.
- `cratis screenplay desktop install --clients claude,chatgpt` acquires verified, self-contained local Screenplay desktop packages. Complete installation/enabling in each host's UI; use `status`, `update`, and `uninstall` to manage Cratis-owned sources safely. See [desktop MCP installation](https://github.com/Cratis/cli/blob/main/Documentation/reference/screenplay-desktop-mcp.md).
- The [canonical CLI page](https://cratis.io/cli/) carries the currently admitted command-group documentation.

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,7 @@ Task Because()
[Fact] void should_plan_the_exact_facade_renderer() => _result.Renderer.ShouldEqual(_expected.Renderer);
[Fact] void should_plan_the_exact_facade_renderer_version() => _result.RendererVersion.ShouldEqual(_expected.RendererVersion);
[Fact] void should_load_the_released_stage_44910_renderer_package() =>
typeof(CratisRendering).Assembly.GetCustomAttribute<AssemblyInformationalVersionAttribute>()!.InformationalVersion.Split('+')[0].ShouldEqual("4.73.0");
typeof(CratisRendering).Assembly.GetCustomAttribute<AssemblyInformationalVersionAttribute>()!.InformationalVersion.Split('+')[0].ShouldEqual("4.73.1");
[Fact] void should_plan_the_same_application_name() => _result.ApplicationName.ShouldEqual(_expected.ApplicationName);
[Fact] void should_plan_the_same_semantic_revision() => _result.SemanticRevision.ShouldEqual(_expected.SemanticRevision);
[Fact] void should_plan_the_exact_facade_artifacts() =>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ [Unix.Fact] void should_start_the_released_stage_image_that_matches_the_renderer
DockerArguments.ShouldContain($"cratis/stage:{StageContainer.DefaultTag}");

[Unix.Fact] void should_run_stage_44910_by_default() =>
DockerArguments.ShouldContain("cratis/stage:4.73.0");
DockerArguments.ShouldContain("cratis/stage:4.73.1");

[Unix.Fact] void should_mount_only_the_selected_folder_read_only() =>
DockerArguments.ShouldContain($"{_folder}:/eventmodel:ro");
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@ [Unix.Fact] void should_start_the_released_stage_image_that_matches_the_renderer
DockerArguments.ShouldContain($"cratis/stage:{StageContainer.DefaultTag}");

[Unix.Fact] void should_run_stage_44910_by_default() =>
DockerArguments.ShouldContain("cratis/stage:4.73.0");
DockerArguments.ShouldContain("cratis/stage:4.73.1");

[Unix.Fact] void should_mount_only_the_selected_file_read_only() =>
DockerArguments.ShouldContain($"{_path}:/eventmodel/input.play:ro");
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@ void Establish() => _renderer = typeof(ArtifactRenderPlan).Assembly

[Fact] void should_run_the_stage_the_renderer_came_from() => _tag.ShouldEqual(_renderer);

[Fact] void should_run_the_released_stage_4730_image() => _tag.ShouldEqual("4.73.0");
[Fact] void should_run_the_released_stage_4731_image() => _tag.ShouldEqual("4.73.1");

[Fact] void should_not_run_a_moving_tag() => _tag.ShouldNotEqual(StageContainer.FallbackTag);

Expand Down